コード例 #1
0
 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)
コード例 #2
0
 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'))
コード例 #3
0
ファイル: config_network.py プロジェクト: fkei/karesansui
 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'))
コード例 #4
0
    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
コード例 #5
0
    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("__")
コード例 #6
0
    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)
コード例 #7
0
    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)
コード例 #8
0
    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("__")
コード例 #9
0
    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
コード例 #10
0
    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
コード例 #11
0
    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()
コード例 #12
0
    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
コード例 #13
0
    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
コード例 #14
0
    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
コード例 #15
0
    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