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
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) :
338
9198e2da360e pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents: 322
diff changeset
    28
    if host.boot :
9198e2da360e pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents: 322
diff changeset
    29
        if ':' in host.boot :
9198e2da360e pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents: 322
diff changeset
    30
            next_server, filename = host.boot.split(':', 1)
9198e2da360e pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents: 322
diff changeset
    31
        elif host.boot.startswith('/') :
9198e2da360e pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents: 322
diff changeset
    32
            next_server = None
9198e2da360e pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents: 322
diff changeset
    33
            filename = host.boot
9198e2da360e pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents: 322
diff changeset
    34
        elif host.boot.endswith(':') :
9198e2da360e pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents: 322
diff changeset
    35
            next_server = host.boot
9198e2da360e pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents: 322
diff changeset
    36
            filename = None
284
eb7e2a4c6880 pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents: 271
diff changeset
    37
        else :
338
9198e2da360e pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents: 322
diff changeset
    38
            log.error("%s: invalid boot: %s", host, host.boot)
9198e2da360e pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents: 322
diff changeset
    39
    else :
9198e2da360e pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents: 322
diff changeset
    40
        next_server = filename = None
271
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    41
338
9198e2da360e pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents: 322
diff changeset
    42
    if set(host.ethernet) == set([0]) :
9198e2da360e pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents: 322
diff changeset
    43
        host_fmt = "{host}"
9198e2da360e pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents: 322
diff changeset
    44
    elif host.ethernet :
9198e2da360e pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents: 322
diff changeset
    45
        host_fmt = "{host}-{index}"
9198e2da360e pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents: 322
diff changeset
    46
    else :
9198e2da360e pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents: 322
diff changeset
    47
        # nothing there
9198e2da360e pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents: 322
diff changeset
    48
        return
271
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    49
338
9198e2da360e pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents: 322
diff changeset
    50
    if host.owner :
9198e2da360e pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents: 322
diff changeset
    51
        yield u"# Owner: {host.owner}".format(host=host)
9198e2da360e pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents: 322
diff changeset
    52
9198e2da360e pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents: 322
diff changeset
    53
    for index, ethernet in host.ethernet.iteritems() :
9198e2da360e pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents: 322
diff changeset
    54
        for line in build_host(host_fmt.format(host=host, index=index),
9198e2da360e pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents: 322
diff changeset
    55
                { 'option host-name':   dhcp_quote(host) },
9198e2da360e pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents: 322
diff changeset
    56
                { 'hardware ethernet':  ethernet },
9198e2da360e pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents: 322
diff changeset
    57
                { 'fixed-address':      host.ip },
9198e2da360e pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents: 322
diff changeset
    58
                { 'next-server':        next_server },
9198e2da360e pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents: 322
diff changeset
    59
                { 'filename':           dhcp_quote(filename) },
9198e2da360e pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents: 322
diff changeset
    60
        ) :
9198e2da360e pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents: 322
diff changeset
    61
            yield line
9198e2da360e pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents: 322
diff changeset
    62
9198e2da360e pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents: 322
diff changeset
    63
    yield ""
284
eb7e2a4c6880 pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents: 271
diff changeset
    64
    
eb7e2a4c6880 pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents: 271
diff changeset
    65
def process_hosts (options, hosts) :
eb7e2a4c6880 pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents: 271
diff changeset
    66
    for host in hosts :
eb7e2a4c6880 pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents: 271
diff changeset
    67
        for line in process_host(options, host) :
eb7e2a4c6880 pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents: 271
diff changeset
    68
            yield line
271
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    69
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    70
def apply_conf (options, lines) :
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    71
    for line in lines :
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    72
        print line
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    73
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    74
def main (argv) :
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
        Generate DHCP host configs from host definitions.
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    77
    """
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    78
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    79
    parser = optparse.OptionParser(main.__doc__)
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    80
    parser.add_option_group(pvl.args.parser(parser))
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    81
    parser.add_option_group(pvl.hosts.optparser(parser))
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
    options, args = parser.parse_args(argv[1:])
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    84
    pvl.args.apply(options)
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
    # input
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    87
    hosts = pvl.hosts.apply(options, args)
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
    # process
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    90
    apply_conf(options, process_hosts(options, hosts))
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    91
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    92
if __name__ == '__main__':
4dfa1a939153 pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    93
    pvl.args.main(main)