author | Tero Marttila <terom@paivola.fi> |
Sat, 26 Jul 2014 13:52:51 +0300 | |
changeset 422 | 56ba4bef5016 |
parent 256 | 63b285ceae41 |
permissions | -rw-r--r-- |
255
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
1 |
""" |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
2 |
Simple parser for ISC dhcpd config files. |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
3 |
""" |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
4 |
|
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
5 |
import logging; log = logging.getLogger('pvl.dhcp.config') |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
6 |
|
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
7 |
class DHCPConfigParser (object) : |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
8 |
""" |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
9 |
Simplistic parser for a dhcpd.leases file. |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
10 |
|
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
11 |
Doesn't implement the full spec, but a useful approximation. |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
12 |
""" |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
13 |
|
256
63b285ceae41
pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents:
255
diff
changeset
|
14 |
@classmethod |
63b285ceae41
pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents:
255
diff
changeset
|
15 |
def load (cls, file) : |
63b285ceae41
pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents:
255
diff
changeset
|
16 |
return cls().parse_file(file) |
63b285ceae41
pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents:
255
diff
changeset
|
17 |
|
255
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
18 |
def __init__ (self) : |
256
63b285ceae41
pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents:
255
diff
changeset
|
19 |
self.stack = [] |
255
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
20 |
self.block = None |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
21 |
self.items = [] |
256
63b285ceae41
pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents:
255
diff
changeset
|
22 |
self.blocks = [] |
255
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
23 |
|
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
24 |
@classmethod |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
25 |
def split (cls, line) : |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
26 |
""" |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
27 |
Split given line-data. |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
28 |
|
256
63b285ceae41
pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents:
255
diff
changeset
|
29 |
>>> split = DHCPConfigParser.split |
255
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
30 |
>>> split('foo bar') |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
31 |
['foo', 'bar'] |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
32 |
>>> split('"foo"') |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
33 |
['foo'] |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
34 |
>>> split('foo "asdf quux" bar') |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
35 |
['foo', 'asdf quux', 'bar'] |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
36 |
>>> split('foo "asdf quux"') |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
37 |
['foo', 'asdf quux'] |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
38 |
""" |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
39 |
|
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
40 |
# parse out one str |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
41 |
if '"' in line : |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
42 |
log.debug("%s", line) |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
43 |
|
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
44 |
# crude |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
45 |
pre, line = line.split('"', 1) |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
46 |
data, post = line.rsplit('"', 1) |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
47 |
|
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
48 |
return pre.split() + [data] + post.split() |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
49 |
else : |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
50 |
return line.split() |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
51 |
|
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
52 |
@classmethod |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
53 |
def lex (self, line) : |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
54 |
""" |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
55 |
Yield tokens from the given lines. |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
56 |
|
256
63b285ceae41
pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents:
255
diff
changeset
|
57 |
>>> lex = DHCPConfigParser.lex |
255
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
58 |
>>> list(lex('foo;')) |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
59 |
[('item', ['foo'])] |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
60 |
>>> list(item for line in ['foo {', ' bar;', '}'] for item in lex(line)) |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
61 |
[('open', ['foo']), ('item', ['bar']), ('close', None)] |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
62 |
|
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
63 |
""" |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
64 |
|
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
65 |
log.debug("%s", line) |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
66 |
|
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
67 |
# comments? |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
68 |
if '#' in line : |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
69 |
line, comment = line.split('#', 1) |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
70 |
else : |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
71 |
comment = None |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
72 |
|
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
73 |
# clean? |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
74 |
line = line.strip() |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
75 |
|
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
76 |
# parse |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
77 |
if not line : |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
78 |
# ignore, empty/comment |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
79 |
return |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
80 |
|
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
81 |
elif line.startswith('uid') : |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
82 |
# XXX: too hard to parse properly |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
83 |
return |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
84 |
|
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
85 |
elif '{' in line : |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
86 |
decl, line = line.split('{', 1) |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
87 |
|
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
88 |
# we are in a new decl |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
89 |
yield 'open', self.split(decl) |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
90 |
|
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
91 |
elif ';' in line : |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
92 |
param, line = line.split(';', 1) |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
93 |
|
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
94 |
# a stanza |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
95 |
yield 'item', self.split(param) |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
96 |
|
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
97 |
elif '}' in line : |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
98 |
close, line = line.split('}', 1) |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
99 |
|
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
100 |
if close.strip() : |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
101 |
log.warn("Predata on close: %s", close) |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
102 |
|
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
103 |
# end |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
104 |
yield 'close', None |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
105 |
|
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
106 |
else : |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
107 |
log.warn("Unknown line: %s", line) |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
108 |
return |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
109 |
|
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
110 |
# got the whole line? |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
111 |
if line.strip() : |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
112 |
log.warn("Data remains: %s", line) |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
113 |
|
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
114 |
def push_block (self, block) : |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
115 |
""" |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
116 |
Open new block. |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
117 |
""" |
256
63b285ceae41
pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents:
255
diff
changeset
|
118 |
|
63b285ceae41
pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents:
255
diff
changeset
|
119 |
self.stack.append((self.block, self.items, self.blocks)) |
255
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
120 |
|
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
121 |
self.block = block |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
122 |
self.items = [] |
256
63b285ceae41
pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents:
255
diff
changeset
|
123 |
self.blocks = [] |
255
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
124 |
|
256
63b285ceae41
pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents:
255
diff
changeset
|
125 |
def feed_item (self, item) : |
255
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
126 |
""" |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
127 |
Add item to block |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
128 |
""" |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
129 |
|
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
130 |
self.items.append(item) |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
131 |
|
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
132 |
def pop_block (self) : |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
133 |
""" |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
134 |
Close block. Returns |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
135 |
(block, [items]) |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
136 |
""" |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
137 |
|
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
138 |
assert self.block |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
139 |
|
256
63b285ceae41
pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents:
255
diff
changeset
|
140 |
block = (self.block, self.items, self.blocks) |
255
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
141 |
|
256
63b285ceae41
pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents:
255
diff
changeset
|
142 |
self.block, self.items, self.blocks = self.stack.pop(-1) |
255
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
143 |
|
256
63b285ceae41
pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents:
255
diff
changeset
|
144 |
self.blocks.append(block) |
255
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
145 |
|
256
63b285ceae41
pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents:
255
diff
changeset
|
146 |
return block |
63b285ceae41
pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents:
255
diff
changeset
|
147 |
|
63b285ceae41
pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents:
255
diff
changeset
|
148 |
def parse_line (self, line) : |
255
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
149 |
""" |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
150 |
Parse given line, yielding any complete blocks that come out. |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
151 |
|
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
152 |
Yields (block, [ lines ]) tuples. |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
153 |
|
256
63b285ceae41
pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents:
255
diff
changeset
|
154 |
>>> parser = DHCPConfigParser() |
255
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
155 |
>>> list(parser.parse_lines(['foo {', ' bar;', ' quux asdf;', '}'])) |
256
63b285ceae41
pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents:
255
diff
changeset
|
156 |
[(['foo'], [['bar'], ['quux', 'asdf']], [])] |
255
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
157 |
|
256
63b285ceae41
pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents:
255
diff
changeset
|
158 |
>>> parser = DHCPConfigParser() |
63b285ceae41
pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents:
255
diff
changeset
|
159 |
>>> list(parser.parse_line('foo {')) |
255
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
160 |
[] |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
161 |
>>> list(parser.parse_lines([' bar;', ' quux asdf;'])) |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
162 |
[] |
256
63b285ceae41
pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents:
255
diff
changeset
|
163 |
>>> list(parser.parse_line('}')) |
63b285ceae41
pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents:
255
diff
changeset
|
164 |
[(['foo'], [['bar'], ['quux', 'asdf']], [])] |
255
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
165 |
""" |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
166 |
|
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
167 |
for token, args in self.lex(line) : |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
168 |
#log.debug("%s: %s [block=%s]", token, args, self.block) |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
169 |
|
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
170 |
if token == 'open' : |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
171 |
# open new block |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
172 |
block = args |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
173 |
|
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
174 |
if self.block : |
256
63b285ceae41
pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents:
255
diff
changeset
|
175 |
log.debug("nested block: %s > %s", self.block, block) |
63b285ceae41
pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents:
255
diff
changeset
|
176 |
else : |
63b285ceae41
pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents:
255
diff
changeset
|
177 |
log.debug("open block: %s", block) |
63b285ceae41
pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents:
255
diff
changeset
|
178 |
|
255
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
179 |
self.push_block(block) |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
180 |
|
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
181 |
elif token == 'close' : |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
182 |
log.debug("close block: %s", self.block) |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
183 |
|
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
184 |
# collected block items |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
185 |
yield self.pop_block() |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
186 |
|
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
187 |
# must be within block! |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
188 |
elif token == 'item' : |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
189 |
item = args |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
190 |
|
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
191 |
log.debug("block %s item: %s", self.block, item) |
256
63b285ceae41
pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents:
255
diff
changeset
|
192 |
self.feed_item(item) |
255
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
193 |
|
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
194 |
else : |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
195 |
# ??? |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
196 |
raise KeyError("Unknown token: {0}: {1}".format(token, args)) |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
197 |
|
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
198 |
def parse_lines (self, lines) : |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
199 |
""" |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
200 |
Trivial wrapper around parse to parse multiple lines. |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
201 |
""" |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
202 |
|
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
203 |
for line in lines : |
256
63b285ceae41
pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents:
255
diff
changeset
|
204 |
for item in self.parse_line(line) : |
255
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
205 |
yield item |
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
206 |
|
256
63b285ceae41
pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents:
255
diff
changeset
|
207 |
def parse_file (self, file) : |
63b285ceae41
pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents:
255
diff
changeset
|
208 |
""" |
63b285ceae41
pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents:
255
diff
changeset
|
209 |
Parse an entire file, returning (items, blocks) lists. |
255
d14eda12d966
split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
210 |
|
256
63b285ceae41
pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents:
255
diff
changeset
|
211 |
>>> DHCPConfigParser().parse_file(['foo;', 'barfoo {', 'bar;', '}']) |
63b285ceae41
pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents:
255
diff
changeset
|
212 |
([['foo']], [(['barfoo'], [['bar']], [])]) |
63b285ceae41
pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents:
255
diff
changeset
|
213 |
""" |
63b285ceae41
pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents:
255
diff
changeset
|
214 |
|
63b285ceae41
pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents:
255
diff
changeset
|
215 |
for line in file : |
63b285ceae41
pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents:
255
diff
changeset
|
216 |
for item in self.parse_line(line) : |
63b285ceae41
pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents:
255
diff
changeset
|
217 |
log.debug("%s", item) |
63b285ceae41
pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents:
255
diff
changeset
|
218 |
|
63b285ceae41
pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents:
255
diff
changeset
|
219 |
assert not self.block |
63b285ceae41
pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents:
255
diff
changeset
|
220 |
|
63b285ceae41
pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents:
255
diff
changeset
|
221 |
return self.items, self.blocks |