X-Git-Url: https://git.llucax.com/software/pymin.git/blobdiff_plain/7d2f3da6aee023c991c9669a6a4664bd8be53a97..66d2cd3777f93c9c81f7e379fd24f73c4a6fad91:/pymin/services/ip/__init__.py diff --git a/pymin/services/ip/__init__.py b/pymin/services/ip/__init__.py index c512d26..f967ae2 100644 --- a/pymin/services/ip/__init__.py +++ b/pymin/services/ip/__init__.py @@ -6,7 +6,7 @@ from os import path from pymin.seqtools import Sequence from pymin.dispatcher import handler, HandlerError, Handler from pymin.services.util import Restorable, ConfigWriter, InitdHandler, \ - TransactionalHandler + TransactionalHandler, SubHandler, call __ALL__ = ('IpHandler', 'Error','DeviceError', 'DeviceNotFoundError', 'RouteError', 'RouteNotFoundError', 'RouteAlreadyExistsError', @@ -81,45 +81,42 @@ class Route(Sequence): return 0 return cmp(id(self), id(other)) -class RouteHandler(Handler): +class RouteHandler(SubHandler): handler_help = u"Manage IP routes" - def __init__(self, devices): - self.devices = devices - @handler(u'Adds a route to a device') def add(self, device, net_addr, prefix, gateway): - if not device in self.devices: + if not device in self.parent.devices: raise DeviceNotFoundError(device) r = Route(net_addr, prefix, gateway) try: - self.devices[device].routes.index(r) + self.parent.devices[device].routes.index(r) raise RouteAlreadyExistsError(net_addr + '/' + prefix + '->' + gateway) except ValueError: - self.devices[device].routes.append(r) + self.parent.devices[device].routes.append(r) @handler(u'Deletes a route from a device') def delete(self, device, net_addr, prefix, gateway): - if not device in self.devices: + if not device in self.parent.devices: raise DeviceNotFoundError(device) r = Route(net_addr, prefix, gateway) try: - self.devices[device].routes.remove(r) + self.parent.devices[device].routes.remove(r) except ValueError: raise RouteNotFoundError(net_addr + '/' + prefix + '->' + gateway) @handler(u'Flushes routes from a device') def flush(self, device): - if not device in self.devices: + if not device in self.parent.devices: raise DeviceNotFoundError(device) - self.devices[device].routes = list() + self.parent.devices[device].routes = list() @handler(u'List routes') def list(self, device): try: - k = self.devices[device].routes.keys() + k = self.parent.devices[device].routes.keys() except ValueError: k = list() return k @@ -127,7 +124,7 @@ class RouteHandler(Handler): @handler(u'Get information about all routes') def show(self): try: - k = self.devices[device].routes.values() + k = self.parent.devices[device].routes.values() except ValueError: k = list() return k @@ -143,39 +140,36 @@ class Address(Sequence): def as_tuple(self): return (self.ip, self.prefix, self.broadcast) -class AddressHandler(Handler): +class AddressHandler(SubHandler): handler_help = u"Manage IP addresses" - def __init__(self, devices): - self.devices = devices - @handler(u'Adds an address to a device') def add(self, device, ip, prefix, broadcast='+'): - if not device in self.devices: + if not device in self.parent.devices: raise DeviceNotFoundError(device) - if ip in self.devices[device].addrs: + if ip in self.parent.devices[device].addrs: raise AddressAlreadyExistsError(ip) - self.devices[device].addrs[ip] = Address(ip, prefix, broadcast) + self.parent.devices[device].addrs[ip] = Address(ip, prefix, broadcast) @handler(u'Deletes an address from a device') def delete(self, device, ip): - if not device in self.devices: + if not device in self.parent.devices: raise DeviceNotFoundError(device) - if not ip in self.devices[device].addrs: + if not ip in self.parent.devices[device].addrs: raise AddressNotFoundError(ip) - del self.devices[device].addrs[ip] + del self.parent.devices[device].addrs[ip] @handler(u'Flushes addresses from a device') def flush(self, device): - if not device in self.devices: + if not device in self.parent.devices: raise DeviceNotFoundError(device) - self.devices[device].addrs = dict() + self.parent.devices[device].addrs = dict() @handler(u'List all addresses from a device') def list(self, device): try: - k = self.devices[device].addrs.keys() + k = self.parent.devices[device].addrs.keys() except ValueError: k = list() return k @@ -183,7 +177,7 @@ class AddressHandler(Handler): @handler(u'Get information about addresses from a device') def show(self, device): try: - k = self.devices[device].addrs.values() + k = self.parent.devices[device].addrs.values() except ValueError: k = list() return k @@ -200,14 +194,14 @@ class Device(Sequence): def as_tuple(self): return (self.name, self.mac) -class DeviceHandler(Handler): +class DeviceHandler(SubHandler): handler_help = u"Manage network devices" - def __init__(self, devices): + def __init__(self, parent): # FIXME remove templates to execute commands from mako.template import Template - self.devices = devices + self.parent = parent template_dir = path.join(path.dirname(__file__), 'templates') dev_fn = path.join(template_dir, 'device') self.device_template = Template(filename=dev_fn) @@ -215,14 +209,14 @@ class DeviceHandler(Handler): @handler(u'Bring the device up') def up(self, name): if name in self.devices: - print self.device_template.render(dev=name, action='up') + call(self.device_template.render(dev=name, action='up'), shell=True) else: raise DeviceNotFoundError(name) @handler(u'Bring the device down') def down(self, name): if name in self.devices: - print self.device_template.render(dev=name, action='down') + call(self.device_template.render(dev=name, action='down'), shell=True) else: raise DeviceNotFoundError(name) @@ -267,31 +261,31 @@ class IpHandler(Restorable, ConfigWriter, TransactionalHandler): self._config_writer_cfg_dir = config_dir self._config_build_templates() self._restore() - self.addr = AddressHandler(self.devices) - self.route = RouteHandler(self.devices) - self.dev = DeviceHandler(self.devices) + self.addr = AddressHandler(self) + self.route = RouteHandler(self) + self.dev = DeviceHandler(self) def _write_config(self): r"_write_config() -> None :: Execute all commands." for device in self.devices.values(): - print self._render_config('route_flush', dict(dev=device.name)) - print self._render_config('ip_flush', dict(dev=device.name)) + call(self._render_config('route_flush', dict(dev=device.name)), shell=True) + call(self._render_config('ip_flush', dict(dev=device.name)), shell=True) for address in device.addrs.values(): - print self._render_config('ip_add', dict( + call(self._render_config('ip_add', dict( dev = device.name, addr = address.ip, prefix = address.prefix, broadcast = address.broadcast, ) - ) + ), shell=True) for route in device.routes: - print self._render_config('route_add', dict( + call(self._render_config('route_add', dict( dev = device.name, net_addr = route.net_addr, prefix = route.prefix, gateway = route.gateway, ) - ) + ), shell=True) if __name__ == '__main__':