You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
61 lines
1.7 KiB
61 lines
1.7 KiB
#!/usr/bin/python2
|
|
# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
|
|
# Use of this source code is governed by a BSD-style license that can be
|
|
# found in the LICENSE file.
|
|
|
|
DOCS="""Print DHCP and /etc/hosts stanzas for hosts in a specified cell."""
|
|
|
|
import exceptions, io, sys
|
|
import labconfig_data
|
|
|
|
|
|
def usage(message=''):
|
|
print '%s:\n\t%s\n' % (sys.argv[0], DOCS)
|
|
print '%susage: %s CELLNAME' % (message, sys.argv[0])
|
|
sys.exit(1)
|
|
|
|
|
|
def find_names(visitor, root):
|
|
"""Traverse config tree, calling visitor on dicts with 'name' field."""
|
|
if type(root) == dict and 'name' in root:
|
|
visitor(root)
|
|
if type(root) == dict:
|
|
for child in root.values():
|
|
find_names(visitor, child)
|
|
elif hasattr(root, '__iter__'):
|
|
for entry in root:
|
|
find_names(visitor, entry)
|
|
|
|
|
|
class Formatter(object):
|
|
def __init__(self):
|
|
self.dns = io.StringIO()
|
|
self.dhcp = io.StringIO()
|
|
|
|
def Visit(self, d):
|
|
if 'address' in d and 'name' in d:
|
|
self.dns.write(u'%(address)s\t%(name)s\n' % d)
|
|
else:
|
|
return
|
|
if 'ethernet_mac' in d:
|
|
self.dhcp.write((u'host %(name)s {\n' +
|
|
'\thardware ethernet %(ethernet_mac)s;\n' +
|
|
'\tfixed-address %(address)s;\n' +
|
|
'}\n') % d)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
if len(sys.argv) < 2:
|
|
usage()
|
|
|
|
[cell] = sys.argv[1:]
|
|
if cell not in labconfig_data.CELLS:
|
|
usage('Could not find cell %s\n' % cell)
|
|
|
|
f = Formatter()
|
|
find_names(f.Visit, labconfig_data.CELLS[cell])
|
|
|
|
print f.dhcp.getvalue()
|
|
print '\n'
|
|
print f.dns.getvalue()
|