bin/pvl.hosts-dhcp
author Tero Marttila <terom@paivola.fi>
Sun, 07 Sep 2014 14:21:56 +0300
changeset 424 e77e967d59b0
parent 338 9198e2da360e
permissions -rwxr-xr-x
hgignore: use glob; ignore snmp mibs
#!/usr/bin/env python

import pvl.args
import pvl.hosts

import configobj
import logging; log = logging.getLogger('pvl.hosts-dhcp')
import optparse

def build_host (host, *items) :
    yield "host {host} {{".format(host=host)
    for item in items :
        if isinstance(item, dict) :
            for setting, value in item.iteritems() :
                if value :
                    yield "\t{setting:30} {value};".format(setting=setting, value=value)
        else :
            raise ValueError("Unknown item: %r", item)
    yield "}"

def dhcp_quote (value) :
    if value is None :
        return None
    else :
        return '"{value}"'.format(value=value)

def process_host (options, host) :
    if host.boot :
        if ':' in host.boot :
            next_server, filename = host.boot.split(':', 1)
        elif host.boot.startswith('/') :
            next_server = None
            filename = host.boot
        elif host.boot.endswith(':') :
            next_server = host.boot
            filename = None
        else :
            log.error("%s: invalid boot: %s", host, host.boot)
    else :
        next_server = filename = None

    if set(host.ethernet) == set([0]) :
        host_fmt = "{host}"
    elif host.ethernet :
        host_fmt = "{host}-{index}"
    else :
        # nothing there
        return

    if host.owner :
        yield u"# Owner: {host.owner}".format(host=host)

    for index, ethernet in host.ethernet.iteritems() :
        for line in build_host(host_fmt.format(host=host, index=index),
                { 'option host-name':   dhcp_quote(host) },
                { 'hardware ethernet':  ethernet },
                { 'fixed-address':      host.ip },
                { 'next-server':        next_server },
                { 'filename':           dhcp_quote(filename) },
        ) :
            yield line

    yield ""
    
def process_hosts (options, hosts) :
    for host in hosts :
        for line in process_host(options, host) :
            yield line

def apply_conf (options, lines) :
    for line in lines :
        print line

def main (argv) :
    """
        Generate DHCP host configs from host definitions.
    """

    parser = optparse.OptionParser(main.__doc__)
    parser.add_option_group(pvl.args.parser(parser))
    parser.add_option_group(pvl.hosts.optparser(parser))

    options, args = parser.parse_args(argv[1:])
    pvl.args.apply(options)

    # input
    hosts = pvl.hosts.apply(options, args)

    # process
    apply_conf(options, process_hosts(options, hosts))

if __name__ == '__main__':
    pvl.args.main(main)