oxidized 0.29.1 → 0.37.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (236) hide show
  1. checksums.yaml +4 -4
  2. data/.coderabbit.yaml +21 -0
  3. data/.github/ISSUE_TEMPLATE/bug_report.md +45 -0
  4. data/.github/ISSUE_TEMPLATE/feature_request.md +22 -0
  5. data/.github/ISSUE_TEMPLATE/support-request.md +39 -0
  6. data/.github/workflows/codeql.yml +4 -4
  7. data/.github/workflows/publishdocker.yml +108 -13
  8. data/.github/workflows/ruby.yml +3 -12
  9. data/.github/workflows/stale.yml +6 -1
  10. data/.gitignore +2 -0
  11. data/.rubocop.yml +69 -13
  12. data/.rubocop_todo.yml +13 -143
  13. data/CHANGELOG.md +431 -4
  14. data/CONTRIBUTING.md +189 -0
  15. data/Dockerfile +89 -34
  16. data/README.md +59 -188
  17. data/Rakefile +58 -12
  18. data/bin/oxidized +2 -5
  19. data/docs/Configuration.md +382 -149
  20. data/docs/Creating-Models.md +262 -10
  21. data/docs/DeviceSimulation.md +196 -0
  22. data/docs/Docker.md +246 -0
  23. data/docs/Hooks.md +146 -51
  24. data/docs/Inputs.md +237 -0
  25. data/docs/Issues.md +123 -0
  26. data/docs/Model-Notes/APC.md +72 -0
  27. data/docs/Model-Notes/Cumulus.md +5 -0
  28. data/docs/Model-Notes/EatonNetwork.md +18 -0
  29. data/docs/Model-Notes/ExaLink.md +43 -0
  30. data/docs/Model-Notes/FSOS.md +17 -0
  31. data/docs/Model-Notes/Fortinet.md +75 -0
  32. data/docs/Model-Notes/GrandstreamHT8xx.md +8 -0
  33. data/docs/Model-Notes/HPEAruba.md +32 -0
  34. data/docs/Model-Notes/IvantiConnectSecure.md +59 -0
  35. data/docs/Model-Notes/OS6.md +10 -0
  36. data/docs/Model-Notes/README.md +1 -20
  37. data/docs/Model-Notes/RouterOS.md +28 -0
  38. data/docs/Model-Notes/SikluMHTG.md +7 -0
  39. data/docs/Model-Notes/TrueNAS.md +23 -0
  40. data/docs/Model-Notes/XGS4600-Zyxel.md +5 -0
  41. data/docs/ModelUnitTests.md +219 -0
  42. data/docs/Outputs.md +102 -5
  43. data/docs/Release.md +102 -0
  44. data/docs/Ruby-API.md +135 -2
  45. data/docs/Sources.md +34 -0
  46. data/docs/Supported-OS-Types.md +207 -270
  47. data/docs/Troubleshooting.md +43 -1
  48. data/extra/device2yaml.rb +259 -0
  49. data/extra/gitdiff-msteams.sh +32 -5
  50. data/extra/hooks/modelrules.rb +55 -0
  51. data/extra/hooks/modelrulesadvanced.rb +167 -0
  52. data/extra/hooks/srcipmap.rb +54 -0
  53. data/extra/nagios_check_failing_nodes.rb +1 -1
  54. data/extra/oxidized.runit +1 -1
  55. data/extra/rest_client.rb +5 -4
  56. data/extra/syslog.rb +11 -6
  57. data/lib/oxidized/cli/support.rb +152 -0
  58. data/lib/oxidized/cli.rb +21 -6
  59. data/lib/oxidized/config/vars.rb +33 -14
  60. data/lib/oxidized/config.rb +28 -17
  61. data/lib/oxidized/core.rb +50 -8
  62. data/lib/oxidized/hook/ciscosparkdiff.rb +11 -9
  63. data/lib/oxidized/hook/exec.rb +5 -4
  64. data/lib/oxidized/hook/githubrepo.rb +55 -18
  65. data/lib/oxidized/hook/noophook.rb +2 -2
  66. data/lib/oxidized/hook/slackdiff.rb +50 -14
  67. data/lib/oxidized/hook/xmppdiff.rb +9 -9
  68. data/lib/oxidized/hook.rb +68 -16
  69. data/lib/oxidized/input/cli.rb +8 -3
  70. data/lib/oxidized/input/debugtext.rb +40 -0
  71. data/lib/oxidized/input/debugyaml.rb +82 -0
  72. data/lib/oxidized/input/exec.rb +2 -11
  73. data/lib/oxidized/input/ftp.rb +2 -19
  74. data/lib/oxidized/input/http.rb +67 -17
  75. data/lib/oxidized/input/input.rb +35 -14
  76. data/lib/oxidized/input/scp.rb +27 -0
  77. data/lib/oxidized/input/ssh.rb +59 -83
  78. data/lib/oxidized/input/sshbase.rb +102 -0
  79. data/lib/oxidized/input/telnet.rb +20 -19
  80. data/lib/oxidized/input/tftp.rb +8 -8
  81. data/lib/oxidized/job.rb +18 -7
  82. data/lib/oxidized/jobs.rb +11 -1
  83. data/lib/oxidized/logger.rb +51 -0
  84. data/lib/oxidized/manager.rb +18 -17
  85. data/lib/oxidized/model/acos.rb +2 -1
  86. data/lib/oxidized/model/addpack.rb +26 -0
  87. data/lib/oxidized/model/adtran.rb +5 -1
  88. data/lib/oxidized/model/adva.rb +3 -3
  89. data/lib/oxidized/model/airfiber.rb +1 -1
  90. data/lib/oxidized/model/aos7.rb +11 -0
  91. data/lib/oxidized/model/aoscx.rb +37 -29
  92. data/lib/oxidized/model/aosw.rb +39 -29
  93. data/lib/oxidized/model/apc_aos.rb +7 -2
  94. data/lib/oxidized/model/apcaos.rb +39 -0
  95. data/lib/oxidized/model/aricentiss.rb +9 -2
  96. data/lib/oxidized/model/arubainstant.rb +93 -0
  97. data/lib/oxidized/model/asa.rb +11 -10
  98. data/lib/oxidized/model/asternos.rb +22 -0
  99. data/lib/oxidized/model/asyncos.rb +3 -3
  100. data/lib/oxidized/model/audiocodes.rb +2 -2
  101. data/lib/oxidized/model/awplus.rb +15 -12
  102. data/lib/oxidized/model/axos.rb +1 -1
  103. data/lib/oxidized/model/bdcom.rb +1 -0
  104. data/lib/oxidized/model/c4cmts.rb +1 -2
  105. data/lib/oxidized/model/ciscosma.rb +1 -1
  106. data/lib/oxidized/model/ciscosmb.rb +6 -1
  107. data/lib/oxidized/model/cnos.rb +13 -10
  108. data/lib/oxidized/model/comtrol.rb +1 -1
  109. data/lib/oxidized/model/comware.rb +5 -3
  110. data/lib/oxidized/model/cumulus.rb +14 -2
  111. data/lib/oxidized/model/defacto.rb +26 -0
  112. data/lib/oxidized/model/dellx.rb +1 -1
  113. data/lib/oxidized/model/dlink.rb +5 -2
  114. data/lib/oxidized/model/dlinknextgen.rb +55 -0
  115. data/lib/oxidized/model/dnos.rb +3 -0
  116. data/lib/oxidized/model/dslcommands.rb +93 -0
  117. data/lib/oxidized/model/dslsetup.rb +102 -0
  118. data/lib/oxidized/model/eatonnetwork.rb +70 -0
  119. data/lib/oxidized/model/edgecos.rb +3 -1
  120. data/lib/oxidized/model/edgeos.rb +7 -6
  121. data/lib/oxidized/model/edgeswitch.rb +3 -1
  122. data/lib/oxidized/model/efos.rb +41 -0
  123. data/lib/oxidized/model/eltex.rb +4 -2
  124. data/lib/oxidized/model/enterasys800.rb +2 -2
  125. data/lib/oxidized/model/enterprise_sonic.rb +46 -0
  126. data/lib/oxidized/model/eos.rb +3 -1
  127. data/lib/oxidized/model/exalink.rb +36 -0
  128. data/lib/oxidized/model/f5os.rb +17 -0
  129. data/lib/oxidized/model/fabricos.rb +2 -2
  130. data/lib/oxidized/model/fastiron.rb +5 -3
  131. data/lib/oxidized/model/firebrick.rb +2 -2
  132. data/lib/oxidized/model/firelinuxos.rb +13 -6
  133. data/lib/oxidized/model/firewareos.rb +10 -1
  134. data/lib/oxidized/model/fortigate.rb +160 -0
  135. data/lib/oxidized/model/fortios.rb +38 -48
  136. data/lib/oxidized/model/fsos.rb +46 -0
  137. data/lib/oxidized/model/gaiaos.rb +4 -4
  138. data/lib/oxidized/model/garderos.rb +38 -0
  139. data/lib/oxidized/model/grandstreamht8xx.rb +19 -0
  140. data/lib/oxidized/model/h3c.rb +1 -1
  141. data/lib/oxidized/model/ibos.rb +1 -0
  142. data/lib/oxidized/model/ingate.rb +47 -0
  143. data/lib/oxidized/model/ios.rb +57 -30
  144. data/lib/oxidized/model/iosxr.rb +2 -2
  145. data/lib/oxidized/model/ironware.rb +7 -5
  146. data/lib/oxidized/model/ivanti.rb +54 -0
  147. data/lib/oxidized/model/junos.rb +12 -5
  148. data/lib/oxidized/model/kornfeldos.rb +33 -0
  149. data/lib/oxidized/model/lenovonos.rb +2 -0
  150. data/lib/oxidized/model/linksyssrw.rb +3 -3
  151. data/lib/oxidized/model/linuxgeneric.rb +4 -2
  152. data/lib/oxidized/model/macros.rb +60 -0
  153. data/lib/oxidized/model/mimosab11.rb +34 -0
  154. data/lib/oxidized/model/ml66.rb +33 -0
  155. data/lib/oxidized/model/mlnxos.rb +18 -14
  156. data/lib/oxidized/model/model.rb +98 -103
  157. data/lib/oxidized/model/mtrlrfs.rb +1 -0
  158. data/lib/oxidized/model/ndms.rb +6 -0
  159. data/lib/oxidized/model/netgear.rb +14 -3
  160. data/lib/oxidized/model/netonix.rb +1 -1
  161. data/lib/oxidized/model/netscaler.rb +1 -1
  162. data/lib/oxidized/model/nodegrid.rb +1 -1
  163. data/lib/oxidized/model/nsxdfw.rb +31 -0
  164. data/lib/oxidized/model/nsxfirewall.rb +2 -1
  165. data/lib/oxidized/model/nxos.rb +20 -15
  166. data/lib/oxidized/model/ocnos.rb +42 -0
  167. data/lib/oxidized/model/onefinity.rb +18 -0
  168. data/lib/oxidized/model/openbsd.rb +1 -1
  169. data/lib/oxidized/model/opengear.rb +36 -1
  170. data/lib/oxidized/model/openwrt.rb +6 -6
  171. data/lib/oxidized/model/opnsense.rb +9 -1
  172. data/lib/oxidized/model/os6.rb +48 -0
  173. data/lib/oxidized/model/outputs.rb +5 -0
  174. data/lib/oxidized/model/panos.rb +2 -0
  175. data/lib/oxidized/model/perle.rb +41 -0
  176. data/lib/oxidized/model/pfsense.rb +9 -0
  177. data/lib/oxidized/model/powerconnect.rb +32 -11
  178. data/lib/oxidized/model/procurve.rb +6 -2
  179. data/lib/oxidized/model/qtech.rb +3 -1
  180. data/lib/oxidized/model/quantaos.rb +8 -6
  181. data/lib/oxidized/model/rgos.rb +33 -0
  182. data/lib/oxidized/model/riverbed.rb +104 -0
  183. data/lib/oxidized/model/routeros.rb +18 -11
  184. data/lib/oxidized/model/saos.rb +18 -1
  185. data/lib/oxidized/model/saos10.rb +38 -0
  186. data/lib/oxidized/model/siklu.rb +1 -1
  187. data/lib/oxidized/model/siklumhtg.rb +22 -0
  188. data/lib/oxidized/model/sixwind.rb +28 -0
  189. data/lib/oxidized/model/slxos.rb +3 -3
  190. data/lib/oxidized/model/smartbyte.rb +48 -0
  191. data/lib/oxidized/model/sonicos.rb +27 -20
  192. data/lib/oxidized/model/speedtouch.rb +1 -1
  193. data/lib/oxidized/model/sros.rb +3 -3
  194. data/lib/oxidized/model/srosmd.rb +1 -1
  195. data/lib/oxidized/model/supermicro.rb +1 -1
  196. data/lib/oxidized/model/telco.rb +1 -1
  197. data/lib/oxidized/model/tmos.rb +1 -0
  198. data/lib/oxidized/model/tnsr.rb +57 -0
  199. data/lib/oxidized/model/tplink.rb +5 -5
  200. data/lib/oxidized/model/trango.rb +4 -2
  201. data/lib/oxidized/model/truenas.rb +64 -3
  202. data/lib/oxidized/model/ucs.rb +1 -1
  203. data/lib/oxidized/model/unifiap.rb +144 -0
  204. data/lib/oxidized/model/uplinkolt.rb +46 -0
  205. data/lib/oxidized/model/voltaire.rb +1 -1
  206. data/lib/oxidized/model/voss.rb +3 -0
  207. data/lib/oxidized/model/vrp.rb +5 -1
  208. data/lib/oxidized/model/vyatta.rb +9 -3
  209. data/lib/oxidized/model/vyos.rb +37 -0
  210. data/lib/oxidized/model/xos.rb +10 -1
  211. data/lib/oxidized/model/zhoneolt.rb +4 -2
  212. data/lib/oxidized/model/zynos.rb +67 -3
  213. data/lib/oxidized/model/zynosadsl.rb +14 -0
  214. data/lib/oxidized/model/zynoscli.rb +1 -1
  215. data/lib/oxidized/model/zynosgs.rb +2 -0
  216. data/lib/oxidized/model/zynosmgs.rb +32 -0
  217. data/lib/oxidized/node.rb +99 -64
  218. data/lib/oxidized/nodes.rb +40 -19
  219. data/lib/oxidized/output/file.rb +80 -43
  220. data/lib/oxidized/output/git.rb +295 -151
  221. data/lib/oxidized/output/gitcrypt.rb +193 -185
  222. data/lib/oxidized/output/http.rb +63 -51
  223. data/lib/oxidized/output/output.rb +20 -4
  224. data/lib/oxidized/signals.rb +44 -0
  225. data/lib/oxidized/source/csv.rb +49 -49
  226. data/lib/oxidized/source/http.rb +76 -63
  227. data/lib/oxidized/source/jsonfile.rb +68 -0
  228. data/lib/oxidized/source/source.rb +73 -18
  229. data/lib/oxidized/source/sql.rb +71 -59
  230. data/lib/oxidized/version.rb +6 -4
  231. data/lib/oxidized/worker.rb +57 -29
  232. data/lib/oxidized.rb +4 -24
  233. data/lib/refinements.rb +21 -1
  234. data/oxidized.gemspec +45 -21
  235. metadata +248 -41
  236. data/lib/oxidized/model/timos.rb +0 -10
@@ -0,0 +1,48 @@
1
+ class OS6 < Oxidized::Model
2
+ using Refinements
3
+
4
+ # For switches running Dell EMC Networking OS6 #
5
+ #
6
+ # Tested with : Dell PowerSwitch N2048
7
+
8
+ comment '! '
9
+
10
+ cmd :all do |cfg|
11
+ cfg.gsub! /^% Invalid input detected at '\^' marker\.$|^\s+\^$/, ''
12
+ cfg.each_line.to_a[2..-2].join
13
+ end
14
+
15
+ cmd :secret do |cfg|
16
+ cfg.gsub! /(password )(\S+)/, '\1<secret hidden>'
17
+ cfg
18
+ end
19
+
20
+ cmd 'show version' do |cfg|
21
+ comment cfg
22
+ end
23
+
24
+ cmd 'show interfaces transceiver properties' do |cfg|
25
+ comment cfg
26
+ end
27
+
28
+ cmd 'show running-config' do |cfg|
29
+ cfg.each_line.to_a[3..-1].join
30
+ end
31
+
32
+ cfg :telnet do
33
+ username /^Login:/
34
+ password /^Password:/
35
+ end
36
+
37
+ cfg :telnet, :ssh do
38
+ if vars :enable
39
+ post_login do
40
+ send "enable\n"
41
+ cmd vars(:enable)
42
+ end
43
+ end
44
+ post_login 'terminal length 0'
45
+ pre_logout 'exit'
46
+ pre_logout 'exit'
47
+ end
48
+ end
@@ -31,6 +31,11 @@ module Oxidized
31
31
  @outputs.map { |out| out.type }.uniq.compact
32
32
  end
33
33
 
34
+ def merge!(other)
35
+ other.all.each { |o| @outputs << o }
36
+ self
37
+ end
38
+
34
39
  private
35
40
 
36
41
  def initialize
@@ -18,6 +18,8 @@ class PanOS < Oxidized::Model
18
18
  cfg.gsub! /^threat-.*?: .*$/, ''
19
19
  cfg.gsub! /^wildfire-.*?: .*$/, ''
20
20
  cfg.gsub! /^wf-private.*?: .*$/, ''
21
+ cfg.gsub! /^device-dictionary-version.*?: .*$/, ''
22
+ cfg.gsub! /^device-dictionary-release-date.*?: .*$/, ''
21
23
  cfg.gsub! /^url-filtering.*?: .*$/, ''
22
24
  cfg.gsub! /^global-.*?: .*$/, ''
23
25
  comment cfg
@@ -0,0 +1,41 @@
1
+ class Perle < Oxidized::Model
2
+ using Refinements
3
+
4
+ prompt /^[\w.-]+#/
5
+ comment '! '
6
+
7
+ cmd :all do |cfg|
8
+ cfg = cfg.cut_both
9
+ cfg.delete "\r"
10
+ end
11
+
12
+ cmd 'show version verbose' do |cfg|
13
+ comment cfg
14
+ end
15
+
16
+ cmd 'show system hardware' do |cfg|
17
+ comment cfg + "\n"
18
+ end
19
+
20
+ cmd 'show interfaces transceiver' do |cfg|
21
+ cfg = cfg.keep_lines [
22
+ 'SFP Information',
23
+ 'Vendor Name',
24
+ 'Vendor Serial Number'
25
+ ]
26
+ comment cfg + "\n"
27
+ end
28
+
29
+ cmd 'show running-config'
30
+
31
+ cmd :significant_changes do |cfg|
32
+ cfg.reject_lines [
33
+ /^tacacs-server key 7 \$0\$\S+==$/
34
+ ]
35
+ end
36
+
37
+ cfg :ssh do
38
+ post_login 'terminal length 0'
39
+ pre_logout 'exit'
40
+ end
41
+ end
@@ -15,6 +15,7 @@ class PfSense < Oxidized::Model
15
15
 
16
16
  cfg.gsub! /\s<revision>\s*<time>\d*<\/time>\s*.*\s*.*\s*<\/revision>/, ''
17
17
  cfg.gsub! /\s<last_rule_upd_time>\d*<\/last_rule_upd_time>/, ''
18
+ cfg.gsub! /\s<created>\s*<time>\d*<\/time>\s*.*CDATA\[Auto\].*\s*.*\s*<\/created>/, ''
18
19
  cfg
19
20
  end
20
21
 
@@ -25,6 +26,14 @@ class PfSense < Oxidized::Model
25
26
  xmlcomment "PFsense #{version}"
26
27
  end
27
28
 
29
+ metadata :bottom do
30
+ xmlcomment interpolate_string(
31
+ vars("metadata_bottom") ||
32
+ vars("metadata_top") ||
33
+ Oxidized::Model::METADATA_DEFAULT
34
+ )
35
+ end
36
+
28
37
  cfg :ssh do
29
38
  exec true
30
39
  pre_logout 'exit'
@@ -5,17 +5,19 @@ class PowerConnect < Oxidized::Model
5
5
 
6
6
  comment '! '
7
7
 
8
- expect /^\s*--More--\s+.*$/ do |data, re|
8
+ expect /\n\s*--More--\s+.*/ do |data, re| # Also grab the blank line above the --More--
9
9
  send ' '
10
10
  data.sub re, ''
11
11
  end
12
12
 
13
+ # Filter all command output
13
14
  cmd :all do |cfg|
14
- cfg.each_line.to_a[1..-3].join
15
+ cfg.gsub! /\r+/, '' # Remove the CR characters echoed back from the commands
16
+ cfg.cut_tail # Drop the last line which is the next prompt
15
17
  end
16
18
 
17
19
  cmd :secret do |cfg|
18
- cfg.gsub! /^(username \S+ password (?:encrypted )?)\S+(.*)/, '\1<hidden>\2'
20
+ cfg.gsub! /^((?:enable |username \S+ )?password (?:level\s\d{1,2} |encrypted ){,2})\S+(.*)/, '\1<hidden>\2'
19
21
  cfg.gsub! /^(tacacs-server key) \S+/, '\\1 <secret hidden>'
20
22
  cfg
21
23
  end
@@ -32,7 +34,7 @@ class PowerConnect < Oxidized::Model
32
34
  end
33
35
 
34
36
  cmd 'show running-config' do |cfg|
35
- cfg.sub(/^(sflow \S+ destination owner \S+ timeout )\d+$/, '! \1<timeout>')
37
+ cfg.sub(/^(sflow \S+ destination owner \S+ timeout )\d+$/, '! \1<timeout>') # Remove changing timeout
36
38
  end
37
39
 
38
40
  cfg :telnet, :ssh do
@@ -50,15 +52,21 @@ class PowerConnect < Oxidized::Model
50
52
  end
51
53
  end
52
54
 
53
- post_login "terminal datadump"
54
- post_login "terminal length 0"
55
- pre_logout "logout"
56
- pre_logout "exit"
55
+ post_login do
56
+ cmd "terminal datadump"
57
+ cmd "terminal length 0"
58
+ end
59
+ pre_logout do
60
+ send "exit\r"
61
+ sleep(0.25)
62
+ send "logout\r"
63
+ end
57
64
  end
58
65
 
59
66
  def clean(cfg)
60
67
  out = []
61
- skip_blocks = 0
68
+ len1 = len2 = skip_blocks = 0
69
+
62
70
  cfg.each_line do |line|
63
71
  # If this is a stackable switch we should skip this block of information
64
72
  if line.match(/Up\sTime|Temperature|Power Suppl(ies|y)|Fans/i) && (@stackable == true)
@@ -71,9 +79,22 @@ class PowerConnect < Oxidized::Model
71
79
  skip_blocks -= 1 if /\S/ !~ line
72
80
  next
73
81
  end
74
- out << line.strip
82
+ line = line.strip
83
+ # If the temps were not removed by skipping blocks, then mask them out wih XXX
84
+ # The most recent set of dashes has the spacing we want to match
85
+ if (match = line.match(/^(---+ +)(---+ +)/))
86
+ one, two = match.captures
87
+ len1 = one.length
88
+ len2 = two.length
89
+ end
90
+ # This can only be a temperature, right? ;-)
91
+ if (match = line.match(/^(\d{1,2}) {3,}\d+ (.*)$/))
92
+ one, two = match.captures
93
+ line = one.to_s + (' ' * (len1 - one.length)) + "XXX" + (' ' * (len2 - 3)) + two.to_s
94
+ end
95
+ out << line
75
96
  end
76
- out = out.reject { |line| line[/Up\sTime/] }
97
+ out = out.reject { |line| line[/Up\sTime/] } # Filter out Up Time
77
98
  out = comment out.join "\n"
78
99
  out << "\n"
79
100
  end
@@ -5,7 +5,7 @@ class Procurve < Oxidized::Model
5
5
  # ssh switches prompt may start with \r, followed by the prompt itself, regex ([\w\s.-]+[#>] ), which ends the line
6
6
  # telnet switches may start with various vt100 control characters, regex (\e\[24;[0-9][hH]), followed by the prompt, followed
7
7
  # by at least 3 other vt100 characters
8
- prompt /(^\r|\e\[24;[0-9][hH])?([\w\s.-]+(\((config|vlan-[0-9]{1,4}|y\/n)\)|\(o\)nce)?[#>:?\]] {1,2})($|(\e\[24;[0-9][0-9]?[hH]){3})/
8
+ prompt /(^\r|\e\[24;[0-9][hH])?([\w\s.-]+[#>] )($|(\e\[24;[0-9][0-9]?[hH]){3})/
9
9
 
10
10
  comment '! '
11
11
 
@@ -36,6 +36,8 @@ class Procurve < Oxidized::Model
36
36
  cfg.gsub! /\e\[\??\d+(;\d+)*[A-Za-z]/, ''
37
37
  # Additional filtering for power usage reporting which obviously changes over time
38
38
  cfg.gsub! /^(.*AC [0-9]{3}V\/?([0-9]{3}V)?) *([0-9]{1,3}) (.*)/, '\\1 <removed> \\4'
39
+ # Remove failed commands that are not supported on all models
40
+ cfg.gsub! /^Invalid input: [A-Za-z-]+\n/, ''
39
41
  cfg
40
42
  end
41
43
 
@@ -73,7 +75,9 @@ class Procurve < Oxidized::Model
73
75
 
74
76
  # not supported on all models
75
77
  cmd 'show system information' do |cfg|
76
- cfg = cfg.each_line.reject { |line| line.match /(.*CPU.*)|(.*Up Time.*)|(.*Total.*)|(.*Free.*)|(.*Lowest.*)|(.*Missed.*)/ }
78
+ cfg = cfg.each_line.reject do |line|
79
+ line.match /(.*CPU.*)|(.*Up Time.*)|(.*Total.*)|(.*Free.*)|(.*Lowest.*)|(.*Missed.*)/
80
+ end
77
81
  cfg = cfg.join
78
82
  comment cfg
79
83
  end
@@ -16,7 +16,9 @@ class QTECH < Oxidized::Model
16
16
  end
17
17
 
18
18
  cmd 'show version' do |cfg|
19
- comment cfg.each_line.reject { |line| line.match /^ (Copyright |All rights reserved$|Uptime is |Last reboot is )/ }.join
19
+ comment cfg.each_line.reject { |line|
20
+ line.match /^ (Copyright |All rights reserved$|Uptime is |Last reboot is )/
21
+ }.join
20
22
  end
21
23
 
22
24
  cmd 'show running-config' do |cfg|
@@ -1,15 +1,17 @@
1
1
  class QuantaOS < Oxidized::Model
2
2
  using Refinements
3
3
 
4
- prompt /^\((\w|\S)+\) (>|#)$/
4
+ prompt /^\(\S+\) (>|#)$/
5
5
  comment '! '
6
6
 
7
+ cmd :all do |cfg|
8
+ # Remove command echo and prompt
9
+ cfg.cut_both
10
+ end
11
+
7
12
  cmd 'show run' do |cfg|
8
- cfg.each_line.select do |line|
9
- (not line.match /^!.*$/) &&
10
- (not line.match /^\((\w|\S)+\) (>|#)$/) &&
11
- (not line.match /^show run$/)
12
- end.join
13
+ # Remove commented lines
14
+ cfg.lines.grep_v(/^!/).join
13
15
  end
14
16
 
15
17
  cfg :telnet do
@@ -0,0 +1,33 @@
1
+ class RGOS < Oxidized::Model
2
+ using Refinements
3
+
4
+ comment '! '
5
+
6
+ cmd :secret do |cfg|
7
+ cfg.gsub! /^(snmp-server community).*/, '\\1 <configuration removed>'
8
+ cfg.gsub! /^(username .+ (password|secret) \d) .+/, '\\1 <secret hidden>'
9
+ cfg.gsub! /^(enable (password|secret)( level \d+)?( \d)?) .+/, '\\1 <secret hidden>'
10
+ cfg
11
+ end
12
+
13
+ cmd 'show version' do |cfg|
14
+ cfg = cfg.each_line.reject { |line| line.match /^System start time/ }.join
15
+ cfg = cfg.each_line.reject { |line| line.match /^\s*System uptime/ }.join
16
+ comment "#{cfg.cut_both}\n"
17
+ end
18
+
19
+ cmd 'show running-config' do |cfg|
20
+ cfg = cfg.each_line.reject { |line| line.match /^Building configuration.../ }.join
21
+ cfg = cfg.each_line.reject { |line| line.match /^Current configuration : \d+ bytes/ }.join
22
+ cfg = cfg.each_line.reject { |line| line.match /^version [\d\w()]+/ }.join
23
+ # remove empty lines
24
+ cfg = cfg.each_line.reject { |line| line.match /^[\r\n\s\u0000#]+$/ }.join
25
+ cfg.cut_both
26
+ end
27
+
28
+ cfg :telnet, :ssh do
29
+ post_login 'terminal length 0'
30
+ post_login 'terminal width 0'
31
+ pre_logout 'exit'
32
+ end
33
+ end
@@ -0,0 +1,104 @@
1
+ class Riverbed < Oxidized::Model
2
+ using Refinements
3
+
4
+ # Define the prompt
5
+ prompt /^.* *[\w-]+ *[#>] *$/
6
+
7
+ # Define comment character
8
+ comment '! '
9
+
10
+ # Remove sensitive information
11
+ cmd :secret do |cfg|
12
+ cfg.gsub! /^( *tacacs-server (.+ )?key) .+/, '\\1 <secret hidden>'
13
+ cfg.gsub! /^( *username .+ (password|secret) \d) .+/, '\\1 <secret hidden>'
14
+ cfg.gsub! /^( *ntp server .+ key) .+/, '\\1 <secret hidden>'
15
+ cfg.gsub! /^( *ntp peer .+ key) .+/, '\\1 <secret hidden>'
16
+ cfg.gsub! /^( *snmp-server community).*/, '\\1 <configuration removed>'
17
+ cfg.gsub! /^( *ip security shared secret).*/, '\\1 <secret hidden>'
18
+ cfg.gsub! /^( *service shared-secret secret client).*/, '\\1 <secret hidden>'
19
+ cfg.gsub! /^( *service shared-secret secret server).*/, '\\1 <secret hidden>'
20
+ cfg
21
+ end
22
+
23
+ # Get version information and output it as comments
24
+ cmd 'show version' do |cfg|
25
+ cfg = cfg.cut_both
26
+
27
+ output = ''
28
+ cfg.each_line do |line|
29
+ line.strip!
30
+ output << comment("Product name: #{Regexp.last_match(1)}\n") if line =~ /^Product name:\s+(.*)$/
31
+ output << comment("Product release: #{Regexp.last_match(1)}\n") if line =~ /^Product release:\s+(.*)$/
32
+ output << comment("Build ID: #{Regexp.last_match(1)}\n") if line =~ /^Build ID:\s+(.*)$/
33
+ output << comment("Build date: #{Regexp.last_match(1)}\n") if line =~ /^Build date:\s+(.*)$/
34
+ output << comment("Build arch: #{Regexp.last_match(1)}\n") if line =~ /^Build arch:\s+(.*)$/
35
+ output << comment("Built by: #{Regexp.last_match(1)}\n") if line =~ /^Built by:\s+(.*)$/
36
+ output << comment("Product model: #{Regexp.last_match(1)}\n") if line =~ /^Product model:\s+(.*)$/
37
+ output << comment("Number of CPUs: #{Regexp.last_match(1)}\n") if line =~ /^Number of CPUs:\s+(.*)$/
38
+ end
39
+ output + "\n"
40
+ end
41
+
42
+ # Get hardware information and output it as comments
43
+ cmd 'show hardware all' do |cfg|
44
+ cfg = cfg.cut_both
45
+
46
+ output = ''
47
+ cfg.each_line do |line|
48
+ line.strip!
49
+ output << comment("Hardware revision: #{Regexp.last_match(1)}\n") if line =~ /^Hardware revision:\s+(.*)$/
50
+ output << comment("Mainboard: #{Regexp.last_match(1)}\n") if line =~ /^Mainboard:\s+(.*)$/
51
+ if line =~ /^Slot (\d+):\s+\.*\s+(.*)$/
52
+ slot_number = Regexp.last_match(1)
53
+ slot_info = Regexp.last_match(2)
54
+ output << comment("Slot #{slot_number}: #{slot_info}\n")
55
+ end
56
+ output << comment("System led: #{Regexp.last_match(1)}\n") if line =~ /^System led:\s+(.*)$/
57
+ end
58
+ output + "\n"
59
+ end
60
+
61
+ # Get serial information and output it as comment
62
+ cmd 'show info' do |cfg|
63
+ cfg = cfg.cut_both
64
+
65
+ output = ''
66
+ cfg.each_line do |line|
67
+ line.strip!
68
+ output << comment("Serial: #{Regexp.last_match(1)}\n") if line =~ /^Serial:\s+(.*)$/
69
+ end
70
+ output + "\n"
71
+ end
72
+
73
+ # Get the running configuration
74
+ cmd 'show running-config' do |cfg|
75
+ cfg = cfg.cut_both
76
+
77
+ cfg = cfg.each_line.map do |line|
78
+ if line =~ /^(.*##.*?##)(.*)$/
79
+ comment_part = Regexp.last_match(1).strip
80
+ command_part = Regexp.last_match(2).strip
81
+ comment_line = comment(comment_part)
82
+ if command_part.empty?
83
+ comment_line + "\n"
84
+ else
85
+ comment_line + "\n" + command_part + "\n"
86
+ end
87
+ else
88
+ line
89
+ end
90
+ end.join
91
+
92
+ cfg
93
+ end
94
+
95
+ # SSH configuration
96
+ cfg :ssh do
97
+ post_login do
98
+ cmd 'enable'
99
+ cmd 'terminal length 0'
100
+ cmd 'terminal width 1024'
101
+ end
102
+ pre_logout 'exit'
103
+ end
104
+ end
@@ -11,17 +11,17 @@ class RouterOS < Oxidized::Model
11
11
  cfg.gsub! /^\r+(.+)/, '\1'
12
12
  cfg.gsub! /([^\r]*)\r+$/, '\1'
13
13
  end
14
- cfg
14
+ cfg.lines.map { |line| line.rstrip }.join("\n") + "\n" # strip trailing whitespace
15
15
  end
16
16
 
17
- cmd '/system routerboard print without-paging' do |cfg|
18
- cfg = cfg.each_line.grep(/(model|firmware-type|current-firmware|serial-number):/).join
17
+ cmd '/system resource print' do |cfg|
18
+ cfg = cfg.each_line.grep(/(version|factory-software|total-memory|cpu|cpu-count|total-hdd-space|architecture-name|board-name|platform):/).join
19
19
  comment cfg
20
20
  end
21
21
 
22
- cmd '/system package update print without-paging' do |cfg|
23
- version_line = cfg.each_line.grep(/installed-version: /)[0]
24
- @ros_version = /: ([0-9])/.match(version_line)[1].to_i
22
+ cmd '/system package update print' do |cfg|
23
+ version_line = cfg.each_line.grep(/installed-version:\s|current-version:\s/)[0]
24
+ @ros_version = /([0-9])/.match(version_line)[0].to_i
25
25
  comment version_line
26
26
  end
27
27
 
@@ -29,8 +29,12 @@ class RouterOS < Oxidized::Model
29
29
  comment cfg
30
30
  end
31
31
 
32
+ cmd :significant_changes do |cfg|
33
+ cfg.gsub(/^(#\s+installed-version: [^\n]+\n).*?^(?=# software id)/m, '\1')
34
+ end
35
+
32
36
  post do
33
- Oxidized.logger.debug "lib/oxidized/model/routeros.rb: running /export for routeros version #{@ros_version}"
37
+ logger.debug "Running /export for routeros version #{@ros_version}"
34
38
  run_cmd = if vars(:remove_secret)
35
39
  '/export hide-sensitive'
36
40
  elsif (not @ros_version.nil?) && (@ros_version >= 7)
@@ -40,12 +44,15 @@ class RouterOS < Oxidized::Model
40
44
  end
41
45
  cmd run_cmd do |cfg|
42
46
  cfg.gsub! /\\\r?\n\s+/, '' # strip new line
43
- cfg.gsub! /# inactive time\r\n/, '' # Remove time based system comment
47
+ cfg.gsub! "# inactive time\r\n", '' # Remove time based system comment
44
48
  cfg.gsub! /# received packet from \S+ bad format\r\n/, '' # Remove intermittent VRRP/CARP collision comment
45
- cfg.gsub! /# poe-out status: short_circuit\r\n/, '' # Remove intermittent POE short_circuit comment
46
- cfg.gsub! /# Firmware upgraded successfully, please reboot for changes to take effect!\r\n/, '' # Remove transient firmware upgrade comment
49
+ cfg.gsub! "# poe-out status: short_circuit\r\n", '' # Remove intermittent POE short_circuit comment
50
+ cfg.gsub! "# Firmware upgraded successfully, please reboot for changes to take effect!\r\n", '' # Remove transient firmware upgrade comment
47
51
  cfg.gsub! /# \S+ not ready\r\n/, '' # Remove intermittent $interface not ready comment
48
- cfg = cfg.split("\n").reject { |line| line[/^#\s\w{3}\/\d{2}\/\d{4}.*$/] }
52
+ cfg.gsub! /# .+ please restart the device in order to apply the new setting\r\n/, '' # Remove intermittent restart needed comment. (e.g. for ipv6 settings)
53
+ cfg = cfg.split("\n")
54
+ cfg.reject! { |line| line[/^#\s\w{3}\/\d{2}\/\d{4}.*$/] } # Remove date time and 'by RouterOS' comment (v6)
55
+ cfg.reject! { |line| line[/^#\s\d{4}-\d{2}-\d{2}.*$/] } # Remove date time and 'by RouterOS' comment (v7)
49
56
  cfg.join("\n") + "\n"
50
57
  end
51
58
  end
@@ -4,12 +4,29 @@ class SAOS < Oxidized::Model
4
4
  # Ciena SAOS switch
5
5
  # used for 6.x devices
6
6
 
7
- comment '! '
7
+ comment '! '
8
+ prompt /^[\w-]+\*?>\s?/
8
9
 
9
10
  cmd :all do |cfg|
11
+ cfg.gsub! /(Waiting for )(accounting|authorization).*\n/, '' # Remove TACACS errors
10
12
  cfg.cut_both
11
13
  end
12
14
 
15
+ cmd 'chassis show device-id power' do |cfg|
16
+ comment cfg
17
+ end
18
+
19
+ cmd 'software show' do |cfg|
20
+ cfg.gsub! /^\| Bank status.*/, '| Bank status : <removed> |'
21
+ comment cfg
22
+ end
23
+
24
+ cmd 'port xcvr show' do |cfg|
25
+ cfg.gsub! /^SHELL PARSER FAILURE.*/, '' # Ignore command failure
26
+ cfg.gsub! /(\s\|.{10}\|)(Ena\s\s|\s\sDis|UCTF\s)(.*)/, '\1 \3' # Remove transient operational state
27
+ comment cfg
28
+ end
29
+
13
30
  cmd 'configuration show' do |cfg|
14
31
  cfg.gsub! /^! Created: [^\n]*\n/, ''
15
32
  cfg.gsub! /^! On terminal: [^\n]*\n/, ''
@@ -0,0 +1,38 @@
1
+ class SAOS10 < Oxidized::Model
2
+ using Refinements
3
+ # Ciena SAOS switch
4
+ # used for 10.x devices
5
+
6
+ prompt /^[\w-]+\*?> ?$/
7
+ comment '# '
8
+
9
+ cmd :all do |cfg|
10
+ cfg.cut_both
11
+ end
12
+
13
+ cmd('show system hostname') { |cfg| comment cfg }
14
+
15
+ cmd('show software') { |cfg| comment cfg }
16
+
17
+ cmd('show system components') { |cfg| comment cfg }
18
+
19
+ cmd('show system health') { |cfg| comment cfg }
20
+
21
+ cmd('show system last-reset-reasons') { |cfg| comment cfg }
22
+
23
+ cmd 'show running config' do |cfg|
24
+ cfg.gsub! /^! Created: [^\n]*\n/, ''
25
+ cfg.gsub! /^! On terminal: [^\n]*\n/, ''
26
+ cfg
27
+ end
28
+
29
+ cfg :telnet do
30
+ username /login:/
31
+ password /assword:/
32
+ end
33
+
34
+ cfg :telnet, :ssh do
35
+ post_login 'set session more off'
36
+ pre_logout 'exit'
37
+ end
38
+ end
@@ -3,7 +3,7 @@ class Siklu < Oxidized::Model
3
3
 
4
4
  # Siklu EtherHaul #
5
5
 
6
- prompt /^[\^M\s]{0,}[\w\-\s\.\"]+>$/
6
+ prompt /^[\^M\s]{0,}[\w\-\s."]+>$/
7
7
 
8
8
  cmd 'copy startup-configuration display' do |cfg|
9
9
  cfg.each_line.to_a[2..2].join
@@ -0,0 +1,22 @@
1
+ class SikluMHTG < Oxidized::Model
2
+ using Refinements
3
+
4
+ # Siklu MultiHaul TG#
5
+ # Requires source to define the model as SikluMHTG #
6
+
7
+ prompt /^\r?MH-[TN]\d{3}@\w{2,8}>$/
8
+
9
+ expect /--More--/ do |data, re|
10
+ send ' '
11
+ data.sub re, ''
12
+ end
13
+
14
+ cmd 'show startup' do |cfg|
15
+ cfg.gsub! /[\b]|\e\[A|\e\[2K/, ''
16
+ cfg.cut_both
17
+ end
18
+
19
+ cfg :ssh do
20
+ pre_logout 'quit'
21
+ end
22
+ end
@@ -0,0 +1,28 @@
1
+ class SixWind < Oxidized::Model
2
+ using Refinements
3
+
4
+ prompt /^[\w\s().@_\/:-]+> $/
5
+ comment '# '
6
+
7
+ cmd :all do |cfg|
8
+ cfg.cut_both
9
+ end
10
+
11
+ cmd :secret do |cfg|
12
+ cfg.gsub!(/(?<! {1})(?:password|secret) (?:\d )?\S+/, '\\1 <secret hidden>') # double space to exclude radius password template
13
+ cfg
14
+ end
15
+
16
+ cmd 'show product version' do |cfg|
17
+ comment cfg
18
+ end
19
+
20
+ cmd 'show config' do |cfg|
21
+ cfg
22
+ end
23
+
24
+ cfg :ssh do
25
+ post_login 'cliconfig pager enabled false'
26
+ pre_logout 'exit'
27
+ end
28
+ end
@@ -14,9 +14,9 @@ class SLXOS < Oxidized::Model
14
14
  cmd 'show chassis' do |cfg|
15
15
  cfg.encode!("UTF-8", invalid: :replace, undef: :replace) # sometimes ironware returns broken encoding
16
16
  cfg.gsub! /.*Power Usage.*/, '' # remove unwanted lines power usage
17
- cfg.gsub! /^Update\:.*$/, '' # remove unwanted current date
17
+ cfg.gsub! /^Update:.*$/, '' # remove unwanted current date
18
18
  cfg.gsub! /Time A(live|wake).*/, '' # remove unwanted lines time alive/awake
19
- cfg.gsub! /([\[]*)1([\]]*)<->([\[]*)2([\]]*)(<->([\[]*)3([\]]*))*/, ''
19
+ cfg.gsub! /(\[*)1(\]*)<->(\[*)2(\]*)(<->(\[*)3(\]*))*/, ''
20
20
 
21
21
  comment cfg
22
22
  end
@@ -31,7 +31,7 @@ class SLXOS < Oxidized::Model
31
31
 
32
32
  cmd 'show slots' do |cfg|
33
33
  cfg.gsub! /^-*^$/, '' # some slx devices are fixed config
34
- cfg.gsub! /syntax error: element does not exist/, '' # same as above
34
+ cfg.gsub! "syntax error: element does not exist", '' # same as above
35
35
 
36
36
  comment cfg
37
37
  end