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,102 @@
|
|
|
1
|
+
module Oxidized
|
|
2
|
+
class Model
|
|
3
|
+
# Domain Specific Language for model setup
|
|
4
|
+
module DSLSetup
|
|
5
|
+
def prompt(regex = nil)
|
|
6
|
+
@prompt = regex || @prompt
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def comment(str = "# ")
|
|
10
|
+
@comment = if block_given?
|
|
11
|
+
yield
|
|
12
|
+
elsif not @comment
|
|
13
|
+
str
|
|
14
|
+
else
|
|
15
|
+
@comment
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def expect(regex, **args, &block)
|
|
20
|
+
process_args_block(@expect, args, [regex, block])
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def expects
|
|
24
|
+
@expect
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def cfg(*methods, **args, &block)
|
|
28
|
+
[methods].flatten.each do |method|
|
|
29
|
+
process_args_block(@cfg[method.to_s], args, block)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def cfgs
|
|
34
|
+
@cfg
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Define multiple inputs as a sequence of equivalent options
|
|
38
|
+
# Example: use ssh or telnet, then scp or ftp:
|
|
39
|
+
# [:ssh, [:scp, :ftp]]
|
|
40
|
+
def inputs(list = nil)
|
|
41
|
+
return @inputs if list.nil?
|
|
42
|
+
|
|
43
|
+
validate_inputs(list)
|
|
44
|
+
@inputs = list
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Returns the input sequence for the model as an array of arrays of input
|
|
48
|
+
# classes, filtered and ordered according to the provided +input_classes+
|
|
49
|
+
# (as specified in the oxidized configuration file).
|
|
50
|
+
def input_sequence(input_classes)
|
|
51
|
+
model_inputs = inputs || [
|
|
52
|
+
@cfg.filter_map do |input, block_list|
|
|
53
|
+
input.to_sym unless block_list.empty?
|
|
54
|
+
end
|
|
55
|
+
]
|
|
56
|
+
|
|
57
|
+
model_inputs.map do |sequence|
|
|
58
|
+
sequence = [sequence] unless sequence.is_a? Array
|
|
59
|
+
selected = input_classes.select { |input| sequence.include?(input.to_sym) }
|
|
60
|
+
logger.error "Needs one of #{sequence.inspect} to be configured" if selected.empty?
|
|
61
|
+
|
|
62
|
+
selected
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def metadata(position, value = nil, &block)
|
|
67
|
+
return unless %i[top bottom].include? position
|
|
68
|
+
|
|
69
|
+
if block_given?
|
|
70
|
+
@metadata[position] = block
|
|
71
|
+
else
|
|
72
|
+
@metadata[position] = value
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
private
|
|
77
|
+
|
|
78
|
+
def validate_inputs(list)
|
|
79
|
+
message = "inputs must be an array containing symbols or " \
|
|
80
|
+
"arrays of symbols"
|
|
81
|
+
|
|
82
|
+
raise ArgumentError, message unless list.is_a? Array
|
|
83
|
+
raise ArgumentError, message if list.empty?
|
|
84
|
+
|
|
85
|
+
list.each do |group|
|
|
86
|
+
case group
|
|
87
|
+
when Symbol
|
|
88
|
+
# Everything is fine
|
|
89
|
+
when Array
|
|
90
|
+
raise ArgumentError, message if group.empty?
|
|
91
|
+
|
|
92
|
+
group.each do |input|
|
|
93
|
+
raise ArgumentError, message unless input.is_a? Symbol
|
|
94
|
+
end
|
|
95
|
+
else
|
|
96
|
+
raise ArgumentError, message
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
class EatonNetwork < Oxidized::Model
|
|
2
|
+
using Refinements
|
|
3
|
+
# Eaton Gigabit Network Card M3
|
|
4
|
+
|
|
5
|
+
# -p option is a passphrase used to encrypted parts of the config data, the
|
|
6
|
+
# encrypted data is nondeterministic and changes with each run. Use auth
|
|
7
|
+
# password as the passphrase.
|
|
8
|
+
#
|
|
9
|
+
# See docs/Model-Notes/EatonNetwork.md for more info
|
|
10
|
+
post do
|
|
11
|
+
# Get config in post to allow passing auth password to cmd.
|
|
12
|
+
cfg = cmd "save_configuration -p #{@node.auth[:password]}"
|
|
13
|
+
cfg
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
cmd :all do |cfg|
|
|
17
|
+
# `save_configuration` echos the command back, outputs date time info, with
|
|
18
|
+
# last line is the prompt again.
|
|
19
|
+
json_str = cfg.each_line.select { |line| line.match /^\{/ }.join
|
|
20
|
+
json = JSON.parse(json_str)
|
|
21
|
+
|
|
22
|
+
json['features']['userAndSessionManagement']['data']['settings']['all']['1.0']['local']['1.0']['predefinedAccounts'].each do |n|
|
|
23
|
+
n.delete('attemptLogin')
|
|
24
|
+
n['password'].delete('history')
|
|
25
|
+
end
|
|
26
|
+
json['features']['userAndSessionManagement']['data']['settings']['all']['1.0']['local']['1.0']['createdAccounts'].each do |n|
|
|
27
|
+
n.delete('attemptLogin')
|
|
28
|
+
n['password'].delete('history')
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
cfg = JSON.pretty_generate(json)
|
|
32
|
+
cfg
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
cmd :secret do |cfg|
|
|
36
|
+
# Re-parse json to remove secrets by json path
|
|
37
|
+
json = JSON.parse(cfg)
|
|
38
|
+
|
|
39
|
+
json.delete('passphrase')
|
|
40
|
+
json['features']['rms']['data']['settings'].delete('proxyUsername')
|
|
41
|
+
json['features']['rms']['data']['settings'].delete('proxyPassword')
|
|
42
|
+
json['features']['rms']['data']['settings'].delete('username')
|
|
43
|
+
json['features']['rms']['data']['settings'].delete('password')
|
|
44
|
+
json['features']['rms']['data']['settings'].delete('defaultPassword')
|
|
45
|
+
|
|
46
|
+
json['features']['smtp']['data']['dmeData'].delete('password')
|
|
47
|
+
|
|
48
|
+
json['features']['snmp']['data']['dmeData']['v3']['users'].each do |n|
|
|
49
|
+
n['auth'].delete('password')
|
|
50
|
+
n['priv'].delete('password')
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
json['features']['userAndSessionManagement']['data']['settings']['all']['1.0']['ldap']['1.0']['settings']['connectivity']['bind'].delete('password')
|
|
54
|
+
json['features']['userAndSessionManagement']['data']['settings']['all']['1.0']['radius']['1.0']['settings']['connectivity']['primaryServer'].delete('secret')
|
|
55
|
+
json['features']['userAndSessionManagement']['data']['settings']['all']['1.0']['radius']['1.0']['settings']['connectivity']['secondaryServer'].delete('secret')
|
|
56
|
+
|
|
57
|
+
# Added in frimware v2.2.0
|
|
58
|
+
json['features']['peripherals']['data']['dmeData']['ethernet']['ports'].each do |n|
|
|
59
|
+
n.dig('dot1x', 'peap', 'password') && n['dot1x']['peap'].delete('password')
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
cfg = JSON.pretty_generate(json)
|
|
63
|
+
cfg
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
cfg :ssh do
|
|
67
|
+
exec true
|
|
68
|
+
pre_logout 'logout'
|
|
69
|
+
end
|
|
70
|
+
end
|
|
@@ -31,7 +31,9 @@ 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$/,
|
|
36
|
+
'<fan speeds hidden>'
|
|
35
37
|
comment cfg
|
|
36
38
|
end
|
|
37
39
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
class Edgeos < Oxidized::Model
|
|
2
2
|
using Refinements
|
|
3
3
|
|
|
4
|
-
# EdgeOS #
|
|
4
|
+
# Ubiquiti EdgeOS #
|
|
5
5
|
|
|
6
6
|
prompt /@.*?:~\$\s/
|
|
7
7
|
|
|
@@ -10,11 +10,12 @@ class Edgeos < Oxidized::Model
|
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
cmd :secret do |cfg|
|
|
13
|
-
cfg.gsub!
|
|
14
|
-
cfg.gsub!
|
|
15
|
-
cfg.gsub!
|
|
16
|
-
cfg.gsub!
|
|
17
|
-
cfg.gsub!
|
|
13
|
+
cfg.gsub!(/(encrypted-password) \S+/, '\1 <secret removed>')
|
|
14
|
+
cfg.gsub!(/(plaintext-password) \S+/, '\1 <secret removed>')
|
|
15
|
+
cfg.gsub!(/(password) \S+/, '\1 <secret removed>')
|
|
16
|
+
cfg.gsub!(/(pre-shared-secret) \S+/, '\1 <secret removed>')
|
|
17
|
+
cfg.gsub!(/(community) \S+ {/, '\1 <hidden> {')
|
|
18
|
+
cfg.gsub!(/(commit-archive location) \S+/, '\1 <secret removed>')
|
|
18
19
|
cfg
|
|
19
20
|
end
|
|
20
21
|
|
|
@@ -8,7 +8,9 @@ class EdgeSwitch < Oxidized::Model
|
|
|
8
8
|
prompt /\(.*\)\s[#>]/
|
|
9
9
|
|
|
10
10
|
cmd 'show running-config' do |cfg|
|
|
11
|
-
cfg.each_line.to_a[2..-2].reject
|
|
11
|
+
cfg.each_line.to_a[2..-2].reject do |line|
|
|
12
|
+
line.match(/System Up Time.*/) || line.match(/Current SNTP Synchronized Time.*/)
|
|
13
|
+
end.join
|
|
12
14
|
end
|
|
13
15
|
|
|
14
16
|
cfg :telnet do
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
class EFOS < Oxidized::Model
|
|
2
|
+
using Refinements
|
|
3
|
+
|
|
4
|
+
# Enhanced Fabric OS - Broadcom
|
|
5
|
+
comment '! '
|
|
6
|
+
prompt /^([\w.@()-]+[#>]\s?)$/
|
|
7
|
+
|
|
8
|
+
cmd :all do |cfg|
|
|
9
|
+
# Remove the echo of the entered command and the prompt after it
|
|
10
|
+
cfg.cut_both
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
cmd 'show bootvar' do |cfg|
|
|
14
|
+
comment cfg
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
cmd 'show fiber-ports optical-transceiver-info all' do |cfg|
|
|
18
|
+
comment cfg
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
cmd 'show running-config' do |cfg|
|
|
22
|
+
cfg.reject_lines [
|
|
23
|
+
'System Up Time',
|
|
24
|
+
'Current System Time:',
|
|
25
|
+
'Current SNTP Synchronized Time:'
|
|
26
|
+
]
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
cfg :telnet, :ssh do
|
|
30
|
+
post_login do
|
|
31
|
+
if vars(:enable) == true
|
|
32
|
+
cmd 'enable'
|
|
33
|
+
elsif vars(:enable)
|
|
34
|
+
cmd 'enable', /^[pP]assword:/
|
|
35
|
+
cmd vars(:enable)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
post_login 'terminal length 0'
|
|
39
|
+
pre_logout 'logout'
|
|
40
|
+
end
|
|
41
|
+
end
|
data/lib/oxidized/model/eltex.rb
CHANGED
|
@@ -3,7 +3,7 @@ class Eltex < Oxidized::Model
|
|
|
3
3
|
|
|
4
4
|
# Tested with MES2324FB Version: 4.0.7.1 Build: 37 (master)
|
|
5
5
|
|
|
6
|
-
prompt /^\s?[\w
|
|
6
|
+
prompt /^\s?[\w.@()-]+[#>]\s?$/
|
|
7
7
|
comment '! '
|
|
8
8
|
|
|
9
9
|
cmd :all do |cfg|
|
|
@@ -16,7 +16,7 @@ class Eltex < Oxidized::Model
|
|
|
16
16
|
cfg.gsub! /^(enable (password|secret)( level \d+)? \d) .+/, '\\1 <secret hidden>'
|
|
17
17
|
cfg.gsub! /^(\s+(?:password|secret)) (?:\d )?\S+/, '\\1 <secret hidden>'
|
|
18
18
|
cfg.gsub! /^(tacacs-server (.+ )?key) .+/, '\\1 <secret hidden>'
|
|
19
|
-
cfg.gsub! /^((tacacs|radius) server [^\n]+\n(
|
|
19
|
+
cfg.gsub! /^((tacacs|radius) server [^\n]+\n( +[^\n]+\n)*\s+key) [^\n]+$/m, '\1 <secret hidden>'
|
|
20
20
|
cfg.gsub! /username (\S+) privilege (\d+) (\S+).*/, '<secret hidden>'
|
|
21
21
|
cfg.gsub! /^username \S+ password \d \S+/, '<secret hidden>'
|
|
22
22
|
cfg.gsub! /^enable password \d \S+/, '<secret hidden>'
|
|
@@ -44,6 +44,8 @@ class Eltex < Oxidized::Model
|
|
|
44
44
|
end
|
|
45
45
|
end
|
|
46
46
|
post_login 'terminal datadump'
|
|
47
|
+
# disable cli pagination for MES2424
|
|
48
|
+
post_login 'set cli pagination off'
|
|
47
49
|
pre_logout 'disable'
|
|
48
50
|
pre_logout 'exit'
|
|
49
51
|
end
|
|
@@ -5,7 +5,7 @@ class Enterasys800 < Oxidized::Model
|
|
|
5
5
|
# Tested with 08H20G4-24 Fast Ethernet Switch Firmware: Build 01.01.01.0017
|
|
6
6
|
comment '# '
|
|
7
7
|
|
|
8
|
-
prompt /([\w
|
|
8
|
+
prompt /([\w (:.@-]+[#>]\s?)$/
|
|
9
9
|
|
|
10
10
|
cfg :telnet do
|
|
11
11
|
username /UserName:/
|
|
@@ -23,7 +23,7 @@ class Enterasys800 < Oxidized::Model
|
|
|
23
23
|
cmd :all do |cfg|
|
|
24
24
|
cfg = cfg.cut_both
|
|
25
25
|
cfg = cfg.gsub /^[\r\n]|^\s\s\s/, ''
|
|
26
|
-
cfg = cfg.gsub
|
|
26
|
+
cfg = cfg.gsub "Command: show config effective", ''
|
|
27
27
|
cfg
|
|
28
28
|
end
|
|
29
29
|
|
|
@@ -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
|
@@ -15,10 +15,12 @@ class EOS < Oxidized::Model
|
|
|
15
15
|
cfg.gsub! /^(snmp-server community).*/, '\\1 <configuration removed>'
|
|
16
16
|
cfg.gsub! /(secret \w+) (\S+).*/, '\\1 <secret hidden>'
|
|
17
17
|
cfg.gsub! /(password \d+) (\S+).*/, '\\1 <secret hidden>'
|
|
18
|
-
cfg.gsub! /^(enable secret).*/, '\\1 <configuration removed>'
|
|
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,36 @@
|
|
|
1
|
+
class Exalink < Oxidized::Model
|
|
2
|
+
using Refinements
|
|
3
|
+
|
|
4
|
+
prompt /^([\w.@()-]+[#>]\s?)$/
|
|
5
|
+
comment '! '
|
|
6
|
+
|
|
7
|
+
cmd :all do |cfg|
|
|
8
|
+
cfg.gsub! /\r\n?/, "\n"
|
|
9
|
+
cfg.cut_both
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
cmd 'show version' do |cfg|
|
|
13
|
+
comment cfg.reject_lines /uptime/i
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
cmd 'show port' do |cfg|
|
|
17
|
+
comment cfg
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
cmd 'show running-config' do |cfg|
|
|
21
|
+
cfg.gsub! /^(show run.*)$/, '! \1'
|
|
22
|
+
cfg.gsub! /^!Time:[^\n]*\n/, ''
|
|
23
|
+
cfg
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
cfg :telnet do
|
|
27
|
+
username /^login:/
|
|
28
|
+
password /^Password:/
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
cfg :ssh, :telnet do
|
|
32
|
+
post_login 'terminal length 0'
|
|
33
|
+
post_login 'terminal width 0'
|
|
34
|
+
pre_logout 'logout'
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -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
|
|
@@ -4,11 +4,11 @@ class FabricOS < Oxidized::Model
|
|
|
4
4
|
# Brocade Fabric OS model #
|
|
5
5
|
## FIXME: Only ssh exec mode support, no telnet, no ssh screenscraping
|
|
6
6
|
|
|
7
|
-
prompt /^(
|
|
7
|
+
prompt /^(\w+:+\w+>\s)$/
|
|
8
8
|
comment '# '
|
|
9
9
|
|
|
10
10
|
cmd 'chassisShow' do |cfg|
|
|
11
|
-
comment cfg.each_line.reject { |line| line.match(/Time Awake:/) || line.match(/Power Usage \(Watts\):/) || line.match(/Power Usage:/) || line.match(/Time Alive:/) || line.match(/Update:/) }.join
|
|
11
|
+
comment cfg.each_line.reject { |line| line.match(/Time Awake:/) || line.match(/Power Usage \(Watts\):/) || line.match(/Power Usage:/) || line.match(/Time Alive:/) || line.match(/Update:/) || line.match(/PS Voltage input:/) }.join
|
|
12
12
|
end
|
|
13
13
|
|
|
14
14
|
cmd 'configShow -all' do |cfg|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
class FastIron < Oxidized::Model
|
|
2
2
|
using Refinements
|
|
3
3
|
|
|
4
|
-
prompt /^([\w
|
|
4
|
+
prompt /^([\w.@\/()-]+[#>]\s?)$/
|
|
5
5
|
comment '! '
|
|
6
6
|
|
|
7
7
|
cmd :all do |cfg|
|
|
@@ -19,7 +19,9 @@ class FastIron < Oxidized::Model
|
|
|
19
19
|
lines.each_with_index do |line, _i|
|
|
20
20
|
comments << "Version: #{Regexp.last_match(1)}" if line =~ /^\s+SW: Version (.*)$/
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
if line =~ /^\s+Compressed Boot-Monitor Image size = \d+, Version:(.*)$/
|
|
23
|
+
comments << "Boot-Monitor Version: #{Regexp.last_match(1)}"
|
|
24
|
+
end
|
|
23
25
|
|
|
24
26
|
comments << "Serial: #{Regexp.last_match(1)}" if line =~ /^\s+Serial #:(.*)$/
|
|
25
27
|
end
|
|
@@ -41,7 +43,7 @@ class FastIron < Oxidized::Model
|
|
|
41
43
|
comment cfg
|
|
42
44
|
end
|
|
43
45
|
|
|
44
|
-
cmd 'show stack' do |cfg|
|
|
46
|
+
cmd 'show stack | exclude T=' do |cfg|
|
|
45
47
|
comment cfg
|
|
46
48
|
end
|
|
47
49
|
|
|
@@ -10,8 +10,8 @@ class Firebrick < Oxidized::Model
|
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
cmd 'show status' do |cfg|
|
|
13
|
-
cfg.gsub!
|
|
14
|
-
cfg.gsub!
|
|
13
|
+
cfg.gsub! "Status", ''
|
|
14
|
+
cfg.gsub! "------", ''
|
|
15
15
|
cfg.gsub! /Uptime.*/, ''
|
|
16
16
|
cfg.gsub! /Current time.*/, ''
|
|
17
17
|
cfg.gsub! /RAM.*/, ''
|
|
@@ -3,12 +3,21 @@ class FireLinuxOS < Oxidized::Model
|
|
|
3
3
|
|
|
4
4
|
# Fire Linux OS is what the new FTD (FirePOWER) series devices from Cisco run. At the backend, it's mostly identical to ASA's.
|
|
5
5
|
|
|
6
|
-
prompt /^[#>]\(?.+\)
|
|
7
|
-
comment
|
|
6
|
+
prompt /^[#>]\(?.+\)? ?$/
|
|
7
|
+
comment '! '
|
|
8
|
+
|
|
9
|
+
expect /^Syntax error: .*\n.*$/ do |data, re|
|
|
10
|
+
# The firepower does not remove the entered command, so
|
|
11
|
+
# Send CTRL-U and \n for a fresh prompt
|
|
12
|
+
send "\x15\n"
|
|
13
|
+
data.sub re, ''
|
|
14
|
+
end
|
|
8
15
|
|
|
9
16
|
cmd :all do |cfg|
|
|
10
17
|
cfg.gsub! /^% Invalid input detected at '\^' marker\.$|^\s+\^$/, ''
|
|
11
|
-
|
|
18
|
+
# Ged rid of ANSI escape codes
|
|
19
|
+
cfg.gsub! /\e\[[0-?]*[ -\/]*[@-~]\r?/, ''
|
|
20
|
+
cfg.cut_both
|
|
12
21
|
end
|
|
13
22
|
|
|
14
23
|
cmd :secret do |cfg|
|
|
@@ -22,9 +31,7 @@ class FireLinuxOS < Oxidized::Model
|
|
|
22
31
|
end
|
|
23
32
|
|
|
24
33
|
cmd 'show version system' do |cfg|
|
|
25
|
-
|
|
26
|
-
cfg = cfg.join
|
|
27
|
-
comment cfg
|
|
34
|
+
comment cfg.reject_lines [/(\s+up\s+\d+\s+)|(.*days.*)/]
|
|
28
35
|
end
|
|
29
36
|
|
|
30
37
|
cmd 'show inventory' do |cfg|
|
|
@@ -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|
|