oxidized 0.29.1 → 0.30.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 (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