oxidized 0.30.1 → 0.32.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/ruby.yml +3 -4
- data/.github/workflows/stale.yml +4 -2
- data/.rubocop.yml +18 -3
- data/.rubocop_todo.yml +4 -11
- data/CHANGELOG.md +93 -1
- data/CONTRIBUTING.md +5 -0
- data/Dockerfile +84 -20
- data/README.md +5 -21
- data/Rakefile +31 -2
- data/docs/Configuration.md +50 -14
- data/docs/Creating-Models.md +75 -4
- data/docs/DeviceSimulation.md +184 -0
- data/docs/Hooks.md +39 -5
- data/docs/Issues.md +97 -0
- data/docs/Model-Notes/APC_AOS.md +29 -16
- data/docs/Model-Notes/Cumulus.md +5 -0
- data/docs/Model-Notes/FSOS.md +6 -0
- data/docs/Model-Notes/FortiOS.md +21 -5
- data/docs/Model-Notes/HPEAruba.md +31 -0
- data/docs/Model-Notes/OS6.md +10 -0
- data/docs/Model-Notes/RouterOS.md +15 -0
- data/docs/Model-Notes/SikluMHTG.md +7 -0
- data/docs/ModelUnitTests.md +186 -0
- data/docs/Outputs.md +2 -0
- data/docs/Release.md +18 -15
- data/docs/Sources.md +21 -0
- data/docs/Supported-OS-Types.md +14 -7
- data/docs/Troubleshooting.md +35 -0
- data/examples/podman-compose/Makefile +59 -17
- data/examples/podman-compose/README.md +63 -27
- data/examples/podman-compose/docker-compose.yml +11 -2
- data/examples/podman-compose/gitserver/.gitignore +1 -0
- data/examples/podman-compose/gitserver/Dockerfile +14 -0
- data/examples/podman-compose/model-simulation/Dockerfile-model +1 -1
- data/examples/podman-compose/model-simulation/asternos.sh +2 -0
- data/examples/podman-compose/oxidized-config/.gitignore +2 -0
- data/examples/podman-compose/oxidized-config/config +1 -1
- data/examples/podman-compose/oxidized-config/config_csv-file +46 -0
- data/examples/podman-compose/oxidized-config/config_csv-gitserver +56 -0
- data/examples/podman-compose/oxidized-ssh/.gitignore +1 -0
- data/extra/device2yaml.rb +245 -0
- data/extra/gitdiff-msteams.sh +32 -5
- data/extra/nagios_check_failing_nodes.rb +1 -1
- data/extra/rest_client.rb +1 -1
- data/lib/oxidized/config.rb +8 -2
- data/lib/oxidized/hook/githubrepo.rb +37 -7
- data/lib/oxidized/hook/slackdiff.rb +29 -7
- data/lib/oxidized/input/http.rb +1 -0
- data/lib/oxidized/input/ssh.rb +13 -5
- data/lib/oxidized/input/telnet.rb +1 -1
- data/lib/oxidized/manager.rb +17 -16
- data/lib/oxidized/model/aos7.rb +2 -0
- data/lib/oxidized/model/aoscx.rb +16 -2
- data/lib/oxidized/model/aosw.rb +8 -2
- data/lib/oxidized/model/apc_aos.rb +1 -1
- data/lib/oxidized/model/arubainstant.rb +90 -0
- data/lib/oxidized/model/asa.rb +2 -1
- data/lib/oxidized/model/asyncos.rb +1 -1
- data/lib/oxidized/model/audiocodes.rb +2 -2
- data/lib/oxidized/model/cnos.rb +13 -10
- data/lib/oxidized/model/cumulus.rb +19 -2
- data/lib/oxidized/model/dlink.rb +1 -0
- data/lib/oxidized/model/dlinknextgen.rb +3 -0
- data/lib/oxidized/model/edgecos.rb +2 -1
- data/lib/oxidized/model/enterprise_sonic.rb +46 -0
- data/lib/oxidized/model/eos.rb +2 -0
- data/lib/oxidized/model/f5os.rb +17 -0
- data/lib/oxidized/model/firewareos.rb +10 -1
- data/lib/oxidized/model/fortios.rb +24 -1
- data/lib/oxidized/model/fsos.rb +5 -1
- data/lib/oxidized/model/garderos.rb +43 -0
- data/lib/oxidized/model/h3c.rb +1 -1
- data/lib/oxidized/model/ibos.rb +1 -0
- data/lib/oxidized/model/ios.rb +20 -12
- data/lib/oxidized/model/iosxr.rb +1 -1
- data/lib/oxidized/model/junos.rb +1 -1
- data/lib/oxidized/model/kornfeldos.rb +33 -0
- data/lib/oxidized/model/lenovonos.rb +2 -0
- data/lib/oxidized/model/linuxgeneric.rb +1 -1
- data/lib/oxidized/model/model.rb +2 -2
- data/lib/oxidized/model/netgear.rb +1 -1
- data/lib/oxidized/model/nodegrid.rb +1 -1
- data/lib/oxidized/model/nsxdfw.rb +30 -0
- data/lib/oxidized/model/nxos.rb +2 -1
- data/lib/oxidized/model/os6.rb +48 -0
- data/lib/oxidized/model/rgos.rb +1 -1
- data/lib/oxidized/model/riverbed.rb +104 -0
- data/lib/oxidized/model/routeros.rb +2 -2
- data/lib/oxidized/model/saos.rb +18 -1
- data/lib/oxidized/model/siklumhtg.rb +22 -0
- data/lib/oxidized/model/sonicos.rb +8 -2
- data/lib/oxidized/model/tplink.rb +1 -0
- data/lib/oxidized/model/uplinkolt.rb +46 -0
- data/lib/oxidized/model/vyatta.rb +2 -2
- data/lib/oxidized/model/xos.rb +7 -0
- data/lib/oxidized/node.rb +30 -18
- data/lib/oxidized/nodes.rb +13 -5
- data/lib/oxidized/output/file.rb +45 -42
- data/lib/oxidized/output/git.rb +185 -160
- data/lib/oxidized/output/gitcrypt.rb +188 -186
- data/lib/oxidized/output/http.rb +53 -51
- data/lib/oxidized/output/output.rb +6 -4
- data/lib/oxidized/source/csv.rb +44 -49
- data/lib/oxidized/source/http.rb +63 -81
- data/lib/oxidized/source/jsonfile.rb +63 -0
- data/lib/oxidized/source/source.rb +73 -18
- data/lib/oxidized/source/sql.rb +66 -59
- data/lib/oxidized/version.rb +2 -2
- data/oxidized.gemspec +25 -18
- metadata +115 -21
@@ -1,7 +1,19 @@
|
|
1
1
|
class Cumulus < Oxidized::Model
|
2
2
|
using Refinements
|
3
3
|
|
4
|
-
|
4
|
+
# Remove ANSI escape codes
|
5
|
+
expect /\e\[[0-?]*[ -\/]*[@-~]\r?/ do |data, re|
|
6
|
+
data.gsub re, ''
|
7
|
+
end
|
8
|
+
|
9
|
+
# The prompt contains ANSI escape codes, which have already been removed
|
10
|
+
# from the expect call above
|
11
|
+
# ^ : match begin of line, to have the most specific prompt
|
12
|
+
# [\w.-]+@[\w.-]+ : user@hostname
|
13
|
+
# (:mgmt)? : optional when logged in out of band
|
14
|
+
# :~[#$] $ : end of prompt, containing the linux path,
|
15
|
+
# which is always "~" in our context
|
16
|
+
prompt /^[\w.-]+@[\w.-]+(:mgmt)?:~[#$] $/
|
5
17
|
comment '# '
|
6
18
|
|
7
19
|
# add a comment in the final conf
|
@@ -21,9 +33,12 @@ class Cumulus < Oxidized::Model
|
|
21
33
|
# show the persistent configuration
|
22
34
|
pre do
|
23
35
|
use_nclu = vars(:cumulus_use_nclu) || false
|
36
|
+
use_nvue = vars(:cumulus_use_nvue) || false
|
24
37
|
|
25
38
|
if use_nclu
|
26
39
|
cfg = cmd 'net show configuration commands'
|
40
|
+
elsif use_nvue
|
41
|
+
cfg = cmd 'nv config show --color off'
|
27
42
|
else
|
28
43
|
# Set FRR or Quagga in config
|
29
44
|
routing_daemon = vars(:cumulus_routing_daemon) ? vars(:cumulus_routing_daemon).downcase : 'quagga'
|
@@ -76,7 +91,9 @@ class Cumulus < Oxidized::Model
|
|
76
91
|
cfg += cmd 'cat /etc/cumulus/switchd.conf'
|
77
92
|
|
78
93
|
cfg += add_comment 'PORTS'
|
79
|
-
|
94
|
+
# in some configurations, ports.conf has no trailing Line Feed,
|
95
|
+
# which breaks the prompt, so we add one
|
96
|
+
cfg += cmd "cat /etc/cumulus/ports.conf; echo"
|
80
97
|
|
81
98
|
cfg += add_comment 'TRAFFIC'
|
82
99
|
cfg += cmd 'cat /etc/cumulus/datapath/traffic.conf'
|
data/lib/oxidized/model/dlink.rb
CHANGED
@@ -35,6 +35,9 @@ class DlinkNextGen < Oxidized::Model
|
|
35
35
|
cmd 'show running-config' do |cfg|
|
36
36
|
cfg.gsub! /^(snmp-server community ["\w]+) \S+/, '\\1 <removed>'
|
37
37
|
cfg.gsub! /^(username [\w.@-]+ privilege \d{1,2} password \d{1,2}) \S+/, '\\1 <removed>'
|
38
|
+
cfg.gsub! /^(!System Up Time).*/, '\\1 <removed>'
|
39
|
+
cfg.gsub! /^(!Current SNTP Synchronized Time:).*/, '\\1 <removed>'
|
40
|
+
cfg.gsub! /^(\s+ppp (chap|pap) password \d) .+/, '\\1 <secret hidden>'
|
38
41
|
cfg
|
39
42
|
end
|
40
43
|
|
@@ -31,7 +31,8 @@ class EdgeCOS < Oxidized::Model
|
|
31
31
|
|
32
32
|
cmd 'show system' do |cfg|
|
33
33
|
cfg.gsub! /^.*\sUp Time\s*:.*\n/i, ''
|
34
|
-
cfg.gsub!
|
34
|
+
cfg.gsub! /(\sTemperature \d*:)\s*\d+ degrees/, '\\1 <temperature values hidden>'
|
35
|
+
cfg.gsub! /^!?\s*Fan \d+ speed:\s+\d+ rpm\s+Fan \d+ speed:\s+\d+ rpm\s+Fan \d+ speed:\s+\d+ rpm$/, '<fan speeds hidden>'
|
35
36
|
comment cfg
|
36
37
|
end
|
37
38
|
|
@@ -0,0 +1,46 @@
|
|
1
|
+
class Enterprise_SONiC < Oxidized::Model # rubocop:disable Naming/ClassAndModuleCamelCase
|
2
|
+
using Refinements
|
3
|
+
|
4
|
+
# Remove ANSI escape codes
|
5
|
+
expect /\e\[[0-?]*[ -\/]*[@-~]\r?/ do |data, re|
|
6
|
+
data.gsub re, ''
|
7
|
+
end
|
8
|
+
|
9
|
+
# Matches both sonic-cli and linux terminal
|
10
|
+
prompt /^(?:[\w.-]+@[\w.-]+:[~\w\/-]+\$|[\w.-]+#)\s*/
|
11
|
+
comment "# "
|
12
|
+
|
13
|
+
def add_comment(comment)
|
14
|
+
"\n##### #{comment} #####\n"
|
15
|
+
end
|
16
|
+
|
17
|
+
post do
|
18
|
+
cmd 'show running-configuration' do |cfg|
|
19
|
+
add_comment('CONFIGURATION') + cfg
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
cmd 'show version' do |cfg|
|
24
|
+
cfg = cfg.each_line.reject { |line| line.match /Uptime/ }.join
|
25
|
+
add_comment('VERSION') + cfg
|
26
|
+
end
|
27
|
+
|
28
|
+
cmd 'show platform syseeprom' do |cfg|
|
29
|
+
add_comment('SYSEEPROM') + cfg
|
30
|
+
end
|
31
|
+
|
32
|
+
cmd :all do |cfg|
|
33
|
+
cfg.cut_both
|
34
|
+
end
|
35
|
+
|
36
|
+
cfg :ssh do
|
37
|
+
# if user logs in to linux == has admin rights
|
38
|
+
if vars(:admin) == true
|
39
|
+
post_login do
|
40
|
+
cmd "sonic-cli\n"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
post_login 'terminal length 0'
|
44
|
+
pre_logout 'exit'
|
45
|
+
end
|
46
|
+
end
|
data/lib/oxidized/model/eos.rb
CHANGED
@@ -18,7 +18,9 @@ class EOS < Oxidized::Model
|
|
18
18
|
cfg.gsub! /^(enable (?:secret|password)).*/, '\\1 <configuration removed>'
|
19
19
|
cfg.gsub! /^(service unsupported-transceiver).*/, '\\1 <license key removed>'
|
20
20
|
cfg.gsub! /^(tacacs-server key \d+).*/, '\\1 <configuration removed>'
|
21
|
+
cfg.gsub! /^(radius-server .+ key \d) \S+/, '\\1 <radius secret hidden>'
|
21
22
|
cfg.gsub! /( {6}key) (\h+ 7) (\h+).*/, '\\1 <secret hidden>'
|
23
|
+
cfg.gsub! /(localized|auth (md5|sha\d{0,3})|priv (des|aes\d{0,3})) \S+/, '\\1 <secret hidden>'
|
22
24
|
cfg
|
23
25
|
end
|
24
26
|
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class F5OS < Oxidized::Model
|
4
|
+
# F5OS Model #
|
5
|
+
|
6
|
+
comment '!'
|
7
|
+
prompt(/^([\w.@()-]+ ?[#>]\s+)$/)
|
8
|
+
|
9
|
+
cmd 'show running-config'
|
10
|
+
|
11
|
+
cfg :ssh do
|
12
|
+
post_login do
|
13
|
+
cmd 'paginate false'
|
14
|
+
end
|
15
|
+
pre_logout 'exit'
|
16
|
+
end
|
17
|
+
end
|
@@ -1,7 +1,16 @@
|
|
1
1
|
class FirewareOS < Oxidized::Model
|
2
2
|
using Refinements
|
3
3
|
|
4
|
-
|
4
|
+
# matched prompts:
|
5
|
+
# [FAULT]WG<managed-by-wsm><master>>
|
6
|
+
# WG<managed-by-wsm><master>>
|
7
|
+
# WG<managed-by-wsm>>
|
8
|
+
# [FAULT]WG<non-master>>
|
9
|
+
# [FAULT]WG>
|
10
|
+
# WG>
|
11
|
+
|
12
|
+
prompt /^\[?\w*\]?\w*?(?:<[\w-]+>)*(#|>)\s*$/
|
13
|
+
|
5
14
|
comment '-- '
|
6
15
|
|
7
16
|
cmd :all do |cfg|
|
@@ -22,6 +22,8 @@ class FortiOS < Oxidized::Model
|
|
22
22
|
end
|
23
23
|
|
24
24
|
cmd :secret do |cfg|
|
25
|
+
# Remove private key for encrypted configs
|
26
|
+
cfg.gsub! /^(\#private-encryption-key=).+/, '\\1 <configuration removed>'
|
25
27
|
# ENC indicates an encrypted password, and secret indicates a secret string
|
26
28
|
cfg.gsub! /(set .+ ENC) .+/, '\\1 <configuration removed>'
|
27
29
|
cfg.gsub! /(set .*secret) .+/, '\\1 <configuration removed>'
|
@@ -73,10 +75,31 @@ class FortiOS < Oxidized::Model
|
|
73
75
|
|
74
76
|
cfg << cmd('end') if @vdom_enabled
|
75
77
|
|
76
|
-
|
78
|
+
# Different OS have different commands - we use the first that works
|
79
|
+
# - For fortigate > 7 and possibly earlier versions, we use:
|
80
|
+
# show | grep . # backup as in fortigate GUI
|
81
|
+
# show full-configuration | grep . # bakup including default values
|
82
|
+
# | grep is used to avoid the --More-- prompt
|
83
|
+
# - It is not documented which systems need the commands without | grep:
|
84
|
+
# show full-configuration
|
85
|
+
# show
|
86
|
+
# Document it here and make a PR on github if you know!
|
87
|
+
# By default, we use the configuration without default values
|
88
|
+
# If fullconfig: true is set in the configuration, we get the full config
|
89
|
+
commandlist = if vars(:fullconfig)
|
90
|
+
['show full-configuration | grep .',
|
91
|
+
'show full-configuration', 'show']
|
92
|
+
else
|
93
|
+
['show | grep .',
|
94
|
+
'show full-configuration', 'show']
|
95
|
+
end
|
96
|
+
|
97
|
+
commandlist.each do |fullcmd|
|
77
98
|
fullcfg = cmd(fullcmd)
|
78
99
|
next if fullcfg.lines[1..3].join =~ /(Parsing error at|command parse error)/ # Don't show for unsupported devices (e.g. FortiAnalyzer, FortiManager, FortiMail)
|
79
100
|
|
101
|
+
fullcfg.gsub! /(set comments "Error \(No order (found )?for (account )?ID \d+\) on).*/, '\\1 <stripped>"'
|
102
|
+
|
80
103
|
cfg << fullcfg
|
81
104
|
break
|
82
105
|
end
|
data/lib/oxidized/model/fsos.rb
CHANGED
@@ -2,6 +2,7 @@ class FSOS < Oxidized::Model
|
|
2
2
|
# Fiberstore / fs.com
|
3
3
|
using Refinements
|
4
4
|
comment '! '
|
5
|
+
prompt /^([\w.@()-]+[#>]\s?)$/
|
5
6
|
|
6
7
|
# Handle paging
|
7
8
|
expect /^ --More--.*$/ do |data, re|
|
@@ -13,6 +14,9 @@ class FSOS < Oxidized::Model
|
|
13
14
|
cfg.gsub! /(secret \w+) (\S+).*/, '\\1 <secret hidden>'
|
14
15
|
cfg.gsub! /(password \d+) (\S+).*/, '\\1 <secret hidden>'
|
15
16
|
cfg.gsub! /(snmp-server community \d+) (\S+).*/, '\\1 <secret hidden>'
|
17
|
+
cfg.gsub! /^(snmp-server host \S+( udp-port \d+)?( permit|deny \d+)?( informs?)?( traps?)?(( version v3 (priv|auth|noauth))|( version (v1|v2c))?)) +\S+( .*)?$*/, '\\1 <secret hidden>'
|
18
|
+
cfg.gsub! /^(snmp-server user \S+ \S+ v3( priv (des|aes128|aes256|aes256-c))?( auth (md5|sha|sha256) \d+)) +\S+( .*)?$*/, '\\1 <secret hidden>'
|
19
|
+
cfg.gsub! /^(.*key \d+) (\S+).*/, '\\1 <secret hidden>'
|
16
20
|
cfg
|
17
21
|
end
|
18
22
|
|
@@ -37,7 +41,7 @@ class FSOS < Oxidized::Model
|
|
37
41
|
cfg :telnet, :ssh do
|
38
42
|
post_login 'enable'
|
39
43
|
post_login 'terminal length 0'
|
40
|
-
post_login 'terminal width
|
44
|
+
post_login 'terminal width 512'
|
41
45
|
pre_logout 'exit'
|
42
46
|
pre_logout 'exit'
|
43
47
|
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
class Garderos < Oxidized::Model
|
2
|
+
using Refinements
|
3
|
+
# Garderos GmbH https://www.garderos.com/
|
4
|
+
# Routers for harsh environments
|
5
|
+
# grs = Garderos Router Software
|
6
|
+
|
7
|
+
# Remove ANSI escape codes
|
8
|
+
expect /\e\[[0-?]*[ -\/]*[@-~]\r?/ do |data, re|
|
9
|
+
data.gsub re, ''
|
10
|
+
end
|
11
|
+
|
12
|
+
# the prompt does not need to match escape codes, as they have been removed above
|
13
|
+
prompt /[\w-]+# /
|
14
|
+
comment '# '
|
15
|
+
|
16
|
+
cmd :all do |cfg|
|
17
|
+
# Remove the echo of the entered command and the prompt after it
|
18
|
+
cfg.cut_both
|
19
|
+
end
|
20
|
+
|
21
|
+
cmd 'show system version' do |cfg|
|
22
|
+
comment "#{cfg}\n"
|
23
|
+
end
|
24
|
+
|
25
|
+
cmd 'show system serial' do |cfg|
|
26
|
+
comment "#{cfg}\n"
|
27
|
+
end
|
28
|
+
|
29
|
+
# If we have a radio modem installed, we'd like to list the SIM Card
|
30
|
+
cmd 'show hardware wwan wwan0 sim' do |cfg|
|
31
|
+
if cfg.start_with? 'Unknown command'
|
32
|
+
String.new('')
|
33
|
+
else
|
34
|
+
comment "#{cfg}\n"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
cmd 'show configuration running'
|
39
|
+
|
40
|
+
cfg :ssh do
|
41
|
+
pre_logout 'exit'
|
42
|
+
end
|
43
|
+
end
|
data/lib/oxidized/model/h3c.rb
CHANGED
data/lib/oxidized/model/ibos.rb
CHANGED
data/lib/oxidized/model/ios.rb
CHANGED
@@ -27,23 +27,29 @@ class IOS < Oxidized::Model
|
|
27
27
|
|
28
28
|
cmd :secret do |cfg|
|
29
29
|
cfg.gsub! /^(snmp-server community).*/, '\\1 <configuration removed>'
|
30
|
-
cfg.gsub! /^(snmp-server host \S+( vrf \S+)?( informs?)?( version (1|2c
|
30
|
+
cfg.gsub! /^(snmp-server host \S+( vrf \S+)?( informs?)?( version (1|2c))?) +\S+( .*)?$*/, '\\1 <secret hidden>\\6'
|
31
31
|
cfg.gsub! /^(username .+ (password|secret) \d) .+/, '\\1 <secret hidden>'
|
32
32
|
cfg.gsub! /^(enable (password|secret)( level \d+)? \d) .+/, '\\1 <secret hidden>'
|
33
|
-
cfg.gsub! /^(
|
33
|
+
cfg.gsub! /^( +(?:password|secret)) (?:\d )?\S+/, '\\1 <secret hidden>'
|
34
34
|
cfg.gsub! /^(.*wpa-psk ascii \d) (\S+)/, '\\1 <secret hidden>'
|
35
35
|
cfg.gsub! /^(.*key 7) (\d.+)/, '\\1 <secret hidden>'
|
36
36
|
cfg.gsub! /^(tacacs-server (.+ )?key) .+/, '\\1 <secret hidden>'
|
37
37
|
cfg.gsub! /^(crypto isakmp key) (\S+) (.*)/, '\\1 <secret hidden> \\3'
|
38
|
-
cfg.gsub! /^(
|
39
|
-
cfg.gsub! /^(
|
40
|
-
cfg.gsub! /^(
|
41
|
-
cfg.gsub! /^(
|
42
|
-
cfg.gsub! /^(
|
43
|
-
cfg.gsub! /^(
|
44
|
-
cfg.gsub! /^(
|
45
|
-
cfg.gsub! /^((tacacs|radius) server [^\n]+\n(
|
46
|
-
cfg.gsub! /^(
|
38
|
+
cfg.gsub! /^( +ip ospf message-digest-key \d+ md5) .+/, '\\1 <secret hidden>'
|
39
|
+
cfg.gsub! /^( +ip ospf authentication-key) .+/, '\\1 <secret hidden>'
|
40
|
+
cfg.gsub! /^( +neighbor \S+ password) .+/, '\\1 <secret hidden>'
|
41
|
+
cfg.gsub! /^( +vrrp \d+ authentication text) .+/, '\\1 <secret hidden>'
|
42
|
+
cfg.gsub! /^( +standby \d+ authentication) .{1,8}$/, '\\1 <secret hidden>'
|
43
|
+
cfg.gsub! /^( +standby \d+ authentication md5 key-string) .+?( timeout \d+)?$/, '\\1 <secret hidden> \\2'
|
44
|
+
cfg.gsub! /^( +key-string) .+/, '\\1 <secret hidden>'
|
45
|
+
cfg.gsub! /^((tacacs|radius) server [^\n]+\n( +[^\n]+\n)* +key) [^\n]+$/m, '\1 <secret hidden>'
|
46
|
+
cfg.gsub! /^( +ppp (chap|pap) password \d) .+/, '\\1 <secret hidden>'
|
47
|
+
cfg.gsub! /^( +security wpa psk set-key (?:ascii|hex) \d) (.*)$/, '\\1 <secret hidden>'
|
48
|
+
cfg.gsub! /^( +dot1x username \S+ password \d) (.*)$/, '\\1 <secret hidden>'
|
49
|
+
cfg.gsub! /^( +mgmtuser username \S+ password \d) (.*) (secret \d) (.*)$/, '\\1 <secret hidden> \\3 <secret hidden>'
|
50
|
+
cfg.gsub! /^( +client \S+ server-key \d) (.*)$/, '\\1 <secret hidden>'
|
51
|
+
cfg.gsub! /^( +domain-password) \S+ ?(.*)/, '\\1 <secret hidden> \\2'
|
52
|
+
cfg.gsub! /^( +pre-shared-key).*/, '\\1 <configuration removed>'
|
47
53
|
cfg
|
48
54
|
end
|
49
55
|
|
@@ -74,7 +80,7 @@ class IOS < Oxidized::Model
|
|
74
80
|
|
75
81
|
comments << "Memory: pcmcia #{Regexp.last_match(2)} #{Regexp.last_match(3)}#{Regexp.last_match(4)} #{Regexp.last_match(1)}" if line =~ /^(\d+[kK]) bytes of (Flash|ATA)?.*PCMCIA .*(slot|disk) ?(\d)/i
|
76
82
|
|
77
|
-
if line =~ /(\S+(?:\sseries)?)\s+(?:\((\S+)\)\s+processor|\(revision[^)]+\)).*\s+with (\S+k) bytes/i
|
83
|
+
if line =~ /(\S+(?:\sseries)?)\s+(?:\(([\S ]+)\)\s+processor|\(revision[^)]+\)).*\s+with (\S+k) bytes/i
|
78
84
|
sproc = Regexp.last_match(1)
|
79
85
|
cpu = Regexp.last_match(2)
|
80
86
|
mem = Regexp.last_match(3)
|
@@ -118,6 +124,8 @@ class IOS < Oxidized::Model
|
|
118
124
|
cfg.gsub! /^ tunnel mpls traffic-eng bandwidth[^\n]*\n*(
|
119
125
|
(?: [^\n]*\n*)*
|
120
126
|
tunnel mpls traffic-eng auto-bw)/mx, '\1'
|
127
|
+
# get rid of values of custom SNMP OID's
|
128
|
+
cfg.gsub! /^(\s+expression) \d+$/, '\\1 <value removed>'
|
121
129
|
cfg
|
122
130
|
end
|
123
131
|
end
|
data/lib/oxidized/model/iosxr.rb
CHANGED
data/lib/oxidized/model/junos.rb
CHANGED
@@ -0,0 +1,33 @@
|
|
1
|
+
class KornfeldOS < Oxidized::Model
|
2
|
+
using Refinements
|
3
|
+
|
4
|
+
# For switches running Kornfeld OS
|
5
|
+
#
|
6
|
+
# Tested with : Kornfeld D1156 and Kornfeld D2132
|
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 'show version | except REPOSITORY | except docker | except Uptime' do |cfg|
|
16
|
+
comment cfg
|
17
|
+
end
|
18
|
+
|
19
|
+
cmd 'show platform firmware' do |cfg|
|
20
|
+
comment cfg
|
21
|
+
end
|
22
|
+
|
23
|
+
cmd 'show running-configuration' do |cfg|
|
24
|
+
cfg.each_line.to_a[0..-1].join
|
25
|
+
end
|
26
|
+
|
27
|
+
cfg :ssh do
|
28
|
+
username /^Login:/
|
29
|
+
password /^Password:/
|
30
|
+
post_login 'terminal length 0'
|
31
|
+
pre_logout 'exit'
|
32
|
+
end
|
33
|
+
end
|
@@ -42,6 +42,7 @@ class LenovoNOS < Oxidized::Model
|
|
42
42
|
cfg = cfg.reject { |line| line.match /^Last boot:/ }
|
43
43
|
cfg = cfg.reject { |line| line.match /^Temperature / }
|
44
44
|
cfg = cfg.reject { |line| line.match /^Power Consumption/ }
|
45
|
+
cfg = cfg.reject { |line| line.match /^Fan/ }
|
45
46
|
|
46
47
|
cfg = cfg.join
|
47
48
|
comment_ext("=== show version ===", cfg)
|
@@ -63,6 +64,7 @@ class LenovoNOS < Oxidized::Model
|
|
63
64
|
cfg.gsub! /^Current configuration:[^\n]*\n/, ''
|
64
65
|
if vars(:remove_unstable_lines) == true
|
65
66
|
cfg.gsub! /(.* password )"[0-9a-f]+"(.*)/, '\\1<unstable line hidden>\\2'
|
67
|
+
cfg.gsub! /(.* administrator-password )"[0-9a-f]+"(.*)/, '\\1<unstable line hidden>\\2'
|
66
68
|
cfg.gsub! /(.*ekey )"[0-9a-f]+"(.*)/, '\\1<unstable line hidden>\\2'
|
67
69
|
end
|
68
70
|
cfg
|
data/lib/oxidized/model/model.rb
CHANGED
@@ -184,7 +184,7 @@ module Oxidized
|
|
184
184
|
end
|
185
185
|
|
186
186
|
def comment(str)
|
187
|
-
data = ''
|
187
|
+
data = String.new('')
|
188
188
|
str.each_line do |line|
|
189
189
|
data << self.class.comment << line
|
190
190
|
end
|
@@ -202,7 +202,7 @@ module Oxidized
|
|
202
202
|
# Also, XML Comments must not contain --. So we put a space between
|
203
203
|
# any double hyphens, by replacing any - that is followed by another -
|
204
204
|
# with '- '
|
205
|
-
data = ''
|
205
|
+
data = String.new('')
|
206
206
|
str.each_line do |_line|
|
207
207
|
data << '<!-- ' << str.gsub(/-(?=-)/, '- ').chomp << " -->\n"
|
208
208
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
class NSXDfw < Oxidized::Model
|
3
|
+
using Refinements
|
4
|
+
|
5
|
+
cmd "/policy/api/v1/infra/domains/" do |cfg|
|
6
|
+
domains = JSON.parse(cfg.encode('UTF-8', { invalid: :replace, undef: :replace, replace: '?' }))["results"]
|
7
|
+
domain_config = {}
|
8
|
+
domains.each do |domain|
|
9
|
+
domain_config[domain['id']] = {}
|
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"]
|
12
|
+
policies_config = {}
|
13
|
+
policies.each do |policy|
|
14
|
+
rules_data = cmd "/policy/api/v1/infra/domains/#{domain['id']}/security-policies/#{policy['id']}/rules"
|
15
|
+
rules = JSON.parse(rules_data.encode('UTF-8', { invalid: :replace, undef: :replace, replace: '?' }))["results"]
|
16
|
+
policies_config[policy['id']] = rules
|
17
|
+
end
|
18
|
+
domain_config[domain['id']] = policies_config
|
19
|
+
end
|
20
|
+
JSON.pretty_generate(domain_config)
|
21
|
+
end
|
22
|
+
|
23
|
+
cfg :http do
|
24
|
+
@username = @node.auth[:username]
|
25
|
+
@password = @node.auth[:password]
|
26
|
+
@headers['Content-Type'] = 'application/json'
|
27
|
+
@headers['Accept'] = 'application/json'
|
28
|
+
@secure = true
|
29
|
+
end
|
30
|
+
end
|
data/lib/oxidized/model/nxos.rb
CHANGED
@@ -13,8 +13,9 @@ class NXOS < Oxidized::Model
|
|
13
13
|
cfg.gsub! /^(snmp-server community).*/, '\\1 <secret hidden>'
|
14
14
|
cfg.gsub! /^(snmp-server user (\S+) (\S+) auth (\S+)) (\S+) (priv) (\S+)/, '\\1 <secret hidden> '
|
15
15
|
cfg.gsub! /^(snmp-server host.*? )\S+( udp-port \d+)?$/, '\\1<secret hidden>\\2'
|
16
|
+
cfg.gsub! /^(snmp-server mib community-map) \S+ ?(.*)/, '\\1 <secret hidden> \\2'
|
16
17
|
cfg.gsub! /(password \d+) (\S+)/, '\\1 <secret hidden>'
|
17
|
-
cfg.gsub! /^(radius-server key)
|
18
|
+
cfg.gsub! /^(radius-server .*key(?: \d+)?) \S+/, '\\1 <secret hidden>'
|
18
19
|
cfg.gsub! /^(tacacs-server .*key(?: \d+)?) \S+/, '\\1 <secret hidden>'
|
19
20
|
cfg
|
20
21
|
end
|
@@ -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/rgos.rb
CHANGED
@@ -12,7 +12,7 @@ class RGOS < Oxidized::Model
|
|
12
12
|
|
13
13
|
cmd 'show version' do |cfg|
|
14
14
|
cfg = cfg.each_line.reject { |line| line.match /^System start time/ }.join
|
15
|
-
cfg = cfg.each_line.reject { |line| line.match
|
15
|
+
cfg = cfg.each_line.reject { |line| line.match /^\s*System uptime/ }.join
|
16
16
|
comment "#{cfg.cut_both}\n"
|
17
17
|
end
|
18
18
|
|