mirror of
				https://github.com/peeringdb/peeringdb.git
				synced 2024-05-11 05:55:09 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			96 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			96 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
import ipaddress
 | 
						|
import re
 | 
						|
 | 
						|
import rdap
 | 
						|
from rdap import RdapAsn
 | 
						|
from rdap.exceptions import RdapException, RdapHTTPError, RdapNotFoundError
 | 
						|
import requests
 | 
						|
 | 
						|
from peeringdb_server import settings
 | 
						|
 | 
						|
 | 
						|
class RdapLookup(rdap.RdapClient):
 | 
						|
    """
 | 
						|
    Does RDAP lookups against defined URL.
 | 
						|
    """
 | 
						|
 | 
						|
    def __init__(self):
 | 
						|
        # create rdap config
 | 
						|
        config = dict(
 | 
						|
            bootstrap_url=settings.RDAP_URL.rstrip('/'),
 | 
						|
            lacnic_apikey=settings.RDAP_LACNIC_APIKEY,
 | 
						|
        )
 | 
						|
        super(RdapLookup, self).__init__(config)
 | 
						|
 | 
						|
 | 
						|
def network_is_bogon(network):
 | 
						|
    """
 | 
						|
    Returns if the passed ipaddress network is a bogon
 | 
						|
 | 
						|
    Arguments:
 | 
						|
        - network <ipaddress.IPv4Network|ipaddress.IPv6Network>
 | 
						|
 | 
						|
    Return:
 | 
						|
        - bool
 | 
						|
    """
 | 
						|
 | 
						|
    return not network.is_global or network.is_reserved
 | 
						|
 | 
						|
 | 
						|
def network_is_pdb_valid(network):
 | 
						|
    """
 | 
						|
    Return if the passed ipaddress network is in pdb valid
 | 
						|
    address space
 | 
						|
 | 
						|
    Arguments:
 | 
						|
        - network <ipaddress.IPv4Network|ipaddress.IPv6Network>
 | 
						|
 | 
						|
    Return:
 | 
						|
        - bool
 | 
						|
    """
 | 
						|
 | 
						|
    if network.is_multicast or network_is_bogon(network):
 | 
						|
        return False
 | 
						|
 | 
						|
    if network.version == 4:
 | 
						|
        return True
 | 
						|
 | 
						|
    # not allowed v6 blocks
 | 
						|
    v6_invalid = [
 | 
						|
        # 2002::/16 - RFC 3068 - 6to4 prefix
 | 
						|
        0x2002,
 | 
						|
        # 3ffe::/16 - RFC 5156 - used for the 6bone but was returned
 | 
						|
        0x3ffe,
 | 
						|
        # fec0::/10 - RFC 4291 - Reserved by IETF
 | 
						|
        0xfec0,
 | 
						|
        # ff00::/8 - RFC 4291 - Multicast
 | 
						|
        0xff00,
 | 
						|
    ]
 | 
						|
 | 
						|
    if int(network.network_address) >> 112 in v6_invalid:
 | 
						|
        return False
 | 
						|
 | 
						|
    return True
 | 
						|
 | 
						|
 | 
						|
def get_prefix_protocol(prefix):
 | 
						|
    """
 | 
						|
    Takes a network address space prefix string and returns
 | 
						|
    a string describing the protocol
 | 
						|
 | 
						|
    Will raise a ValueError if it cannot determine protocol
 | 
						|
 | 
						|
    Returns:
 | 
						|
        str: IPv4 or IPv6
 | 
						|
    """
 | 
						|
 | 
						|
    try:
 | 
						|
        ipaddress.IPv4Network(prefix)
 | 
						|
        return "IPv4"
 | 
						|
    except ipaddress.AddressValueError:
 | 
						|
        try:
 | 
						|
            ipaddress.IPv6Network(prefix)
 | 
						|
            return "IPv6"
 | 
						|
        except ipaddress.AddressValueError:
 | 
						|
            raise ValueError("Prefix invalid")
 |