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.
- checksums.yaml +4 -4
- data/.github/ISSUE_TEMPLATE/bug_report.md +4 -1
- data/.github/ISSUE_TEMPLATE/support-request.md +4 -1
- data/.github/workflows/ruby.yml +4 -2
- data/.gitignore +1 -0
- data/.rubocop.yml +29 -6
- data/.rubocop_todo.yml +2 -35
- data/CHANGELOG.md +49 -0
- data/CONTRIBUTING.md +10 -3
- data/Dockerfile +4 -4
- data/README.md +52 -55
- data/Rakefile +2 -3
- data/docs/Configuration.md +97 -0
- data/docs/DeviceSimulation.md +19 -7
- data/docs/Docker.md +9 -4
- data/docs/Issues.md +11 -2
- data/docs/ModelUnitTests.md +35 -25
- data/docs/Outputs.md +83 -2
- data/docs/Release.md +30 -22
- data/docs/Supported-OS-Types.md +4 -0
- data/docs/Troubleshooting.md +4 -18
- data/extra/device2yaml.rb +24 -9
- data/extra/rest_client.rb +2 -1
- data/extra/syslog.rb +8 -3
- data/lib/oxidized/cli.rb +7 -3
- data/lib/oxidized/config/vars.rb +7 -3
- data/lib/oxidized/config.rb +0 -1
- data/lib/oxidized/core.rb +5 -4
- data/lib/oxidized/hook/ciscosparkdiff.rb +11 -9
- data/lib/oxidized/hook/exec.rb +5 -4
- data/lib/oxidized/hook/githubrepo.rb +23 -17
- data/lib/oxidized/hook/noophook.rb +2 -2
- data/lib/oxidized/hook/slackdiff.rb +9 -8
- data/lib/oxidized/hook/xmppdiff.rb +9 -9
- data/lib/oxidized/hook.rb +10 -8
- data/lib/oxidized/input/cli.rb +8 -3
- data/lib/oxidized/input/exec.rb +1 -1
- data/lib/oxidized/input/ftp.rb +2 -2
- data/lib/oxidized/input/http.rb +5 -5
- data/lib/oxidized/input/input.rb +1 -0
- data/lib/oxidized/input/scp.rb +2 -2
- data/lib/oxidized/input/ssh.rb +21 -14
- data/lib/oxidized/input/telnet.rb +3 -3
- data/lib/oxidized/input/tftp.rb +1 -1
- data/lib/oxidized/job.rb +7 -4
- data/lib/oxidized/logger.rb +51 -0
- data/lib/oxidized/model/acos.rb +1 -0
- data/lib/oxidized/model/aos7.rb +6 -0
- data/lib/oxidized/model/aoscx.rb +2 -0
- data/lib/oxidized/model/aosw.rb +22 -17
- data/lib/oxidized/model/aricentiss.rb +2 -2
- data/lib/oxidized/model/asa.rb +3 -3
- data/lib/oxidized/model/awplus.rb +13 -10
- data/lib/oxidized/model/edgecos.rb +2 -1
- data/lib/oxidized/model/edgeos.rb +7 -6
- data/lib/oxidized/model/edgeswitch.rb +3 -1
- data/lib/oxidized/model/efos.rb +41 -0
- data/lib/oxidized/model/eltex.rb +1 -1
- data/lib/oxidized/model/fabricos.rb +1 -1
- data/lib/oxidized/model/fastiron.rb +3 -1
- data/lib/oxidized/model/firelinuxos.rb +12 -3
- data/lib/oxidized/model/fortios.rb +2 -1
- data/lib/oxidized/model/gaiaos.rb +4 -4
- data/lib/oxidized/model/ios.rb +15 -5
- data/lib/oxidized/model/ironware.rb +1 -1
- data/lib/oxidized/model/junos.rb +4 -0
- data/lib/oxidized/model/linksyssrw.rb +3 -3
- data/lib/oxidized/model/mlnxos.rb +14 -7
- data/lib/oxidized/model/model.rb +4 -3
- data/lib/oxidized/model/netgear.rb +2 -0
- data/lib/oxidized/model/nsxdfw.rb +2 -1
- data/lib/oxidized/model/nsxfirewall.rb +2 -1
- data/lib/oxidized/model/nxos.rb +2 -2
- data/lib/oxidized/model/openwrt.rb +6 -6
- data/lib/oxidized/model/procurve.rb +3 -1
- data/lib/oxidized/model/qtech.rb +3 -1
- data/lib/oxidized/model/quantaos.rb +8 -6
- data/lib/oxidized/model/routeros.rb +3 -2
- data/lib/oxidized/model/saos10.rb +38 -0
- data/lib/oxidized/model/sixwind.rb +28 -0
- data/lib/oxidized/model/sonicos.rb +1 -1
- data/lib/oxidized/model/supermicro.rb +1 -1
- data/lib/oxidized/model/timos.rb +1 -1
- data/lib/oxidized/model/tmos.rb +1 -0
- data/lib/oxidized/model/tnsr.rb +53 -0
- data/lib/oxidized/model/trango.rb +3 -1
- data/lib/oxidized/model/unifiap.rb +7 -5
- data/lib/oxidized/model/vrp.rb +3 -1
- data/lib/oxidized/model/xos.rb +3 -1
- data/lib/oxidized/model/zhoneolt.rb +3 -1
- data/lib/oxidized/model/zynos.rb +3 -3
- data/lib/oxidized/node.rb +44 -27
- data/lib/oxidized/nodes.rb +8 -4
- data/lib/oxidized/output/file.rb +28 -0
- data/lib/oxidized/output/git.rb +66 -9
- data/lib/oxidized/output/gitcrypt.rb +15 -13
- data/lib/oxidized/output/http.rb +5 -4
- data/lib/oxidized/output/output.rb +14 -0
- data/lib/oxidized/source/http.rb +4 -2
- data/lib/oxidized/version.rb +2 -2
- data/lib/oxidized/worker.rb +11 -8
- data/lib/oxidized.rb +3 -24
- data/oxidized.gemspec +8 -5
- 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
|
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 = ''
|
data/lib/oxidized/model/junos.rb
CHANGED
@@ -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
|
-
|
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
|
-
|
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
|
-
|
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
|
4
|
+
prompt /^\r?(\e.+\e>\r)?\S* \[\S+: (master|standby)\] [#>] $/
|
5
5
|
comment '## '
|
6
6
|
|
7
7
|
# Pager Handling
|
8
|
-
|
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!
|
15
|
-
cfg.gsub!
|
16
|
-
cfg.gsub!
|
17
|
-
cfg.gsub!
|
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
|
data/lib/oxidized/model/model.rb
CHANGED
@@ -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
|
-
|
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
|
-
|
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
|
-
|
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',
|
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']}"] =
|
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)
|
data/lib/oxidized/model/nxos.rb
CHANGED
@@ -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
|
-
|
41
|
+
logger.debug "Exporting uci config - #{filename}"
|
42
42
|
if vars(:remove_secret) && !(non_sensitive_files.include? filename)
|
43
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
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
|
data/lib/oxidized/model/qtech.rb
CHANGED
@@ -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|
|
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 /^\(
|
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
|
-
|
9
|
-
|
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
|
-
|
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 "(
|
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"
|
data/lib/oxidized/model/timos.rb
CHANGED
data/lib/oxidized/model/tmos.rb
CHANGED
@@ -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
|
-
|
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
|
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 |
|
78
|
-
@skew = ntpskew(
|
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}"
|
data/lib/oxidized/model/vrp.rb
CHANGED
@@ -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
|
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
|
|
data/lib/oxidized/model/xos.rb
CHANGED
@@ -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|
|
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
|
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
|
|
data/lib/oxidized/model/zynos.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
class ZyNOS < Oxidized::Model
|
2
2
|
using Refinements
|
3
3
|
|
4
|
-
prompt /^([\w.@()
|
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.@()
|
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.@()
|
24
|
+
expect /^(Copyright .*)\n^([\w.@()\-<]+[#>]\s?)$/ do
|
25
25
|
send '\n'
|
26
26
|
""
|
27
27
|
end
|