main.py
author Tero Marttila <terom@fixme.fi>
Sun, 12 Jul 2009 00:43:36 +0300
changeset 6 57e8168ba8c4
parent 5 86b05c0ab5cd
permissions -rwxr-xr-x
use FQDN for zone hosts
1
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
#!/usr/bin/env python2.5
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
5
86b05c0ab5cd generate a db.paivola.fi file
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
     3
import data, dhcp, bind_conf, bind
1
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
import optparse, itertools
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
def parse_args (argv) :
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
    """
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
        Parse the command-line arguments from the given argv list, returning a (options_struct, args_list) tuple,
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
        as per optparse.
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
    """
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
    usage = "Usage: %prog [options] data-file"
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
    # define our options
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
    parser = optparse.OptionParser(usage=usage)
5
86b05c0ab5cd generate a db.paivola.fi file
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    17
    parser.add_option('--dhcpd-conf',   dest='dhcpd_conf',      metavar="PATH", help="path to dhcpd.conf", default='/etc/dhcp3/dhcpd.conf')
86b05c0ab5cd generate a db.paivola.fi file
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    18
    parser.add_option('--bind-zone',    dest='bind_zone',       metavar="PATH", help="path to bind zone file", default=None)
86b05c0ab5cd generate a db.paivola.fi file
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    19
    parser.add_option('--autoserial',   dest='autoserial_path', metavar="PATH", help="path to autoserial file", default='autoserial')
1
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
    
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
    # parse them
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
    options, args = parser.parse_args(args=argv[1:])
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
    # parse the positional arguments
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
    data_file, = args
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    27
    # ok
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
    return options, (data_file, )
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
def write_dhcp (options, settings) :
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
    """
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
        Write the DHCP config module using the data loaded from the given module
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    33
    """
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
    
5
86b05c0ab5cd generate a db.paivola.fi file
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    35
    # build the config file
1
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
    config = dhcp.Config(path=options.dhcpd_conf,
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
        settings        = settings.dhcp_settings,
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
        options         = settings.dhcp_options,
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
        shared_network  = settings.shared_network,
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
        subnets         = settings.subnets,
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
        hosts           = itertools.chain(*(host.build_dhcp_hosts() for host in settings.hosts)),
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
    )
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
    # write it out
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
    config.write()
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
5
86b05c0ab5cd generate a db.paivola.fi file
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    47
def write_bind (options, settings) :
86b05c0ab5cd generate a db.paivola.fi file
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    48
    """
86b05c0ab5cd generate a db.paivola.fi file
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    49
        Write a BIND config for a forward zone
86b05c0ab5cd generate a db.paivola.fi file
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    50
    """
86b05c0ab5cd generate a db.paivola.fi file
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    51
86b05c0ab5cd generate a db.paivola.fi file
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    52
    assert options.bind_zone
86b05c0ab5cd generate a db.paivola.fi file
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    53
86b05c0ab5cd generate a db.paivola.fi file
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    54
    # load the serial
86b05c0ab5cd generate a db.paivola.fi file
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    55
    autoserial = bind.AutoSerial(options.autoserial_path)
86b05c0ab5cd generate a db.paivola.fi file
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    56
86b05c0ab5cd generate a db.paivola.fi file
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    57
    # build the zone file
86b05c0ab5cd generate a db.paivola.fi file
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    58
    zone = bind.Domain(domain=settings.domain, path=options.bind_zone,
86b05c0ab5cd generate a db.paivola.fi file
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    59
            nameservers     = settings.nameservers,
86b05c0ab5cd generate a db.paivola.fi file
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    60
            mailservers     = [((i+1)*10, label) for i, label in enumerate(settings.mailservers)],
86b05c0ab5cd generate a db.paivola.fi file
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    61
            serial          = autoserial.serial(),
86b05c0ab5cd generate a db.paivola.fi file
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    62
            settings        = settings.bind_settings,
86b05c0ab5cd generate a db.paivola.fi file
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    63
            objs            = itertools.chain(*[host.build_bind_domain_records(settings.domain) for host in settings.hosts]),
86b05c0ab5cd generate a db.paivola.fi file
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    64
    )
86b05c0ab5cd generate a db.paivola.fi file
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    65
86b05c0ab5cd generate a db.paivola.fi file
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    66
    # write it out
86b05c0ab5cd generate a db.paivola.fi file
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    67
    zone.write()
86b05c0ab5cd generate a db.paivola.fi file
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    68
1
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
def main (argv) :
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
    """
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    71
        Our app entry point, parse args, load data, write out the config files
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
    """
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    73
    
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    74
    # parse args
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    75
    options, (data_file, ) = parse_args(argv)
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    76
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    77
    # load the data
2
e66102ab7048 fix up data.load_py, and make conf.File be a ConfObject itself - implement this for dhcp_conf
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    78
    data_module = data.load_py('pvl_hosts_data', data_file)
1
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    79
    
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    80
    # write out the config files
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    81
    write_dhcp(options, data_module)
5
86b05c0ab5cd generate a db.paivola.fi file
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    82
    write_bind(options, data_module)
1
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    83
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
if __name__ == '__main__' :
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
    from sys import argv
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    86
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    87
    main(argv)
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88