oxidized 0.28.0 → 0.29.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/publishdocker.yml +8 -1
- data/.github/workflows/ruby.yml +42 -0
- data/.rubocop.yml +30 -10
- data/.rubocop_todo.yml +95 -41
- data/CHANGELOG.md +139 -2
- data/Dockerfile +13 -9
- data/README.md +66 -32
- data/Rakefile +2 -0
- data/docs/Configuration.md +49 -7
- data/docs/Creating-Models.md +10 -4
- data/docs/Hooks.md +35 -6
- data/docs/Model-Notes/ADVA.md +12 -0
- data/docs/Model-Notes/Cumulus.md +7 -1
- data/docs/Model-Notes/IOS.md +36 -0
- data/docs/Model-Notes/JunOS.md +3 -3
- data/docs/Model-Notes/LenovoNOS.md +29 -0
- data/docs/Model-Notes/LinksysSRW.md +15 -0
- data/docs/Model-Notes/Nokia.md +3 -0
- data/docs/Model-Notes/OS10.md +33 -0
- data/docs/Model-Notes/PanOS_API.md +28 -0
- data/docs/Model-Notes/README.md +2 -0
- data/docs/Sources.md +18 -0
- data/docs/Supported-OS-Types.md +51 -6
- data/docs/Troubleshooting.md +1 -1
- data/extra/gitdiff-msteams.sh +91 -0
- data/extra/nagios_check_failing_nodes.rb +6 -9
- data/extra/oxidized-report-git-commits +71 -14
- data/extra/oxidized.init +2 -5
- data/extra/oxidized.logrotate +1 -0
- data/extra/oxidized.runit +4 -1
- data/extra/oxidized.service +5 -8
- data/extra/rest_client.rb +1 -1
- data/extra/syslog.rb +2 -2
- data/lib/oxidized/cli.rb +1 -1
- data/lib/oxidized/config/vars.rb +5 -2
- data/lib/oxidized/config.rb +6 -3
- data/lib/oxidized/core.rb +1 -1
- data/lib/oxidized/hook/exec.rb +6 -6
- data/lib/oxidized/hook/githubrepo.rb +42 -11
- data/lib/oxidized/hook/slackdiff.rb +2 -2
- data/lib/oxidized/hook/xmppdiff.rb +45 -25
- data/lib/oxidized/hook.rb +4 -8
- data/lib/oxidized/input/exec.rb +1 -1
- data/lib/oxidized/input/input.rb +1 -0
- data/lib/oxidized/input/ssh.rb +23 -20
- data/lib/oxidized/input/telnet.rb +52 -44
- data/lib/oxidized/job.rb +1 -0
- data/lib/oxidized/jobs.rb +11 -6
- data/lib/oxidized/manager.rb +1 -0
- data/lib/oxidized/model/acmepacket.rb +38 -0
- data/lib/oxidized/model/adtran.rb +5 -3
- data/lib/oxidized/model/adva.rb +66 -0
- data/lib/oxidized/model/airfiber.rb +1 -1
- data/lib/oxidized/model/aoscx.rb +96 -0
- data/lib/oxidized/model/aosw.rb +1 -1
- data/lib/oxidized/model/asa.rb +2 -0
- data/lib/oxidized/model/awplus.rb +1 -1
- data/lib/oxidized/model/bdcom.rb +49 -0
- data/lib/oxidized/model/cambiumepmp.rb +17 -0
- data/lib/oxidized/model/casa.rb +4 -1
- data/lib/oxidized/model/ciscoce.rb +12 -0
- data/lib/oxidized/model/ciscosmb.rb +2 -0
- data/lib/oxidized/model/comware.rb +16 -1
- data/lib/oxidized/model/cumulus.rb +58 -44
- data/lib/oxidized/model/dellx.rb +1 -3
- data/lib/oxidized/model/dlink.rb +2 -1
- data/lib/oxidized/model/edgecos.rb +22 -2
- data/lib/oxidized/model/edgeswitch.rb +4 -4
- data/lib/oxidized/model/eltex.rb +48 -0
- data/lib/oxidized/model/enterasys.rb +18 -3
- data/lib/oxidized/model/enterasys800.rb +29 -0
- data/lib/oxidized/model/eos.rb +2 -1
- data/lib/oxidized/model/fabricos.rb +1 -1
- data/lib/oxidized/model/fastiron.rb +3 -2
- data/lib/oxidized/model/fortios.rb +24 -11
- data/lib/oxidized/model/fortiwlc.rb +24 -0
- data/lib/oxidized/model/gaiaos.rb +40 -3
- data/lib/oxidized/model/h3c.rb +40 -0
- data/lib/oxidized/model/hatteras.rb +2 -2
- data/lib/oxidized/model/hios.rb +38 -0
- data/lib/oxidized/model/hpebladesystem.rb +1 -1
- data/lib/oxidized/model/ios.rb +13 -10
- data/lib/oxidized/model/iosxe.rb +1 -1
- data/lib/oxidized/model/ironware.rb +8 -4
- data/lib/oxidized/model/junos.rb +5 -1
- data/lib/oxidized/model/lancom.rb +23 -0
- data/lib/oxidized/model/lenovonos.rb +82 -0
- data/lib/oxidized/model/linksyssrw.rb +71 -0
- data/lib/oxidized/model/mlnxos.rb +2 -0
- data/lib/oxidized/model/model.rb +29 -3
- data/lib/oxidized/model/necix.rb +30 -0
- data/lib/oxidized/model/netgear.rb +5 -2
- data/lib/oxidized/model/netscaler.rb +38 -1
- data/lib/oxidized/model/nodegrid.rb +23 -0
- data/lib/oxidized/model/nxos.rb +3 -2
- data/lib/oxidized/model/openbsd.rb +9 -0
- data/lib/oxidized/model/opengear.rb +1 -1
- data/lib/oxidized/model/opnsense.rb +12 -4
- data/lib/oxidized/model/panos_api.rb +71 -0
- data/lib/oxidized/model/pfsense.rb +12 -7
- data/lib/oxidized/model/powerconnect.rb +1 -3
- data/lib/oxidized/model/procurve.rb +2 -2
- data/lib/oxidized/model/purityos.rb +8 -1
- data/lib/oxidized/model/quantaos.rb +1 -5
- data/lib/oxidized/model/routeros.rb +15 -2
- data/lib/oxidized/model/slxos.rb +1 -0
- data/lib/oxidized/model/smartcs.rb +40 -0
- data/lib/oxidized/model/sonicos.rb +9 -1
- data/lib/oxidized/model/srosmd.rb +97 -0
- data/lib/oxidized/model/stoneos.rb +6 -2
- data/lib/oxidized/model/supermicro.rb +1 -1
- data/lib/oxidized/model/swos.rb +9 -0
- data/lib/oxidized/model/timos.rb +1 -1
- data/lib/oxidized/model/tmos.rb +2 -1
- data/lib/oxidized/model/tplink.rb +2 -0
- data/lib/oxidized/model/trango.rb +11 -11
- data/lib/oxidized/model/truenas.rb +20 -0
- data/lib/oxidized/model/vrp.rb +1 -1
- data/lib/oxidized/model/xos.rb +4 -3
- data/lib/oxidized/model/yamaha.rb +57 -0
- data/lib/oxidized/model/zteolt.rb +52 -0
- data/lib/oxidized/model/zy1308.rb +11 -0
- data/lib/oxidized/node/stats.rb +1 -0
- data/lib/oxidized/node.rb +16 -11
- data/lib/oxidized/nodes.rb +7 -6
- data/lib/oxidized/output/file.rb +2 -1
- data/lib/oxidized/output/git.rb +4 -3
- data/lib/oxidized/output/gitcrypt.rb +5 -8
- data/lib/oxidized/output/http.rb +2 -0
- data/lib/oxidized/source/csv.rb +1 -0
- data/lib/oxidized/source/http.rb +4 -0
- data/lib/oxidized/source/source.rb +7 -2
- data/lib/oxidized/source/sql.rb +15 -5
- data/lib/oxidized/string.rb +9 -3
- data/lib/oxidized/version.rb +2 -2
- data/lib/oxidized/worker.rb +5 -5
- data/oxidized.gemspec +22 -16
- metadata +116 -29
- data/.travis.yml +0 -10
@@ -46,7 +46,7 @@ class FastIron < Oxidized::Model
|
|
46
46
|
cmd 'show running-config'
|
47
47
|
|
48
48
|
cfg :telnet do
|
49
|
-
username
|
49
|
+
username /^(.* login|Username): /
|
50
50
|
password /^Password:/
|
51
51
|
end
|
52
52
|
|
@@ -56,11 +56,12 @@ class FastIron < Oxidized::Model
|
|
56
56
|
if vars(:enable) == true
|
57
57
|
cmd "enable"
|
58
58
|
elsif vars(:enable)
|
59
|
-
cmd "enable",
|
59
|
+
cmd "enable", /[pP]assword:/
|
60
60
|
cmd vars(:enable)
|
61
61
|
end
|
62
62
|
end
|
63
63
|
post_login 'skip-page-display'
|
64
64
|
pre_logout 'exit'
|
65
|
+
pre_logout 'exit'
|
65
66
|
end
|
66
67
|
end
|
@@ -21,7 +21,7 @@ class FortiOS < Oxidized::Model
|
|
21
21
|
cfg.gsub! /(set (?:passwd|password|key|group-password|auth-password-l1|auth-password-l2|rsso|history0|history1)) .+/, '\\1 <configuration removed>'
|
22
22
|
cfg.gsub! /(set md5-key [0-9]+) .+/, '\\1 <configuration removed>'
|
23
23
|
cfg.gsub! /(set private-key ).*?-+END (ENCRYPTED|RSA|OPENSSH) PRIVATE KEY-+\n?"$/m, '\\1<configuration removed>'
|
24
|
-
cfg.gsub! /(set ca ).*?-+END CERTIFICATE-+"$/m, '\\1<configuration removed>'
|
24
|
+
cfg.gsub! /(set ca )"-+BEGIN.*?-+END CERTIFICATE-+"$/m, '\\1<configuration removed>'
|
25
25
|
cfg.gsub! /(set csr ).*?-+END CERTIFICATE REQUEST-+"$/m, '\\1<configuration removed>'
|
26
26
|
cfg
|
27
27
|
end
|
@@ -29,13 +29,14 @@ class FortiOS < Oxidized::Model
|
|
29
29
|
cmd 'get system status' do |cfg|
|
30
30
|
@vdom_enabled = cfg.match /Virtual domain configuration: (enable|multiple)/
|
31
31
|
cfg.gsub! /(System time:).*/, '\\1 <stripped>'
|
32
|
-
cfg.gsub! /(Cluster uptime:).*/, '\\1 <stripped>'
|
33
|
-
cfg.gsub! /(
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
cfg
|
32
|
+
cfg.gsub! /(Cluster (?:uptime|state change time):).*/, '\\1 <stripped>'
|
33
|
+
cfg.gsub! /(Current Time\s+:\s+)(.*)/, '\1<stripped>'
|
34
|
+
cfg.gsub! /(Uptime:\s+)(.*)/, '\1<stripped>\3'
|
35
|
+
cfg.gsub! /(Last reboot:\s+)(.*)/, '\1<stripped>\3'
|
36
|
+
cfg.gsub! /(Disk Usage\s+:\s+)(.*)/, '\1<stripped>'
|
37
|
+
cfg.gsub! /(^\S+ (?:disk|DB):\s+)(.*)/, '\1<stripped>\3'
|
38
|
+
cfg.gsub! /(VM Registration:\s+)(.*)/, '\1<stripped>\3'
|
39
|
+
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>'
|
39
40
|
comment cfg
|
40
41
|
end
|
41
42
|
|
@@ -43,6 +44,11 @@ class FortiOS < Oxidized::Model
|
|
43
44
|
cfg = []
|
44
45
|
cfg << cmd('config global') if @vdom_enabled
|
45
46
|
|
47
|
+
cfg << cmd('get system ha status') do |cfg_ha|
|
48
|
+
cfg_ha = cfg_ha.each_line.select { |line| line.match /^(HA Health Status|Mode|Model|Master|Slave|Primary|Secondary|# COMMAND)(\s+)?:/ }.join
|
49
|
+
comment cfg_ha
|
50
|
+
end
|
51
|
+
|
46
52
|
cfg << cmd('get hardware status') do |cfg_hw|
|
47
53
|
comment cfg_hw
|
48
54
|
end
|
@@ -58,12 +64,19 @@ class FortiOS < Oxidized::Model
|
|
58
64
|
|
59
65
|
cfg << cmd('end') if @vdom_enabled
|
60
66
|
|
61
|
-
|
62
|
-
|
67
|
+
['show full-configuration | grep .', 'show full-configuration', 'show'].each do |fullcmd|
|
68
|
+
fullcfg = cmd(fullcmd)
|
69
|
+
next if fullcfg.lines[1..3].join =~ /(Parsing error at|command parse error)/ # Don't show for unsupported devices (e.g. FortiAnalyzer, FortiManager, FortiMail)
|
70
|
+
|
71
|
+
cfg << fullcfg
|
72
|
+
break
|
73
|
+
end
|
74
|
+
|
75
|
+
cfg.join
|
63
76
|
end
|
64
77
|
|
65
78
|
cfg :telnet do
|
66
|
-
username
|
79
|
+
username /^[lL]ogin:/
|
67
80
|
password /^Password:/
|
68
81
|
end
|
69
82
|
|
@@ -0,0 +1,24 @@
|
|
1
|
+
class FortiWLC < Oxidized::Model
|
2
|
+
comment '# '
|
3
|
+
|
4
|
+
cmd :all do |cfg, cmdstring|
|
5
|
+
new_cfg = comment "COMMAND: #{cmdstring}\n"
|
6
|
+
new_cfg << cfg.each_line.to_a[1..-2].map { |line| line.gsub(/(conf_file_ver=)(.*)/, '\1<stripped>\3') }.join
|
7
|
+
end
|
8
|
+
|
9
|
+
prompt /^([-\w.\/:?\[\]()]+[#>]\s?)$/
|
10
|
+
|
11
|
+
cmd 'show controller' do |cfg|
|
12
|
+
comment cfg
|
13
|
+
end
|
14
|
+
cmd 'show ap' do |cfg|
|
15
|
+
comment cfg
|
16
|
+
end
|
17
|
+
cmd 'show running-config' do |cfg|
|
18
|
+
comment cfg
|
19
|
+
end
|
20
|
+
|
21
|
+
cfg :telnet, :ssh do
|
22
|
+
pre_logout "exit\n"
|
23
|
+
end
|
24
|
+
end
|
@@ -21,6 +21,12 @@ class GaiaOS < Oxidized::Model
|
|
21
21
|
cfg
|
22
22
|
end
|
23
23
|
|
24
|
+
# check for vsx / multiple context
|
25
|
+
cmd 'show vsx' do |cfg|
|
26
|
+
@is_vsx = cfg.include? 'VSX Enabled'
|
27
|
+
Oxidized.logger.debug cfg
|
28
|
+
end
|
29
|
+
|
24
30
|
cmd 'show asset all' do |cfg|
|
25
31
|
comment cfg
|
26
32
|
end
|
@@ -29,9 +35,40 @@ class GaiaOS < Oxidized::Model
|
|
29
35
|
comment cfg
|
30
36
|
end
|
31
37
|
|
32
|
-
|
33
|
-
|
34
|
-
|
38
|
+
post do
|
39
|
+
if @is_vsx
|
40
|
+
multiple_context
|
41
|
+
else
|
42
|
+
single_context
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def single_context
|
47
|
+
Oxidized.logger.debug 'Single context tasks'
|
48
|
+
cmd 'show configuration' do |cfg|
|
49
|
+
cfg.gsub! /^# Exported by \S+ on .*/, '# '
|
50
|
+
cfg
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def multiple_context
|
55
|
+
Oxidized.logger.debug 'Multi context tasks'
|
56
|
+
cmd 'show virtual-system all' do |systems|
|
57
|
+
vs_items = systems.scan(/^(?<VSID>\d+)\s+(?<VSNAME>.*[^\s])/)
|
58
|
+
allcfg = ''
|
59
|
+
vs_items.each do |item|
|
60
|
+
allcfg += "\n\n\n#--------======== [ VS #{item[0]} - #{item[1]} ] ========--------\n\n"
|
61
|
+
allcfg += "set virtual-system #{item[0]}\n\n"
|
62
|
+
cmd "set virtual-system #{item[0]}" do |vs|
|
63
|
+
Oxidized.logger.debug vs
|
64
|
+
cmd 'show configuration' do |vscfg|
|
65
|
+
vscfg.gsub! /^# Exported by \S+ on .*/, '# '
|
66
|
+
allcfg += vscfg
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
allcfg
|
71
|
+
end
|
35
72
|
end
|
36
73
|
|
37
74
|
cfg :ssh do
|
@@ -0,0 +1,40 @@
|
|
1
|
+
class H3C < Oxidized::Model
|
2
|
+
# H3C
|
3
|
+
|
4
|
+
prompt /^.*(<[\w.-]+>)$/
|
5
|
+
comment '# '
|
6
|
+
|
7
|
+
cmd :secret do |cfg|
|
8
|
+
cfg.gsub! /(pin verify (?:auto|)).*/, '\\1 <PIN hidden>'
|
9
|
+
cfg.gsub! /(%\^%#.*%\^%#)/, '<secret hidden>'
|
10
|
+
cfg
|
11
|
+
end
|
12
|
+
|
13
|
+
cmd :all do |cfg|
|
14
|
+
cfg.cut_both
|
15
|
+
end
|
16
|
+
|
17
|
+
cfg :telnet do
|
18
|
+
username /^Username:$/
|
19
|
+
password /^Password:$/
|
20
|
+
end
|
21
|
+
|
22
|
+
cfg :telnet, :ssh do
|
23
|
+
post_login 'screen-length disable'
|
24
|
+
pre_logout 'quit'
|
25
|
+
end
|
26
|
+
|
27
|
+
cmd 'display version' do |cfg|
|
28
|
+
cfg = cfg.each_line.reject { |l| l.match /uptime/ }.join
|
29
|
+
cfg = cfg.each_line.reject { |l| l.match /Uptime is/ }.join
|
30
|
+
comment cfg
|
31
|
+
end
|
32
|
+
|
33
|
+
cmd 'display device' do |cfg|
|
34
|
+
comment cfg
|
35
|
+
end
|
36
|
+
|
37
|
+
cmd 'display current-configuration' do |cfg|
|
38
|
+
cfg
|
39
|
+
end
|
40
|
+
end
|
@@ -24,7 +24,7 @@ class Hatteras < Oxidized::Model
|
|
24
24
|
cfg = cfg.each_line.reject do |line|
|
25
25
|
line.match(/Switch uptime|Switch temperature|Last reset reason/) ||
|
26
26
|
line.match(/TermCpuUtil|^\s+\^$|ERROR: Bad command/)
|
27
|
-
end
|
27
|
+
end.join
|
28
28
|
comment cfg
|
29
29
|
end
|
30
30
|
|
@@ -32,7 +32,7 @@ class Hatteras < Oxidized::Model
|
|
32
32
|
cfg = cfg.each_line.reject do |line|
|
33
33
|
line.match(/Card uptime|Card temperature|Last reset reason/) ||
|
34
34
|
line.match(/TermCpuUtil|^\s+\^$|ERROR: Bad command/)
|
35
|
-
end
|
35
|
+
end.join
|
36
36
|
comment cfg
|
37
37
|
end
|
38
38
|
|
@@ -0,0 +1,38 @@
|
|
1
|
+
class Hios < Oxidized::Model
|
2
|
+
## Docker location: /var/lib/gems/2.7.0/gems/oxidized-0.28.0/lib/oxidized/model/hios.rb
|
3
|
+
prompt /^\[[\w\s\W]+\][>|#]+?$/
|
4
|
+
|
5
|
+
comment '## '
|
6
|
+
|
7
|
+
# Handle pager
|
8
|
+
expect /^--More--.*$/ do |data, re|
|
9
|
+
send 'n'
|
10
|
+
data.sub re, ''
|
11
|
+
end
|
12
|
+
|
13
|
+
cmd :all do |cfg|
|
14
|
+
cfg.cut_both
|
15
|
+
end
|
16
|
+
|
17
|
+
cmd 'show system info' do |cfg|
|
18
|
+
cfg.gsub! /^System uptime.*\n/, ""
|
19
|
+
cfg.gsub! /^Operating hours.*\n/, ""
|
20
|
+
cfg.gsub! /^System date.*\n/, ""
|
21
|
+
cfg.gsub! /^Current temperature.*\n/, ""
|
22
|
+
comment cfg
|
23
|
+
end
|
24
|
+
|
25
|
+
cmd 'show running-config script' do |cfg|
|
26
|
+
cfg
|
27
|
+
end
|
28
|
+
|
29
|
+
cfg :telnet do
|
30
|
+
username /^User:/
|
31
|
+
password /^Password:/
|
32
|
+
end
|
33
|
+
|
34
|
+
cfg :telnet, :ssh do
|
35
|
+
post_login 'enable'
|
36
|
+
pre_logout "logout\nY\r\n"
|
37
|
+
end
|
38
|
+
end
|
data/lib/oxidized/model/ios.rb
CHANGED
@@ -105,16 +105,19 @@ class IOS < Oxidized::Model
|
|
105
105
|
comment cfg
|
106
106
|
end
|
107
107
|
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
108
|
+
post do
|
109
|
+
cmd_line = 'show running-config'
|
110
|
+
cmd_line += ' view full' if vars(:ios_rbac)
|
111
|
+
cmd cmd_line do |cfg|
|
112
|
+
cfg = cfg.each_line.to_a[3..-1]
|
113
|
+
cfg = cfg.reject { |line| line.match /^ntp clock-period / }.join
|
114
|
+
cfg = cfg.each_line.reject { |line| line.match /^! (Last|No) configuration change (at|since).*/ unless line =~ /\d+\sby\s\S+$/ }.join
|
115
|
+
cfg.gsub! /^Current configuration : [^\n]*\n/, ''
|
116
|
+
cfg.gsub! /^ tunnel mpls traffic-eng bandwidth[^\n]*\n*(
|
117
|
+
(?: [^\n]*\n*)*
|
118
|
+
tunnel mpls traffic-eng auto-bw)/mx, '\1'
|
119
|
+
cfg
|
120
|
+
end
|
118
121
|
end
|
119
122
|
|
120
123
|
cfg :telnet do
|
data/lib/oxidized/model/iosxe.rb
CHANGED
@@ -31,7 +31,7 @@ class IronWare < Oxidized::Model
|
|
31
31
|
cfg.encode!("UTF-8", invalid: :replace, undef: :replace) # sometimes ironware returns broken encoding
|
32
32
|
cfg.gsub! /(^((.*)Current temp(.*))$)/, '' # remove unwanted lines current temperature
|
33
33
|
cfg.gsub! /Speed = [A-Z-]{2,6} \(\d{2,3}%\)/, '' # remove unwanted lines Speed Fans
|
34
|
-
cfg.gsub! /current speed is [A-Z]{2,6} \(\d{2,3}%\)/, ''
|
34
|
+
cfg.gsub! /current speed is [A-Z-]{2,6} \(\d{2,3}%\)/, ''
|
35
35
|
cfg.gsub! /Fan \d* - STATUS: OK \D*\d*./, '' # Fix for ADX Fan speed reporting
|
36
36
|
cfg.gsub! /\d* deg C/, '' # Fix for ADX temperature reporting
|
37
37
|
cfg.gsub! /([\[]*)1([\]]*)<->([\[]*)2([\]]*)(<->([\[]*)3([\]]*))*/, ''
|
@@ -75,9 +75,13 @@ class IronWare < Oxidized::Model
|
|
75
75
|
# handle pager with enable
|
76
76
|
cfg :telnet, :ssh do
|
77
77
|
if vars :enable
|
78
|
-
|
79
|
-
|
80
|
-
|
78
|
+
if vars(:enable).is_a? TrueClass
|
79
|
+
post_login 'enable'
|
80
|
+
else
|
81
|
+
post_login do
|
82
|
+
send "enable\r\n"
|
83
|
+
cmd vars(:enable)
|
84
|
+
end
|
81
85
|
end
|
82
86
|
end
|
83
87
|
post_login ''
|
data/lib/oxidized/model/junos.rb
CHANGED
@@ -34,7 +34,11 @@ class JunOS < Oxidized::Model
|
|
34
34
|
end
|
35
35
|
|
36
36
|
cmd('show chassis hardware') { |cfg| comment cfg }
|
37
|
-
cmd('show system license')
|
37
|
+
cmd('show system license') do |cfg|
|
38
|
+
cfg.gsub!(/ fib-scale\s+(\d+)/, ' fib-scale <count>')
|
39
|
+
cfg.gsub!(/ rib-scale\s+(\d+)/, ' rib-scale <count>')
|
40
|
+
comment cfg
|
41
|
+
end
|
38
42
|
cmd('show system license keys') { |cfg| comment cfg }
|
39
43
|
|
40
44
|
cmd 'show configuration | display omit'
|
@@ -0,0 +1,23 @@
|
|
1
|
+
class LANCOM < Oxidized::Model
|
2
|
+
# LANCOM Systems GmbH
|
3
|
+
# tested on LANCOM 1781EF+ router using Lancom OS 10.32.0176RU9 / 21.04.2020
|
4
|
+
comment '# '
|
5
|
+
|
6
|
+
prompt />\s?$/
|
7
|
+
|
8
|
+
cmd "sysinfo\r" do |cfg|
|
9
|
+
cfg.gsub! /^TIME:.*\n/, ''
|
10
|
+
comment cfg
|
11
|
+
end
|
12
|
+
|
13
|
+
cmd "readscript\r"
|
14
|
+
|
15
|
+
cfg :telnet do
|
16
|
+
username /login:\s/
|
17
|
+
password /^Password:\s/
|
18
|
+
end
|
19
|
+
|
20
|
+
cfg :telnet, :ssh do
|
21
|
+
pre_logout "exit\r"
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
class LenovoNOS < Oxidized::Model
|
2
|
+
prompt /^([\w.@()-]+[#>]\s?)$/
|
3
|
+
comment '! '
|
4
|
+
|
5
|
+
def comment_ext(header, output)
|
6
|
+
data = ''
|
7
|
+
data << header
|
8
|
+
data << "\n"
|
9
|
+
data << output
|
10
|
+
data << "\n"
|
11
|
+
comment data
|
12
|
+
end
|
13
|
+
|
14
|
+
cmd :all do |cfg|
|
15
|
+
cfg.gsub! /^% Invalid input detected at '\^' marker\.$|^\s+\^$/, ''
|
16
|
+
cfg.cut_both
|
17
|
+
end
|
18
|
+
|
19
|
+
cmd :secret do |cfg|
|
20
|
+
cfg.gsub! /^(enable password) \S+(.*)/, '\\1 <secret hidden>\\2'
|
21
|
+
cfg.gsub! /^(access user \S+ password) \S+(.*)/, '\\1 <secret hidden>\\2'
|
22
|
+
cfg.gsub! /^(snmp-server \S+-community) \S+(.*)/, '\\1 <secret hidden>\\2'
|
23
|
+
cfg.gsub! /^(tacacs-server \S+ \S+ ekey) \S+(.*)/, '\\1 <secret hidden>\\2'
|
24
|
+
cfg.gsub! /^(ntp message-digest-key \S+ md5-ekey) \S+(.*)/, '\\1 <secret hidden>\\2'
|
25
|
+
cfg.gsub! /(.* password )"[0-9a-f]+"(.*)/, '\\1<secret hidden>\\2'
|
26
|
+
cfg.gsub! /(.*ekey )"[0-9a-f]+"(.*)/, '\\1<secret hidden>\\2'
|
27
|
+
cfg
|
28
|
+
end
|
29
|
+
|
30
|
+
expect /^Select Command Line Interface mode.*iscli.*:/ do |data, re|
|
31
|
+
send "iscli\n"
|
32
|
+
data.sub re, ''
|
33
|
+
end
|
34
|
+
|
35
|
+
cmd 'show version' do |cfg|
|
36
|
+
cfg = cfg.each_line.to_a
|
37
|
+
|
38
|
+
cfg = cfg.reject { |line| line.match /^System Information at/ }
|
39
|
+
cfg = cfg.reject { |line| line.match /^Switch has been up for/ }
|
40
|
+
cfg = cfg.reject { |line| line.match /^Last boot:/ }
|
41
|
+
cfg = cfg.reject { |line| line.match /^Temperature / }
|
42
|
+
cfg = cfg.reject { |line| line.match /^Power Consumption/ }
|
43
|
+
|
44
|
+
cfg = cfg.join
|
45
|
+
comment_ext("=== show version ===", cfg)
|
46
|
+
end
|
47
|
+
|
48
|
+
cmd 'show boot' do |cfg|
|
49
|
+
comment_ext("=== show boot ===", cfg)
|
50
|
+
end
|
51
|
+
|
52
|
+
cmd 'show transceiver' do |cfg|
|
53
|
+
comment_ext("=== show transceiver ===", cfg)
|
54
|
+
end
|
55
|
+
|
56
|
+
cmd 'show software-key' do |cfg|
|
57
|
+
comment_ext("=== show software-key ===", cfg)
|
58
|
+
end
|
59
|
+
|
60
|
+
cmd 'show running-config' do |cfg|
|
61
|
+
cfg.gsub! /^Current configuration:[^\n]*\n/, ''
|
62
|
+
if vars(:remove_unstable_lines) == true
|
63
|
+
cfg.gsub! /(.* password )"[0-9a-f]+"(.*)/, '\\1<unstable line hidden>\\2'
|
64
|
+
cfg.gsub! /(.*ekey )"[0-9a-f]+"(.*)/, '\\1<unstable line hidden>\\2'
|
65
|
+
end
|
66
|
+
cfg
|
67
|
+
end
|
68
|
+
|
69
|
+
cfg :ssh do
|
70
|
+
# preferred way to handle additional passwords
|
71
|
+
post_login do
|
72
|
+
if vars(:enable) == true
|
73
|
+
cmd "enable"
|
74
|
+
elsif vars(:enable)
|
75
|
+
cmd "enable", /^[pP]assword:/
|
76
|
+
cmd vars(:enable)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
post_login 'terminal-length 0'
|
80
|
+
pre_logout 'exit'
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
class LinksysSRW < Oxidized::Model
|
2
|
+
comment '! '
|
3
|
+
|
4
|
+
prompt /^([\r\w.@-]+[#>]\s?)$/
|
5
|
+
|
6
|
+
# Graphical login screen
|
7
|
+
# Just login to get to Main Menu
|
8
|
+
expect /Login Screen/ do
|
9
|
+
Oxidized.logger.send(:debug, "#{self.class.name}: Login Screen")
|
10
|
+
# This is to ensure the whole thing have rendered before we send stuff
|
11
|
+
sleep 0.2
|
12
|
+
send 0x18.chr # CAN Cancel
|
13
|
+
send @node.auth[:username]
|
14
|
+
send "\t"
|
15
|
+
send @node.auth[:password]
|
16
|
+
send "\r"
|
17
|
+
''
|
18
|
+
end
|
19
|
+
|
20
|
+
# Main menu, escape into Pre-cli-shell
|
21
|
+
expect /Switch Main Menu/ do
|
22
|
+
Oxidized.logger.send(:debug, "#{self.class.name}: Switch menu")
|
23
|
+
send 0x1a.chr # SUB Substitite ^z
|
24
|
+
''
|
25
|
+
end
|
26
|
+
|
27
|
+
# Pre-cli-shell, start lcli which is ios-ish
|
28
|
+
expect />/ do
|
29
|
+
Oxidized.logger.send(:debug, "#{self.class.name}: >")
|
30
|
+
send "lcli\r"
|
31
|
+
''
|
32
|
+
end
|
33
|
+
|
34
|
+
cmd :all do |cfg|
|
35
|
+
# Remove \r from first response row
|
36
|
+
cfg.gsub! /^\r/, ''
|
37
|
+
cfg.cut_tail + "\n"
|
38
|
+
end
|
39
|
+
|
40
|
+
cmd :secret do |cfg|
|
41
|
+
cfg.gsub! /^(snmp-server community).*/, '\\1 <configuration removed>'
|
42
|
+
cfg.gsub! /^(enable (password|secret)( level \d+)? \d) .+/, '\\1 <secret hidden>'
|
43
|
+
end
|
44
|
+
|
45
|
+
cmd 'show startup-config' do |cfg|
|
46
|
+
# Repair some linewraps which terminal datadump doesn't take care of
|
47
|
+
# and there's no terminal width either.
|
48
|
+
cfg.gsub! /(lldpPortConfigT)\n(LVsTxEnable)/, '\\1\\2'
|
49
|
+
cfg.gsub! /(lldpPortConfigTL)\n(VsTxEnable)/, '\\1\\2'
|
50
|
+
# And comment out the echo of the command
|
51
|
+
"#{comment cfg.lines.first}#{cfg.cut_head}"
|
52
|
+
end
|
53
|
+
|
54
|
+
cmd 'show version' do |cfg|
|
55
|
+
comment cfg
|
56
|
+
end
|
57
|
+
|
58
|
+
cmd 'show system' do |cfg|
|
59
|
+
cfg.gsub! /(System Up Time \(days,hour:min:sec\):\s+).*/, '\\1 <uptime removed>'
|
60
|
+
comment cfg
|
61
|
+
end
|
62
|
+
|
63
|
+
cfg :telnet, :ssh do
|
64
|
+
# Some pre-cli-shell just expects a username, who its going to log in.
|
65
|
+
username /^User Name:/
|
66
|
+
password /Password:/
|
67
|
+
post_login 'terminal datadump'
|
68
|
+
pre_logout 'exit'
|
69
|
+
pre_logout 'logout'
|
70
|
+
end
|
71
|
+
end
|
@@ -10,7 +10,9 @@ class MLNXOS < Oxidized::Model
|
|
10
10
|
|
11
11
|
cmd :all do |cfg|
|
12
12
|
cfg.gsub! /\[\?1h=\r/, '' # Pager Handling
|
13
|
+
cfg.gsub! /\[24;1H/, '' # Pager Handling
|
13
14
|
cfg.gsub! /\r\[K/, '' # Pager Handling
|
15
|
+
cfg.gsub! /\[K/, '' # Pager Handling
|
14
16
|
cfg.gsub! /\s/, '' # Linebreak Handling
|
15
17
|
cfg.gsub! /^CPU load averages:\s.+/, '' # Omit constantly changing CPU info
|
16
18
|
cfg.gsub! /^System memory:\s.+/, '' # Omit constantly changing memory info
|
data/lib/oxidized/model/model.rb
CHANGED
@@ -7,6 +7,7 @@ module Oxidized
|
|
7
7
|
|
8
8
|
class << self
|
9
9
|
def inherited(klass)
|
10
|
+
super
|
10
11
|
if klass.superclass == Oxidized::Model
|
11
12
|
klass.instance_variable_set '@cmd', (Hash.new { |h, k| h[k] = [] })
|
12
13
|
klass.instance_variable_set '@cfg', (Hash.new { |h, k| h[k] = [] })
|
@@ -16,7 +17,9 @@ module Oxidized
|
|
16
17
|
klass.instance_variable_set '@prompt', nil
|
17
18
|
else # we're subclassing some existing model, take its variables
|
18
19
|
instance_variables.each do |var|
|
19
|
-
|
20
|
+
iv = instance_variable_get(var)
|
21
|
+
klass.instance_variable_set var, iv.dup
|
22
|
+
@cmd[:cmd] = iv[:cmd].dup if var.to_s == "@cmd"
|
20
23
|
end
|
21
24
|
end
|
22
25
|
end
|
@@ -46,7 +49,7 @@ module Oxidized
|
|
46
49
|
end
|
47
50
|
|
48
51
|
def cmd(cmd_arg = nil, **args, &block)
|
49
|
-
if cmd_arg.
|
52
|
+
if cmd_arg.instance_of?(Symbol)
|
50
53
|
process_args_block(@cmd[cmd_arg], args, block)
|
51
54
|
else
|
52
55
|
process_args_block(@cmd[:cmd], args, [cmd_arg, block])
|
@@ -97,7 +100,12 @@ module Oxidized
|
|
97
100
|
|
98
101
|
def process_args_block(target, args, block)
|
99
102
|
if args[:clear]
|
100
|
-
|
103
|
+
if block.instance_of?(Array)
|
104
|
+
target.reject! { |k, _| k == block[0] }
|
105
|
+
target.push(block)
|
106
|
+
else
|
107
|
+
target.replace([block])
|
108
|
+
end
|
101
109
|
else
|
102
110
|
method = args[:prepend] ? :unshift : :push
|
103
111
|
target.send(method, block)
|
@@ -181,6 +189,24 @@ module Oxidized
|
|
181
189
|
data
|
182
190
|
end
|
183
191
|
|
192
|
+
def xmlcomment(str)
|
193
|
+
# XML Comments start with <!-- and end with -->
|
194
|
+
#
|
195
|
+
# Because it's illegal for the first or last characters of a comment
|
196
|
+
# to be a -, i.e. <!--- or ---> are illegal, and also to improve
|
197
|
+
# readability, we add extra spaces after and before the beginning
|
198
|
+
# and end of comment markers.
|
199
|
+
#
|
200
|
+
# Also, XML Comments must not contain --. So we put a space between
|
201
|
+
# any double hyphens, by replacing any - that is followed by another -
|
202
|
+
# with '- '
|
203
|
+
data = ''
|
204
|
+
str.each_line do |_line|
|
205
|
+
data << '<!-- ' << str.gsub(/-(?=-)/, '- ').chomp << " -->\n"
|
206
|
+
end
|
207
|
+
data
|
208
|
+
end
|
209
|
+
|
184
210
|
def screenscrape
|
185
211
|
@input.class.to_s.match(/Telnet/) || vars(:ssh_no_exec)
|
186
212
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
class NecIX < Oxidized::Model
|
2
|
+
prompt /^(\([\w.-]*\)\s[#$]|^\S+[$#]\s?)$/
|
3
|
+
comment '! '
|
4
|
+
expect /^--More--$/ do |data, re|
|
5
|
+
send ' '
|
6
|
+
data.sub re, ''
|
7
|
+
end
|
8
|
+
|
9
|
+
cmd 'show running-config' do |cfg|
|
10
|
+
cfg = cfg.each_line.to_a[3..-2].join
|
11
|
+
cfg.gsub! /^.*Current time.*$/, ''
|
12
|
+
cfg
|
13
|
+
end
|
14
|
+
|
15
|
+
cfg :telnet do
|
16
|
+
username /^Username:/
|
17
|
+
password /^Password:/
|
18
|
+
end
|
19
|
+
|
20
|
+
cfg :telnet, :ssh do
|
21
|
+
post_login do
|
22
|
+
send "configure\n"
|
23
|
+
end
|
24
|
+
|
25
|
+
pre_logout do
|
26
|
+
send "\cZ"
|
27
|
+
send "exit\n"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -5,7 +5,8 @@ class Netgear < Oxidized::Model
|
|
5
5
|
cmd :secret do |cfg|
|
6
6
|
cfg.gsub!(/password (\S+)/, 'password <hidden>')
|
7
7
|
cfg.gsub!(/encrypted (\S+)/, 'encrypted <hidden>')
|
8
|
-
cfg.gsub!(/snmp-server community (\S+)
|
8
|
+
cfg.gsub!(/snmp-server community (\S+)$/, 'snmp-server community <hidden>')
|
9
|
+
cfg.gsub!(/snmp-server community (\S+) (\S+) (\S+)/, 'snmp-server community \\1 \\2 <hidden>')
|
9
10
|
cfg
|
10
11
|
end
|
11
12
|
|
@@ -29,7 +30,9 @@ class Netgear < Oxidized::Model
|
|
29
30
|
# The system has unsaved changes.
|
30
31
|
# Would you like to save them now? (y/n)
|
31
32
|
#
|
32
|
-
#
|
33
|
+
# As no changes will be made over this simple SSH session, we can safely choose "n" here.
|
34
|
+
pre_logout 'quit'
|
35
|
+
pre_logout 'n'
|
33
36
|
end
|
34
37
|
|
35
38
|
cmd :all do |cfg, cmdstring|
|