pvl/dhcp/rule.py
author Tero Marttila <terom@paivola.fi>
Sun, 10 Feb 2013 19:08:53 +0200
changeset 211 cf74bbb95d2b
child 212 c2bbde4007aa
permissions -rw-r--r--
pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
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
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    27
    parser.add_option('--dhcp-network',             metavar='NET', action='append',
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
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    30
    parser.add_option('--dhcp-gateway',             metavar='NET', action='append',
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_rules (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
        Yield DHCPRules 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
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    40
    for gateway in options.dhcp_gateway :
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    41
        yield DHCPRule.rule(gateway, gateway=gateway)
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    42
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    43
    for network in options.dhcp_network :
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    44
        yield DHCPRule.rule(network, network=network)
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    45
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    46
    if options.dhcp_rules :
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    47
        yield DHCPRule.load(open(options.dhcp_rules))
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
def apply (options) :
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
        Return DHCPRule from options.
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
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    54
    return DHCPRule(None, tuple(apply_rules(options)))
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
class DHCPRule (object) :
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
        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
    59
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    60
        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
    61
    """
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
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    64
    @classmethod
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    65
    def load (cls, file, name=None) :
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    66
        """
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    67
            Load from config file.
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
        
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    70
        config = configobj.ConfigObj(file)
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
        return cls.load_section(name, config)
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    73
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    74
    @classmethod
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    75
    def load_section (cls, name, section) :
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    76
        """
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    77
            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
    78
        """
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    79
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    80
        # recurse
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    81
        rules = tuple(cls.load_section(subsection, section[subsection]) for subsection in section.sections)
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    82
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    83
        # rule
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    84
        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
    85
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    86
        try :
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    87
            return cls.config(name, rules, **attrs)
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    88
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    89
        except ValueError as ex :
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    90
            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
    91
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    92
    @classmethod
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    93
    def config (cls, name, rules, gateway=None, network=None, interval=None) :
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    94
        """
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    95
            Rule from section.
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    96
        """
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    97
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    98
        if interval :
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    99
            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
   100
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   101
        if network :
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   102
            network = IPv4Network(network)
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   103
        else :
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   104
            network = None
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   105
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   106
        return cls(name, rules,
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   107
                gateway     = gateway, 
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   108
                network     = network,
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
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   111
    @classmethod
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   112
    def rule (cls, name, gateway=None, network=None) :
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   113
        if network :
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   114
            network = IPv4Network(network)
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   115
        else :
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   116
            network = None
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
        return cls(name, (),
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   119
                gateway     = gateway, 
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   120
                network     = network,
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
    def __init__ (self, name, rules, gateway=None, network=None) :
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   124
        """
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   125
            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
   126
        """
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   127
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   128
        self.name = name
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   129
        self.rules = rules
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   130
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   131
        self.gateway = gateway
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   132
        self.network = network
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   133
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   134
        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
   135
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   136
    def match (self, host) :
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   137
        """
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   138
            Match against given host.
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
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   141
        if self.gateway :
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   142
            gateway = host.get('gw')
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   143
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   144
            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
   145
                gateway = False
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   146
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   147
        else :
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   148
            gateway = None
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   149
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   150
        if self.network :
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   151
            network = host.get('ip')
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
            if network and network != self.network :
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   154
                network = False
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   155
        else :
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   156
            network = None
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
        # decide
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   159
        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
   160
            # negative
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   161
            return False
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   162
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   163
        elif network or gateway :
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   164
            # (partial) positive
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   165
            return True
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   166
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   167
        else :
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   168
            # unknown
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   169
            return None
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   170
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   171
    def apply (self, host) :
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   172
        """
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   173
            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
   174
        """
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   175
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   176
        match = self.match(host)
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   177
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   178
        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
   179
            
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   180
        if match is False :
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   181
            # negative
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   182
            return
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
        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
   185
            apply = rule.apply(host)
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   186
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   187
            if apply :
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   188
                return apply
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   189
        
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   190
        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
   191
        
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   192
        if match :
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   193
            # positive
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   194
            return self
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   195
        else :
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   196
            # unknown
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   197
            return None
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   198
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   199
    def __str__ (self) :
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   200
        return self.name or ''
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   201
cf74bbb95d2b pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   202