peers2zebra.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import sys
  2. import re
  3. from xml.dom.minidom import parse
  4. from xml.dom import Node
  5. peersfile = "/usr/local/gitoyen-peers/peers.xml"
  6. default_max_prefixes = 1000
  7. def visit(node):
  8. if node.nodeType == Node.ELEMENT_NODE:
  9. if node.nodeName == "peer" and node.getAttribute ('ix') == ix:
  10. neighbor = {}
  11. for element in node.childNodes:
  12. if element.nodeName == "name":
  13. neighbor["name"] = element.childNodes[0].nodeValue
  14. elif element.nodeName == "ip":
  15. neighbor["ip"] = element.childNodes[0].nodeValue
  16. elif element.nodeName == "as":
  17. neighbor["as"] = element.childNodes[0].nodeValue
  18. elif element.nodeName == "prefix-in":
  19. neighbor["prefix-in"] = element.childNodes[0].nodeValue
  20. elif element.nodeName == "prefix-out":
  21. neighbor["prefix-out"] = element.childNodes[0].nodeValue
  22. elif element.nodeName == "map-in":
  23. neighbor["map-in"] = element.childNodes[0].nodeValue
  24. elif element.nodeName == "map-out":
  25. neighbor["map-out"] = element.childNodes[0].nodeValue
  26. elif element.nodeName == "max-prefixes":
  27. neighbor["max-prefixes"] = element.childNodes[0].nodeValue
  28. if re.search (":", neighbor["ip"]):
  29. # IPv6
  30. neighbor_tag = "ipv6 bgp neighbor "
  31. peer_in = "peer-ip6-in"
  32. announce_out = "announce-ip6-out"
  33. else:
  34. neighbor_tag = "neighbor "
  35. peer_in = "peer-in"
  36. announce_out = "announce-out"
  37. print neighbor_tag, neighbor["ip"], \
  38. " remote-as ", neighbor["as"]
  39. print neighbor_tag, neighbor["ip"], \
  40. " description ", neighbor["name"]
  41. print neighbor_tag, neighbor["ip"], "soft-reconfiguration inbound"
  42. if neighbor.has_key("prefix-in"):
  43. print neighbor_tag, neighbor["ip"], "prefix-list ", \
  44. neighbor["prefix-in"], " in"
  45. else:
  46. print neighbor_tag, neighbor["ip"], "prefix-list ", peer_in, " in"
  47. if neighbor.has_key("prefix-out"):
  48. print neighbor_tag, neighbor["ip"], "prefix-list ", \
  49. neighbor["prefix-out"], " out"
  50. else:
  51. print neighbor_tag, neighbor["ip"], "prefix-list ", announce_out, " out"
  52. print neighbor_tag, neighbor["ip"], "filter-list 1 out"
  53. if neighbor.has_key("map-in"):
  54. print neighbor_tag, neighbor["ip"], "route-map ", \
  55. neighbor["map-in"], " in"
  56. else:
  57. print neighbor_tag, neighbor["ip"], "route-map " + ix + "-in in"
  58. if not re.search (":", neighbor["ip"]): # max-prefixes not supported for IPv6?
  59. if not neighbor.has_key("max-prefixes"):
  60. max_prefixes = default_max_prefixes
  61. else:
  62. max_prefixes = neighbor["max-prefixes"]
  63. print neighbor_tag, neighbor["ip"], "maximum-prefix ", max_prefixes
  64. print ""
  65. return None
  66. if __name__ == '__main__':
  67. tree = parse(peersfile)
  68. try:
  69. ix = sys.argv[1]
  70. except IndexError:
  71. sys.stderr.write ("Usage: " + sys.argv[0] + " ix\n")
  72. sys.exit(1)
  73. print "! Peers at " + ix
  74. print "! Do NOT edit by hand. Edit ",
  75. print str(peersfile) + " on machoke instead."
  76. print ""
  77. for peer in tree.documentElement.childNodes:
  78. visit(peer)