pvl/hosts.py
author Tero Marttila <terom@paivola.fi>
Sun, 07 Sep 2014 14:21:56 +0300
changeset 424 e77e967d59b0
parent 421 585eadaed270
permissions -rw-r--r--
hgignore: use glob; ignore snmp mibs
277
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     1
"""
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     2
    Host definitions.
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     3
"""
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     4
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     5
import pvl.args
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     6
import pvl.dns.zone
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     7
381
6fe465ce6d52 pvl.hosts: support foo:bar = ... extension fields
Tero Marttila <terom@paivola.fi>
parents: 344
diff changeset
     8
import collections
277
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     9
import configobj
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    10
import ipaddr
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    11
import optparse
287
968130f21270 pvl.hosts: support domain-sections
Tero Marttila <terom@paivola.fi>
parents: 282
diff changeset
    12
import os.path
277
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    13
331
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
    14
import logging; log = logging.getLogger('pvl.hosts')
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
    15
277
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    16
def optparser (parser) :
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    17
    hosts = optparse.OptionGroup(parser, "Hosts input")
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    18
    hosts.add_option('--hosts-charset',         metavar='CHARSET',  default='utf-8', 
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    19
            help="Encoding used for host files")
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    20
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    21
    hosts.add_option('--hosts-domain',          metavar='DOMAIN',
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    22
            help="Default domain for hosts")
334
19da67d71506 pvl.hosts: --hosts-include path support
Tero Marttila <terom@paivola.fi>
parents: 333
diff changeset
    23
19da67d71506 pvl.hosts: --hosts-include path support
Tero Marttila <terom@paivola.fi>
parents: 333
diff changeset
    24
    hosts.add_option('--hosts-include',         metavar='PATH',
19da67d71506 pvl.hosts: --hosts-include path support
Tero Marttila <terom@paivola.fi>
parents: 333
diff changeset
    25
            help="Optional path for hosts includes, beyond host config dir")
277
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    26
    
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    27
    return hosts
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    28
334
19da67d71506 pvl.hosts: --hosts-include path support
Tero Marttila <terom@paivola.fi>
parents: 333
diff changeset
    29
class HostError (Exception) :
19da67d71506 pvl.hosts: --hosts-include path support
Tero Marttila <terom@paivola.fi>
parents: 333
diff changeset
    30
    pass
19da67d71506 pvl.hosts: --hosts-include path support
Tero Marttila <terom@paivola.fi>
parents: 333
diff changeset
    31
19da67d71506 pvl.hosts: --hosts-include path support
Tero Marttila <terom@paivola.fi>
parents: 333
diff changeset
    32
class HostConfigError (HostError) :
19da67d71506 pvl.hosts: --hosts-include path support
Tero Marttila <terom@paivola.fi>
parents: 333
diff changeset
    33
    pass
19da67d71506 pvl.hosts: --hosts-include path support
Tero Marttila <terom@paivola.fi>
parents: 333
diff changeset
    34
412
b557b472ffa1 pvl.hosts: normalize host ethernet syntax
Tero Marttila <terom@paivola.fi>
parents: 385
diff changeset
    35
def parse_ethernet (value) :
b557b472ffa1 pvl.hosts: normalize host ethernet syntax
Tero Marttila <terom@paivola.fi>
parents: 385
diff changeset
    36
    """
b557b472ffa1 pvl.hosts: normalize host ethernet syntax
Tero Marttila <terom@paivola.fi>
parents: 385
diff changeset
    37
        Normalize ethernet str.
b557b472ffa1 pvl.hosts: normalize host ethernet syntax
Tero Marttila <terom@paivola.fi>
parents: 385
diff changeset
    38
    """
b557b472ffa1 pvl.hosts: normalize host ethernet syntax
Tero Marttila <terom@paivola.fi>
parents: 385
diff changeset
    39
b557b472ffa1 pvl.hosts: normalize host ethernet syntax
Tero Marttila <terom@paivola.fi>
parents: 385
diff changeset
    40
    return ':'.join('%02x' % int(x, 16) for x in value.split(':'))
b557b472ffa1 pvl.hosts: normalize host ethernet syntax
Tero Marttila <terom@paivola.fi>
parents: 385
diff changeset
    41
277
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    42
class Host (object) :
308
08176bed21e3 pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents: 307
diff changeset
    43
    # the label used for alias4/6 hosts
08176bed21e3 pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents: 307
diff changeset
    44
    ALIAS4_FMT = '{host}-ipv4'
08176bed21e3 pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents: 307
diff changeset
    45
    ALIAS6_FMT = '{host}-ipv6'
08176bed21e3 pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents: 307
diff changeset
    46
277
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    47
    @classmethod
344
70799ad5928d pvl.hosts: also expand forward/reverse fields..
Tero Marttila <terom@paivola.fi>
parents: 337
diff changeset
    48
    def expand (cls, options, range, host, domain, ip, forward=None, reverse=None, **opts) :
277
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    49
        host = pvl.dns.zone.parse_generate_field(host)
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    50
        ip = pvl.dns.zone.parse_generate_field(ip)
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    51
344
70799ad5928d pvl.hosts: also expand forward/reverse fields..
Tero Marttila <terom@paivola.fi>
parents: 337
diff changeset
    52
        if forward is not None :
70799ad5928d pvl.hosts: also expand forward/reverse fields..
Tero Marttila <terom@paivola.fi>
parents: 337
diff changeset
    53
            _forward = pvl.dns.zone.parse_generate_field(forward)
70799ad5928d pvl.hosts: also expand forward/reverse fields..
Tero Marttila <terom@paivola.fi>
parents: 337
diff changeset
    54
        else :
70799ad5928d pvl.hosts: also expand forward/reverse fields..
Tero Marttila <terom@paivola.fi>
parents: 337
diff changeset
    55
            _forward = lambda i: forward
70799ad5928d pvl.hosts: also expand forward/reverse fields..
Tero Marttila <terom@paivola.fi>
parents: 337
diff changeset
    56
70799ad5928d pvl.hosts: also expand forward/reverse fields..
Tero Marttila <terom@paivola.fi>
parents: 337
diff changeset
    57
        if reverse is not None :
70799ad5928d pvl.hosts: also expand forward/reverse fields..
Tero Marttila <terom@paivola.fi>
parents: 337
diff changeset
    58
            _reverse = pvl.dns.zone.parse_generate_field(reverse)
70799ad5928d pvl.hosts: also expand forward/reverse fields..
Tero Marttila <terom@paivola.fi>
parents: 337
diff changeset
    59
        else :
70799ad5928d pvl.hosts: also expand forward/reverse fields..
Tero Marttila <terom@paivola.fi>
parents: 337
diff changeset
    60
            _reverse = lambda i: reverse
70799ad5928d pvl.hosts: also expand forward/reverse fields..
Tero Marttila <terom@paivola.fi>
parents: 337
diff changeset
    61
277
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    62
        for i in range :
331
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
    63
            yield cls.build(options, host(i), domain,
344
70799ad5928d pvl.hosts: also expand forward/reverse fields..
Tero Marttila <terom@paivola.fi>
parents: 337
diff changeset
    64
                    ip      = ip(i),
70799ad5928d pvl.hosts: also expand forward/reverse fields..
Tero Marttila <terom@paivola.fi>
parents: 337
diff changeset
    65
                    forward = _forward(i),
70799ad5928d pvl.hosts: also expand forward/reverse fields..
Tero Marttila <terom@paivola.fi>
parents: 337
diff changeset
    66
                    reverse = _reverse(i),
277
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    67
                    **opts
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    68
            )
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    69
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    70
    @classmethod
331
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
    71
    def config (cls, options, host, section=None, domain=None, ip=None, **extra) :
277
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    72
        """
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    73
            Yield Hosts from a config section's scalars.
331
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
    74
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
    75
                options     - pvl.args Options
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
    76
                host        - the name of the section (or file) containing this host item.
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
    77
                section     - the parent section containing this host item, or None
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
    78
                              used for domain
277
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    79
        """
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    80
331
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
    81
        if domain :
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
    82
            log.debug("%s: explicit domain: %s", host, domain)
337
23b3c0661189 pvl.hosts: handle fqdn hosts correctly as not having a domain
Tero Marttila <terom@paivola.fi>
parents: 334
diff changeset
    83
        elif '.' in host :
23b3c0661189 pvl.hosts: handle fqdn hosts correctly as not having a domain
Tero Marttila <terom@paivola.fi>
parents: 334
diff changeset
    84
            log.debug("%s: using as fqdn without domain", host)
23b3c0661189 pvl.hosts: handle fqdn hosts correctly as not having a domain
Tero Marttila <terom@paivola.fi>
parents: 334
diff changeset
    85
            domain = None
331
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
    86
        elif options.hosts_domain :
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
    87
            log.debug("%s: default domain to --hots-domain: %s", host, options.hosts_domain)
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
    88
            domain = options.hosts_domain
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
    89
        elif section :
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
    90
            log.debug("%s: default domain to section: %s", host, section)
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
    91
            domain = section
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
    92
        else :
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
    93
            raise ValueError("%s: no domain given" % (host, ))
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
    94
 
277
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    95
        if '{' in host :
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    96
            pre, host = host.split('{', 1)
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    97
            range, post = host.rsplit('}', 1)
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    98
            
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    99
            range = pvl.dns.zone.parse_generate_range(range)
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   100
            host = pre + "$" + post
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   101
331
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
   102
            for host in cls.expand(options, range, host, domain, ip, **extra) :
277
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   103
                yield host
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   104
        else :
331
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
   105
            yield cls.build(options, host, domain, ip=ip, **extra)
277
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   106
    
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   107
    @classmethod
331
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
   108
    def build (cls, options, host, domain,
385
01d31fda75ab pvl.hosts: add support for explicit location = ... field
Tero Marttila <terom@paivola.fi>
parents: 383
diff changeset
   109
            ip=None, ip6=None, owner=None, location=None,
01d31fda75ab pvl.hosts: add support for explicit location = ... field
Tero Marttila <terom@paivola.fi>
parents: 383
diff changeset
   110
            alias=None, alias4=None, alias6=None,
01d31fda75ab pvl.hosts: add support for explicit location = ... field
Tero Marttila <terom@paivola.fi>
parents: 383
diff changeset
   111
            forward=None, reverse=None,
383
87b49aa52b3d pvl.hosts: better reporting of ParseErrors (with filename:line), and implement down = ... setting
Tero Marttila <terom@paivola.fi>
parents: 381
diff changeset
   112
            down=None,
385
01d31fda75ab pvl.hosts: add support for explicit location = ... field
Tero Marttila <terom@paivola.fi>
parents: 383
diff changeset
   113
            boot=None,
331
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
   114
            **extra) :
277
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   115
        """
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   116
            Return a Host from a config section's scalars.
331
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
   117
277
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   118
        """
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   119
305
e85c95e757eb pvl.hosts: support new alias/ethernet field format
Tero Marttila <terom@paivola.fi>
parents: 299
diff changeset
   120
        if alias :
e85c95e757eb pvl.hosts: support new alias/ethernet field format
Tero Marttila <terom@paivola.fi>
parents: 299
diff changeset
   121
            alias = alias.split()
e85c95e757eb pvl.hosts: support new alias/ethernet field format
Tero Marttila <terom@paivola.fi>
parents: 299
diff changeset
   122
        else :
e85c95e757eb pvl.hosts: support new alias/ethernet field format
Tero Marttila <terom@paivola.fi>
parents: 299
diff changeset
   123
            alias = ()
308
08176bed21e3 pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents: 307
diff changeset
   124
08176bed21e3 pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents: 307
diff changeset
   125
        if alias4 :
08176bed21e3 pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents: 307
diff changeset
   126
            alias4 = alias4.split()
08176bed21e3 pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents: 307
diff changeset
   127
        else :
08176bed21e3 pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents: 307
diff changeset
   128
            alias4 = ()
08176bed21e3 pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents: 307
diff changeset
   129
08176bed21e3 pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents: 307
diff changeset
   130
        if alias6 :
08176bed21e3 pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents: 307
diff changeset
   131
            alias6 = alias6.split()
08176bed21e3 pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents: 307
diff changeset
   132
        else :
08176bed21e3 pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents: 307
diff changeset
   133
            alias6 = ()
305
e85c95e757eb pvl.hosts: support new alias/ethernet field format
Tero Marttila <terom@paivola.fi>
parents: 299
diff changeset
   134
        
e85c95e757eb pvl.hosts: support new alias/ethernet field format
Tero Marttila <terom@paivola.fi>
parents: 299
diff changeset
   135
        ethernet = { }
381
6fe465ce6d52 pvl.hosts: support foo:bar = ... extension fields
Tero Marttila <terom@paivola.fi>
parents: 344
diff changeset
   136
        extensions = collections.defaultdict(dict)
277
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   137
305
e85c95e757eb pvl.hosts: support new alias/ethernet field format
Tero Marttila <terom@paivola.fi>
parents: 299
diff changeset
   138
        for field, value in extra.iteritems() :
381
6fe465ce6d52 pvl.hosts: support foo:bar = ... extension fields
Tero Marttila <terom@paivola.fi>
parents: 344
diff changeset
   139
            if ':' in field :
6fe465ce6d52 pvl.hosts: support foo:bar = ... extension fields
Tero Marttila <terom@paivola.fi>
parents: 344
diff changeset
   140
                extension, field = field.split(':', 1)
6fe465ce6d52 pvl.hosts: support foo:bar = ... extension fields
Tero Marttila <terom@paivola.fi>
parents: 344
diff changeset
   141
6fe465ce6d52 pvl.hosts: support foo:bar = ... extension fields
Tero Marttila <terom@paivola.fi>
parents: 344
diff changeset
   142
                extensions[extension][field] = value
6fe465ce6d52 pvl.hosts: support foo:bar = ... extension fields
Tero Marttila <terom@paivola.fi>
parents: 344
diff changeset
   143
6fe465ce6d52 pvl.hosts: support foo:bar = ... extension fields
Tero Marttila <terom@paivola.fi>
parents: 344
diff changeset
   144
                continue
6fe465ce6d52 pvl.hosts: support foo:bar = ... extension fields
Tero Marttila <terom@paivola.fi>
parents: 344
diff changeset
   145
305
e85c95e757eb pvl.hosts: support new alias/ethernet field format
Tero Marttila <terom@paivola.fi>
parents: 299
diff changeset
   146
            if '.' in field :
e85c95e757eb pvl.hosts: support new alias/ethernet field format
Tero Marttila <terom@paivola.fi>
parents: 299
diff changeset
   147
                field, instance = field.split('.')
e85c95e757eb pvl.hosts: support new alias/ethernet field format
Tero Marttila <terom@paivola.fi>
parents: 299
diff changeset
   148
            else :
e85c95e757eb pvl.hosts: support new alias/ethernet field format
Tero Marttila <terom@paivola.fi>
parents: 299
diff changeset
   149
                instance = None
381
6fe465ce6d52 pvl.hosts: support foo:bar = ... extension fields
Tero Marttila <terom@paivola.fi>
parents: 344
diff changeset
   150
            
305
e85c95e757eb pvl.hosts: support new alias/ethernet field format
Tero Marttila <terom@paivola.fi>
parents: 299
diff changeset
   151
            if field == 'ethernet' :
e85c95e757eb pvl.hosts: support new alias/ethernet field format
Tero Marttila <terom@paivola.fi>
parents: 299
diff changeset
   152
                if instance :
412
b557b472ffa1 pvl.hosts: normalize host ethernet syntax
Tero Marttila <terom@paivola.fi>
parents: 385
diff changeset
   153
                    ethernet[instance] = parse_ethernet(value)
305
e85c95e757eb pvl.hosts: support new alias/ethernet field format
Tero Marttila <terom@paivola.fi>
parents: 299
diff changeset
   154
                else :
e85c95e757eb pvl.hosts: support new alias/ethernet field format
Tero Marttila <terom@paivola.fi>
parents: 299
diff changeset
   155
                    for eth in value.split() :
412
b557b472ffa1 pvl.hosts: normalize host ethernet syntax
Tero Marttila <terom@paivola.fi>
parents: 385
diff changeset
   156
                        ethernet[len(ethernet)] = parse_ethernet(eth)
277
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   157
            else :
306
a1bdb4499c7a pvl.hots: fix Host.build Unknown host field error
Tero Marttila <terom@paivola.fi>
parents: 305
diff changeset
   158
                raise ValueError("%s: Unknown host field: %s=%s" % (host, field, value))
277
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   159
        
331
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
   160
       
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
   161
        if forward is None :
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
   162
            # normal zone
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
   163
            pass
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
   164
        elif forward :
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
   165
            # alias to external zone
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
   166
            pass
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
   167
        else :
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
   168
            # omit
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
   169
            forward = False
277
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   170
        
331
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
   171
        if reverse is None :
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
   172
            # normal zone
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
   173
            pass
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
   174
        elif reverse :
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
   175
            # alias to external zone
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
   176
            pass
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
   177
        else :
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
   178
            # omit
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
   179
            reverse = False
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
   180
       
383
87b49aa52b3d pvl.hosts: better reporting of ParseErrors (with filename:line), and implement down = ... setting
Tero Marttila <terom@paivola.fi>
parents: 381
diff changeset
   181
        if down :
87b49aa52b3d pvl.hosts: better reporting of ParseErrors (with filename:line), and implement down = ... setting
Tero Marttila <terom@paivola.fi>
parents: 381
diff changeset
   182
            down = True
87b49aa52b3d pvl.hosts: better reporting of ParseErrors (with filename:line), and implement down = ... setting
Tero Marttila <terom@paivola.fi>
parents: 381
diff changeset
   183
        else :
87b49aa52b3d pvl.hosts: better reporting of ParseErrors (with filename:line), and implement down = ... setting
Tero Marttila <terom@paivola.fi>
parents: 381
diff changeset
   184
            down = None
87b49aa52b3d pvl.hosts: better reporting of ParseErrors (with filename:line), and implement down = ... setting
Tero Marttila <terom@paivola.fi>
parents: 381
diff changeset
   185
        
385
01d31fda75ab pvl.hosts: add support for explicit location = ... field
Tero Marttila <terom@paivola.fi>
parents: 383
diff changeset
   186
        if not location :
421
585eadaed270 pvl.hosts-dns/graph: support a separate location = name@domain format, with an optional separate Host.location_domain
Tero Marttila <terom@paivola.fi>
parents: 412
diff changeset
   187
            location = location_domain = None
585eadaed270 pvl.hosts-dns/graph: support a separate location = name@domain format, with an optional separate Host.location_domain
Tero Marttila <terom@paivola.fi>
parents: 412
diff changeset
   188
        elif '@' in location:
585eadaed270 pvl.hosts-dns/graph: support a separate location = name@domain format, with an optional separate Host.location_domain
Tero Marttila <terom@paivola.fi>
parents: 412
diff changeset
   189
            location, location_domain = location.split('@', 1)
585eadaed270 pvl.hosts-dns/graph: support a separate location = name@domain format, with an optional separate Host.location_domain
Tero Marttila <terom@paivola.fi>
parents: 412
diff changeset
   190
        else:
585eadaed270 pvl.hosts-dns/graph: support a separate location = name@domain format, with an optional separate Host.location_domain
Tero Marttila <terom@paivola.fi>
parents: 412
diff changeset
   191
            location_domain = None
385
01d31fda75ab pvl.hosts: add support for explicit location = ... field
Tero Marttila <terom@paivola.fi>
parents: 383
diff changeset
   192
277
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   193
        return cls(host,
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   194
                domain      = domain,
282
63135113fe01 pvl.hosts: ip6, boot support
Tero Marttila <terom@paivola.fi>
parents: 277
diff changeset
   195
                ip          = ipaddr.IPv4Address(ip) if ip else None,
63135113fe01 pvl.hosts: ip6, boot support
Tero Marttila <terom@paivola.fi>
parents: 277
diff changeset
   196
                ip6         = ipaddr.IPv6Address(ip6) if ip6 else None,
277
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   197
                ethernet    = ethernet,
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   198
                alias       = alias,
308
08176bed21e3 pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents: 307
diff changeset
   199
                alias4      = alias4,
08176bed21e3 pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents: 307
diff changeset
   200
                alias6      = alias6,
277
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   201
                owner       = owner,
385
01d31fda75ab pvl.hosts: add support for explicit location = ... field
Tero Marttila <terom@paivola.fi>
parents: 383
diff changeset
   202
                location    = location,
421
585eadaed270 pvl.hosts-dns/graph: support a separate location = name@domain format, with an optional separate Host.location_domain
Tero Marttila <terom@paivola.fi>
parents: 412
diff changeset
   203
                location_domain = location_domain,
282
63135113fe01 pvl.hosts: ip6, boot support
Tero Marttila <terom@paivola.fi>
parents: 277
diff changeset
   204
                boot        = boot,
331
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
   205
                forward     = forward,
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
   206
                reverse     = reverse,
383
87b49aa52b3d pvl.hosts: better reporting of ParseErrors (with filename:line), and implement down = ... setting
Tero Marttila <terom@paivola.fi>
parents: 381
diff changeset
   207
                down        = down,
381
6fe465ce6d52 pvl.hosts: support foo:bar = ... extension fields
Tero Marttila <terom@paivola.fi>
parents: 344
diff changeset
   208
6fe465ce6d52 pvl.hosts: support foo:bar = ... extension fields
Tero Marttila <terom@paivola.fi>
parents: 344
diff changeset
   209
                **extensions
277
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   210
        )
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   211
331
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
   212
    def __init__ (self, host,
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
   213
            domain=None,
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
   214
            ip=None, ip6=None,
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
   215
            ethernet={ },
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
   216
            alias=(),
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
   217
            owner=None,
385
01d31fda75ab pvl.hosts: add support for explicit location = ... field
Tero Marttila <terom@paivola.fi>
parents: 383
diff changeset
   218
            location=None,
421
585eadaed270 pvl.hosts-dns/graph: support a separate location = name@domain format, with an optional separate Host.location_domain
Tero Marttila <terom@paivola.fi>
parents: 412
diff changeset
   219
            location_domain=None,
331
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
   220
            boot=None,
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
   221
            alias4=None, alias6=None,
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
   222
            forward=None, reverse=None,
383
87b49aa52b3d pvl.hosts: better reporting of ParseErrors (with filename:line), and implement down = ... setting
Tero Marttila <terom@paivola.fi>
parents: 381
diff changeset
   223
            down=None,
381
6fe465ce6d52 pvl.hosts: support foo:bar = ... extension fields
Tero Marttila <terom@paivola.fi>
parents: 344
diff changeset
   224
            **extensions
331
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
   225
    ) :
277
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   226
        """
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   227
            host        - str
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   228
            domain      - str
282
63135113fe01 pvl.hosts: ip6, boot support
Tero Marttila <terom@paivola.fi>
parents: 277
diff changeset
   229
            ip          - ipaddr.IPv4Address
63135113fe01 pvl.hosts: ip6, boot support
Tero Marttila <terom@paivola.fi>
parents: 277
diff changeset
   230
            ip6         - ipaddr.IPv6Address
305
e85c95e757eb pvl.hosts: support new alias/ethernet field format
Tero Marttila <terom@paivola.fi>
parents: 299
diff changeset
   231
            ethernet    - { index: ethernet }
277
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   232
            alias       - list
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   233
            owner       - str: LDAP uid
421
585eadaed270 pvl.hosts-dns/graph: support a separate location = name@domain format, with an optional separate Host.location_domain
Tero Marttila <terom@paivola.fi>
parents: 412
diff changeset
   234
            location    - location name@ part
585eadaed270 pvl.hosts-dns/graph: support a separate location = name@domain format, with an optional separate Host.location_domain
Tero Marttila <terom@paivola.fi>
parents: 412
diff changeset
   235
            location_domain - location @domain part
308
08176bed21e3 pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents: 307
diff changeset
   236
            alias4      - list (CNAME -> A)
08176bed21e3 pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents: 307
diff changeset
   237
            alias6      - list (CNAME -> AAAA)
331
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
   238
            forward     - generate forward records, or CNAME into given zone
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
   239
            reverse     - generate reverse records, or CNAME into given zone
383
87b49aa52b3d pvl.hosts: better reporting of ParseErrors (with filename:line), and implement down = ... setting
Tero Marttila <terom@paivola.fi>
parents: 381
diff changeset
   240
            down        - not online
277
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   241
        """
331
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
   242
277
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   243
        self.host = host
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   244
        self.domain = domain
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   245
        self.ip = ip
282
63135113fe01 pvl.hosts: ip6, boot support
Tero Marttila <terom@paivola.fi>
parents: 277
diff changeset
   246
        self.ip6 = ip6
277
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   247
        self.ethernet = ethernet
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   248
        self.alias = alias
308
08176bed21e3 pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents: 307
diff changeset
   249
        self.alias4 = alias4
08176bed21e3 pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents: 307
diff changeset
   250
        self.alias6 = alias6
277
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   251
        self.owner = owner
385
01d31fda75ab pvl.hosts: add support for explicit location = ... field
Tero Marttila <terom@paivola.fi>
parents: 383
diff changeset
   252
        self.location = location
421
585eadaed270 pvl.hosts-dns/graph: support a separate location = name@domain format, with an optional separate Host.location_domain
Tero Marttila <terom@paivola.fi>
parents: 412
diff changeset
   253
        self.location_domain = location_domain
282
63135113fe01 pvl.hosts: ip6, boot support
Tero Marttila <terom@paivola.fi>
parents: 277
diff changeset
   254
        self.boot = boot
331
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
   255
        self.forward = forward
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
   256
        self.reverse = reverse
383
87b49aa52b3d pvl.hosts: better reporting of ParseErrors (with filename:line), and implement down = ... setting
Tero Marttila <terom@paivola.fi>
parents: 381
diff changeset
   257
        self.down = down
277
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   258
381
6fe465ce6d52 pvl.hosts: support foo:bar = ... extension fields
Tero Marttila <terom@paivola.fi>
parents: 344
diff changeset
   259
        self.extensions = extensions
6fe465ce6d52 pvl.hosts: support foo:bar = ... extension fields
Tero Marttila <terom@paivola.fi>
parents: 344
diff changeset
   260
299
df653511caf9 pvl.hosts.Host.fqnd(): assume any host with a . is a fqdn
Tero Marttila <terom@paivola.fi>
parents: 290
diff changeset
   261
    def fqdn (self) :
df653511caf9 pvl.hosts.Host.fqnd(): assume any host with a . is a fqdn
Tero Marttila <terom@paivola.fi>
parents: 290
diff changeset
   262
        if '.' in self.host :
df653511caf9 pvl.hosts.Host.fqnd(): assume any host with a . is a fqdn
Tero Marttila <terom@paivola.fi>
parents: 290
diff changeset
   263
            return self.host + '.'
df653511caf9 pvl.hosts.Host.fqnd(): assume any host with a . is a fqdn
Tero Marttila <terom@paivola.fi>
parents: 290
diff changeset
   264
        elif self.domain :
df653511caf9 pvl.hosts.Host.fqnd(): assume any host with a . is a fqdn
Tero Marttila <terom@paivola.fi>
parents: 290
diff changeset
   265
            return pvl.dns.zone.fqdn(self.host, self.domain)
df653511caf9 pvl.hosts.Host.fqnd(): assume any host with a . is a fqdn
Tero Marttila <terom@paivola.fi>
parents: 290
diff changeset
   266
        else :
df653511caf9 pvl.hosts.Host.fqnd(): assume any host with a . is a fqdn
Tero Marttila <terom@paivola.fi>
parents: 290
diff changeset
   267
            raise ValueError("%s: have no fqdn/domain" % (self, ))
381
6fe465ce6d52 pvl.hosts: support foo:bar = ... extension fields
Tero Marttila <terom@paivola.fi>
parents: 344
diff changeset
   268
    
277
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   269
    def __str__ (self) :
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   270
        return str(self.host)
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   271
333
7d2601368142 pvl.hosts: implement support for domain-level include=...
Tero Marttila <terom@paivola.fi>
parents: 331
diff changeset
   272
def apply_host_includes (options, config_path, include) :
7d2601368142 pvl.hosts: implement support for domain-level include=...
Tero Marttila <terom@paivola.fi>
parents: 331
diff changeset
   273
    """
7d2601368142 pvl.hosts: implement support for domain-level include=...
Tero Marttila <terom@paivola.fi>
parents: 331
diff changeset
   274
        Yield files from a given config's include=... value
7d2601368142 pvl.hosts: implement support for domain-level include=...
Tero Marttila <terom@paivola.fi>
parents: 331
diff changeset
   275
    """
334
19da67d71506 pvl.hosts: --hosts-include path support
Tero Marttila <terom@paivola.fi>
parents: 333
diff changeset
   276
    
19da67d71506 pvl.hosts: --hosts-include path support
Tero Marttila <terom@paivola.fi>
parents: 333
diff changeset
   277
    if options.hosts_include :
19da67d71506 pvl.hosts: --hosts-include path support
Tero Marttila <terom@paivola.fi>
parents: 333
diff changeset
   278
        include_paths = (os.path.dirname(config_path), options.hosts_include)
19da67d71506 pvl.hosts: --hosts-include path support
Tero Marttila <terom@paivola.fi>
parents: 333
diff changeset
   279
    else :
19da67d71506 pvl.hosts: --hosts-include path support
Tero Marttila <terom@paivola.fi>
parents: 333
diff changeset
   280
        include_paths = (os.path.dirname(config_path), )
333
7d2601368142 pvl.hosts: implement support for domain-level include=...
Tero Marttila <terom@paivola.fi>
parents: 331
diff changeset
   281
7d2601368142 pvl.hosts: implement support for domain-level include=...
Tero Marttila <terom@paivola.fi>
parents: 331
diff changeset
   282
    for include in include.split() :
334
19da67d71506 pvl.hosts: --hosts-include path support
Tero Marttila <terom@paivola.fi>
parents: 333
diff changeset
   283
        for include_path in include_paths :
19da67d71506 pvl.hosts: --hosts-include path support
Tero Marttila <terom@paivola.fi>
parents: 333
diff changeset
   284
            path = os.path.join(include_path, include)
19da67d71506 pvl.hosts: --hosts-include path support
Tero Marttila <terom@paivola.fi>
parents: 333
diff changeset
   285
            if os.path.exists(path) :
19da67d71506 pvl.hosts: --hosts-include path support
Tero Marttila <terom@paivola.fi>
parents: 333
diff changeset
   286
                break
19da67d71506 pvl.hosts: --hosts-include path support
Tero Marttila <terom@paivola.fi>
parents: 333
diff changeset
   287
        else :
19da67d71506 pvl.hosts: --hosts-include path support
Tero Marttila <terom@paivola.fi>
parents: 333
diff changeset
   288
            raise HostConfigError(config_path, "Unable to find include %s in include path: %s" % (include, ' '.join(include_paths)))
333
7d2601368142 pvl.hosts: implement support for domain-level include=...
Tero Marttila <terom@paivola.fi>
parents: 331
diff changeset
   289
7d2601368142 pvl.hosts: implement support for domain-level include=...
Tero Marttila <terom@paivola.fi>
parents: 331
diff changeset
   290
        if include.endswith('/') :
7d2601368142 pvl.hosts: implement support for domain-level include=...
Tero Marttila <terom@paivola.fi>
parents: 331
diff changeset
   291
            for name in os.listdir(path) :
7d2601368142 pvl.hosts: implement support for domain-level include=...
Tero Marttila <terom@paivola.fi>
parents: 331
diff changeset
   292
                file_path = os.path.join(path, name)
7d2601368142 pvl.hosts: implement support for domain-level include=...
Tero Marttila <terom@paivola.fi>
parents: 331
diff changeset
   293
7d2601368142 pvl.hosts: implement support for domain-level include=...
Tero Marttila <terom@paivola.fi>
parents: 331
diff changeset
   294
                if name.startswith('.') :
7d2601368142 pvl.hosts: implement support for domain-level include=...
Tero Marttila <terom@paivola.fi>
parents: 331
diff changeset
   295
                    pass
7d2601368142 pvl.hosts: implement support for domain-level include=...
Tero Marttila <terom@paivola.fi>
parents: 331
diff changeset
   296
                elif not os.path.exists(file_path) :
7d2601368142 pvl.hosts: implement support for domain-level include=...
Tero Marttila <terom@paivola.fi>
parents: 331
diff changeset
   297
                    log.warn("%s: skip nonexistant include: %s", config_path, file_path)
7d2601368142 pvl.hosts: implement support for domain-level include=...
Tero Marttila <terom@paivola.fi>
parents: 331
diff changeset
   298
                else :
7d2601368142 pvl.hosts: implement support for domain-level include=...
Tero Marttila <terom@paivola.fi>
parents: 331
diff changeset
   299
                    log.info("%s: include: %s", config_path, file_path)
7d2601368142 pvl.hosts: implement support for domain-level include=...
Tero Marttila <terom@paivola.fi>
parents: 331
diff changeset
   300
                    yield open(file_path)
7d2601368142 pvl.hosts: implement support for domain-level include=...
Tero Marttila <terom@paivola.fi>
parents: 331
diff changeset
   301
7d2601368142 pvl.hosts: implement support for domain-level include=...
Tero Marttila <terom@paivola.fi>
parents: 331
diff changeset
   302
        else :
7d2601368142 pvl.hosts: implement support for domain-level include=...
Tero Marttila <terom@paivola.fi>
parents: 331
diff changeset
   303
            log.info("%s: include: %s", config_path, path)
7d2601368142 pvl.hosts: implement support for domain-level include=...
Tero Marttila <terom@paivola.fi>
parents: 331
diff changeset
   304
            yield open(path)
7d2601368142 pvl.hosts: implement support for domain-level include=...
Tero Marttila <terom@paivola.fi>
parents: 331
diff changeset
   305
7d2601368142 pvl.hosts: implement support for domain-level include=...
Tero Marttila <terom@paivola.fi>
parents: 331
diff changeset
   306
def apply_hosts_config (options, path, name, config, defaults={}, parent=None) :
287
968130f21270 pvl.hosts: support domain-sections
Tero Marttila <terom@paivola.fi>
parents: 282
diff changeset
   307
    """
968130f21270 pvl.hosts: support domain-sections
Tero Marttila <terom@paivola.fi>
parents: 282
diff changeset
   308
        Load hosts from a ConfigObj section.
968130f21270 pvl.hosts: support domain-sections
Tero Marttila <terom@paivola.fi>
parents: 282
diff changeset
   309
    """
968130f21270 pvl.hosts: support domain-sections
Tero Marttila <terom@paivola.fi>
parents: 282
diff changeset
   310
968130f21270 pvl.hosts: support domain-sections
Tero Marttila <terom@paivola.fi>
parents: 282
diff changeset
   311
    scalars = dict((scalar, config[scalar]) for scalar in config.scalars)
968130f21270 pvl.hosts: support domain-sections
Tero Marttila <terom@paivola.fi>
parents: 282
diff changeset
   312
968130f21270 pvl.hosts: support domain-sections
Tero Marttila <terom@paivola.fi>
parents: 282
diff changeset
   313
    if config.sections :
333
7d2601368142 pvl.hosts: implement support for domain-level include=...
Tero Marttila <terom@paivola.fi>
parents: 331
diff changeset
   314
        # includes?
7d2601368142 pvl.hosts: implement support for domain-level include=...
Tero Marttila <terom@paivola.fi>
parents: 331
diff changeset
   315
        for file in apply_host_includes(options, path, scalars.pop('include', '')) :
7d2601368142 pvl.hosts: implement support for domain-level include=...
Tero Marttila <terom@paivola.fi>
parents: 331
diff changeset
   316
            # within our domain context
7d2601368142 pvl.hosts: implement support for domain-level include=...
Tero Marttila <terom@paivola.fi>
parents: 331
diff changeset
   317
            for host in apply_hosts_file(options, file, parent=name) :
7d2601368142 pvl.hosts: implement support for domain-level include=...
Tero Marttila <terom@paivola.fi>
parents: 331
diff changeset
   318
                yield host
7d2601368142 pvl.hosts: implement support for domain-level include=...
Tero Marttila <terom@paivola.fi>
parents: 331
diff changeset
   319
287
968130f21270 pvl.hosts: support domain-sections
Tero Marttila <terom@paivola.fi>
parents: 282
diff changeset
   320
        # recurse; this is a domain meta-section
331
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
   321
        params = dict(defaults)
307
cc645622024e pvl.hosts.apply_hosts_config() fix domain-section scalar override
Tero Marttila <terom@paivola.fi>
parents: 306
diff changeset
   322
        params.update(**scalars) # override
333
7d2601368142 pvl.hosts: implement support for domain-level include=...
Tero Marttila <terom@paivola.fi>
parents: 331
diff changeset
   323
        
7d2601368142 pvl.hosts: implement support for domain-level include=...
Tero Marttila <terom@paivola.fi>
parents: 331
diff changeset
   324
        log.debug("%s: %s -> %s", path, parent, name)
287
968130f21270 pvl.hosts: support domain-sections
Tero Marttila <terom@paivola.fi>
parents: 282
diff changeset
   325
968130f21270 pvl.hosts: support domain-sections
Tero Marttila <terom@paivola.fi>
parents: 282
diff changeset
   326
        for section in config.sections :
333
7d2601368142 pvl.hosts: implement support for domain-level include=...
Tero Marttila <terom@paivola.fi>
parents: 331
diff changeset
   327
            for host in apply_hosts_config(options, path, section, config[section], params, name) :
287
968130f21270 pvl.hosts: support domain-sections
Tero Marttila <terom@paivola.fi>
parents: 282
diff changeset
   328
                yield host
968130f21270 pvl.hosts: support domain-sections
Tero Marttila <terom@paivola.fi>
parents: 282
diff changeset
   329
968130f21270 pvl.hosts: support domain-sections
Tero Marttila <terom@paivola.fi>
parents: 282
diff changeset
   330
    elif name :
290
9e626c1e935d pvl.hosts: fix config domain-section name handling
Tero Marttila <terom@paivola.fi>
parents: 287
diff changeset
   331
        params = dict(defaults, **scalars)
9e626c1e935d pvl.hosts: fix config domain-section name handling
Tero Marttila <terom@paivola.fi>
parents: 287
diff changeset
   332
333
7d2601368142 pvl.hosts: implement support for domain-level include=...
Tero Marttila <terom@paivola.fi>
parents: 331
diff changeset
   333
        log.debug("%s: %s: %s", path, parent, name)
7d2601368142 pvl.hosts: implement support for domain-level include=...
Tero Marttila <terom@paivola.fi>
parents: 331
diff changeset
   334
287
968130f21270 pvl.hosts: support domain-sections
Tero Marttila <terom@paivola.fi>
parents: 282
diff changeset
   335
        # this is a host section
331
9dda6a0e9826 pvl.hosts: implement forward/reverse to delegate to a different zone
Tero Marttila <terom@paivola.fi>
parents: 308
diff changeset
   336
        for host in Host.config(options, name, parent, **params) :
287
968130f21270 pvl.hosts: support domain-sections
Tero Marttila <terom@paivola.fi>
parents: 282
diff changeset
   337
            yield host
968130f21270 pvl.hosts: support domain-sections
Tero Marttila <terom@paivola.fi>
parents: 282
diff changeset
   338
968130f21270 pvl.hosts: support domain-sections
Tero Marttila <terom@paivola.fi>
parents: 282
diff changeset
   339
    else :
968130f21270 pvl.hosts: support domain-sections
Tero Marttila <terom@paivola.fi>
parents: 282
diff changeset
   340
        raise ValueError("No sections in config")
968130f21270 pvl.hosts: support domain-sections
Tero Marttila <terom@paivola.fi>
parents: 282
diff changeset
   341
968130f21270 pvl.hosts: support domain-sections
Tero Marttila <terom@paivola.fi>
parents: 282
diff changeset
   342
333
7d2601368142 pvl.hosts: implement support for domain-level include=...
Tero Marttila <terom@paivola.fi>
parents: 331
diff changeset
   343
def apply_hosts_file (options, file, parent=None) :
277
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   344
    """
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   345
        Load Hosts from a file.
287
968130f21270 pvl.hosts: support domain-sections
Tero Marttila <terom@paivola.fi>
parents: 282
diff changeset
   346
277
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   347
    """
287
968130f21270 pvl.hosts: support domain-sections
Tero Marttila <terom@paivola.fi>
parents: 282
diff changeset
   348
    
968130f21270 pvl.hosts: support domain-sections
Tero Marttila <terom@paivola.fi>
parents: 282
diff changeset
   349
    # use file basename as default
333
7d2601368142 pvl.hosts: implement support for domain-level include=...
Tero Marttila <terom@paivola.fi>
parents: 331
diff changeset
   350
    path = file.name
7d2601368142 pvl.hosts: implement support for domain-level include=...
Tero Marttila <terom@paivola.fi>
parents: 331
diff changeset
   351
    name = os.path.basename(path)
383
87b49aa52b3d pvl.hosts: better reporting of ParseErrors (with filename:line), and implement down = ... setting
Tero Marttila <terom@paivola.fi>
parents: 381
diff changeset
   352
87b49aa52b3d pvl.hosts: better reporting of ParseErrors (with filename:line), and implement down = ... setting
Tero Marttila <terom@paivola.fi>
parents: 381
diff changeset
   353
    try :
87b49aa52b3d pvl.hosts: better reporting of ParseErrors (with filename:line), and implement down = ... setting
Tero Marttila <terom@paivola.fi>
parents: 381
diff changeset
   354
        config = configobj.ConfigObj(file,
87b49aa52b3d pvl.hosts: better reporting of ParseErrors (with filename:line), and implement down = ... setting
Tero Marttila <terom@paivola.fi>
parents: 381
diff changeset
   355
                encoding    = options.hosts_charset,
87b49aa52b3d pvl.hosts: better reporting of ParseErrors (with filename:line), and implement down = ... setting
Tero Marttila <terom@paivola.fi>
parents: 381
diff changeset
   356
        )
87b49aa52b3d pvl.hosts: better reporting of ParseErrors (with filename:line), and implement down = ... setting
Tero Marttila <terom@paivola.fi>
parents: 381
diff changeset
   357
    except configobj.ParseError as ex :
87b49aa52b3d pvl.hosts: better reporting of ParseErrors (with filename:line), and implement down = ... setting
Tero Marttila <terom@paivola.fi>
parents: 381
diff changeset
   358
        raise HostConfigError("%s:%d: %s" % (path, ex.line_number, ex))
87b49aa52b3d pvl.hosts: better reporting of ParseErrors (with filename:line), and implement down = ... setting
Tero Marttila <terom@paivola.fi>
parents: 381
diff changeset
   359
    
287
968130f21270 pvl.hosts: support domain-sections
Tero Marttila <terom@paivola.fi>
parents: 282
diff changeset
   360
    
333
7d2601368142 pvl.hosts: implement support for domain-level include=...
Tero Marttila <terom@paivola.fi>
parents: 331
diff changeset
   361
    return apply_hosts_config(options, path, name, config, parent=parent)
277
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   362
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   363
def apply_hosts (options, files) :
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   364
    """
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   365
        Load Hosts from files.
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   366
    """
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   367
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   368
    for file in files :
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   369
        for host in apply_hosts_file(options, file) :
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   370
            yield host
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   371
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   372
def sort_hosts (options, hosts) :
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   373
    """
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   374
        Yields hosts with a sorting key.
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   375
    """
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   376
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   377
    for host in hosts :
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   378
        if host.ip :
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   379
            sort = host.ip
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   380
        else :
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   381
            # sorts first
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   382
            sort = ipaddr.IPAddress(0)
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   383
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   384
        yield sort, host
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   385
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   386
def apply (options, args) :
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   387
    """
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   388
        Load Hosts from arguments.
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   389
    """
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   390
    
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   391
    # without unicode
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   392
    files = pvl.args.apply_files(args, 'r')
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   393
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   394
    # load configs
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   395
    hosts = apply_hosts(options, files)
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   396
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   397
    # sort
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   398
    hosts = list(sort_hosts(options, hosts))
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   399
    hosts.sort()
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   400
    hosts = [host for sort, host in hosts]
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   401
    
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   402
    return hosts