peers3zebra.py 3.9 KB

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