bgp-origin-as-json.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. #!/usr/bin/env python
  2. import json
  3. import sys
  4. import time
  5. from netaddr import IPNetwork, IPSet
  6. MY_AS = 76184
  7. import dn42
  8. from dn42 import Prefix, UsedPrefix
  9. if __name__ == '__main__':
  10. asdata_dir = sys.argv[1]
  11. prefixes_out = sys.argv[2]
  12. asdata_out = sys.argv[3]
  13. asdata = dn42.parse_records(asdata_dir)
  14. asdata = { int(asn[2:]): d for asn, d in asdata.items() }
  15. lines = sys.stdin.readlines()
  16. prefixes = [l.split()[0] for l in lines]
  17. # IPSet are great, but they "compact" redundant subnets, which we
  18. # don't want for used prefixes. Indeed, merging two subnets is
  19. # not correct when they belong to different people. However, for
  20. # unused subnets, we don't care: that's why we use IPSet.
  21. used_set = IPSet(prefixes)
  22. used_set = used_set & dn42.ADDRSPACE
  23. unused_set = dn42.ADDRSPACE ^ used_set
  24. # Work with lists of our custom classes
  25. used = [UsedPrefix(l.split()[0], {"asn": l.split()[1]}) for l in lines]
  26. used = [p for p in used if p.prefix in dn42.ADDRSPACE]
  27. unused = [Prefix(str(p)) for p in unused_set.iter_cidrs()]
  28. all_prefixes = used + unused
  29. all_prefixes.sort(key=lambda p : p.prefix)
  30. assert(IPSet([p.prefix for p in all_prefixes]) == dn42.ADDRSPACE)
  31. # TODO: handle prefix inclusion, this generates incorrect data
  32. # right now.
  33. result = dict()
  34. result["name"] = "addrspace"
  35. result["display"] = "none"
  36. result["date"] = time.time()
  37. result["origin"] = MY_AS
  38. result["prefixes"] = len(used)
  39. data = {
  40. "name": "prefixes",
  41. "prefix": dn42.ROOT_PREFIX,
  42. "children": [p.to_dict() for p in all_prefixes]
  43. }
  44. result["children"] = [{"name": "empty", "size": 1}, data]
  45. with open(prefixes_out, "w") as f:
  46. json.dump(result, f)
  47. with open(asdata_out, "w") as f:
  48. json.dump(asdata, f)