author | Tero Marttila <terom@paivola.fi> |
Sun, 10 Feb 2013 19:08:53 +0200 | |
changeset 211 | cf74bbb95d2b |
parent 174 | 6f339a8a87dc |
child 215 | a0dedd0889f0 |
permissions | -rw-r--r-- |
32
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
1 |
""" |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
2 |
DHCP dhcpd.leases handling/tracking |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
3 |
""" |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
4 |
|
169
a81ca751664d
move pvl.verkko.dhcp and pvl.syslog.dhcp to pvl.dhcp.leases/syslog
Tero Marttila <terom@paivola.fi>
parents:
40
diff
changeset
|
5 |
import pvl.syslog.tail # TailFile |
32
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
6 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
7 |
from datetime import datetime |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
8 |
|
169
a81ca751664d
move pvl.verkko.dhcp and pvl.syslog.dhcp to pvl.dhcp.leases/syslog
Tero Marttila <terom@paivola.fi>
parents:
40
diff
changeset
|
9 |
import logging; log = logging.getLogger('pvl.dhcp.leases') |
32
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
10 |
|
211
cf74bbb95d2b
pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
174
diff
changeset
|
11 |
DHCPD_LEASES = '/var/lib/dhcp/dhcpd.leases' |
cf74bbb95d2b
pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
174
diff
changeset
|
12 |
|
32
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
13 |
class DHCPLeasesParser (object) : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
14 |
""" |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
15 |
Simplistic parser for a dhcpd.leases file. |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
16 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
17 |
Doesn't implement the full spec, but a useful approximation. |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
18 |
""" |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
19 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
20 |
def __init__ (self) : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
21 |
self.block = None |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
22 |
self.items = [] |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
23 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
24 |
@classmethod |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
25 |
def split (cls, line) : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
26 |
""" |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
27 |
Split given line-data. |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
28 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
29 |
>>> split = DHCPLeasesParser.split |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
30 |
>>> split('foo bar') |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
31 |
['foo', 'bar'] |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
32 |
>>> split('"foo"') |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
33 |
['foo'] |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
34 |
>>> split('foo "asdf quux" bar') |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
35 |
['foo', 'asdf quux', 'bar'] |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
36 |
>>> split('foo "asdf quux"') |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
37 |
['foo', 'asdf quux'] |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
38 |
""" |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
39 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
40 |
# parse out one str |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
41 |
if '"' in line : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
42 |
log.debug("%s", line) |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
43 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
44 |
# crude |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
45 |
pre, line = line.split('"', 1) |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
46 |
data, post = line.rsplit('"', 1) |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
47 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
48 |
return pre.split() + [data] + post.split() |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
49 |
else : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
50 |
return line.split() |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
51 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
52 |
@classmethod |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
53 |
def lex (self, line) : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
54 |
""" |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
55 |
Yield tokens from the given lines. |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
56 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
57 |
>>> lex = DHCPLeasesParser.lex |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
58 |
>>> list(lex('foo;')) |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
59 |
[('item', ['foo'])] |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
60 |
>>> list(item for line in ['foo {', ' bar;', '}'] for item in lex(line)) |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
61 |
[('open', ['foo']), ('item', ['bar']), ('close', None)] |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
62 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
63 |
""" |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
64 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
65 |
log.debug("%s", line) |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
66 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
67 |
# comments? |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
68 |
if '#' in line : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
69 |
line, comment = line.split('#', 1) |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
70 |
else : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
71 |
comment = None |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
72 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
73 |
# clean? |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
74 |
line = line.strip() |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
75 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
76 |
# parse |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
77 |
if not line : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
78 |
# ignore, empty/comment |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
79 |
return |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
80 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
81 |
elif line.startswith('uid') : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
82 |
# XXX: too hard to parse properly |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
83 |
return |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
84 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
85 |
elif '{' in line : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
86 |
decl, line = line.split('{', 1) |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
87 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
88 |
# we are in a new decl |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
89 |
yield 'open', self.split(decl) |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
90 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
91 |
elif ';' in line : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
92 |
param, line = line.split(';', 1) |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
93 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
94 |
# a stanza |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
95 |
yield 'item', self.split(param) |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
96 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
97 |
elif '}' in line : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
98 |
close, line = line.split('}', 1) |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
99 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
100 |
if close.strip() : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
101 |
log.warn("Predata on close: %s", close) |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
102 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
103 |
# end |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
104 |
yield 'close', None |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
105 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
106 |
else : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
107 |
log.warn("Unknown line: %s", line) |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
108 |
return |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
109 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
110 |
# got the whole line? |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
111 |
if line.strip() : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
112 |
log.warn("Data remains: %s", line) |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
113 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
114 |
def push_block (self, block) : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
115 |
""" |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
116 |
Open new block. |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
117 |
""" |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
118 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
119 |
# XXX: stack |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
120 |
assert not self.block |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
121 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
122 |
self.block = block |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
123 |
self.items = [] |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
124 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
125 |
def feed_block (self, item) : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
126 |
""" |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
127 |
Add item to block |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
128 |
""" |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
129 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
130 |
assert self.block |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
131 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
132 |
self.items.append(item) |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
133 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
134 |
def pop_block (self) : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
135 |
""" |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
136 |
Close block. Returns |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
137 |
(block, [items]) |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
138 |
""" |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
139 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
140 |
assert self.block |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
141 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
142 |
block, items = self.block, self.items |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
143 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
144 |
self.block = None |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
145 |
self.items = None |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
146 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
147 |
return block, items |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
148 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
149 |
def parse (self, line) : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
150 |
""" |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
151 |
Parse given line, yielding any complete blocks that come out. |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
152 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
153 |
>>> parser = DHCPLeasesParser() |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
154 |
>>> list(parser.parse_lines(['foo {', ' bar;', ' quux asdf;', '}'])) |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
155 |
[(['foo'], [['bar'], ['quux', 'asdf']])] |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
156 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
157 |
>>> parser = DHCPLeasesParser() |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
158 |
>>> list(parser.parse('foo {')) |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
159 |
[] |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
160 |
>>> list(parser.parse_lines([' bar;', ' quux asdf;'])) |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
161 |
[] |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
162 |
>>> list(parser.parse('}')) |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
163 |
[(['foo'], [['bar'], ['quux', 'asdf']])] |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
164 |
""" |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
165 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
166 |
for token, args in self.lex(line) : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
167 |
#log.debug("%s: %s [block=%s]", token, args, self.block) |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
168 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
169 |
if token == 'open' : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
170 |
# open new block |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
171 |
block = args |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
172 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
173 |
if self.block : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
174 |
log.warn("nested blocks: %s > %s", self.block, block) |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
175 |
continue |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
176 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
177 |
log.debug("open block: %s", block) |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
178 |
self.push_block(block) |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
179 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
180 |
elif token == 'close' : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
181 |
log.debug("close block: %s", self.block) |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
182 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
183 |
# collected block items |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
184 |
yield self.pop_block() |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
185 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
186 |
# must be within block! |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
187 |
elif token == 'item' : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
188 |
item = args |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
189 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
190 |
if not self.block : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
191 |
log.warn("token outside block: %s: %s", token, args) |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
192 |
continue |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
193 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
194 |
log.debug("block %s item: %s", self.block, item) |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
195 |
self.feed_block(item) |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
196 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
197 |
else : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
198 |
# ??? |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
199 |
raise KeyError("Unknown token: {0}: {1}".format(token, args)) |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
200 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
201 |
def parse_lines (self, lines) : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
202 |
""" |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
203 |
Trivial wrapper around parse to parse multiple lines. |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
204 |
""" |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
205 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
206 |
for line in lines : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
207 |
for item in self.parse(line) : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
208 |
yield item |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
209 |
|
174
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
210 |
class DHCPLeases (object) : |
32
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
211 |
""" |
174
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
212 |
Process log-structured leases file, updated by dhcpd. |
32
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
213 |
""" |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
214 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
215 |
LEASE_DATES = ('starts', 'ends', 'tstp', 'tsfp', 'atsfp', 'cltt') |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
216 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
217 |
# default format |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
218 |
LEASE_DATE_NEVER = 'never' |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
219 |
LEASE_DATE_FMT_DEFAULT = '%w %Y/%m/%d %H:%M:%S' |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
220 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
221 |
lease_date_fmt = LEASE_DATE_FMT_DEFAULT |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
222 |
|
211
cf74bbb95d2b
pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
174
diff
changeset
|
223 |
def __init__ (self, path=DHCPD_LEASES) : |
32
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
224 |
""" |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
225 |
path - path to dhcpd.leases file |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
226 |
""" |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
227 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
228 |
# tail; handles file re-writes |
174
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
229 |
self.source = pvl.syslog.tail.Tail(path) |
32
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
230 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
231 |
# parser state |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
232 |
self.parser = DHCPLeasesParser() |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
233 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
234 |
# initial leases state |
174
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
235 |
self._leases = None |
32
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
236 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
237 |
def reset (self) : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
238 |
""" |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
239 |
Reset state, if we started to read a new file. |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
240 |
""" |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
241 |
|
174
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
242 |
self._leases = {} |
32
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
243 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
244 |
def process_lease_item_date (self, args) : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
245 |
""" |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
246 |
Process lease-item date spec into datetime. |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
247 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
248 |
Returns None if 'never'. |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
249 |
""" |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
250 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
251 |
data = ' '.join(args) |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
252 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
253 |
if data == self.LEASE_DATE_NEVER : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
254 |
return None |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
255 |
else : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
256 |
return datetime.strptime(data, self.lease_date_fmt) |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
257 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
258 |
def process_lease_item (self, lease, item) : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
259 |
""" |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
260 |
Process a single item from the lease, updating the lease dict |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
261 |
""" |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
262 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
263 |
item = list(item) |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
264 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
265 |
name = item.pop(0) |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
266 |
subname = item[0] if item else None |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
267 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
268 |
if name in self.LEASE_DATES : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
269 |
lease[name] = self.process_lease_item_date(item) |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
270 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
271 |
elif name == 'hardware': |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
272 |
# args |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
273 |
lease['hwtype'], lease['hwaddr'] = item |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
274 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
275 |
elif name == 'uid' : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
276 |
lease['uid'], = item |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
277 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
278 |
elif name == 'client-hostname' : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
279 |
lease['client-hostname'], = item |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
280 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
281 |
elif name == 'abandoned' : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
282 |
lease['abandoned'] = True |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
283 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
284 |
elif name == 'binding' : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
285 |
_state, lease['binding-state'] = item |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
286 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
287 |
elif name == 'next' and subname == 'binding' : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
288 |
_binding, _state, lease['next-binding-state'] = item |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
289 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
290 |
else : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
291 |
log.warn("unknown lease item: %s: %s", name, item) |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
292 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
293 |
def process_lease (self, lease_name, items) : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
294 |
""" |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
295 |
Process given lease block to update our state. |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
296 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
297 |
Returns the lease object, and a possible old lease. |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
298 |
""" |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
299 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
300 |
# replace any existing |
174
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
301 |
lease = self._leases[lease_name] = {} |
32
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
302 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
303 |
# meta |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
304 |
lease['lease'] = lease_name |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
305 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
306 |
# parse items |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
307 |
for item in items : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
308 |
try : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
309 |
self.process_lease_item(lease, item) |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
310 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
311 |
except Exception as ex: |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
312 |
log.warn("Failed to process lease item: %s: %s:", lease_name, item, exc_info=True) |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
313 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
314 |
# k |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
315 |
log.debug("%-15s: %s", lease_name, lease) |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
316 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
317 |
return lease |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
318 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
319 |
def log_lease (self, lease, old_lease=None) : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
320 |
""" |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
321 |
Log given lease transition on stdout. |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
322 |
""" |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
323 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
324 |
# log |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
325 |
if old_lease : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
326 |
log.info("%-15s: %20s @ %8s <- %-8s @ %20s", old_lease['lease'], |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
327 |
old_lease.get('ends', '???'), |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
328 |
old_lease.get('next-binding-state', ''), # optional |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
329 |
old_lease.get('binding-state', '???'), |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
330 |
old_lease.get('starts', '???'), |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
331 |
) |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
332 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
333 |
log.info("%-15s: %20s @ %8s -> %-8s @ %20s", lease['lease'], |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
334 |
lease.get('starts', '???'), |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
335 |
lease.get('binding-state', '???'), |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
336 |
lease.get('next-binding-state', ''), # optional |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
337 |
lease.get('ends', '???'), |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
338 |
) |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
339 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
340 |
def process_block (self, blockdata, log_leases=False) : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
341 |
""" |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
342 |
Process given block (from DHCPLeasesParser.parse()), to update state. |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
343 |
""" |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
344 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
345 |
block, items = blockdata |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
346 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
347 |
type = block.pop(0) |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
348 |
args = block |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
349 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
350 |
if type == 'lease' : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
351 |
if len(args) != 1 : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
352 |
return log.warn("lease block with weird args, ignore: %s", args) |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
353 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
354 |
# the lease address |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
355 |
lease, = args |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
356 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
357 |
log.debug("lease: %s: %s", lease, items) |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
358 |
|
174
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
359 |
if lease in self._leases : |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
360 |
old = self._leases[lease] |
32
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
361 |
else : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
362 |
old = None |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
363 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
364 |
new = self.process_lease(lease, items) |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
365 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
366 |
if log_leases : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
367 |
self.log_lease(new, old) |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
368 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
369 |
return new |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
370 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
371 |
else : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
372 |
log.warn("unknown block: %s: %s", type, args) |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
373 |
|
174
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
374 |
def readleases (self) : |
32
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
375 |
""" |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
376 |
Read new lines from the leases database and update our state. |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
377 |
|
174
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
378 |
Yields changed leases. On startup and on periodic database reset, all leases are yielded. |
32
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
379 |
""" |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
380 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
381 |
# handle file replace by reading until EOF |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
382 |
sync = False |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
383 |
# leases = [] |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
384 |
|
174
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
385 |
if self._leases is None : |
32
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
386 |
# initial sync |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
387 |
self.reset() |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
388 |
sync = True |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
389 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
390 |
# parse in any new lines from TailFile... yields None if the file was replaced |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
391 |
for line in self.source.readlines(eof_mark=True) : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
392 |
if line is None : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
393 |
log.info("Reading new dhcpd.leases") |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
394 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
395 |
# resync |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
396 |
self.reset() |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
397 |
sync = True |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
398 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
399 |
else : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
400 |
# parse |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
401 |
for blockdata in self.parser.parse(line) : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
402 |
# don't log if syncing, only on normal updates (next tail-cycle) |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
403 |
lease = self.process_block(blockdata, log_leases=(not sync)) |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
404 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
405 |
#if not sync : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
406 |
# leases.append(lease) |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
407 |
yield lease |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
408 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
409 |
# if sync : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
410 |
# return True, self.leases.values() |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
411 |
# else : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
412 |
# return False, leases |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
413 |
|
174
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
414 |
__iter__ = readleases |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
415 |
|
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
416 |
def leases (self) : |
32
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
417 |
""" |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
418 |
Iterate over all leases. |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
419 |
""" |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
420 |
|
211
cf74bbb95d2b
pvl.dhcp: split pvl.dhcp.rule.DHCPRule for use with leases
Tero Marttila <terom@paivola.fi>
parents:
174
diff
changeset
|
421 |
return self._leases.itervalues() |
32
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
422 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
423 |
# utils |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
424 |
def lease_state (self, lease) : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
425 |
""" |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
426 |
Get state for lease. |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
427 |
""" |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
428 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
429 |
# count by state |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
430 |
starts = lease.get('starts') |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
431 |
state = lease.get('binding-state', 'unknown') |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
432 |
next_state = lease.get('next-binding-state') |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
433 |
ends = lease.get('ends') |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
434 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
435 |
#log.debug("%-15s: %s: %8s -> %-8s: %s", ip, starts, state, next_state or '', ends) |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
436 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
437 |
if next_state and ends and ends < datetime.now() : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
438 |
# XXX: mark as, "expired", even they next-binding-state is probably "free" |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
439 |
state = 'expired' # lease['next-binding-state'] |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
440 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
441 |
return state |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
442 |
|
174
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
443 |
# XXX: from db.dhcp_leases instead? |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
444 |
import pvl.verkko.db as db |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
445 |
|
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
446 |
class DHCPLeasesDatabase (object) : |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
447 |
""" |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
448 |
pvl.verkko.Database dhcp_leases model for updates. |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
449 |
""" |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
450 |
|
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
451 |
def __init__ (self, db) : |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
452 |
""" |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
453 |
db - pvl.verkko.Database |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
454 |
""" |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
455 |
|
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
456 |
self.db = db |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
457 |
|
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
458 |
def create (self) : |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
459 |
""" |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
460 |
CREATE TABLEs |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
461 |
""" |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
462 |
|
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
463 |
log.info("Creating database tables: dhcp_leases") |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
464 |
db.dhcp_leases.create(self.db.engine, checkfirst=True) |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
465 |
|
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
466 |
def update (self, lease) : |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
467 |
""" |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
468 |
Try an extend an existing lease? |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
469 |
""" |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
470 |
|
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
471 |
c = db.dhcp_leases.c |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
472 |
|
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
473 |
ip = lease['lease'] |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
474 |
mac = lease.get('hwaddr') |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
475 |
starts = lease['starts'] |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
476 |
ends = lease.get('ends') |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
477 |
|
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
478 |
update = db.dhcp_leases.update() |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
479 |
|
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
480 |
# XXX: if ends is None? |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
481 |
if mac : |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
482 |
# renew lease..? |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
483 |
update = update.where((c.ip == ip) & (c.mac == mac) & ((starts < c.ends) | (c.ends == None))) |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
484 |
else : |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
485 |
# new state for lease..? |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
486 |
update = update.where((c.ip == ip) & ((starts < c.ends) | (c.ends == ends))) |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
487 |
|
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
488 |
update = update.values( |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
489 |
state = lease['binding-state'], |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
490 |
next = lease.get('next-binding-state'), |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
491 |
ends = ends, |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
492 |
) |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
493 |
|
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
494 |
if lease.get('client-hostname') : |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
495 |
update = update.values(hostname = lease['client-hostname']) |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
496 |
|
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
497 |
return self.db.update(update) > 0 |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
498 |
|
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
499 |
def insert (self, lease) : |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
500 |
""" |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
501 |
Record a new lease. |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
502 |
""" |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
503 |
|
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
504 |
c = db.dhcp_leases.c |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
505 |
|
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
506 |
query = db.dhcp_leases.insert().values( |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
507 |
ip = lease['lease'], |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
508 |
mac = lease['hwaddr'], |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
509 |
hostname = lease.get('client-hostname'), |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
510 |
|
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
511 |
starts = lease['starts'], |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
512 |
ends = lease.get('ends'), |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
513 |
|
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
514 |
state = lease['binding-state'], |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
515 |
next = lease.get('next-binding-state'), |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
516 |
) |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
517 |
|
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
518 |
return self.db.insert(query) |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
519 |
|
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
520 |
def __call__ (self, lease) : |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
521 |
""" |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
522 |
Process given DHCP lease to update currently active lease, or insert a new one. |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
523 |
|
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
524 |
XXX: transaction? *leases? |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
525 |
""" |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
526 |
|
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
527 |
# update existing? |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
528 |
if self.update(lease) : |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
529 |
log.info("Update: %s", lease) |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
530 |
|
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
531 |
elif lease.get('hwaddr') : |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
532 |
# new |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
533 |
id = self.insert(lease) |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
534 |
|
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
535 |
log.info("Insert: %s -> %d", lease, id) |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
536 |
|
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
537 |
else : |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
538 |
# may be a free lease |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
539 |
log.warn("Ignored lease: %s", lease) |
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
540 |
|
6f339a8a87dc
split pvl.dhcp-leases from pvl.syslog-dhcp using pvl.dhcp.hosts/syslog/leases
Tero Marttila <terom@paivola.fi>
parents:
169
diff
changeset
|
541 |
|
32
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
542 |
if __name__ == '__main__' : |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
543 |
import logging |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
544 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
545 |
logging.basicConfig() |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
546 |
|
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
547 |
import doctest |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
548 |
doctest.testmod() |
12816e361b2d
pvl.verkko.dhcp: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
549 |