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