def set_default_networks(self, addr, dhcp_start=None, dhcp_end=None): self.set_netmask(NetworkAddress(addr).get('netmask')) self.set_ipaddr(NetworkAddress(addr).get('first_ip')) if not dhcp_start: dhcp_start = NetworkAddress(addr).get('first_ip') if not dhcp_end: dhcp_end = NetworkAddress(addr).get('last_ip') self.set_dhcp_start(dhcp_start) self.set_dhcp_end(dhcp_end)
def set_ipaddr_and_netmask(self, addr): """ Set ip address and netmask from '192.168.0.1/24' or '192.168.0.1/255.255.255.0' styled strings. @param addr: Strings like '192.168.0.1/24' or '192.168.0.1/255.255.255.0'. @type addr: string @return: nothing """ na = NetworkAddress(addr) self.set_ipaddr(na.get('ipaddr')) self.set_netmask(na.get('netmask'))
def do_status(self): retval = {} command_args = [PARSER_COMMAND_ROUTE] (ret,res) = execute_command(command_args) ip_regex = "\d{1,3}(\.\d{1,3}){3}" regex = re.compile("(?P<destination>%s|default)[ \t]+(?P<gateway>%s|\*)[ \t]+(?P<netmask>%s)[ \t]+(?P<flags>[UGH]+)[ \t]+(?P<metric>\d+)[ \t]+(?P<ref>\d+)[ \t]+(?P<use>\d+)[ \t]+(?P<device>[^ ]+)" % (ip_regex,ip_regex,ip_regex,)) for _aline in res: m = regex.match(_aline) if m: device = m.group('device') destination = m.group('destination') if destination == "default": destination = "0.0.0.0" netmask = m.group('netmask') target = "%s/%s" % (destination,netmask,) net = NetworkAddress(target) target = net.cidr try: retval[device] except: retval[device] = {} retval[device][target] = {} for _atype in ["use","metric","ref","flags","gateway"]: try: exec("retval[device][target]['%s'] = m.group('%s')" % (_atype,_atype,)) except: pass return retval
def convert_old_style(self, conf_arr): dop = DictOp() dop.addconf("__",{}) orders = [] for cnt in range(0,20): try: try: exec("action = conf_arr['ADDRESS%d']['action']" % cnt) except: action = None exec("address = conf_arr['ADDRESS%d']['value']" % cnt) exec("netmask = conf_arr['NETMASK%d']['value']" % cnt) exec("gateway = conf_arr['GATEWAY%d']['value']" % cnt) target = "%s/%s" % (address,netmask,) net = NetworkAddress(target) try: target = net.cidr except: pass dop.add("__",[target],gateway) if action == "delete": dop.delete("__",[target]) orders.append([target]) except: pass if len(orders) != 0: dop.add("__",['@ORDERS'],orders) return dop.getconf("__")
def _POST(self, *param, **params): host_id = self.chk_hostby1(param) if host_id is None: return web.notfound() host = findbyhost1(self.orm, host_id) if not validates_staticroute(self): return web.badrequest(self.view.alert) modules = ["staticroute"] dop = read_conf(modules, self, host) if dop is False: return web.internalerror('Internal Server Error. (Timeout)') target = self.input.target net = NetworkAddress(target) ipaddr = net.ipaddr netmask = net.netmask netlen = net.netlen network = net.network target = "%s/%s" % ( ipaddr, netlen, ) gateway = self.input.gateway device = self.input.device dop.set("staticroute", [device, target], gateway) from karesansui.lib.parser.staticroute import PARSER_COMMAND_ROUTE if net.netlen == 32: command = "%s add -host %s gw %s dev %s" % ( PARSER_COMMAND_ROUTE, ipaddr, gateway, device, ) command = "%s add -host %s dev %s" % ( PARSER_COMMAND_ROUTE, ipaddr, device, ) else: command = "%s add -net %s netmask %s gw %s dev %s" % ( PARSER_COMMAND_ROUTE, network, netmask, gateway, device, ) extra_args = {"post-command": command} retval = write_conf(dop, self, host, extra_args=extra_args) if retval is False: return web.internalerror('Internal Server Error. (Adding Task)') return web.accepted(url=web.ctx.path)
def _PUT(self, *param, **params): host_id = self.chk_hostby1(param) if host_id is None: return web.notfound() uni_device = param[1] if uni_device is None: return web.notfound() device = uni_device.encode("utf-8") if not validates_nic(self): self.logger.debug("Change nic failed. Did not validate.") return web.badrequest(self.view.alert) host = findbyhost1(self.orm, host_id) modules = ["ifcfg"] dop = read_conf(modules, self, host) if dop is False: self.logger.error("Change nic failed. Failed read conf.") return web.internalerror('Internal Server Error. (Read conf)') ipaddr = "" if is_param(self.input, ipaddr): if self.input.ipaddr: ipaddr = self.input.ipaddr netmask = "" if is_param(self.input, netmask): if self.input.netmask: netmask = self.input.netmask bootproto = self.input.bootproto onboot = "no" if is_param(self.input, 'onboot'): onboot = "yes" net = NetworkAddress("%s/%s" % (ipaddr, netmask)) network = net.network broadcast = net.broadcast if not dop.get("ifcfg", device): self.logger.error("Change nic failed. Target config not found.") return web.internalerror('Internal Server Error. (Get conf)') dop.set("ifcfg", [device, "ONBOOT"], onboot) dop.set("ifcfg", [device, "BOOTPROTO"], bootproto) dop.set("ifcfg", [device, "IPADDR"], ipaddr) dop.set("ifcfg", [device, "NETMASK"], netmask) if network is not None: dop.set("ifcfg", [device, "NETWORK"], network) if broadcast is not None: dop.set("ifcfg", [device, "BROADCAST"], broadcast) retval = write_conf(dop, self, host) if retval is False: self.logger.error("Change nic failed. Failed write conf.") return web.internalerror('Internal Server Error. (Adding Task)') return web.accepted(url=web.ctx.path)
def convert_new_style(self, conf_arr): dop = DictOp() dop.addconf("__",{}) orders = [] try: old_orders = conf_arr['@ORDERS']['value'] except: old_orders = [] cnt = 0 for _k,_v in conf_arr.iteritems(): if _k[0] != "@": net = NetworkAddress(_k) try: ipaddr = net.ipaddr netmask = net.netmask gateway = _v['value'] try: action = _v['action'] except: action = None try: index = old_orders.index([_k]) except: index = cnt dop.add("__",["ADDRESS%d" % index],ipaddr) if action == "delete": dop.delete("__",["ADDRESS%d" % index]) orders.insert(cnt*3+0,["ADDRESS%d" % index]) dop.add("__",["NETMASK%d" % index],netmask) if action == "delete": dop.delete("__",["NETMASK%d" % index]) orders.insert(cnt*3+1,["NETMASK%d" % index]) dop.add("__",["GATEWAY%d" % index],gateway) if action == "delete": dop.delete("__",["GATEWAY%d" % index]) orders.insert(cnt*3+2,["GATEWAY%d" % index]) cnt = cnt + 1 except: pass if len(orders) != 0: dop.add("__",['@ORDERS'],orders) return dop.getconf("__")
def _GET(self, *param, **params): host_id = self.chk_hostby1(param) if host_id is None: return web.notfound() b64name = param[1] if not (b64name and host_id): return web.badrequest() name = base64_decode(str(b64name)) (target, device) = name.split("@") net = NetworkAddress(target) ipaddr = net.ipaddr netmask = net.netmask netlen = net.netlen gateway = _('N/A') flags = _('N/A') ref = _('N/A') use = _('N/A') metric = _('N/A') parser = Parser() status = parser.do_status() for _k,_v in status.iteritems(): for _k2,_v2 in _v.iteritems(): if name == "%s@%s" % (_k2,_k,): gateway = _v2['gateway'] flags = _v2['flags'] ref = _v2['ref'] use = _v2['use'] metric = _v2['metric'] route = dict(name=name, ipaddr=ipaddr, netmask=netmask, netlen=netlen, device=device, gateway=gateway, flags=flags, ref=ref, use=use, metric=metric, ) self.view.route = route return True
def do_del(self,device,target): retval = True type = "-net" try: net = NetworkAddress(target) if net.netlen == 32: type = "-host" target = net.cidr except: pass command_args = [PARSER_COMMAND_ROUTE, "del", type, target, "dev", device] (ret,res) = execute_command(command_args) if ret != 0: retval = False return retval
def _DELETE(self, *param, **params): host_id = self.chk_hostby1(param) if host_id is None: return web.notfound() b64name = param[1] if not (b64name and host_id): return web.badrequest() host = findbyhost1(self.orm, host_id) name = base64_decode(str(b64name)) (target, device) = name.split("@") net = NetworkAddress(target) ipaddr = net.ipaddr netmask = net.netmask netlen = net.netlen target = "%s/%s" % (ipaddr,netlen,) modules = ["staticroute"] dop = read_conf(modules, self, host) if dop is False: return web.internalerror('Internal Server Error. (Timeout)') dop.delete("staticroute", [device,target]) from karesansui.lib.parser.staticroute import PARSER_COMMAND_ROUTE if net.netlen == 32: command = "%s del -host %s dev %s" % (PARSER_COMMAND_ROUTE,ipaddr,device,) else: command = "%s del -net %s netmask %s dev %s" % (PARSER_COMMAND_ROUTE,ipaddr,netmask,device,) extra_args = {"post-command": command} retval = write_conf(dop, self, host, extra_args=extra_args) if retval is False: return web.internalerror('Internal Server Error. (Adding Task)') return web.accepted()
def _GET(self, *param, **params): host_id = self.chk_hostby1(param) if host_id is None: return web.notfound() self.view.host_id = host_id self.view.current = get_ifconfig_info() self.view.device = param[1] modules = ["ifcfg"] host = findbyhost1(self.orm, host_id) dop = read_conf(modules,self,host) if dop is False: self.logger.error("Get nic info failed. Failed read conf.") return web.internalerror('Internal Server Error. (Read conf)') self.view.bootproto = dop.get("ifcfg",[self.view.device,"BOOTPROTO"]) if self.view.bootproto is False: self.view.bootproto = "static" self.view.onboot = dop.get("ifcfg",[self.view.device,"ONBOOT"]) if self.view.onboot is False: self.view.onboot = "yes" self.view.ipaddr = dop.get("ifcfg",[self.view.device,"IPADDR"]) if self.view.ipaddr is False: self.view.ipaddr = "" self.view.netmask = dop.get("ifcfg",[self.view.device,"NETMASK"]) if self.view.netmask is False: self.view.netmask = "" self.view.network = dop.get("ifcfg",[self.view.device,"NETWORK"]) if self.view.network is False: net = NetworkAddress("%s/%s" % (self.view.ipaddr,self.view.netmask)) if net.valid_addr(self.view.ipaddr) is True and net.valid_addr(self.view.netmask) is True: self.view.network = net.network else: self.view.network = "" self.view.broadcast = dop.get("ifcfg",[self.view.device,"BROADCAST"]) if self.view.broadcast is False: net = NetworkAddress("%s/%s" % (self.view.ipaddr,self.view.netmask)) if net.valid_addr(self.view.ipaddr) is True and net.valid_addr(self.view.netmask) is True: self.view.broadcast = net.broadcast else: self.view.broadcast = "" self.view.master = dop.get("ifcfg",[self.view.device,"MASTER"]) if self.view.master is False: self.view.master = "" self.view.c_ipaddr = self.view.current[self.view.device]["ipaddr"] if self.view.c_ipaddr is None: self.view.c_ipaddr = "" self.view.c_netmask = self.view.current[self.view.device]["mask"] if self.view.c_netmask is None: self.view.c_netmask = "" if self.view.current[self.view.device]["cidr"] is None: self.view.c_network = "" else: self.view.c_network = re.sub("\/.*","",self.view.current[self.view.device]["cidr"]) self.view.c_broadcast = self.view.current[self.view.device]["bcast"] if self.view.c_broadcast is None: net = NetworkAddress("%s/%s" % (self.view.c_ipaddr,self.view.c_netmask)) if net.valid_addr(self.view.c_ipaddr) is True and net.valid_addr(self.view.c_netmask) is True: self.view.c_broadcast = net.broadcast else: self.view.c_broadcast = "" self.view.c_hwaddr = self.view.current[self.view.device]["hwaddr"] if self.view.c_hwaddr is None: self.view.c_hwaddr = "" self.view.bond_info = get_bonding_info() self.view.c_master = "" for bond in self.view.bond_info: for slave in self.view.bond_info[bond]['slave']: if self.view.device == slave: self.view.c_master = bond return True
def set_libvirt_rules(self): kvc = KaresansuiVirtConnection() try: for name in kvc.list_active_network(): try: network = kvc.search_kvn_networks(name)[0] info = network.get_info() bridge = info['bridge']['name'] ipaddr = info['ip']['address'] netmask = info['ip']['netmask'] netaddr = NetworkAddress("%s/%s" % (ipaddr, netmask)).get('network') # nat mode if info['forward']['mode'] == 'nat': # rule 1 # -A POSTROUTING -s 192.168.122.0/255.255.255.0 -d ! 192.168.122.0/255.255.255.0 -j MASQUERADE conditions = { 'target': 'MASQUERADE', 'source': "%s/%s" % (netaddr, netmask), 'destination': "! %s/%s" % (netaddr, netmask), } ids = self._search_rule('nat', 'POSTROUTING', conditions) if len(ids) == 0: id = self._insert_rule('nat', 'POSTROUTING', 1, conditions) # rule 2 # -A FORWARD -d 192.168.122.0/255.255.255.0 -o virbr0 -m state --state RELATED,ESTABLISHED -j ACCEPT conditions = { 'target': 'ACCEPT', 'destination': "%s/%s" % (netaddr, netmask), 'out-interface': bridge, } ids = self._search_rule('filter', 'FORWARD', conditions) if len(ids) == 0: conditions[ 'option'] = '-m state --state RELATED,ESTABLISHED' id = self._insert_rule('filter', 'FORWARD', 1, conditions) # rule 3 # -A FORWARD -s 192.168.122.0/255.255.255.0 -i virbr0 -j ACCEPT conditions = { 'target': 'ACCEPT', 'source': "%s/%s" % (netaddr, netmask), 'in-interface': bridge, } ids = self._search_rule('filter', 'FORWARD', conditions) if len(ids) == 0: id = self._insert_rule('filter', 'FORWARD', 1, conditions) # rule 4 # -A INPUT -i virbr0 -p udp -m udp --dport 53 -j ACCEPT # -A INPUT -i virbr0 -p tcp -m tcp --dport 53 -j ACCEPT # -A INPUT -i virbr0 -p udp -m udp --dport 67 -j ACCEPT # -A INPUT -i virbr0 -p tcp -m tcp --dport 67 -j ACCEPT default_port = { '53': ['udp', 'tcp'], '67': ['udp', 'tcp'], } for port, v in default_port.iteritems(): for protocol in v: conditions = { 'target': 'ACCEPT', 'protocol': protocol, 'destination-port': port, 'in-interface': bridge, } ids = self._search_rule('filter', 'INPUT', conditions) if len(ids) == 0: conditions['option'] = "-m %s" % protocol id = self._insert_rule('filter', 'INPUT', 1, conditions) except KaresansuiVirtException, e: pass finally: kvc.close() return True
def _GET(self, *param, **params): host_id = self.chk_hostby1(param) if host_id is None: return web.notfound() host = findbyhost1(self.orm, host_id) self.view.host_id = host_id # unremovable entries excludes = { "device": ["^peth", "^virbr", "^sit", "^xenbr", "^lo", "^br"], "ipaddr": ["^0\.0\.0\.0$", "^169\.254\.0\.0$"], } devices = [] phydev_regex = re.compile(r"^eth[0-9]+") for dev, dev_info in get_ifconfig_info().iteritems(): if phydev_regex.match(dev): try: if dev_info['ipaddr'] is not None: devices.append(dev) net = NetworkAddress("%s/%s" % ( dev_info['ipaddr'], dev_info['mask'], )) excludes['ipaddr'].append(net.network) except: pass self.view.devices = devices parser = Parser() status = parser.do_status() routes = {} for _k, _v in status.iteritems(): for _k2, _v2 in _v.iteritems(): name = base64_encode("%s@%s" % ( _k2, _k, )) routes[name] = {} routes[name]['name'] = name routes[name]['device'] = _k routes[name]['gateway'] = _v2['gateway'] routes[name]['flags'] = _v2['flags'] routes[name]['ref'] = _v2['ref'] routes[name]['use'] = _v2['use'] net = NetworkAddress(_k2) routes[name]['ipaddr'] = net.ipaddr routes[name]['netlen'] = net.netlen routes[name]['netmask'] = net.netmask removable = True for _ex_key, _ex_val in excludes.iteritems(): ex_regex = "|".join(_ex_val) mm = re.search(ex_regex, routes[name][_ex_key]) if mm: removable = False routes[name]['removable'] = removable self.view.routes = routes if self.is_mode_input(): pass return True
def _GET(self, *param, **params): host_id = self.chk_hostby1(param) if host_id is None: return web.notfound() self.view.host_id = host_id self.view.current = get_ifconfig_info() self.view.device = param[1] modules = ["ifcfg"] host = findbyhost1(self.orm, host_id) dop = read_conf(modules, self, host) if dop is False: self.logger.error("Get nic info failed. Failed read conf.") return web.internalerror('Internal Server Error. (Read conf)') self.view.bootproto = dop.get("ifcfg", [self.view.device, "BOOTPROTO"]) if self.view.bootproto is False: self.view.bootproto = "static" self.view.onboot = dop.get("ifcfg", [self.view.device, "ONBOOT"]) if self.view.onboot is False: self.view.onboot = "yes" self.view.ipaddr = dop.get("ifcfg", [self.view.device, "IPADDR"]) if self.view.ipaddr is False: self.view.ipaddr = "" self.view.netmask = dop.get("ifcfg", [self.view.device, "NETMASK"]) if self.view.netmask is False: self.view.netmask = "" self.view.network = dop.get("ifcfg", [self.view.device, "NETWORK"]) if self.view.network is False: net = NetworkAddress("%s/%s" % (self.view.ipaddr, self.view.netmask)) if net.valid_addr(self.view.ipaddr) is True and net.valid_addr( self.view.netmask) is True: self.view.network = net.network else: self.view.network = "" self.view.broadcast = dop.get("ifcfg", [self.view.device, "BROADCAST"]) if self.view.broadcast is False: net = NetworkAddress("%s/%s" % (self.view.ipaddr, self.view.netmask)) if net.valid_addr(self.view.ipaddr) is True and net.valid_addr( self.view.netmask) is True: self.view.broadcast = net.broadcast else: self.view.broadcast = "" self.view.master = dop.get("ifcfg", [self.view.device, "MASTER"]) if self.view.master is False: self.view.master = "" self.view.c_ipaddr = self.view.current[self.view.device]["ipaddr"] if self.view.c_ipaddr is None: self.view.c_ipaddr = "" self.view.c_netmask = self.view.current[self.view.device]["mask"] if self.view.c_netmask is None: self.view.c_netmask = "" if self.view.current[self.view.device]["cidr"] is None: self.view.c_network = "" else: self.view.c_network = re.sub( "\/.*", "", self.view.current[self.view.device]["cidr"]) self.view.c_broadcast = self.view.current[self.view.device]["bcast"] if self.view.c_broadcast is None: net = NetworkAddress("%s/%s" % (self.view.c_ipaddr, self.view.c_netmask)) if net.valid_addr(self.view.c_ipaddr) is True and net.valid_addr( self.view.c_netmask) is True: self.view.c_broadcast = net.broadcast else: self.view.c_broadcast = "" self.view.c_hwaddr = self.view.current[self.view.device]["hwaddr"] if self.view.c_hwaddr is None: self.view.c_hwaddr = "" self.view.bond_info = get_bonding_info() self.view.c_master = "" for bond in self.view.bond_info: for slave in self.view.bond_info[bond]['slave']: if self.view.device == slave: self.view.c_master = bond return True