oxidized 0.29.1 → 0.30.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (121) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/codeql.yml +4 -4
  3. data/.github/workflows/publishdocker.yml +3 -0
  4. data/.github/workflows/ruby.yml +1 -1
  5. data/.github/workflows/stale.yml +4 -1
  6. data/.rubocop.yml +6 -3
  7. data/.rubocop_todo.yml +10 -93
  8. data/CHANGELOG.md +66 -4
  9. data/CONTRIBUTING.md +174 -0
  10. data/Dockerfile +12 -1
  11. data/README.md +18 -36
  12. data/bin/oxidized +2 -5
  13. data/docs/Hooks.md +37 -1
  14. data/docs/Model-Notes/APC_AOS.md +52 -0
  15. data/docs/Model-Notes/FSOS.md +11 -0
  16. data/docs/Model-Notes/FortiOS.md +28 -0
  17. data/docs/Model-Notes/README.md +1 -20
  18. data/docs/Model-Notes/XGS4600-Zyxel.md +5 -0
  19. data/docs/Ruby-API.md +1 -1
  20. data/docs/Sources.md +13 -0
  21. data/docs/Supported-OS-Types.md +178 -270
  22. data/docs/Troubleshooting.md +16 -0
  23. data/examples/podman-compose/Makefile +61 -0
  24. data/examples/podman-compose/README.md +58 -0
  25. data/examples/podman-compose/docker-compose.yml +21 -0
  26. data/examples/podman-compose/model-simulation/Dockerfile-model +13 -0
  27. data/examples/podman-compose/model-simulation/asternos.sh +34 -0
  28. data/examples/podman-compose/oxidized-config/.gitignore +8 -0
  29. data/examples/podman-compose/oxidized-config/config +46 -0
  30. data/examples/podman-compose/oxidized-config/router.db +1 -0
  31. data/examples/podman-compose/oxidized-ssh/README.md +14 -0
  32. data/extra/rest_client.rb +2 -2
  33. data/extra/syslog.rb +2 -2
  34. data/lib/oxidized/cli.rb +6 -4
  35. data/lib/oxidized/config.rb +17 -14
  36. data/lib/oxidized/core.rb +22 -3
  37. data/lib/oxidized/hook.rb +3 -3
  38. data/lib/oxidized/input/exec.rb +1 -1
  39. data/lib/oxidized/input/ftp.rb +2 -2
  40. data/lib/oxidized/input/http.rb +32 -8
  41. data/lib/oxidized/input/input.rb +1 -1
  42. data/lib/oxidized/input/scp.rb +52 -0
  43. data/lib/oxidized/input/ssh.rb +10 -7
  44. data/lib/oxidized/input/telnet.rb +3 -2
  45. data/lib/oxidized/input/tftp.rb +1 -1
  46. data/lib/oxidized/jobs.rb +11 -1
  47. data/lib/oxidized/manager.rb +6 -6
  48. data/lib/oxidized/model/acos.rb +1 -1
  49. data/lib/oxidized/model/addpack.rb +26 -0
  50. data/lib/oxidized/model/adtran.rb +5 -1
  51. data/lib/oxidized/model/adva.rb +2 -2
  52. data/lib/oxidized/model/aoscx.rb +2 -1
  53. data/lib/oxidized/model/apc_aos.rb +2 -1
  54. data/lib/oxidized/model/aricentiss.rb +7 -0
  55. data/lib/oxidized/model/asternos.rb +22 -0
  56. data/lib/oxidized/model/asyncos.rb +2 -2
  57. data/lib/oxidized/model/awplus.rb +2 -2
  58. data/lib/oxidized/model/bdcom.rb +1 -0
  59. data/lib/oxidized/model/c4cmts.rb +1 -2
  60. data/lib/oxidized/model/ciscosma.rb +1 -1
  61. data/lib/oxidized/model/ciscosmb.rb +6 -1
  62. data/lib/oxidized/model/comware.rb +2 -2
  63. data/lib/oxidized/model/cumulus.rb +1 -1
  64. data/lib/oxidized/model/dellx.rb +1 -1
  65. data/lib/oxidized/model/dlink.rb +4 -2
  66. data/lib/oxidized/model/dlinknextgen.rb +51 -0
  67. data/lib/oxidized/model/dnos.rb +3 -0
  68. data/lib/oxidized/model/edgecos.rb +1 -1
  69. data/lib/oxidized/model/eltex.rb +2 -0
  70. data/lib/oxidized/model/enterasys800.rb +1 -1
  71. data/lib/oxidized/model/eos.rb +1 -1
  72. data/lib/oxidized/model/firebrick.rb +2 -2
  73. data/lib/oxidized/model/firewareos.rb +1 -1
  74. data/lib/oxidized/model/fortios.rb +9 -2
  75. data/lib/oxidized/model/fsos.rb +44 -0
  76. data/lib/oxidized/model/ios.rb +1 -1
  77. data/lib/oxidized/model/iosxr.rb +2 -2
  78. data/lib/oxidized/model/junos.rb +3 -2
  79. data/lib/oxidized/model/mimosab11.rb +34 -0
  80. data/lib/oxidized/model/ml66.rb +33 -0
  81. data/lib/oxidized/model/model.rb +3 -3
  82. data/lib/oxidized/model/netgear.rb +1 -1
  83. data/lib/oxidized/model/netscaler.rb +1 -1
  84. data/lib/oxidized/model/nxos.rb +4 -3
  85. data/lib/oxidized/model/ocnos.rb +42 -0
  86. data/lib/oxidized/model/onefinity.rb +18 -0
  87. data/lib/oxidized/model/openbsd.rb +1 -1
  88. data/lib/oxidized/model/opengear.rb +36 -1
  89. data/lib/oxidized/model/opnsense.rb +1 -1
  90. data/lib/oxidized/model/panos.rb +2 -0
  91. data/lib/oxidized/model/pfsense.rb +1 -0
  92. data/lib/oxidized/model/procurve.rb +3 -1
  93. data/lib/oxidized/model/rgos.rb +33 -0
  94. data/lib/oxidized/model/routeros.rb +10 -8
  95. data/lib/oxidized/model/slxos.rb +2 -2
  96. data/lib/oxidized/model/sonicos.rb +18 -17
  97. data/lib/oxidized/model/sros.rb +3 -3
  98. data/lib/oxidized/model/tplink.rb +4 -3
  99. data/lib/oxidized/model/truenas.rb +2 -1
  100. data/lib/oxidized/model/vrp.rb +3 -1
  101. data/lib/oxidized/model/vyatta.rb +6 -0
  102. data/lib/oxidized/model/zynos.rb +67 -3
  103. data/lib/oxidized/model/zynosadsl.rb +14 -0
  104. data/lib/oxidized/model/zynosgs.rb +2 -0
  105. data/lib/oxidized/model/zynosmgs.rb +32 -0
  106. data/lib/oxidized/node.rb +7 -7
  107. data/lib/oxidized/nodes.rb +17 -12
  108. data/lib/oxidized/output/file.rb +1 -1
  109. data/lib/oxidized/output/git.rb +5 -3
  110. data/lib/oxidized/output/gitcrypt.rb +4 -3
  111. data/lib/oxidized/signals.rb +44 -0
  112. data/lib/oxidized/source/csv.rb +1 -1
  113. data/lib/oxidized/source/http.rb +26 -5
  114. data/lib/oxidized/source/source.rb +2 -2
  115. data/lib/oxidized/source/sql.rb +3 -3
  116. data/lib/oxidized/version.rb +2 -2
  117. data/lib/oxidized/worker.rb +8 -1
  118. data/lib/oxidized.rb +3 -2
  119. data/lib/refinements.rb +1 -1
  120. data/oxidized.gemspec +6 -3
  121. metadata +77 -9
@@ -14,7 +14,11 @@ class Adtran < Oxidized::Model
14
14
  cfg
15
15
  end
16
16
 
17
- cmd 'show running-config'
17
+ cmd 'show running-config' do |cfg|
18
+ # Strip out line at the top which displays the current date/time
19
+ # ! Created : Mon Jun 26 2023 10:07:07
20
+ cfg.gsub! /! Createds+:.*\n/, ''
21
+ end
18
22
 
19
23
  cfg :ssh do
20
24
  if vars :enable
@@ -6,7 +6,7 @@
6
6
  class ADVA < Oxidized::Model
7
7
  using Refinements
8
8
 
9
- prompt /\w+\-+[#>]\s?$/
9
+ prompt /\w+-+[#>]\s?$/
10
10
  comment '# '
11
11
 
12
12
  cmd :secret do |cfg|
@@ -18,7 +18,7 @@ class ADVA < Oxidized::Model
18
18
  cfg.cut_both
19
19
  end
20
20
 
21
- cmd 'show running-config current' do |cfg|
21
+ cmd 'show running-config delta' do |cfg|
22
22
  cfg.each_line.reject { |line| line.match /^Preparing configuration file.*/ }.join
23
23
  end
24
24
 
@@ -58,6 +58,7 @@ class Aoscx < Oxidized::Model
58
58
  cfg.gsub! /^(\d\/\d\/\d.*\s+)\d+\s+$/, '\\1<hidden>'
59
59
  cfg.gsub! /^(\d+\/\S+\s+\S+\s+)\d+\.\d+\s+C(.*)/, '\\1<hidden>\\2'
60
60
  cfg.gsub! /^(LC.*\s+)\d+\.\d+\s+(C.*)$/, '\\1 <hidden> \\2'
61
+ cfg.gsub! /^(\S+\s+\S+\s+\s+\S+\s+)(slow|normal|medium|fast|max)(\s+\S+\s+\S+\s+)\d+/, '\\1<speed>\\3<rpm>'
61
62
  comment cfg
62
63
  end
63
64
 
@@ -69,7 +70,7 @@ class Aoscx < Oxidized::Model
69
70
  comment cfg
70
71
  end
71
72
 
72
- cmd 'show system | exclude "Up Time" | exclude "CPU" | exclude "Memory"' do |cfg|
73
+ cmd 'show system | exclude "Up Time" | exclude "CPU" | exclude "Memory" | exclude "Pkts .x" | exclude "Lowest" | exclude "Missed"' do |cfg|
73
74
  comment cfg
74
75
  end
75
76
 
@@ -2,7 +2,8 @@ class Apc_aos < Oxidized::Model # rubocop:disable Naming/ClassAndModuleCamelCase
2
2
  using Refinements
3
3
 
4
4
  cmd 'config.ini' do |cfg|
5
- cfg.gsub! /^; Configuration file, generated on.*/, ''
5
+ cfg.gsub!(/^; Configuration file, generated on.*\n/, '')
6
+ cfg
6
7
  end
7
8
 
8
9
  cfg :ftp do
@@ -2,6 +2,10 @@
2
2
  # #show version
3
3
  # Switch ID Hardware Version Firmware Version
4
4
  # 0 SSE-G48-TG4 (P2-01) 1.0.16-9
5
+ # and
6
+ # # show version
7
+ # Switch ID Hardware Version Firmware Version
8
+ # 0 MBM-XEM-002 (B6-01) 2.1.3-25
5
9
 
6
10
  class AricentISS < Oxidized::Model
7
11
  using Refinements
@@ -13,6 +17,9 @@ class AricentISS < Oxidized::Model
13
17
  # 1.0.18-15 is known to include the corrected spelling
14
18
  post_login 'no cli pagination'
15
19
  post_login 'no cli pagignation'
20
+ # Starting firmware 2.0, pagination is done differently.
21
+ # This configuration is reset after the session ends.
22
+ post_login 'conf t; set cli pagination off; exit'
16
23
  pre_logout 'exit'
17
24
  end
18
25
 
@@ -0,0 +1,22 @@
1
+ class AsterNOS < Oxidized::Model
2
+ using Refinements
3
+
4
+ prompt /^[^\$]+\$/
5
+ comment '# '
6
+
7
+ cmd :all do |cfg|
8
+ cfg.each_line.to_a[1..-2].join
9
+ end
10
+
11
+ cmd 'show version' do |cfg|
12
+ # @model = Regexp.last_match(1) if cfg =~ /^Model: (\S+)/
13
+ comment cfg
14
+ end
15
+
16
+ cmd "show runningconfiguration all"
17
+
18
+ cfg :ssh do
19
+ # exec true
20
+ pre_logout 'exit'
21
+ end
22
+ end
@@ -25,9 +25,9 @@ class AsyncOS < Oxidized::Model
25
25
  # Delete hour and date which change each run
26
26
  # cfg.gsub! /\sCurrent Time: \S+\s\S+\s+\S+\s\S+\s\S+/, ' Current Time:'
27
27
  # Delete select passphrase display option
28
- cfg.gsub! /Choose the passphrase option:/, ''
28
+ cfg.gsub! "Choose the passphrase option:", ''
29
29
  cfg.gsub! /1. Mask passphrases \(Files with masked passphrases cannot be loaded using/, ''
30
- cfg.gsub! /loadconfig command\)/, ''
30
+ cfg.gsub! "loadconfig command)", ''
31
31
  cfg.gsub! /2. Encrypt passphrases/, ''
32
32
  cfg.gsub! /3. Plain passphrases/, ''
33
33
  cfg.gsub! /^3$/, ''
@@ -15,8 +15,8 @@ class AWPlus < Oxidized::Model
15
15
 
16
16
  # Removes gibberish pager output e.g. VT100 escape codes
17
17
  cmd :all do |cfg|
18
- cfg.gsub! /\e\[K/, '' # example how to handle pager - cleareol EL0
19
- cfg.gsub! /\e\[7m\e\[m/, '' # example how to handle pager - Reverse SGR7
18
+ cfg.gsub! "\e[K", '' # example how to handle pager - cleareol EL0
19
+ cfg.gsub! "\e[7m\e[m", '' # example how to handle pager - Reverse SGR7
20
20
  cfg.delete! "\r" # Filters rogue ^M - see issue #415
21
21
  cfg.cut_both
22
22
  end
@@ -47,5 +47,6 @@ class BDCOM < Oxidized::Model
47
47
 
48
48
  post_login 'terminal length 0'
49
49
  pre_logout 'exit'
50
+ pre_logout 'exit'
50
51
  end
51
52
  end
@@ -18,8 +18,7 @@ class C4CMTS < Oxidized::Model
18
18
  cfg
19
19
  end
20
20
 
21
- cmd 'show environment' do |cfg|
22
- cfg.gsub! /\s+[\-\d]+\s+C\s+[(\s\d]+\s+F\)/, '' # remove temperature readings
21
+ cmd 'show factory-eeprom' do |cfg|
23
22
  comment cfg.cut_both
24
23
  end
25
24
 
@@ -25,7 +25,7 @@ class CiscoSMA < Oxidized::Model
25
25
  # Delete hour and date which change each run
26
26
  # cfg.gsub! /\sCurrent Time: \S+\s\S+\s+\S+\s\S+\s\S+/, ' Current Time:'
27
27
  # Delete select passphrase display option
28
- cfg.gsub! /Do you want to mask the password\? Files with masked passwords cannot be loaded/, ''
28
+ cfg.gsub! "Do you want to mask the password? Files with masked passwords cannot be loaded", ''
29
29
  cfg.gsub! /^\s+y/, ''
30
30
  # Delete space
31
31
  cfg.gsub! /\n\s{25}/, ''
@@ -5,7 +5,12 @@ class CiscoSMB < Oxidized::Model
5
5
  # http://www.cisco.com/c/en/us/support/switches/small-business-300-series-managed-switches/products-release-notes-list.html
6
6
 
7
7
  prompt /^\r?([\w.@()-]+[#>]\s?)$/
8
- comment '! '
8
+ comment '! '
9
+
10
+ expect '^.*Your password has exceeded the maximum lifetime.*$' do
11
+ send 'N'
12
+ ""
13
+ end
9
14
 
10
15
  cmd :all do |cfg|
11
16
  lines = cfg.each_line.to_a[1..-2]
@@ -27,7 +27,7 @@ class Comware < Oxidized::Model
27
27
  end
28
28
 
29
29
  cfg :telnet do
30
- username /^(Username|login):/
30
+ username /^(Username|[Ll]ogin):/
31
31
  password /^Password:/
32
32
  end
33
33
 
@@ -37,7 +37,7 @@ class Comware < Oxidized::Model
37
37
  if vars(:enable) == true
38
38
  cmd "super"
39
39
  elsif vars(:enable)
40
- cmd "super", /^ [pP]assword:/
40
+ cmd "super", /^\s?[pP]assword:/
41
41
  cmd vars(:enable)
42
42
  end
43
43
  end
@@ -1,7 +1,7 @@
1
1
  class Cumulus < Oxidized::Model
2
2
  using Refinements
3
3
 
4
- prompt /^((\w*)@(.*)):/
4
+ prompt /^(([\w.-]*)@(.*)):/
5
5
  comment '# '
6
6
 
7
7
  # add a comment in the final conf
@@ -7,7 +7,7 @@ class DellX < Oxidized::Model
7
7
 
8
8
  comment '! '
9
9
 
10
- expect /(^.*)?+[mM]ore\:+.*$/ do |data, re|
10
+ expect /(^.*)?+[mM]ore:+.*$/ do |data, re|
11
11
  send ' '
12
12
  data.sub re, ''
13
13
  end
@@ -2,9 +2,8 @@ class Dlink < Oxidized::Model
2
2
  using Refinements
3
3
 
4
4
  # D-LINK Switches
5
- # Add support dgs 1100 series (tested only with dgs-1100-10/me)
6
5
 
7
- prompt /^(\r*[\w\s.@()\/:-]+[#>]\s?)$/
6
+ prompt /[\w.@()\/:-]+[#>]\s?$/
8
7
  comment '# '
9
8
 
10
9
  cmd :secret do |cfg|
@@ -19,6 +18,9 @@ class Dlink < Oxidized::Model
19
18
 
20
19
  cmd 'show switch' do |cfg|
21
20
  cfg.gsub! /^System Uptime\s.+/, '' # Omit constantly changing uptime info
21
+ cfg.gsub! /^System up time\s.+/, '' # Omit constantly changing uptime info
22
+ cfg.gsub! /^System Time\s.+/, '' # Omit constantly changing uptime info
23
+ cfg.gsub! /^RTC Time\s.+/, '' # Omit constantly changing uptime info
22
24
  comment cfg
23
25
  end
24
26
 
@@ -0,0 +1,51 @@
1
+ class DlinkNextGen < Oxidized::Model
2
+ using Refinements
3
+
4
+ # D-LINK next generation cli Switches
5
+ # Add support DXS-1210-12SC
6
+
7
+ prompt /[\w.@()\/-]+[#>]\s?$/
8
+ comment '# '
9
+
10
+ cmd :all do |cfg|
11
+ cfg.each_line.to_a[2..-2].map { |line| line.delete("\r").rstrip }.join("\n") + "\n"
12
+ end
13
+
14
+ cmd :secret do |cfg|
15
+ cfg.gsub! /(password) (\S+).*/, '\\1 <secret hidden>'
16
+ cfg.gsub! /(snmp-server group) (\S+) (v.*)/, '\\1 <secret hidden> \\3'
17
+ cfg.gsub! /(snmp-server community) (\S+) (v.*)/, '\\1 <secret hidden> \\3'
18
+ cfg
19
+ end
20
+
21
+ # "show switch" doesn't exist on DXS-1210-28T rev A1 Firmware: Build 1.00.024; not figured out how to run "show version" so running both
22
+ cmd 'show switch' do |cfg|
23
+ cfg.gsub! /^\s+System Time\s.+/, '' # Omit constantly changing uptime info
24
+ comment cfg
25
+ end
26
+
27
+ cmd 'show version' do |cfg|
28
+ comment cfg
29
+ end
30
+
31
+ cmd 'show vlan' do |cfg|
32
+ comment cfg
33
+ end
34
+
35
+ cmd 'show running-config' do |cfg|
36
+ cfg.gsub! /^(snmp-server community ["\w]+) \S+/, '\\1 <removed>'
37
+ cfg.gsub! /^(username [\w.@-]+ privilege \d{1,2} password \d{1,2}) \S+/, '\\1 <removed>'
38
+ cfg
39
+ end
40
+
41
+ cfg :telnet do
42
+ username /\r*([\w\s.@()\/:-]+)?([Uu]ser[Nn]ame|[Ll]ogin):/
43
+ password /\r*[Pp]ass[Ww]ord:/
44
+ end
45
+
46
+ cfg :telnet, :ssh do
47
+ post_login 'terminal length 0'
48
+ post_login 'terminal width 255'
49
+ pre_logout 'logout'
50
+ end
51
+ end
@@ -16,6 +16,9 @@ class DNOS < Oxidized::Model
16
16
  cfg.gsub! /secret (\d+) (\S+).*/, '<secret hidden>'
17
17
  cfg.gsub! /password (\d+) (\S+).*/, '<secret hidden>'
18
18
  cfg.gsub! /^(tacacs-server key \d+) (\S+).*/, '\\1 <secret hidden>'
19
+ cfg.gsub! /(ip ospf message-digest-key \d \S+ \d).*/, '\\1 <secret hidden>'
20
+ cfg.gsub! /(authentication-type).*/, '\\1 <secret hidden>'
21
+ cfg.gsub! /^(bsd-username \S+ secret).*/, '\\1 <secret hidden>'
19
22
  cfg
20
23
  end
21
24
 
@@ -31,7 +31,7 @@ class EdgeCOS < Oxidized::Model
31
31
 
32
32
  cmd 'show system' do |cfg|
33
33
  cfg.gsub! /^.*\sUp Time\s*:.*\n/i, ''
34
- cfg.gsub! /^(.*\sTemperature \d*:).*\n/i, '\\1 <removed>'
34
+ cfg.gsub! /^(.*\sTemperature \d*\s*:\s*).*/i, '\\1<removed>'
35
35
  comment cfg
36
36
  end
37
37
 
@@ -44,6 +44,8 @@ class Eltex < Oxidized::Model
44
44
  end
45
45
  end
46
46
  post_login 'terminal datadump'
47
+ # disable cli pagination for MES2424
48
+ post_login 'set cli pagination off'
47
49
  pre_logout 'disable'
48
50
  pre_logout 'exit'
49
51
  end
@@ -23,7 +23,7 @@ class Enterasys800 < Oxidized::Model
23
23
  cmd :all do |cfg|
24
24
  cfg = cfg.cut_both
25
25
  cfg = cfg.gsub /^[\r\n]|^\s\s\s/, ''
26
- cfg = cfg.gsub /Command: show config effective/, ''
26
+ cfg = cfg.gsub "Command: show config effective", ''
27
27
  cfg
28
28
  end
29
29
 
@@ -15,7 +15,7 @@ class EOS < Oxidized::Model
15
15
  cfg.gsub! /^(snmp-server community).*/, '\\1 <configuration removed>'
16
16
  cfg.gsub! /(secret \w+) (\S+).*/, '\\1 <secret hidden>'
17
17
  cfg.gsub! /(password \d+) (\S+).*/, '\\1 <secret hidden>'
18
- cfg.gsub! /^(enable secret).*/, '\\1 <configuration removed>'
18
+ cfg.gsub! /^(enable (?:secret|password)).*/, '\\1 <configuration removed>'
19
19
  cfg.gsub! /^(service unsupported-transceiver).*/, '\\1 <license key removed>'
20
20
  cfg.gsub! /^(tacacs-server key \d+).*/, '\\1 <configuration removed>'
21
21
  cfg.gsub! /( {6}key) (\h+ 7) (\h+).*/, '\\1 <secret hidden>'
@@ -10,8 +10,8 @@ class Firebrick < Oxidized::Model
10
10
  end
11
11
 
12
12
  cmd 'show status' do |cfg|
13
- cfg.gsub! /Status/, ''
14
- cfg.gsub! /------/, ''
13
+ cfg.gsub! "Status", ''
14
+ cfg.gsub! "------", ''
15
15
  cfg.gsub! /Uptime.*/, ''
16
16
  cfg.gsub! /Current time.*/, ''
17
17
  cfg.gsub! /RAM.*/, ''
@@ -1,7 +1,7 @@
1
1
  class FirewareOS < Oxidized::Model
2
2
  using Refinements
3
3
 
4
- prompt /^\[?\w*\]?\w*?(<\w*>)?(#|>)\s*$/
4
+ prompt /^\[?\w*\]?\w*?(<[\w-]*>)?(#|>)\s*$/
5
5
  comment '-- '
6
6
 
7
7
  cmd :all do |cfg|
@@ -5,6 +5,12 @@ class FortiOS < Oxidized::Model
5
5
 
6
6
  prompt /^([-\w.~]+(\s[(\w\-.)]+)?~?\s?[#>$]\s?)$/
7
7
 
8
+ # When a post-login-banner is enabled, you have to press "a" to log in
9
+ expect /^\(Press\s'a'\sto\saccept\):/ do |data, re|
10
+ send 'a'
11
+ data.sub re, ''
12
+ end
13
+
8
14
  expect /^--More--\s$/ do |data, re|
9
15
  send ' '
10
16
  data.sub re, ''
@@ -23,6 +29,7 @@ class FortiOS < Oxidized::Model
23
29
  cfg.gsub! /(set (?:passwd|password|key|group-password|auth-password-l1|auth-password-l2|rsso|history0|history1)) .+/, '\\1 <configuration removed>'
24
30
  cfg.gsub! /(set md5-key [0-9]+) .+/, '\\1 <configuration removed>'
25
31
  cfg.gsub! /(set private-key ).*?-+END (ENCRYPTED|RSA|OPENSSH) PRIVATE KEY-+\n?"$/m, '\\1<configuration removed>'
32
+ cfg.gsub! /(set privatekey ).*?-+END (ENCRYPTED|RSA|OPENSSH) PRIVATE KEY-+\n?"$/m, '\\1<configuration removed>'
26
33
  cfg.gsub! /(set ca )"-+BEGIN.*?-+END CERTIFICATE-+"$/m, '\\1<configuration removed>'
27
34
  cfg.gsub! /(set csr ).*?-+END CERTIFICATE REQUEST-+"$/m, '\\1<configuration removed>'
28
35
  cfg
@@ -38,7 +45,7 @@ class FortiOS < Oxidized::Model
38
45
  cfg.gsub! /(Disk Usage\s+:\s+)(.*)/, '\1<stripped>'
39
46
  cfg.gsub! /(^\S+ (?:disk|DB):\s+)(.*)/, '\1<stripped>\3'
40
47
  cfg.gsub! /(VM Registration:\s+)(.*)/, '\1<stripped>\3'
41
- cfg.gsub! /(Virus-DB|Extended DB|IPS-DB|IPS-ETDB|APP-DB|INDUSTRIAL-DB|Botnet DB|IPS Malicious URL Database|AV AI\/ML Model|IoT-Detect).*/, '\\1 <db version stripped>'
48
+ cfg.gsub! /(Virus-DB|Extended DB|FMWP-DB|IPS-DB|IPS-ETDB|APP-DB|INDUSTRIAL-DB|Botnet DB|IPS Malicious URL Database|AV AI\/ML Model|IoT-Detect).*/, '\\1 <db version stripped>'
42
49
  comment cfg
43
50
  end
44
51
 
@@ -66,7 +73,7 @@ class FortiOS < Oxidized::Model
66
73
 
67
74
  cfg << cmd('end') if @vdom_enabled
68
75
 
69
- ['show full-configuration | grep .', 'show full-configuration', 'show'].each do |fullcmd|
76
+ ['show | grep .', 'show full-configuration', 'show'].each do |fullcmd|
70
77
  fullcfg = cmd(fullcmd)
71
78
  next if fullcfg.lines[1..3].join =~ /(Parsing error at|command parse error)/ # Don't show for unsupported devices (e.g. FortiAnalyzer, FortiManager, FortiMail)
72
79
 
@@ -0,0 +1,44 @@
1
+ class FSOS < Oxidized::Model
2
+ # Fiberstore / fs.com
3
+ using Refinements
4
+ comment '! '
5
+
6
+ # Handle paging
7
+ expect /^ --More--.*$/ do |data, re|
8
+ send ' '
9
+ data.sub re, ''
10
+ end
11
+
12
+ cmd :secret do |cfg|
13
+ cfg.gsub! /(secret \w+) (\S+).*/, '\\1 <secret hidden>'
14
+ cfg.gsub! /(password \d+) (\S+).*/, '\\1 <secret hidden>'
15
+ cfg.gsub! /(snmp-server community \d+) (\S+).*/, '\\1 <secret hidden>'
16
+ cfg
17
+ end
18
+
19
+ cmd 'show version' do |cfg|
20
+ # Remove uptime so the result doesn't change every time
21
+ cfg.gsub! /.*uptime is.*\n/, ''
22
+ cfg.gsub! /.*System uptime.*\n/, ''
23
+ comment cfg
24
+ end
25
+
26
+ cmd 'show running-config' do |cfg|
27
+ # Remove "Building configuration..." message
28
+ cfg.gsub! /^Building configuration.*\n/, ''
29
+ cfg.cut_head
30
+ end
31
+
32
+ cfg :telnet do
33
+ username /^Username:/
34
+ password /^Password:/
35
+ end
36
+
37
+ cfg :telnet, :ssh do
38
+ post_login 'enable'
39
+ post_login 'terminal length 0'
40
+ post_login 'terminal width 256'
41
+ pre_logout 'exit'
42
+ pre_logout 'exit'
43
+ end
44
+ end
@@ -85,7 +85,7 @@ class IOS < Oxidized::Model
85
85
  comments << "Processor ID: #{Regexp.last_match(1)}" if cfg.lines[i + 1] =~ /processor board id (\S+)/i
86
86
  if cfg.lines[i + 2] =~ /(cpu at |processor: |#{cpu} processor,)/i
87
87
  # change implementation to impl and prepend comma
88
- cpuxtra = cfg.lines[i + 2].gsub(/implementation/, 'impl').gsub(/^/, ', ').chomp
88
+ cpuxtra = cfg.lines[i + 2].gsub("implementation", 'impl').gsub(/^/, ', ').chomp
89
89
  end
90
90
  comments << "CPU:#{slave} #{cpu}#{cpuxtra}#{slaveslot}"
91
91
  end
@@ -16,7 +16,7 @@ class IOSXR < Oxidized::Model
16
16
  cfg
17
17
  end
18
18
 
19
- cmd 'show inventory' do |cfg|
19
+ cmd 'admin show inventory' do |cfg|
20
20
  comment cfg
21
21
  end
22
22
 
@@ -25,7 +25,7 @@ class IOSXR < Oxidized::Model
25
25
  end
26
26
 
27
27
  cmd 'show running-config' do |cfg|
28
- cfg = cfg.each_line.to_a[3..-1].join
28
+ cfg = cfg.each_line.to_a[1..-1].join
29
29
  cfg
30
30
  end
31
31
 
@@ -1,6 +1,5 @@
1
1
  class JunOS < Oxidized::Model
2
2
  using Refinements
3
-
4
3
  comment '# '
5
4
 
6
5
  def telnet
@@ -10,11 +9,13 @@ class JunOS < Oxidized::Model
10
9
  cmd :all do |cfg|
11
10
  cfg = cfg.cut_both if screenscrape
12
11
  cfg.gsub!(/ scale-subscriber (\s+)(\d+)/, ' scale-subscriber <count>')
12
+ cfg.gsub!(/VMX-BANDWIDTH\s+(\d+) (.*)/, 'VMX-BANDWIDTH <count> \2')
13
13
  cfg.lines.map { |line| line.rstrip }.join("\n") + "\n"
14
14
  end
15
15
 
16
16
  cmd :secret do |cfg|
17
17
  cfg.gsub!(/community (\S+) {/, 'community <hidden> {')
18
+ cfg.gsub!(/(ssh-(rsa|dsa|ecdsa|ecdsa-sk|ed25519|ed25519-sk) )".*; ## SECRET-DATA/, '<secret removed>')
18
19
  cfg.gsub!(/ "\$\d\$\S+; ## SECRET-DATA/, ' <secret removed>;')
19
20
  cfg
20
21
  end
@@ -29,7 +30,7 @@ class JunOS < Oxidized::Model
29
30
  case @model
30
31
  when 'mx960'
31
32
  out << cmd('show chassis fabric reachability') { |cfg| comment cfg }
32
- when /^(ex22|ex33|ex4|ex8|qfx)/
33
+ when /^(ex22|ex3[34]|ex4|ex8|qfx)/
33
34
  out << cmd('show virtual-chassis') { |cfg| comment cfg }
34
35
  end
35
36
  out
@@ -0,0 +1,34 @@
1
+ begin
2
+ # Mechanize has to be intialized here as the login needs a POST request
3
+ require "mechanize"
4
+ rescue LoadError
5
+ # Oxidized requires mechanize
6
+ raise Oxidized::OxidizedError, "mechanize not found: sudo gem install mechanize"
7
+ end
8
+
9
+ class Mimosab11 < Oxidized::Model
10
+ using Refinements
11
+ # Callback cfg_cb function to login(POST) then get(GET) the configuration
12
+ cfg_cb = lambda do
13
+ @e = Mechanize.new
14
+ # Set login query endpoint(lqe) and login POST data(lqp)
15
+ lqe = "https://#{@node.ip}/?q=index.login&mimosa_ajax=1"
16
+ lgp = { "username" => "configure", "password" => @password }
17
+ # Set get request endpoint(gc) for config
18
+ gc = "https://#{@node.ip}/?q=preferences.configure&mimosa_action=download"
19
+ # Not to verify self signed
20
+ @e.verify_mode = 0
21
+ @e.post(lqe, lgp)
22
+ cfg = @e.get(gc)
23
+ cfg.body
24
+ end
25
+
26
+ cmd cfg_cb do |cfg|
27
+ cfg
28
+ end
29
+
30
+ cfg :http do
31
+ @username = @node.auth[:username]
32
+ @password = @node.auth[:password]
33
+ end
34
+ end
@@ -0,0 +1,33 @@
1
+ class ML66 < Oxidized::Model
2
+ comment '! '
3
+ prompt /.*#/
4
+
5
+ expect /User:.*$/ do |data, re|
6
+ send "admin_user\n"
7
+ send "#{@node.auth[:password]}\n"
8
+ data.sub re, ''
9
+ end
10
+
11
+ cmd 'show version' do |cfg|
12
+ cfg.gsub! "Uptime", ''
13
+ comment cfg
14
+ end
15
+
16
+ cmd 'show inventory hw all' do |cfg|
17
+ comment cfg
18
+ end
19
+
20
+ cmd 'show inventory sw all' do |cfg|
21
+ comment cfg
22
+ end
23
+
24
+ cmd 'show license status all' do |cfg|
25
+ comment cfg
26
+ end
27
+
28
+ cmd 'show running-config'
29
+
30
+ cfg :ssh do
31
+ pre_logout 'logout'
32
+ end
33
+ end
@@ -143,8 +143,8 @@ module Oxidized
143
143
  @input.send data
144
144
  end
145
145
 
146
- def expect(regex, &block)
147
- self.class.expect regex, &block
146
+ def expect(...)
147
+ self.class.expect(...)
148
148
  end
149
149
 
150
150
  def cfg
@@ -217,7 +217,7 @@ module Oxidized
217
217
 
218
218
  def process_cmd_output(output, name)
219
219
  output = String.new('') unless output.instance_of?(String)
220
- output.set_cmd(name)
220
+ output.process_cmd(name)
221
221
  output
222
222
  end
223
223
  end
@@ -2,7 +2,7 @@ class Netgear < Oxidized::Model
2
2
  using Refinements
3
3
 
4
4
  comment '!'
5
- prompt /^(\([\w\s\-.]+\)\s[#>])$/
5
+ prompt /^(\([\w\s\-\+.]+\)\s?[#>])$/
6
6
 
7
7
  cmd :secret do |cfg|
8
8
  cfg.gsub!(/password (\S+)/, 'password <hidden>')
@@ -1,7 +1,7 @@
1
1
  class NetScaler < Oxidized::Model
2
2
  using Refinements
3
3
 
4
- prompt /^([\w\.-]*>\s?)$/
4
+ prompt /^(.*[\w\.-]*>\s?)$/
5
5
  comment '# '
6
6
 
7
7
  cmd :all do |cfg|
@@ -10,11 +10,12 @@ class NXOS < Oxidized::Model
10
10
  end
11
11
 
12
12
  cmd :secret do |cfg|
13
- cfg.gsub! /^(snmp-server community).*/, '\\1 <configuration removed>'
14
- cfg.gsub! /^(snmp-server user (\S+) (\S+) auth (\S+)) (\S+) (priv) (\S+)/, '\\1 <configuration removed> '
13
+ cfg.gsub! /^(snmp-server community).*/, '\\1 <secret hidden>'
14
+ cfg.gsub! /^(snmp-server user (\S+) (\S+) auth (\S+)) (\S+) (priv) (\S+)/, '\\1 <secret hidden> '
15
+ cfg.gsub! /^(snmp-server host.*? )\S+( udp-port \d+)?$/, '\\1<secret hidden>\\2'
15
16
  cfg.gsub! /(password \d+) (\S+)/, '\\1 <secret hidden>'
16
17
  cfg.gsub! /^(radius-server key).*/, '\\1 <secret hidden>'
17
- cfg.gsub! /^(tacacs-server host .+ key(?: \d+)?) \S+/, '\\1 <secret hidden>'
18
+ cfg.gsub! /^(tacacs-server .*key(?: \d+)?) \S+/, '\\1 <secret hidden>'
18
19
  cfg
19
20
  end
20
21