bin/pvl.hosts-import
author Tero Marttila <terom@paivola.fi>
Mon, 09 Mar 2015 23:31:13 +0200
changeset 738 3104fdf7ea26
parent 379 60ce05b30227
permissions -rwxr-xr-x
pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
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
313
c211ef65fd67 pvl.hosts-import: alias4 mapping
Tero Marttila <terom@paivola.fi>
parents: 311
diff changeset
    10
import pvl.hosts
261
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
    11
import pvl.ldap.args
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    12
302
f50469a1da4d pvl.hosts-import: importing zones with multiple domains
Tero Marttila <terom@paivola.fi>
parents: 301
diff changeset
    13
import collections
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
    14
import ipaddr
302
f50469a1da4d pvl.hosts-import: importing zones with multiple domains
Tero Marttila <terom@paivola.fi>
parents: 301
diff changeset
    15
import logging; log = logging.getLogger('pvl.hosts-import')
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
    16
import optparse
302
f50469a1da4d pvl.hosts-import: importing zones with multiple domains
Tero Marttila <terom@paivola.fi>
parents: 301
diff changeset
    17
import os.path
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    18
import re
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
__version__ = '0.1'
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
def parse_options (argv) :
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
        Parse command-line arguments.
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    25
    """
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    26
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    27
    parser = optparse.OptionParser(
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    28
            prog        = argv[0],
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    29
            usage       = '%prog: [options]',
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    30
            version     = __version__,
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    31
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    32
            # module docstring
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    33
            description = __doc__,
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    34
    )
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    35
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    36
    # logging
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    37
    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
    38
    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
    39
379
60ce05b30227 pvl.hosts-import: fix conflicting -c option
Tero Marttila <terom@fixme.fi>
parents: 328
diff changeset
    40
    parser.add_option('--input-charset',  metavar='CHARSET',  default='utf-8', 
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    41
            help="Encoding used for input files")
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    42
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    43
    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
    44
            help="Encoding used for output files")
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    45
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    46
    # input
301
b41902b0b9cf pvl.hosts-import: support multiple --import-zone/dhcp-hosts files, change --import-zone-comments-*, import TXT as comments
Tero Marttila <terom@paivola.fi>
parents: 288
diff changeset
    47
    parser.add_option('--import-zone-hosts',    metavar='FILE',     action='append',
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    48
            help="Load hosts from DNS zone")
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    49
302
f50469a1da4d pvl.hosts-import: importing zones with multiple domains
Tero Marttila <terom@paivola.fi>
parents: 301
diff changeset
    50
    parser.add_option('--import-zone-origin',   metavar='ORIGIN',
f50469a1da4d pvl.hosts-import: importing zones with multiple domains
Tero Marttila <terom@paivola.fi>
parents: 301
diff changeset
    51
            help="Initial origin for given zone file; default is basename")
280
8118854bfa6f pvl.hosts-import: import boot settings
Tero Marttila <terom@paivola.fi>
parents: 279
diff changeset
    52
301
b41902b0b9cf pvl.hosts-import: support multiple --import-zone/dhcp-hosts files, change --import-zone-comments-*, import TXT as comments
Tero Marttila <terom@paivola.fi>
parents: 288
diff changeset
    53
    parser.add_option('--import-zone-comments-owner',  action='store_const',
b41902b0b9cf pvl.hosts-import: support multiple --import-zone/dhcp-hosts files, change --import-zone-comments-*, import TXT as comments
Tero Marttila <terom@paivola.fi>
parents: 288
diff changeset
    54
            dest='import_zone_comments', const='owner',
275
4dc5cc30a278 pvl.hosts-import: support AAAA, make default comment handling an option
Tero Marttila <terom@paivola.fi>
parents: 268
diff changeset
    55
            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
    56
301
b41902b0b9cf pvl.hosts-import: support multiple --import-zone/dhcp-hosts files, change --import-zone-comments-*, import TXT as comments
Tero Marttila <terom@paivola.fi>
parents: 288
diff changeset
    57
    parser.add_option('--import-zone-comments-host',   action='store_const',
b41902b0b9cf pvl.hosts-import: support multiple --import-zone/dhcp-hosts files, change --import-zone-comments-*, import TXT as comments
Tero Marttila <terom@paivola.fi>
parents: 288
diff changeset
    58
            dest='import_zone_comments', const='host',
275
4dc5cc30a278 pvl.hosts-import: support AAAA, make default comment handling an option
Tero Marttila <terom@paivola.fi>
parents: 268
diff changeset
    59
            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
    60
302
f50469a1da4d pvl.hosts-import: importing zones with multiple domains
Tero Marttila <terom@paivola.fi>
parents: 301
diff changeset
    61
    parser.add_option('--import-dhcp-hosts',    metavar='FILE',     action='append',
f50469a1da4d pvl.hosts-import: importing zones with multiple domains
Tero Marttila <terom@paivola.fi>
parents: 301
diff changeset
    62
            help="Load hosts from DHCP config")
f50469a1da4d pvl.hosts-import: importing zones with multiple domains
Tero Marttila <terom@paivola.fi>
parents: 301
diff changeset
    63
f50469a1da4d pvl.hosts-import: importing zones with multiple domains
Tero Marttila <terom@paivola.fi>
parents: 301
diff changeset
    64
    parser.add_option('--import-dhcp-boot-server',      metavar='NEXT-SERVER',
f50469a1da4d pvl.hosts-import: importing zones with multiple domains
Tero Marttila <terom@paivola.fi>
parents: 301
diff changeset
    65
            help="Default boot_server for dpc hosts")
f50469a1da4d pvl.hosts-import: importing zones with multiple domains
Tero Marttila <terom@paivola.fi>
parents: 301
diff changeset
    66
f50469a1da4d pvl.hosts-import: importing zones with multiple domains
Tero Marttila <terom@paivola.fi>
parents: 301
diff changeset
    67
261
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
    68
    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
    69
            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
    70
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    71
    # defaults
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    72
    parser.add_option('--zone-unused',          metavar='HOST',
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    73
            help="DNS name for unallocated hosts")
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    74
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    75
    # output
311
0e79917de9f7 pvl.hosts-import: default --output-hosts to stdout
Tero Marttila <terom@paivola.fi>
parents: 309
diff changeset
    76
    parser.add_option('--output-hosts',         metavar='FILE',         default='-',
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    77
            help="Output hosts file")
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    78
265
5f2807999222 pvl.dns-hosts: always sort by ip
Tero Marttila <terom@paivola.fi>
parents: 264
diff changeset
    79
    parser.add_option('--output-prefix',        metavar='PREFIX',
5f2807999222 pvl.dns-hosts: always sort by ip
Tero Marttila <terom@paivola.fi>
parents: 264
diff changeset
    80
            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
    81
304
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
    82
    parser.add_option('--output-domain',        metavar='DOMAIN',
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
    83
            help="Select hosts by domain")
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
    84
327
9d7d40206a74 pvl.hosts-import: add --output-others
Tero Marttila <terom@paivola.fi>
parents: 326
diff changeset
    85
    parser.add_option('--output-others',        action='store_true',
9d7d40206a74 pvl.hosts-import: add --output-others
Tero Marttila <terom@paivola.fi>
parents: 326
diff changeset
    86
            help="Negate selection")
9d7d40206a74 pvl.hosts-import: add --output-others
Tero Marttila <terom@paivola.fi>
parents: 326
diff changeset
    87
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    88
    # defaults
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    89
    parser.set_defaults(
301
b41902b0b9cf pvl.hosts-import: support multiple --import-zone/dhcp-hosts files, change --import-zone-comments-*, import TXT as comments
Tero Marttila <terom@paivola.fi>
parents: 288
diff changeset
    90
        import_zone_hosts   = [],
b41902b0b9cf pvl.hosts-import: support multiple --import-zone/dhcp-hosts files, change --import-zone-comments-*, import TXT as comments
Tero Marttila <terom@paivola.fi>
parents: 288
diff changeset
    91
        import_dhcp_hosts   = [],
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    92
    )
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
    # parse
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    95
    options, args = parser.parse_args(argv[1:])
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    96
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    97
    # apply
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    98
    pvl.args.apply(options, argv[0])
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    99
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   100
    return options, args
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   101
302
f50469a1da4d pvl.hosts-import: importing zones with multiple domains
Tero Marttila <terom@paivola.fi>
parents: 301
diff changeset
   102
def import_zone_host_name (options, name, origin) :
f50469a1da4d pvl.hosts-import: importing zones with multiple domains
Tero Marttila <terom@paivola.fi>
parents: 301
diff changeset
   103
    """
f50469a1da4d pvl.hosts-import: importing zones with multiple domains
Tero Marttila <terom@paivola.fi>
parents: 301
diff changeset
   104
        Import zone name from rr
f50469a1da4d pvl.hosts-import: importing zones with multiple domains
Tero Marttila <terom@paivola.fi>
parents: 301
diff changeset
   105
    """
f50469a1da4d pvl.hosts-import: importing zones with multiple domains
Tero Marttila <terom@paivola.fi>
parents: 301
diff changeset
   106
f50469a1da4d pvl.hosts-import: importing zones with multiple domains
Tero Marttila <terom@paivola.fi>
parents: 301
diff changeset
   107
    if '.' in name :
f50469a1da4d pvl.hosts-import: importing zones with multiple domains
Tero Marttila <terom@paivola.fi>
parents: 301
diff changeset
   108
        host, domain = name.split('.', 1)
309
2b8ba955afac pvl.dns: import join() within package
Tero Marttila <terom@paivola.fi>
parents: 304
diff changeset
   109
        domain = pvl.dns.join(domain, origin)
302
f50469a1da4d pvl.hosts-import: importing zones with multiple domains
Tero Marttila <terom@paivola.fi>
parents: 301
diff changeset
   110
    else :
f50469a1da4d pvl.hosts-import: importing zones with multiple domains
Tero Marttila <terom@paivola.fi>
parents: 301
diff changeset
   111
        host = name
f50469a1da4d pvl.hosts-import: importing zones with multiple domains
Tero Marttila <terom@paivola.fi>
parents: 301
diff changeset
   112
        domain = origin
f50469a1da4d pvl.hosts-import: importing zones with multiple domains
Tero Marttila <terom@paivola.fi>
parents: 301
diff changeset
   113
            
f50469a1da4d pvl.hosts-import: importing zones with multiple domains
Tero Marttila <terom@paivola.fi>
parents: 301
diff changeset
   114
    if domain :
f50469a1da4d pvl.hosts-import: importing zones with multiple domains
Tero Marttila <terom@paivola.fi>
parents: 301
diff changeset
   115
        # not a fqdn
f50469a1da4d pvl.hosts-import: importing zones with multiple domains
Tero Marttila <terom@paivola.fi>
parents: 301
diff changeset
   116
        domain = domain.rstrip('.')
f50469a1da4d pvl.hosts-import: importing zones with multiple domains
Tero Marttila <terom@paivola.fi>
parents: 301
diff changeset
   117
f50469a1da4d pvl.hosts-import: importing zones with multiple domains
Tero Marttila <terom@paivola.fi>
parents: 301
diff changeset
   118
        log.info("%s: %s@%s", name, host, domain)
f50469a1da4d pvl.hosts-import: importing zones with multiple domains
Tero Marttila <terom@paivola.fi>
parents: 301
diff changeset
   119
    else :
f50469a1da4d pvl.hosts-import: importing zones with multiple domains
Tero Marttila <terom@paivola.fi>
parents: 301
diff changeset
   120
        log.warn("%s: no domain", name)
f50469a1da4d pvl.hosts-import: importing zones with multiple domains
Tero Marttila <terom@paivola.fi>
parents: 301
diff changeset
   121
f50469a1da4d pvl.hosts-import: importing zones with multiple domains
Tero Marttila <terom@paivola.fi>
parents: 301
diff changeset
   122
    return host, domain
f50469a1da4d pvl.hosts-import: importing zones with multiple domains
Tero Marttila <terom@paivola.fi>
parents: 301
diff changeset
   123
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   124
def import_zone_hosts (options, file) :
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   125
    """
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   126
        Yield host info from zonefile records.
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   127
    """
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   128
302
f50469a1da4d pvl.hosts-import: importing zones with multiple domains
Tero Marttila <terom@paivola.fi>
parents: 301
diff changeset
   129
    origin = options.import_zone_origin or os.path.basename(file.name)
f50469a1da4d pvl.hosts-import: importing zones with multiple domains
Tero Marttila <terom@paivola.fi>
parents: 301
diff changeset
   130
318
304f56896942 pvl.hosts-import: import $GENERATE ips for hosts also in dhcp
Tero Marttila <terom@paivola.fi>
parents: 315
diff changeset
   131
    for line, rr in pvl.dns.zone.ZoneLine.load(file,
302
f50469a1da4d pvl.hosts-import: importing zones with multiple domains
Tero Marttila <terom@paivola.fi>
parents: 301
diff changeset
   132
            # used to determine domain
f50469a1da4d pvl.hosts-import: importing zones with multiple domains
Tero Marttila <terom@paivola.fi>
parents: 301
diff changeset
   133
            origin          = origin,
f50469a1da4d pvl.hosts-import: importing zones with multiple domains
Tero Marttila <terom@paivola.fi>
parents: 301
diff changeset
   134
318
304f56896942 pvl.hosts-import: import $GENERATE ips for hosts also in dhcp
Tero Marttila <terom@paivola.fi>
parents: 315
diff changeset
   135
            # lazy-import generated hosts on demand
304f56896942 pvl.hosts-import: import $GENERATE ips for hosts also in dhcp
Tero Marttila <terom@paivola.fi>
parents: 315
diff changeset
   136
            expand_generate = True,
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
   137
    ) :
319
f56f60c2dd9b pvl.hosts-import: do not warn on $ORIGIN lines
Tero Marttila <terom@paivola.fi>
parents: 318
diff changeset
   138
        if rr :
f56f60c2dd9b pvl.hosts-import: do not warn on $ORIGIN lines
Tero Marttila <terom@paivola.fi>
parents: 318
diff changeset
   139
            pass
f56f60c2dd9b pvl.hosts-import: do not warn on $ORIGIN lines
Tero Marttila <terom@paivola.fi>
parents: 318
diff changeset
   140
        elif line.parts[0] == '$ORIGIN' :
f56f60c2dd9b pvl.hosts-import: do not warn on $ORIGIN lines
Tero Marttila <terom@paivola.fi>
parents: 318
diff changeset
   141
            # handled by ZoneLine.load
f56f60c2dd9b pvl.hosts-import: do not warn on $ORIGIN lines
Tero Marttila <terom@paivola.fi>
parents: 318
diff changeset
   142
            continue
f56f60c2dd9b pvl.hosts-import: do not warn on $ORIGIN lines
Tero Marttila <terom@paivola.fi>
parents: 318
diff changeset
   143
        else :
318
304f56896942 pvl.hosts-import: import $GENERATE ips for hosts also in dhcp
Tero Marttila <terom@paivola.fi>
parents: 315
diff changeset
   144
            log.warn("%s: skip non-rr line: %s", line, line.line)
304f56896942 pvl.hosts-import: import $GENERATE ips for hosts also in dhcp
Tero Marttila <terom@paivola.fi>
parents: 315
diff changeset
   145
            continue
304f56896942 pvl.hosts-import: import $GENERATE ips for hosts also in dhcp
Tero Marttila <terom@paivola.fi>
parents: 315
diff changeset
   146
302
f50469a1da4d pvl.hosts-import: importing zones with multiple domains
Tero Marttila <terom@paivola.fi>
parents: 301
diff changeset
   147
        host, domain = import_zone_host_name(options, rr.name, rr.origin)
f50469a1da4d pvl.hosts-import: importing zones with multiple domains
Tero Marttila <terom@paivola.fi>
parents: 301
diff changeset
   148
328
9b4ee4bad3d1 pvl.hosts-import: also import --zone-unused=ufc hosts, and output them as special comments
Tero Marttila <terom@paivola.fi>
parents: 327
diff changeset
   149
        if rr.type in ('A', 'AAAA') :
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   150
            ip, = rr.data
328
9b4ee4bad3d1 pvl.hosts-import: also import --zone-unused=ufc hosts, and output them as special comments
Tero Marttila <terom@paivola.fi>
parents: 327
diff changeset
   151
            ip = ipaddr.IPAddress(ip)
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   152
281
b236f689ba22 pvl.hosts-import: separate ip6 field
Tero Marttila <terom@paivola.fi>
parents: 280
diff changeset
   153
            type = { 'A': 'ip', 'AAAA': 'ip6' }[rr.type]
b236f689ba22 pvl.hosts-import: separate ip6 field
Tero Marttila <terom@paivola.fi>
parents: 280
diff changeset
   154
328
9b4ee4bad3d1 pvl.hosts-import: also import --zone-unused=ufc hosts, and output them as special comments
Tero Marttila <terom@paivola.fi>
parents: 327
diff changeset
   155
            if options.zone_unused and rr.name == options.zone_unused :
9b4ee4bad3d1 pvl.hosts-import: also import --zone-unused=ufc hosts, and output them as special comments
Tero Marttila <terom@paivola.fi>
parents: 327
diff changeset
   156
                yield (str(ip), domain), 'ip.unused', ip
9b4ee4bad3d1 pvl.hosts-import: also import --zone-unused=ufc hosts, and output them as special comments
Tero Marttila <terom@paivola.fi>
parents: 327
diff changeset
   157
            else :
9b4ee4bad3d1 pvl.hosts-import: also import --zone-unused=ufc hosts, and output them as special comments
Tero Marttila <terom@paivola.fi>
parents: 327
diff changeset
   158
                yield (host, domain), type, ip,
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   159
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   160
            if rr.comment :
304
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   161
                yield (host, domain), 'comment', rr.comment
275
4dc5cc30a278 pvl.hosts-import: support AAAA, make default comment handling an option
Tero Marttila <terom@paivola.fi>
parents: 268
diff changeset
   162
318
304f56896942 pvl.hosts-import: import $GENERATE ips for hosts also in dhcp
Tero Marttila <terom@paivola.fi>
parents: 315
diff changeset
   163
            if line.parts[0] == '$GENERATE' :
304f56896942 pvl.hosts-import: import $GENERATE ips for hosts also in dhcp
Tero Marttila <terom@paivola.fi>
parents: 315
diff changeset
   164
                # only import as host if used for other purposes as well
304f56896942 pvl.hosts-import: import $GENERATE ips for hosts also in dhcp
Tero Marttila <terom@paivola.fi>
parents: 315
diff changeset
   165
                yield (host, domain), 'lazy-import', True
304f56896942 pvl.hosts-import: import $GENERATE ips for hosts also in dhcp
Tero Marttila <terom@paivola.fi>
parents: 315
diff changeset
   166
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   167
        elif rr.type == 'CNAME' :
302
f50469a1da4d pvl.hosts-import: importing zones with multiple domains
Tero Marttila <terom@paivola.fi>
parents: 301
diff changeset
   168
            alias, = rr.data
f50469a1da4d pvl.hosts-import: importing zones with multiple domains
Tero Marttila <terom@paivola.fi>
parents: 301
diff changeset
   169
            alias_host, alias_domain = import_zone_host_name(options, alias, rr.origin)
f50469a1da4d pvl.hosts-import: importing zones with multiple domains
Tero Marttila <terom@paivola.fi>
parents: 301
diff changeset
   170
            
f50469a1da4d pvl.hosts-import: importing zones with multiple domains
Tero Marttila <terom@paivola.fi>
parents: 301
diff changeset
   171
            if domain == alias_domain :
304
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   172
                yield (alias_host, alias_domain), 'alias', host
325
9be2b216e87c change host alias to always be host-domain relative
Tero Marttila <terom@paivola.fi>
parents: 320
diff changeset
   173
            elif domain.endswith('.' + alias_domain) :
9be2b216e87c change host alias to always be host-domain relative
Tero Marttila <terom@paivola.fi>
parents: 320
diff changeset
   174
                yield (alias_host, alias_domain), 'alias', pvl.dns.join(host, domain[:(len(domain) - len(alias_domain) - 1)])
302
f50469a1da4d pvl.hosts-import: importing zones with multiple domains
Tero Marttila <terom@paivola.fi>
parents: 301
diff changeset
   175
            else :
325
9be2b216e87c change host alias to always be host-domain relative
Tero Marttila <terom@paivola.fi>
parents: 320
diff changeset
   176
                log.warn("%s@%s: alias outside of target domain: %s", host, domain, alias_domain)
301
b41902b0b9cf pvl.hosts-import: support multiple --import-zone/dhcp-hosts files, change --import-zone-comments-*, import TXT as comments
Tero Marttila <terom@paivola.fi>
parents: 288
diff changeset
   177
        
b41902b0b9cf pvl.hosts-import: support multiple --import-zone/dhcp-hosts files, change --import-zone-comments-*, import TXT as comments
Tero Marttila <terom@paivola.fi>
parents: 288
diff changeset
   178
        elif rr.type == 'TXT' :
b41902b0b9cf pvl.hosts-import: support multiple --import-zone/dhcp-hosts files, change --import-zone-comments-*, import TXT as comments
Tero Marttila <terom@paivola.fi>
parents: 288
diff changeset
   179
            txt, = rr.data
b41902b0b9cf pvl.hosts-import: support multiple --import-zone/dhcp-hosts files, change --import-zone-comments-*, import TXT as comments
Tero Marttila <terom@paivola.fi>
parents: 288
diff changeset
   180
304
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   181
            yield (host, domain), 'comment', txt
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   182
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   183
        else :
302
f50469a1da4d pvl.hosts-import: importing zones with multiple domains
Tero Marttila <terom@paivola.fi>
parents: 301
diff changeset
   184
            log.warn("%s: unknown rr: %s", host, rr)
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   185
304
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   186
def import_dhcp_host (options, dhcp_host, items) :
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   187
    """
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   188
        Yield host infos from a dhcp host ... { ... }
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
304
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   191
    host_name = None
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   192
    ethernet = []
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   193
    fixed_address = None
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   194
280
8118854bfa6f pvl.hosts-import: import boot settings
Tero Marttila <terom@paivola.fi>
parents: 279
diff changeset
   195
    boot_server = options.import_dhcp_boot_server
8118854bfa6f pvl.hosts-import: import boot settings
Tero Marttila <terom@paivola.fi>
parents: 279
diff changeset
   196
    boot_filename = None
8118854bfa6f pvl.hosts-import: import boot settings
Tero Marttila <terom@paivola.fi>
parents: 279
diff changeset
   197
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   198
    for item in items :
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   199
        item, args = item[0], item[1:]
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   200
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   201
        if item == 'hardware' :
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   202
            _ethernet, ethernet = args
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   203
            assert _ethernet == 'ethernet'
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   204
        elif item == 'fixed-address' :
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   205
            fixed_address, = args
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   206
        elif item == 'option' :
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   207
            option = args.pop(0)
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   208
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   209
            if option == 'host-name' :
304
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   210
                host_name, = args
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   211
            else :
304
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   212
                log.warn("host %s: ignore unknown option: %s", dhcp_host, option)
280
8118854bfa6f pvl.hosts-import: import boot settings
Tero Marttila <terom@paivola.fi>
parents: 279
diff changeset
   213
        elif item == 'next-sever' :
8118854bfa6f pvl.hosts-import: import boot settings
Tero Marttila <terom@paivola.fi>
parents: 279
diff changeset
   214
            boot_server, = args
8118854bfa6f pvl.hosts-import: import boot settings
Tero Marttila <terom@paivola.fi>
parents: 279
diff changeset
   215
        elif item == 'filename' :
8118854bfa6f pvl.hosts-import: import boot settings
Tero Marttila <terom@paivola.fi>
parents: 279
diff changeset
   216
            boot_filename, = args
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   217
        else :
304
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   218
            log.warn("host %s: ignore unknown item: %s", dhcp_host, item)
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   219
304
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   220
    # determine host
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   221
    host = None
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   222
    domain = None
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   223
    suffix = None
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   224
    
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   225
    if not fixed_address :
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   226
        log.warn("%s: fixed-address is missing, unable to determine hostname/domainname", dhcp_host)
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   227
    elif re.match(r'\d+\.\d+\.\d+.\d+', fixed_address) :
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   228
        log.warn("%s: fixed-address is an IP, unable to determine hostname/domainname", dhcp_host)
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   229
    else :
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   230
        host, domain = fixed_address.split('.', 1)
264
ce29be46f705 add unknown owners as a comment..
Tero Marttila <terom@paivola.fi>
parents: 263
diff changeset
   231
304
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   232
    # XXX: not actually true... eh
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   233
    if host and dhcp_host.lower() == host.lower() :
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   234
        # do not split suffix from host
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   235
        pass
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   236
    elif host and '-' in dhcp_host :
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   237
        dhcp_host, suffix = dhcp_host.rsplit('-', 1)
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   238
    elif '-' in dhcp_host :
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   239
        host, suffix = dhcp_host.rsplit('-', 1)
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   240
    else :
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   241
        host = dhcp_host
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   242
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   243
    if not (host or ethernet) :
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   244
        log.warn("%s: no hostname/ethernet: %s/%s", dhcp_host, hostname, ethernet)
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   245
    elif suffix :
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   246
        log.info("%s: %s@%s: %s: %s", dhcp_host, host, domain, suffix, ethernet)
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   247
        yield (host, domain), 'ethernet.{suffix}'.format(suffix=suffix), ethernet
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   248
    else :
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   249
        log.info("%s: %s@%s: %s", dhcp_host, host, domain, ethernet)
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   250
        yield (host, domain), 'ethernet', ethernet
280
8118854bfa6f pvl.hosts-import: import boot settings
Tero Marttila <terom@paivola.fi>
parents: 279
diff changeset
   251
8118854bfa6f pvl.hosts-import: import boot settings
Tero Marttila <terom@paivola.fi>
parents: 279
diff changeset
   252
    if boot_server and boot_filename :
304
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   253
        yield (host, domain), 'boot', "{server}:{filename}".format(
280
8118854bfa6f pvl.hosts-import: import boot settings
Tero Marttila <terom@paivola.fi>
parents: 279
diff changeset
   254
                server      = boot_server,
8118854bfa6f pvl.hosts-import: import boot settings
Tero Marttila <terom@paivola.fi>
parents: 279
diff changeset
   255
                filename    = boot_filename,
8118854bfa6f pvl.hosts-import: import boot settings
Tero Marttila <terom@paivola.fi>
parents: 279
diff changeset
   256
        )
8118854bfa6f pvl.hosts-import: import boot settings
Tero Marttila <terom@paivola.fi>
parents: 279
diff changeset
   257
    elif boot_filename :
304
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   258
        yield (host, domain), 'boot', "{filename}".format(filename=boot_filename)
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   259
303
b8ba5df799be pvl.hosts-import: log dhcp conf paths
Tero Marttila <terom@paivola.fi>
parents: 302
diff changeset
   260
def import_dhcp_hosts (options, file_name, blocks) :
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   261
    """
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   262
        Process hosts from a parsed block
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   263
    """
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   264
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   265
    for block, items, blocks in blocks :
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   266
        
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   267
        block, args = block[0], block[1:]
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   268
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   269
        if block == 'group' :
303
b8ba5df799be pvl.hosts-import: log dhcp conf paths
Tero Marttila <terom@paivola.fi>
parents: 302
diff changeset
   270
            log.info("%s: group", file_name)
b8ba5df799be pvl.hosts-import: log dhcp conf paths
Tero Marttila <terom@paivola.fi>
parents: 302
diff changeset
   271
            for info in import_dhcp_hosts(options, file_name, blocks) :
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   272
                yield info
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   273
        elif block == 'host' :
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   274
            host, = args
301
b41902b0b9cf pvl.hosts-import: support multiple --import-zone/dhcp-hosts files, change --import-zone-comments-*, import TXT as comments
Tero Marttila <terom@paivola.fi>
parents: 288
diff changeset
   275
            
303
b8ba5df799be pvl.hosts-import: log dhcp conf paths
Tero Marttila <terom@paivola.fi>
parents: 302
diff changeset
   276
            log.info("%s: host: %s", file_name, host)
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   277
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   278
            try :
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   279
                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
   280
                    yield info
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   281
            except ValueError as error :
303
b8ba5df799be pvl.hosts-import: log dhcp conf paths
Tero Marttila <terom@paivola.fi>
parents: 302
diff changeset
   282
                log.exception("%s: invalid host %s: %s", file_name, host, error)
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   283
        else:
303
b8ba5df799be pvl.hosts-import: log dhcp conf paths
Tero Marttila <terom@paivola.fi>
parents: 302
diff changeset
   284
            log.warn("%s: ignore unknown block: %s", file_name, block)
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   285
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   286
def import_dhcp_conf (options, file) :
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   287
    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
   288
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   289
    for item in items :
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   290
        item, args = item[0], item[1:]
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   291
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   292
        if item == 'include' :
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   293
            include, = args
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   294
            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
   295
                yield info
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   296
        else :
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   297
            log.warn("ignore unknown item: %s", item)
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   298
    
303
b8ba5df799be pvl.hosts-import: log dhcp conf paths
Tero Marttila <terom@paivola.fi>
parents: 302
diff changeset
   299
    for info in import_dhcp_hosts(options, file.name, blocks) :
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   300
        yield info
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   301
260
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   302
ZONE_COMMENTS = (
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   303
        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
   304
        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
   305
        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
   306
        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
   307
)
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   308
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   309
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
   310
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   311
def process_zone_comment (options, hostname, comment) :
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   312
    """
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   313
        Attempt to parse a host comment field... :D
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   314
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   315
        Yields (field, value) bits
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   316
    """
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   317
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   318
    for regex in ZONE_COMMENTS :
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   319
        match = regex.match(comment)
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   320
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   321
        if match :
275
4dc5cc30a278 pvl.hosts-import: support AAAA, make default comment handling an option
Tero Marttila <terom@paivola.fi>
parents: 268
diff changeset
   322
            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
   323
1b72f1e0cdbe pvl.hosts-import: do not import $GENERATE hosts; fix warnings on missing owner comments
Tero Marttila <terom@paivola.fi>
parents: 275
diff changeset
   324
            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
   325
            break
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   326
    else :
301
b41902b0b9cf pvl.hosts-import: support multiple --import-zone/dhcp-hosts files, change --import-zone-comments-*, import TXT as comments
Tero Marttila <terom@paivola.fi>
parents: 288
diff changeset
   327
        if options.import_zone_comments :
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
   328
            log.info("%s: default comment: %s", hostname, comment)
301
b41902b0b9cf pvl.hosts-import: support multiple --import-zone/dhcp-hosts files, change --import-zone-comments-*, import TXT as comments
Tero Marttila <terom@paivola.fi>
parents: 288
diff changeset
   329
            matches = { options.import_zone_comments: comment }
275
4dc5cc30a278 pvl.hosts-import: support AAAA, make default comment handling an option
Tero Marttila <terom@paivola.fi>
parents: 268
diff changeset
   330
        else :
4dc5cc30a278 pvl.hosts-import: support AAAA, make default comment handling an option
Tero Marttila <terom@paivola.fi>
parents: 268
diff changeset
   331
            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
   332
            return
260
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   333
    
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   334
    owner = matches.pop('owner', None)
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   335
    
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   336
    if owner :
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   337
        mail_match = ZONE_OWNER_MAIL.match(owner)
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   338
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   339
        if mail_match :
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   340
            mail_matches = mail_match.groupdict()
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   341
            
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   342
            owner = mail_matches['owner']
261
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   343
            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
   344
    
4dc5cc30a278 pvl.hosts-import: support AAAA, make default comment handling an option
Tero Marttila <terom@paivola.fi>
parents: 268
diff changeset
   345
        yield 'owner', owner.strip()
260
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   346
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   347
    for field, value in matches.iteritems() :
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   348
        if value :
261
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   349
            yield field, value.strip()
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   350
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   351
NONE_OWNERS = set((
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   352
    u'tech',
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   353
    u'atk',
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   354
    u'toimisto',
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   355
))
261
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   356
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   357
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
   358
    """
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   359
        Yield guesses for user from LDAP.
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   360
    """
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   361
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   362
    if info.get('mail') :
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   363
        for user in options.ldap.users.filter(
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   364
                { 'mailLocalAddress': info['mail'] },
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   365
                { 'uid': info['mail'] },
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   366
        ) :
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   367
            yield user, None
261
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   368
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   369
    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
   370
        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
   371
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   372
        for group in groups :
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   373
            for user in options.ldap.users.filter({
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   374
                'gidNumber': group['gidNumber'],
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   375
                'cn': info['owner'],
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   376
            }) :
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   377
                yield user, group
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 info.get('owner') :
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   380
            for user in options.ldap.users.filter({
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   381
                'cn': info['owner'],
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   382
            }) :
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   383
                yield user, None
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   384
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   385
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
   386
    """
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   387
        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
   388
    """
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   389
275
4dc5cc30a278 pvl.hosts-import: support AAAA, make default comment handling an option
Tero Marttila <terom@paivola.fi>
parents: 268
diff changeset
   390
    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
   391
4dc5cc30a278 pvl.hosts-import: support AAAA, make default comment handling an option
Tero Marttila <terom@paivola.fi>
parents: 268
diff changeset
   392
    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
   393
        return False
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   394
    
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   395
    # from ldap?
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   396
    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
   397
        user, group = ldap
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   398
        
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   399
        if not group :
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   400
            # get group from ldap
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   401
            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
   402
        
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   403
        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
   404
                user    = user.getunicode('cn'),
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   405
                group   = group.getunicode('cn'),
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   406
        )
261
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   407
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   408
def process_host_comments (options, host, info) :
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   409
    """
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   410
        Process host fields from comment.
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   411
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   412
        Attempts to find owner from LDAP..
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   413
    """
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   414
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   415
    log.debug("%s: %s", host, info)
260
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   416
    
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   417
    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
   418
264
ce29be46f705 add unknown owners as a comment..
Tero Marttila <terom@paivola.fi>
parents: 263
diff changeset
   419
    if owner is False :
ce29be46f705 add unknown owners as a comment..
Tero Marttila <terom@paivola.fi>
parents: 263
diff changeset
   420
        # do not mark any owner
ce29be46f705 add unknown owners as a comment..
Tero Marttila <terom@paivola.fi>
parents: 263
diff changeset
   421
        pass
ce29be46f705 add unknown owners as a comment..
Tero Marttila <terom@paivola.fi>
parents: 263
diff changeset
   422
ce29be46f705 add unknown owners as a comment..
Tero Marttila <terom@paivola.fi>
parents: 263
diff changeset
   423
    elif owner :
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   424
        owner, comment = owner
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   425
        
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   426
        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
   427
        
304
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   428
        yield 'comment.owner', comment
261
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   429
        yield 'owner', owner,
264
ce29be46f705 add unknown owners as a comment..
Tero Marttila <terom@paivola.fi>
parents: 263
diff changeset
   430
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
   431
    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
   432
        log.warn("%s: unknown owner: %s", host, info)
304
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   433
        yield 'comment.owner', "{group} / {owner}".format(
264
ce29be46f705 add unknown owners as a comment..
Tero Marttila <terom@paivola.fi>
parents: 263
diff changeset
   434
                group   = info.get('group', ''),
ce29be46f705 add unknown owners as a comment..
Tero Marttila <terom@paivola.fi>
parents: 263
diff changeset
   435
                owner   = info.get('owner', ''),
ce29be46f705 add unknown owners as a comment..
Tero Marttila <terom@paivola.fi>
parents: 263
diff changeset
   436
        )
262
36c980a6d04a pvl.dns-host: add host comment
Tero Marttila <terom@paivola.fi>
parents: 261
diff changeset
   437
    
36c980a6d04a pvl.dns-host: add host comment
Tero Marttila <terom@paivola.fi>
parents: 261
diff changeset
   438
    if info.get('host') :
304
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   439
        yield 'comment.host', info['host']
260
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   440
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   441
def process_hosts_comments (options, import_hosts) :
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   442
    """
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   443
        Parse out comments from host imports..
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   444
    """
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   445
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   446
    for host, field, value in import_hosts :
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   447
        if field != 'comment':
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   448
            yield host, field, value
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   449
            continue
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   450
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   451
        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
   452
        
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   453
        if options.dump_host_comments :
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   454
            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
   455
                    host        = host,
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   456
                    comment     = value,
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   457
                    group       = fields.get('group', ''),
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   458
                    owner       = fields.get('owner', ''),
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   459
                    mail        = fields.get('mail', ''),
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   460
                    hostinfo    = fields.get('host', ''),
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   461
            ).encode('utf-8')
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   462
        
260
e58baab6b4cd pvl.dns-hosts: process_hosts_comments
Tero Marttila <terom@paivola.fi>
parents: 259
diff changeset
   463
261
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   464
        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
   465
            yield host, field, value
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   466
304
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   467
def import_hosts_files (options, zone_files, dhcp_files) :
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   468
    """
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   469
        Import host infos from given files.
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   470
    """
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   471
304
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   472
    for zone_file in zone_files:
301
b41902b0b9cf pvl.hosts-import: support multiple --import-zone/dhcp-hosts files, change --import-zone-comments-*, import TXT as comments
Tero Marttila <terom@paivola.fi>
parents: 288
diff changeset
   473
        file = pvl.args.apply_file(zone_file, 'r', options.input_charset)
b41902b0b9cf pvl.hosts-import: support multiple --import-zone/dhcp-hosts files, change --import-zone-comments-*, import TXT as comments
Tero Marttila <terom@paivola.fi>
parents: 288
diff changeset
   474
        for info in import_zone_hosts(options, file) :
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   475
            yield info
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   476
    
304
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   477
    for dhcp_file in dhcp_files :
301
b41902b0b9cf pvl.hosts-import: support multiple --import-zone/dhcp-hosts files, change --import-zone-comments-*, import TXT as comments
Tero Marttila <terom@paivola.fi>
parents: 288
diff changeset
   478
        file = pvl.args.apply_file(dhcp_file, 'r', options.input_charset)
b41902b0b9cf pvl.hosts-import: support multiple --import-zone/dhcp-hosts files, change --import-zone-comments-*, import TXT as comments
Tero Marttila <terom@paivola.fi>
parents: 288
diff changeset
   479
        for info in import_dhcp_conf(options, file) :
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   480
            yield info
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   481
       
304
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   482
def process_import_hosts (options, import_hosts) :
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   483
    """
304
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   484
        Build hosts from imported fields.
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   485
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   486
        Yields (domain, host), { (field, ...): value }
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   487
    """
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   488
    
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   489
    # gather
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   490
    hosts = collections.defaultdict(lambda: collections.defaultdict(list))
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   491
304
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   492
    for (host, domain), field, value in import_hosts :
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   493
        hosts[domain, host][tuple(field.split('.'))].append(value)
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   494
    
304
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   495
    # process
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   496
    for (domain, host), fields in hosts.iteritems() :
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   497
        SINGLE_FIELDS = (
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   498
                'ip',
328
9b4ee4bad3d1 pvl.hosts-import: also import --zone-unused=ufc hosts, and output them as special comments
Tero Marttila <terom@paivola.fi>
parents: 327
diff changeset
   499
                'ip.unused',
304
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   500
                'ip6',
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   501
                'comment.owner',
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   502
                'owner',
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   503
                'boot',
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   504
        )
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   505
        MULTI_FIELDS = (
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   506
                'comment.host',
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   507
                'ethernet',
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   508
                'alias',
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   509
        ) 
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   510
        host_fields = {}
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   511
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   512
        for field_name in SINGLE_FIELDS :
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   513
            field = tuple(field_name.split('.'))
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   514
            values = fields.get(field)
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   515
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   516
            if not values :
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   517
                continue
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   518
            elif len(values) == 1 :
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   519
                value, = values
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   520
            else :
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   521
                log.error("%s@%s: multiple %s: %s", host, domain, field, values)
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   522
                value = values[0]
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   523
            
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   524
            log.debug("%s@%s: %s: %s", host, domain, field, value)
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   525
            host_fields[field] = value
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   526
        
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   527
        for field_name in MULTI_FIELDS :
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   528
            field_prefix = tuple(field_name.split('.'))
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   529
            
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   530
            # find labled fields by prefix, or unlabled multi-fields
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   531
            for field, values in fields.iteritems() :
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   532
                pre, field_index = field[:-1], field[-1]
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   533
                
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   534
                if not values :
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   535
                    pass
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   536
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   537
                elif pre == field_prefix :
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   538
                    log.debug("%s@%s: %s.%s: %s", host, domain, field_prefix, field_index, value)
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   539
                    host_fields[field] = values
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   540
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   541
                elif field == field_prefix :
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   542
                    log.debug("%s@%s: %s.*: %s", host, domain, field_prefix, value)
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   543
                    host_fields[field_prefix] = values
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   544
318
304f56896942 pvl.hosts-import: import $GENERATE ips for hosts also in dhcp
Tero Marttila <terom@paivola.fi>
parents: 315
diff changeset
   545
        lazy_import = fields.get(tuple('lazy-import'.split('.')))
304f56896942 pvl.hosts-import: import $GENERATE ips for hosts also in dhcp
Tero Marttila <terom@paivola.fi>
parents: 315
diff changeset
   546
304f56896942 pvl.hosts-import: import $GENERATE ips for hosts also in dhcp
Tero Marttila <terom@paivola.fi>
parents: 315
diff changeset
   547
        if not lazy_import :
304f56896942 pvl.hosts-import: import $GENERATE ips for hosts also in dhcp
Tero Marttila <terom@paivola.fi>
parents: 315
diff changeset
   548
            pass
304f56896942 pvl.hosts-import: import $GENERATE ips for hosts also in dhcp
Tero Marttila <terom@paivola.fi>
parents: 315
diff changeset
   549
        elif set(host_fields) == set([('ip', )]) :
304f56896942 pvl.hosts-import: import $GENERATE ips for hosts also in dhcp
Tero Marttila <terom@paivola.fi>
parents: 315
diff changeset
   550
            log.info("%s: omit lazy-import with fields: %s", host, ' '.join('.'.join(field) for field in host_fields))
304f56896942 pvl.hosts-import: import $GENERATE ips for hosts also in dhcp
Tero Marttila <terom@paivola.fi>
parents: 315
diff changeset
   551
            continue
304f56896942 pvl.hosts-import: import $GENERATE ips for hosts also in dhcp
Tero Marttila <terom@paivola.fi>
parents: 315
diff changeset
   552
        else :
304f56896942 pvl.hosts-import: import $GENERATE ips for hosts also in dhcp
Tero Marttila <terom@paivola.fi>
parents: 315
diff changeset
   553
            log.info("%s: import lazy-import with fields: %s", host, ' '.join('.'.join(field) for field in host_fields))
304f56896942 pvl.hosts-import: import $GENERATE ips for hosts also in dhcp
Tero Marttila <terom@paivola.fi>
parents: 315
diff changeset
   554
304
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   555
        yield (host, domain), host_fields
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   556
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   557
def apply_import_hosts (options) :
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   558
    """
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   559
        Import hosts.
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   560
    """
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   561
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   562
    import_hosts = import_hosts_files(options, options.import_zone_hosts, options.import_dhcp_hosts)
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   563
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   564
    # process
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   565
    import_hosts = process_hosts_comments(options, import_hosts)
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   566
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   567
    # gather
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   568
    return process_import_hosts(options, import_hosts)
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   569
313
c211ef65fd67 pvl.hosts-import: alias4 mapping
Tero Marttila <terom@paivola.fi>
parents: 311
diff changeset
   570
def process_hosts (options, hosts) :
c211ef65fd67 pvl.hosts-import: alias4 mapping
Tero Marttila <terom@paivola.fi>
parents: 311
diff changeset
   571
    """
c211ef65fd67 pvl.hosts-import: alias4 mapping
Tero Marttila <terom@paivola.fi>
parents: 311
diff changeset
   572
        Sanity-check and post-process hosts.
c211ef65fd67 pvl.hosts-import: alias4 mapping
Tero Marttila <terom@paivola.fi>
parents: 311
diff changeset
   573
c211ef65fd67 pvl.hosts-import: alias4 mapping
Tero Marttila <terom@paivola.fi>
parents: 311
diff changeset
   574
        Does alias4 mapping, nonexistant alias checks, duplicate ip checks..
c211ef65fd67 pvl.hosts-import: alias4 mapping
Tero Marttila <terom@paivola.fi>
parents: 311
diff changeset
   575
    """
c211ef65fd67 pvl.hosts-import: alias4 mapping
Tero Marttila <terom@paivola.fi>
parents: 311
diff changeset
   576
288
2f2f92e4c58e pvl.hosts-import: check_hosts: verify nonexistan aliases
Tero Marttila <terom@paivola.fi>
parents: 285
diff changeset
   577
    by_name = dict(hosts)
313
c211ef65fd67 pvl.hosts-import: alias4 mapping
Tero Marttila <terom@paivola.fi>
parents: 311
diff changeset
   578
    by_ip = dict()
288
2f2f92e4c58e pvl.hosts-import: check_hosts: verify nonexistan aliases
Tero Marttila <terom@paivola.fi>
parents: 285
diff changeset
   579
313
c211ef65fd67 pvl.hosts-import: alias4 mapping
Tero Marttila <terom@paivola.fi>
parents: 311
diff changeset
   580
    # scan for alias4
c211ef65fd67 pvl.hosts-import: alias4 mapping
Tero Marttila <terom@paivola.fi>
parents: 311
diff changeset
   581
    for (host, domain), fields in by_name.items() :
314
a1e4ef8dfb76 pvl.hosts-import: fix alias4/alias6 processing
Tero Marttila <terom@paivola.fi>
parents: 313
diff changeset
   582
        for fmt, ip_field, alias_field in (
a1e4ef8dfb76 pvl.hosts-import: fix alias4/alias6 processing
Tero Marttila <terom@paivola.fi>
parents: 313
diff changeset
   583
                (pvl.hosts.Host.ALIAS4_FMT, 'ip', 'alias4'),
a1e4ef8dfb76 pvl.hosts-import: fix alias4/alias6 processing
Tero Marttila <terom@paivola.fi>
parents: 313
diff changeset
   584
                (pvl.hosts.Host.ALIAS6_FMT, 'ip6', 'alias6'),
a1e4ef8dfb76 pvl.hosts-import: fix alias4/alias6 processing
Tero Marttila <terom@paivola.fi>
parents: 313
diff changeset
   585
        ) :
a1e4ef8dfb76 pvl.hosts-import: fix alias4/alias6 processing
Tero Marttila <terom@paivola.fi>
parents: 313
diff changeset
   586
            alias = fmt.format(host=host)
a1e4ef8dfb76 pvl.hosts-import: fix alias4/alias6 processing
Tero Marttila <terom@paivola.fi>
parents: 313
diff changeset
   587
            alias_fields = by_name.get((alias, domain))
313
c211ef65fd67 pvl.hosts-import: alias4 mapping
Tero Marttila <terom@paivola.fi>
parents: 311
diff changeset
   588
314
a1e4ef8dfb76 pvl.hosts-import: fix alias4/alias6 processing
Tero Marttila <terom@paivola.fi>
parents: 313
diff changeset
   589
            if not alias_fields :
a1e4ef8dfb76 pvl.hosts-import: fix alias4/alias6 processing
Tero Marttila <terom@paivola.fi>
parents: 313
diff changeset
   590
                continue
313
c211ef65fd67 pvl.hosts-import: alias4 mapping
Tero Marttila <terom@paivola.fi>
parents: 311
diff changeset
   591
314
a1e4ef8dfb76 pvl.hosts-import: fix alias4/alias6 processing
Tero Marttila <terom@paivola.fi>
parents: 313
diff changeset
   592
            elif alias_fields[(ip_field, )] != fields[(ip_field, )] :
a1e4ef8dfb76 pvl.hosts-import: fix alias4/alias6 processing
Tero Marttila <terom@paivola.fi>
parents: 313
diff changeset
   593
                log.warn("%s: %s %s collision with %s", host, alias_field, ip_field, alias)
a1e4ef8dfb76 pvl.hosts-import: fix alias4/alias6 processing
Tero Marttila <terom@paivola.fi>
parents: 313
diff changeset
   594
            elif ('alias', ) in alias_fields :
a1e4ef8dfb76 pvl.hosts-import: fix alias4/alias6 processing
Tero Marttila <terom@paivola.fi>
parents: 313
diff changeset
   595
                log.warn("%s: mapped to %s on %s", alias, alias_field, host)
a1e4ef8dfb76 pvl.hosts-import: fix alias4/alias6 processing
Tero Marttila <terom@paivola.fi>
parents: 313
diff changeset
   596
                fields[(alias_field, )] = alias_fields.get(('alias', ), ())
a1e4ef8dfb76 pvl.hosts-import: fix alias4/alias6 processing
Tero Marttila <terom@paivola.fi>
parents: 313
diff changeset
   597
                del by_name[(alias, domain)]
a1e4ef8dfb76 pvl.hosts-import: fix alias4/alias6 processing
Tero Marttila <terom@paivola.fi>
parents: 313
diff changeset
   598
            else :
a1e4ef8dfb76 pvl.hosts-import: fix alias4/alias6 processing
Tero Marttila <terom@paivola.fi>
parents: 313
diff changeset
   599
                log.warn("%s: %s mapped to %s, but no aliases", alias, alias_field, host)
315
3ad1822cd91d pvl.hosts-import: drop alias-less aliasX from hosts if empty
Tero Marttila <terom@paivola.fi>
parents: 314
diff changeset
   600
                del by_name[(alias, domain)]
313
c211ef65fd67 pvl.hosts-import: alias4 mapping
Tero Marttila <terom@paivola.fi>
parents: 311
diff changeset
   601
320
bfda3703fa0c pvl.hosts-import: implement alias chaning (flatten CNAME chains)
Tero Marttila <terom@paivola.fi>
parents: 319
diff changeset
   602
    # scan by alias
bfda3703fa0c pvl.hosts-import: implement alias chaning (flatten CNAME chains)
Tero Marttila <terom@paivola.fi>
parents: 319
diff changeset
   603
    by_alias = { }
bfda3703fa0c pvl.hosts-import: implement alias chaning (flatten CNAME chains)
Tero Marttila <terom@paivola.fi>
parents: 319
diff changeset
   604
bfda3703fa0c pvl.hosts-import: implement alias chaning (flatten CNAME chains)
Tero Marttila <terom@paivola.fi>
parents: 319
diff changeset
   605
    for (host, domain), fields in hosts :
bfda3703fa0c pvl.hosts-import: implement alias chaning (flatten CNAME chains)
Tero Marttila <terom@paivola.fi>
parents: 319
diff changeset
   606
        for alias in fields.get(('alias', ), ()) :
bfda3703fa0c pvl.hosts-import: implement alias chaning (flatten CNAME chains)
Tero Marttila <terom@paivola.fi>
parents: 319
diff changeset
   607
            if (alias, domain) in by_alias :
bfda3703fa0c pvl.hosts-import: implement alias chaning (flatten CNAME chains)
Tero Marttila <terom@paivola.fi>
parents: 319
diff changeset
   608
                log.warn("%s: duplicate alias %s: %s", host, alias, by_alias[(alias, domain)])
bfda3703fa0c pvl.hosts-import: implement alias chaning (flatten CNAME chains)
Tero Marttila <terom@paivola.fi>
parents: 319
diff changeset
   609
            else :
bfda3703fa0c pvl.hosts-import: implement alias chaning (flatten CNAME chains)
Tero Marttila <terom@paivola.fi>
parents: 319
diff changeset
   610
                by_alias[(alias, domain)] = (host, fields)
bfda3703fa0c pvl.hosts-import: implement alias chaning (flatten CNAME chains)
Tero Marttila <terom@paivola.fi>
parents: 319
diff changeset
   611
313
c211ef65fd67 pvl.hosts-import: alias4 mapping
Tero Marttila <terom@paivola.fi>
parents: 311
diff changeset
   612
    for (host, domain), fields in hosts :
314
a1e4ef8dfb76 pvl.hosts-import: fix alias4/alias6 processing
Tero Marttila <terom@paivola.fi>
parents: 313
diff changeset
   613
        fields = by_name.get((host, domain))
a1e4ef8dfb76 pvl.hosts-import: fix alias4/alias6 processing
Tero Marttila <terom@paivola.fi>
parents: 313
diff changeset
   614
a1e4ef8dfb76 pvl.hosts-import: fix alias4/alias6 processing
Tero Marttila <terom@paivola.fi>
parents: 313
diff changeset
   615
        if not fields :
313
c211ef65fd67 pvl.hosts-import: alias4 mapping
Tero Marttila <terom@paivola.fi>
parents: 311
diff changeset
   616
            # skip
c211ef65fd67 pvl.hosts-import: alias4 mapping
Tero Marttila <terom@paivola.fi>
parents: 311
diff changeset
   617
            continue
c211ef65fd67 pvl.hosts-import: alias4 mapping
Tero Marttila <terom@paivola.fi>
parents: 311
diff changeset
   618
304
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   619
        if set(fields) == set([('alias', )]) :
320
bfda3703fa0c pvl.hosts-import: implement alias chaning (flatten CNAME chains)
Tero Marttila <terom@paivola.fi>
parents: 319
diff changeset
   620
            aliases = fields[('alias', )]
bfda3703fa0c pvl.hosts-import: implement alias chaning (flatten CNAME chains)
Tero Marttila <terom@paivola.fi>
parents: 319
diff changeset
   621
            if (host, domain) in by_alias :
bfda3703fa0c pvl.hosts-import: implement alias chaning (flatten CNAME chains)
Tero Marttila <terom@paivola.fi>
parents: 319
diff changeset
   622
                alias_host, alias_fields = by_alias[(host, domain)]
bfda3703fa0c pvl.hosts-import: implement alias chaning (flatten CNAME chains)
Tero Marttila <terom@paivola.fi>
parents: 319
diff changeset
   623
                log.info("%s: chain as alias to %s: %s", host, alias_host, ' '.join(aliases))
bfda3703fa0c pvl.hosts-import: implement alias chaning (flatten CNAME chains)
Tero Marttila <terom@paivola.fi>
parents: 319
diff changeset
   624
                alias_fields[('alias', )].extend(aliases)
bfda3703fa0c pvl.hosts-import: implement alias chaning (flatten CNAME chains)
Tero Marttila <terom@paivola.fi>
parents: 319
diff changeset
   625
                continue
bfda3703fa0c pvl.hosts-import: implement alias chaning (flatten CNAME chains)
Tero Marttila <terom@paivola.fi>
parents: 319
diff changeset
   626
            else :
bfda3703fa0c pvl.hosts-import: implement alias chaning (flatten CNAME chains)
Tero Marttila <terom@paivola.fi>
parents: 319
diff changeset
   627
                log.warn("%s@%s: nonexistant alias target for: %s", host, domain, ' '.join(aliases))
313
c211ef65fd67 pvl.hosts-import: alias4 mapping
Tero Marttila <terom@paivola.fi>
parents: 311
diff changeset
   628
        
c211ef65fd67 pvl.hosts-import: alias4 mapping
Tero Marttila <terom@paivola.fi>
parents: 311
diff changeset
   629
        ip = fields.get(('ip', ))
c211ef65fd67 pvl.hosts-import: alias4 mapping
Tero Marttila <terom@paivola.fi>
parents: 311
diff changeset
   630
c211ef65fd67 pvl.hosts-import: alias4 mapping
Tero Marttila <terom@paivola.fi>
parents: 311
diff changeset
   631
        if ip in by_ip :
c211ef65fd67 pvl.hosts-import: alias4 mapping
Tero Marttila <terom@paivola.fi>
parents: 311
diff changeset
   632
            log.warn("%s: duplicate ip %s: %s", host, ip, by_ip[ip])
328
9b4ee4bad3d1 pvl.hosts-import: also import --zone-unused=ufc hosts, and output them as special comments
Tero Marttila <terom@paivola.fi>
parents: 327
diff changeset
   633
        elif ip :
9b4ee4bad3d1 pvl.hosts-import: also import --zone-unused=ufc hosts, and output them as special comments
Tero Marttila <terom@paivola.fi>
parents: 327
diff changeset
   634
            by_ip[ip] = host
313
c211ef65fd67 pvl.hosts-import: alias4 mapping
Tero Marttila <terom@paivola.fi>
parents: 311
diff changeset
   635
        else :
328
9b4ee4bad3d1 pvl.hosts-import: also import --zone-unused=ufc hosts, and output them as special comments
Tero Marttila <terom@paivola.fi>
parents: 327
diff changeset
   636
            log.warn("%s: no ip", host)
313
c211ef65fd67 pvl.hosts-import: alias4 mapping
Tero Marttila <terom@paivola.fi>
parents: 311
diff changeset
   637
c211ef65fd67 pvl.hosts-import: alias4 mapping
Tero Marttila <terom@paivola.fi>
parents: 311
diff changeset
   638
        yield (host, domain), fields
288
2f2f92e4c58e pvl.hosts-import: check_hosts: verify nonexistan aliases
Tero Marttila <terom@paivola.fi>
parents: 285
diff changeset
   639
2f2f92e4c58e pvl.hosts-import: check_hosts: verify nonexistan aliases
Tero Marttila <terom@paivola.fi>
parents: 285
diff changeset
   640
def sort_export_hosts (options, hosts) :
304
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   641
    """
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   642
        Generate a sortable version of hosts, yielding (sort, host, fields).
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   643
    """
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   644
265
5f2807999222 pvl.dns-hosts: always sort by ip
Tero Marttila <terom@paivola.fi>
parents: 264
diff changeset
   645
    if options.output_prefix :
5f2807999222 pvl.dns-hosts: always sort by ip
Tero Marttila <terom@paivola.fi>
parents: 264
diff changeset
   646
        prefix = ipaddr.IPNetwork(options.output_prefix)
5f2807999222 pvl.dns-hosts: always sort by ip
Tero Marttila <terom@paivola.fi>
parents: 264
diff changeset
   647
    else :
5f2807999222 pvl.dns-hosts: always sort by ip
Tero Marttila <terom@paivola.fi>
parents: 264
diff changeset
   648
        prefix = None
5f2807999222 pvl.dns-hosts: always sort by ip
Tero Marttila <terom@paivola.fi>
parents: 264
diff changeset
   649
304
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   650
    if options.output_domain :
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   651
        select_domain = options.output_domain
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   652
    else :
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   653
        select_domain = None
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   654
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   655
    for (host, domain), fields in hosts :
328
9b4ee4bad3d1 pvl.hosts-import: also import --zone-unused=ufc hosts, and output them as special comments
Tero Marttila <terom@paivola.fi>
parents: 327
diff changeset
   656
        ip = fields.get(('ip', )) or fields.get(('ip', 'unused'))
304
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   657
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   658
        log.debug("%s@%s: ip=%s", host, domain, ip)
265
5f2807999222 pvl.dns-hosts: always sort by ip
Tero Marttila <terom@paivola.fi>
parents: 264
diff changeset
   659
        
5f2807999222 pvl.dns-hosts: always sort by ip
Tero Marttila <terom@paivola.fi>
parents: 264
diff changeset
   660
        # sort by IP
5f2807999222 pvl.dns-hosts: always sort by ip
Tero Marttila <terom@paivola.fi>
parents: 264
diff changeset
   661
        if ip :
304
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   662
            sort = ip
265
5f2807999222 pvl.dns-hosts: always sort by ip
Tero Marttila <terom@paivola.fi>
parents: 264
diff changeset
   663
        else :
5f2807999222 pvl.dns-hosts: always sort by ip
Tero Marttila <terom@paivola.fi>
parents: 264
diff changeset
   664
            # fake, to sort correctly
5f2807999222 pvl.dns-hosts: always sort by ip
Tero Marttila <terom@paivola.fi>
parents: 264
diff changeset
   665
            sort = ipaddr.IPAddress(0)
5f2807999222 pvl.dns-hosts: always sort by ip
Tero Marttila <terom@paivola.fi>
parents: 264
diff changeset
   666
        
5f2807999222 pvl.dns-hosts: always sort by ip
Tero Marttila <terom@paivola.fi>
parents: 264
diff changeset
   667
        # select
327
9d7d40206a74 pvl.hosts-import: add --output-others
Tero Marttila <terom@paivola.fi>
parents: 326
diff changeset
   668
        match = True
9d7d40206a74 pvl.hosts-import: add --output-others
Tero Marttila <terom@paivola.fi>
parents: 326
diff changeset
   669
265
5f2807999222 pvl.dns-hosts: always sort by ip
Tero Marttila <terom@paivola.fi>
parents: 264
diff changeset
   670
        if prefix:
5f2807999222 pvl.dns-hosts: always sort by ip
Tero Marttila <terom@paivola.fi>
parents: 264
diff changeset
   671
            if not (ip and ip in prefix) :
327
9d7d40206a74 pvl.hosts-import: add --output-others
Tero Marttila <terom@paivola.fi>
parents: 326
diff changeset
   672
                match = False
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   673
304
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   674
        if select_domain :
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   675
            if not (domain and domain == select_domain) :
327
9d7d40206a74 pvl.hosts-import: add --output-others
Tero Marttila <terom@paivola.fi>
parents: 326
diff changeset
   676
                match = False
304
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   677
327
9d7d40206a74 pvl.hosts-import: add --output-others
Tero Marttila <terom@paivola.fi>
parents: 326
diff changeset
   678
        if match and options.output_others :
9d7d40206a74 pvl.hosts-import: add --output-others
Tero Marttila <terom@paivola.fi>
parents: 326
diff changeset
   679
            pass
9d7d40206a74 pvl.hosts-import: add --output-others
Tero Marttila <terom@paivola.fi>
parents: 326
diff changeset
   680
        elif not match and not options.output_others :
9d7d40206a74 pvl.hosts-import: add --output-others
Tero Marttila <terom@paivola.fi>
parents: 326
diff changeset
   681
            pass
9d7d40206a74 pvl.hosts-import: add --output-others
Tero Marttila <terom@paivola.fi>
parents: 326
diff changeset
   682
        else :
9d7d40206a74 pvl.hosts-import: add --output-others
Tero Marttila <terom@paivola.fi>
parents: 326
diff changeset
   683
            yield (domain, sort), (host, domain), fields
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   684
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   685
def export_hosts (options, hosts) :
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   686
    """
285
e18aaec99e54 pvl.hosts-import: generate domain-sections
Tero Marttila <terom@paivola.fi>
parents: 281
diff changeset
   687
        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
   688
    """
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   689
265
5f2807999222 pvl.dns-hosts: always sort by ip
Tero Marttila <terom@paivola.fi>
parents: 264
diff changeset
   690
    # filter + sort
288
2f2f92e4c58e pvl.hosts-import: check_hosts: verify nonexistan aliases
Tero Marttila <terom@paivola.fi>
parents: 285
diff changeset
   691
    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
   692
304
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   693
    if options.output_domain :
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   694
        # global
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   695
        output_domain = False
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   696
    else :
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   697
        output_domain = None
263
5ee3bcd5b4b5 pvl.dns-hosts: name import/export; export as config
Tero Marttila <terom@paivola.fi>
parents: 262
diff changeset
   698
304
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   699
    for (host, domain), fields in hosts :
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   700
        if output_domain is False :
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   701
            pass
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   702
        elif domain != output_domain :
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   703
            yield u"[{domain}]".format(domain=domain)
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   704
            output_domain = domain
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   705
328
9b4ee4bad3d1 pvl.hosts-import: also import --zone-unused=ufc hosts, and output them as special comments
Tero Marttila <terom@paivola.fi>
parents: 327
diff changeset
   706
        # special handling for "unused" hosts
9b4ee4bad3d1 pvl.hosts-import: also import --zone-unused=ufc hosts, and output them as special comments
Tero Marttila <terom@paivola.fi>
parents: 327
diff changeset
   707
        if ('ip', 'unused') in fields :
9b4ee4bad3d1 pvl.hosts-import: also import --zone-unused=ufc hosts, and output them as special comments
Tero Marttila <terom@paivola.fi>
parents: 327
diff changeset
   708
            yield u"{indent}# {unused} {ip}".format(
9b4ee4bad3d1 pvl.hosts-import: also import --zone-unused=ufc hosts, and output them as special comments
Tero Marttila <terom@paivola.fi>
parents: 327
diff changeset
   709
                    indent  = '\t' if output_domain else '',
9b4ee4bad3d1 pvl.hosts-import: also import --zone-unused=ufc hosts, and output them as special comments
Tero Marttila <terom@paivola.fi>
parents: 327
diff changeset
   710
                    unused  = options.zone_unused,
9b4ee4bad3d1 pvl.hosts-import: also import --zone-unused=ufc hosts, and output them as special comments
Tero Marttila <terom@paivola.fi>
parents: 327
diff changeset
   711
                    ip      = fields[('ip', 'unused')],
9b4ee4bad3d1 pvl.hosts-import: also import --zone-unused=ufc hosts, and output them as special comments
Tero Marttila <terom@paivola.fi>
parents: 327
diff changeset
   712
            )
9b4ee4bad3d1 pvl.hosts-import: also import --zone-unused=ufc hosts, and output them as special comments
Tero Marttila <terom@paivola.fi>
parents: 327
diff changeset
   713
            yield u""
9b4ee4bad3d1 pvl.hosts-import: also import --zone-unused=ufc hosts, and output them as special comments
Tero Marttila <terom@paivola.fi>
parents: 327
diff changeset
   714
            continue
9b4ee4bad3d1 pvl.hosts-import: also import --zone-unused=ufc hosts, and output them as special comments
Tero Marttila <terom@paivola.fi>
parents: 327
diff changeset
   715
304
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   716
        # optional host-comments
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   717
        for comment in fields.get(('comment', 'host'), ()):
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   718
            yield u"{indent}# {comment}".format(
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   719
                    indent  = '\t' if output_domain else '',
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   720
                    comment = comment,
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   721
            )
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   722
        
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   723
        if output_domain :
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   724
            yield u"\t[[{host}]]".format(host=host)
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   725
        else :
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   726
            yield u"[{host}]".format(host=host)
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   727
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   728
        #if not options.output_domain and domain :
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   729
        #    yield u"\t{field:15} = {domain}".format(field='domain', domain=domain)
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   730
        
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   731
        for field_name in (
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   732
                'ip',
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   733
                'ip6',
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   734
                'ethernet',
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   735
                'owner',
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   736
                'alias',
314
a1e4ef8dfb76 pvl.hosts-import: fix alias4/alias6 processing
Tero Marttila <terom@paivola.fi>
parents: 313
diff changeset
   737
                'alias4',
a1e4ef8dfb76 pvl.hosts-import: fix alias4/alias6 processing
Tero Marttila <terom@paivola.fi>
parents: 313
diff changeset
   738
                'alias6',
304
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   739
                'boot',
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   740
        ) :
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   741
            for field, value in fields.iteritems() :
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   742
                if field[0] == field_name :
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   743
                    # optional field-comment
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   744
                    comment = fields.get(('comment', field_name), None)
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   745
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   746
                    if isinstance(value, list) :
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   747
                        value = ' '.join(value)
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   748
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   749
                    yield u"{indent}{field:15} = {value} {comment}".format(
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   750
                            indent  = '\t\t' if output_domain else '\t',
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   751
                            field   = '.'.join(str(label) for label in field),
268
560ba0544254 pvl.hosts-import: ugly indexed foo.X keys for multi-value fields..
Tero Marttila <terom@paivola.fi>
parents: 266
diff changeset
   752
                            value   = value,
304
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   753
                            comment = u"# {comment}".format(comment=comment) if comment else '',
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   754
                    ).rstrip()
285
e18aaec99e54 pvl.hosts-import: generate domain-sections
Tero Marttila <terom@paivola.fi>
parents: 281
diff changeset
   755
    
e18aaec99e54 pvl.hosts-import: generate domain-sections
Tero Marttila <terom@paivola.fi>
parents: 281
diff changeset
   756
        yield ""
e18aaec99e54 pvl.hosts-import: generate domain-sections
Tero Marttila <terom@paivola.fi>
parents: 281
diff changeset
   757
   
e18aaec99e54 pvl.hosts-import: generate domain-sections
Tero Marttila <terom@paivola.fi>
parents: 281
diff changeset
   758
def apply_hosts_export (options, hosts) :
e18aaec99e54 pvl.hosts-import: generate domain-sections
Tero Marttila <terom@paivola.fi>
parents: 281
diff changeset
   759
    """
e18aaec99e54 pvl.hosts-import: generate domain-sections
Tero Marttila <terom@paivola.fi>
parents: 281
diff changeset
   760
        Export hosts to file.
e18aaec99e54 pvl.hosts-import: generate domain-sections
Tero Marttila <terom@paivola.fi>
parents: 281
diff changeset
   761
    """
e18aaec99e54 pvl.hosts-import: generate domain-sections
Tero Marttila <terom@paivola.fi>
parents: 281
diff changeset
   762
e18aaec99e54 pvl.hosts-import: generate domain-sections
Tero Marttila <terom@paivola.fi>
parents: 281
diff changeset
   763
    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
   764
e18aaec99e54 pvl.hosts-import: generate domain-sections
Tero Marttila <terom@paivola.fi>
parents: 281
diff changeset
   765
    for line in export_hosts(options, hosts) :
e18aaec99e54 pvl.hosts-import: generate domain-sections
Tero Marttila <terom@paivola.fi>
parents: 281
diff changeset
   766
        print >>file, line
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   767
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   768
def main (argv) :
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   769
    options, args = parse_options(argv)
261
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   770
dff7dcf0013f pvl.dns-hosts: find owners from ldap
Tero Marttila <terom@paivola.fi>
parents: 260
diff changeset
   771
    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
   772
    
304
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   773
    # import
9332f21f5aa1 pvl.hosts-import: support host domains, rework multi-value fields
Tero Marttila <terom@paivola.fi>
parents: 303
diff changeset
   774
    hosts = list(apply_import_hosts(options))
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   775
   
288
2f2f92e4c58e pvl.hosts-import: check_hosts: verify nonexistan aliases
Tero Marttila <terom@paivola.fi>
parents: 285
diff changeset
   776
    # verify
313
c211ef65fd67 pvl.hosts-import: alias4 mapping
Tero Marttila <terom@paivola.fi>
parents: 311
diff changeset
   777
    hosts = process_hosts(options, hosts)
288
2f2f92e4c58e pvl.hosts-import: check_hosts: verify nonexistan aliases
Tero Marttila <terom@paivola.fi>
parents: 285
diff changeset
   778
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   779
    # output
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   780
    if options.output_hosts :
285
e18aaec99e54 pvl.hosts-import: generate domain-sections
Tero Marttila <terom@paivola.fi>
parents: 281
diff changeset
   781
        apply_hosts_export(options, hosts)
259
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   782
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   783
if __name__ == '__main__':
65b483fb862c pvl.dns-hosts: import hosts from dns/dhcp
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   784
    pvl.args.main(main)