11 starting_mac_prefix='aa:00:00'
13 class FileLock(object):
14 def __init__(self, fd, filename):
16 self.filename = filename
19 def Open(cls, filename):
20 # Using "os.open" is necessary to allow both opening existing file
21 # read/write and creating if not existing. Vanilla "open" will truncate an
22 # existing file -or- allow creating if not existing.
23 return cls(os.fdopen(os.open(filename, os.O_RDWR | os.O_CREAT), "w+"),
30 if hasattr(self, "fd") and self.fd:
34 def _flock(self, flag):
35 self._Lock(self.fd, flag)
42 self._flock(fcntl.LOCK_EX)
45 self._flock(fcntl.LOCK_UN)
50 data = simplejson.load(f)
53 pool = set(data['pool'])
56 def update_data(high, pool):
58 data['pool'] = list(pool)
61 f.write(simplejson.dumps(data, indent=2))
67 update_data(high, pool)
69 def find_prefix(high, pool):
74 a = hex(int(high.replace(":",""),16) + 1).replace("0x",'')
75 prefix = ":".join([a[x:x+2] for x in xrange(0,len(a),2)])
78 return prefix, new_high, pool
87 print "Usage: " + argv[0] + "init/get/put"
92 lock = FileLock.Open('prefix.lock')
97 (high, pool) = get_data()
98 (prefix, new_high, new_pool) = find_prefix(high, pool)
99 update_data(new_high, new_pool)
102 elif action == "put":
105 print "Usage: " + argv[0] + "put prefix"
108 (high, pool) = get_data()
111 update_data(high, pool)
113 elif action == "init":
116 print "Usage: " + argv[0] + "init prefix"
125 if __name__ == '__main__':
126 sys.exit(main(sys.argv))