generate_peers.py 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import requests
  2. import yaml
  3. GITOYEN_ASN = 0
  4. PEER_ASN_LIST = []
  5. gitoyen_peering_factory = []
  6. ses = requests.session()
  7. peer = dict()
  8. # Load config
  9. try:
  10. config = yaml.load(open('config/settings.yml'))
  11. GITOYEN_ASN = config['ASN']
  12. PEER_ASN_LIST = config['PEERS']
  13. except:
  14. print("Failed to load config exiting..")
  15. exit(1)
  16. # List Gitoyen Factory with IPv6 avaidable
  17. factory_request = ses.get("https://peeringdb.com//api/netixlan?asn=" + str(GITOYEN_ASN))
  18. for factory in factory_request.json()['data']:
  19. if factory['ipaddr6'] is not None:
  20. gitoyen_peering_factory.append(factory)
  21. for factory in gitoyen_peering_factory:
  22. name = (str(factory['name'])).split(' ')[0].lower()
  23. print("Generation en cours pour " + name)
  24. peer[name] = dict()
  25. for asn in PEER_ASN_LIST:
  26. info_request = ses.get(
  27. "https://peeringdb.com/api/netixlan?asn=" + str(asn) + "&ix_id=" + str(factory['ix_id']))
  28. result = info_request.json()['data']
  29. if len(result) > 0:
  30. if result[0]['is_rs_peer']:
  31. print('AS'+str(asn)+" is a RS peer, skipping")
  32. continue
  33. name_request = ses.get('https://peeringdb.com/api/net?asn=' + str(asn)).json()
  34. peer[name][asn] = dict()
  35. peer[name][asn]['description'] = name_request['data'][0]['name']
  36. if name_request['data'][0]['irr_as_set'] is not None and len(name_request['data'][0]['irr_as_set']) > 0:
  37. peer[name][asn]['import'] = name_request['data'][0]['irr_as_set']
  38. else:
  39. peer[name][asn]['import'] = "AS" + str(asn)
  40. peer[name][asn]['export'] = "AS-GITOYEN"
  41. peer[name][asn]['peerings'] = []
  42. if name_request['data'][0]['info_prefixes4'] is not None:
  43. peer[name][asn]['limit_ipv4'] = int(name_request['data'][0]['info_prefixes4'])
  44. if name_request['data'][0]['info_prefixes6'] is not None:
  45. peer[name][asn]['limit_ipv6'] = int(name_request['data'][0]['info_prefixes6'])
  46. delete = True
  47. for routeur in result:
  48. if routeur['ipaddr4'] is not None:
  49. peer[name][asn]['peerings'].append(routeur['ipaddr4'])
  50. print(
  51. "Generating configuration at " + name + " for the router " + str(routeur['ipaddr4']) + " of the AS " + str(
  52. asn) + " " + peer[name][asn]['description'])
  53. if routeur['ipaddr6'] is not None:
  54. peer[name][asn]['peerings'].append(routeur['ipaddr6'])
  55. print(
  56. "Generating configuration at " + name + " for the router " + str(routeur['ipaddr6']) + " of the AS " + str(
  57. asn) + " " + peer[name][asn]['description'])
  58. delete = False
  59. if delete:
  60. peer[name].pop(asn, None)
  61. for gix in peer:
  62. with open("peers/" + gix + '.yml', 'w') as outfile:
  63. yaml.dump(peer[gix], outfile, default_flow_style=False)
  64. outfile.close()