pvl.hosts: support foo:bar = ... extension fields
#!/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)