X-Git-Url: https://git.llucax.com/software/pymin.git/blobdiff_plain/e7975918f1449b68443974aa64db31b40230a681..07d6251c69d26b80b47ff012c3e44b7e4a366df4:/pymin/services/nat/__init__.py?ds=sidebyside diff --git a/pymin/services/nat/__init__.py b/pymin/services/nat/__init__.py index 63fdd32..34d5b0d 100644 --- a/pymin/services/nat/__init__.py +++ b/pymin/services/nat/__init__.py @@ -1,25 +1,15 @@ # vim: set encoding=utf-8 et sw=4 sts=4 : from os import path +import logging ; log = logging.getLogger('pymin.services.nat') from pymin.seqtools import Sequence from pymin.dispatcher import Handler, handler, HandlerError from pymin.services.util import Restorable, ConfigWriter, RestartHandler, \ ReloadHandler, TransactionalHandler, \ - ListSubHandler, call + ServiceHandler, ListSubHandler, call -__ALL__ = ('NatHandler', 'Error') - -class Error(HandlerError): - r""" - Error(command) -> Error instance :: Base NatHandler exception class. - - All exceptions raised by the NatHandler inherits from this one, so you can - easily catch any NatHandler exception. - - message - A descriptive error message. - """ - pass +__all__ = ('NatHandler',) class PortForward(Sequence): r"""PortForward(dev, protocol, port, dst[, dst_port[, ...]]) -> PortForward. @@ -57,10 +47,6 @@ class PortForward(Sequence): if src_net is not None: self.src_net = src_net if dst_net is not None: self.dst_net = dst_net - def __cmp__(self, other): - r"Compares two PortForward objects." - return cmp(self.as_tuple(), other.as_tuple()) - def as_tuple(self): r"Return a tuple representing the port forward." return (self.dev, self.protocol, self.port, self.dst, self.dst_port, @@ -195,8 +181,8 @@ class MasqHandler(ListSubHandler): _cont_subhandler_attr = 'masqs' _cont_subhandler_class = Masq -class NatHandler(Restorable, ConfigWriter, RestartHandler, ReloadHandler, - TransactionalHandler): +class NatHandler(Restorable, ConfigWriter, ReloadHandler, ServiceHandler, + TransactionalHandler): r"""NatHandler([pickle_dir[, config_dir]]) -> NatHandler instance. Handles NAT commands using iptables. @@ -218,23 +204,30 @@ class NatHandler(Restorable, ConfigWriter, RestartHandler, ReloadHandler, masqs=list(), ) - @handler(u'Start the service.') - def start(self): + def _service_start(self): + log.debug(u'NatHandler._service_start(): flushing nat table') + call(('iptables', '-t', 'nat', '-F')) for (index, port) in enumerate(self.ports): + log.debug(u'NatHandler._service_start: adding port %r', port) call(['iptables'] + port.as_call_list(index+1)) for (index, snat) in enumerate(self.snats): + log.debug(u'NatHandler._service_start: adding snat %r', snat) call(['iptables'] + snat.as_call_list(index+1)) for (index, masq) in enumerate(self.masqs): + log.debug(u'NatHandler._service_start: adding masq %r', masq) call(['iptables'] + masq.as_call_list(index+1)) - @handler(u'Stop the service.') - def stop(self): + def _service_stop(self): + log.debug(u'NatHandler._service_stop(): flushing nat table') call(('iptables', '-t', 'nat', '-F')) + _service_restart = _service_start + def __init__(self, pickle_dir='.'): r"Initialize the object, see class documentation for details." + log.debug(u'NatHandler(%r)', pickle_dir) self._persistent_dir = pickle_dir - self._restore() + ServiceHandler.__init__(self) self.forward = PortForwardHandler(self) self.snat = SNatHandler(self) self.masq = MasqHandler(self) @@ -242,6 +235,12 @@ class NatHandler(Restorable, ConfigWriter, RestartHandler, ReloadHandler, if __name__ == '__main__': + logging.basicConfig( + level = logging.DEBUG, + format = '%(asctime)s %(levelname)-8s %(message)s', + datefmt = '%H:%M:%S', + ) + import os handler = NatHandler()