oxidized 0.33.0 → 0.34.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 (104) hide show
  1. checksums.yaml +4 -4
  2. data/.github/ISSUE_TEMPLATE/bug_report.md +4 -1
  3. data/.github/ISSUE_TEMPLATE/support-request.md +4 -1
  4. data/.github/workflows/ruby.yml +4 -2
  5. data/.gitignore +1 -0
  6. data/.rubocop.yml +29 -6
  7. data/.rubocop_todo.yml +2 -35
  8. data/CHANGELOG.md +49 -0
  9. data/CONTRIBUTING.md +10 -3
  10. data/Dockerfile +4 -4
  11. data/README.md +52 -55
  12. data/Rakefile +2 -3
  13. data/docs/Configuration.md +97 -0
  14. data/docs/DeviceSimulation.md +19 -7
  15. data/docs/Docker.md +9 -4
  16. data/docs/Issues.md +11 -2
  17. data/docs/ModelUnitTests.md +35 -25
  18. data/docs/Outputs.md +83 -2
  19. data/docs/Release.md +30 -22
  20. data/docs/Supported-OS-Types.md +4 -0
  21. data/docs/Troubleshooting.md +4 -18
  22. data/extra/device2yaml.rb +24 -9
  23. data/extra/rest_client.rb +2 -1
  24. data/extra/syslog.rb +8 -3
  25. data/lib/oxidized/cli.rb +7 -3
  26. data/lib/oxidized/config/vars.rb +7 -3
  27. data/lib/oxidized/config.rb +0 -1
  28. data/lib/oxidized/core.rb +5 -4
  29. data/lib/oxidized/hook/ciscosparkdiff.rb +11 -9
  30. data/lib/oxidized/hook/exec.rb +5 -4
  31. data/lib/oxidized/hook/githubrepo.rb +23 -17
  32. data/lib/oxidized/hook/noophook.rb +2 -2
  33. data/lib/oxidized/hook/slackdiff.rb +9 -8
  34. data/lib/oxidized/hook/xmppdiff.rb +9 -9
  35. data/lib/oxidized/hook.rb +10 -8
  36. data/lib/oxidized/input/cli.rb +8 -3
  37. data/lib/oxidized/input/exec.rb +1 -1
  38. data/lib/oxidized/input/ftp.rb +2 -2
  39. data/lib/oxidized/input/http.rb +5 -5
  40. data/lib/oxidized/input/input.rb +1 -0
  41. data/lib/oxidized/input/scp.rb +2 -2
  42. data/lib/oxidized/input/ssh.rb +21 -14
  43. data/lib/oxidized/input/telnet.rb +3 -3
  44. data/lib/oxidized/input/tftp.rb +1 -1
  45. data/lib/oxidized/job.rb +7 -4
  46. data/lib/oxidized/logger.rb +51 -0
  47. data/lib/oxidized/model/acos.rb +1 -0
  48. data/lib/oxidized/model/aos7.rb +6 -0
  49. data/lib/oxidized/model/aoscx.rb +2 -0
  50. data/lib/oxidized/model/aosw.rb +22 -17
  51. data/lib/oxidized/model/aricentiss.rb +2 -2
  52. data/lib/oxidized/model/asa.rb +3 -3
  53. data/lib/oxidized/model/awplus.rb +13 -10
  54. data/lib/oxidized/model/edgecos.rb +2 -1
  55. data/lib/oxidized/model/edgeos.rb +7 -6
  56. data/lib/oxidized/model/edgeswitch.rb +3 -1
  57. data/lib/oxidized/model/efos.rb +41 -0
  58. data/lib/oxidized/model/eltex.rb +1 -1
  59. data/lib/oxidized/model/fabricos.rb +1 -1
  60. data/lib/oxidized/model/fastiron.rb +3 -1
  61. data/lib/oxidized/model/firelinuxos.rb +12 -3
  62. data/lib/oxidized/model/fortios.rb +2 -1
  63. data/lib/oxidized/model/gaiaos.rb +4 -4
  64. data/lib/oxidized/model/ios.rb +15 -5
  65. data/lib/oxidized/model/ironware.rb +1 -1
  66. data/lib/oxidized/model/junos.rb +4 -0
  67. data/lib/oxidized/model/linksyssrw.rb +3 -3
  68. data/lib/oxidized/model/mlnxos.rb +14 -7
  69. data/lib/oxidized/model/model.rb +4 -3
  70. data/lib/oxidized/model/netgear.rb +2 -0
  71. data/lib/oxidized/model/nsxdfw.rb +2 -1
  72. data/lib/oxidized/model/nsxfirewall.rb +2 -1
  73. data/lib/oxidized/model/nxos.rb +2 -2
  74. data/lib/oxidized/model/openwrt.rb +6 -6
  75. data/lib/oxidized/model/procurve.rb +3 -1
  76. data/lib/oxidized/model/qtech.rb +3 -1
  77. data/lib/oxidized/model/quantaos.rb +8 -6
  78. data/lib/oxidized/model/routeros.rb +3 -2
  79. data/lib/oxidized/model/saos10.rb +38 -0
  80. data/lib/oxidized/model/sixwind.rb +28 -0
  81. data/lib/oxidized/model/sonicos.rb +1 -1
  82. data/lib/oxidized/model/supermicro.rb +1 -1
  83. data/lib/oxidized/model/timos.rb +1 -1
  84. data/lib/oxidized/model/tmos.rb +1 -0
  85. data/lib/oxidized/model/tnsr.rb +53 -0
  86. data/lib/oxidized/model/trango.rb +3 -1
  87. data/lib/oxidized/model/unifiap.rb +7 -5
  88. data/lib/oxidized/model/vrp.rb +3 -1
  89. data/lib/oxidized/model/xos.rb +3 -1
  90. data/lib/oxidized/model/zhoneolt.rb +3 -1
  91. data/lib/oxidized/model/zynos.rb +3 -3
  92. data/lib/oxidized/node.rb +44 -27
  93. data/lib/oxidized/nodes.rb +8 -4
  94. data/lib/oxidized/output/file.rb +28 -0
  95. data/lib/oxidized/output/git.rb +66 -9
  96. data/lib/oxidized/output/gitcrypt.rb +15 -13
  97. data/lib/oxidized/output/http.rb +5 -4
  98. data/lib/oxidized/output/output.rb +14 -0
  99. data/lib/oxidized/source/http.rb +4 -2
  100. data/lib/oxidized/version.rb +2 -2
  101. data/lib/oxidized/worker.rb +11 -8
  102. data/lib/oxidized.rb +3 -24
  103. data/oxidized.gemspec +8 -5
  104. metadata +54 -21
@@ -37,7 +37,7 @@ class IronWare < Oxidized::Model
37
37
  cfg.gsub! /Fan \d* - STATUS: OK \D*\d*./, '' # Fix for ADX Fan speed reporting
38
38
  cfg.gsub! /\d* deg C/, '' # Fix for ADX temperature reporting
39
39
  cfg.gsub! /([\[]*)1([\]]*)<->([\[]*)2([\]]*)(<->([\[]*)3([\]]*))*/, ''
40
- cfg.gsub! /\d{2}\.\d deg-C/, 'XX.X deg-C'
40
+ cfg.gsub! /\d+\.\d deg-C/, 'XX.X deg-C'
41
41
  if cfg.include? "TEMPERATURE"
42
42
  sc = StringScanner.new cfg
43
43
  out = ''
@@ -32,6 +32,10 @@ class JunOS < Oxidized::Model
32
32
  out << cmd('show chassis fabric reachability') { |cfg| comment cfg }
33
33
  when /^(ex22|ex3[34]|ex4|ex8|qfx)/
34
34
  out << cmd('show virtual-chassis') { |cfg| comment cfg }
35
+ when /^srx/
36
+ out << cmd('show chassis cluster status') do |cfg|
37
+ cfg.lines.count <= 1 && cfg.include?("error:") ? '' : comment(cfg)
38
+ end
35
39
  end
36
40
  out
37
41
  end
@@ -8,7 +8,7 @@ class LinksysSRW < Oxidized::Model
8
8
  # Graphical login screen
9
9
  # Just login to get to Main Menu
10
10
  expect /Login Screen/ do
11
- Oxidized.logger.send(:debug, "#{self.class.name}: Login Screen")
11
+ logger.debug "#{self.class.name}: Login Screen"
12
12
  # This is to ensure the whole thing have rendered before we send stuff
13
13
  sleep 0.2
14
14
  send 0x18.chr # CAN Cancel
@@ -21,14 +21,14 @@ class LinksysSRW < Oxidized::Model
21
21
 
22
22
  # Main menu, escape into Pre-cli-shell
23
23
  expect /Switch Main Menu/ do
24
- Oxidized.logger.send(:debug, "#{self.class.name}: Switch menu")
24
+ logger.debug "#{self.class.name}: Switch menu"
25
25
  send 0x1a.chr # SUB Substitite ^z
26
26
  ''
27
27
  end
28
28
 
29
29
  # Pre-cli-shell, start lcli which is ios-ish
30
30
  expect />/ do
31
- Oxidized.logger.send(:debug, "#{self.class.name}: >")
31
+ logger.debug "#{self.class.name}: >"
32
32
  send "lcli\r"
33
33
  ''
34
34
  end
@@ -1,21 +1,27 @@
1
1
  class MLNXOS < Oxidized::Model
2
2
  using Refinements
3
3
 
4
- prompt /([\w.@()-\[:\s\]]+[#>]\s)$/
4
+ prompt /^\r?(\e.+\e>\r)?\S* \[\S+: (master|standby)\] [#>] $/
5
5
  comment '## '
6
6
 
7
7
  # Pager Handling
8
- expect /.+lines\s\d+-\d+([\s]|\/\d+\s\(END\)\s).+$/ do |data, re|
8
+ # "Normal" pager: "lines 183-204 "
9
+ # Last pager: "lines 256-269/269 (END) "
10
+ expect /\e\[7mlines \d+-\d+( |\/\d+ \(END\) )/ do |data, re|
9
11
  send ' '
10
12
  data.sub re, ''
11
13
  end
12
14
 
15
+ # Remove ANSI escape codes
16
+ expect /\e\[[0-?]*[ -\/]*[@-~]\r?/ do |data, re|
17
+ data.sub re, ''
18
+ end
19
+
13
20
  cmd :all do |cfg|
14
- cfg.gsub! /\[\?1h=\r/, '' # Pager Handling
15
- cfg.gsub! /\[24;1H/, '' # Pager Handling
16
- cfg.gsub! /\r\[K/, '' # Pager Handling
17
- cfg.gsub! /\[K/, '' # Pager Handling
18
- cfg.gsub! /\s/, '' # Linebreak Handling
21
+ cfg.gsub! "\e[m", '' # Remove reset formating
22
+ cfg.gsub! "\e[K", '' # Remove erase in line
23
+ cfg.gsub! /.\x08/, '' # Remove Backspace char
24
+ cfg.gsub! "\r", '' # Remove Cariage Return
19
25
  cfg.gsub! /^CPU load averages:\s.+/, '' # Omit constantly changing CPU info
20
26
  cfg.gsub! /^System memory:\s.+/, '' # Omit constantly changing memory info
21
27
  cfg.gsub! /^Uptime:\s.+/, '' # Omit constantly changing uptime info
@@ -45,6 +51,7 @@ class MLNXOS < Oxidized::Model
45
51
 
46
52
  cfg :ssh do
47
53
  password /^Password:\s*/
54
+ post_login 'no cli session paging enable'
48
55
  pre_logout "\nexit"
49
56
  end
50
57
  end
@@ -3,6 +3,7 @@ require_relative 'outputs'
3
3
 
4
4
  module Oxidized
5
5
  class Model
6
+ include SemanticLogger::Loggable
6
7
  using Refinements
7
8
 
8
9
  include Oxidized::Config::Vars
@@ -56,7 +57,7 @@ module Oxidized
56
57
  else
57
58
  process_args_block(@cmd[:cmd], args, [cmd_arg, block])
58
59
  end
59
- Oxidized.logger.debug "lib/oxidized/model/model.rb Added #{cmd_arg} to the commands list"
60
+ logger.debug "Added #{cmd_arg} to the commands list"
60
61
  end
61
62
 
62
63
  def cmds
@@ -118,7 +119,7 @@ module Oxidized
118
119
  attr_accessor :input, :node
119
120
 
120
121
  def cmd(string, &block)
121
- Oxidized.logger.debug "lib/oxidized/model/model.rb Executing #{string}"
122
+ logger.debug "Executing #{string}"
122
123
  out = @input.cmd(string)
123
124
  return false unless out
124
125
 
@@ -165,7 +166,7 @@ module Oxidized
165
166
  end
166
167
 
167
168
  def get
168
- Oxidized.logger.debug 'lib/oxidized/model/model.rb Collecting commands\' outputs'
169
+ logger.debug 'Collecting commands\' outputs'
169
170
  outputs = Outputs.new
170
171
  procs = self.class.procs
171
172
  self.class.cmds[:cmd].each do |command, block|
@@ -59,5 +59,7 @@ class Netgear < Oxidized::Model
59
59
  cmd 'show running-config' do |cfg|
60
60
  cfg.gsub! /(System Up Time\s+).*/, '\\1 <removed>'
61
61
  cfg.gsub! /(Current SNTP Synchronized Time:).*/, '\\1 <removed>'
62
+ cfg.gsub! /(Current System Time:).*/, '\\1 <removed>'
63
+ cfg
62
64
  end
63
65
  end
@@ -8,7 +8,8 @@ class NSXDfw < Oxidized::Model
8
8
  domains.each do |domain|
9
9
  domain_config[domain['id']] = {}
10
10
  policies_data = cmd "/policy/api/v1/infra/domains/#{domain['id']}/security-policies/"
11
- policies = JSON.parse(policies_data.encode('UTF-8', { invalid: :replace, undef: :replace, replace: '?' }))["results"]
11
+ policies = JSON.parse(policies_data.encode('UTF-8',
12
+ { invalid: :replace, undef: :replace, replace: '?' }))["results"]
12
13
  policies_config = {}
13
14
  policies.each do |policy|
14
15
  rules_data = cmd "/policy/api/v1/infra/domains/#{domain['id']}/security-policies/#{policy['id']}/rules"
@@ -8,7 +8,8 @@ class NSXFirewall < Oxidized::Model
8
8
  edges.each do |edge|
9
9
  firewall_config = cmd "/api/4.0/edges/#{edge['id']}/firewall/config"
10
10
  json_config = {}
11
- json_config["#{edge['id']} #{edge['name']}"] = JSON.parse(firewall_config.encode('UTF-8', { invalid: :replace, undef: :replace, replace: '?' }))
11
+ json_config["#{edge['id']} #{edge['name']}"] =
12
+ JSON.parse(firewall_config.encode('UTF-8', { invalid: :replace, undef: :replace, replace: '?' }))
12
13
  data.push(json_config)
13
14
  end
14
15
  JSON.pretty_generate(data)
@@ -22,11 +22,11 @@ class NXOS < Oxidized::Model
22
22
 
23
23
  cmd 'show version' do |cfg|
24
24
  cfg = filter cfg
25
- cfg = cfg.each_line.take_while { |line| not line.match(/uptime/i) }
25
+ cfg = cfg.each_line.take_while { |line| not line.match(/uptime|bootflash:\s+\d+\skB|sysmgrcli_show_flash_size/i) }
26
26
  comment cfg.join
27
27
  end
28
28
 
29
- cmd 'show inventory' do |cfg|
29
+ cmd 'show inventory all' do |cfg|
30
30
  cfg = filter cfg
31
31
  comment cfg
32
32
  end
@@ -38,26 +38,26 @@ class OpenWrt < Oxidized::Model
38
38
  filename = sysupgradefile.split('/')[-1]
39
39
  cfg << comment("#### File: #{sysupgradefile} #####")
40
40
  uciexport = cmd("uci export #{filename}")
41
- Oxidized.logger.debug "Exporting uci config - #{filename}"
41
+ logger.debug "Exporting uci config - #{filename}"
42
42
  if vars(:remove_secret) && !(non_sensitive_files.include? filename)
43
- Oxidized.logger.debug "Scrubbing uci config - #{filename}"
43
+ logger.debug "Scrubbing uci config - #{filename}"
44
44
  uciexport.gsub!(/^(\s+option\s+(password|key)\s+')[^']+'/, '\\1<secret hidden>\'')
45
45
  end
46
46
  cfg << uciexport
47
47
  end
48
48
  elsif binary_files.include? sysupgradefile
49
- Oxidized.logger.debug "Exporting binary file - #{sysupgradefile}"
49
+ logger.debug "Exporting binary file - #{sysupgradefile}"
50
50
  cfg << comment("#### Binary file: #{sysupgradefile} #####")
51
51
  cfg << comment("Decode using 'echo -en <data> | gzip -dc > #{sysupgradefile}'")
52
52
  cfg << cmd("gzip -c #{sysupgradefile} | hexdump -ve '1/1 \"_x%.2x\"' | tr _ \\")
53
53
  elsif vars(:remove_secret) && sysupgradefile == '/etc/shadow'
54
- Oxidized.logger.debug 'Exporting and scrubbing /etc/shadow'
54
+ logger.debug 'Exporting and scrubbing /etc/shadow'
55
55
  cfg << comment("#### File: #{sysupgradefile} #####")
56
56
  shadow = cmd("cat #{sysupgradefile}")
57
57
  shadow.gsub!(/^([^:]+:)[^:]*(:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:)/, '\\1\\2')
58
58
  cfg << shadow
59
59
  else
60
- Oxidized.logger.debug "Exporting file - #{sysupgradefile}"
60
+ logger.debug "Exporting file - #{sysupgradefile}"
61
61
  cfg << comment("#### File: #{sysupgradefile} #####")
62
62
  cfg << cmd("cat #{sysupgradefile}")
63
63
  end
@@ -65,7 +65,7 @@ class OpenWrt < Oxidized::Model
65
65
  @mtdpartitions.scan(/(\w+):\s+\w+\s+\w+\s+"(.*)"/).each do |partition, name|
66
66
  next unless vars(:openwrt_backup_partitions) && partitions_to_backup.include?(name)
67
67
 
68
- Oxidized.logger.debug "Exporting partition - #{name}(#{partition})"
68
+ logger.debug "Exporting partition - #{name}(#{partition})"
69
69
  cfg << comment("#### Partition: #{name} /dev/#{partition} #####")
70
70
  cfg << comment("Decode using 'echo -en <data> | gzip -dc > #{name}'")
71
71
  cfg << cmd("dd if=/dev/#{partition} 2>/dev/null | gzip -c | hexdump -ve '1/1 \"%.2x\"'")
@@ -75,7 +75,9 @@ class Procurve < Oxidized::Model
75
75
 
76
76
  # not supported on all models
77
77
  cmd 'show system information' do |cfg|
78
- 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
79
81
  cfg = cfg.join
80
82
  comment cfg
81
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
@@ -11,7 +11,7 @@ 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
17
  cmd '/system resource print' do |cfg|
@@ -30,7 +30,7 @@ class RouterOS < Oxidized::Model
30
30
  end
31
31
 
32
32
  post do
33
- Oxidized.logger.debug "lib/oxidized/model/routeros.rb: running /export for routeros version #{@ros_version}"
33
+ logger.debug "Running /export for routeros version #{@ros_version}"
34
34
  run_cmd = if vars(:remove_secret)
35
35
  '/export hide-sensitive'
36
36
  elsif (not @ros_version.nil?) && (@ros_version >= 7)
@@ -45,6 +45,7 @@ class RouterOS < Oxidized::Model
45
45
  cfg.gsub! "# poe-out status: short_circuit\r\n", '' # Remove intermittent POE short_circuit comment
46
46
  cfg.gsub! "# Firmware upgraded successfully, please reboot for changes to take effect!\r\n", '' # Remove transient firmware upgrade comment
47
47
  cfg.gsub! /# \S+ not ready\r\n/, '' # Remove intermittent $interface not ready comment
48
+ 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)
48
49
  cfg = cfg.split("\n")
49
50
  cfg.reject! { |line| line[/^#\s\w{3}\/\d{2}\/\d{4}.*$/] } # Remove date time and 'by RouterOS' comment (v6)
50
51
  cfg.reject! { |line| line[/^#\s\d{4}-\d{2}-\d{2}.*$/] } # Remove date time and 'by RouterOS' comment (v7)
@@ -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
@@ -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
@@ -56,7 +56,7 @@ class SonicOS < Oxidized::Model
56
56
  next if line =~ /date \d{4}:\d{2}:\d{2}/
57
57
  next if line =~ /time \d{2}:\d{2}:\d{2}/
58
58
  next if line =~ /system-time "\d{2}\/\d{2}\/\d{4} \d{2}:\d{2}:\d{2}.\d+"/
59
- next if line =~ /system-uptime "((\s+up\s+\d+\s+)|(\d+\s\w+(,\s)?)*)"/
59
+ next if line =~ /system-uptime "(?:\s+up\s+\d+\s+|\d+ \w+(?:, \d+ \w+)*)"/
60
60
  next if line =~ /checksum \d+/
61
61
 
62
62
  line = line[1..-1] if line[0] == "\r"
@@ -5,6 +5,6 @@ require_relative 'edgecos'
5
5
 
6
6
  Supermicro = EdgeCOS
7
7
 
8
- Oxidized.logger.warn "Using deprecated model supermicro, use edgecos instead."
8
+ logger.warn "Using deprecated model supermicro, use edgecos instead."
9
9
 
10
10
  # Deprecated
@@ -5,6 +5,6 @@ require_relative 'sros'
5
5
 
6
6
  TiMOS = SROS
7
7
 
8
- Oxidized.logger.warn "Using deprecated model timos, use sros instead."
8
+ logger.warn "Using deprecated model timos, use sros instead."
9
9
 
10
10
  # Deprecated
@@ -32,6 +32,7 @@ class TMOS < Oxidized::Model
32
32
  cfg.gsub!(/^\s+bandwidth-bps (\d+)/, '')
33
33
  cfg.gsub!(/^\s+bandwidth-cps (\d+)/, '')
34
34
  cfg.gsub!(/^\s+bandwidth-pps (\d+)\n/, '')
35
+ cfg.gsub!(/^\s*\S*encrypted \S+\n/, '')
35
36
  cfg
36
37
  end
37
38
 
@@ -0,0 +1,53 @@
1
+ class TNSR < Oxidized::Model
2
+ using Refinements
3
+
4
+ # Netgate TNSR #
5
+
6
+ # prompt examples
7
+ # https://docs.netgate.com/tnsr/en/latest/basics/working-cli.html#command-prompt
8
+ # "<hostname> tnsr<(mode)># " <-- with trailing whitespace
9
+ # tnsr-dev-25-02 tnsr#
10
+ # tnsr-dev-25-02 tnsr(config)# <-- after "configure terminal", but this is not important for oxidized
11
+ # prompt from debug log
12
+ # received "Welcome to Netgate TNSR Version: 25.02-2\r\n\r\n\t* Documentation: https://docs.netgate.com/tnsr/en/latest/\r\n\t* Support: https://www.netgate.com/support\r\n\r\n _ __________\r\n _| |_ _ __ | ___ _ __ |\r\n|_ __| '_ \\ |/ __| '__||\r\n | |_| | | ||\\__ \\ | |\r\n \\__|_| |_|||___/_| |\r\n |__________|\r\n\r\n\r\n"
13
+ # received "\r\nVersion: 25.02-2\r\n\r\nFor information see 'show documentation'\r\n\r\n"
14
+ # received "\rbgp01 tnsr# "
15
+ # when the --More-- pager is the last line of paged output, the prompt contains \x08\x20\x08 orphans on the begin
16
+ # you can look for context into spec simulation:
17
+ # spec/model/data/tnsr:TNSR_24.10-3_short-config:simulation.yaml
18
+ # spec/model/data/tnsr:TNSR_25.02-2_long-config-and-pager-at-last-line:simulation.yaml
19
+ prompt /^((\x08{8}\x20{8}\x08{8})?\r?[\w-]+\stnsr#\s?)$/
20
+
21
+ comment '! '
22
+
23
+ expect /^--More--/ do |data, re|
24
+ send ' '
25
+ data.sub re, ''
26
+ end
27
+
28
+ cmd :all do |cfg|
29
+ # remove orphans \r
30
+ cfg.gsub! /^\r+(.+)/, '\1'
31
+ # handle pager orphans ^H^H^H^H^H^H^H^H ^H^H^H^H^H^H^H^H
32
+ cfg.gsub! /\x08{8}\x20{8}\x08{8}/, ''
33
+ cfg.cut_both
34
+ end
35
+
36
+ cmd :secret do |cfg|
37
+ cfg.gsub! /(password( \d+)?) (\S+).*/, '\\1 <secret hidden>'
38
+ cfg.gsub! /^(snmp community community-name )\S+ (.*)?/, '\\1 <configuration removed> \\2'
39
+ cfg
40
+ end
41
+
42
+ cmd 'show version all' do |cfg|
43
+ comment cfg
44
+ end
45
+
46
+ cmd 'show configuration running cli' do |cfg|
47
+ cfg
48
+ end
49
+
50
+ cfg :telnet, :ssh do
51
+ pre_logout 'exit'
52
+ end
53
+ end
@@ -18,7 +18,9 @@ class Trango < Oxidized::Model
18
18
  out << ("freq " + Regexp.last_match[1] + ' ' + Regexp.last_match[2]) if line =~ /\[Active Channel\] (\d+) (v|h)/
19
19
  out << ("peerid " + Regexp.last_match[1]) if line =~ /\[Peer ID\] ([A-F0-9]+)/
20
20
  out << ("utype " + Regexp.last_match[1]) if line =~ /\[Unit Type\] (\S+)/
21
- comments << ('# ' + Regexp.last_match[1] + ': ' + Regexp.last_match[2]) if line =~ /\[(Hardware Version|Firmware Version|Model|S\/N)\] (\S+)/
21
+ if line =~ /\[(Hardware Version|Firmware Version|Model|S\/N)\] (\S+)/
22
+ comments << ('# ' + Regexp.last_match[1] + ': ' + Regexp.last_match[2])
23
+ end
22
24
  out << ("remarks " + Regexp.last_match[1]) if line =~ /\[Remarks\] (\S+)/
23
25
  out << ("rssiled " + Regexp.last_match[1]) if line =~ /\[RSSI LED\] (on|off)/
24
26
  speed = Regexp.last_match[1] if line =~ /\[Speed\] (\d+) Mbps/
@@ -31,7 +31,9 @@ class Unifiap < Oxidized::Model
31
31
 
32
32
  # Next see if we can get our IP and host name out of /etc/hosts
33
33
  cmd 'cat /etc/hosts' do |cfg|
34
- cfg = cfg.split("\n").reject { |line| line[/^\s*(127|0000:0000:0000:0000:0000:0000:0000:0001|0:0:0:0:0:0:0:1|::1)/] }
34
+ cfg = cfg.split("\n").reject do |line|
35
+ line[/^\s*(127|0000:0000:0000:0000:0000:0000:0000:0001|0:0:0:0:0:0:0:1|::1)/]
36
+ end
35
37
  cfg.select do |line|
36
38
  if (match = line.match(/(\d+\.\d+\.\d+\.\d+)\s+(\S+)/))
37
39
  @ip, @hostname = match.captures
@@ -41,7 +43,7 @@ class Unifiap < Oxidized::Model
41
43
  end
42
44
 
43
45
  # We check here to see if we succeeded with /etc/hosts. If not, then we try again with ifconfig, and /tmp/system.cfg
44
- cmd do
46
+ cmd 'echo' do
45
47
  unless @ip
46
48
  cmd 'ifconfig br0' do |cfg|
47
49
  @ip = Regexp.last_match(1) if cfg =~ /inet addr:\s*(\d+\.\d+\.\d+\.\d+)/i
@@ -74,8 +76,8 @@ class Unifiap < Oxidized::Model
74
76
  if cfg =~ /No such file/i
75
77
  if @ntpserver
76
78
  # Ok, now lets try getting the skew from the output of ntpclient
77
- cmd "ntpclient -d -n -c 2 -i0 -h #{@ntpserver}" do |cfg|
78
- @skew = ntpskew(cfg)
79
+ cmd "ntpclient -d -n -c 2 -i0 -h #{@ntpserver}" do |ntp_out|
80
+ @skew = ntpskew(ntp_out)
79
81
  end
80
82
  @sync = !@skew.nil? && @skew.to_f.abs < 1e6 ? "Synchronized" : "FAIL"
81
83
  end
@@ -87,7 +89,7 @@ class Unifiap < Oxidized::Model
87
89
  end
88
90
 
89
91
  # Now we can display it all as a banner
90
- cmd do
92
+ cmd 'echo' do
91
93
  out = []
92
94
  out << "*************************"
93
95
  out << "Model: #{@model}"
@@ -27,7 +27,9 @@ class VRP < Oxidized::Model
27
27
  end
28
28
 
29
29
  cmd 'display version' do |cfg|
30
- cfg = cfg.each_line.reject { |l| l.match /uptime|^\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d(\.\d\d\d)? ?(\+\d\d:\d\d)?$/ }.join
30
+ cfg = cfg.each_line.reject do |l|
31
+ l.match /uptime|^\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d(\.\d\d\d)? ?(\+\d\d:\d\d)?$/
32
+ end.join
31
33
  comment cfg
32
34
  end
33
35
 
@@ -33,7 +33,9 @@ class XOS < Oxidized::Model
33
33
 
34
34
  cmd 'show switch' do |cfg|
35
35
  cfg.gsub! /Next periodic save on.*/, ''
36
- comment cfg.each_line.reject { |line| line.match(/Time:/) || line.match(/boot/i) || line.match(/Next periodic/) }.join
36
+ comment cfg.each_line.reject { |line|
37
+ line.match(/Time:/) || line.match(/boot/i) || line.match(/Next periodic/)
38
+ }.join
37
39
  end
38
40
 
39
41
  cmd 'show configuration' do |cfg|
@@ -36,7 +36,9 @@ class ZhoneOLT < Oxidized::Model
36
36
  end
37
37
 
38
38
  cmd 'ethrpshow' do |cfg|
39
- cfg = cfg.each_line.select { |line| line.match /Vendor (Name|OUI|Part|Revision)|Serial Number|Manufacturing Date/ }.join
39
+ cfg = cfg.each_line.select do |line|
40
+ line.match /Vendor (Name|OUI|Part|Revision)|Serial Number|Manufacturing Date/
41
+ end.join
40
42
  comment cfg
41
43
  end
42
44
 
@@ -1,9 +1,9 @@
1
1
  class ZyNOS < Oxidized::Model
2
2
  using Refinements
3
3
 
4
- prompt /^([\w.@()-<]+[#>]\s?)$/
4
+ prompt /^([\w.@()\-<]+[#>]\s?)$/
5
5
  # if there is something you can not identify after prompt, uncomment next line and comment previous line
6
- # prompt /^([\w.@()-<]+[#>]\s?).*$/
6
+ # prompt /^([\w.@()\-<]+[#>]\s?).*$/
7
7
 
8
8
  comment '! '
9
9
 
@@ -21,7 +21,7 @@ class ZyNOS < Oxidized::Model
21
21
  end
22
22
 
23
23
  # ignore copyright motd
24
- expect /^(Copyright .*)\n^([\w.@()-<]+[#>]\s?)$/ do
24
+ expect /^(Copyright .*)\n^([\w.@()\-<]+[#>]\s?)$/ do
25
25
  send '\n'
26
26
  ""
27
27
  end