author | Tero Marttila <terom@paivola.fi> |
Sun, 10 Feb 2013 19:08:53 +0200 | |
changeset 211 | cf74bbb95d2b |
child 212 | c2bbde4007aa |
permissions | -rw-r--r-- |
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 |