]> git.llucax.com Git - software/pymin.git/blob - services/dhcp/handler.py
c33a555ab31c4fcc989e67456b4f619efd0c0800
[software/pymin.git] / services / dhcp / handler.py
1 # vim: set encoding=utf-8 et sw=4 sts=4 :
2
3 from os import path
4 import logging ; log = logging.getLogger('pymin.services.dhcp')
5
6 from pymin.seqtools import Sequence
7 from pymin.dispatcher import Handler, handler, HandlerError
8 from pymin.service.util import Restorable, ConfigWriter, InitdHandler, \
9                                TransactionalHandler, ParametersHandler, \
10                                DictSubHandler, ReloadHandler
11
12 __all__ = ('DhcpHandler', 'get_service')
13
14
15 def get_service(config):
16     return DhcpHandler(config.dhcp.pickle_dir, config.dhcp.config_dir)
17
18
19 class Host(Sequence):
20     r"""Host(name, ip, mac) -> Host instance :: Class representing a host.
21
22     name - Host name, should be a fully qualified name, but no checks are done.
23     ip - IP assigned to the hostname.
24     mac - MAC address to associate to the hostname.
25     """
26
27     def __init__(self, name, ip, mac):
28         r"Initialize Host object, see class documentation for details."
29         self.name = name
30         self.ip = ip
31         self.mac = mac
32
33     def as_tuple(self):
34         r"Return a tuple representing the host."
35         return (self.name, self.ip, self.mac)
36
37     def update(self, ip=None, mac=None):
38         if ip is not None:
39             self.ip = ip
40         if mac is not None:
41             self.mac = mac
42
43 class HostHandler(DictSubHandler):
44     r"""HostHandler(parent) -> HostHandler instance :: Handle a list of hosts.
45
46     This class is a helper for DhcpHandler to do all the work related to hosts
47     administration.
48     """
49
50     handler_help = u"Manage DHCP hosts"
51
52     _cont_subhandler_attr = 'hosts'
53     _cont_subhandler_class = Host
54
55 class DhcpHandler(Restorable, ConfigWriter, ReloadHandler, TransactionalHandler,
56                   ParametersHandler, InitdHandler):
57     r"""DhcpHandler([pickle_dir[, config_dir]]) -> DhcpHandler instance.
58
59     Handles DHCP service commands for the dhcpd program.
60
61     pickle_dir - Directory where to write the persistent configuration data.
62
63     config_dir - Directory where to store de generated configuration files.
64
65     Both defaults to the current working directory.
66     """
67
68     handler_help = u"Manage DHCP service"
69
70     _initd_name = 'dhcpd'
71
72     _persistent_attrs = ('params', 'hosts')
73
74     _restorable_defaults = dict(
75             hosts = dict(),
76             params  = dict(
77                 domain_name = 'example.com',
78                 dns_1       = 'ns1.example.com',
79                 dns_2       = 'ns2.example.com',
80                 net_address = '192.168.0.0',
81                 net_mask    = '255.255.255.0',
82                 net_start   = '192.168.0.100',
83                 net_end     = '192.168.0.200',
84                 net_gateway = '192.168.0.1',
85             ),
86     )
87
88     _config_writer_files = 'dhcpd.conf'
89     _config_writer_tpl_dir = path.join(path.dirname(__file__), 'templates')
90
91     def __init__(self, pickle_dir='.', config_dir='.'):
92         r"Initialize DhcpHandler object, see class documentation for details."
93         log.debug(u'DhcpHandler(%r, %r)', pickle_dir, config_dir)
94         self._persistent_dir = pickle_dir
95         self._config_writer_cfg_dir = config_dir
96         self._config_build_templates()
97         InitdHandler.__init__(self)
98         self.host = HostHandler(self)
99
100     def _get_config_vars(self, config_file):
101         return dict(hosts=self.hosts.values(), **self.params)
102
103
104 if __name__ == '__main__':
105
106     logging.basicConfig(
107         level   = logging.DEBUG,
108         format  = '%(asctime)s %(levelname)-8s %(message)s',
109         datefmt = '%H:%M:%S',
110     )
111
112     import os
113
114     h = DhcpHandler()
115
116     def dump():
117         print '-' * 80
118         print 'Variables:', h.list()
119         print h.show()
120         print
121         print 'Hosts:', h.host.list()
122         print h.host.show()
123         print '-' * 80
124
125     dump()
126
127     h.host.add('my_name','192.168.0.102','00:12:ff:56')
128
129     h.host.update('my_name','192.168.0.192','00:12:ff:56')
130
131     h.host.add('nico','192.168.0.188','00:00:00:00')
132
133     h.set('domain_name','baryon.com.ar')
134
135     try:
136         h.set('sarasa','baryon.com.ar')
137     except KeyError, e:
138         print 'Error:', e
139
140     h.commit()
141
142     dump()
143
144     os.system('rm -f *.pkl ' + ' '.join(h._config_writer_files))
145