Advertisement
Guest User

Untitled

a guest
Apr 2nd, 2015
242
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.36 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. ##----------------------------------------------------------------------
  3. ## Basic IOS XR parser
  4. ##----------------------------------------------------------------------
  5. ## Copyright (C) 2007-2015 The NOC Project
  6. ## See LICENSE for details
  7. ##----------------------------------------------------------------------
  8.  
  9. ## Python modules
  10. import re
  11. ## Third-party modules
  12. from pyparsing import *
  13. ## NOC modules
  14. from noc.lib.ip import IPv4
  15. from noc.cm.parsers.pyparser import BasePyParser
  16. from noc.cm.parsers.tokens import INDENT, IPv4_ADDRESS, LINE, REST, DIGITS, ALPHANUMS
  17. from noc.lib.text import ranges_to_list
  18.  
  19.  
  20. class BaseIOSParser(BasePyParser):
  21. RX_INTERFACE_BLOCK = re.compile(
  22. r"^interface\s+(?P<name>\S+(?:\s+\d+\S*)?)\n"
  23. r"(?:\s+[^\n]*\n)*",
  24. re.MULTILINE
  25. )
  26.  
  27. def __init__(self, managed_object):
  28. super(BaseIOSParser, self).__init__(managed_object)
  29. self.enable_cdp = True
  30.  
  31. def create_parser(self):
  32. # System
  33. HOSTNAME = LineStart() + Literal("hostname") + REST.copy().setParseAction(self.on_hostname)
  34. DOMAIN_NAME = LineStart() + Literal("domain") + Literal("name") + REST.copy().setParseAction(self.on_domain_name)
  35. TIMEZONE = LineStart() + Literal("clock") + Literal("timezone") + REST.copy().setParseAction(self.on_timezone)
  36. NAMESERVER = LineStart() + Literal("domain") + Literal("name-server") + REST.copy().setParseAction(self.on_nameserver)
  37. # USER = LineStart() + Literal("username") + Word(alphanums + "-_").setParseAction(self.on_user) + REST
  38. CDP_RUN = LineStart() + (Literal("cdp")).setParseAction(self.on_cdp_run)
  39. # SSH_VERSION = LineStart() + Literal("ssh") + Literal("server") + (Word(nums) + restOfLine).setParseAction(self.on_ssh_version)
  40. SYSTEM_BLOCK = (
  41. HOSTNAME |
  42. DOMAIN_NAME |
  43. TIMEZONE |
  44. NAMESERVER |
  45. # USER |
  46. CDP_RUN
  47. # SERVICE |
  48. # SSH_VERSION
  49. )
  50. # Interface
  51. INTERFACE = LineStart() + Literal("interface") + REST.copy().setParseAction(self.on_interface)
  52. INTERFACE_DESCRIPTION = Literal("description") + REST.copy().setParseAction(self.on_interface_descripion)
  53. INTERFACE_ADDRESS = Literal("ipv4") + Literal("address") + (IPv4_ADDRESS("address") + IPv4_ADDRESS("mask") + Optional(Literal("secondary"))).setParseAction(self.on_interface_address)
  54. INTERFACE_SHUTDOWN = Literal("shutdown").setParseAction(self.on_interface_shutdown)
  55. INTERFACE_REDIRECTS = (Literal("ipv4") + Literal("redirects")).setParseAction(self.on_interface_redirects)
  56. INTERFACE_PROXY_ARP = Literal("proxy-arp").setParseAction(self.on_interface_proxy_arp)
  57. INTERFACE_CDP = Literal("cdp").setParseAction(self.on_interface_cdp)
  58. INTERFACE_BLOCK = INTERFACE + ZeroOrMore(INDENT + (
  59. INTERFACE_DESCRIPTION |
  60. INTERFACE_ADDRESS |
  61. INTERFACE_SHUTDOWN |
  62. INTERFACE_REDIRECTS |
  63. INTERFACE_PROXY_ARP |
  64. INTERFACE_CDP |
  65. LINE
  66. ))
  67. # Logging
  68. LOGGING_HOST = LineStart() + Literal("logging") + IPv4_ADDRESS.copy().setParseAction(self.on_logging_host)
  69. LOGGING_BLOCK = LOGGING_HOST
  70. # NTP
  71. # NTP_SERVER = LineStart() + Literal("ntp") + Literal("server") + IPv4_ADDRESS.copy().setParseAction(self.on_ntp_server)
  72. # NTP_BLOCK = NTP_SERVER
  73.  
  74. CONFIG = (
  75. SYSTEM_BLOCK |
  76. INTERFACE_BLOCK |
  77. LOGGING_BLOCK
  78. # NTP_BLOCK
  79. )
  80. return CONFIG
  81.  
  82. def get_interface_defaults(self, name):
  83. r = {
  84. "admin_status": True,
  85. "protocols": []
  86. }
  87. # @todo: Replace with more reliable type detection
  88. if self.enable_cdp and name[:2] in ("Fa", "Gi", "Te"):
  89. r["protocols"] += ["CDP"]
  90. return r
  91.  
  92. def get_subinterface_defaults(self):
  93. return {
  94. "ip_redirects": False,
  95. "ip_proxy_arp": False,
  96. "admin_status": True
  97. }
  98.  
  99. def get_user_defaults(self):
  100. return {
  101. "level": 0
  102. }
  103.  
  104. def on_hostname(self, tokens):
  105. self.get_system_fact().hostname = tokens[0]
  106.  
  107. def on_domain_name(self, tokens):
  108. self.get_system_fact().domain_name = tokens[0]
  109.  
  110. def on_timezone(self, tokens):
  111. self.get_system_fact().timezone = tokens[0]
  112.  
  113. def on_nameserver(self, tokens):
  114. self.get_system_fact().nameservers += [tokens[0]]
  115.  
  116. def on_user(self, tokens):
  117. tokens = list(tokens)
  118. user = self.get_user_fact(tokens[0])
  119.  
  120. def on_cdp_run(self, tokens):
  121. self.enable_cdp = tokens[0]
  122.  
  123. def on_ssh_version(self, tokens):
  124. sf = self.get_service_fact("ssh")
  125. sf.enabled = True
  126. sf.version = tokens[0]
  127.  
  128. def on_interface(self, tokens):
  129. name = tokens[0]
  130. if "." in name:
  131. i_name = name.split(".")[0]
  132. else:
  133. i_name = name
  134. self.get_subinterface_fact(name, i_name)
  135.  
  136. def on_interface_descripion(self, tokens):
  137. si = self.get_current_subinterface()
  138. description = tokens[0]
  139. si.description = description
  140. if "." not in si.name:
  141. si.interface.description = description
  142.  
  143. def on_interface_address(self, tokens):
  144. ip = str(IPv4(tokens[0], netmask=tokens[1]))
  145. si = self.get_current_subinterface()
  146. if len(tokens) > 2 and tokens[2] == "secondary":
  147. si.ipv4_addresses += [ip]
  148. else:
  149. si.ipv4_addresses = [ip] + si.ipv4_addresses
  150. si.add_afi("IPv4")
  151.  
  152. def on_interface_shutdown(self, tokens):
  153. status = False
  154. si = self.get_current_subinterface()
  155. si.admin_status = status
  156. if "." not in si.name:
  157. si.interface.admin_status = status
  158.  
  159. def on_interface_cdp(self, tokens):
  160. self.get_current_interface().add_protocol("CDP")
  161.  
  162. def on_interface_redirects(self, tokens):
  163. self.get_current_subinterface().ip_redirects
  164.  
  165. def on_interface_proxy_arp(self, tokens):
  166. self.get_current_subinterface().ip_proxy_arp = True
  167.  
  168. def on_logging_host(self, tokens):
  169. self.get_sysloghost_fact(tokens[0])
  170.  
  171. def on_ntp_server(self, tokens):
  172. self.get_ntpserver_fact(tokens[0])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement