X-Git-Url: https://git.llucax.com/software/pymin.git/blobdiff_plain/3eefa8b40b56992b0c96cf085ef9a6059b7c7fc4..d7f91959fe7161589c44463db1031a5819fd1229:/pymin/services/dhcp/__init__.py diff --git a/pymin/services/dhcp/__init__.py b/pymin/services/dhcp/__init__.py index 927f801..51f7ecb 100644 --- a/pymin/services/dhcp/__init__.py +++ b/pymin/services/dhcp/__init__.py @@ -1,60 +1,15 @@ # vim: set encoding=utf-8 et sw=4 sts=4 : from os import path +import logging ; log = logging.getLogger('pymin.services.dhcp') from pymin.seqtools import Sequence from pymin.dispatcher import Handler, handler, HandlerError from pymin.services.util import Restorable, ConfigWriter, InitdHandler, \ - TransactionalHandler, ParametersHandler - -__ALL__ = ('DhcpHandler', 'Error', 'HostError', 'HostAlreadyExistsError', - 'HostNotFoundError') - -class Error(HandlerError): - r""" - Error(message) -> Error instance :: Base DhcpHandler exception class. - - All exceptions raised by the DhcpHandler inherits from this one, so you can - easily catch any DhcpHandler exception. - - message - A descriptive error message. - """ - pass - -class HostError(Error, KeyError): - r""" - HostError(hostname) -> HostError instance - - This is the base exception for all host related errors. - """ - - def __init__(self, hostname): - r"Initialize the object. See class documentation for more info." - self.message = u'Host error: "%s"' % hostname - -class HostAlreadyExistsError(HostError): - r""" - HostAlreadyExistsError(hostname) -> HostAlreadyExistsError instance - - This exception is raised when trying to add a hostname that already exists. - """ - - def __init__(self, hostname): - r"Initialize the object. See class documentation for more info." - self.message = u'Host already exists: "%s"' % hostname - -class HostNotFoundError(HostError): - r""" - HostNotFoundError(hostname) -> HostNotFoundError instance - - This exception is raised when trying to operate on a hostname that doesn't - exists. - """ - - def __init__(self, hostname): - r"Initialize the object. See class documentation for more info." - self.message = u'Host not found: "%s"' % hostname + TransactionalHandler, ParametersHandler, \ + DictSubHandler, ReloadHandler +__ALL__ = ('DhcpHandler',) class Host(Sequence): r"""Host(name, ip, mac) -> Host instance :: Class representing a host. @@ -74,65 +29,26 @@ class Host(Sequence): r"Return a tuple representing the host." return (self.name, self.ip, self.mac) -class HostHandler(Handler): - r"""HostHandler(hosts) -> HostHandler instance :: Handle a list of hosts. + def update(self, ip=None, mac=None): + if ip is not None: + self.ip = ip + if mac is not None: + self.mac = mac + +class HostHandler(DictSubHandler): + r"""HostHandler(parent) -> HostHandler instance :: Handle a list of hosts. This class is a helper for DhcpHandler to do all the work related to hosts administration. - - hosts - A dictionary with string keys (hostnames) and Host instances values. """ handler_help = u"Manage DHCP hosts" - def __init__(self, parent): - r"Initialize HostHandler object, see class documentation for details." - self.parent = parent - - @handler(u'Add a new host') - def add(self, name, ip, mac): - r"add(name, ip, mac) -> None :: Add a host to the hosts list." - if name in self.parent.hosts: - raise HostAlreadyExistsError(name) - self.parent.hosts[name] = Host(name, ip, mac) - - @handler(u'Update a host') - def update(self, name, ip=None, mac=None): - r"update(name[, ip[, mac]]) -> None :: Update a host of the hosts list." - if not name in self.parent.hosts: - raise HostNotFoundError(name) - if ip is not None: - self.parent.hosts[name].ip = ip - if mac is not None: - self.parent.hosts[name].mac = mac - - @handler(u'Delete a host') - def delete(self, name): - r"delete(name) -> None :: Delete a host of the hosts list." - if not name in self.parent.hosts: - raise HostNotFoundError(name) - del self.parent.hosts[name] - - @handler(u'Get information about a host') - def get(self, name): - r"get(name) -> Host :: List all the information of a host." - if not name in self.parent.hosts: - raise HostNotFoundError(name) - return self.parent.hosts[name] - - @handler(u'List hosts') - def list(self): - r"list() -> tuple :: List all the hostnames." - return self.parent.hosts.keys() - - @handler(u'Get information about all hosts') - def show(self): - r"show() -> list of Hosts :: List all the complete hosts information." - return self.parent.hosts.values() - - -class DhcpHandler(Restorable, ConfigWriter, InitdHandler, TransactionalHandler, - ParametersHandler): + _cont_subhandler_attr = 'hosts' + _cont_subhandler_class = Host + +class DhcpHandler(Restorable, ConfigWriter, ReloadHandler, TransactionalHandler, + ParametersHandler, InitdHandler): r"""DhcpHandler([pickle_dir[, config_dir]]) -> DhcpHandler instance. Handles DHCP service commands for the dhcpd program. @@ -169,10 +85,11 @@ class DhcpHandler(Restorable, ConfigWriter, InitdHandler, TransactionalHandler, def __init__(self, pickle_dir='.', config_dir='.'): r"Initialize DhcpHandler object, see class documentation for details." + log.debug(u'DhcpHandler(%r, %r)', pickle_dir, config_dir) self._persistent_dir = pickle_dir self._config_writer_cfg_dir = config_dir self._config_build_templates() - self._restore() + InitdHandler.__init__(self) self.host = HostHandler(self) def _get_config_vars(self, config_file): @@ -181,6 +98,12 @@ class DhcpHandler(Restorable, ConfigWriter, InitdHandler, TransactionalHandler, if __name__ == '__main__': + logging.basicConfig( + level = logging.DEBUG, + format = '%(asctime)s %(levelname)-8s %(message)s', + datefmt = '%H:%M:%S', + ) + import os h = DhcpHandler()