bin/pvl.hosts-dhcp
author Tero Marttila <terom@paivola.fi>
Sun, 22 Dec 2013 19:03:57 +0200
changeset 336 edaa5d0aa57d
parent 322 0c3bb9d2f13b
child 338 9198e2da360e
permissions -rwxr-xr-x
version 0.6.1: pvl.hosts forward/reverse delegation, and include= support
271
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     1
#!/usr/bin/env python
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     2
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     3
import pvl.args
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     4
import pvl.hosts
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     5
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     6
import configobj
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     7
import logging; log = logging.getLogger('pvl.hosts-dhcp')
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     8
import optparse
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     9
284
eb7e2a4c6880 pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents: 271
diff changeset
    10
def build_host (host, *items) :
eb7e2a4c6880 pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents: 271
diff changeset
    11
    yield "host {host} {{".format(host=host)
eb7e2a4c6880 pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents: 271
diff changeset
    12
    for item in items :
eb7e2a4c6880 pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents: 271
diff changeset
    13
        if isinstance(item, dict) :
eb7e2a4c6880 pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents: 271
diff changeset
    14
            for setting, value in item.iteritems() :
eb7e2a4c6880 pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents: 271
diff changeset
    15
                if value :
eb7e2a4c6880 pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents: 271
diff changeset
    16
                    yield "\t{setting:30} {value};".format(setting=setting, value=value)
eb7e2a4c6880 pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents: 271
diff changeset
    17
        else :
eb7e2a4c6880 pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents: 271
diff changeset
    18
            raise ValueError("Unknown item: %r", item)
eb7e2a4c6880 pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents: 271
diff changeset
    19
    yield "}"
eb7e2a4c6880 pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents: 271
diff changeset
    20
317
2859d3dedcfe pvl.hosts-dhcp: quote
Tero Marttila <terom@paivola.fi>
parents: 305
diff changeset
    21
def dhcp_quote (value) :
322
0c3bb9d2f13b fix filename "None" via dhcp_quote
Tero Marttila <terom@paivola.fi>
parents: 317
diff changeset
    22
    if value is None :
0c3bb9d2f13b fix filename "None" via dhcp_quote
Tero Marttila <terom@paivola.fi>
parents: 317
diff changeset
    23
        return None
0c3bb9d2f13b fix filename "None" via dhcp_quote
Tero Marttila <terom@paivola.fi>
parents: 317
diff changeset
    24
    else :
0c3bb9d2f13b fix filename "None" via dhcp_quote
Tero Marttila <terom@paivola.fi>
parents: 317
diff changeset
    25
        return '"{value}"'.format(value=value)
317
2859d3dedcfe pvl.hosts-dhcp: quote
Tero Marttila <terom@paivola.fi>
parents: 305
diff changeset
    26
284
eb7e2a4c6880 pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents: 271
diff changeset
    27
def process_host (options, host) :
271
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    28
        if host.owner :
284
eb7e2a4c6880 pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents: 271
diff changeset
    29
            yield u"# {host.owner}".format(host=host)
eb7e2a4c6880 pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents: 271
diff changeset
    30
eb7e2a4c6880 pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents: 271
diff changeset
    31
        if host.boot :
eb7e2a4c6880 pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents: 271
diff changeset
    32
            if ':' in host.boot :
eb7e2a4c6880 pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents: 271
diff changeset
    33
                next_server, filename = host.boot.split(':', 1)
eb7e2a4c6880 pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents: 271
diff changeset
    34
            elif host.boot.startswith('/') :
eb7e2a4c6880 pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents: 271
diff changeset
    35
                next_server = None
eb7e2a4c6880 pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents: 271
diff changeset
    36
                filename = host.boot
eb7e2a4c6880 pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents: 271
diff changeset
    37
            elif host.boot.endswith(':') :
eb7e2a4c6880 pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents: 271
diff changeset
    38
                next_server = host.boot
eb7e2a4c6880 pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents: 271
diff changeset
    39
                filename = None
eb7e2a4c6880 pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents: 271
diff changeset
    40
            else :
eb7e2a4c6880 pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents: 271
diff changeset
    41
                log.error("%s: invalid boot: %s", host, host.boot)
eb7e2a4c6880 pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents: 271
diff changeset
    42
        else :
eb7e2a4c6880 pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents: 271
diff changeset
    43
            next_server = filename = None
eb7e2a4c6880 pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents: 271
diff changeset
    44
305
e85c95e757eb pvl.hosts: support new alias/ethernet field format
Tero Marttila <terom@paivola.fi>
parents: 284
diff changeset
    45
        if set(host.ethernet) == set([0]) :
e85c95e757eb pvl.hosts: support new alias/ethernet field format
Tero Marttila <terom@paivola.fi>
parents: 284
diff changeset
    46
            host_fmt = "{host}"
284
eb7e2a4c6880 pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents: 271
diff changeset
    47
        else :
305
e85c95e757eb pvl.hosts: support new alias/ethernet field format
Tero Marttila <terom@paivola.fi>
parents: 284
diff changeset
    48
            host_fmt = "{host}-{index}"
271
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    49
305
e85c95e757eb pvl.hosts: support new alias/ethernet field format
Tero Marttila <terom@paivola.fi>
parents: 284
diff changeset
    50
        for index, ethernet in host.ethernet.iteritems() :
284
eb7e2a4c6880 pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents: 271
diff changeset
    51
            for line in build_host(host_fmt.format(host=host, index=index),
317
2859d3dedcfe pvl.hosts-dhcp: quote
Tero Marttila <terom@paivola.fi>
parents: 305
diff changeset
    52
                    { 'option host-name':   dhcp_quote(host) },
284
eb7e2a4c6880 pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents: 271
diff changeset
    53
                    { 'hardware ethernet':  ethernet },
eb7e2a4c6880 pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents: 271
diff changeset
    54
                    { 'fixed-address':      host.ip },
eb7e2a4c6880 pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents: 271
diff changeset
    55
                    { 'next-server':        next_server },
317
2859d3dedcfe pvl.hosts-dhcp: quote
Tero Marttila <terom@paivola.fi>
parents: 305
diff changeset
    56
                    { 'filename':           dhcp_quote(filename) },
284
eb7e2a4c6880 pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents: 271
diff changeset
    57
            ) :
eb7e2a4c6880 pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents: 271
diff changeset
    58
                yield line
271
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    59
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    60
        yield ""
284
eb7e2a4c6880 pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents: 271
diff changeset
    61
    
eb7e2a4c6880 pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents: 271
diff changeset
    62
def process_hosts (options, hosts) :
eb7e2a4c6880 pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents: 271
diff changeset
    63
    for host in hosts :
eb7e2a4c6880 pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents: 271
diff changeset
    64
        for line in process_host(options, host) :
eb7e2a4c6880 pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents: 271
diff changeset
    65
            yield line
271
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    66
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    67
def apply_conf (options, lines) :
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    68
    for line in lines :
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    69
        print line
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    70
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    71
def main (argv) :
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    72
    """
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    73
        Generate DHCP host configs from host definitions.
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    74
    """
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    75
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    76
    parser = optparse.OptionParser(main.__doc__)
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    77
    parser.add_option_group(pvl.args.parser(parser))
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    78
    parser.add_option_group(pvl.hosts.optparser(parser))
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    79
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    80
    options, args = parser.parse_args(argv[1:])
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    81
    pvl.args.apply(options)
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    82
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    83
    # input
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    84
    hosts = pvl.hosts.apply(options, args)
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    85
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    86
    # process
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    87
    apply_conf(options, process_hosts(options, hosts))
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    88
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    89
if __name__ == '__main__':
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    90
    pvl.args.main(main)