Exemple #1
0
def test_ipv4_unicode():
    # Fully qualified
    assert unicode(IPv4("192.168.0.0/24")), u"192.168.0.0/24"
    # Address only
    assert unicode(IPv4("192.168.0.0")), u"192.168.0.0/32"
    # Netmask
    assert unicode(IPv4("192.168.0.0", netmask="255.255.255.0")) == u"192.168.0.0/24"
Exemple #2
0
def test_ipv4_sub():
    # prefix - number returns prefix
    assert repr(IPv4("192.168.0.10/32") - 9) == "<IPv4 192.168.0.1/32>"
    assert repr(IPv4("192.168.1.10/32") - 265) == "<IPv4 192.168.0.1/32>"
    assert repr(IPv4("0.0.0.0/32") - 1) == "<IPv4 255.255.255.255/32>"
    # prefix - prefix returns distance
    assert IPv4("192.168.0.10/32") - IPv4("192.168.0.1/32") == 9
Exemple #3
0
def test_ipv4_hash(p1, p2):
    p1 = IPv4(p1)
    p2 = IPv4(p2)
    s = {p1}
    assert p1 in s
    assert p2 not in s
    ss = {p1: 1}
    assert ss[p1] == 1
    with pytest.raises(KeyError):
        ss[p2]
Exemple #4
0
def test_ipv4_hash():
    p0 = IPv4("192.168.0.1")
    p1 = IPv4("192.168.0.2")
    s = {p0}
    assert p0 in s
    assert p1 not in s
    ss = {p0: 1}
    assert ss[p0] == 1
    with pytest.raises(KeyError):
        ss[p1]
Exemple #5
0
def test_ipv4_range_to_prefixes():
    assert [repr(x) for x in IPv4.range_to_prefixes('192.168.0.2', '192.168.0.2')] == [
        "<IPv4 192.168.0.2/32>"
    ]
    assert [repr(x) for x in IPv4.range_to_prefixes('192.168.0.2', '192.168.0.16')] == [
        "<IPv4 192.168.0.2/31>", "<IPv4 192.168.0.4/30>", "<IPv4 192.168.0.8/29>",
        "<IPv4 192.168.0.16/32>"
    ]
    assert [repr(x)
            for x in IPv4.range_to_prefixes('0.0.0.0', '255.255.255.255')] == ["<IPv4 0.0.0.0/0>"]
Exemple #6
0
def test_ipv4_iter_cover():
    assert [repr(x) for x in IPv4("192.168.0.0/24").iter_cover(23)] == []
    assert [repr(x) for x in IPv4("192.168.0.0/24").iter_cover(24)] == ["<IPv4 192.168.0.0/24>"]
    assert [repr(x) for x in IPv4("192.168.0.0/23").iter_cover(24)] == [
        "<IPv4 192.168.0.0/24>", "<IPv4 192.168.1.0/24>"
    ]
    assert [repr(x) for x in IPv4("192.168.0.0/22").iter_cover(24)] == [
        "<IPv4 192.168.0.0/24>", "<IPv4 192.168.1.0/24>", "<IPv4 192.168.2.0/24>",
        "<IPv4 192.168.3.0/24>"
    ]
Exemple #7
0
def test_ipv4_hash(p1, p2):
    p1 = IPv4(p1)
    p2 = IPv4(p2)
    s = {p1}
    assert p1 in s
    assert p2 not in s
    ss = {p1: 1}
    assert ss[p1] == 1
    with pytest.raises(KeyError):
        ss[p2]  # pylint: disable=pointless-statement
Exemple #8
0
def test_ipv4_comparison(p1, p2, c, eq, ne, lt, le, gt, ge):
    p1 = IPv4(p1)
    p2 = IPv4(p2)
    assert ((p1 > p2) - (p1 < p2)) == c
    assert (p1 == p2) is eq
    assert (p1 != p2) is ne
    assert (p1 < p2) is lt
    assert (p1 > p2) is gt
    assert (p1 <= p2) is le
    assert (p1 >= p2) is ge
Exemple #9
0
def test_ipv4_comparison(ipv4_comparison):
    p1, p2, c, eq, ne, lt, le, gt, ge = ipv4_comparison
    p1 = IPv4(p1)
    p2 = IPv4(p2)
    assert cmp(p1, p2) is c
    assert (p1 == p2) is eq
    assert (p1 != p2) is ne
    assert (p1 < p2) is lt
    assert (p1 > p2) is gt
    assert (p1 <= p2) is le
    assert (p1 >= p2) is ge
Exemple #10
0
def test_ipv4_iter_address():
    assert [repr(x) for x in IPv4("192.168.0.0").iter_address(count=5)] == [
        "<IPv4 192.168.0.0/32>", "<IPv4 192.168.0.1/32>", "<IPv4 192.168.0.2/32>",
        "<IPv4 192.168.0.3/32>", "<IPv4 192.168.0.4/32>"
    ]
    assert [repr(x) for x in IPv4("192.168.0.255").iter_address(count=5)] == [
        "<IPv4 192.168.0.255/32>", "<IPv4 192.168.1.0/32>", "<IPv4 192.168.1.1/32>",
        "<IPv4 192.168.1.2/32>", "<IPv4 192.168.1.3/32>"
    ]
    assert [repr(x) for x in IPv4("192.168.0.255").iter_address(until="192.168.1.3")] == [
        "<IPv4 192.168.0.255/32>", "<IPv4 192.168.1.0/32>", "<IPv4 192.168.1.1/32>",
        "<IPv4 192.168.1.2/32>", "<IPv4 192.168.1.3/32>"
    ]
Exemple #11
0
def test_prefixdb_ipv4():
    db = PrefixDB()
    db[IPv4("192.168.0.0/24")] = 1
    db[IPv4("192.168.1.0/24")] = 2
    db[IPv4("192.168.2.0/24")] = 3
    db[IPv4("10.0.0.0/8")] = 4
    assert db[IPv4("192.168.0.0/24")] == 1
    assert db[IPv4("192.168.1.0/24")] == 2
    assert db[IPv4("192.168.2.0/24")] == 3
    assert db[IPv4("10.0.0.0/8")] == 4
    with pytest.raises(KeyError):
        db[IPv4("172.16.0.0/12")]
Exemple #12
0
def test_prefixdb_ipv4(p1, p2, p3, p4, p5, p6, p7, p8, p9):
    db = PrefixDB()
    db[IPv4(p1)] = p2
    db[IPv4(p3)] = p4
    db[IPv4(p5)] = p6
    db[IPv4(p7)] = p8
    assert db[IPv4(p1)] == p2
    assert db[IPv4(p3)] == p4
    assert db[IPv4(p5)] == p6
    assert db[IPv4(p7)] == p8
    with pytest.raises(KeyError):
        db[IPv4(p9)]
Exemple #13
0
    def execute(self):
        res = self.http.get(
            "/cgi-bin/configManager.cgi?action=getConfig&name=Network")
        # "getInterfaces"
        r = []
        if res:
            res = self.profile.parse_equal_output(res)
            name = res["table.Network.DefaultInterface"]
            iface = {
                "name": name,
                "type": "physical",
                "admin_status": True,
                "oper_status": True,
                "mtu": res["table.Network.%s.MTU" % name],
                "mac": res["table.Network.%s.PhysicalAddress" % name],
            }
            ip_address = "%s/%s" % (
                res["table.Network.%s.IPAddress" % name],
                IPv4.netmask_to_len(res["table.Network.%s.SubnetMask" % name]),
            )

            sub = {
                "name": name,
                "admin_status": True,
                "oper_status": True,
                "mac": res["table.Network.%s.PhysicalAddress" % name],
                "enabled_afi": ["IPv4"],
                "ipv4_addresses": [ip_address],
            }
            iface["subinterfaces"] = [sub]
            r += [iface]

        return [{"interfaces": r}]
 def forwards(self):
     PrefixTable = db.mock_model(model_name="PrefixTable",
         db_table="main_prefixtable", db_tablespace="", pk_field_name="id",
         pk_field_type=models.AutoField)
     db.add_column(
         "sa_activator", "prefix_table",
         models.ForeignKey(
             PrefixTable,
             verbose_name=_("Prefix Table"), null=True, blank=True)
     )
     # Migrate data
     for id, name, ip, to_ip in db.execute(
             "SELECT id, name, ip, to_ip FROM sa_activator"):
         pt_name = "Activator::%s" % name
         db.execute(
             """
             INSERT INTO main_prefixtable(name)
             VALUES(%s)
             """, [pt_name])
         pt_id, = db.execute("SELECT id FROM main_prefixtable WHERE name = %s", [pt_name])[0]
         for p in IPv4.range_to_prefixes(ip, to_ip):
             db.execute("""
                 INSERT INTO main_prefixtableprefix(table_id, afi, prefix)
                 VALUES(%s, '4', %s)
                 """, [pt_id, p.prefix])
         db.execute("UPDATE sa_activator SET prefix_table_id=%s WHERE id=%s", [pt_id, id])
Exemple #15
0
 def execute_snmp(self):
     i = [1, 2, 3, 4, 5]
     interfaces = []
     for ii in i:
         status = self.snmp.get("1.3.6.1.4.1.35419.20.1.10%s.0" % ii)
         if status == 0:
             admin_status = False
             oper_status = False
         else:
             admin_status = True
             oper_status = True
         iface = {
             "type":
             "physical",
             "name":
             ii,
             "admin_status":
             admin_status,
             "oper_status":
             oper_status,
             "snmp_ifindex":
             ii,
             "subinterfaces": [{
                 "name": ii,
                 "admin_status": admin_status,
                 "oper_status": oper_status,
                 "snmp_ifindex": ii,
             }],
         }
         interfaces += [iface]
     ip = self.snmp.get("1.3.6.1.4.1.35419.1.1.3.0")
     m = self.snmp.get("1.3.6.1.4.1.35419.1.1.4.0")
     mask = str(IPv4.netmask_to_len(m))
     ip = ip + "/" + mask
     ip_list = [ip]
     iface = {
         "type":
         "physical",
         "name":
         "eth0",
         "admin_status":
         True,
         "oper_status":
         True,
         "mac":
         self.snmp.get("1.3.6.1.4.1.35419.1.1.6.0"),
         "snmp_ifindex":
         10,
         "subinterfaces": [{
             "name": "eth0",
             "admin_status": True,
             "oper_status": True,
             "mac": self.snmp.get("1.3.6.1.4.1.35419.1.1.6.0"),
             "ipv4_addresses": ip_list,
             "snmp_ifindex": 10,
             "enabled_afi": ["BRIDGE", "IPv4"],
         }],
     }
     interfaces += [iface]
     return [{"interfaces": interfaces}]
Exemple #16
0
    def execute(self):
        sw = self.scripts.get_switchport()
        ports = self.scripts.get_interface_status()
        mv = self.rx_mv.search(self.cli("show vlan", cached=True))
        if mv:
            mv = int(mv.group("mv"))
        else:
            mv = 1
        interfaces = []
        for p in ports:
            ifname = p['interface']
            i = {
                "name":
                ifname,
                "type":
                "physical",
                "oper_status":
                p['status'],
                "enabled_protocols": [],
                "subinterfaces": [{
                    "name": ifname,
                    "oper_status": p['status'],
                    # "ifindex": 1,
                    "enabled_afi": ['BRIDGE']
                }]
            }
            for p1 in sw:
                if p1['interface'] == ifname:
                    i['subinterfaces'][0]['tagged_vlans'] = p1['tagged']
                    if 'untagged' in p1:
                        i['subinterfaces'][0]['untagged_vlan'] = p1['untagged']
            interfaces += [i]
        match = self.rx_swi.search(self.cli("show switch"))
        if match:
            i = {
                "name":
                "System",
                "type":
                "SVI",
                "oper_status":
                True,
                "admin_status":
                True,
                "enabled_protocols": [],
                "subinterfaces": [{
                    "name": "System",
                    "oper_status": True,
                    "admin_status": True,
                    "mac": match.group("mac"),
                    "vlan_ids": [mv],
                    "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]

        return [{"interfaces": interfaces}]
Exemple #17
0
    def execute(self):

        data = self.profile.var_data(self, "/setup_get.cgi")
        ip = data["ip"].encode("UTF8")
        mask = IPv4.netmask_to_len(data["mask"].encode("UTF8"))

        iface = {
            "name":
            "Fa1",
            "admin_status":
            True,
            "oper_status":
            True,
            "type":
            "physical",
            "description":
            data["location"].encode("UTF8"),
            "mac":
            data["mac"].encode("UTF8"),
            "subinterfaces": [{
                "name": "Fa1",
                "admin_status": True,
                "oper_status": True,
                "type": "physical",
                "description": data["hostname"].encode("UTF8"),
                "mac": data["mac"].encode("UTF8"),
                "enabled_afi": ["IPv4"],
                "ipv4_addresses": ["%s/%s" % (ip, mask)],
            }],
        }
        return [{"interfaces": [iface]}]
Exemple #18
0
 def execute(self):
     interfaces = []
     v = self.cli("ethstat")
     for match in self.rx_eth.finditer(v):
         iface = {
             "name": match.group("name"),
             "type": "physical",
             "enabled_protocols": [],
             "subinterfaces": [
                 {"name": match.group("name"), "enabled_afi": ["BRIDGE"], "tagged_vlans": []}
             ],
         }
         interfaces += [iface]
     for v in self.scripts.get_vlans():
         vlan_id = v["vlan_id"]
         c = self.cli("vlan %s -s" % vlan_id)
         match = self.rx_vlan.search(c)
         if match:
             for port in match.group("ports").split(","):
                 for i in interfaces:
                     if port == i["name"]:
                         i["subinterfaces"][0]["tagged_vlans"] += [vlan_id]
                         break
         else:
             match = self.rx_vlan2.search(c)
             for uport in match.group("uport").split(","):
                 for i in interfaces:
                     if uport and uport == i["name"]:
                         i["subinterfaces"][0]["untagged_vlan"] = vlan_id
             for tports in match.group("tports").split(","):
                 for i in interfaces:
                     if tports == i["name"]:
                         i["subinterfaces"][0]["tagged_vlans"] += [vlan_id]
                         break
     v = self.cli("ipconfig")
     match = self.rx_ip.search(v)
     ip_address = match.group("ip_address")
     ip_subnet = match.group("ip_subnet")
     ip_address = "%s/%s" % (ip_address, IPv4.netmask_to_len(ip_subnet))
     iface = {
         "name": "MGMT",
         "type": "SVI",
         "admin_status": True,
         "oper_status": True,
         "mac": match.group("mac"),
         "enabled_protocols": [],
         "subinterfaces": [
             {
                 "name": "MGMT",
                 "admin_status": True,
                 "oper_status": True,
                 "mac": match.group("mac"),
                 "enabled_afi": ["IPv4"],
                 "ipv4_addresses": [ip_address],
                 "vlan_ids": [int(match.group("vlan_id"))],
             }
         ],
     }
     interfaces += [iface]
     return [{"interfaces": interfaces}]
Exemple #19
0
 def execute_cli(self, **kwargs):
     iface = []
     cmd = self.scripts.get_chassis_id()
     mac = cmd[0]["first_chassis_mac"]
     self.cli("4")  # Enter Configuration menu
     cmd = self.cli("1")  # Enter Network submenu
     match = self.rx_ipaddr.search(cmd)
     ipaddr = match.group("ip")
     match = self.rx_mask.search(cmd)
     # netmask may be wrong when DHCP is used!
     mask = match.group("mask")
     ip = IPv4(ipaddr, mask)
     iface += [{
         "name":
         "mgmt",
         "admin_status":
         True,
         "oper_status":
         True,
         "type":
         "management",
         "mac":
         mac,
         "subinterfaces": [{
             "name": "mgmt",
             "enabled_afi": ["IPv4"],
             "mac": mac,
             "ipv4_addresses": [ip],
             "admin_status": True,
             "oper_status": True,
         }],
     }]
     iface += self.get_phys_ports()
     return [{"interfaces": iface}]
Exemple #20
0
 def execute_snmp(self, **kwargs):
     cmd = self.scripts.get_chassis_id()
     mac = cmd[0]["first_chassis_mac"]
     ipaddr = self.snmp.get(
         "1.3.6.1.4.1.32108.1.7.4.1.1.0")  # PLANAR-sdo3002-MIB::currentIP
     # netmask may be wrong when DHCP is used!
     mask = self.snmp.get("1.3.6.1.4.1.32108.1.7.4.1.4.0"
                          )  # PLANAR-sdo3002-MIB::staticSubnetMask
     ip = IPv4(ipaddr, mask)
     ifaces = [{
         "name":
         "mgmt",
         "admin_status":
         True,
         "oper_status":
         True,
         "type":
         "management",
         "mac":
         mac,
         "subinterfaces": [{
             "name": "mgmt",
             "enabled_afi": ["IPv4"],
             "mac": mac,
             "ipv4_addresses": [ip],
             "admin_status": True,
             "oper_status": True,
         }],
     }]
     ifaces += self.get_phys_ports()
     return [{"interfaces": ifaces}]
Exemple #21
0
 def upload_axfr(data):
     p = IP.prefix(prefix.prefix)
     count = 0
     for row in data:
         row = row.strip()
         if row == "" or row.startswith(";"):
             continue
         row = row.split()
         if len(row) != 5 or row[2] != "IN" or row[3] != "PTR":
             continue
         if row[3] == "PTR":
             # @todo: IPv6
             x = row[0].split(".")
             ip = "%s.%s.%s.%s" % (x[3], x[2], x[1], x[0])
             fqdn = row[4]
             if fqdn.endswith("."):
                 fqdn = fqdn[:-1]
         # Leave only addresses residing into "prefix"
         # To prevent uploading to not-owned blocks
         if not p.contains(IPv4(ip)):
             continue
         a, changed = Address.objects.get_or_create(vrf=vrf, afi=afi, address=ip)
         if a.fqdn != fqdn:
             a.fqdn = fqdn
             changed = True
         if changed:
             a.save()
             count += 1
     return count
Exemple #22
0
    def execute(self):
        r = []
        ns = {
            "isapi": "http://www.isapi.org/ver20/XMLSchema",
            "std-cgi": "http://www.std-cgi.com/ver20/XMLSchema",
            "hikvision": "http://www.hikvision.com/ver20/XMLSchema",
        }
        v = self.http.get("/ISAPI/System/Network/interfaces", use_basic=True)
        v = v.replace("\n", "")
        if "std-cgi" in v:
            ns["ns"] = ns["std-cgi"]
        elif "www.hikvision.com" in v:
            ns["ns"] = ns["hikvision"]
        else:
            ns["ns"] = ns["isapi"]
        root = ElementTree.fromstring(v)
        # mac = self.scripts.get_chassis_id()[0]["first_chassis_mac"]
        for o in root:
            o_id = o.find("{%s}id" % ns["ns"]).text
            name = "eth%s" % o_id
            iface = {"name": name, "type": "physical", "admin_status": True, "oper_status": True}
            sub = {"name": name, "admin_status": True, "oper_status": True, "enabled_afi": []}
            try:
                v = self.http.get("/ISAPI/System/Network/interfaces/%s/Link" % o_id, use_basic=True)
                v = v.replace("\n", "")
                v = ElementTree.fromstring(v)
                mac = v.find("{%s}MACAddress" % ns["ns"]).text
            except HTTPError:
                mac = self.scripts.get_chassis_id()[0]["first_chassis_mac"]

            if mac:
                sub["mac"] = mac
                iface["mac"] = mac
            ip = o.find("{%s}IPAddress" % ns["ns"])
            # for ip in ip_addresses:
            afi = ip.find("{%s}ipVersion" % ns["ns"]).text
            if afi == "v4":
                if "IPv4" not in sub["enabled_afi"]:
                    sub["enabled_afi"] += ["IPv4"]
                ip_address = "%s/%s" % (
                    ip.find("{%s}ipAddress" % ns["ns"]).text,
                    IPv4.netmask_to_len(ip.find("{%s}subnetMask" % ns["ns"]).text),
                )
                if "ipv4_addresses" in sub:
                    sub["ipv4_addresses"] += [ip_address]
                else:
                    sub["ipv4_addresses"] = [ip_address]
            if afi == "v6":
                if "IPv6" not in sub["enabled_afi"]:
                    sub["enabled_afi"] += ["IPv6"]
                ip_address = IPv6(
                    ip.find("{%s}ipAddress" % ns["ns"]).text,
                    netmask=ip.find("ns:subnetMask", ns).text,
                ).prefix

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

        return [{"interfaces": r}]
Exemple #23
0
 def get_vpn_id(ip):
     try:
         return vpn_db[IPv4(ip)]
     except KeyError:
         pass
     if self.object.vrf:
         return self.object.vrf.vpn_id
     return GLOBAL_VRF
Exemple #24
0
 def wildcard(self):
     """
     Returns Cisco wildcard for IPv4
     :return:
     """
     if self.is_ipv4:
         return IPv4(self.prefix).wildcard.address
     return ""
Exemple #25
0
 def size(self):
     """
     Returns IPv4 prefix size
     :return:
     """
     if self.is_ipv4:
         return IPv4(self.prefix).size
     return None
Exemple #26
0
 def broadcast(self):
     """
     Returns Broadcast for IPv4
     :return:
     """
     if self.is_ipv4:
         return IPv4(self.prefix).last.address
     return None
Exemple #27
0
 def netmask(self):
     """
     returns Netmask for IPv4
     :return:
     """
     if self.is_ipv4:
         return IPv4(self.prefix).netmask.address
     return None
Exemple #28
0
 def convert_prefix(self, prefix):
     """
     Convert ip prefix to the format accepted by router's CLI
     """
     if "/" in prefix and self.requires_netmask_conversion:
         prefix = IPv4(prefix)
         return "%s %s" % (prefix.address, prefix.netmask.address)
     return prefix
Exemple #29
0
 def on_interface_address(self, tokens):
     ip = str(IPv4(tokens[0], netmask=tokens[1]))
     si = self.get_current_subinterface()
     if len(tokens) > 2 and tokens[2] == "secondary":
         si.ipv4_addresses += [ip]
     else:
         si.ipv4_addresses = [ip] + si.ipv4_addresses
     si.add_afi("IPv4")
Exemple #30
0
 def to_prefix(self, address, netmask):
     """
     Convert address and netmask to prefix form
     :param address:
     :param netmask:
     :return:
     """
     return IPv4(address, netmask=netmask).prefix