oxidized 0.29.1 → 0.37.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/.coderabbit.yaml +21 -0
- data/.github/ISSUE_TEMPLATE/bug_report.md +45 -0
- data/.github/ISSUE_TEMPLATE/feature_request.md +22 -0
- data/.github/ISSUE_TEMPLATE/support-request.md +39 -0
- data/.github/workflows/codeql.yml +4 -4
- data/.github/workflows/publishdocker.yml +108 -13
- data/.github/workflows/ruby.yml +3 -12
- data/.github/workflows/stale.yml +6 -1
- data/.gitignore +2 -0
- data/.rubocop.yml +69 -13
- data/.rubocop_todo.yml +13 -143
- data/CHANGELOG.md +431 -4
- data/CONTRIBUTING.md +189 -0
- data/Dockerfile +89 -34
- data/README.md +59 -188
- data/Rakefile +58 -12
- data/bin/oxidized +2 -5
- data/docs/Configuration.md +382 -149
- data/docs/Creating-Models.md +262 -10
- data/docs/DeviceSimulation.md +196 -0
- data/docs/Docker.md +246 -0
- data/docs/Hooks.md +146 -51
- data/docs/Inputs.md +237 -0
- data/docs/Issues.md +123 -0
- data/docs/Model-Notes/APC.md +72 -0
- data/docs/Model-Notes/Cumulus.md +5 -0
- data/docs/Model-Notes/EatonNetwork.md +18 -0
- data/docs/Model-Notes/ExaLink.md +43 -0
- data/docs/Model-Notes/FSOS.md +17 -0
- data/docs/Model-Notes/Fortinet.md +75 -0
- data/docs/Model-Notes/GrandstreamHT8xx.md +8 -0
- data/docs/Model-Notes/HPEAruba.md +32 -0
- data/docs/Model-Notes/IvantiConnectSecure.md +59 -0
- data/docs/Model-Notes/OS6.md +10 -0
- data/docs/Model-Notes/README.md +1 -20
- data/docs/Model-Notes/RouterOS.md +28 -0
- data/docs/Model-Notes/SikluMHTG.md +7 -0
- data/docs/Model-Notes/TrueNAS.md +23 -0
- data/docs/Model-Notes/XGS4600-Zyxel.md +5 -0
- data/docs/ModelUnitTests.md +219 -0
- data/docs/Outputs.md +102 -5
- data/docs/Release.md +102 -0
- data/docs/Ruby-API.md +135 -2
- data/docs/Sources.md +34 -0
- data/docs/Supported-OS-Types.md +207 -270
- data/docs/Troubleshooting.md +43 -1
- data/extra/device2yaml.rb +259 -0
- data/extra/gitdiff-msteams.sh +32 -5
- data/extra/hooks/modelrules.rb +55 -0
- data/extra/hooks/modelrulesadvanced.rb +167 -0
- data/extra/hooks/srcipmap.rb +54 -0
- data/extra/nagios_check_failing_nodes.rb +1 -1
- data/extra/oxidized.runit +1 -1
- data/extra/rest_client.rb +5 -4
- data/extra/syslog.rb +11 -6
- data/lib/oxidized/cli/support.rb +152 -0
- data/lib/oxidized/cli.rb +21 -6
- data/lib/oxidized/config/vars.rb +33 -14
- data/lib/oxidized/config.rb +28 -17
- data/lib/oxidized/core.rb +50 -8
- data/lib/oxidized/hook/ciscosparkdiff.rb +11 -9
- data/lib/oxidized/hook/exec.rb +5 -4
- data/lib/oxidized/hook/githubrepo.rb +55 -18
- data/lib/oxidized/hook/noophook.rb +2 -2
- data/lib/oxidized/hook/slackdiff.rb +50 -14
- data/lib/oxidized/hook/xmppdiff.rb +9 -9
- data/lib/oxidized/hook.rb +68 -16
- data/lib/oxidized/input/cli.rb +8 -3
- data/lib/oxidized/input/debugtext.rb +40 -0
- data/lib/oxidized/input/debugyaml.rb +82 -0
- data/lib/oxidized/input/exec.rb +2 -11
- data/lib/oxidized/input/ftp.rb +2 -19
- data/lib/oxidized/input/http.rb +67 -17
- data/lib/oxidized/input/input.rb +35 -14
- data/lib/oxidized/input/scp.rb +27 -0
- data/lib/oxidized/input/ssh.rb +59 -83
- data/lib/oxidized/input/sshbase.rb +102 -0
- data/lib/oxidized/input/telnet.rb +20 -19
- data/lib/oxidized/input/tftp.rb +8 -8
- data/lib/oxidized/job.rb +18 -7
- data/lib/oxidized/jobs.rb +11 -1
- data/lib/oxidized/logger.rb +51 -0
- data/lib/oxidized/manager.rb +18 -17
- data/lib/oxidized/model/acos.rb +2 -1
- data/lib/oxidized/model/addpack.rb +26 -0
- data/lib/oxidized/model/adtran.rb +5 -1
- data/lib/oxidized/model/adva.rb +3 -3
- data/lib/oxidized/model/airfiber.rb +1 -1
- data/lib/oxidized/model/aos7.rb +11 -0
- data/lib/oxidized/model/aoscx.rb +37 -29
- data/lib/oxidized/model/aosw.rb +39 -29
- data/lib/oxidized/model/apc_aos.rb +7 -2
- data/lib/oxidized/model/apcaos.rb +39 -0
- data/lib/oxidized/model/aricentiss.rb +9 -2
- data/lib/oxidized/model/arubainstant.rb +93 -0
- data/lib/oxidized/model/asa.rb +11 -10
- data/lib/oxidized/model/asternos.rb +22 -0
- data/lib/oxidized/model/asyncos.rb +3 -3
- data/lib/oxidized/model/audiocodes.rb +2 -2
- data/lib/oxidized/model/awplus.rb +15 -12
- data/lib/oxidized/model/axos.rb +1 -1
- data/lib/oxidized/model/bdcom.rb +1 -0
- data/lib/oxidized/model/c4cmts.rb +1 -2
- data/lib/oxidized/model/ciscosma.rb +1 -1
- data/lib/oxidized/model/ciscosmb.rb +6 -1
- data/lib/oxidized/model/cnos.rb +13 -10
- data/lib/oxidized/model/comtrol.rb +1 -1
- data/lib/oxidized/model/comware.rb +5 -3
- data/lib/oxidized/model/cumulus.rb +14 -2
- data/lib/oxidized/model/defacto.rb +26 -0
- data/lib/oxidized/model/dellx.rb +1 -1
- data/lib/oxidized/model/dlink.rb +5 -2
- data/lib/oxidized/model/dlinknextgen.rb +55 -0
- data/lib/oxidized/model/dnos.rb +3 -0
- data/lib/oxidized/model/dslcommands.rb +93 -0
- data/lib/oxidized/model/dslsetup.rb +102 -0
- data/lib/oxidized/model/eatonnetwork.rb +70 -0
- data/lib/oxidized/model/edgecos.rb +3 -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 +4 -2
- data/lib/oxidized/model/enterasys800.rb +2 -2
- data/lib/oxidized/model/enterprise_sonic.rb +46 -0
- data/lib/oxidized/model/eos.rb +3 -1
- data/lib/oxidized/model/exalink.rb +36 -0
- data/lib/oxidized/model/f5os.rb +17 -0
- data/lib/oxidized/model/fabricos.rb +2 -2
- data/lib/oxidized/model/fastiron.rb +5 -3
- data/lib/oxidized/model/firebrick.rb +2 -2
- data/lib/oxidized/model/firelinuxos.rb +13 -6
- data/lib/oxidized/model/firewareos.rb +10 -1
- data/lib/oxidized/model/fortigate.rb +160 -0
- data/lib/oxidized/model/fortios.rb +38 -48
- data/lib/oxidized/model/fsos.rb +46 -0
- data/lib/oxidized/model/gaiaos.rb +4 -4
- data/lib/oxidized/model/garderos.rb +38 -0
- data/lib/oxidized/model/grandstreamht8xx.rb +19 -0
- data/lib/oxidized/model/h3c.rb +1 -1
- data/lib/oxidized/model/ibos.rb +1 -0
- data/lib/oxidized/model/ingate.rb +47 -0
- data/lib/oxidized/model/ios.rb +57 -30
- data/lib/oxidized/model/iosxr.rb +2 -2
- data/lib/oxidized/model/ironware.rb +7 -5
- data/lib/oxidized/model/ivanti.rb +54 -0
- data/lib/oxidized/model/junos.rb +12 -5
- data/lib/oxidized/model/kornfeldos.rb +33 -0
- data/lib/oxidized/model/lenovonos.rb +2 -0
- data/lib/oxidized/model/linksyssrw.rb +3 -3
- data/lib/oxidized/model/linuxgeneric.rb +4 -2
- data/lib/oxidized/model/macros.rb +60 -0
- data/lib/oxidized/model/mimosab11.rb +34 -0
- data/lib/oxidized/model/ml66.rb +33 -0
- data/lib/oxidized/model/mlnxos.rb +18 -14
- data/lib/oxidized/model/model.rb +98 -103
- data/lib/oxidized/model/mtrlrfs.rb +1 -0
- data/lib/oxidized/model/ndms.rb +6 -0
- data/lib/oxidized/model/netgear.rb +14 -3
- data/lib/oxidized/model/netonix.rb +1 -1
- data/lib/oxidized/model/netscaler.rb +1 -1
- data/lib/oxidized/model/nodegrid.rb +1 -1
- data/lib/oxidized/model/nsxdfw.rb +31 -0
- data/lib/oxidized/model/nsxfirewall.rb +2 -1
- data/lib/oxidized/model/nxos.rb +20 -15
- data/lib/oxidized/model/ocnos.rb +42 -0
- data/lib/oxidized/model/onefinity.rb +18 -0
- data/lib/oxidized/model/openbsd.rb +1 -1
- data/lib/oxidized/model/opengear.rb +36 -1
- data/lib/oxidized/model/openwrt.rb +6 -6
- data/lib/oxidized/model/opnsense.rb +9 -1
- data/lib/oxidized/model/os6.rb +48 -0
- data/lib/oxidized/model/outputs.rb +5 -0
- data/lib/oxidized/model/panos.rb +2 -0
- data/lib/oxidized/model/perle.rb +41 -0
- data/lib/oxidized/model/pfsense.rb +9 -0
- data/lib/oxidized/model/powerconnect.rb +32 -11
- data/lib/oxidized/model/procurve.rb +6 -2
- data/lib/oxidized/model/qtech.rb +3 -1
- data/lib/oxidized/model/quantaos.rb +8 -6
- data/lib/oxidized/model/rgos.rb +33 -0
- data/lib/oxidized/model/riverbed.rb +104 -0
- data/lib/oxidized/model/routeros.rb +18 -11
- data/lib/oxidized/model/saos.rb +18 -1
- data/lib/oxidized/model/saos10.rb +38 -0
- data/lib/oxidized/model/siklu.rb +1 -1
- data/lib/oxidized/model/siklumhtg.rb +22 -0
- data/lib/oxidized/model/sixwind.rb +28 -0
- data/lib/oxidized/model/slxos.rb +3 -3
- data/lib/oxidized/model/smartbyte.rb +48 -0
- data/lib/oxidized/model/sonicos.rb +27 -20
- data/lib/oxidized/model/speedtouch.rb +1 -1
- data/lib/oxidized/model/sros.rb +3 -3
- data/lib/oxidized/model/srosmd.rb +1 -1
- data/lib/oxidized/model/supermicro.rb +1 -1
- data/lib/oxidized/model/telco.rb +1 -1
- data/lib/oxidized/model/tmos.rb +1 -0
- data/lib/oxidized/model/tnsr.rb +57 -0
- data/lib/oxidized/model/tplink.rb +5 -5
- data/lib/oxidized/model/trango.rb +4 -2
- data/lib/oxidized/model/truenas.rb +64 -3
- data/lib/oxidized/model/ucs.rb +1 -1
- data/lib/oxidized/model/unifiap.rb +144 -0
- data/lib/oxidized/model/uplinkolt.rb +46 -0
- data/lib/oxidized/model/voltaire.rb +1 -1
- data/lib/oxidized/model/voss.rb +3 -0
- data/lib/oxidized/model/vrp.rb +5 -1
- data/lib/oxidized/model/vyatta.rb +9 -3
- data/lib/oxidized/model/vyos.rb +37 -0
- data/lib/oxidized/model/xos.rb +10 -1
- data/lib/oxidized/model/zhoneolt.rb +4 -2
- data/lib/oxidized/model/zynos.rb +67 -3
- data/lib/oxidized/model/zynosadsl.rb +14 -0
- data/lib/oxidized/model/zynoscli.rb +1 -1
- data/lib/oxidized/model/zynosgs.rb +2 -0
- data/lib/oxidized/model/zynosmgs.rb +32 -0
- data/lib/oxidized/node.rb +99 -64
- data/lib/oxidized/nodes.rb +40 -19
- data/lib/oxidized/output/file.rb +80 -43
- data/lib/oxidized/output/git.rb +295 -151
- data/lib/oxidized/output/gitcrypt.rb +193 -185
- data/lib/oxidized/output/http.rb +63 -51
- data/lib/oxidized/output/output.rb +20 -4
- data/lib/oxidized/signals.rb +44 -0
- data/lib/oxidized/source/csv.rb +49 -49
- data/lib/oxidized/source/http.rb +76 -63
- data/lib/oxidized/source/jsonfile.rb +68 -0
- data/lib/oxidized/source/source.rb +73 -18
- data/lib/oxidized/source/sql.rb +71 -59
- data/lib/oxidized/version.rb +6 -4
- data/lib/oxidized/worker.rb +57 -29
- data/lib/oxidized.rb +4 -24
- data/lib/refinements.rb +21 -1
- data/oxidized.gemspec +45 -21
- metadata +248 -41
- data/lib/oxidized/model/timos.rb +0 -10
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
class OS6 < Oxidized::Model
|
|
2
|
+
using Refinements
|
|
3
|
+
|
|
4
|
+
# For switches running Dell EMC Networking OS6 #
|
|
5
|
+
#
|
|
6
|
+
# Tested with : Dell PowerSwitch N2048
|
|
7
|
+
|
|
8
|
+
comment '! '
|
|
9
|
+
|
|
10
|
+
cmd :all do |cfg|
|
|
11
|
+
cfg.gsub! /^% Invalid input detected at '\^' marker\.$|^\s+\^$/, ''
|
|
12
|
+
cfg.each_line.to_a[2..-2].join
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
cmd :secret do |cfg|
|
|
16
|
+
cfg.gsub! /(password )(\S+)/, '\1<secret hidden>'
|
|
17
|
+
cfg
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
cmd 'show version' do |cfg|
|
|
21
|
+
comment cfg
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
cmd 'show interfaces transceiver properties' do |cfg|
|
|
25
|
+
comment cfg
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
cmd 'show running-config' do |cfg|
|
|
29
|
+
cfg.each_line.to_a[3..-1].join
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
cfg :telnet do
|
|
33
|
+
username /^Login:/
|
|
34
|
+
password /^Password:/
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
cfg :telnet, :ssh do
|
|
38
|
+
if vars :enable
|
|
39
|
+
post_login do
|
|
40
|
+
send "enable\n"
|
|
41
|
+
cmd vars(:enable)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
post_login 'terminal length 0'
|
|
45
|
+
pre_logout 'exit'
|
|
46
|
+
pre_logout 'exit'
|
|
47
|
+
end
|
|
48
|
+
end
|
data/lib/oxidized/model/panos.rb
CHANGED
|
@@ -18,6 +18,8 @@ class PanOS < Oxidized::Model
|
|
|
18
18
|
cfg.gsub! /^threat-.*?: .*$/, ''
|
|
19
19
|
cfg.gsub! /^wildfire-.*?: .*$/, ''
|
|
20
20
|
cfg.gsub! /^wf-private.*?: .*$/, ''
|
|
21
|
+
cfg.gsub! /^device-dictionary-version.*?: .*$/, ''
|
|
22
|
+
cfg.gsub! /^device-dictionary-release-date.*?: .*$/, ''
|
|
21
23
|
cfg.gsub! /^url-filtering.*?: .*$/, ''
|
|
22
24
|
cfg.gsub! /^global-.*?: .*$/, ''
|
|
23
25
|
comment cfg
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
class Perle < Oxidized::Model
|
|
2
|
+
using Refinements
|
|
3
|
+
|
|
4
|
+
prompt /^[\w.-]+#/
|
|
5
|
+
comment '! '
|
|
6
|
+
|
|
7
|
+
cmd :all do |cfg|
|
|
8
|
+
cfg = cfg.cut_both
|
|
9
|
+
cfg.delete "\r"
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
cmd 'show version verbose' do |cfg|
|
|
13
|
+
comment cfg
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
cmd 'show system hardware' do |cfg|
|
|
17
|
+
comment cfg + "\n"
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
cmd 'show interfaces transceiver' do |cfg|
|
|
21
|
+
cfg = cfg.keep_lines [
|
|
22
|
+
'SFP Information',
|
|
23
|
+
'Vendor Name',
|
|
24
|
+
'Vendor Serial Number'
|
|
25
|
+
]
|
|
26
|
+
comment cfg + "\n"
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
cmd 'show running-config'
|
|
30
|
+
|
|
31
|
+
cmd :significant_changes do |cfg|
|
|
32
|
+
cfg.reject_lines [
|
|
33
|
+
/^tacacs-server key 7 \$0\$\S+==$/
|
|
34
|
+
]
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
cfg :ssh do
|
|
38
|
+
post_login 'terminal length 0'
|
|
39
|
+
pre_logout 'exit'
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -15,6 +15,7 @@ class PfSense < Oxidized::Model
|
|
|
15
15
|
|
|
16
16
|
cfg.gsub! /\s<revision>\s*<time>\d*<\/time>\s*.*\s*.*\s*<\/revision>/, ''
|
|
17
17
|
cfg.gsub! /\s<last_rule_upd_time>\d*<\/last_rule_upd_time>/, ''
|
|
18
|
+
cfg.gsub! /\s<created>\s*<time>\d*<\/time>\s*.*CDATA\[Auto\].*\s*.*\s*<\/created>/, ''
|
|
18
19
|
cfg
|
|
19
20
|
end
|
|
20
21
|
|
|
@@ -25,6 +26,14 @@ class PfSense < Oxidized::Model
|
|
|
25
26
|
xmlcomment "PFsense #{version}"
|
|
26
27
|
end
|
|
27
28
|
|
|
29
|
+
metadata :bottom do
|
|
30
|
+
xmlcomment interpolate_string(
|
|
31
|
+
vars("metadata_bottom") ||
|
|
32
|
+
vars("metadata_top") ||
|
|
33
|
+
Oxidized::Model::METADATA_DEFAULT
|
|
34
|
+
)
|
|
35
|
+
end
|
|
36
|
+
|
|
28
37
|
cfg :ssh do
|
|
29
38
|
exec true
|
|
30
39
|
pre_logout 'exit'
|
|
@@ -5,17 +5,19 @@ class PowerConnect < Oxidized::Model
|
|
|
5
5
|
|
|
6
6
|
comment '! '
|
|
7
7
|
|
|
8
|
-
expect
|
|
8
|
+
expect /\n\s*--More--\s+.*/ do |data, re| # Also grab the blank line above the --More--
|
|
9
9
|
send ' '
|
|
10
10
|
data.sub re, ''
|
|
11
11
|
end
|
|
12
12
|
|
|
13
|
+
# Filter all command output
|
|
13
14
|
cmd :all do |cfg|
|
|
14
|
-
cfg.
|
|
15
|
+
cfg.gsub! /\r+/, '' # Remove the CR characters echoed back from the commands
|
|
16
|
+
cfg.cut_tail # Drop the last line which is the next prompt
|
|
15
17
|
end
|
|
16
18
|
|
|
17
19
|
cmd :secret do |cfg|
|
|
18
|
-
cfg.gsub! /^(username \S+ password (?:encrypted )
|
|
20
|
+
cfg.gsub! /^((?:enable |username \S+ )?password (?:level\s\d{1,2} |encrypted ){,2})\S+(.*)/, '\1<hidden>\2'
|
|
19
21
|
cfg.gsub! /^(tacacs-server key) \S+/, '\\1 <secret hidden>'
|
|
20
22
|
cfg
|
|
21
23
|
end
|
|
@@ -32,7 +34,7 @@ class PowerConnect < Oxidized::Model
|
|
|
32
34
|
end
|
|
33
35
|
|
|
34
36
|
cmd 'show running-config' do |cfg|
|
|
35
|
-
cfg.sub(/^(sflow \S+ destination owner \S+ timeout )\d+$/, '! \1<timeout>')
|
|
37
|
+
cfg.sub(/^(sflow \S+ destination owner \S+ timeout )\d+$/, '! \1<timeout>') # Remove changing timeout
|
|
36
38
|
end
|
|
37
39
|
|
|
38
40
|
cfg :telnet, :ssh do
|
|
@@ -50,15 +52,21 @@ class PowerConnect < Oxidized::Model
|
|
|
50
52
|
end
|
|
51
53
|
end
|
|
52
54
|
|
|
53
|
-
post_login
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
55
|
+
post_login do
|
|
56
|
+
cmd "terminal datadump"
|
|
57
|
+
cmd "terminal length 0"
|
|
58
|
+
end
|
|
59
|
+
pre_logout do
|
|
60
|
+
send "exit\r"
|
|
61
|
+
sleep(0.25)
|
|
62
|
+
send "logout\r"
|
|
63
|
+
end
|
|
57
64
|
end
|
|
58
65
|
|
|
59
66
|
def clean(cfg)
|
|
60
67
|
out = []
|
|
61
|
-
skip_blocks = 0
|
|
68
|
+
len1 = len2 = skip_blocks = 0
|
|
69
|
+
|
|
62
70
|
cfg.each_line do |line|
|
|
63
71
|
# If this is a stackable switch we should skip this block of information
|
|
64
72
|
if line.match(/Up\sTime|Temperature|Power Suppl(ies|y)|Fans/i) && (@stackable == true)
|
|
@@ -71,9 +79,22 @@ class PowerConnect < Oxidized::Model
|
|
|
71
79
|
skip_blocks -= 1 if /\S/ !~ line
|
|
72
80
|
next
|
|
73
81
|
end
|
|
74
|
-
|
|
82
|
+
line = line.strip
|
|
83
|
+
# If the temps were not removed by skipping blocks, then mask them out wih XXX
|
|
84
|
+
# The most recent set of dashes has the spacing we want to match
|
|
85
|
+
if (match = line.match(/^(---+ +)(---+ +)/))
|
|
86
|
+
one, two = match.captures
|
|
87
|
+
len1 = one.length
|
|
88
|
+
len2 = two.length
|
|
89
|
+
end
|
|
90
|
+
# This can only be a temperature, right? ;-)
|
|
91
|
+
if (match = line.match(/^(\d{1,2}) {3,}\d+ (.*)$/))
|
|
92
|
+
one, two = match.captures
|
|
93
|
+
line = one.to_s + (' ' * (len1 - one.length)) + "XXX" + (' ' * (len2 - 3)) + two.to_s
|
|
94
|
+
end
|
|
95
|
+
out << line
|
|
75
96
|
end
|
|
76
|
-
out = out.reject { |line| line[/Up\sTime/] }
|
|
97
|
+
out = out.reject { |line| line[/Up\sTime/] } # Filter out Up Time
|
|
77
98
|
out = comment out.join "\n"
|
|
78
99
|
out << "\n"
|
|
79
100
|
end
|
|
@@ -5,7 +5,7 @@ class Procurve < Oxidized::Model
|
|
|
5
5
|
# ssh switches prompt may start with \r, followed by the prompt itself, regex ([\w\s.-]+[#>] ), which ends the line
|
|
6
6
|
# telnet switches may start with various vt100 control characters, regex (\e\[24;[0-9][hH]), followed by the prompt, followed
|
|
7
7
|
# by at least 3 other vt100 characters
|
|
8
|
-
prompt /(^\r|\e\[24;[0-9][hH])?([\w\s.-]+
|
|
8
|
+
prompt /(^\r|\e\[24;[0-9][hH])?([\w\s.-]+[#>] )($|(\e\[24;[0-9][0-9]?[hH]){3})/
|
|
9
9
|
|
|
10
10
|
comment '! '
|
|
11
11
|
|
|
@@ -36,6 +36,8 @@ class Procurve < Oxidized::Model
|
|
|
36
36
|
cfg.gsub! /\e\[\??\d+(;\d+)*[A-Za-z]/, ''
|
|
37
37
|
# Additional filtering for power usage reporting which obviously changes over time
|
|
38
38
|
cfg.gsub! /^(.*AC [0-9]{3}V\/?([0-9]{3}V)?) *([0-9]{1,3}) (.*)/, '\\1 <removed> \\4'
|
|
39
|
+
# Remove failed commands that are not supported on all models
|
|
40
|
+
cfg.gsub! /^Invalid input: [A-Za-z-]+\n/, ''
|
|
39
41
|
cfg
|
|
40
42
|
end
|
|
41
43
|
|
|
@@ -73,7 +75,9 @@ class Procurve < Oxidized::Model
|
|
|
73
75
|
|
|
74
76
|
# not supported on all models
|
|
75
77
|
cmd 'show system information' do |cfg|
|
|
76
|
-
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
|
|
77
81
|
cfg = cfg.join
|
|
78
82
|
comment cfg
|
|
79
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
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
class RGOS < Oxidized::Model
|
|
2
|
+
using Refinements
|
|
3
|
+
|
|
4
|
+
comment '! '
|
|
5
|
+
|
|
6
|
+
cmd :secret do |cfg|
|
|
7
|
+
cfg.gsub! /^(snmp-server community).*/, '\\1 <configuration removed>'
|
|
8
|
+
cfg.gsub! /^(username .+ (password|secret) \d) .+/, '\\1 <secret hidden>'
|
|
9
|
+
cfg.gsub! /^(enable (password|secret)( level \d+)?( \d)?) .+/, '\\1 <secret hidden>'
|
|
10
|
+
cfg
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
cmd 'show version' do |cfg|
|
|
14
|
+
cfg = cfg.each_line.reject { |line| line.match /^System start time/ }.join
|
|
15
|
+
cfg = cfg.each_line.reject { |line| line.match /^\s*System uptime/ }.join
|
|
16
|
+
comment "#{cfg.cut_both}\n"
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
cmd 'show running-config' do |cfg|
|
|
20
|
+
cfg = cfg.each_line.reject { |line| line.match /^Building configuration.../ }.join
|
|
21
|
+
cfg = cfg.each_line.reject { |line| line.match /^Current configuration : \d+ bytes/ }.join
|
|
22
|
+
cfg = cfg.each_line.reject { |line| line.match /^version [\d\w()]+/ }.join
|
|
23
|
+
# remove empty lines
|
|
24
|
+
cfg = cfg.each_line.reject { |line| line.match /^[\r\n\s\u0000#]+$/ }.join
|
|
25
|
+
cfg.cut_both
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
cfg :telnet, :ssh do
|
|
29
|
+
post_login 'terminal length 0'
|
|
30
|
+
post_login 'terminal width 0'
|
|
31
|
+
pre_logout 'exit'
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
class Riverbed < Oxidized::Model
|
|
2
|
+
using Refinements
|
|
3
|
+
|
|
4
|
+
# Define the prompt
|
|
5
|
+
prompt /^.* *[\w-]+ *[#>] *$/
|
|
6
|
+
|
|
7
|
+
# Define comment character
|
|
8
|
+
comment '! '
|
|
9
|
+
|
|
10
|
+
# Remove sensitive information
|
|
11
|
+
cmd :secret do |cfg|
|
|
12
|
+
cfg.gsub! /^( *tacacs-server (.+ )?key) .+/, '\\1 <secret hidden>'
|
|
13
|
+
cfg.gsub! /^( *username .+ (password|secret) \d) .+/, '\\1 <secret hidden>'
|
|
14
|
+
cfg.gsub! /^( *ntp server .+ key) .+/, '\\1 <secret hidden>'
|
|
15
|
+
cfg.gsub! /^( *ntp peer .+ key) .+/, '\\1 <secret hidden>'
|
|
16
|
+
cfg.gsub! /^( *snmp-server community).*/, '\\1 <configuration removed>'
|
|
17
|
+
cfg.gsub! /^( *ip security shared secret).*/, '\\1 <secret hidden>'
|
|
18
|
+
cfg.gsub! /^( *service shared-secret secret client).*/, '\\1 <secret hidden>'
|
|
19
|
+
cfg.gsub! /^( *service shared-secret secret server).*/, '\\1 <secret hidden>'
|
|
20
|
+
cfg
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Get version information and output it as comments
|
|
24
|
+
cmd 'show version' do |cfg|
|
|
25
|
+
cfg = cfg.cut_both
|
|
26
|
+
|
|
27
|
+
output = ''
|
|
28
|
+
cfg.each_line do |line|
|
|
29
|
+
line.strip!
|
|
30
|
+
output << comment("Product name: #{Regexp.last_match(1)}\n") if line =~ /^Product name:\s+(.*)$/
|
|
31
|
+
output << comment("Product release: #{Regexp.last_match(1)}\n") if line =~ /^Product release:\s+(.*)$/
|
|
32
|
+
output << comment("Build ID: #{Regexp.last_match(1)}\n") if line =~ /^Build ID:\s+(.*)$/
|
|
33
|
+
output << comment("Build date: #{Regexp.last_match(1)}\n") if line =~ /^Build date:\s+(.*)$/
|
|
34
|
+
output << comment("Build arch: #{Regexp.last_match(1)}\n") if line =~ /^Build arch:\s+(.*)$/
|
|
35
|
+
output << comment("Built by: #{Regexp.last_match(1)}\n") if line =~ /^Built by:\s+(.*)$/
|
|
36
|
+
output << comment("Product model: #{Regexp.last_match(1)}\n") if line =~ /^Product model:\s+(.*)$/
|
|
37
|
+
output << comment("Number of CPUs: #{Regexp.last_match(1)}\n") if line =~ /^Number of CPUs:\s+(.*)$/
|
|
38
|
+
end
|
|
39
|
+
output + "\n"
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Get hardware information and output it as comments
|
|
43
|
+
cmd 'show hardware all' do |cfg|
|
|
44
|
+
cfg = cfg.cut_both
|
|
45
|
+
|
|
46
|
+
output = ''
|
|
47
|
+
cfg.each_line do |line|
|
|
48
|
+
line.strip!
|
|
49
|
+
output << comment("Hardware revision: #{Regexp.last_match(1)}\n") if line =~ /^Hardware revision:\s+(.*)$/
|
|
50
|
+
output << comment("Mainboard: #{Regexp.last_match(1)}\n") if line =~ /^Mainboard:\s+(.*)$/
|
|
51
|
+
if line =~ /^Slot (\d+):\s+\.*\s+(.*)$/
|
|
52
|
+
slot_number = Regexp.last_match(1)
|
|
53
|
+
slot_info = Regexp.last_match(2)
|
|
54
|
+
output << comment("Slot #{slot_number}: #{slot_info}\n")
|
|
55
|
+
end
|
|
56
|
+
output << comment("System led: #{Regexp.last_match(1)}\n") if line =~ /^System led:\s+(.*)$/
|
|
57
|
+
end
|
|
58
|
+
output + "\n"
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# Get serial information and output it as comment
|
|
62
|
+
cmd 'show info' do |cfg|
|
|
63
|
+
cfg = cfg.cut_both
|
|
64
|
+
|
|
65
|
+
output = ''
|
|
66
|
+
cfg.each_line do |line|
|
|
67
|
+
line.strip!
|
|
68
|
+
output << comment("Serial: #{Regexp.last_match(1)}\n") if line =~ /^Serial:\s+(.*)$/
|
|
69
|
+
end
|
|
70
|
+
output + "\n"
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# Get the running configuration
|
|
74
|
+
cmd 'show running-config' do |cfg|
|
|
75
|
+
cfg = cfg.cut_both
|
|
76
|
+
|
|
77
|
+
cfg = cfg.each_line.map do |line|
|
|
78
|
+
if line =~ /^(.*##.*?##)(.*)$/
|
|
79
|
+
comment_part = Regexp.last_match(1).strip
|
|
80
|
+
command_part = Regexp.last_match(2).strip
|
|
81
|
+
comment_line = comment(comment_part)
|
|
82
|
+
if command_part.empty?
|
|
83
|
+
comment_line + "\n"
|
|
84
|
+
else
|
|
85
|
+
comment_line + "\n" + command_part + "\n"
|
|
86
|
+
end
|
|
87
|
+
else
|
|
88
|
+
line
|
|
89
|
+
end
|
|
90
|
+
end.join
|
|
91
|
+
|
|
92
|
+
cfg
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# SSH configuration
|
|
96
|
+
cfg :ssh do
|
|
97
|
+
post_login do
|
|
98
|
+
cmd 'enable'
|
|
99
|
+
cmd 'terminal length 0'
|
|
100
|
+
cmd 'terminal width 1024'
|
|
101
|
+
end
|
|
102
|
+
pre_logout 'exit'
|
|
103
|
+
end
|
|
104
|
+
end
|
|
@@ -11,17 +11,17 @@ 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
|
-
cmd '/system
|
|
18
|
-
cfg = cfg.each_line.grep(/(
|
|
17
|
+
cmd '/system resource print' do |cfg|
|
|
18
|
+
cfg = cfg.each_line.grep(/(version|factory-software|total-memory|cpu|cpu-count|total-hdd-space|architecture-name|board-name|platform):/).join
|
|
19
19
|
comment cfg
|
|
20
20
|
end
|
|
21
21
|
|
|
22
|
-
cmd '/system package update print
|
|
23
|
-
version_line = cfg.each_line.grep(/installed-version
|
|
24
|
-
@ros_version =
|
|
22
|
+
cmd '/system package update print' do |cfg|
|
|
23
|
+
version_line = cfg.each_line.grep(/installed-version:\s|current-version:\s/)[0]
|
|
24
|
+
@ros_version = /([0-9])/.match(version_line)[0].to_i
|
|
25
25
|
comment version_line
|
|
26
26
|
end
|
|
27
27
|
|
|
@@ -29,8 +29,12 @@ class RouterOS < Oxidized::Model
|
|
|
29
29
|
comment cfg
|
|
30
30
|
end
|
|
31
31
|
|
|
32
|
+
cmd :significant_changes do |cfg|
|
|
33
|
+
cfg.gsub(/^(#\s+installed-version: [^\n]+\n).*?^(?=# software id)/m, '\1')
|
|
34
|
+
end
|
|
35
|
+
|
|
32
36
|
post do
|
|
33
|
-
|
|
37
|
+
logger.debug "Running /export for routeros version #{@ros_version}"
|
|
34
38
|
run_cmd = if vars(:remove_secret)
|
|
35
39
|
'/export hide-sensitive'
|
|
36
40
|
elsif (not @ros_version.nil?) && (@ros_version >= 7)
|
|
@@ -40,12 +44,15 @@ class RouterOS < Oxidized::Model
|
|
|
40
44
|
end
|
|
41
45
|
cmd run_cmd do |cfg|
|
|
42
46
|
cfg.gsub! /\\\r?\n\s+/, '' # strip new line
|
|
43
|
-
cfg.gsub!
|
|
47
|
+
cfg.gsub! "# inactive time\r\n", '' # Remove time based system comment
|
|
44
48
|
cfg.gsub! /# received packet from \S+ bad format\r\n/, '' # Remove intermittent VRRP/CARP collision comment
|
|
45
|
-
cfg.gsub!
|
|
46
|
-
cfg.gsub!
|
|
49
|
+
cfg.gsub! "# poe-out status: short_circuit\r\n", '' # Remove intermittent POE short_circuit comment
|
|
50
|
+
cfg.gsub! "# Firmware upgraded successfully, please reboot for changes to take effect!\r\n", '' # Remove transient firmware upgrade comment
|
|
47
51
|
cfg.gsub! /# \S+ not ready\r\n/, '' # Remove intermittent $interface not ready comment
|
|
48
|
-
cfg
|
|
52
|
+
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)
|
|
53
|
+
cfg = cfg.split("\n")
|
|
54
|
+
cfg.reject! { |line| line[/^#\s\w{3}\/\d{2}\/\d{4}.*$/] } # Remove date time and 'by RouterOS' comment (v6)
|
|
55
|
+
cfg.reject! { |line| line[/^#\s\d{4}-\d{2}-\d{2}.*$/] } # Remove date time and 'by RouterOS' comment (v7)
|
|
49
56
|
cfg.join("\n") + "\n"
|
|
50
57
|
end
|
|
51
58
|
end
|
data/lib/oxidized/model/saos.rb
CHANGED
|
@@ -4,12 +4,29 @@ class SAOS < Oxidized::Model
|
|
|
4
4
|
# Ciena SAOS switch
|
|
5
5
|
# used for 6.x devices
|
|
6
6
|
|
|
7
|
-
comment
|
|
7
|
+
comment '! '
|
|
8
|
+
prompt /^[\w-]+\*?>\s?/
|
|
8
9
|
|
|
9
10
|
cmd :all do |cfg|
|
|
11
|
+
cfg.gsub! /(Waiting for )(accounting|authorization).*\n/, '' # Remove TACACS errors
|
|
10
12
|
cfg.cut_both
|
|
11
13
|
end
|
|
12
14
|
|
|
15
|
+
cmd 'chassis show device-id power' do |cfg|
|
|
16
|
+
comment cfg
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
cmd 'software show' do |cfg|
|
|
20
|
+
cfg.gsub! /^\| Bank status.*/, '| Bank status : <removed> |'
|
|
21
|
+
comment cfg
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
cmd 'port xcvr show' do |cfg|
|
|
25
|
+
cfg.gsub! /^SHELL PARSER FAILURE.*/, '' # Ignore command failure
|
|
26
|
+
cfg.gsub! /(\s\|.{10}\|)(Ena\s\s|\s\sDis|UCTF\s)(.*)/, '\1 \3' # Remove transient operational state
|
|
27
|
+
comment cfg
|
|
28
|
+
end
|
|
29
|
+
|
|
13
30
|
cmd 'configuration show' do |cfg|
|
|
14
31
|
cfg.gsub! /^! Created: [^\n]*\n/, ''
|
|
15
32
|
cfg.gsub! /^! On terminal: [^\n]*\n/, ''
|
|
@@ -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
|
data/lib/oxidized/model/siklu.rb
CHANGED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
class SikluMHTG < Oxidized::Model
|
|
2
|
+
using Refinements
|
|
3
|
+
|
|
4
|
+
# Siklu MultiHaul TG#
|
|
5
|
+
# Requires source to define the model as SikluMHTG #
|
|
6
|
+
|
|
7
|
+
prompt /^\r?MH-[TN]\d{3}@\w{2,8}>$/
|
|
8
|
+
|
|
9
|
+
expect /--More--/ do |data, re|
|
|
10
|
+
send ' '
|
|
11
|
+
data.sub re, ''
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
cmd 'show startup' do |cfg|
|
|
15
|
+
cfg.gsub! /[\b]|\e\[A|\e\[2K/, ''
|
|
16
|
+
cfg.cut_both
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
cfg :ssh do
|
|
20
|
+
pre_logout 'quit'
|
|
21
|
+
end
|
|
22
|
+
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
|
data/lib/oxidized/model/slxos.rb
CHANGED
|
@@ -14,9 +14,9 @@ class SLXOS < Oxidized::Model
|
|
|
14
14
|
cmd 'show chassis' do |cfg|
|
|
15
15
|
cfg.encode!("UTF-8", invalid: :replace, undef: :replace) # sometimes ironware returns broken encoding
|
|
16
16
|
cfg.gsub! /.*Power Usage.*/, '' # remove unwanted lines power usage
|
|
17
|
-
cfg.gsub! /^Update
|
|
17
|
+
cfg.gsub! /^Update:.*$/, '' # remove unwanted current date
|
|
18
18
|
cfg.gsub! /Time A(live|wake).*/, '' # remove unwanted lines time alive/awake
|
|
19
|
-
cfg.gsub! /(
|
|
19
|
+
cfg.gsub! /(\[*)1(\]*)<->(\[*)2(\]*)(<->(\[*)3(\]*))*/, ''
|
|
20
20
|
|
|
21
21
|
comment cfg
|
|
22
22
|
end
|
|
@@ -31,7 +31,7 @@ class SLXOS < Oxidized::Model
|
|
|
31
31
|
|
|
32
32
|
cmd 'show slots' do |cfg|
|
|
33
33
|
cfg.gsub! /^-*^$/, '' # some slx devices are fixed config
|
|
34
|
-
cfg.gsub!
|
|
34
|
+
cfg.gsub! "syntax error: element does not exist", '' # same as above
|
|
35
35
|
|
|
36
36
|
comment cfg
|
|
37
37
|
end
|