author | Tero Marttila <terom@paivola.fi> |
Mon, 17 Mar 2014 15:51:08 +0200 | |
changeset 381 | 6fe465ce6d52 |
parent 338 | 9198e2da360e |
permissions | -rwxr-xr-x |
271
4dfa1a939153
pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
1 |
#!/usr/bin/env python |
4dfa1a939153
pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
2 |
|
4dfa1a939153
pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
3 |
import pvl.args |
4dfa1a939153
pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
4 |
import pvl.hosts |
4dfa1a939153
pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
5 |
|
4dfa1a939153
pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
6 |
import configobj |
4dfa1a939153
pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
7 |
import logging; log = logging.getLogger('pvl.hosts-dhcp') |
4dfa1a939153
pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
8 |
import optparse |
4dfa1a939153
pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
9 |
|
284
eb7e2a4c6880
pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents:
271
diff
changeset
|
10 |
def build_host (host, *items) : |
eb7e2a4c6880
pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents:
271
diff
changeset
|
11 |
yield "host {host} {{".format(host=host) |
eb7e2a4c6880
pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents:
271
diff
changeset
|
12 |
for item in items : |
eb7e2a4c6880
pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents:
271
diff
changeset
|
13 |
if isinstance(item, dict) : |
eb7e2a4c6880
pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents:
271
diff
changeset
|
14 |
for setting, value in item.iteritems() : |
eb7e2a4c6880
pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents:
271
diff
changeset
|
15 |
if value : |
eb7e2a4c6880
pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents:
271
diff
changeset
|
16 |
yield "\t{setting:30} {value};".format(setting=setting, value=value) |
eb7e2a4c6880
pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents:
271
diff
changeset
|
17 |
else : |
eb7e2a4c6880
pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents:
271
diff
changeset
|
18 |
raise ValueError("Unknown item: %r", item) |
eb7e2a4c6880
pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents:
271
diff
changeset
|
19 |
yield "}" |
eb7e2a4c6880
pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents:
271
diff
changeset
|
20 |
|
317 | 21 |
def dhcp_quote (value) : |
322
0c3bb9d2f13b
fix filename "None" via dhcp_quote
Tero Marttila <terom@paivola.fi>
parents:
317
diff
changeset
|
22 |
if value is None : |
0c3bb9d2f13b
fix filename "None" via dhcp_quote
Tero Marttila <terom@paivola.fi>
parents:
317
diff
changeset
|
23 |
return None |
0c3bb9d2f13b
fix filename "None" via dhcp_quote
Tero Marttila <terom@paivola.fi>
parents:
317
diff
changeset
|
24 |
else : |
0c3bb9d2f13b
fix filename "None" via dhcp_quote
Tero Marttila <terom@paivola.fi>
parents:
317
diff
changeset
|
25 |
return '"{value}"'.format(value=value) |
317 | 26 |
|
284
eb7e2a4c6880
pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents:
271
diff
changeset
|
27 |
def process_host (options, host) : |
338
9198e2da360e
pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents:
322
diff
changeset
|
28 |
if host.boot : |
9198e2da360e
pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents:
322
diff
changeset
|
29 |
if ':' in host.boot : |
9198e2da360e
pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents:
322
diff
changeset
|
30 |
next_server, filename = host.boot.split(':', 1) |
9198e2da360e
pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents:
322
diff
changeset
|
31 |
elif host.boot.startswith('/') : |
9198e2da360e
pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents:
322
diff
changeset
|
32 |
next_server = None |
9198e2da360e
pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents:
322
diff
changeset
|
33 |
filename = host.boot |
9198e2da360e
pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents:
322
diff
changeset
|
34 |
elif host.boot.endswith(':') : |
9198e2da360e
pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents:
322
diff
changeset
|
35 |
next_server = host.boot |
9198e2da360e
pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents:
322
diff
changeset
|
36 |
filename = None |
284
eb7e2a4c6880
pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents:
271
diff
changeset
|
37 |
else : |
338
9198e2da360e
pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents:
322
diff
changeset
|
38 |
log.error("%s: invalid boot: %s", host, host.boot) |
9198e2da360e
pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents:
322
diff
changeset
|
39 |
else : |
9198e2da360e
pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents:
322
diff
changeset
|
40 |
next_server = filename = None |
271
4dfa1a939153
pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
41 |
|
338
9198e2da360e
pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents:
322
diff
changeset
|
42 |
if set(host.ethernet) == set([0]) : |
9198e2da360e
pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents:
322
diff
changeset
|
43 |
host_fmt = "{host}" |
9198e2da360e
pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents:
322
diff
changeset
|
44 |
elif host.ethernet : |
9198e2da360e
pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents:
322
diff
changeset
|
45 |
host_fmt = "{host}-{index}" |
9198e2da360e
pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents:
322
diff
changeset
|
46 |
else : |
9198e2da360e
pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents:
322
diff
changeset
|
47 |
# nothing there |
9198e2da360e
pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents:
322
diff
changeset
|
48 |
return |
271
4dfa1a939153
pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
49 |
|
338
9198e2da360e
pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents:
322
diff
changeset
|
50 |
if host.owner : |
9198e2da360e
pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents:
322
diff
changeset
|
51 |
yield u"# Owner: {host.owner}".format(host=host) |
9198e2da360e
pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents:
322
diff
changeset
|
52 |
|
9198e2da360e
pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents:
322
diff
changeset
|
53 |
for index, ethernet in host.ethernet.iteritems() : |
9198e2da360e
pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents:
322
diff
changeset
|
54 |
for line in build_host(host_fmt.format(host=host, index=index), |
9198e2da360e
pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents:
322
diff
changeset
|
55 |
{ 'option host-name': dhcp_quote(host) }, |
9198e2da360e
pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents:
322
diff
changeset
|
56 |
{ 'hardware ethernet': ethernet }, |
9198e2da360e
pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents:
322
diff
changeset
|
57 |
{ 'fixed-address': host.ip }, |
9198e2da360e
pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents:
322
diff
changeset
|
58 |
{ 'next-server': next_server }, |
9198e2da360e
pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents:
322
diff
changeset
|
59 |
{ 'filename': dhcp_quote(filename) }, |
9198e2da360e
pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents:
322
diff
changeset
|
60 |
) : |
9198e2da360e
pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents:
322
diff
changeset
|
61 |
yield line |
9198e2da360e
pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents:
322
diff
changeset
|
62 |
|
9198e2da360e
pvl.hosts-dhcp: omit ethernet-less hosts, change owner comment
Tero Marttila <terom@paivola.fi>
parents:
322
diff
changeset
|
63 |
yield "" |
284
eb7e2a4c6880
pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents:
271
diff
changeset
|
64 |
|
eb7e2a4c6880
pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents:
271
diff
changeset
|
65 |
def process_hosts (options, hosts) : |
eb7e2a4c6880
pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents:
271
diff
changeset
|
66 |
for host in hosts : |
eb7e2a4c6880
pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents:
271
diff
changeset
|
67 |
for line in process_host(options, host) : |
eb7e2a4c6880
pvl.hosts-dhcp: boot support
Tero Marttila <terom@paivola.fi>
parents:
271
diff
changeset
|
68 |
yield line |
271
4dfa1a939153
pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
69 |
|
4dfa1a939153
pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
70 |
def apply_conf (options, lines) : |
4dfa1a939153
pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
71 |
for line in lines : |
4dfa1a939153
pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
72 |
print line |
4dfa1a939153
pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
73 |
|
4dfa1a939153
pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
74 |
def main (argv) : |
4dfa1a939153
pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
75 |
""" |
4dfa1a939153
pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
76 |
Generate DHCP host configs from host definitions. |
4dfa1a939153
pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
77 |
""" |
4dfa1a939153
pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
78 |
|
4dfa1a939153
pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
79 |
parser = optparse.OptionParser(main.__doc__) |
4dfa1a939153
pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
80 |
parser.add_option_group(pvl.args.parser(parser)) |
4dfa1a939153
pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
81 |
parser.add_option_group(pvl.hosts.optparser(parser)) |
4dfa1a939153
pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
82 |
|
4dfa1a939153
pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
83 |
options, args = parser.parse_args(argv[1:]) |
4dfa1a939153
pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
84 |
pvl.args.apply(options) |
4dfa1a939153
pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
85 |
|
4dfa1a939153
pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
86 |
# input |
4dfa1a939153
pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
87 |
hosts = pvl.hosts.apply(options, args) |
4dfa1a939153
pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
88 |
|
4dfa1a939153
pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
89 |
# process |
4dfa1a939153
pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
90 |
apply_conf(options, process_hosts(options, hosts)) |
4dfa1a939153
pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
91 |
|
4dfa1a939153
pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
92 |
if __name__ == '__main__': |
4dfa1a939153
pvl.hosts-dhcp: generate dhcp hosts conf
Tero Marttila <terom@paivola.fi>
parents:
diff
changeset
|
93 |
pvl.args.main(main) |