Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / logic / mac2eui64 @ 2e1e6844

History | View | Annotate | Download (1.1 kB)

1 37db18f3 Christos Stavrakakis
#!/usr/bin/env python
2 37db18f3 Christos Stavrakakis
3 37db18f3 Christos Stavrakakis
import sys
4 37db18f3 Christos Stavrakakis
from IPy import IP
5 37db18f3 Christos Stavrakakis
6 37db18f3 Christos Stavrakakis
if len(sys.argv) != 3:
7 37db18f3 Christos Stavrakakis
    sys.stderr.write("Usage: %s <mac_address> <IPv6 prefix>\n" % sys.argv[0])
8 37db18f3 Christos Stavrakakis
    sys.exit(127)
9 37db18f3 Christos Stavrakakis
10 37db18f3 Christos Stavrakakis
mac = sys.argv[1]
11 37db18f3 Christos Stavrakakis
try:
12 37db18f3 Christos Stavrakakis
    prefix = IP(sys.argv[2])
13 37db18f3 Christos Stavrakakis
except ValueError:
14 37db18f3 Christos Stavrakakis
    sys.stderr.write("Invalid IPv6 prefix '%s'\n" % sys.argv[2])
15 37db18f3 Christos Stavrakakis
    sys.exit(1)
16 37db18f3 Christos Stavrakakis
17 37db18f3 Christos Stavrakakis
18 37db18f3 Christos Stavrakakis
if prefix.version() != 6:
19 37db18f3 Christos Stavrakakis
    sys.stderr.write("%s is not a valid IPv6 prefix\n" % prefix)
20 37db18f3 Christos Stavrakakis
    sys.exit(1)
21 37db18f3 Christos Stavrakakis
22 37db18f3 Christos Stavrakakis
if prefix.prefixlen() != 64:
23 37db18f3 Christos Stavrakakis
    sys.stderr.write("Cannot generate an EUI-64 address on a non-64 subnet\n")
24 37db18f3 Christos Stavrakakis
    sys.exit(1)
25 37db18f3 Christos Stavrakakis
26 37db18f3 Christos Stavrakakis
mac_parts = mac.split(":")
27 37db18f3 Christos Stavrakakis
pfx_parts = prefix.net().strFullsize().split(":")
28 37db18f3 Christos Stavrakakis
29 37db18f3 Christos Stavrakakis
if len(mac_parts) != 6:
30 37db18f3 Christos Stavrakakis
    sys.stderr.write("%s is not a valid MAC-48 address\n" % mac)
31 37db18f3 Christos Stavrakakis
    sys.exit(1)
32 37db18f3 Christos Stavrakakis
33 37db18f3 Christos Stavrakakis
eui64 = mac_parts[:3] + [ "ff", "fe" ] + mac_parts[3:]
34 37db18f3 Christos Stavrakakis
35 37db18f3 Christos Stavrakakis
eui64[0] = "%02x" % (int(eui64[0], 16) ^ 0x02)
36 37db18f3 Christos Stavrakakis
37 37db18f3 Christos Stavrakakis
ip = ":".join(pfx_parts[:4])
38 37db18f3 Christos Stavrakakis
for l in range(0, len(eui64), 2):
39 37db18f3 Christos Stavrakakis
    ip += ":%s" % "".join(eui64[l:l+2])
40 37db18f3 Christos Stavrakakis
41 37db18f3 Christos Stavrakakis
try:
42 37db18f3 Christos Stavrakakis
    print IP(ip).strCompressed()
43 37db18f3 Christos Stavrakakis
except ValueError, e:
44 37db18f3 Christos Stavrakakis
    sys.stderr.write("Ooops, something went wrong: '%s'!\n" % str(e))
45 37db18f3 Christos Stavrakakis
46 37db18f3 Christos Stavrakakis
# vim: set ts=4 sts=4 sw=4 et ai :