]> git.llucax.com Git - software/pymin.git/blob - services/dhcp/__init__.py
Implement DhcpdHandler class.
[software/pymin.git] / services / dhcp / __init__.py
1 # vim: set encoding=utf-8 et sw=4 sts=4 :
2
3 try:
4     import cPickle as pickle
5 except ImportError:
6     import pickle
7
8 from mako.template import Template
9 from mako.runtime import Context
10
11 class Host:
12     def __init__(self, name, ip, mac):
13         self.name = name
14         self.ip = ip
15         self.mac = mac
16     def __repr__(self):
17         return 'Host(name="%s", ip="%s", mac="%s")' % (
18                      self.name, self.ip, self.mac)
19
20 class HostHandler:
21
22     def __init__(self, hosts):
23         self.hosts = hosts
24
25     def add(self, name, ip, mac):
26         #deberia indexar por hostname o por ip? o por mac? :)
27         # Mejor por nada...
28         self.hosts[name] = Host(name, ip, mac)
29
30     def update(self, name, ip=None, mac=None):
31         if ip is not None:
32             self.hosts[name].ip = ip
33         if mac is not None:
34             self.hosts[name].mac = mac
35
36     def delete(self, name):
37         del self.hosts[name]
38
39     def list(self):
40         return ','.join(self.hosts)
41
42     def show(self):
43         hosts = self.hosts.values()
44         return '\n'.join('%s,%s,%s' % (h.name, h.ip, h.mac) for h in hosts)
45
46 class DhcpHandler:
47     r"""class that handles DHCP service using dhcpd program"""
48
49     def __init__(self):
50         self.hosts = dict()
51         self.vars = dict(
52             domain_name = 'my_domain_name',
53             dns_1       = 'my_ns1',
54             dns_2       = 'my_ns2',
55             net_address = '192.168.0.0',
56             net_mask    = '255.255.255.0',
57             net_start   = '192.168.0.100',
58             net_end     = '192.168.0.200',
59             net_gateway = '192.168.0.1',
60         )
61         self.host = HostHandler(self.hosts)
62
63     def set(self, param, value):
64         if param in self.vars:
65             self.vars[param] = value
66         else:
67             raise KeyError("Parameter " + param + " not found")
68
69     def list(self):
70         return ','.join(self.vars)
71
72     def show(self):
73         return '\n'.join(('%s,%s' % (k, v) for (k, v) in self.vars.items()))
74
75     def start(self):
76         #esto seria para poner en una interfaz
77         #y seria el hook para arrancar el servicio
78         pass
79
80     def stop(self):
81         #esto seria para poner en una interfaz
82         #y seria el hook para arrancar el servicio
83         pass
84
85     def commit(self):
86         #esto seria para poner en una interfaz
87         #y seria que hace el pickle deberia llamarse
88         #al hacerse un commit
89         pickle.dump(self.vars, file('pickled/vars.pkl', 'wb'), 2)
90         pickle.dump(self.hosts, file('pickled/hosts.pkl', 'wb'), 2)
91         tpl = Template(filename='templates/dhcpd.conf')
92         ctx = Context(file('generated/dhcpd.conf', 'w'),
93                         hosts=self.hosts.values(), **self.vars)
94         tpl.render_context(ctx)
95
96 if __name__ == '__main__':
97
98     config = DhcpHandler()
99
100     config.host.add('my_name','192.168.0.102','00:12:ff:56')
101
102     config.host.update('my_name','192.168.0.192','00:12:ff:56')
103
104     config.host.add('nico','192.168.0.188','00:00:00:00')
105
106     config.set('domain_name','baryon.com.ar')
107
108     try:
109         config.set('sarasa','baryon.com.ar')
110     except KeyError, e:
111         print 'Error:', e
112
113     config.commit()
114
115     print 'Variables:', config.list()
116     print config.show()
117
118     print 'Hosts:', config.host.list()
119     print config.host.show()
120
121     vars = pickle.load(file('pickled/vars.pkl'))
122     hosts = pickle.load(file('pickled/hosts.pkl'))
123     print 'Pickled vars:', vars
124     print 'Pickled hosts:', hosts
125