bin/pvl.hosts-import
author Tero Marttila <terom@paivola.fi>
Mon, 16 Dec 2013 21:15:25 +0200
changeset 288 2f2f92e4c58e
parent 285 e18aaec99e54
child 301 b41902b0b9cf
permissions -rwxr-xr-x
pvl.hosts-import: check_hosts: verify nonexistan aliases
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     1
#!/usr/bin/env python
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     2
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     3
"""
268
560ba0544254 pvl.hosts-import: ugly indexed foo.X keys for multi-value fields..
Tero Marttila <terom@paivola.fi>
parents: 266
diff changeset
     4
    Import hosts from existing BIND or dhcpd files.
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     5
"""
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     6
268
560ba0544254 pvl.hosts-import: ugly indexed foo.X keys for multi-value fields..
Tero Marttila <terom@paivola.fi>
parents: 266
diff changeset
     7
import pvl.args
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     8
import pvl.dns.zone
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     9
import pvl.dhcp.config
261
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
    10
import pvl.ldap.args
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    11
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
    12
import ipaddr
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
    13
import optparse
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    14
import collections
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    15
import re
266
4eb3d73d852c rename pvl.dns-hosts to pvl.hosts-import
Tero Marttila <terom@paivola.fi>
parents: 265
diff changeset
    16
import logging; log = logging.getLogger('pvl.hosts-import')
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    17
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    18
__version__ = '0.1'
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    19
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    20
def parse_options (argv) :
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    21
    """
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    22
        Parse command-line arguments.
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    23
    """
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    24
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    25
    parser = optparse.OptionParser(
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    26
            prog        = argv[0],
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    27
            usage       = '%prog: [options]',
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    28
            version     = __version__,
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    29
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    30
            # module docstring
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    31
            description = __doc__,
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    32
    )
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    33
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    34
    # logging
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    35
    parser.add_option_group(pvl.args.parser(parser))
261
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
    36
    parser.add_option_group(pvl.ldap.args.parser(parser))
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    37
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    38
    parser.add_option('-c', '--input-charset',  metavar='CHARSET',  default='utf-8', 
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    39
            help="Encoding used for input files")
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    40
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    41
    parser.add_option('--output-charset',       metavar='CHARSET',  default='utf-8', 
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    42
            help="Encoding used for output files")
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    43
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    44
    # input
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    45
    parser.add_option('--import-zone-hosts',    metavar='FILE',
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    46
            help="Load hosts from DNS zone")
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    47
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    48
    parser.add_option('--import-dhcp-hosts',    metavar='FILE',
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    49
            help="Load hosts from DHCP config")
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    50
280
8118854bfa6f pvl.hosts-import: import boot settings
Tero Marttila <terom@paivola.fi>
parents: 279
diff changeset
    51
    parser.add_option('--import-dhcp-boot-server',      metavar='NEXT-SERVER',
8118854bfa6f pvl.hosts-import: import boot settings
Tero Marttila <terom@paivola.fi>
parents: 279
diff changeset
    52
            help="Default boot_server for dpc hosts")
8118854bfa6f pvl.hosts-import: import boot settings
Tero Marttila <terom@paivola.fi>
parents: 279
diff changeset
    53
275
4dc5cc30a278 pvl.hosts-import: support AAAA, make default comment handling an option
Tero Marttila <terom@paivola.fi>
parents: 268
diff changeset
    54
    parser.add_option('--zone-comments-default-owner',  action='store_const',
4dc5cc30a278 pvl.hosts-import: support AAAA, make default comment handling an option
Tero Marttila <terom@paivola.fi>
parents: 268
diff changeset
    55
            dest='zone_comments_default', const='owner',
4dc5cc30a278 pvl.hosts-import: support AAAA, make default comment handling an option
Tero Marttila <terom@paivola.fi>
parents: 268
diff changeset
    56
            help="Import DNS zone comment as owner comment")
4dc5cc30a278 pvl.hosts-import: support AAAA, make default comment handling an option
Tero Marttila <terom@paivola.fi>
parents: 268
diff changeset
    57
4dc5cc30a278 pvl.hosts-import: support AAAA, make default comment handling an option
Tero Marttila <terom@paivola.fi>
parents: 268
diff changeset
    58
    parser.add_option('--zone-comments-default-host',   action='store_const',
4dc5cc30a278 pvl.hosts-import: support AAAA, make default comment handling an option
Tero Marttila <terom@paivola.fi>
parents: 268
diff changeset
    59
            dest='zone_comments_default', const='host',
4dc5cc30a278 pvl.hosts-import: support AAAA, make default comment handling an option
Tero Marttila <terom@paivola.fi>
parents: 268
diff changeset
    60
            help="Import DNS zone comment as host comment")
4dc5cc30a278 pvl.hosts-import: support AAAA, make default comment handling an option
Tero Marttila <terom@paivola.fi>
parents: 268
diff changeset
    61
261
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
    62
    parser.add_option('--dump-host-comments',   action='store_true',
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
    63
            help="Dump out info on imported host comments")
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
    64
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    65
    # defaults
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    66
    parser.add_option('--hosts-domain',         metavar='DOMAIN',
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    67
            help="Default domain for hosts")
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    68
    
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    69
    parser.add_option('--zone-unused',          metavar='HOST',
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    70
            help="DNS name for unallocated hosts")
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    71
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    72
    # output
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    73
    parser.add_option('--output-hosts',         metavar='FILE',
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    74
            help="Output hosts file")
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    75
265
5f2807999222 pvl.dns-hosts: always sort by ip
Tero Marttila <terom@paivola.fi>
parents: 264
diff changeset
    76
    parser.add_option('--output-prefix',        metavar='PREFIX',
5f2807999222 pvl.dns-hosts: always sort by ip
Tero Marttila <terom@paivola.fi>
parents: 264
diff changeset
    77
            help="Select hosts by ip prefix")
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
    78
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    79
    # defaults
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    80
    parser.set_defaults(
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    81
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    82
    )
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    83
    
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    84
    # parse
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    85
    options, args = parser.parse_args(argv[1:])
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    86
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    87
    # apply
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    88
    pvl.args.apply(options, argv[0])
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    89
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    90
    return options, args
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    91
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
    92
def import_zone_hosts (options, file) :
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    93
    """
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    94
        Yield host info from zonefile records.
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    95
    """
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    96
279
1b72f1e0cdbe pvl.hosts-import: do not import $GENERATE hosts; fix warnings on missing owner comments
Tero Marttila <terom@paivola.fi>
parents: 275
diff changeset
    97
    for rr in pvl.dns.zone.ZoneRecord.load(file,
1b72f1e0cdbe pvl.hosts-import: do not import $GENERATE hosts; fix warnings on missing owner comments
Tero Marttila <terom@paivola.fi>
parents: 275
diff changeset
    98
            # generated hosts need to imported by hand...
1b72f1e0cdbe pvl.hosts-import: do not import $GENERATE hosts; fix warnings on missing owner comments
Tero Marttila <terom@paivola.fi>
parents: 275
diff changeset
    99
            expand_generate = False,
1b72f1e0cdbe pvl.hosts-import: do not import $GENERATE hosts; fix warnings on missing owner comments
Tero Marttila <terom@paivola.fi>
parents: 275
diff changeset
   100
    ) :
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   101
        if options.zone_unused and rr.name == options.zone_unused :
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   102
            log.debug("%s: skip %s", rr.name, rr)
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   103
            continue
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   104
275
4dc5cc30a278 pvl.hosts-import: support AAAA, make default comment handling an option
Tero Marttila <terom@paivola.fi>
parents: 268
diff changeset
   105
        elif rr.type in ('A', 'AAAA') :
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   106
            ip, = rr.data
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   107
281
b236f689ba22 pvl.hosts-import: separate ip6 field
Tero Marttila <terom@paivola.fi>
parents: 280
diff changeset
   108
            type = { 'A': 'ip', 'AAAA': 'ip6' }[rr.type]
b236f689ba22 pvl.hosts-import: separate ip6 field
Tero Marttila <terom@paivola.fi>
parents: 280
diff changeset
   109
b236f689ba22 pvl.hosts-import: separate ip6 field
Tero Marttila <terom@paivola.fi>
parents: 280
diff changeset
   110
            yield rr.name, type, ipaddr.IPAddress(ip)
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   111
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   112
            if rr.comment :
260
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   113
                yield rr.name, 'comment', rr.comment
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   114
275
4dc5cc30a278 pvl.hosts-import: support AAAA, make default comment handling an option
Tero Marttila <terom@paivola.fi>
parents: 268
diff changeset
   115
            if rr.origin :
285
e18aaec99e54 pvl.hosts-import: generate domain-sections
Tero Marttila <terom@paivola.fi>
parents: 281
diff changeset
   116
                # not a fqdn
e18aaec99e54 pvl.hosts-import: generate domain-sections
Tero Marttila <terom@paivola.fi>
parents: 281
diff changeset
   117
                yield rr.name, 'domain', rr.origin.rstrip('.')
275
4dc5cc30a278 pvl.hosts-import: support AAAA, make default comment handling an option
Tero Marttila <terom@paivola.fi>
parents: 268
diff changeset
   118
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   119
        elif rr.type == 'CNAME' :
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   120
            host, = rr.data
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   121
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   122
            yield host, 'alias', rr.name
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   123
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   124
        else :
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   125
            log.warn("%s: unknown rr: %s", rr.name, rr)
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   126
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   127
def import_dhcp_host (options, host, items) :
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   128
    """
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   129
        Yield host infos from a dhcp host ... { ... }
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   130
    """
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   131
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   132
    hostname = None
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   133
    ethernet = []
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   134
    fixed_address = None
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   135
280
8118854bfa6f pvl.hosts-import: import boot settings
Tero Marttila <terom@paivola.fi>
parents: 279
diff changeset
   136
    boot_server = options.import_dhcp_boot_server
8118854bfa6f pvl.hosts-import: import boot settings
Tero Marttila <terom@paivola.fi>
parents: 279
diff changeset
   137
    boot_filename = None
8118854bfa6f pvl.hosts-import: import boot settings
Tero Marttila <terom@paivola.fi>
parents: 279
diff changeset
   138
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   139
    for item in items :
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   140
        item, args = item[0], item[1:]
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   141
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   142
        if item == 'hardware' :
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   143
            _ethernet, ethernet = args
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   144
            assert _ethernet == 'ethernet'
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   145
        elif item == 'fixed-address' :
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   146
            fixed_address, = args
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   147
        elif item == 'option' :
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   148
            option = args.pop(0)
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   149
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   150
            if option == 'host-name' :
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   151
                hostname, = args
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   152
            else :
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   153
                log.warn("host %s: ignore unknown option: %s", host, option)
280
8118854bfa6f pvl.hosts-import: import boot settings
Tero Marttila <terom@paivola.fi>
parents: 279
diff changeset
   154
        elif item == 'next-sever' :
8118854bfa6f pvl.hosts-import: import boot settings
Tero Marttila <terom@paivola.fi>
parents: 279
diff changeset
   155
            boot_server, = args
8118854bfa6f pvl.hosts-import: import boot settings
Tero Marttila <terom@paivola.fi>
parents: 279
diff changeset
   156
        elif item == 'filename' :
8118854bfa6f pvl.hosts-import: import boot settings
Tero Marttila <terom@paivola.fi>
parents: 279
diff changeset
   157
            boot_filename, = args
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   158
        else :
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   159
            log.warn("host %s: ignore unknown item: %s", host, item)
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   160
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   161
    # determine hostname
264
ce29be46f705 add unknown owners as a comment..
Tero Marttila <terom@paivola.fi>
parents: 263
diff changeset
   162
    suffix = None
ce29be46f705 add unknown owners as a comment..
Tero Marttila <terom@paivola.fi>
parents: 263
diff changeset
   163
ce29be46f705 add unknown owners as a comment..
Tero Marttila <terom@paivola.fi>
parents: 263
diff changeset
   164
    if '-' in host :
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   165
        hostname, suffix = host.rsplit('-', 1)
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   166
    else :
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   167
        hostname = host
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   168
264
ce29be46f705 add unknown owners as a comment..
Tero Marttila <terom@paivola.fi>
parents: 263
diff changeset
   169
    if fixed_address and not re.match(r'\d+\.\d+\.\d+.\d+', fixed_address) :
ce29be46f705 add unknown owners as a comment..
Tero Marttila <terom@paivola.fi>
parents: 263
diff changeset
   170
        hostname, domain = fixed_address.split('.', 1)
ce29be46f705 add unknown owners as a comment..
Tero Marttila <terom@paivola.fi>
parents: 263
diff changeset
   171
280
8118854bfa6f pvl.hosts-import: import boot settings
Tero Marttila <terom@paivola.fi>
parents: 279
diff changeset
   172
    if not (hostname or ethernet) :
8118854bfa6f pvl.hosts-import: import boot settings
Tero Marttila <terom@paivola.fi>
parents: 279
diff changeset
   173
        log.warn("%s: no hostname/ethernet: %s/%s", host, hostname, ethernet)
8118854bfa6f pvl.hosts-import: import boot settings
Tero Marttila <terom@paivola.fi>
parents: 279
diff changeset
   174
        return
8118854bfa6f pvl.hosts-import: import boot settings
Tero Marttila <terom@paivola.fi>
parents: 279
diff changeset
   175
        
8118854bfa6f pvl.hosts-import: import boot settings
Tero Marttila <terom@paivola.fi>
parents: 279
diff changeset
   176
    yield hostname, 'ethernet', ethernet
264
ce29be46f705 add unknown owners as a comment..
Tero Marttila <terom@paivola.fi>
parents: 263
diff changeset
   177
    #if suffix :
268
560ba0544254 pvl.hosts-import: ugly indexed foo.X keys for multi-value fields..
Tero Marttila <terom@paivola.fi>
parents: 266
diff changeset
   178
    #    yield hostname, ('ethernet', suffix), ethernet
280
8118854bfa6f pvl.hosts-import: import boot settings
Tero Marttila <terom@paivola.fi>
parents: 279
diff changeset
   179
8118854bfa6f pvl.hosts-import: import boot settings
Tero Marttila <terom@paivola.fi>
parents: 279
diff changeset
   180
    if boot_server and boot_filename :
8118854bfa6f pvl.hosts-import: import boot settings
Tero Marttila <terom@paivola.fi>
parents: 279
diff changeset
   181
        yield hostname, 'boot', "{server}:{filename}".format(
8118854bfa6f pvl.hosts-import: import boot settings
Tero Marttila <terom@paivola.fi>
parents: 279
diff changeset
   182
                server      = boot_server,
8118854bfa6f pvl.hosts-import: import boot settings
Tero Marttila <terom@paivola.fi>
parents: 279
diff changeset
   183
                filename    = boot_filename,
8118854bfa6f pvl.hosts-import: import boot settings
Tero Marttila <terom@paivola.fi>
parents: 279
diff changeset
   184
        )
8118854bfa6f pvl.hosts-import: import boot settings
Tero Marttila <terom@paivola.fi>
parents: 279
diff changeset
   185
    elif boot_filename :
8118854bfa6f pvl.hosts-import: import boot settings
Tero Marttila <terom@paivola.fi>
parents: 279
diff changeset
   186
        yield hostname, 'boot', "{filename}".format(filename=boot_filename)
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   187
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   188
def import_dhcp_hosts (options, blocks) :
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   189
    """
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   190
        Process hosts from a parsed block
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   191
    """
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   192
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   193
    for block, items, blocks in blocks :
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   194
        log.info("%s", block)
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   195
        
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   196
        block, args = block[0], block[1:]
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   197
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   198
        if block == 'group' :
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   199
            for info in import_dhcp_hosts(options, blocks) :
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   200
                yield info
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   201
        elif block == 'host' :
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   202
            host, = args
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   203
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   204
            try :
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   205
                for info in import_dhcp_host(options, host, items) :
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   206
                    yield info
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   207
            except ValueError as error :
280
8118854bfa6f pvl.hosts-import: import boot settings
Tero Marttila <terom@paivola.fi>
parents: 279
diff changeset
   208
                log.exception("%s: invalid host: %s", host, error)
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   209
        else:
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   210
            log.warn("ignore unknown block: %s", block)
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   211
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   212
def import_dhcp_conf (options, file) :
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   213
    items, blocks = pvl.dhcp.config.DHCPConfigParser().load(file)
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   214
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   215
    for item in items :
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   216
        item, args = item[0], item[1:]
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   217
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   218
        if item == 'include' :
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   219
            include, = args
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   220
            for info in import_dhcp_conf(options, pvl.args.apply_file(include)) :
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   221
                yield info
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   222
        else :
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   223
            log.warn("ignore unknown item: %s", item)
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   224
    
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   225
    for info in import_dhcp_hosts(options, blocks) :
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   226
        yield info
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   227
260
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   228
ZONE_COMMENTS = (
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   229
        re.compile(r'(?P<owner>[^/]+)\s*-\s+(?P<host>.+)'),
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   230
        re.compile(r'(?P<group>.+?)\s*/\s*(?P<owner>.+)\s+[/-]\s+(?P<host>.+)'),
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   231
        re.compile(r'(?P<group>.+?)\s*/\s*(?P<owner>.+)\s+[(]\s*(?P<host>.+)[)]'),
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   232
        re.compile(r'(?P<group>.+?)\s*/\s*(?P<owner>.+)'),
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   233
)
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   234
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   235
ZONE_OWNER_MAIL = re.compile(r'(?P<owner>.*?)\s*<(?P<mail>.+?)>')
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   236
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   237
def process_zone_comment (options, hostname, comment) :
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   238
    """
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   239
        Attempt to parse a host comment field... :D
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   240
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   241
        Yields (field, value) bits
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   242
    """
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   243
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   244
    for regex in ZONE_COMMENTS :
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   245
        match = regex.match(comment)
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   246
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   247
        if match :
275
4dc5cc30a278 pvl.hosts-import: support AAAA, make default comment handling an option
Tero Marttila <terom@paivola.fi>
parents: 268
diff changeset
   248
            matches = match.groupdict()
279
1b72f1e0cdbe pvl.hosts-import: do not import $GENERATE hosts; fix warnings on missing owner comments
Tero Marttila <terom@paivola.fi>
parents: 275
diff changeset
   249
1b72f1e0cdbe pvl.hosts-import: do not import $GENERATE hosts; fix warnings on missing owner comments
Tero Marttila <terom@paivola.fi>
parents: 275
diff changeset
   250
            log.info("%s: matched comment: %s", hostname, comment)
260
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   251
            break
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   252
    else :
275
4dc5cc30a278 pvl.hosts-import: support AAAA, make default comment handling an option
Tero Marttila <terom@paivola.fi>
parents: 268
diff changeset
   253
        if options.zone_comments_default :
279
1b72f1e0cdbe pvl.hosts-import: do not import $GENERATE hosts; fix warnings on missing owner comments
Tero Marttila <terom@paivola.fi>
parents: 275
diff changeset
   254
            log.info("%s: default comment: %s", hostname, comment)
275
4dc5cc30a278 pvl.hosts-import: support AAAA, make default comment handling an option
Tero Marttila <terom@paivola.fi>
parents: 268
diff changeset
   255
            matches = { options.zone_comments_default: comment }
4dc5cc30a278 pvl.hosts-import: support AAAA, make default comment handling an option
Tero Marttila <terom@paivola.fi>
parents: 268
diff changeset
   256
        else :
4dc5cc30a278 pvl.hosts-import: support AAAA, make default comment handling an option
Tero Marttila <terom@paivola.fi>
parents: 268
diff changeset
   257
            log.warn("%s: unknown comment: %s", hostname, comment)
4dc5cc30a278 pvl.hosts-import: support AAAA, make default comment handling an option
Tero Marttila <terom@paivola.fi>
parents: 268
diff changeset
   258
            return
260
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   259
    
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   260
    owner = matches.pop('owner', None)
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   261
    
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   262
    if owner :
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   263
        mail_match = ZONE_OWNER_MAIL.match(owner)
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   264
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   265
        if mail_match :
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   266
            mail_matches = mail_match.groupdict()
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   267
            
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   268
            owner = mail_matches['owner']
261
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   269
            yield 'mail', mail_matches['mail'].strip()
275
4dc5cc30a278 pvl.hosts-import: support AAAA, make default comment handling an option
Tero Marttila <terom@paivola.fi>
parents: 268
diff changeset
   270
    
4dc5cc30a278 pvl.hosts-import: support AAAA, make default comment handling an option
Tero Marttila <terom@paivola.fi>
parents: 268
diff changeset
   271
        yield 'owner', owner.strip()
260
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   272
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   273
    for field, value in matches.iteritems() :
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   274
        if value :
261
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   275
            yield field, value.strip()
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   276
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   277
NONE_OWNERS = set((
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   278
    u'tech',
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   279
    u'atk',
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   280
    u'toimisto',
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   281
))
261
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   282
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   283
def process_host_owner_ldap (options, host, info) :
261
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   284
    """
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   285
        Yield guesses for user from LDAP.
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   286
    """
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   287
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   288
    if info.get('mail') :
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   289
        for user in options.ldap.users.filter(
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   290
                { 'mailLocalAddress': info['mail'] },
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   291
                { 'uid': info['mail'] },
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   292
        ) :
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   293
            yield user, None
261
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   294
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   295
    if info.get('group') and info.get('owner') :
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   296
        groups = options.ldap.groups.filter(cn=info['group'])
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   297
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   298
        for group in groups :
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   299
            for user in options.ldap.users.filter({
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   300
                'gidNumber': group['gidNumber'],
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   301
                'cn': info['owner'],
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   302
            }) :
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   303
                yield user, group
261
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   304
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   305
    if info.get('owner') :
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   306
            for user in options.ldap.users.filter({
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   307
                'cn': info['owner'],
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   308
            }) :
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   309
                yield user, None
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   310
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   311
def process_host_owner (options, host, info) :
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   312
    """
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   313
        Return (owner, comment) for host based on info, or None.
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   314
    """
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   315
275
4dc5cc30a278 pvl.hosts-import: support AAAA, make default comment handling an option
Tero Marttila <terom@paivola.fi>
parents: 268
diff changeset
   316
    owner = info.get('owner')
4dc5cc30a278 pvl.hosts-import: support AAAA, make default comment handling an option
Tero Marttila <terom@paivola.fi>
parents: 268
diff changeset
   317
4dc5cc30a278 pvl.hosts-import: support AAAA, make default comment handling an option
Tero Marttila <terom@paivola.fi>
parents: 268
diff changeset
   318
    if owner and owner.lower() in NONE_OWNERS :
264
ce29be46f705 add unknown owners as a comment..
Tero Marttila <terom@paivola.fi>
parents: 263
diff changeset
   319
        return False
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   320
    
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   321
    # from ldap?
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   322
    for ldap in process_host_owner_ldap(options, host, info) :
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   323
        user, group = ldap
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   324
        
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   325
        if not group :
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   326
            # get group from ldap
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   327
            group = options.ldap.users.group(user)
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   328
        
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   329
        return user['uid'], u"{group} / {user}".format(
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   330
                user    = user.getunicode('cn'),
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   331
                group   = group.getunicode('cn'),
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   332
        )
261
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   333
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   334
def process_host_comments (options, host, info) :
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   335
    """
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   336
        Process host fields from comment.
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   337
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   338
        Attempts to find owner from LDAP..
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   339
    """
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   340
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   341
    log.debug("%s: %s", host, info)
260
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   342
    
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   343
    owner = process_host_owner(options, host, info) 
261
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   344
264
ce29be46f705 add unknown owners as a comment..
Tero Marttila <terom@paivola.fi>
parents: 263
diff changeset
   345
    if owner is False :
ce29be46f705 add unknown owners as a comment..
Tero Marttila <terom@paivola.fi>
parents: 263
diff changeset
   346
        # do not mark any owner
ce29be46f705 add unknown owners as a comment..
Tero Marttila <terom@paivola.fi>
parents: 263
diff changeset
   347
        pass
ce29be46f705 add unknown owners as a comment..
Tero Marttila <terom@paivola.fi>
parents: 263
diff changeset
   348
ce29be46f705 add unknown owners as a comment..
Tero Marttila <terom@paivola.fi>
parents: 263
diff changeset
   349
    elif owner :
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   350
        owner, comment = owner
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   351
        
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   352
        log.info("%s: %s (%s)", host, owner, comment)
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   353
        
268
560ba0544254 pvl.hosts-import: ugly indexed foo.X keys for multi-value fields..
Tero Marttila <terom@paivola.fi>
parents: 266
diff changeset
   354
        yield 'comment-owner', comment
261
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   355
        yield 'owner', owner,
264
ce29be46f705 add unknown owners as a comment..
Tero Marttila <terom@paivola.fi>
parents: 263
diff changeset
   356
279
1b72f1e0cdbe pvl.hosts-import: do not import $GENERATE hosts; fix warnings on missing owner comments
Tero Marttila <terom@paivola.fi>
parents: 275
diff changeset
   357
    elif 'group' in info or 'owner' in info :
264
ce29be46f705 add unknown owners as a comment..
Tero Marttila <terom@paivola.fi>
parents: 263
diff changeset
   358
        log.warn("%s: unknown owner: %s", host, info)
268
560ba0544254 pvl.hosts-import: ugly indexed foo.X keys for multi-value fields..
Tero Marttila <terom@paivola.fi>
parents: 266
diff changeset
   359
        yield 'comment-owner', "{group} / {owner}".format(
264
ce29be46f705 add unknown owners as a comment..
Tero Marttila <terom@paivola.fi>
parents: 263
diff changeset
   360
                group   = info.get('group', ''),
ce29be46f705 add unknown owners as a comment..
Tero Marttila <terom@paivola.fi>
parents: 263
diff changeset
   361
                owner   = info.get('owner', ''),
ce29be46f705 add unknown owners as a comment..
Tero Marttila <terom@paivola.fi>
parents: 263
diff changeset
   362
        )
262
36c980a6d04a pvl.dns-host: add host comment
Tero Marttila <terom@paivola.fi>
parents: 261
diff changeset
   363
    
36c980a6d04a pvl.dns-host: add host comment
Tero Marttila <terom@paivola.fi>
parents: 261
diff changeset
   364
    if info.get('host') :
268
560ba0544254 pvl.hosts-import: ugly indexed foo.X keys for multi-value fields..
Tero Marttila <terom@paivola.fi>
parents: 266
diff changeset
   365
        yield 'comment-host', info['host']
260
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   366
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   367
def process_hosts_comments (options, import_hosts) :
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   368
    """
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   369
        Parse out comments from host imports..
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   370
    """
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   371
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   372
    for host, field, value in import_hosts :
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   373
        if field != 'comment':
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   374
            yield host, field, value
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   375
            continue
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   376
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   377
        fields = dict(process_zone_comment(options, host, value))
261
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   378
        
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   379
        if options.dump_host_comments :
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   380
            print u"{host:20} {comment:80} = {group:15} / {owner:20} <{mail:20}> / {hostinfo}".format(
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   381
                    host        = host,
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   382
                    comment     = value,
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   383
                    group       = fields.get('group', ''),
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   384
                    owner       = fields.get('owner', ''),
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   385
                    mail        = fields.get('mail', ''),
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   386
                    hostinfo    = fields.get('host', ''),
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   387
            ).encode('utf-8')
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   388
        
260
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   389
261
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   390
        for field, value in process_host_comments(options, host, fields) :
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   391
            yield host, field, value
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   392
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   393
def apply_hosts_import (options) :
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   394
    """
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   395
        Import host infos from given files.
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   396
    """
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   397
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   398
    if options.import_zone_hosts:
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   399
        for info in import_zone_hosts(options,
268
560ba0544254 pvl.hosts-import: ugly indexed foo.X keys for multi-value fields..
Tero Marttila <terom@paivola.fi>
parents: 266
diff changeset
   400
                pvl.args.apply_file(options.import_zone_hosts, 'r', options.input_charset)) :
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   401
            yield info
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   402
    
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   403
    if options.import_dhcp_hosts:
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   404
        for info in import_dhcp_conf(options,
268
560ba0544254 pvl.hosts-import: ugly indexed foo.X keys for multi-value fields..
Tero Marttila <terom@paivola.fi>
parents: 266
diff changeset
   405
                pvl.args.apply_file(options.import_dhcp_hosts, 'r', options.input_charset)) :
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   406
            yield info
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   407
       
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   408
def import_hosts (options) :
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   409
    """
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   410
        Import hosts from dns/dhcp.
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   411
    """
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   412
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   413
    import_hosts = apply_hosts_import(options)
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   414
    import_hosts = process_hosts_comments(options, import_hosts)
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   415
    
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   416
    # gather
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   417
    hosts = collections.defaultdict(lambda: collections.defaultdict(list))
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   418
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   419
    for host, field, value in import_hosts :
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   420
        hosts[host][field].append(value)
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   421
    
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   422
    return hosts.iteritems()
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   423
288
2f2f92e4c58e pvl.hosts-import: check_hosts: verify nonexistan aliases
Tero Marttila <terom@paivola.fi>
parents: 285
diff changeset
   424
def check_hosts (options, hosts) :
2f2f92e4c58e pvl.hosts-import: check_hosts: verify nonexistan aliases
Tero Marttila <terom@paivola.fi>
parents: 285
diff changeset
   425
    by_name = dict(hosts)
2f2f92e4c58e pvl.hosts-import: check_hosts: verify nonexistan aliases
Tero Marttila <terom@paivola.fi>
parents: 285
diff changeset
   426
2f2f92e4c58e pvl.hosts-import: check_hosts: verify nonexistan aliases
Tero Marttila <terom@paivola.fi>
parents: 285
diff changeset
   427
    for host, fields in hosts :
2f2f92e4c58e pvl.hosts-import: check_hosts: verify nonexistan aliases
Tero Marttila <terom@paivola.fi>
parents: 285
diff changeset
   428
        if set(fields) == set(['alias']) :
2f2f92e4c58e pvl.hosts-import: check_hosts: verify nonexistan aliases
Tero Marttila <terom@paivola.fi>
parents: 285
diff changeset
   429
            log.warn("%s: nonexistant alias target: %s", host, ' '.join(fields['alias']))
2f2f92e4c58e pvl.hosts-import: check_hosts: verify nonexistan aliases
Tero Marttila <terom@paivola.fi>
parents: 285
diff changeset
   430
2f2f92e4c58e pvl.hosts-import: check_hosts: verify nonexistan aliases
Tero Marttila <terom@paivola.fi>
parents: 285
diff changeset
   431
def sort_export_hosts (options, hosts) :
265
5f2807999222 pvl.dns-hosts: always sort by ip
Tero Marttila <terom@paivola.fi>
parents: 264
diff changeset
   432
    if options.output_prefix :
5f2807999222 pvl.dns-hosts: always sort by ip
Tero Marttila <terom@paivola.fi>
parents: 264
diff changeset
   433
        prefix = ipaddr.IPNetwork(options.output_prefix)
5f2807999222 pvl.dns-hosts: always sort by ip
Tero Marttila <terom@paivola.fi>
parents: 264
diff changeset
   434
    else :
5f2807999222 pvl.dns-hosts: always sort by ip
Tero Marttila <terom@paivola.fi>
parents: 264
diff changeset
   435
        prefix = None
5f2807999222 pvl.dns-hosts: always sort by ip
Tero Marttila <terom@paivola.fi>
parents: 264
diff changeset
   436
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   437
    for host, fields in hosts :
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   438
        ip = fields.get('ip')
265
5f2807999222 pvl.dns-hosts: always sort by ip
Tero Marttila <terom@paivola.fi>
parents: 264
diff changeset
   439
        
5f2807999222 pvl.dns-hosts: always sort by ip
Tero Marttila <terom@paivola.fi>
parents: 264
diff changeset
   440
        # sort by IP
5f2807999222 pvl.dns-hosts: always sort by ip
Tero Marttila <terom@paivola.fi>
parents: 264
diff changeset
   441
        if ip :
268
560ba0544254 pvl.hosts-import: ugly indexed foo.X keys for multi-value fields..
Tero Marttila <terom@paivola.fi>
parents: 266
diff changeset
   442
            sort = ip[0]
265
5f2807999222 pvl.dns-hosts: always sort by ip
Tero Marttila <terom@paivola.fi>
parents: 264
diff changeset
   443
        else :
5f2807999222 pvl.dns-hosts: always sort by ip
Tero Marttila <terom@paivola.fi>
parents: 264
diff changeset
   444
            # fake, to sort correctly
5f2807999222 pvl.dns-hosts: always sort by ip
Tero Marttila <terom@paivola.fi>
parents: 264
diff changeset
   445
            sort = ipaddr.IPAddress(0)
5f2807999222 pvl.dns-hosts: always sort by ip
Tero Marttila <terom@paivola.fi>
parents: 264
diff changeset
   446
        
5f2807999222 pvl.dns-hosts: always sort by ip
Tero Marttila <terom@paivola.fi>
parents: 264
diff changeset
   447
        # select
5f2807999222 pvl.dns-hosts: always sort by ip
Tero Marttila <terom@paivola.fi>
parents: 264
diff changeset
   448
        if prefix:
5f2807999222 pvl.dns-hosts: always sort by ip
Tero Marttila <terom@paivola.fi>
parents: 264
diff changeset
   449
            if not (ip and ip in prefix) :
5f2807999222 pvl.dns-hosts: always sort by ip
Tero Marttila <terom@paivola.fi>
parents: 264
diff changeset
   450
                continue
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   451
265
5f2807999222 pvl.dns-hosts: always sort by ip
Tero Marttila <terom@paivola.fi>
parents: 264
diff changeset
   452
        yield sort, host, fields
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   453
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   454
def export_hosts (options, hosts) :
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   455
    """
285
e18aaec99e54 pvl.hosts-import: generate domain-sections
Tero Marttila <terom@paivola.fi>
parents: 281
diff changeset
   456
        Generate hosts config lines for given hosts.
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   457
    """
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   458
285
e18aaec99e54 pvl.hosts-import: generate domain-sections
Tero Marttila <terom@paivola.fi>
parents: 281
diff changeset
   459
    FMT = u"\t{field:15} = {value}"
e18aaec99e54 pvl.hosts-import: generate domain-sections
Tero Marttila <terom@paivola.fi>
parents: 281
diff changeset
   460
e18aaec99e54 pvl.hosts-import: generate domain-sections
Tero Marttila <terom@paivola.fi>
parents: 281
diff changeset
   461
    yield u"[{domain}]".format(domain=options.hosts_domain)
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   462
265
5f2807999222 pvl.dns-hosts: always sort by ip
Tero Marttila <terom@paivola.fi>
parents: 264
diff changeset
   463
    # filter + sort
288
2f2f92e4c58e pvl.hosts-import: check_hosts: verify nonexistan aliases
Tero Marttila <terom@paivola.fi>
parents: 285
diff changeset
   464
    hosts = [(host, fields) for sort, host, fields in sorted(sort_export_hosts(options, hosts))]
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   465
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   466
    for host, fields in hosts :
268
560ba0544254 pvl.hosts-import: ugly indexed foo.X keys for multi-value fields..
Tero Marttila <terom@paivola.fi>
parents: 266
diff changeset
   467
        for comment in fields.get('comment-host', ()):
285
e18aaec99e54 pvl.hosts-import: generate domain-sections
Tero Marttila <terom@paivola.fi>
parents: 281
diff changeset
   468
            yield u"# {comment}".format(comment=comment)
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   469
285
e18aaec99e54 pvl.hosts-import: generate domain-sections
Tero Marttila <terom@paivola.fi>
parents: 281
diff changeset
   470
        yield u"[[{host}]]".format(host=host)
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   471
        
285
e18aaec99e54 pvl.hosts-import: generate domain-sections
Tero Marttila <terom@paivola.fi>
parents: 281
diff changeset
   472
        for domain in fields.get('domain', ()) :
e18aaec99e54 pvl.hosts-import: generate domain-sections
Tero Marttila <terom@paivola.fi>
parents: 281
diff changeset
   473
            if domain != options.hosts_domain :
e18aaec99e54 pvl.hosts-import: generate domain-sections
Tero Marttila <terom@paivola.fi>
parents: 281
diff changeset
   474
                yield FMT.format(field='domain', value=domain)
e18aaec99e54 pvl.hosts-import: generate domain-sections
Tero Marttila <terom@paivola.fi>
parents: 281
diff changeset
   475
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   476
        for field, fmt in (
285
e18aaec99e54 pvl.hosts-import: generate domain-sections
Tero Marttila <terom@paivola.fi>
parents: 281
diff changeset
   477
                ('ip',              FMT),
e18aaec99e54 pvl.hosts-import: generate domain-sections
Tero Marttila <terom@paivola.fi>
parents: 281
diff changeset
   478
                ('ip6',             FMT),
e18aaec99e54 pvl.hosts-import: generate domain-sections
Tero Marttila <terom@paivola.fi>
parents: 281
diff changeset
   479
                ('ethernet',        FMT),
268
560ba0544254 pvl.hosts-import: ugly indexed foo.X keys for multi-value fields..
Tero Marttila <terom@paivola.fi>
parents: 266
diff changeset
   480
                ('owner',           u"\t{field:15} = {value} # {fields[comment-owner][0]}"),
285
e18aaec99e54 pvl.hosts-import: generate domain-sections
Tero Marttila <terom@paivola.fi>
parents: 281
diff changeset
   481
                ('alias',           FMT),
e18aaec99e54 pvl.hosts-import: generate domain-sections
Tero Marttila <terom@paivola.fi>
parents: 281
diff changeset
   482
                ('boot',            FMT),
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   483
        ) :
268
560ba0544254 pvl.hosts-import: ugly indexed foo.X keys for multi-value fields..
Tero Marttila <terom@paivola.fi>
parents: 266
diff changeset
   484
            values = fields.get(field, ())
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   485
268
560ba0544254 pvl.hosts-import: ugly indexed foo.X keys for multi-value fields..
Tero Marttila <terom@paivola.fi>
parents: 266
diff changeset
   486
            if len(values) > 1 :
560ba0544254 pvl.hosts-import: ugly indexed foo.X keys for multi-value fields..
Tero Marttila <terom@paivola.fi>
parents: 266
diff changeset
   487
                for index, value in enumerate(values, 1) :
285
e18aaec99e54 pvl.hosts-import: generate domain-sections
Tero Marttila <terom@paivola.fi>
parents: 281
diff changeset
   488
                    yield fmt.format(
268
560ba0544254 pvl.hosts-import: ugly indexed foo.X keys for multi-value fields..
Tero Marttila <terom@paivola.fi>
parents: 266
diff changeset
   489
                            field   = "{field}.{index}".format(field=field, index=index),
560ba0544254 pvl.hosts-import: ugly indexed foo.X keys for multi-value fields..
Tero Marttila <terom@paivola.fi>
parents: 266
diff changeset
   490
                            value   = value,
560ba0544254 pvl.hosts-import: ugly indexed foo.X keys for multi-value fields..
Tero Marttila <terom@paivola.fi>
parents: 266
diff changeset
   491
                            fields  = fields
560ba0544254 pvl.hosts-import: ugly indexed foo.X keys for multi-value fields..
Tero Marttila <terom@paivola.fi>
parents: 266
diff changeset
   492
                    )
560ba0544254 pvl.hosts-import: ugly indexed foo.X keys for multi-value fields..
Tero Marttila <terom@paivola.fi>
parents: 266
diff changeset
   493
            elif len(values) > 0 :
560ba0544254 pvl.hosts-import: ugly indexed foo.X keys for multi-value fields..
Tero Marttila <terom@paivola.fi>
parents: 266
diff changeset
   494
                value, = values
285
e18aaec99e54 pvl.hosts-import: generate domain-sections
Tero Marttila <terom@paivola.fi>
parents: 281
diff changeset
   495
                yield fmt.format(field=field, value=value, fields=fields)
e18aaec99e54 pvl.hosts-import: generate domain-sections
Tero Marttila <terom@paivola.fi>
parents: 281
diff changeset
   496
    
e18aaec99e54 pvl.hosts-import: generate domain-sections
Tero Marttila <terom@paivola.fi>
parents: 281
diff changeset
   497
        yield ""
e18aaec99e54 pvl.hosts-import: generate domain-sections
Tero Marttila <terom@paivola.fi>
parents: 281
diff changeset
   498
   
e18aaec99e54 pvl.hosts-import: generate domain-sections
Tero Marttila <terom@paivola.fi>
parents: 281
diff changeset
   499
def apply_hosts_export (options, hosts) :
e18aaec99e54 pvl.hosts-import: generate domain-sections
Tero Marttila <terom@paivola.fi>
parents: 281
diff changeset
   500
    """
e18aaec99e54 pvl.hosts-import: generate domain-sections
Tero Marttila <terom@paivola.fi>
parents: 281
diff changeset
   501
        Export hosts to file.
e18aaec99e54 pvl.hosts-import: generate domain-sections
Tero Marttila <terom@paivola.fi>
parents: 281
diff changeset
   502
    """
e18aaec99e54 pvl.hosts-import: generate domain-sections
Tero Marttila <terom@paivola.fi>
parents: 281
diff changeset
   503
e18aaec99e54 pvl.hosts-import: generate domain-sections
Tero Marttila <terom@paivola.fi>
parents: 281
diff changeset
   504
    file = pvl.args.apply_file(options.output_hosts, 'w', options.output_charset)
e18aaec99e54 pvl.hosts-import: generate domain-sections
Tero Marttila <terom@paivola.fi>
parents: 281
diff changeset
   505
e18aaec99e54 pvl.hosts-import: generate domain-sections
Tero Marttila <terom@paivola.fi>
parents: 281
diff changeset
   506
    for line in export_hosts(options, hosts) :
e18aaec99e54 pvl.hosts-import: generate domain-sections
Tero Marttila <terom@paivola.fi>
parents: 281
diff changeset
   507
        print >>file, line
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   508
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   509
def main (argv) :
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   510
    options, args = parse_options(argv)
261
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   511
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   512
    options.ldap = pvl.ldap.args.apply(options)
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   513
    
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   514
    if args :
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   515
        # direct from file
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   516
        hosts = pvl.args.apply_files(args, 'r', options.input_charset)
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   517
    else :
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   518
        # import
288
2f2f92e4c58e pvl.hosts-import: check_hosts: verify nonexistan aliases
Tero Marttila <terom@paivola.fi>
parents: 285
diff changeset
   519
        hosts = list(import_hosts(options))
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   520
   
288
2f2f92e4c58e pvl.hosts-import: check_hosts: verify nonexistan aliases
Tero Marttila <terom@paivola.fi>
parents: 285
diff changeset
   521
    # verify
2f2f92e4c58e pvl.hosts-import: check_hosts: verify nonexistan aliases
Tero Marttila <terom@paivola.fi>
parents: 285
diff changeset
   522
    check_hosts(options, hosts)
2f2f92e4c58e pvl.hosts-import: check_hosts: verify nonexistan aliases
Tero Marttila <terom@paivola.fi>
parents: 285
diff changeset
   523
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   524
    # output
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   525
    if options.output_hosts :
285
e18aaec99e54 pvl.hosts-import: generate domain-sections
Tero Marttila <terom@paivola.fi>
parents: 281
diff changeset
   526
        apply_hosts_export(options, hosts)
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   527
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   528
if __name__ == '__main__':
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   529
    pvl.args.main(main)