diff options
author | Christian Poessinger <christian@poessinger.com> | 2020-03-28 11:28:05 +0100 |
---|---|---|
committer | Christian Poessinger <christian@poessinger.com> | 2020-03-28 12:05:41 +0100 |
commit | 822e171a0023c3f8f335cda08bcbf70b2d6d4070 (patch) | |
tree | 15bea8859399c540db517c46bd78e75a5e005e78 /python/vyos/util.py | |
parent | 0d1c8e4021b8da5c15883b860bd27d4e374bd045 (diff) | |
download | vyos-1x-822e171a0023c3f8f335cda08bcbf70b2d6d4070.tar.gz vyos-1x-822e171a0023c3f8f335cda08bcbf70b2d6d4070.zip |
ipv6: T1831: migrate eui64 addressing to XML and python
Diffstat (limited to 'python/vyos/util.py')
-rw-r--r-- | python/vyos/util.py | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/python/vyos/util.py b/python/vyos/util.py index e8727c192..635b11ee5 100644 --- a/python/vyos/util.py +++ b/python/vyos/util.py @@ -207,3 +207,25 @@ def is_admin() -> bool: current_user = getuser() (_, _, _, admin_group_members) = getgrnam('sudo') return current_user in admin_group_members + + +def mac2eui64(mac, prefix=None): + ''' + Convert a MAC address to a EUI64 address or, with prefix provided, a full + IPv6 address. + Thankfully copied from https://gist.github.com/wido/f5e32576bb57b5cc6f934e177a37a0d3 + ''' + # http://tools.ietf.org/html/rfc4291#section-2.5.1 + eui64 = re.sub(r'[.:-]', '', mac).lower() + eui64 = eui64[0:6] + 'fffe' + eui64[6:] + eui64 = hex(int(eui64[0:2], 16) ^ 2)[2:].zfill(2) + eui64[2:] + + if prefix is None: + return ':'.join(re.findall(r'.{4}', eui64)) + else: + try: + net = ip_network(prefix, strict=False) + euil = int('0x{0}'.format(eui64), 16) + return str(net[euil]) + except: # pylint: disable=bare-except + return |