pvl/hosts.py
author Tero Marttila <terom@paivola.fi>
Sat, 21 Dec 2013 22:57:44 +0200
changeset 329 b3778c190aa5
parent 308 08176bed21e3
child 331 9dda6a0e9826
permissions -rw-r--r--
version 0..0:

pvl.rrd: api.report()
pvl.wlan-syslog: track openwrt hostapd syslog wlan sta activity
pvl.verkko.wlan: basic Table view
pvl.dns-serial
pvl.dns-zone
pvl.dhcp.config: nested blocks
pvl.hosts-import: import hosts from dns/dhcp
pvl.hosts-dns: generate --forward-zone=paivola.fi and --reverse-zone=194.197.235
pvl.hosts-dhcp: generate dhcp hosts conf
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
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     8
import configobj
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     9
import ipaddr
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    10
import optparse
287
968130f21270 pvl.hosts: support domain-sections
Tero Marttila <terom@paivola.fi>
parents: 282
diff changeset
    11
import os.path
277
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    12
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    13
def optparser (parser) :
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    14
    hosts = optparse.OptionGroup(parser, "Hosts input")
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    15
    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
    16
            help="Encoding used for host files")
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    17
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    18
    hosts.add_option('--hosts-domain',          metavar='DOMAIN',
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    19
            help="Default domain for hosts")
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
    return hosts
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    22
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    23
class Host (object) :
308
08176bed21e3 pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents: 307
diff changeset
    24
    # 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
    25
    ALIAS4_FMT = '{host}-ipv4'
08176bed21e3 pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents: 307
diff changeset
    26
    ALIAS6_FMT = '{host}-ipv6'
08176bed21e3 pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents: 307
diff changeset
    27
277
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    28
    @classmethod
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    29
    def expand (cls, options, host, range, ip, **opts) :
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    30
        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
    31
        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
    32
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    33
        for i in range :
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    34
            yield cls.build(options, host(i),
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    35
                    ip  = ip(i),
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    36
                    **opts
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    37
            )
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    38
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    39
    @classmethod
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    40
    def config (cls, options, host, ip=None, **extra) :
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    41
        """
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    42
            Yield Hosts from a config section's scalars.
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    43
        """
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    44
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    45
        if '{' in host :
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    46
            pre, host = host.split('{', 1)
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    47
            range, post = host.rsplit('}', 1)
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    48
            
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    49
            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
    50
            host = pre + "$" + post
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    51
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    52
            for host in cls.expand(options, host, range, ip, **extra) :
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    53
                yield host
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    54
        else :
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    55
            yield cls.build(options, host, ip=ip, **extra)
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    56
    
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    57
    @classmethod
308
08176bed21e3 pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents: 307
diff changeset
    58
    def build (cls, options, host, domain=None, ip=None, ip6=None, owner=None, boot=None, alias=None, alias4=None, alias6=None, **extra) :
277
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    59
        """
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    60
            Return a Host from a config section's scalars.
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    61
        """
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    62
305
e85c95e757eb pvl.hosts: support new alias/ethernet field format
Tero Marttila <terom@paivola.fi>
parents: 299
diff changeset
    63
        if alias :
e85c95e757eb pvl.hosts: support new alias/ethernet field format
Tero Marttila <terom@paivola.fi>
parents: 299
diff changeset
    64
            alias = alias.split()
e85c95e757eb pvl.hosts: support new alias/ethernet field format
Tero Marttila <terom@paivola.fi>
parents: 299
diff changeset
    65
        else :
e85c95e757eb pvl.hosts: support new alias/ethernet field format
Tero Marttila <terom@paivola.fi>
parents: 299
diff changeset
    66
            alias = ()
308
08176bed21e3 pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents: 307
diff changeset
    67
08176bed21e3 pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents: 307
diff changeset
    68
        if alias4 :
08176bed21e3 pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents: 307
diff changeset
    69
            alias4 = alias4.split()
08176bed21e3 pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents: 307
diff changeset
    70
        else :
08176bed21e3 pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents: 307
diff changeset
    71
            alias4 = ()
08176bed21e3 pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents: 307
diff changeset
    72
08176bed21e3 pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents: 307
diff changeset
    73
        if alias6 :
08176bed21e3 pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents: 307
diff changeset
    74
            alias6 = alias6.split()
08176bed21e3 pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents: 307
diff changeset
    75
        else :
08176bed21e3 pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents: 307
diff changeset
    76
            alias6 = ()
305
e85c95e757eb pvl.hosts: support new alias/ethernet field format
Tero Marttila <terom@paivola.fi>
parents: 299
diff changeset
    77
        
e85c95e757eb pvl.hosts: support new alias/ethernet field format
Tero Marttila <terom@paivola.fi>
parents: 299
diff changeset
    78
        ethernet = { }
277
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    79
305
e85c95e757eb pvl.hosts: support new alias/ethernet field format
Tero Marttila <terom@paivola.fi>
parents: 299
diff changeset
    80
        for field, value in extra.iteritems() :
e85c95e757eb pvl.hosts: support new alias/ethernet field format
Tero Marttila <terom@paivola.fi>
parents: 299
diff changeset
    81
            if '.' in field :
e85c95e757eb pvl.hosts: support new alias/ethernet field format
Tero Marttila <terom@paivola.fi>
parents: 299
diff changeset
    82
                field, instance = field.split('.')
e85c95e757eb pvl.hosts: support new alias/ethernet field format
Tero Marttila <terom@paivola.fi>
parents: 299
diff changeset
    83
            else :
e85c95e757eb pvl.hosts: support new alias/ethernet field format
Tero Marttila <terom@paivola.fi>
parents: 299
diff changeset
    84
                instance = None
e85c95e757eb pvl.hosts: support new alias/ethernet field format
Tero Marttila <terom@paivola.fi>
parents: 299
diff changeset
    85
e85c95e757eb pvl.hosts: support new alias/ethernet field format
Tero Marttila <terom@paivola.fi>
parents: 299
diff changeset
    86
            if field == 'ethernet' :
e85c95e757eb pvl.hosts: support new alias/ethernet field format
Tero Marttila <terom@paivola.fi>
parents: 299
diff changeset
    87
                if instance :
e85c95e757eb pvl.hosts: support new alias/ethernet field format
Tero Marttila <terom@paivola.fi>
parents: 299
diff changeset
    88
                    ethernet[instance] = value
e85c95e757eb pvl.hosts: support new alias/ethernet field format
Tero Marttila <terom@paivola.fi>
parents: 299
diff changeset
    89
                else :
e85c95e757eb pvl.hosts: support new alias/ethernet field format
Tero Marttila <terom@paivola.fi>
parents: 299
diff changeset
    90
                    for eth in value.split() :
e85c95e757eb pvl.hosts: support new alias/ethernet field format
Tero Marttila <terom@paivola.fi>
parents: 299
diff changeset
    91
                        ethernet[len(ethernet)] = eth
277
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    92
            else :
306
a1bdb4499c7a pvl.hots: fix Host.build Unknown host field error
Tero Marttila <terom@paivola.fi>
parents: 305
diff changeset
    93
                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
    94
        
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    95
        if domain is None :
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    96
            domain = options.hosts_domain
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    97
        
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    98
        return cls(host,
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    99
                domain      = domain,
282
63135113fe01 pvl.hosts: ip6, boot support
Tero Marttila <terom@paivola.fi>
parents: 277
diff changeset
   100
                ip          = ipaddr.IPv4Address(ip) if ip else None,
63135113fe01 pvl.hosts: ip6, boot support
Tero Marttila <terom@paivola.fi>
parents: 277
diff changeset
   101
                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
   102
                ethernet    = ethernet,
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   103
                alias       = alias,
308
08176bed21e3 pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents: 307
diff changeset
   104
                alias4      = alias4,
08176bed21e3 pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents: 307
diff changeset
   105
                alias6      = alias6,
277
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   106
                owner       = owner,
282
63135113fe01 pvl.hosts: ip6, boot support
Tero Marttila <terom@paivola.fi>
parents: 277
diff changeset
   107
                boot        = boot,
277
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   108
        )
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   109
308
08176bed21e3 pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents: 307
diff changeset
   110
    def __init__ (self, host, domain=None, ip=None, ip6=None, ethernet={ }, alias=(), owner=None, boot=None, alias4=None, alias6=None) :
277
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   111
        """
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   112
            host        - str
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   113
            domain      - str
282
63135113fe01 pvl.hosts: ip6, boot support
Tero Marttila <terom@paivola.fi>
parents: 277
diff changeset
   114
            ip          - ipaddr.IPv4Address
63135113fe01 pvl.hosts: ip6, boot support
Tero Marttila <terom@paivola.fi>
parents: 277
diff changeset
   115
            ip6         - ipaddr.IPv6Address
305
e85c95e757eb pvl.hosts: support new alias/ethernet field format
Tero Marttila <terom@paivola.fi>
parents: 299
diff changeset
   116
            ethernet    - { index: ethernet }
277
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   117
            alias       - list
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   118
            owner       - str: LDAP uid
308
08176bed21e3 pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents: 307
diff changeset
   119
            alias4      - list (CNAME -> A)
08176bed21e3 pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents: 307
diff changeset
   120
            alias6      - list (CNAME -> AAAA)
277
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   121
        """
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   122
        self.host = host
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   123
        self.domain = domain
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   124
        self.ip = ip
282
63135113fe01 pvl.hosts: ip6, boot support
Tero Marttila <terom@paivola.fi>
parents: 277
diff changeset
   125
        self.ip6 = ip6
277
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   126
        self.ethernet = ethernet
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   127
        self.alias = alias
308
08176bed21e3 pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents: 307
diff changeset
   128
        self.alias4 = alias4
08176bed21e3 pvl.hosts: support alias4/6=... for A/AAAA CNAMES
Tero Marttila <terom@paivola.fi>
parents: 307
diff changeset
   129
        self.alias6 = alias6
277
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   130
        self.owner = owner
282
63135113fe01 pvl.hosts: ip6, boot support
Tero Marttila <terom@paivola.fi>
parents: 277
diff changeset
   131
        self.boot = boot
277
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   132
299
df653511caf9 pvl.hosts.Host.fqnd(): assume any host with a . is a fqdn
Tero Marttila <terom@paivola.fi>
parents: 290
diff changeset
   133
    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
   134
        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
   135
            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
   136
        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
   137
            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
   138
        else :
df653511caf9 pvl.hosts.Host.fqnd(): assume any host with a . is a fqdn
Tero Marttila <terom@paivola.fi>
parents: 290
diff changeset
   139
            raise ValueError("%s: have no fqdn/domain" % (self, ))
df653511caf9 pvl.hosts.Host.fqnd(): assume any host with a . is a fqdn
Tero Marttila <terom@paivola.fi>
parents: 290
diff changeset
   140
277
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   141
    def __str__ (self) :
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   142
        return str(self.host)
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   143
287
968130f21270 pvl.hosts: support domain-sections
Tero Marttila <terom@paivola.fi>
parents: 282
diff changeset
   144
def apply_hosts_config (options, config, name, defaults={}) :
968130f21270 pvl.hosts: support domain-sections
Tero Marttila <terom@paivola.fi>
parents: 282
diff changeset
   145
    """
968130f21270 pvl.hosts: support domain-sections
Tero Marttila <terom@paivola.fi>
parents: 282
diff changeset
   146
        Load hosts from a ConfigObj section.
968130f21270 pvl.hosts: support domain-sections
Tero Marttila <terom@paivola.fi>
parents: 282
diff changeset
   147
    """
968130f21270 pvl.hosts: support domain-sections
Tero Marttila <terom@paivola.fi>
parents: 282
diff changeset
   148
968130f21270 pvl.hosts: support domain-sections
Tero Marttila <terom@paivola.fi>
parents: 282
diff changeset
   149
    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
   150
968130f21270 pvl.hosts: support domain-sections
Tero Marttila <terom@paivola.fi>
parents: 282
diff changeset
   151
    if config.sections :
968130f21270 pvl.hosts: support domain-sections
Tero Marttila <terom@paivola.fi>
parents: 282
diff changeset
   152
        # recurse; this is a domain meta-section
307
cc645622024e pvl.hosts.apply_hosts_config() fix domain-section scalar override
Tero Marttila <terom@paivola.fi>
parents: 306
diff changeset
   153
        params = dict(defaults, domain=name)
cc645622024e pvl.hosts.apply_hosts_config() fix domain-section scalar override
Tero Marttila <terom@paivola.fi>
parents: 306
diff changeset
   154
        params.update(**scalars) # override
287
968130f21270 pvl.hosts: support domain-sections
Tero Marttila <terom@paivola.fi>
parents: 282
diff changeset
   155
968130f21270 pvl.hosts: support domain-sections
Tero Marttila <terom@paivola.fi>
parents: 282
diff changeset
   156
        for section in config.sections :
968130f21270 pvl.hosts: support domain-sections
Tero Marttila <terom@paivola.fi>
parents: 282
diff changeset
   157
            for host in apply_hosts_config(options, config[section], section, params) :
968130f21270 pvl.hosts: support domain-sections
Tero Marttila <terom@paivola.fi>
parents: 282
diff changeset
   158
                yield host
968130f21270 pvl.hosts: support domain-sections
Tero Marttila <terom@paivola.fi>
parents: 282
diff changeset
   159
968130f21270 pvl.hosts: support domain-sections
Tero Marttila <terom@paivola.fi>
parents: 282
diff changeset
   160
    elif name :
290
9e626c1e935d pvl.hosts: fix config domain-section name handling
Tero Marttila <terom@paivola.fi>
parents: 287
diff changeset
   161
        params = dict(defaults, **scalars)
9e626c1e935d pvl.hosts: fix config domain-section name handling
Tero Marttila <terom@paivola.fi>
parents: 287
diff changeset
   162
287
968130f21270 pvl.hosts: support domain-sections
Tero Marttila <terom@paivola.fi>
parents: 282
diff changeset
   163
        # this is a host section
290
9e626c1e935d pvl.hosts: fix config domain-section name handling
Tero Marttila <terom@paivola.fi>
parents: 287
diff changeset
   164
        for host in Host.config(options, name, **params) :
287
968130f21270 pvl.hosts: support domain-sections
Tero Marttila <terom@paivola.fi>
parents: 282
diff changeset
   165
            yield host
968130f21270 pvl.hosts: support domain-sections
Tero Marttila <terom@paivola.fi>
parents: 282
diff changeset
   166
968130f21270 pvl.hosts: support domain-sections
Tero Marttila <terom@paivola.fi>
parents: 282
diff changeset
   167
    else :
968130f21270 pvl.hosts: support domain-sections
Tero Marttila <terom@paivola.fi>
parents: 282
diff changeset
   168
        raise ValueError("No sections in config")
968130f21270 pvl.hosts: support domain-sections
Tero Marttila <terom@paivola.fi>
parents: 282
diff changeset
   169
968130f21270 pvl.hosts: support domain-sections
Tero Marttila <terom@paivola.fi>
parents: 282
diff changeset
   170
277
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   171
def apply_hosts_file (options, file) :
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   172
    """
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   173
        Load Hosts from a file.
287
968130f21270 pvl.hosts: support domain-sections
Tero Marttila <terom@paivola.fi>
parents: 282
diff changeset
   174
277
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   175
    """
287
968130f21270 pvl.hosts: support domain-sections
Tero Marttila <terom@paivola.fi>
parents: 282
diff changeset
   176
277
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   177
    config = configobj.ConfigObj(file,
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   178
            encoding    = options.hosts_charset,
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   179
    )
287
968130f21270 pvl.hosts: support domain-sections
Tero Marttila <terom@paivola.fi>
parents: 282
diff changeset
   180
    
968130f21270 pvl.hosts: support domain-sections
Tero Marttila <terom@paivola.fi>
parents: 282
diff changeset
   181
    # use file basename as default
968130f21270 pvl.hosts: support domain-sections
Tero Marttila <terom@paivola.fi>
parents: 282
diff changeset
   182
    name = os.path.basename(file.name)
968130f21270 pvl.hosts: support domain-sections
Tero Marttila <terom@paivola.fi>
parents: 282
diff changeset
   183
    
968130f21270 pvl.hosts: support domain-sections
Tero Marttila <terom@paivola.fi>
parents: 282
diff changeset
   184
    return apply_hosts_config(options, config, name)
277
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   185
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   186
def apply_hosts (options, files) :
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   187
    """
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   188
        Load Hosts from files.
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   189
    """
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   190
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   191
    for file in files :
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   192
        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
   193
            yield host
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   194
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   195
def sort_hosts (options, hosts) :
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   196
    """
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   197
        Yields hosts with a sorting key.
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   198
    """
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   199
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   200
    for host in hosts :
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   201
        if host.ip :
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   202
            sort = host.ip
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   203
        else :
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   204
            # sorts first
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   205
            sort = ipaddr.IPAddress(0)
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   206
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   207
        yield sort, host
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   208
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   209
def apply (options, args) :
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
        Load Hosts from arguments.
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   212
    """
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   213
    
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   214
    # without unicode
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   215
    files = pvl.args.apply_files(args, 'r')
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   216
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   217
    # load configs
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   218
    hosts = apply_hosts(options, files)
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   219
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   220
    # sort
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   221
    hosts = list(sort_hosts(options, hosts))
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   222
    hosts.sort()
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   223
    hosts = [host for sort, host in hosts]
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   224
    
5f0b67ba454f ...add missing pvl.hosts, with dynamic hosts support
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   225
    return hosts