Ejemplo n.º 1
0
 def to_python(self, value):
     if not value:
         return set()
     if isinstance(value, basestring):
         return set(ranges_to_list(value))
     else:
         return value
Ejemplo n.º 2
0
Archivo: base.py Proyecto: 0pt1on/noc
 def clean(self, value):
     if isinstance(value, six.string_types) and not value.strip():
         return ""
     vp = VLANIDParameter()
     try:
         return list_to_ranges([vp.clean(v) for v in ranges_to_list(value)])
     except SyntaxError:
         self.raise_error(value)
Ejemplo n.º 3
0
Archivo: base.py Proyecto: 0pt1on/noc
 def on_interface_tagged(self, tokens):
     vlans = tokens[0].strip()
     if vlans.startswith("add"):
         vlans = vlans.split(" ", 1)[1].strip()
     si = self.get_current_subinterface()
     if vlans != "none":
         for v in ranges_to_list(vlans):
             si.tagged_vlans += [int(v)]
     si.add_afi("BRIDGE")
Ejemplo n.º 4
0
    def execute(self):
        interfaces = []
        v = self.cli("show lldp local config")
        for port in self.rx_port.finditer(v):
            port_no = port.group("port")
            c = self.cli("show interface port-list %s switchport" % port_no)
            match = self.rx_vlan.search(c)
            iface = {
                "name": "P%s" % port_no,
                "type": "physical"
            }
            sub = {
                "name": "P%s" % port_no,
                "enabled_afi": ["BRIDGE"],
            }
            if match.group("op_mode") in ["trunk", "hybrid"]:
                sub["untagged_vlan"] = int(match.group("trunk_native_vlan"))
                sub["tagged_vlans"] = ranges_to_list(match.group("op_vlans"))

            else:
                sub["untagged_vlan"] = int(match.group("access_vlan"))

            iface["subinterfaces"] = [sub]
            interfaces += [iface]

        mac = self.scripts.get_chassis_id()[0]["first_chassis_mac"]
        v = self.cli("show interface ip")
        for match in self.rx_ip_iface.finditer(v):
            ifname = match.group("iface")
            i = {
                "name": "ip%s" % ifname,
                "type": "SVI",
                "mac": mac,
                "enabled_protocols": [],
                "subinterfaces": [{
                    "name": "ip%s" % ifname,
                    "mac": mac,
                    "enabled_afi": ['IPv4']
                }]
            }
            addr = match.group("ip")
            mask = match.group("mask")
            ip_address = "%s/%s" % (addr, IPv4.netmask_to_len(mask))
            i['subinterfaces'][0]["ipv4_addresses"] = [ip_address]
            interfaces += [i]
        v = self.cli("show interface ip vlan")
        for match in self.rx_vlans_ip.finditer(v):
            vlan_id = match.group("vlan_id")
            if vlan_id == "none":
                continue
            ifname = "ip%s" % match.group("iface")
            for i in interfaces:
                if i["name"] == ifname:
                    i["subinterfaces"][0]["vlan_ids"] = vlan_id
                    break
        return [{"interfaces": interfaces}]
Ejemplo n.º 5
0
 def on_vlan(self, tokens):
     """
      if - vlan range
      database -
     :param tokens:
     :return:
     """
     if "-" not in tokens[-1] and "database" not in tokens:
         self.get_vlan_fact(int(tokens[-1].strip()))
     elif "-" in tokens[-1]:
         for v in ranges_to_list(tokens[-1].strip()):
             self.get_vlan_fact(int(v))
Ejemplo n.º 6
0
 def clean(self, value):
     """
     >>> VLANIDMapParameter().clean("1,2,5-10")
     '1-2,5-10'
     >>> VLANIDMapParameter().clean("")
     ''
     """
     if isinstance(value, basestring) and not value.strip():
         return ""
     vp = VLANIDParameter()
     try:
         return list_to_ranges([vp.clean(v) for v in ranges_to_list(value)])
     except SyntaxError:
         self.raise_error(value)
Ejemplo n.º 7
0
 def on_interface_tagged(self, tokens):
     """
     undo port trunk allow-pass vlan 1
     port trunk allow-pass vlan 118 718
     port trunk allow-pass vlan 2 to 4094
     port trunk allow-pass vlan 76 90 118 123 126 165 to 169 175 to 179 621 2852 to 2854
     port hybrid tagged vlan 51 90 to 91 110 118 319 333 402 419 433 524 to 527
     """
     si = self.get_current_subinterface()
     vlans = " ".join(tokens[4:])
     if vlans != "none":
         for v in ranges_to_list(vlans, splitter=" "):
             si.tagged_vlans += [int(v)]
     si.add_afi("BRIDGE")
Ejemplo n.º 8
0
    def execute_cli(self):
        if self.is_iscom2624g:
            return self.execute_iscom2624g()
        lldp_ifaces = []
        v = self.cli("show lldp local config")
        match = self.rx_lldp.search(v)
        if match:
            lldp_ifaces = self.expand_rangelist(match.group("ports"))
        ifaces = []
        v = self.cli("show interface port description")
        for line in v.splitlines()[2:-1]:
            i = {
                "name": int(line[:8]),
                "type": "physical",
                "snmp_ifindex": int(line[:8]),
                "subinterfaces": [],
            }
            if str(line[8:]) != "-":
                i["description"] = str(line[8:])
            if i["name"] in lldp_ifaces:
                i["enabled_protocols"] = ["LLDP"]
            ifaces.append(i)

        statuses = []
        v = self.cli("show interface port")
        for line in v.splitlines()[5:]:
            i = {
                "name": int(line[:6]),
                "admin_status": "enable" in line[7:14],
                "oper_status": "up" in line[14:29],
            }
            statuses.append(i)

        vlans = []
        v = self.cli("show interface port switchport")
        for section in v.split("Port"):
            if not section:
                continue
            vlans.append(self.parse_vlans(section))

        d = defaultdict(dict)

        for l in (statuses, ifaces):
            for elem in l:
                d[elem["name"]].update(elem)
        l3 = list(six.itervalues(d))

        for port in l3:
            name = port["name"]
            port["subinterfaces"] = [{
                "name":
                str(name),
                "enabled_afi": ["BRIDGE"],
                "admin_status":
                port["admin_status"],
                "oper_status":
                port["oper_status"],
                "tagged_vlans": [],
                "untagged_vlan": [
                    int(vlan["untagged_vlan"]) for vlan in vlans
                    if int(vlan["name"]) == name
                ][0],
            }]
            if "description" in port:
                port["subinterfaces"][0]["description"] = port["description"]
            tvl = [
                vlan["op_trunk_allowed_vlan"] for vlan in vlans
                if int(vlan["name"]) == name
            ][0]
            if "n/a" not in tvl:
                port["subinterfaces"][0]["tagged_vlans"] = ranges_to_list(tvl)

        if_descr = []
        v = self.cli("show interface ip description")
        for line in v.splitlines()[2:-1]:
            i = {"name": int(line[:9]), "description": str(line[9:])}
            if_descr.append(i)

        if not l3:
            v = self.cli("show interface description")
            for match in self.rx_descr.finditer(v):
                i = {
                    "name":
                    match.group("port"),
                    "type":
                    "physical",
                    "description":
                    match.group("descr").strip(),
                    "enabled_protocols": [],
                    "subinterfaces": [{
                        "name":
                        match.group("port"),
                        "description":
                        match.group("descr").strip()
                    }],
                }
                l3 += [i]
            v = self.cli("show vlan detail")
            for match in self.rx_vlan2.finditer(v):
                vlan_id = int(match.group("vlan_id"))
                ports = ranges_to_list(match.group("ports"))
                if match.group("untagged"):
                    untagged = ranges_to_list(match.group("untagged"))
                else:
                    untagged = []
                for i in l3:
                    for p in ports:
                        if i["name"] == "port%s" % p:
                            if p not in untagged:
                                if "tagged_vlans" in i["subinterfaces"][0]:
                                    i["subinterfaces"][0]["tagged_vlans"] += [
                                        vlan_id
                                    ]
                                else:
                                    i["subinterfaces"][0]["tagged_vlans"] = [
                                        vlan_id
                                    ]
                            else:
                                i["subinterfaces"][0][
                                    "untagged_vlan"] = vlan_id

        v = self.profile.get_version(self)
        mac = v["mac"]
        # XXX: This is a dirty hack !!!
        # I do not know, how get ip interface MAC address
        try:
            v = self.cli("show interface ip")
        except self.CLISyntaxError:
            v = self.cli("show interface ip 0")
        for match in self.rx_iface.finditer(v):
            ifname = match.group("iface")
            i = {
                "name":
                "ip%s" % ifname,
                "type":
                "SVI",
                "oper_status":
                match.group("oper_status") == "active",
                "admin_status":
                match.group("oper_status") == "active",
                "mac":
                mac,
                "enabled_protocols": [],
                "subinterfaces": [{
                    "name":
                    "ip%s" % ifname,
                    "oper_status":
                    match.group("oper_status") == "active",
                    "admin_status":
                    match.group("oper_status") == "active",
                    "mac":
                    mac,
                    "vlan_ids": [int(match.group("vid"))],
                    "enabled_afi": ["IPv4"],
                }],
            }
            addr = match.group("ip")
            mask = match.group("mask")
            ip_address = "%s/%s" % (addr, IPv4.netmask_to_len(mask))
            i["subinterfaces"][0]["ipv4_addresses"] = [ip_address]
            for q in if_descr:
                if str(q["name"]).strip() == ifname:
                    i["description"] = q["description"]
                    i["subinterfaces"][0]["description"] = q["description"]
            l3 += [i]

        try:
            v = self.cli("show ip interface brief")
        except self.CLISyntaxError:
            return [{"interfaces": l3}]

        for match in self.rx_iface2.finditer(v):
            ifname = match.group("iface")
            i = {
                "name":
                "ip%s" % ifname,
                "type":
                "SVI",
                "mac":
                mac,
                "enabled_protocols": [],
                "subinterfaces": [{
                    "name": "ip%s" % ifname,
                    "mac": mac,
                    "enabled_afi": ["IPv4"]
                }],
            }
            addr = match.group("ip")
            mask = match.group("mask")
            ip_address = "%s/%s" % (addr, IPv4.netmask_to_len(mask))
            i["subinterfaces"][0]["ipv4_addresses"] = [ip_address]
            l3 += [i]
        v = self.cli("show interface ip vlan")
        for match in self.rx_vlans_ip.finditer(v):
            vlan_id = match.group("vlan_id")
            if vlan_id == "none":
                continue
            ifname = "ip%s" % match.group("iface")
            for i in l3:
                if i["name"] == ifname:
                    i["subinterfaces"][0]["vlan_ids"] = vlan_id
                    break

        return [{"interfaces": l3}]
Ejemplo n.º 9
0
 def execute_cli(self):
     interfaces = []
     v = self.cli("show interface port")
     for match in self.rx_port.finditer(v):
         i = {
             "name":
             match.group("port"),
             "type":
             "physical",
             "admin_status":
             match.group("admin_status") == "enable",
             "oper_status":
             match.group("admin_status") == "up",
             "snmp_ifindex":
             int(match.group("port")),
             "subinterfaces": [{
                 "name":
                 match.group("port"),
                 "admin_status":
                 match.group("admin_status") == "enable",
                 "oper_status":
                 match.group("admin_status") == "up",
                 "enabled_afi": ['BRIDGE']
             }]
         }
         interfaces += [i]
     v = self.cli("show interface port switchport")
     for match in self.rx_vlan.finditer(v):
         port = match.group("port")
         for iface in interfaces:
             if iface["name"] == port:
                 sub = iface["subinterfaces"][0]
                 if match.group("op_mode") in ["trunk", "hybrid"]:
                     sub["untagged_vlan"] = int(
                         match.group("trunk_native_vlan"))
                     sub["tagged_vlans"] = ranges_to_list(
                         match.group("op_vlans"))
                 else:
                     sub["untagged_vlan"] = int(match.group("access_vlan"))
                 break
     v = self.cli("show interface port description")
     for match in self.rx_descr.finditer(v):
         port = match.group("port")
         descr = match.group("descr").strip()
         if not descr:
             continue
         for iface in interfaces:
             if iface["name"] == port:
                 iface["description"] = descr
                 iface["subinterfaces"][0]["description"] = descr
                 break
     mac = self.scripts.get_chassis_id()[0]["first_chassis_mac"]
     v = self.cli("show interface ip")
     for match in self.rx_ip_iface.finditer(v):
         ifname = str(int(match.group("iface")) - 1)
         addr = match.group("ip")
         mask = match.group("mask")
         ip_address = "%s/%s" % (addr, IPv4.netmask_to_len(mask))
         i = {
             "name":
             "IP%s" % ifname,
             "type":
             "SVI",
             "mac":
             mac,
             "enabled_protocols": [],
             "subinterfaces": [{
                 "name": "ip%s" % ifname,
                 "mac": mac,
                 "enabled_afi": ['IPv4'],
                 "ipv4_addresses": [ip_address],
                 "vlan_ids": [match.group("vlan_id")]
             }]
         }
         interfaces += [i]
     return [{"interfaces": interfaces}]
Ejemplo n.º 10
0
Archivo: base.py Proyecto: 0pt1on/noc
 def on_vlan_range(self, tokens):
     for v in ranges_to_list(tokens[0].strip()):
         self.get_vlan_fact(v)
Ejemplo n.º 11
0
 def get_data_from_confdb(self):
     # Get interfaces and parse result
     interfaces = {
         d["if_name"]: d
         for d in self.confdb.query(self.IF_QUERY)
     }
     vrfs = {(d["vr"], d["instance"]): d
             for d in self.confdb.query(self.VRF_QUERY)}
     instances = defaultdict(dict)
     for d in self.confdb.query(self.UNIT_QUERY):
         r = instances[d["vr"], d["instance"]]
         if not r:
             r["virtual_router"] = d["vr"]
             r["forwarding_instance"] = d["instance"]
             if vrfs and (d["vr"], d["instance"]) in vrfs:
                 try:
                     vrf = vrfs[d["vr"], d["instance"]]
                     r["vpn_id"] = get_vpn_id({
                         "name":
                         vrf["instance"],
                         "rd":
                         vrf.get("rd"),
                         "rt_export":
                         vrf.get("rt_export", []),
                         "type":
                         vrf["type"].upper()
                         if vrf["type"] in ["vrf", "vpls"] else vrf["type"],
                     })
                 except ValueError:
                     pass
         if "interfaces" not in r:
             r["interfaces"] = {}
         if_name = d["if_name"]
         p_iface = interfaces.get(if_name)
         iface = r["interfaces"].get(if_name)
         if iface is None:
             iface = {
                 "name": if_name,
                 "type":
                 p_iface.get("type", "unknown") if p_iface else "unknown",
                 "admin_status": False,
                 "subinterfaces": {},
             }
             r["interfaces"][if_name] = iface
             if p_iface:
                 if "description" in p_iface:
                     iface["description"] = p_iface["description"]
                 if "admin_status" in p_iface:
                     iface["admin_status"] = p_iface["admin_status"] == "on"
         unit = iface["subinterfaces"].get(d["unit"])
         if unit is None:
             unit = {"name": d["unit"], "enabled_afi": []}
             iface["subinterfaces"][d["unit"]] = unit
         unit = iface["subinterfaces"][d["unit"]]
         description = d.get("description")
         if description:
             unit["description"] = description
         elif p_iface and p_iface.get("description"):
             unit["description"] = p_iface["description"]
         if "ipv4_addresses" in d:
             unit["enabled_afi"] += ["IPv4"]
             unit["ipv4_addresses"] = d["ipv4_addresses"]
         if "ipv6_addresses" in d:
             unit["enabled_afi"] += ["IPv6"]
             unit["ipv6_addresses"] = d["ipv4_addresses"]
         if "tagged" in d or "untagged" in d:
             unit["enabled_afi"] += ["BRIDGE"]
         if "untagged" in d:
             unit["untagged_vlan"] = int(d["untagged"])
         if "tagged" in d:
             unit["tagged_vlans"] = ranges_to_list(d["tagged"])
     # Flatten units
     r = list(six.itervalues(instances))
     for fi in r:
         # Flatten interfaces
         fi["interfaces"] = list(six.itervalues(fi["interfaces"]))
         # Flatten units
         for i in fi["interfaces"]:
             i["subinterfaces"] = list(six.itervalues(i["subinterfaces"]))
     return IGetInterfaces().clean_result(r)
Ejemplo n.º 12
0
 def normalize_vlan_id_batch(self, tokens):
     for vlan in ranges_to_list(tokens[3]):
         yield self.make_vlan_id(vlan_id=vlan)
Ejemplo n.º 13
0
 def normalize_switchport_tagged(self, tokens):
     if_name = self.interface_name(tokens[1])
     yield self.make_switchport_tagged(interface=if_name,
                                       unit=if_name,
                                       vlan_filter=ranges_to_list(
                                           tokens[7]))
Ejemplo n.º 14
0
 def normalize_vlan_id(self, tokens):
     for vlan_id in ranges_to_list(tokens[3]):
         yield self.make_vlan_id(vlan_id=str(vlan_id))