"/etc/sysconfig/static-routes handling" from .Conf import Conf, WrongMethod # pylint: disable-msg=W0403 class ConfESStaticRoutes(Conf): """Yet another dictionary, this one for /etc/sysconfig/static-routes This file has a syntax similar to that of /etc/gateways; the interface name is added and active/passive is deleted: net netmask gw The key is the interface, the value is a list of [, , ] lists """ def __init__(self): Conf.__init__(self, '/etc/sysconfig/static-routes', '#', '\t ', ' ') def read(self): Conf.read(self) self.initvars() def initvars(self): # pylint: disable-msg=W0201 self.vars = {} self.rewind() while self.findnextcodeline(): var = self.getfields() if len(var) == 7: if not self.vars.has_key(var[0]): self.vars[var[0]] = [[var[2], var[4], var[6]]] else: self.vars[var[0]].append([var[2], var[4], var[6]]) elif len(var) == 5: if not self.vars.has_key(var[0]): self.vars[var[0]] = [[var[2], var[4], '']] else: self.vars[var[0]].append([var[2], var[4], '']) self.nextline() self.rewind() def __getitem__(self, varname): if self.vars.has_key(varname): return self.vars[varname] else: return [[]] def __setitem__(self, varname, value): raise WrongMethod, 'Delete or call addroute instead' def __delitem__(self, varname): # since we re-write the file completely on close, we don't # need to alter it piecemeal here. del self.vars[varname] def delroute(self, device, route): # deletes a route from a device if the route exists, # and if it is the only route for the device, removes # the device from the dictionary # Note: This could normally be optimized considerably, # except that our input may have come from the file, # which others may have hand-edited, and this makes it # possible for us to deal with hand-inserted multiple # identical routes in a reasonably correct way. if self.vars.has_key(device): for i in range(len(self.vars[device])): if i < len(self.vars[device]) and \ not cmp(self.vars[device][i], route): # need first comparison because list shrinks self.vars[device][i:i+1] = [] if len(self.vars[device]) == 0: del self.vars[device] def addroute(self, device, route): # adds a route to a device, deleteing it first to avoid dups self.delroute(device, route) if self.vars.has_key(device): self.vars[device].append(route) else: self.vars[device] = [route] def write(self): # forget current version of file self.rewind() self.lines = [] for device in self.vars.keys(): for route in self.vars[device]: if len(route) == 3: if len(route[2]): self.insertlinelist((device, 'net', route[0], 'netmask', route[1], 'gw', route[2])) else: self.insertlinelist((device, 'net', route[0], 'netmask', route[1])) Conf.write(self) def keys(self): # no need to return list in order here, I think. return self.vars.keys() def has_key(self, key): return self.vars.has_key(key)