bin/pvl.hosts-dhcp
author Tero Marttila <terom@paivola.fi>
Sat, 21 Dec 2013 22:57:44 +0200
changeset 329 b3778c190aa5
parent 322 0c3bb9d2f13b
child 338 9198e2da360e
permissions -rwxr-xr-x
version 0..0:

pvl.rrd: api.report()
pvl.wlan-syslog: track openwrt hostapd syslog wlan sta activity
pvl.verkko.wlan: basic Table view
pvl.dns-serial
pvl.dns-zone
pvl.dhcp.config: nested blocks
pvl.hosts-import: import hosts from dns/dhcp
pvl.hosts-dns: generate --forward-zone=paivola.fi and --reverse-zone=194.197.235
pvl.hosts-dhcp: generate dhcp hosts conf
#!/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.owner :
            yield u"# {host.owner}".format(host=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}"
        else :
            host_fmt = "{host}-{index}"

        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)