Advertisement
Guest User

Untitled

a guest
Apr 28th, 2014
183
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.77 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. ##----------------------------------------------------------------------
  3. ## Vendor: MikroTik
  4. ## OS: RouterOS
  5. ## Compatible: 3.14 and above
  6. ##----------------------------------------------------------------------
  7. ## Copyright (C) 2007-2011 The NOC Project
  8. ## See LICENSE for details
  9. ##----------------------------------------------------------------------
  10.  
  11. ## Python modules
  12. import re
  13. ## NOC modules
  14. import noc.sa.profiles
  15. from noc.sa.protocols.sae_pb2 import TELNET, SSH
  16.  
  17.  
  18. class Profile(noc.sa.profiles.Profile):
  19. name = "MikroTik.RouterOS"
  20. supported_schemes = [TELNET, SSH]
  21. command_submit = "\r"
  22. pattern_prompt = r"\[(?P<prompt>[^\]@]+@.+?)\] > "
  23. pattern_more = [
  24. ("Please press \"Enter\" to continue!", "\n"),
  25. (r"\[Q quit\|D dump\|down\]", " ")
  26. ]
  27. pattern_syntax_error = r"bad command name"
  28. config_volatile = [r"^#.*?$", r"^\s?"]
  29.  
  30. def setup_script(self, script):
  31. """
  32. Starting from v3.14 we can specify console options
  33. during login process
  34. :param script:
  35. :return:
  36. """
  37. if (script.parent is None and
  38. not script.access_profile.user.endswith("+ct")):
  39. script.access_profile.user += "+ct"
  40. self.add_script_method(script, "cli_detail", self.cli_detail)
  41.  
  42. def cli_detail(self, script, cmd):
  43. """
  44. Parse RouterOS .... print detail output
  45. :param script:
  46. :param cmd:
  47. :return:
  48. """
  49. return self.parse_detail(script.cli(cmd))
  50.  
  51. rx_p_new = re.compile("^\s*(?P<line>\d+)\s+")
  52. rx_key = re.compile("([a-zA-Z\-]+)=")
  53.  
  54. def parse_detail(self, s):
  55. """
  56.  
  57. :param s:
  58. :return:
  59. """
  60. # Normalize
  61. ns = []
  62. flags = []
  63. for l in s.splitlines():
  64. if not l:
  65. continue
  66. if not flags and l.startswith("Flags:"):
  67. # Parse flags from line like
  68. # Flags: X - disabled, I - invalid, D - dynamic
  69. flags = [f.split("-", 1)[0].strip()
  70. for f in l[6:].split(",")]
  71. continue
  72. match = self.rx_p_new.search(l)
  73. if match:
  74. # New item
  75. if ";;;" in l:
  76. ns += [l.partition(";;;")[0].strip()]
  77. else:
  78. ns += [l]
  79. elif ns:
  80. ns[-1] += " %s" % l.strip()
  81. # Parse
  82. f = "".join(flags)
  83. rx = re.compile(
  84. r"^\s*(?P<line>\d+)\s+"
  85. r"(?P<flags>[%s]+(?:\s+[%s]+)*\s+)?"
  86. r"(?P<rest>.+)$" % (f, f))
  87. r = []
  88. for l in ns:
  89. match = rx.match(l)
  90. if match:
  91. n = int(match.group("line"))
  92. f = match.group("flags")
  93. if f is None:
  94. f = ""
  95. else:
  96. f = f.replace(" ", "")
  97. # Parse key-valued pairs
  98. rest = match.group("rest")
  99. kvp = []
  100. while rest:
  101. m = self.rx_key.search(rest)
  102. if not m:
  103. if kvp:
  104. kvp[-1] += [rest]
  105. break
  106. if kvp:
  107. kvp[-1] += [rest[:m.start()]]
  108. kvp += [[m.group(1)]]
  109. rest = rest[m.end():]
  110. # Convert key-value-pairs to dict
  111. d = {}
  112. for k, v in kvp:
  113. v = v.strip()
  114. if v.startswith("\"") and v.endswith("\""):
  115. v = v[1:-1]
  116. d[k] = v
  117. r += [(n, f, d)]
  118. return r
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement