#!/usr/bin/env python3 import re import pytricia import urllib.request import random import timeit anafile = "ana-invalids.txt" anaurl = "https://as286.net/data/ana-invalids.txt" def parse(iterable): pattern = "^(?P[^;]+);srcAS=(?P[^;]+);altpfx=(?P[^;]+);.*" prefixes = pytricia.PyTricia(128) for line in iterable: match = re.search(pattern, line) if not match: continue prefix = match.group("prefix") if match.group("altpfx") == "NONE": altpfx = False else: altpfx = True prefixes[prefix] = altpfx return prefixes def read_and_parse_file(filename): with open(filename, "r") as f: return parse(f) def read_and_parse_url(url): response = urllib.request.urlopen(url) content = response.read().decode("utf-8") return parse(content.splitlines()) # prefixes = read_and_parse_file(anafile) prefixes = read_and_parse_url(anaurl) def lookup(ip): try: altpfx = prefixes[ip] if altpfx: result = "invalid-but-reachable" else: result = "unreachable" except KeyError: result = "valid-or-unverified" return result # test some lookups that we def test_lookup(): for ip in ( "2.59.118.1", # unreachable "2.176.52.1", # invalid-but-reachable "1.1.1.1", # valid-or-unverified "2a0d:5643::1", # unreachable "2a0d:5084::1", # invalid-but-reachable "2606:4700:4700::1111", # valid-or-unverified ): try: print(ip, lookup(ip)) except KeyError: # invalid prefix? pass def test_random(): n = 1000 for i in range(n): random.randint(0, 255) random_ip4 = ".".join([str(random.randint(0, 255)) for i in range(0, 4)]) lookup(random_ip4) test_lookup() v = timeit.timeit("test_random()", setup="from __main__ import test_random", number=100) print("Execution time: ", v)