pvl/dhcp/rule.py
author Tero Marttila <terom@paivola.fi>
Tue, 10 Mar 2015 00:11:43 +0200
changeset 739 5149c39f3dfc
parent 214 e314447c5621
permissions -rw-r--r--
pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
211
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     1
"""
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     2
    Match DHCP clients by network.
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     3
"""
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     4
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     5
import optparse
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     6
import configobj
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     7
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     8
from pvl.verkko.utils import IPv4Address, IPv4Network
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     9
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    10
import logging; log = logging.getLogger('pvl.dhcp.rule')
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    11
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    12
def parser (parser) :
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    13
    """
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    14
        Optparse options for DHCPRule
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    15
    """
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    16
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    17
    parser.set_defaults(
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    18
            dhcp_network        = [],
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    19
            dhcp_gateway        = [],
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    20
    )
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    21
 
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    22
    parser = optparse.OptionGroup(parser, "DHCP host/lease matching")
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    23
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    24
    parser.add_option('--dhcp-rules',               metavar='CONF',
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    25
            help="dhcp plugin instances by network/gateway")
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    26
214
e314447c5621 pvl.dhcp.DHCPRule: change --dhcp-network/gateway to select matching by network/gateway
Tero Marttila <terom@paivola.fi>
parents: 212
diff changeset
    27
    parser.add_option('--dhcp-network',             action='store_true',
211
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    28
            help="dhcp plugin instance by network")
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    29
214
e314447c5621 pvl.dhcp.DHCPRule: change --dhcp-network/gateway to select matching by network/gateway
Tero Marttila <terom@paivola.fi>
parents: 212
diff changeset
    30
    parser.add_option('--dhcp-gateway',             action='store_true',
211
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    31
            help="dhcp plugin instance by gateway")
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    32
   
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    33
    return parser
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    34
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    35
def apply (options) :
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    36
    """
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    37
        Return DHCPRule from options.
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    38
    """
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    39
214
e314447c5621 pvl.dhcp.DHCPRule: change --dhcp-network/gateway to select matching by network/gateway
Tero Marttila <terom@paivola.fi>
parents: 212
diff changeset
    40
    if options.dhcp_rules :
e314447c5621 pvl.dhcp.DHCPRule: change --dhcp-network/gateway to select matching by network/gateway
Tero Marttila <terom@paivola.fi>
parents: 212
diff changeset
    41
        return DHCPRule.load(options, open(options.dhcp_rules))
e314447c5621 pvl.dhcp.DHCPRule: change --dhcp-network/gateway to select matching by network/gateway
Tero Marttila <terom@paivola.fi>
parents: 212
diff changeset
    42
    else :
e314447c5621 pvl.dhcp.DHCPRule: change --dhcp-network/gateway to select matching by network/gateway
Tero Marttila <terom@paivola.fi>
parents: 212
diff changeset
    43
        return DHCPRule()
211
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    44
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    45
class DHCPRule (object) :
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    46
    """
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    47
        A rule matching DHCP hosts/leases by gateway/network.
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    48
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    49
        Note that leases don't have a gateway, but they're assumed to be valid, so we just ignore any gateway criteria for for unknown gateways.
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    50
    """
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    51
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    52
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    53
    @classmethod
214
e314447c5621 pvl.dhcp.DHCPRule: change --dhcp-network/gateway to select matching by network/gateway
Tero Marttila <terom@paivola.fi>
parents: 212
diff changeset
    54
    def load (cls, options, file, name=None) :
211
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    55
        """
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    56
            Load from config file.
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    57
        """
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    58
        
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    59
        config = configobj.ConfigObj(file)
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    60
214
e314447c5621 pvl.dhcp.DHCPRule: change --dhcp-network/gateway to select matching by network/gateway
Tero Marttila <terom@paivola.fi>
parents: 212
diff changeset
    61
        return cls.load_section(options, name, config)
211
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    62
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    63
    @classmethod
214
e314447c5621 pvl.dhcp.DHCPRule: change --dhcp-network/gateway to select matching by network/gateway
Tero Marttila <terom@paivola.fi>
parents: 212
diff changeset
    64
    def load_section (cls, options, name, section) :
211
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    65
        """
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    66
            Rule from sub-sections and section.
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    67
        """
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    68
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    69
        # recurse
214
e314447c5621 pvl.dhcp.DHCPRule: change --dhcp-network/gateway to select matching by network/gateway
Tero Marttila <terom@paivola.fi>
parents: 212
diff changeset
    70
        rules = tuple(cls.load_section(options, subsection, section[subsection]) for subsection in section.sections)
211
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    71
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    72
        # rule
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    73
        attrs = dict((name, section[name]) for name in section.scalars)
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    74
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    75
        try :
214
e314447c5621 pvl.dhcp.DHCPRule: change --dhcp-network/gateway to select matching by network/gateway
Tero Marttila <terom@paivola.fi>
parents: 212
diff changeset
    76
            return cls.config(options, name, rules, **attrs)
211
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    77
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    78
        except ValueError as ex :
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    79
            raise ValueError("[%s] %s" % (name, ex))
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    80
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    81
    @classmethod
214
e314447c5621 pvl.dhcp.DHCPRule: change --dhcp-network/gateway to select matching by network/gateway
Tero Marttila <terom@paivola.fi>
parents: 212
diff changeset
    82
    def config (cls, options, name, rules, gateway=None, network=None, interval=None) :
211
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    83
        """
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    84
            Rule from section.
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    85
        """
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    86
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    87
        if interval :
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    88
            log.warn("%s: interval: not implemented", name)
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    89
214
e314447c5621 pvl.dhcp.DHCPRule: change --dhcp-network/gateway to select matching by network/gateway
Tero Marttila <terom@paivola.fi>
parents: 212
diff changeset
    90
        if network and options.dhcp_network :
211
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    91
            network = IPv4Network(network)
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    92
        else :
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    93
            network = None
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    94
214
e314447c5621 pvl.dhcp.DHCPRule: change --dhcp-network/gateway to select matching by network/gateway
Tero Marttila <terom@paivola.fi>
parents: 212
diff changeset
    95
        if gateway and options.dhcp_gateway :
e314447c5621 pvl.dhcp.DHCPRule: change --dhcp-network/gateway to select matching by network/gateway
Tero Marttila <terom@paivola.fi>
parents: 212
diff changeset
    96
            gateway = gateway
e314447c5621 pvl.dhcp.DHCPRule: change --dhcp-network/gateway to select matching by network/gateway
Tero Marttila <terom@paivola.fi>
parents: 212
diff changeset
    97
        else :
e314447c5621 pvl.dhcp.DHCPRule: change --dhcp-network/gateway to select matching by network/gateway
Tero Marttila <terom@paivola.fi>
parents: 212
diff changeset
    98
            gateway = None
e314447c5621 pvl.dhcp.DHCPRule: change --dhcp-network/gateway to select matching by network/gateway
Tero Marttila <terom@paivola.fi>
parents: 212
diff changeset
    99
211
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   100
        return cls(name, rules,
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   101
                gateway     = gateway, 
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   102
                network     = network,
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   103
        )
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   104
214
e314447c5621 pvl.dhcp.DHCPRule: change --dhcp-network/gateway to select matching by network/gateway
Tero Marttila <terom@paivola.fi>
parents: 212
diff changeset
   105
    def __init__ (self, name=None, rules=(), gateway=None, network=None) :
211
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   106
        """
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   107
            Match as name by gateway/network.
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   108
        """
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   109
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   110
        self.name = name
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   111
        self.rules = rules
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   112
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   113
        self.gateway = gateway
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   114
        self.network = network
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   115
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   116
        log.info("%s: gateway=%s, network=%s: %s", name, gateway, network, ' '.join(str(rule) for rule in rules))
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   117
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   118
    def match (self, host) :
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   119
        """
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   120
            Match against given host.
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   121
        """
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   122
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   123
        if self.gateway :
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   124
            gateway = host.get('gw')
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   125
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   126
            if gateway and gateway != self.gateway :
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   127
                gateway = False
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   128
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   129
        else :
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   130
            gateway = None
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   131
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   132
        if self.network :
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   133
            network = host.get('ip')
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   134
            
212
c2bbde4007aa pvl.dhcp.DHCPRule: fix network match
Tero Marttila <terom@paivola.fi>
parents: 211
diff changeset
   135
            if network and network not in self.network :
211
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   136
                network = False
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   137
        else :
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   138
            network = None
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   139
        
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   140
        # decide
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   141
        if network is False or gateway is False :
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   142
            # negative
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   143
            return False
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   144
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   145
        elif network or gateway :
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   146
            # (partial) positive
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   147
            return True
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   148
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   149
        else :
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   150
            # unknown
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   151
            return None
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   152
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   153
    def apply (self, host) :
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   154
        """
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   155
            Match { gw: str, ip: IPv4Address } against our rule and any sub rules, returning matching DHCPHostRule, or None.
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   156
        """
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   157
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   158
        match = self.match(host)
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   159
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   160
        log.debug("%s: match: %s: %s", self, host, match)
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   161
            
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   162
        if match is False :
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   163
            # negative
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   164
            return
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   165
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   166
        for rule in self.rules :
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   167
            apply = rule.apply(host)
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   168
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   169
            if apply :
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   170
                return apply
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   171
        
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   172
        log.debug("%s: apply: %s", self, host)
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   173
        
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   174
        if match :
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   175
            # positive
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   176
            return self
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   177
        else :
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   178
            # unknown
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   179
            return None
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   180
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   181
    def __str__ (self) :
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   182
        return self.name or ''
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   183
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   184