#!/usr/bin/python
# 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()
