예제 #1
0
def parse_dpg(dpg, hname):
    for child in dpg:
        hostname = child.find(str(QName(ns, "Hostname")))
        if hostname.text.lower() != hname.lower():
            continue

        ipintfs = child.find(str(QName(ns, "IPInterfaces")))
        intfs = {}
        for ipintf in ipintfs.findall(str(QName(ns, "IPInterface"))):
            intfalias = ipintf.find(str(QName(ns, "AttachTo"))).text
            intfname = port_alias_map.get(intfalias, intfalias)
            ipprefix = ipintf.find(str(QName(ns, "Prefix"))).text
            intfs[(intfname, ipprefix)] = {}

        lointfs = child.find(str(QName(ns, "LoopbackIPInterfaces")))
        lo_intfs = {}
        for lointf in lointfs.findall(str(QName(ns1, "LoopbackIPInterface"))):
            intfname = lointf.find(str(QName(ns, "AttachTo"))).text
            ipprefix = lointf.find(str(QName(ns1, "PrefixStr"))).text
            lo_intfs[(intfname, ipprefix)] = {}

        mgmtintfs = child.find(str(QName(ns, "ManagementIPInterfaces")))
        mgmt_intf = {}
        for mgmtintf in mgmtintfs.findall(
                str(QName(ns1, "ManagementIPInterface"))):
            intfname = mgmtintf.find(str(QName(ns, "AttachTo"))).text
            ipprefix = mgmtintf.find(str(QName(ns1, "PrefixStr"))).text
            mgmtipn = ipaddress.IPNetwork(ipprefix)
            gwaddr = ipaddress.IPAddress(int(mgmtipn.network) + 1)
            mgmt_intf[(intfname, ipprefix)] = {'gwaddr': gwaddr}

        pcintfs = child.find(str(QName(ns, "PortChannelInterfaces")))
        pc_intfs = []
        pcs = {}
        intfs_inpc = []  # List to hold all the LAG member interfaces
        for pcintf in pcintfs.findall(str(QName(ns, "PortChannel"))):
            pcintfname = pcintf.find(str(QName(ns, "Name"))).text
            pcintfmbr = pcintf.find(str(QName(ns, "AttachTo"))).text
            pcmbr_list = pcintfmbr.split(';')
            pc_intfs.append(pcintfname)
            for i, member in enumerate(pcmbr_list):
                pcmbr_list[i] = port_alias_map.get(member, member)
                intfs_inpc.append(pcmbr_list[i])
            if pcintf.find(str(QName(ns, "Fallback"))) != None:
                pcs[pcintfname] = {
                    'members': pcmbr_list,
                    'fallback': pcintf.find(str(QName(ns, "Fallback"))).text
                }
            else:
                pcs[pcintfname] = {'members': pcmbr_list}

        vlanintfs = child.find(str(QName(ns, "VlanInterfaces")))
        vlan_intfs = []
        vlans = {}
        vlan_members = {}
        for vintf in vlanintfs.findall(str(QName(ns, "VlanInterface"))):
            vintfname = vintf.find(str(QName(ns, "Name"))).text
            vlanid = vintf.find(str(QName(ns, "VlanID"))).text
            vintfmbr = vintf.find(str(QName(ns, "AttachTo"))).text
            vmbr_list = vintfmbr.split(';')
            for i, member in enumerate(vmbr_list):
                vmbr_list[i] = port_alias_map.get(member, member)
                sonic_vlan_member_name = "Vlan%s%s%s" % (vlanid, KEY_SEPARATOR,
                                                         vmbr_list[i])
                vlan_members[sonic_vlan_member_name] = {
                    'tagging_mode': 'untagged'
                }

            vlan_attributes = {'vlanid': vlanid}

            # If this VLAN requires a DHCP relay agent, it will contain a <DhcpRelays> element
            # containing a list of DHCP server IPs
            if vintf.find(str(QName(ns, "DhcpRelays"))) is not None:
                vintfdhcpservers = vintf.find(str(QName(ns,
                                                        "DhcpRelays"))).text
                vdhcpserver_list = vintfdhcpservers.split(';')
                vlan_attributes['dhcp_servers'] = vdhcpserver_list

            sonic_vlan_name = "Vlan%s" % vlanid
            if sonic_vlan_name != vintfname:
                vlan_attributes['alias'] = vintfname
            vlans[sonic_vlan_name] = vlan_attributes

        aclintfs = child.find(str(QName(ns, "AclInterfaces")))
        acls = {}
        for aclintf in aclintfs.findall(str(QName(ns, "AclInterface"))):
            aclname = aclintf.find(str(QName(ns,
                                             "InAcl"))).text.upper().replace(
                                                 " ", "_").replace("-", "_")
            aclattach = aclintf.find(str(QName(ns,
                                               "AttachTo"))).text.split(';')
            acl_intfs = []
            is_mirror = False

            # TODO: Ensure that acl_intfs will only ever contain front-panel interfaces (e.g.,
            # maybe we should explicity ignore management and loopback interfaces?) because we
            # decide an ACL is a Control Plane ACL if acl_intfs is empty below.
            for member in aclattach:
                member = member.strip()
                if pcs.has_key(member):
                    # If try to attach ACL to a LAG interface then we shall add the LAG to
                    # to acl_intfs directly instead of break it into member ports, ACL attach
                    # to LAG will be applied to all the LAG members internally by SAI/SDK
                    acl_intfs.append(member)
                elif vlans.has_key(member):
                    print >> sys.stderr, "Warning: ACL " + aclname + " is attached to a Vlan interface, which is currently not supported"
                elif port_alias_map.has_key(member):
                    acl_intfs.append(port_alias_map[member])
                    # Give a warning if trying to attach ACL to a LAG member interface, correct way is to attach ACL to the LAG interface
                    if port_alias_map[member] in intfs_inpc:
                        print >> sys.stderr, "Warning: ACL " + aclname + " is attached to a LAG member interface " + port_alias_map[
                            member] + ", instead of LAG interface"
                elif member.lower() == 'erspan':
                    is_mirror = True
                    # Erspan session will be attached to all front panel ports,
                    # if panel ports is a member port of LAG, should add the LAG
                    # to acl table instead of the panel ports
                    acl_intfs = pc_intfs
                    for panel_port in port_alias_map.values():
                        if panel_port not in intfs_inpc:
                            acl_intfs.append(panel_port)
                    break
            if acl_intfs:
                acls[aclname] = {
                    'policy_desc': aclname,
                    'ports': acl_intfs,
                    'type': 'MIRROR' if is_mirror else 'L3'
                }
            elif is_mirror:
                acls[aclname] = {'policy_desc': aclname, 'type': 'MIRROR'}
            else:
                # This ACL has no interfaces to attach to -- consider this a control plane ACL
                try:
                    aclservice = aclintf.find(str(QName(ns, "Type"))).text

                    # If we already have an ACL with this name and this ACL is bound to a different service,
                    # append the service to our list of services
                    if aclname in acls:
                        if acls[aclname]['type'] != 'CTRLPLANE':
                            print >> sys.stderr, "Warning: ACL '%s' type mismatch. Not updating ACL." % aclname
                        elif acls[aclname]['services'] == aclservice:
                            print >> sys.stderr, "Warning: ACL '%s' already contains service '%s'. Not updating ACL." % (
                                aclname, aclservice)
                        else:
                            acls[aclname]['services'].append(aclservice)
                    else:
                        acls[aclname] = {
                            'policy_desc': aclname,
                            'type': 'CTRLPLANE',
                            'services': [aclservice]
                        }
                except:
                    print >> sys.stderr, "Warning: Ignoring Control Plane ACL %s without type" % aclname

        return intfs, lo_intfs, mgmt_intf, vlans, vlan_members, pcs, acls
    return None, None, None, None, None, None, None
예제 #2
0
 def _cidr_to_ip_mask(self, network):
     addr = ipaddress.IPNetwork(network)
     ip_address, netmask = str(addr.ip), str(addr.netmask)
     self._address_cache[(ip_address, netmask)] = network
     return ip_address, netmask
예제 #3
0
파일: network.py 프로젝트: zeropool/kimchi
def get_dev_netaddrs():
    nets = []
    for dev in ethtool.get_devices():
        devnet = get_dev_netaddr(dev)
        devnet and nets.append(ipaddr.IPNetwork(devnet))
    return nets
	def check_for_IP(srcaddr, destaddr):
		 n = []
		 src = []
	 
		 try:
			 a = ipaddr.IPAddress(str(destaddr[0]))
		 
			 b = ipaddr.IPAddress(str(srcaddr[0]))
		 
			 n.append(ipaddr.IPNetwork(str(forward_list0[1] + '/' + forward_list0[4])))
			 n.append(ipaddr.IPNetwork(str(forward_list1[1] + '/' + forward_list1[4])))
			 n.append(ipaddr.IPNetwork(str(forward_list2[1] + '/' + forward_list2[4])))
			 n.append(ipaddr.IPNetwork(str(forward_list3[1] + '/' + forward_list3[4])))
			 n.append(ipaddr.IPNetwork(str(forward_list4[1] + '/' + forward_list4[4])))
			 n.append(ipaddr.IPNetwork(str(forward_list5[1] + '/' + forward_list5[4])))
			 n.append(ipaddr.IPNetwork(str(forward_list6[1] + '/' + forward_list6[4])))
			 n.append(ipaddr.IPNetwork(str(forward_list7[1] + '/' + forward_list7[4])))
			 n.append(ipaddr.IPNetwork(str(forward_list8[1] + '/' + forward_list8[4])))
			 n.append(ipaddr.IPNetwork(str(forward_list9[1] + '/' + forward_list9[4])))
			 n.append(ipaddr.IPNetwork(str(forward_list10[1] + '/' + forward_list10[4])))
			 n.append(ipaddr.IPNetwork(str(forward_list11[1] + '/' + forward_list11[4])))
		 
			 src.append(ipaddr.IPNetwork(str(forward_list0[0] + '/' + forward_list0[7])))
			 src.append(ipaddr.IPNetwork(str(forward_list1[0] + '/' + forward_list1[7])))	
			 src.append(ipaddr.IPNetwork(str(forward_list2[0] + '/' + forward_list2[7])))	
			 src.append(ipaddr.IPNetwork(str(forward_list3[0] + '/' + forward_list3[7])))		 
			 src.append(ipaddr.IPNetwork(str(forward_list4[0] + '/' + forward_list4[7])))	
			 src.append(ipaddr.IPNetwork(str(forward_list5[0] + '/' + forward_list5[7])))	
			 src.append(ipaddr.IPNetwork(str(forward_list6[0] + '/' + forward_list6[7])))	
			 src.append(ipaddr.IPNetwork(str(forward_list7[0] + '/' + forward_list7[7])))	
			 src.append(ipaddr.IPNetwork(str(forward_list8[0] + '/' + forward_list8[7])))	
			 src.append(ipaddr.IPNetwork(str(forward_list9[0] + '/' + forward_list9[7])))	
			 src.append(ipaddr.IPNetwork(str(forward_list10[0] + '/' + forward_list10[7])))	
			 src.append(ipaddr.IPNetwork(str(forward_list11[0] + '/' + forward_list11[7])))	
		 
		 
			 #A check to see if the packet has the source network address
			 if src[0].Contains(b) or src[1].Contains(b) or src[2].Contains(b) or src[3].Contains(b) or src[4].Contains(b) or src[5].Contains(b) or src[6].Contains(b) or src[7].Contains(b) or src[8].Contains(b) or src[9].Contains(b) or src[10].Contains(b) or src[11].Contains(b):
				flag = True
			 else:
				flag = False
		 
			 if flag:
				 #Algorithm to check longest match of the IP address and forwarding them accordingly 
				 if n[0].Contains(a):
						   if n[0].Contains(a) and n[1].Contains(a):
							   if forward_list0[4] <  forward_list1[4]:
								   return [forward_list1[3], forward_list1[5], forward_list1[6]]
						   else:
							   return [forward_list0[3], forward_list0[5], forward_list0[6]]
				 elif n[1].Contains(a):
					   if n[1].Contains(a) and n[2].Contains(a):
						   if forward_list1[4] <  forward_list2[4]:
							   return [forward_list2[3], forward_list2[5], forward_list2[6]]
					   else:
						   return [forward_list1[3], forward_list1[5], forward_list1[6]]
				 elif n[2].Contains(a):
					   if n[2].Contains(a) and n[3].Contains(a):
						   if forward_list2[4] <  forward_list3[4]:
							   return [forward_list3[3], forward_list3[5], forward_list3[6]]
					   else:
						   return [forward_list2[3], forward_list2[5], forward_list2[6]]
				 elif n[3].Contains(a):
					   if n[3].Contains(a) and n[4].Contains(a):
						   if forward_list3[4] <  forward_list4[4]:
							   return [forward_list4[3], forward_list4[5], forward_list4[6]]
					   else:
						   return [forward_list3[3], forward_list3[5], forward_list3[6]]
				 elif n[4].Contains(a):
					   if n[4].Contains(a) and n[5].Contains(a):
						   if forward_list4[4] <  forward_list5[4]:
							   return [forward_list5[3], forward_list5[5], forward_list5[6]]
					   else:
						   return [forward_list4[3], forward_list4[5], forward_list4[6]]
				 elif n[5].Contains(a):
					   if n[5].Contains(a) and n[6].Contains(a):
						   if forward_list5[4] <  forward_list6[4]:
							   return [forward_list6[3], forward_list6[5], forward_list6[6]]
					   else:
						   return [forward_list5[3], forward_list5[5], forward_list5[6]]
				 elif n[6].Contains(a):
					   if n[6].Contains(a) and n[7].Contains(a):
						   if forward_list6[4] <  forward_list7[4]:
							   return [forward_list7[3], forward_list7[5], forward_list7[6]]
					   else:
						   return [forward_list6[3], forward_list6[5], forward_list6[6]]
				 elif n[7].Contains(a):
					   if n[7].Contains(a) and n[8].Contains(a):
						   if forward_list7[4] <  forward_list8[4]:
							   return [forward_list8[3], forward_list8[5], forward_list8[6]]
					   else:
						   return [forward_list7[3], forward_list7[5], forward_list7[6]]
				 elif n[8].Contains(a):
					   if n[8].Contains(a) and n[9].Contains(a):
						   if forward_list8[4] <  forward_list9[4]:
							   return [forward_list9[3], forward_list9[5], forward_list9[6]]
					   else:
						   return [forward_list8[3], forward_list8[5], forward_list8[6]]
				 elif n[9].Contains(a):
					   if n[9].Contains(a) and n[10].Contains(a):
						   if forward_list9[4] <  forward_list10[4]:
							   return [forward_list10[3], forward_list10[5], forward_list10[6]]
					   else:
						   return [forward_list9[3], forward_list9[5], forward_list9[6]]
				 elif n[10].Contains(a):
						   return [forward_list10[3], forward_list10[5], forward_list10[6]]
				 elif n[11].Contains(a):
						   return [forward_list11[3], forward_list11[5], forward_list11[6]]
				 else:
					   return [str(1), str(1), forward_list0[6]] 
			 else:
				 return [str(1), str(1), forward_list0[6]] 	
		 except IndexError:
			   return [str(100), str(100)]  
		 except ValueError:
			   return [str(100), str(100)]
예제 #5
0
def parse_dpg(dpg, hname):
    for child in dpg:
        hostname = child.find(str(QName(ns, "Hostname")))
        if hostname.text != hname:
            continue

        ipintfs = child.find(str(QName(ns, "IPInterfaces")))
        intfs = {}
        for ipintf in ipintfs.findall(str(QName(ns, "IPInterface"))):
            intfalias = ipintf.find(str(QName(ns, "AttachTo"))).text
            intfname = port_alias_map.get(intfalias, intfalias)
            ipprefix = ipintf.find(str(QName(ns, "Prefix"))).text
            intfs[(intfname, ipprefix)] = {}

        lointfs = child.find(str(QName(ns, "LoopbackIPInterfaces")))
        lo_intfs = {}
        for lointf in lointfs.findall(str(QName(ns1, "LoopbackIPInterface"))):
            intfname = lointf.find(str(QName(ns, "AttachTo"))).text
            ipprefix = lointf.find(str(QName(ns1, "PrefixStr"))).text
            lo_intfs[(intfname, ipprefix)] = {}
            
        mgmtintfs = child.find(str(QName(ns, "ManagementIPInterfaces")))
        mgmt_intf = {}
        for mgmtintf in mgmtintfs.findall(str(QName(ns1, "ManagementIPInterface"))):
            intfname = mgmtintf.find(str(QName(ns, "AttachTo"))).text
            ipprefix = mgmtintf.find(str(QName(ns1, "PrefixStr"))).text
            mgmtipn = ipaddress.IPNetwork(ipprefix)
            gwaddr = ipaddress.IPAddress(int(mgmtipn.network) + 1)
            mgmt_intf[(intfname, ipprefix)] = {'gwaddr': gwaddr}

        pcintfs = child.find(str(QName(ns, "PortChannelInterfaces")))
        pc_intfs = []
        pcs = {}
        for pcintf in pcintfs.findall(str(QName(ns, "PortChannel"))):
            pcintfname = pcintf.find(str(QName(ns, "Name"))).text
            pcintfmbr = pcintf.find(str(QName(ns, "AttachTo"))).text
            pcmbr_list = pcintfmbr.split(';')
            for i, member in enumerate(pcmbr_list):
                pcmbr_list[i] = port_alias_map.get(member, member)
            pcs[pcintfname] = {'members': pcmbr_list}

        vlanintfs = child.find(str(QName(ns, "VlanInterfaces")))
        vlan_intfs = []
        vlans = {}
        for vintf in vlanintfs.findall(str(QName(ns, "VlanInterface"))):
            vintfname = vintf.find(str(QName(ns, "Name"))).text
            vlanid = vintf.find(str(QName(ns, "VlanID"))).text
            vintfmbr = vintf.find(str(QName(ns, "AttachTo"))).text
            vmbr_list = vintfmbr.split(';')
            for i, member in enumerate(vmbr_list):
                vmbr_list[i] = port_alias_map.get(member, member)
            vlan_attributes = {'members': vmbr_list, 'vlanid': vlanid}

            # If this VLAN requires a DHCP relay agent, it will contain a <DhcpRelays> element
            # containing a list of DHCP server IPs
            if vintf.find(str(QName(ns, "DhcpRelays"))) is not None:
                vintfdhcpservers = vintf.find(str(QName(ns, "DhcpRelays"))).text
                vdhcpserver_list = vintfdhcpservers.split(';')
                vlan_attributes['dhcp_servers'] = vdhcpserver_list

            sonic_vlan_name = "Vlan%s" % vlanid
            vlans[sonic_vlan_name] = vlan_attributes

        aclintfs = child.find(str(QName(ns, "AclInterfaces")))
        acls = {}
        for aclintf in aclintfs.findall(str(QName(ns, "AclInterface"))):
            aclname = aclintf.find(str(QName(ns, "InAcl"))).text.lower().replace(" ", "_").replace("-", "_")
            aclattach = aclintf.find(str(QName(ns, "AttachTo"))).text.split(';')
            acl_intfs = []
            is_mirror = False
            for member in aclattach:
                member = member.strip()
                if pcs.has_key(member):
                    acl_intfs.extend(pcs[member]['members'])  # For ACL attaching to port channels, we break them into port channel members
                elif vlans.has_key(member):
                    print >> sys.stderr, "Warning: ACL " + aclname + " is attached to a Vlan interface, which is currently not supported"
                elif port_alias_map.has_key(member):
                    acl_intfs.append(port_alias_map[member])
                elif member.lower() == 'erspan':
                    is_mirror = True;
                    # Erspan session will be attached to all front panel ports
                    acl_intfs = port_alias_map.values()
                    break;
            if acl_intfs:
                acls[aclname] = { 'policy_desc': aclname, 'ports': acl_intfs, 'type': 'mirror' if is_mirror else 'L3'}
        return intfs, lo_intfs, mgmt_intf, vlans, pcs, acls
    return None, None, None, None, None, None
예제 #6
0
def parse_dpg(dpg, hname):
    for child in dpg:
        hostname = child.find(str(QName(ns, "Hostname")))
        if hostname.text != hname:
            continue

        ipintfs = child.find(str(QName(ns, "IPInterfaces")))
        intfs = []
        vlan_map = {}
        for ipintf in ipintfs.findall(str(QName(ns, "IPInterface"))):
            intfname = ipintf.find(str(QName(ns, "AttachTo"))).text
            ipprefix = ipintf.find(str(QName(ns, "Prefix"))).text
            ipn = ipaddress.IPNetwork(ipprefix)
            ipaddr = ipn.ip
            prefix_len = ipn.prefixlen
            addr_bits = ipn.max_prefixlen
            subnet = ipaddress.IPNetwork(
                str(ipn.network) + '/' + str(prefix_len))
            ipmask = ipn.netmask

            intf = {'addr': ipaddr, 'subnet': subnet}
            if isinstance(ipn, ipaddress.IPv4Network):
                intf['mask'] = ipmask
            else:
                intf['mask'] = str(prefix_len)

            if intfname[0:4] == "Vlan":
                if intfname in vlan_map:
                    vlan_map[intfname].append(intf)

                else:
                    vlan_map[intfname] = [intf]
            else:
                intf.update({'name': intfname, 'prefixlen': int(prefix_len)})

                if port_alias_map.has_key(intfname):
                    intf['alias'] = port_alias_map[intfname]
                else:
                    intf['alias'] = intfname

                # TODO: remove peer_addr after dependency removed
                ipaddr_val = int(ipn.ip)
                peer_addr_val = None
                if int(prefix_len) == addr_bits - 2:
                    if ipaddr_val & 0x3 == 1:
                        peer_addr_val = ipaddr_val + 1
                    else:
                        peer_addr_val = ipaddr_val - 1
                elif int(prefix_len) == addr_bits - 1:
                    if ipaddr_val & 0x1 == 0:
                        peer_addr_val = ipaddr_val + 1
                    else:
                        peer_addr_val = ipaddr_val - 1

                if peer_addr_val is not None:
                    intf['peer_addr'] = ipaddress.IPAddress(peer_addr_val)
                intfs.append(intf)

        pcintfs = child.find(str(QName(ns, "PortChannelInterfaces")))
        pc_intfs = []
        for pcintf in pcintfs.findall(str(QName(ns, "PortChannel"))):
            pcintfname = pcintf.find(str(QName(ns, "Name"))).text
            pcintfmbr = pcintf.find(str(QName(ns, "AttachTo"))).text
            mbr_list = pcintfmbr.split(';', 1)
            pc_intfs.append({'name': pcintfname.lower(), 'members': mbr_list})

        lointfs = child.find(str(QName(ns, "LoopbackIPInterfaces")))
        lo_intfs = []
        for lointf in lointfs.findall(str(QName(ns1, "LoopbackIPInterface"))):
            intfname = lointf.find(str(QName(ns, "AttachTo"))).text
            ipprefix = lointf.find(str(QName(ns1, "PrefixStr"))).text
            ipn = ipaddress.IPNetwork(ipprefix)
            ipaddr = ipn.ip
            prefix_len = ipn.prefixlen
            ipmask = ipn.netmask
            lo_intf = {
                'name': intfname,
                'addr': ipaddr,
                'prefixlen': prefix_len
            }
            if isinstance(ipn, ipaddress.IPv4Network):
                lo_intf['mask'] = ipmask
            else:
                lo_intf['mask'] = str(prefix_len)
            lo_intfs.append(lo_intf)

        mgmtintfs = child.find(str(QName(ns, "ManagementIPInterfaces")))
        mgmt_intf = None
        for mgmtintf in mgmtintfs.findall(
                str(QName(ns1, "ManagementIPInterface"))):
            ipprefix = mgmtintf.find(str(QName(ns1, "PrefixStr"))).text
            mgmtipn = ipaddress.IPNetwork(ipprefix)
            ipaddr = mgmtipn.ip
            prefix_len = str(mgmtipn.prefixlen)
            ipmask = mgmtipn.netmask
            gwaddr = ipaddress.IPAddress(int(mgmtipn.network) + 1)
            mgmt_intf = {
                'addr': ipaddr,
                'prefixlen': prefix_len,
                'mask': ipmask,
                'gwaddr': gwaddr
            }

        vlanintfs = child.find(str(QName(ns, "VlanInterfaces")))
        vlan_intfs = []
        for vintf in vlanintfs.findall(str(QName(ns, "VlanInterface"))):
            vintfname = vintf.find(str(QName(ns, "Name"))).text
            vlanid = vintf.find(str(QName(ns, "VlanID"))).text
            members = vintf.find(str(QName(ns, "AttachTo"))).text
            members = " ".join(members.split(';'))
            vlan_attributes = {
                'name': vintfname,
                'members': members,
                'vlanid': vlanid
            }
            for addrtuple in vlan_map.get(vintfname, []):
                vlan_attributes.update(addrtuple)
                vlan_intfs.append(copy.deepcopy(vlan_attributes))

        return intfs, lo_intfs, mgmt_intf, vlan_intfs, pc_intfs
    return None, None, None, None, None
예제 #7
0
 def calculate_usable_ips(net):
     ips = ipaddr.IPNetwork(net.address).numhosts
     reserved = net.reserved_addresses_bottom + net.reserved_addresses_top
     return ips - reserved - 2
예제 #8
0
파일: models.py 프로젝트: gopinath81/vmss
 def __init__(self, ips):
     self.networks = [ipaddr.IPNetwork(ip) for ip in ips]
예제 #9
0
def parse_prefix(args):
    network = ipaddr.IPNetwork(args.prefix)
    return IpPrefix(ip=BinaryAddress(addr=network.ip.packed),
                    prefixLength=network.prefixlen)
### Compute the percentage of assigned prefixes by Afrinic that are seen at the ASN.

for cc in CC_IXP.keys():

    if cc in week_prefix.keys():

        print
        print 'Number of ASNs allocated to CC:', len(CC_ASNs_AFRINIC[cc])
        #print 'Number of Origin ASNs seen at the IXP:', len(list(set(week_prefix[ixp])))

        intersection = []
        rest = []

        for prefix_adv in week_prefix[cc]:
            if prefix_adv != '0.0.0.0/0':
                prefix_AF_adv = ipaddr.IPNetwork(str(prefix_adv))
                for prefix_assigned in list(set(CC_ASNs_AFRINIC[cc])):
                    if prefix_assigned not in intersection and prefix_assigned != '0.0.0.0/0':
                        prefix_AF_assigned = ipaddr.IPNetwork(
                            str(prefix_assigned))

                        if cidrsOverlap(prefix_AF_adv, prefix_AF_assigned):
                            #if prefix_AF_adv.overlaps(prefix_AF_assigned):
                            print 'Filling the file 1_percentage_of_allocated_prefixes_seen_at_all_IXPs_of_each_country.txt', prefix_AF_adv, ' overlaps ', prefix_AF_assigned
                            intersection.append(prefix_assigned)

        if '0.0.0.0/0' in intersection:
            intersection.remove('0.0.0.0/0')

        if '0.0.0.0/0' in CC_ASNs_AFRINIC[cc]:
            CC_ASNs_AFRINIC[cc].remove('0.0.0.0/0')
예제 #11
0
파일: types.py 프로젝트: agdsn/pycroft
 def process_result_value(self, value, dialect):
     if value is None:
         return value
     return ipaddr.IPNetwork(value)
예제 #12
0
 def __init__(self, name, cidr):
     self.name = name
     self.cidr = ipaddr.IPNetwork(cidr)
     self.router = None
     self.networks = []
     self.subnets = []
예제 #13
0
 def parse_graph(self):
     """
     Parse  the xml graph file
     """
     deviceinfo = {}
     deviceroot = self.root.find(self.pngtag).find('Devices')
     devices = deviceroot.findall('Device')
     if devices is not None:
         for dev in devices:
             hostname = dev.attrib['Hostname']
             if hostname is not None:
                 deviceinfo[hostname] = {}
                 hwsku = dev.attrib['HwSku']
                 devtype = dev.attrib['Type']
                 deviceinfo[hostname]['HwSku'] = hwsku
                 deviceinfo[hostname]['Type'] = devtype
                 self.links[hostname] = {}
     devicel2info = {}
     devicel3s = self.root.find(self.dpgtag).findall('DevicesL3Info')
     devicel2s = self.root.find(self.dpgtag).findall('DevicesL2Info')
     if devicel2s is not None:
         for l2info in devicel2s:
             hostname = l2info.attrib['Hostname']
             if hostname is not None:
                 devicel2info[hostname] = {}
                 vlans = l2info.findall('InterfaceVlan')
                 for vlan in vlans:
                     portname = vlan.attrib['portname']
                     portmode = vlan.attrib['mode']
                     portvlanid = vlan.attrib['vlanids']
                     portvlanlist = self.port_vlanlist(portvlanid)
                     devicel2info[hostname][portname] = {
                         'mode': portmode,
                         'vlanids': portvlanid,
                         'vlanlist': portvlanlist
                     }
     if devicel3s is not None:
         for l3info in devicel3s:
             hostname = l3info.attrib['Hostname']
             if hostname is not None:
                 management_ip = l3info.find(
                     'ManagementIPInterface').attrib['Prefix']
                 deviceinfo[hostname]['ManagementIp'] = management_ip
                 mgmtip = ipaddress.IPNetwork(management_ip)
                 deviceinfo[hostname]['mgmtip'] = str(mgmtip.ip)
                 management_gw = str(mgmtip.network + 1)
                 deviceinfo[hostname]['ManagementGw'] = management_gw
     allinks = self.root.find(self.pngtag).find(
         'DeviceInterfaceLinks').findall('DeviceInterfaceLink')
     if allinks is not None:
         for link in allinks:
             start_dev = link.attrib['StartDevice']
             end_dev = link.attrib['EndDevice']
             if start_dev:
                 self.links[start_dev][link.attrib['StartPort']] = {
                     'peerdevice': link.attrib['EndDevice'],
                     'peerport': link.attrib['EndPort']
                 }
             if end_dev:
                 self.links[end_dev][link.attrib['EndPort']] = {
                     'peerdevice': link.attrib['StartDevice'],
                     'peerport': link.attrib['StartPort']
                 }
     self.devices = deviceinfo
     self.vlanport = devicel2info
예제 #14
0
def parse_xml(filename, platform=None, port_config_file=None):
    root = ET.parse(filename).getroot()
    mini_graph_path = filename

    u_neighbors = None
    u_devices = None
    hwsku = None
    bgp_sessions = None
    bgp_asn = None
    intfs = None
    vlan_intfs = None
    pc_intfs = None
    vlans = None
    vlan_members = None
    pcs = None
    mgmt_intf = None
    lo_intf = None
    neighbors = None
    devices = None
    hostname = None
    port_speeds_default = {}
    port_speed_png = {}
    port_descriptions = {}
    console_ports = {}
    syslog_servers = []
    dhcp_servers = []
    ntp_servers = []
    tacacs_servers = []
    mgmt_routes = []
    erspan_dst = []
    bgp_peers_with_range = None
    deployment_id = None

    hwsku_qn = QName(ns, "HwSku")
    hostname_qn = QName(ns, "Hostname")
    for child in root:
        if child.tag == str(hwsku_qn):
            hwsku = child.text
        if child.tag == str(hostname_qn):
            hostname = child.text

    (ports, alias_map) = get_port_config(hwsku, platform, port_config_file)
    port_alias_map.update(alias_map)
    for child in root:
        if child.tag == str(QName(ns, "DpgDec")):
            (intfs, lo_intfs, mgmt_intf, vlans, vlan_members, pcs,
             acls) = parse_dpg(child, hostname)
        elif child.tag == str(QName(ns, "CpgDec")):
            (bgp_sessions, bgp_asn,
             bgp_peers_with_range) = parse_cpg(child, hostname)
        elif child.tag == str(QName(ns, "PngDec")):
            (neighbors, devices, console_dev, console_port, mgmt_dev,
             mgmt_port, port_speed_png,
             console_ports) = parse_png(child, hostname)
        elif child.tag == str(QName(ns, "UngDec")):
            (u_neighbors, u_devices, _, _, _, _, _,
             _) = parse_png(child, hostname)
        elif child.tag == str(QName(ns, "MetadataDeclaration")):
            (syslog_servers, dhcp_servers, ntp_servers, tacacs_servers,
             mgmt_routes, erspan_dst,
             deployment_id) = parse_meta(child, hostname)
        elif child.tag == str(QName(ns, "DeviceInfos")):
            (port_speeds_default,
             port_descriptions) = parse_deviceinfo(child, hwsku)

    current_device = [
        devices[key] for key in devices if key.lower() == hostname.lower()
    ][0]
    results = {}
    results['DEVICE_METADATA'] = {
        'localhost': {
            'bgp_asn': bgp_asn,
            'deployment_id': deployment_id,
            'hostname': hostname,
            'hwsku': hwsku,
            'type': current_device['type']
        }
    }
    results['BGP_NEIGHBOR'] = bgp_sessions
    results['BGP_PEER_RANGE'] = bgp_peers_with_range
    if mgmt_routes:
        # TODO: differentiate v4 and v6
        mgmt_intf.itervalues().next()['forced_mgmt_routes'] = mgmt_routes
    results['MGMT_INTERFACE'] = mgmt_intf
    results['LOOPBACK_INTERFACE'] = lo_intfs

    phyport_intfs = {}
    vlan_intfs = {}
    pc_intfs = {}
    vlan_invert_mapping = {
        v['alias']: k
        for k, v in vlans.items() if v.has_key('alias')
    }

    for intf in intfs:
        if intf[0][0:4] == 'Vlan':
            vlan_intfs[intf] = {}
        elif vlan_invert_mapping.has_key(intf[0]):
            vlan_intfs[(vlan_invert_mapping[intf[0]], intf[1])] = {}
        elif intf[0][0:11] == 'PortChannel':
            pc_intfs[intf] = {}
        else:
            phyport_intfs[intf] = {}

    results['INTERFACE'] = phyport_intfs
    results['VLAN_INTERFACE'] = vlan_intfs

    for port_name in port_speeds_default:
        # ignore port not in port_config.ini
        if not ports.has_key(port_name):
            continue

        ports.setdefault(port_name,
                         {})['speed'] = port_speeds_default[port_name]

    for port_name in port_speed_png:
        # not consider port not in port_config.ini
        if port_name not in ports:
            print >> sys.stderr, "Warning: ignore interface '%s' as it is not in the port_config.ini" % port_name
            continue

        ports.setdefault(port_name, {})['speed'] = port_speed_png[port_name]

    for port_name, port in ports.items():
        if port.get('speed') == '100000':
            port['fec'] = 'rs'

    for port_name in port_descriptions:
        # ignore port not in port_config.ini
        if not ports.has_key(port_name):
            continue

        ports.setdefault(port_name,
                         {})['description'] = port_descriptions[port_name]

    results['PORT'] = ports
    results['CONSOLE_PORT'] = console_ports

    if port_config_file:
        port_set = set(ports.keys())
        for (pc_name, mbr_map) in pcs.items():
            # remove portchannels that contain ports not existing in port_config.ini
            # when port_config.ini exists
            if not set(mbr_map['members']).issubset(port_set):
                print >> sys.stderr, "Warning: ignore '%s' as part of its member interfaces is not in the port_config.ini" % pc_name
                del pcs[pc_name]

    results['PORTCHANNEL'] = pcs

    for pc_intf in pc_intfs.keys():
        # remove portchannels not in PORTCHANNEL dictionary
        if pc_intf[0] not in pcs:
            print >> sys.stderr, "Warning: ignore '%s' interface '%s' as '%s' is not in the valid PortChannel list" % (
                pc_intf[0], pc_intf[1], pc_intf[0])
            del pc_intfs[pc_intf]

    results['PORTCHANNEL_INTERFACE'] = pc_intfs

    results['VLAN'] = vlans
    results['VLAN_MEMBER'] = vlan_members

    for nghbr in neighbors.keys():
        # remove port not in port_config.ini
        if nghbr not in ports:
            print >> sys.stderr, "Warning: ignore interface '%s' in DEVICE_NEIGHBOR as it is not in the port_config.ini" % nghbr
            del neighbors[nghbr]

    results['DEVICE_NEIGHBOR'] = neighbors
    results['DEVICE_NEIGHBOR_METADATA'] = {
        key: devices[key]
        for key in devices if key.lower() != hostname.lower()
    }
    results['SYSLOG_SERVER'] = dict((item, {}) for item in syslog_servers)
    results['DHCP_SERVER'] = dict((item, {}) for item in dhcp_servers)
    results['NTP_SERVER'] = dict((item, {}) for item in ntp_servers)
    results['TACPLUS_SERVER'] = dict((item, {
        'priority': '1',
        'tcp_port': '49'
    }) for item in tacacs_servers)

    results['ACL_TABLE'] = acls
    mirror_sessions = {}
    if erspan_dst:
        lo_addr = '0.0.0.0'
        for lo in lo_intfs:
            lo_network = ipaddress.IPNetwork(lo[1])
            if lo_network.version == 4:
                lo_addr = str(lo_network.ip)
                break
        count = 0
        for dst in erspan_dst:
            mirror_sessions['everflow{}'.format(count)] = {
                "dst_ip": dst,
                "src_ip": lo_addr
            }
            count += 1
        results['MIRROR_SESSION'] = mirror_sessions

    return results
예제 #15
0
def create_subnet(request):
    """Create a subnet
    network_id and the desired cidr are mandatory, everything else is optional

    """
    dictionary = utils.get_request_dict(request)
    user_id = request.user_uniq
    log.info('create subnet user: %s request: %s', user_id, dictionary)

    try:
        subnet = dictionary['subnet']
        network_id = subnet['network_id']
        cidr = subnet['cidr']
    except KeyError:
        raise api.faults.BadRequest("Malformed request")

    name = subnet.get('name', None)
    ipversion = subnet.get('ip_version', 4)

    allocation_pools = subnet.get('allocation_pools', None)
    if allocation_pools is not None:
        allocation_pools = parse_ip_pools(allocation_pools)

    try:
        cidr_ip = ipaddr.IPNetwork(cidr)
    except ValueError:
        raise api.faults.BadRequest("Malformed CIDR '%s'" % cidr)

    # If no gateway is specified, send an empty string, because None is used
    # if the user wants no gateway at all
    gateway = subnet.get('gateway_ip', "")
    if gateway is "":
        gateway = str(cidr_ip.network + 1)

    dhcp = subnet.get('enable_dhcp', True)
    slaac = subnet.get('enable_slaac', None)

    if ipversion == 6:
        if slaac is not None:
            dhcp = check_boolean_value(slaac, "enable_slaac")
        else:
            dhcp = check_boolean_value(dhcp, "dhcp")
    else:
        dhcp = check_boolean_value(dhcp, "dhcp")

    dns = subnet.get('dns_nameservers', None)
    hosts = subnet.get('host_routes', None)

    sub = subnets.create_subnet(network_id=network_id,
                                cidr=cidr,
                                name=name,
                                ipversion=ipversion,
                                gateway=gateway,
                                dhcp=dhcp,
                                slaac=slaac,
                                dns_nameservers=dns,
                                allocation_pools=allocation_pools,
                                host_routes=hosts,
                                user_id=user_id)

    subnet_dict = subnet_to_dict(sub)
    data = json.dumps({'subnet': subnet_dict})
    return HttpResponse(data, status=201)
예제 #16
0
def _to_addr(tok):
    try:
        return ipaddr.IPAddress(tok)
    except:
        return ipaddr.IPNetwork(tok)
예제 #17
0
 4-scan 192.168.1.1 for password-protected shares 
  ./netbios-shares-scanner 192.168.1.1/24 yourname%yourpass

 5-scan network range for password-protected shares and save list to file
  ./netbios-shares-scanner 192.168.1.1/24 yourname%yourpass > results.txt

"""
        sys.exit()
    if len(sys.argv) == 3:
        usernamePasswordParam = '-U ' + sys.argv[2]
    ipToScan = sys.argv[1]
    ipList = []
    try:  #preparing IPs list
        if ipToScan.find("-") == -1 and ipToScan.count('.') == 3:
            ips = ipaddr.IPNetwork(sys.argv[1])
            ipList = [str(x) for x in list(ips)]
        if ipToScan.find("-") != -1:
            import iprange
            ip12 = ipToScan.split('-')
            ip1 = iprange.ip2int(ip12[0])
            ip2 = iprange.ip2int(ip12[1])
            for r in iprange.getrange(ip1, ip2):
                ips = ipaddr.IPNetwork(r)
                ipList.extend([str(x) for x in list(ips)])

    except ValueError:
        print "Error in IP!"

    for x in ipList:
        print "Scanning ", x
예제 #18
0
 def _cidr_to_ip_mask(network):
     addr = ipaddress.IPNetwork(network)
     return str(addr.ip), str(addr.netmask)
예제 #19
0
 def _ip_networks(elt):
     return [
         ipaddr.IPNetwork(x.text)
         for x in elt.iter('{%s}IPHint' % NS['mdui'])
     ]
예제 #20
0
 def as_network(self):
     return ipaddr.IPNetwork(self.as_prefixed)
	def ouput_forward(srcaddr, destaddr, data, outputportSpeed001, outputportSpeed002, outputportSpeed003):
			global outputCounter_a
			global outputCounter_b
			global outputCounter_c
			global lista
			global listb
			global listc
			global queue_1_a_cnt
			global queue_1_b_cnt
			global queue_1_c_cnt
			global queue_2_a_cnt
			global queue_2_b_cnt
			global queue_2_c_cnt
			global queue_3_a_cnt
			global queue_3_b_cnt
			global queue_3_c_cnt
			global r104count
			global Destination1_count
			j = 0
			start1a = 0
			start1b = 0
			start1c = 0
			start2a = 0
			start2b = 0
			start2c = 0
			start3a = 0
			start3b = 0
			start3c = 0
			count1 = 0
			count2 = 0
			count3 = 0
			q1a=Queue()
			q1b=Queue()
			q1c=Queue()
			q2a=Queue()
			q2b=Queue()
			q2c=Queue()
			q3a=Queue()
			q3b=Queue()
			q3c=Queue()

			check_ip = [] 
			dest_Port_queue = []
			dest_Port_queue = check_for_IP(srcaddr, destaddr)
		
			try:
				data = data[0]
			except IndexError:
				pass
			
			
			if outputportSpeed001 != 0 and outputportSpeed002 != 0 and outputportSpeed003 != 0: 
				highest = float(det_highest(outputportSpeed001, outputportSpeed002, outputportSpeed003))
				speedFactor001  = float(highest/outputportSpeed001)-1
				speedFactor002  = float(highest/outputportSpeed002)-1
				speedFactor003  = float(highest/outputportSpeed003)-1
			else:
				outputport001 = float (queueSpeed001_a + queueSpeed001_b + queueSpeed001_c) /3
				outputport002 = float (queueSpeed002_a + queueSpeed002_b + queueSpeed002_c) /3
				outputport003 = float (queueSpeed003_a + queueSpeed003_a + queueSpeed003_c) /3
				highest = float(det_highest(outputport001, outputport002, outputport003))
				speedFactor001 = float(highest/outputport001)-1
				speedFactor002 = float(highest/outputport002)-1
				speedFactor003 = float(highest/outputport003)-1
				
			#Check for a specific IP address
			check_ip.append(ipaddr.IPNetwork(str('216.15.0.0/16')))   
			check_ip.append(ipaddr.IPNetwork(str('177.215.200.0/21'))) 
			try:
			    checkaddress = ipaddr.IPAddress(str(destaddr[0]))  
			except IndexError:
			    pass
			    
		
			if dest_Port_queue[0] == '1':
				if (dest_Port_queue[1] == '1'):   
					q1a.push(data)
					start1a = timeit.default_timer()
					queue_1_a_cnt = queue_1_a_cnt + 1
				elif (dest_Port_queue[1] == '2'):       
					q1b.push(data)
					start1b = timeit.default_timer()
					queue_1_b_cnt = queue_1_b_cnt + 1
				else:
					q1c.push(data)
					start1c = timeit.default_timer()
					queue_1_c_cnt = queue_1_c_cnt + 1
				start = timeit.default_timer()
				time.sleep((randint(1,2)/100)*speedFactor001)
				if (dest_Port_queue[1] == '1'):
					write_Output('Router_4_Port_1', q1a.pop())
					stop1a = timeit.default_timer()
					list1a.append(stop1a-start1a)	
				elif (dest_Port_queue[1] == '2'):  
					write_Output('Router_4_Port_1', q1b.pop())
					stop1b = timeit.default_timer()
					list1b.append(stop1b-start1b)
						
				else:
					if check_ip[1].Contains(checkaddress):  
						rand_data = q1c.pop()
						write_Output('Destination1', rand_data) 
						write_Output('R104', rand_data)
						Destination1_count = Destination1_count + 1 
					else:
						write_Output('Router_4_Port_1', rand_data)
						stop1c = timeit.default_timer()
						list1c.append(stop1c-start1c)

				outputCounter_a = outputCounter_a + 1
				
			elif dest_Port_queue[0] == '2':
				if (dest_Port_queue[1] == '1'):        
					q2a.push(data)
					start2a = timeit.default_timer()
					queue_2_a_cnt = queue_2_a_cnt + 1
				elif (dest_Port_queue[1] == '2'):       
					q2b.push(data)
					start2b = timeit.default_timer()
					queue_2_b_cnt = queue_2_b_cnt + 1
				else:
					q2c.push(data)
					start2c = timeit.default_timer()
					queue_2_c_cnt = queue_2_c_cnt + 1
				start = timeit.default_timer()
				time.sleep((randint(1,2)/100)*speedFactor002)
				if (dest_Port_queue[1] == '1'):  
					if check_ip[0].Contains(checkaddress):  
						write_Output('Destination1', q2a.pop()) 
						Destination1_count = Destination1_count + 1 
					else:
						write_Output('Router_4_Port_2', q2a.pop())
						stop2a = timeit.default_timer()
						list2a.append(stop2a-start2a)
				elif (dest_Port_queue[1] == '2'):  
					write_Output('Router_4_Port_2', q2b.pop())
					stop2b = timeit.default_timer()
					list2b.append(stop2b-start2b)
				else: 
 
					write_Output('Router_4_Port_2', q2c.pop())
					stop2c = timeit.default_timer()
					list2c.append(stop2c-start2c)
		
				outputCounter_b = outputCounter_b + 1
			   
			elif dest_Port_queue[0] == '3':
				if (dest_Port_queue[1] == '1'):          
					q3a.push(data)
					start3a = timeit.default_timer()
					queue_3_a_cnt = queue_3_a_cnt + 1
				elif (dest_Port_queue[1] == '2'):  
					q3b.push(data)
					start3b = timeit.default_timer()
					queue_3_b_cnt = queue_3_b_cnt + 1
				else:
					q3c.push(data)
					start3c = timeit.default_timer()
					queue_3_c_cnt = queue_3_c_cnt + 1
				start = timeit.default_timer()
				time.sleep((randint(1,2)/100)*speedFactor003) 
				if (dest_Port_queue[1] == '1'):
					write_Output('Router_4_Port_3', q3a.pop())
					stop3a = timeit.default_timer()
					list3a.append(stop3a-start3a)
				elif (dest_Port_queue[1] == '2'):
					write_Output('Router_4_Port_3', q3b.pop())
					stop3b = timeit.default_timer()
					list3b.append(stop3b-start3b)
				else:
					write_Output('Router_4_Port_3', q3c.pop())
					stop3c = timeit.default_timer()
					list3c.append(stop3c-start3c)
			 
				outputCounter_c = outputCounter_c + 1
				
			else:
				#print "Invalid port found : ", dest_Port_queue[0]
				pass
			
			return {'outputLink - 1':outputCounter_a, 'outputLink - 2':outputCounter_b, 'outputLink - 3':outputCounter_c , 'Dropped on - 1':dropped_a, 'Dropped on - 2':dropped_b, 'Dropped on - 3':dropped_c}
예제 #22
0
 def _check_inclusion_in_network_whitelist(self, cidr):
     for entry in self.network_whitelist:
         if ipaddr.IPNetwork(cidr) in ipaddr.IPNetwork(str(entry.cidr)):
             return True
     return False
예제 #23
0
파일: search.py 프로젝트: lmzopq/ralph
    def get_queryset(self):
        empty_field = 'none'
        if self.query is not None:
            return self.query
        self.query = ReadOnlyDevice.objects.none()
        self.set_searchform()
        if self.searchform.is_valid():
            data = self.searchform.cleaned_data
            if data['deleted']:
                self.query = Device.admin_objects.all()
            else:
                self.query = Device.objects.all()
            if data['name']:
                name = data['name'].strip()
                names = set(
                    n.strip('.')
                    for (n, ) in Record.objects.filter(type='CNAME').filter(
                        name__icontains=name).values_list('content'))
                ips = set(
                    ip.strip('.')
                    for (ip, ) in Record.objects.filter(type='A').filter(
                        Q(name__icontains=name)
                        | Q(name__in=names)).values_list('content'))
                q = (_search_fields_or([
                    'name__contains',
                    'ipaddress__hostname__icontains',
                ], name.split()) | Q(ipaddress__address__in=ips, ))
                self.query = self.query.filter(q).distinct()
            if data['address']:
                if data['address'] == empty_field:
                    self.query = self.query.filter(ipaddress=None)
                elif '/' in data['address']:
                    try:
                        net = ipaddr.IPNetwork(data['address'])
                    except ValueError:
                        pass
                    else:
                        min_ip = int(net.network)
                        max_ip = int(net.broadcast)
                        self.query = self.query.filter(
                            ipaddress__number__lte=max_ip,
                            ipaddress__number__gte=min_ip)
                else:
                    q = _search_fields_or(['ipaddress__address__icontains'],
                                          data['address'].split(' '))
                    self.query = self.query.filter(q).distinct()
            if data['remarks']:
                if data['remarks'] == empty_field:
                    self.query = self.query.filter(remarks='')
                else:
                    self.query = self.query.filter(
                        remarks__icontains=data['remarks'])
            if data['model']:
                if data['model'] == empty_field:
                    self.query = self.query.filter(model=None)
                else:
                    q = _search_fields_or([
                        'model__name__icontains',
                        'model__group__name__icontains',
                    ], data['model'].split('|'))
                    self.query = self.query.filter(q).distinct()
            if data['component']:
                if data['component'].isdigit():
                    q = _search_fields_or([
                        'processor__model__id', 'memory__model__id',
                        'storage__model__id', 'ethernet__id',
                        'genericcomponent__model__id',
                        'fibrechannel__model__id',
                        'disksharemount__share__model__id',
                        'operatingsystem__model__id'
                    ], data['component'].split('|'))
                    self.query = self.query.filter(q).distinct()
                else:
                    q = _search_fields_or([
                        'genericcomponent__label__icontains',
                        'genericcomponent__model__name__icontains',
                        'genericcomponent__model__group__name__icontains',
                        'ethernet__mac__icontains',
                        'fibrechannel__label__icontains',
                        'fibrechannel__model__name__icontains',
                        'fibrechannel__model__group__name__icontains',
                        'storage__label__icontains',
                        'storage__model__name__icontains',
                        'storage__model__group__name__icontains',
                        'memory__label__icontains',
                        'memory__model__name__icontains',
                        'memory__model__group__name__icontains',
                        'processor__label__icontains',
                        'processor__model__name__icontains',
                        'processor__model__group__name__icontains',
                        'disksharemount__share__label__icontains',
                        'disksharemount__share__wwn__icontains',
                        'disksharemount__share__model__name__icontains',
                        'operatingsystem__model__name__icontains'
                    ], data['component'].split('|'))
                    self.query = self.query.filter(q).distinct()
            if data['software']:
                if data['software'].isdigit():
                    q = _search_fields_or([
                        'software__model__id',
                    ], data['software'].split('|'))
                    self.query = self.query.filter(q).distinct()
                else:
                    match = SOFTWARE_RE.match(data['software'])
                    if match:
                        name, operator, version = (
                            match.group('name'),
                            match.group('operator'),
                            match.group('version1') or match.group('version2'),
                        )
                    else:
                        name = data['software'].strip()
                        operator, version = None, None
                    # We take 3 formats into the consideration:
                    # 1) package name
                    # 2) package name + == or > or < or >= or >= + version
                    # 3) package name + ^= + version - is startswith
                    if not operator:
                        self.query = self.query.filter(
                            Q(software__label__icontains=name)
                            | Q(software__model__name__icontains=name)
                            | Q(software__model__group__name__icontains=name)
                        ).distinct()
                    elif name and operator and version:
                        operators = {
                            '==': '',
                            '^=': '__startswith',
                            '>': '__gt',
                            '>=': '__gte',
                            '<': '__lt',
                            '<=': '__lte',
                        }
                        soft_q = Q(**{
                            'software__version' + operators[operator]:
                            version
                        })
                        self.query = self.query.filter(
                            (Q(software__label__icontains=name) & soft_q)
                            | (Q(software__model__name__icontains=name)
                               & soft_q)
                            | (Q(software__model__group__name__icontains=name)
                               & soft_q)).distinct()
            if data['serial']:
                if data['serial'] == empty_field:
                    self.query = self.query.filter(
                        Q(sn=None) | Q(ethernet__mac=None)
                        | Q(genericcomponent__sn=None))
                else:
                    serial = data['serial'].replace(':', '')
                    q = _search_fields_or([
                        'sn__icontains',
                        'ethernet__mac__icontains',
                        'genericcomponent__sn__icontains',
                        'diskshare__wwn',
                        'disksharemount__share__wwn',
                    ], serial.split())
                    self.query = self.query.filter(q).distinct()
            if data['barcode']:
                if data['barcode'] == empty_field:
                    self.query = self.query.filter(barcode=None)
                else:
                    self.query = self.query.filter(
                        barcode__icontains=data['barcode'])
            if data['position']:
                if data['position'] == empty_field:
                    self.query = self.query.filter(
                        Q(position=None) | Q(dc=None) | Q(rack=None))
                else:
                    q = Q()
                    for part in data['position'].split():
                        q |= _search_fields_and([
                            'position__icontains',
                            'dc__icontains',
                            'rack__icontains',
                        ], part.split('/'))
                    self.query = self.query.filter(q).distinct()
            if data['history']:
                q = _search_fields_or([
                    'historychange__old_value__icontains',
                    'historychange__new_value__icontains',
                ], data['history'].split())
                self.query = self.query.filter(q).distinct()
            if data['role']:
                q = Q()

                if data['role'] == empty_field or data['role'].strip() == '-':
                    self.query = self.query.filter(venture=None)
                elif data['role'].strip() == '*':
                    self.query = self.query.exclude(venture=None)
                else:
                    for part in data['role'].split():
                        try:
                            role_id = int(part)
                        except:
                            q |= _search_fields_and([
                                'venture_role__name__icontains',
                                'venture_role__parent__name__icontains',
                                'venture_role__parent__parent__name__icontains',
                                'venture__name__icontains',
                                'venture__symbol__icontains',
                            ], part.split('/'))
                        else:
                            q |= _search_fields_or([
                                'venture__id',
                                'venture__parent__id',
                                'venture__parent__parent__id',
                                'venture__parent__parent__parent__id',
                                'venture__parent__parent__parent__parent__id',
                            ], [str(role_id)])
                    self.query = self.query.filter(q).distinct()
            if data['device_group']:
                self.query = self.query.filter(
                    model__group_id=data['device_group'])
            if data['component_group']:
                is_splunk = ComponentModel.objects.filter(
                    group_id=str(data['component_group']),
                    family='splunkusage').exists()
                if is_splunk:
                    yesterday = datetime.date.today() - datetime.timedelta(
                        days=1)
                    q = Q(splunkusage__day=yesterday)
                else:
                    q = _search_fields_or([
                        'genericcomponent__model__group_id',
                        'fibrechannel__model__group_id',
                        'storage__model__group_id',
                        'memory__model__group_id',
                        'processor__model__group_id',
                        'disksharemount__share__model__group_id',
                    ], [str(data['component_group'])])
                self.query = self.query.filter(q).distinct()
            if data['device_type']:
                self.query = self.query.filter(
                    model__type__in=data['device_type'])
            if data['no_purchase_date']:
                self.query = self.query.filter(purchase_date=None)
            else:
                if data['purchase_date_start']:
                    self.query = self.query.filter(
                        purchase_date__gte=data['purchase_date_start'])
                if data['purchase_date_end']:
                    self.query = self.query.filter(
                        purchase_date__lte=data['purchase_date_end'])
            if data['no_deprecation_date']:
                self.query = self.query.filter(purchase_date=None)
            else:
                if data['deprecation_date_start']:
                    self.query = self.query.filter(
                        deprecation_date__gte=data['deprecation_date_start'])
                if data['deprecation_date_end']:
                    self.query = self.query.filter(
                        deprecation_date__lte=data['deprecation_date_end'])
            if data['deprecation_kind']:
                if data['deprecation_kind'][0] == "None":
                    self.query = self.query.filter(
                        deprecation_kind__isnull=True, )
                else:
                    self.query = self.query.filter(
                        deprecation_kind__id__exact=data['deprecation_kind']
                        [0], )
            if data['no_warranty_expiration_date']:
                self.query = self.query.filter(warranty_expiration_date=None)
            else:
                if data['warranty_expiration_date_start']:
                    self.query = self.query.filter(
                        warranty_expiration_date__gte=data[
                            'warranty_expiration_date_start'])
                if data['warranty_expiration_date_end']:
                    self.query = self.query.filter(
                        warranty_expiration_date__lte=data[
                            'warranty_expiration_date_end'])
            if data['no_support_expiration_date']:
                self.query = self.query.filter(support_expiration_date=None)
            else:
                if data['support_expiration_date_start']:
                    self.query = self.query.filter(
                        support_expiration_date__gte=data[
                            'support_expiration_date_start'])
                if data['support_expiration_date_end']:
                    self.query = self.query.filter(
                        support_expiration_date__lte=data[
                            'support_expiration_date_end'])
            if data['with_changes']:
                changed_devices_ids = self._get_changed_devices_ids()
                self.query = self.query.filter(id__in=changed_devices_ids)
        profile = self.request.user.get_profile()
        if not profile.has_perm(Perm.read_dc_structure):
            self.query = profile.filter_by_perm(self.query,
                                                Perm.list_devices_generic)
        self.query = super(SearchDeviceList, self).get_queryset(self.query)
        self.query = self.query.distinct()
        return self.query
예제 #24
0
    def __init__(self, routerlinks, ports, subnets):
        logging.debug('Ports available: %s' % (len(ports)))
        logging.debug('Subnets available: %s' % (subnets))
        for sub in subnets:
            logging.debug('Processing subnet: %s' % (sub))
            blocks = ipaddr.IPNetwork(sub, strict=True).subnet(new_prefix=30)
            for block in blocks:
                logging.debug('P2P block available: %s' % (block))
                self.subnets.append(block)

        logging.debug('Loaded %s /30s' % (len(self.subnets)))
        self.subnets.reverse()

        links_needed = None
        # Create router objects for each router and client
        for rtr in routerlinks:
            logging.debug('Creating router object: %s' % (rtr))
            self.routers[rtr] = Router(rtr)
            for rtrcli in routerlinks[rtr]:
                logging.debug('Creating router (client): %s' % (rtrcli))
                self.routers[rtrcli] = Router(rtrcli)

        # For each router, create a link object, assign a server and client router object, assign ports and interface
        # numbers along with a subnet.
        for rtr in routerlinks:
            for rtrclient in routerlinks[rtr]:
                logging.debug('Creating new link from %s to %s with iface %s' %
                              (rtr, rtrclient, self.iface_count))
                try:
                    newlink = Link(self.routers[rtr], self.routers[rtrclient],
                                   ports.pop(), self.iface_count,
                                   self.subnets.pop())
                except IndexError as e:
                    if len(self.subnets) < 1:
                        raise Exception(
                            'Not enough subnets available.  Add a larger range of IPs and try again.'
                        )
                    elif len(self.ports) < 1:
                        raise Exception(
                            'Not enough ports available.  Add additional port ranges and try again.'
                        )
                    else:
                        raise e

                if rtr not in self.links:
                    self.links[rtr] = []
                self.links[rtr].append(newlink)

                if rtrclient not in self.links:
                    self.links[rtrclient] = []
                self.links[rtrclient].append(newlink)
                self.iface_count += 1

        links_needed = 0
        for srv in self.links:
            links_needed += len(self.links[srv])
        logging.debug('%s links needed' % (links_needed))

        subnets_available = len(self.subnets)
        logging.debug('%s subnets available' % (subnets_available))

        if links_needed > subnets_available:
            raise Exception(
                'Not enough subnets available: %s needed, %s available' %
                (links_needed, subnets_available))
예제 #25
0
def parse_xml(filename, platform=None, port_config_file=None):
    root = ET.parse(filename).getroot()
    mini_graph_path = filename

    u_neighbors = None
    u_devices = None
    hwsku = None
    bgp_sessions = None
    bgp_asn = None
    intfs = None
    vlan_intfs = None
    pc_intfs = None
    vlans = None
    pcs = None
    mgmt_intf = None
    lo_intf = None
    neighbors = None
    devices = None
    hostname = None
    port_speeds = {}
    syslog_servers = []
    dhcp_servers = []
    ntp_servers = []
    mgmt_routes = []
    erspan_dst = []
    bgp_peers_with_range = None
    deployment_id = None

    hwsku_qn = QName(ns, "HwSku")
    hostname_qn = QName(ns, "Hostname")
    for child in root:
        if child.tag == str(hwsku_qn):
            hwsku = child.text
        if child.tag == str(hostname_qn):
            hostname = child.text

    (ports, alias_map) = get_port_config(hwsku, platform, port_config_file)
    port_alias_map.update(alias_map)
    for child in root:
        if child.tag == str(QName(ns, "DpgDec")):
            (intfs, lo_intfs, mgmt_intf, vlans, pcs, acls) = parse_dpg(child, hostname)
        elif child.tag == str(QName(ns, "CpgDec")):
            (bgp_sessions, bgp_asn, bgp_peers_with_range) = parse_cpg(child, hostname)
        elif child.tag == str(QName(ns, "PngDec")):
            (neighbors, devices, console_dev, console_port, mgmt_dev, mgmt_port) = parse_png(child, hostname)
        elif child.tag == str(QName(ns, "UngDec")):
            (u_neighbors, u_devices, _, _, _, _) = parse_png(child, hostname)
        elif child.tag == str(QName(ns, "MetadataDeclaration")):
            (syslog_servers, dhcp_servers, ntp_servers, mgmt_routes, erspan_dst, deployment_id) = parse_meta(child, hostname)
        elif child.tag == str(QName(ns, "DeviceInfos")):
            port_speeds = parse_deviceinfo(child, hwsku)

    results = {}
    results['DEVICE_METADATA'] = {'localhost': { 
        'bgp_asn': bgp_asn,
        'deployment_id': deployment_id,
        'hostname': hostname,
        'hwsku': hwsku,
        'type': devices[hostname]['type']
        }}
    results['BGP_NEIGHBOR'] = bgp_sessions
    results['BGP_PEER_RANGE'] = bgp_peers_with_range
    if mgmt_routes:
        # TODO: differentiate v4 and v6
        mgmt_intf.itervalues().next()['forced_mgmt_routes'] = mgmt_routes
    results['MGMT_INTERFACE'] = mgmt_intf
    results['LOOPBACK_INTERFACE'] = lo_intfs

    phyport_intfs = {}
    vlan_intfs = {}
    pc_intfs = {}
    for intf in intfs:
        if intf[0][0:4] == 'Vlan':
            vlan_intfs[intf] = {}
        elif intf[0][0:11] == 'PortChannel':
            pc_intfs[intf] = {}
        else:
            phyport_intfs[intf] = {}

    results['INTERFACE'] = phyport_intfs
    results['VLAN_INTERFACE'] = vlan_intfs
    results['PORTCHANNEL_INTERFACE'] = pc_intfs

    for port_name in port_speeds:
        ports.setdefault(port_name, {})['speed'] = port_speeds[port_name]
    results['PORT'] = ports
    results['PORTCHANNEL'] = pcs
    results['VLAN'] = vlans

    results['DEVICE_NEIGHBOR'] = neighbors
    results['DEVICE_NEIGHBOR_METADATA'] = { key:devices[key] for key in devices if key != hostname }
    results['SYSLOG_SERVER'] = dict((item, {}) for item in syslog_servers)
    results['DHCP_SERVER'] = dict((item, {}) for item in dhcp_servers)
    results['NTP_SERVER'] = dict((item, {}) for item in ntp_servers)

    results['ACL_TABLE'] = acls
    mirror_sessions = {}
    if erspan_dst:
        lo_addr = '0.0.0.0'
        for lo in lo_intfs:
            lo_network = ipaddress.IPNetwork(lo[1])
            if lo_network.version == 4:
                lo_addr = str(lo_network.ip)
                break
        count = 0
        for dst in erspan_dst:
            mirror_sessions['everflow{}'.format(count)] = {"dst_ip": dst, "src_ip": lo_addr}
            count += 1
        results['MIRROR_SESSION'] = mirror_sessions

    return results
예제 #26
0
def parse_dpg(dpg, hname):
    for child in dpg:
        hostname = child.find(str(QName(ns, "Hostname")))
        if hostname.text != hname:
            continue

        ipintfs = child.find(str(QName(ns, "IPInterfaces")))
        intfs = []
        for ipintf in ipintfs.findall(str(QName(ns, "IPInterface"))):
            intfalias = ipintf.find(str(QName(ns, "AttachTo"))).text
            if port_alias_map.has_key(intfalias):
                intfname = port_alias_map[intfalias]
            else:
                intfname = intfalias
            ipprefix = ipintf.find(str(QName(ns, "Prefix"))).text
            ipn = ipaddress.IPNetwork(ipprefix)
            ipaddr = ipn.ip
            prefix_len = ipn.prefixlen
            addr_bits = ipn.max_prefixlen
            subnet = ipaddress.IPNetwork(str(ipn.network) + '/' + str(prefix_len))
            ipmask = ipn.netmask

            intf = {'addr': ipaddr, 'subnet': subnet}
            if isinstance(ipn, ipaddress.IPv4Network):
                intf['mask'] = ipmask
            else:
                intf['mask'] = str(prefix_len)
            intf.update({'attachto': intfname, 'prefixlen': int(prefix_len)})
                    
            # TODO: remove peer_addr after dependency removed
            ipaddr_val = int(ipn.ip)
            peer_addr_val = None
            if int(prefix_len) == addr_bits - 2:
                if ipaddr_val & 0x3 == 1:
                    peer_addr_val = ipaddr_val + 1
                else:
                    peer_addr_val = ipaddr_val - 1
            elif int(prefix_len) == addr_bits - 1:
                if ipaddr_val & 0x1 == 0:
                    peer_addr_val = ipaddr_val + 1
                else:
                    peer_addr_val = ipaddr_val - 1
                    
            if peer_addr_val is not None:
                intf['peer_addr'] = ipaddress.IPAddress(peer_addr_val)
            intfs.append(intf)
            ports[intfname] = {'name': intfname, 'alias': intfalias}

        lointfs = child.find(str(QName(ns, "LoopbackIPInterfaces")))
        lo_intfs = []
        for lointf in lointfs.findall(str(QName(ns1, "LoopbackIPInterface"))):
            intfname = lointf.find(str(QName(ns, "AttachTo"))).text
            ipprefix = lointf.find(str(QName(ns1, "PrefixStr"))).text
            ipn = ipaddress.IPNetwork(ipprefix)
            ipaddr = ipn.ip
            prefix_len = ipn.prefixlen
            ipmask = ipn.netmask
            lo_intf = {'name': intfname, 'addr': ipaddr, 'prefixlen': prefix_len}
            if isinstance(ipn, ipaddress.IPv4Network):
                lo_intf['mask'] = ipmask
            else:
                lo_intf['mask'] = str(prefix_len)
            lo_intfs.append(lo_intf)

        mgmtintfs = child.find(str(QName(ns, "ManagementIPInterfaces")))
        mgmt_intf = None
        for mgmtintf in mgmtintfs.findall(str(QName(ns1, "ManagementIPInterface"))):
            ipprefix = mgmtintf.find(str(QName(ns1, "PrefixStr"))).text
            mgmtipn = ipaddress.IPNetwork(ipprefix)
            # Ignore IPv6 management address
            if mgmtipn.version == 6:
                continue
            ipaddr = mgmtipn.ip
            prefix_len = str(mgmtipn.prefixlen)
            ipmask = mgmtipn.netmask
            gwaddr = ipaddress.IPAddress(int(mgmtipn.network) + 1)
            mgmt_intf = {'addr': ipaddr, 'prefixlen': prefix_len, 'mask': ipmask, 'gwaddr': gwaddr}

        pcintfs = child.find(str(QName(ns, "PortChannelInterfaces")))
        pc_intfs = []
        pcs = {}
        for pcintf in pcintfs.findall(str(QName(ns, "PortChannel"))):
            pcintfname = pcintf.find(str(QName(ns, "Name"))).text
            pcintfmbr = pcintf.find(str(QName(ns, "AttachTo"))).text
            pcmbr_list = pcintfmbr.split(';', 1)
            for i, member in enumerate(pcmbr_list):
                pcmbr_list[i] = port_alias_map[member]
                ports[port_alias_map[member]] = {'name': port_alias_map[member], 'alias': member}
            pcs[pcintfname] = {'name': pcintfname, 'members': pcmbr_list}
            ports.pop(pcintfname)

        vlanintfs = child.find(str(QName(ns, "VlanInterfaces")))
        vlan_intfs = []
        dhcp_servers = []
        vlans = {}
        for vintf in vlanintfs.findall(str(QName(ns, "VlanInterface"))):
            vintfname = vintf.find(str(QName(ns, "Name"))).text
            vlanid = vintf.find(str(QName(ns, "VlanID"))).text
            vintfmbr = vintf.find(str(QName(ns, "AttachTo"))).text
            vmbr_list = vintfmbr.split(';')
            vlandhcpservers = vintf.find(str(QName(ns, "DhcpRelays"))).text
            dhcp_servers = vlandhcpservers.split(";")
            for i, member in enumerate(vmbr_list):
                vmbr_list[i] = port_alias_map[member]
                ports[port_alias_map[member]] = {'name': port_alias_map[member], 'alias': member}
            vlan_attributes = {'name': vintfname, 'members': vmbr_list, 'vlanid': vlanid}
            vlans[vintfname] = vlan_attributes
            ports.pop(vintfname)

        aclintfs = child.find(str(QName(ns, "AclInterfaces")))
        acls = {}
        for aclintf in aclintfs.findall(str(QName(ns, "AclInterface"))):
            aclname = aclintf.find(str(QName(ns, "InAcl"))).text
            aclattach = aclintf.find(str(QName(ns, "AttachTo"))).text.split(';')
            acl_intfs = []
            for member in aclattach:
                member = member.strip()
                if pcs.has_key(member):
                    acl_intfs.extend(pcs[member]['members'])  # For ACL attaching to port channels, we break them into port channel members
                elif vlans.has_key(member):
                    print >> sys.stderr, "Warning: ACL " + aclname + " is attached to a Vlan interface, which is currently not supported"
                elif port_alias_map.has_key(member):
                    acl_intfs.append(port_alias_map[member])
            if acl_intfs:
                acls[aclname] = acl_intfs

        return intfs, lo_intfs, mgmt_intf, vlans, pcs, acls, dhcp_servers
    return None, None, None, None, None, None
예제 #27
0
파일: network.py 프로젝트: zeropool/kimchi
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
#

import ethtool
import ipaddr

APrivateNets = ipaddr.IPNetwork("10.0.0.0/8")
BPrivateNets = ipaddr.IPNetwork("172.16.0.0/12")
CPrivateNets = ipaddr.IPNetwork('192.168.0.0/16')
PrivateNets = [CPrivateNets, BPrivateNets, APrivateNets]
DefaultNetsPool = [
    ipaddr.IPNetwork('192.168.122.0/23'),
    ipaddr.IPNetwork('192.168.124.0/22'),
    ipaddr.IPNetwork('192.168.128.0/17')
]


def get_dev_macaddr(dev):
    info = ethtool.get_interfaces_info(dev)[0]
    return info.mac_address

예제 #28
0
def render_ip_pool(pool):
    network = ipaddr.IPNetwork(pool.base).network
    start = str(network + pool.offset)
    end = str(network + pool.offset + pool.size - 1)
    return {"start": start, "end": end}
예제 #29
0
 def get_config_dhcpv4_start(self):
     try:
         return ipaddr.IPNetwork(self.widget("net-dhcpv4-start").get_text())
     except:
         return None
예제 #30
0
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
#

import ethtool
import ipaddr

APrivateNets = ipaddr.IPNetwork("10.0.0.0/8")
BPrivateNets = ipaddr.IPNetwork("172.16.0.0/12")
CPrivateNets = ipaddr.IPNetwork('192.168.0.0/16')
PrivateNets = [CPrivateNets, BPrivateNets, APrivateNets]


def get_dev_netaddr(dev):
    info = ethtool.get_interfaces_info(dev)[0]
    return (info.ipv4_address and "%s/%s" %
            (info.ipv4_address, info.ipv4_netmask) or '')


def get_dev_netaddrs():
    nets = []
    for dev in ethtool.get_devices():
        devnet = get_dev_netaddr(dev)