Statistics
| Branch: | Tag: | Revision:

root / tools / mac2eui64 @ cf51ea5b

History | View | Annotate | Download (1.1 kB)

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