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
|
@@ -22,9 +22,11 @@ class IronWare < Oxidized::Model
|
|
|
22
22
|
end
|
|
23
23
|
|
|
24
24
|
cmd 'show version' do |cfg|
|
|
25
|
-
cfg.
|
|
26
|
-
|
|
27
|
-
|
|
25
|
+
cfg = cfg.reject_lines [
|
|
26
|
+
/(^((.*)[Ss]ystem uptime(.*))$)/,
|
|
27
|
+
/(^((.*)[Tt]he system started at(.*))$)/,
|
|
28
|
+
/[Uu]p\s?[Tt]ime is .*/
|
|
29
|
+
]
|
|
28
30
|
|
|
29
31
|
comment cfg
|
|
30
32
|
end
|
|
@@ -36,8 +38,8 @@ class IronWare < Oxidized::Model
|
|
|
36
38
|
cfg.gsub! /current speed is [A-Z-]{2,6} \(\d{2,3}%\)/, ''
|
|
37
39
|
cfg.gsub! /Fan \d* - STATUS: OK \D*\d*./, '' # Fix for ADX Fan speed reporting
|
|
38
40
|
cfg.gsub! /\d* deg C/, '' # Fix for ADX temperature reporting
|
|
39
|
-
cfg.gsub! /(
|
|
40
|
-
cfg.gsub! /\d
|
|
41
|
+
cfg.gsub! /(\[*)1(\]*)<->(\[*)2(\]*)(<->(\[*)3(\]*))*/, ''
|
|
42
|
+
cfg.gsub! /\d+\.\d deg-C/, 'XX.X deg-C'
|
|
41
43
|
if cfg.include? "TEMPERATURE"
|
|
42
44
|
sc = StringScanner.new cfg
|
|
43
45
|
out = ''
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'json'
|
|
4
|
+
|
|
5
|
+
class Ivanti < Oxidized::Model
|
|
6
|
+
BINARY_CONFIG_PATH = '/api/v1/system/binary-configuration'
|
|
7
|
+
REALM_AUTH_PATH = '/api/v1/realm_auth'
|
|
8
|
+
DEFAULT_REALM = 'Users'
|
|
9
|
+
|
|
10
|
+
cmd BINARY_CONFIG_PATH do |b64|
|
|
11
|
+
b64.to_s.lines.map(&:strip).join
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
cfg :http do
|
|
15
|
+
@secure = true
|
|
16
|
+
@port = 443
|
|
17
|
+
|
|
18
|
+
@username = @node.auth[:username]
|
|
19
|
+
@password = @node.auth[:password]
|
|
20
|
+
|
|
21
|
+
realm = vars(:realm) || DEFAULT_REALM
|
|
22
|
+
payload = { realm: realm }.to_json
|
|
23
|
+
|
|
24
|
+
response_body = post_http(
|
|
25
|
+
REALM_AUTH_PATH,
|
|
26
|
+
payload,
|
|
27
|
+
'Content-Type' => 'application/json',
|
|
28
|
+
'Authorization' => basic_auth_header
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
begin
|
|
32
|
+
login_data = JSON.parse(response_body)
|
|
33
|
+
rescue JSON::ParserError => e
|
|
34
|
+
logger.error(
|
|
35
|
+
"Failed to parse realm_auth response: #{e.class}: #{e.message}, body=#{response_body.inspect}"
|
|
36
|
+
)
|
|
37
|
+
raise Oxidized::OxidizedError, 'Ivanti: realm_auth returned invalid JSON'
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
api_key = login_data['api_key']
|
|
41
|
+
|
|
42
|
+
if api_key.nil? || api_key.empty?
|
|
43
|
+
logger.error(
|
|
44
|
+
"Failed to obtain api_key from realm_auth, response=#{response_body.inspect}"
|
|
45
|
+
)
|
|
46
|
+
raise Oxidized::OxidizedError, 'Ivanti: realm_auth did not return valid api_key'
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
@username = api_key
|
|
50
|
+
@password = ''
|
|
51
|
+
|
|
52
|
+
logger.debug "Obtained api_key #{api_key[0, 4]}... (len=#{api_key.length})"
|
|
53
|
+
end
|
|
54
|
+
end
|
data/lib/oxidized/model/junos.rb
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
class JunOS < Oxidized::Model
|
|
2
4
|
using Refinements
|
|
3
|
-
|
|
4
5
|
comment '# '
|
|
5
6
|
|
|
6
7
|
def telnet
|
|
@@ -10,11 +11,13 @@ class JunOS < Oxidized::Model
|
|
|
10
11
|
cmd :all do |cfg|
|
|
11
12
|
cfg = cfg.cut_both if screenscrape
|
|
12
13
|
cfg.gsub!(/ scale-subscriber (\s+)(\d+)/, ' scale-subscriber <count>')
|
|
14
|
+
cfg.gsub!(/VMX-BANDWIDTH\s+(\d+) (.*)/, 'VMX-BANDWIDTH <count> \2')
|
|
13
15
|
cfg.lines.map { |line| line.rstrip }.join("\n") + "\n"
|
|
14
16
|
end
|
|
15
17
|
|
|
16
18
|
cmd :secret do |cfg|
|
|
17
19
|
cfg.gsub!(/community (\S+) {/, 'community <hidden> {')
|
|
20
|
+
cfg.gsub!(/(ssh-(rsa|dsa|ecdsa|ecdsa-sk|ed25519|ed25519-sk) )".*; ## SECRET-DATA/, '<secret removed>')
|
|
18
21
|
cfg.gsub!(/ "\$\d\$\S+; ## SECRET-DATA/, ' <secret removed>;')
|
|
19
22
|
cfg
|
|
20
23
|
end
|
|
@@ -25,20 +28,24 @@ class JunOS < Oxidized::Model
|
|
|
25
28
|
end
|
|
26
29
|
|
|
27
30
|
post do
|
|
28
|
-
out =
|
|
31
|
+
out = String.new
|
|
29
32
|
case @model
|
|
30
33
|
when 'mx960'
|
|
31
34
|
out << cmd('show chassis fabric reachability') { |cfg| comment cfg }
|
|
32
|
-
when /^(ex22|
|
|
35
|
+
when /^(ex22|ex3[34]|ex4|ex8|qfx)/
|
|
33
36
|
out << cmd('show virtual-chassis') { |cfg| comment cfg }
|
|
37
|
+
when /^srx/
|
|
38
|
+
out << cmd('show chassis cluster status') do |cfg|
|
|
39
|
+
cfg.lines.count <= 1 && cfg.include?("error:") ? String.new : comment(cfg)
|
|
40
|
+
end
|
|
34
41
|
end
|
|
35
42
|
out
|
|
36
43
|
end
|
|
37
44
|
|
|
38
45
|
cmd('show chassis hardware') { |cfg| comment cfg }
|
|
39
46
|
cmd('show system license') do |cfg|
|
|
40
|
-
cfg.gsub!(/ fib
|
|
41
|
-
cfg.gsub!(/ rib
|
|
47
|
+
cfg.gsub!(/ fib[-\s]scale\s+(\d+)/i, ' fib-scale <count>')
|
|
48
|
+
cfg.gsub!(/ rib[-\s]scale\s+(\d+)/i, ' rib-scale <count>')
|
|
42
49
|
comment cfg
|
|
43
50
|
end
|
|
44
51
|
cmd('show system license keys') { |cfg| comment cfg }
|
|
@@ -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
|
|
@@ -8,7 +8,7 @@ class LinksysSRW < Oxidized::Model
|
|
|
8
8
|
# Graphical login screen
|
|
9
9
|
# Just login to get to Main Menu
|
|
10
10
|
expect /Login Screen/ do
|
|
11
|
-
|
|
11
|
+
logger.debug "#{self.class.name}: Login Screen"
|
|
12
12
|
# This is to ensure the whole thing have rendered before we send stuff
|
|
13
13
|
sleep 0.2
|
|
14
14
|
send 0x18.chr # CAN Cancel
|
|
@@ -21,14 +21,14 @@ class LinksysSRW < Oxidized::Model
|
|
|
21
21
|
|
|
22
22
|
# Main menu, escape into Pre-cli-shell
|
|
23
23
|
expect /Switch Main Menu/ do
|
|
24
|
-
|
|
24
|
+
logger.debug "#{self.class.name}: Switch menu"
|
|
25
25
|
send 0x1a.chr # SUB Substitite ^z
|
|
26
26
|
''
|
|
27
27
|
end
|
|
28
28
|
|
|
29
29
|
# Pre-cli-shell, start lcli which is ios-ish
|
|
30
30
|
expect />/ do
|
|
31
|
-
|
|
31
|
+
logger.debug "#{self.class.name}: >"
|
|
32
32
|
send "lcli\r"
|
|
33
33
|
''
|
|
34
34
|
end
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
class LinuxGeneric < Oxidized::Model
|
|
2
2
|
using Refinements
|
|
3
3
|
|
|
4
|
-
prompt
|
|
4
|
+
prompt /^\S.*[#$] $/
|
|
5
5
|
comment '# '
|
|
6
|
+
clean :escape_codes
|
|
6
7
|
|
|
7
8
|
# add a comment in the final conf
|
|
8
9
|
def add_comment(comment)
|
|
@@ -53,7 +54,7 @@ class LinuxGeneric < Oxidized::Model
|
|
|
53
54
|
end
|
|
54
55
|
|
|
55
56
|
cfg :telnet do
|
|
56
|
-
username
|
|
57
|
+
username /(Username|[Ll]ogin):/
|
|
57
58
|
password /^Password:/
|
|
58
59
|
end
|
|
59
60
|
|
|
@@ -63,6 +64,7 @@ class LinuxGeneric < Oxidized::Model
|
|
|
63
64
|
cmd "sudo su -", /^\[sudo\] password/
|
|
64
65
|
cmd @node.auth[:password]
|
|
65
66
|
elsif vars(:enable)
|
|
67
|
+
# This will only work without localisation (de: "Passwort:", fr: "Mot de passe :"...)
|
|
66
68
|
cmd "su -", /^Password:/
|
|
67
69
|
cmd vars(:enable)
|
|
68
70
|
end
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
module Oxidized
|
|
2
|
+
class Model
|
|
3
|
+
module Macros
|
|
4
|
+
using Refinements
|
|
5
|
+
VERBS = %i[
|
|
6
|
+
macro
|
|
7
|
+
clean
|
|
8
|
+
].freeze
|
|
9
|
+
|
|
10
|
+
VERBS.each do |verb|
|
|
11
|
+
define_method(verb) do |name, *args, **kwargs, &block|
|
|
12
|
+
send("#{verb}_#{name}", *args, **kwargs, &block)
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
private
|
|
17
|
+
|
|
18
|
+
def macro_enable(regex: /password/i, inputs: %i[telnet ssh], command: "enable")
|
|
19
|
+
inputs = [inputs].flatten.map(&:to_sym)
|
|
20
|
+
cfg(*inputs) do
|
|
21
|
+
post_login do
|
|
22
|
+
if vars(:enable) == true
|
|
23
|
+
cmd command
|
|
24
|
+
elsif vars(:enable)
|
|
25
|
+
cmd command, regex
|
|
26
|
+
cmd vars(:enable)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def clean_escape_codes
|
|
33
|
+
ansi_escape_regex = /
|
|
34
|
+
\r? # Optional carriage return at start
|
|
35
|
+
\e # ESC character - starts escape sequence
|
|
36
|
+
(?: # Non-capturing group for different sequence types:
|
|
37
|
+
# Type 1: CSI (Control Sequence Introducer)
|
|
38
|
+
\[ # Literal '[' - starts CSI sequence
|
|
39
|
+
[0-?]* # Parameter bytes: digits (0-9), semicolon, colon, etc.
|
|
40
|
+
[ -\/]* # Intermediate bytes: space through slash characters
|
|
41
|
+
[@-~] # Final byte: determines the actual command
|
|
42
|
+
| # OR
|
|
43
|
+
# Type 2: Simple escape
|
|
44
|
+
[=>] # Single character commands after ESC
|
|
45
|
+
)
|
|
46
|
+
\r? # Optional carriage return at end
|
|
47
|
+
/x
|
|
48
|
+
expect ansi_escape_regex do |data, re|
|
|
49
|
+
data.gsub re, ''
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def clean_cut(head: 1, tail: 1)
|
|
54
|
+
cmd :all do |cfg|
|
|
55
|
+
cfg.cut_both(head, tail)
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
begin
|
|
2
|
+
# Mechanize has to be intialized here as the login needs a POST request
|
|
3
|
+
require "mechanize"
|
|
4
|
+
rescue LoadError
|
|
5
|
+
# Oxidized requires mechanize
|
|
6
|
+
raise Oxidized::OxidizedError, "mechanize not found: sudo gem install mechanize"
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
class Mimosab11 < Oxidized::Model
|
|
10
|
+
using Refinements
|
|
11
|
+
# Callback cfg_cb function to login(POST) then get(GET) the configuration
|
|
12
|
+
cfg_cb = lambda do
|
|
13
|
+
@e = Mechanize.new
|
|
14
|
+
# Set login query endpoint(lqe) and login POST data(lqp)
|
|
15
|
+
lqe = "https://#{@node.ip}/?q=index.login&mimosa_ajax=1"
|
|
16
|
+
lgp = { "username" => "configure", "password" => @password }
|
|
17
|
+
# Set get request endpoint(gc) for config
|
|
18
|
+
gc = "https://#{@node.ip}/?q=preferences.configure&mimosa_action=download"
|
|
19
|
+
# Not to verify self signed
|
|
20
|
+
@e.verify_mode = 0
|
|
21
|
+
@e.post(lqe, lgp)
|
|
22
|
+
cfg = @e.get(gc)
|
|
23
|
+
cfg.body
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
cmd cfg_cb do |cfg|
|
|
27
|
+
cfg
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
cfg :http do
|
|
31
|
+
@username = @node.auth[:username]
|
|
32
|
+
@password = @node.auth[:password]
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
class ML66 < Oxidized::Model
|
|
2
|
+
comment '! '
|
|
3
|
+
prompt /.*#/
|
|
4
|
+
|
|
5
|
+
expect /User:.*$/ do |data, re|
|
|
6
|
+
send "admin_user\n"
|
|
7
|
+
send "#{@node.auth[:password]}\n"
|
|
8
|
+
data.sub re, ''
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
cmd 'show version' do |cfg|
|
|
12
|
+
cfg.gsub! "Uptime", ''
|
|
13
|
+
comment cfg
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
cmd 'show inventory hw all' do |cfg|
|
|
17
|
+
comment cfg
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
cmd 'show inventory sw all' do |cfg|
|
|
21
|
+
comment cfg
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
cmd 'show license status all' do |cfg|
|
|
25
|
+
comment cfg
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
cmd 'show running-config'
|
|
29
|
+
|
|
30
|
+
cfg :ssh do
|
|
31
|
+
pre_logout 'logout'
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -1,25 +1,20 @@
|
|
|
1
1
|
class MLNXOS < Oxidized::Model
|
|
2
2
|
using Refinements
|
|
3
3
|
|
|
4
|
-
prompt
|
|
4
|
+
prompt /^\r?\S* \[\S+: (master|standby)\] [#>] $/
|
|
5
5
|
comment '## '
|
|
6
|
+
clean :escape_codes
|
|
6
7
|
|
|
7
8
|
# Pager Handling
|
|
8
|
-
|
|
9
|
+
# "Normal" pager: "lines 183-204 "
|
|
10
|
+
# Last pager: "lines 256-269/269 (END) "
|
|
11
|
+
expect /lines \d+-\d+( |\/\d+ \(END\) )/ do |data, re|
|
|
9
12
|
send ' '
|
|
10
13
|
data.sub re, ''
|
|
11
14
|
end
|
|
12
15
|
|
|
13
16
|
cmd :all do |cfg|
|
|
14
|
-
cfg.gsub!
|
|
15
|
-
cfg.gsub! /\[24;1H/, '' # Pager Handling
|
|
16
|
-
cfg.gsub! /\r\[K/, '' # Pager Handling
|
|
17
|
-
cfg.gsub! /\[K/, '' # Pager Handling
|
|
18
|
-
cfg.gsub! /\s/, '' # Linebreak Handling
|
|
19
|
-
cfg.gsub! /^CPU load averages:\s.+/, '' # Omit constantly changing CPU info
|
|
20
|
-
cfg.gsub! /^System memory:\s.+/, '' # Omit constantly changing memory info
|
|
21
|
-
cfg.gsub! /^Uptime:\s.+/, '' # Omit constantly changing uptime info
|
|
22
|
-
cfg.gsub! /.+Generated at\s\d+.+/, '' # Omit constantly changing generation time info
|
|
17
|
+
cfg.gsub! /.\x08/, '' # Remove Backspace char
|
|
23
18
|
cfg.lines.to_a[2..-3].join
|
|
24
19
|
end
|
|
25
20
|
|
|
@@ -30,21 +25,30 @@ class MLNXOS < Oxidized::Model
|
|
|
30
25
|
end
|
|
31
26
|
|
|
32
27
|
cmd 'show version' do |cfg|
|
|
33
|
-
|
|
28
|
+
cfg = cfg.reject_lines [
|
|
29
|
+
/^CPU load averages:\s.+/, # Omit constantly changing CPU info
|
|
30
|
+
/^System memory:\s.+/, # Omit constantly changing memory info
|
|
31
|
+
/^Uptime:\s.+/ # Omit constantly changing uptime info
|
|
32
|
+
]
|
|
33
|
+
comment cfg + "\n"
|
|
34
34
|
end
|
|
35
35
|
|
|
36
36
|
cmd 'show inventory' do |cfg|
|
|
37
|
-
comment cfg
|
|
37
|
+
comment cfg + "\n"
|
|
38
38
|
end
|
|
39
39
|
|
|
40
40
|
cmd 'enable'
|
|
41
41
|
|
|
42
42
|
cmd 'show running-config' do |cfg|
|
|
43
|
-
cfg
|
|
43
|
+
cfg.reject_lines [
|
|
44
|
+
# Omit constantly changing generation time info
|
|
45
|
+
/.+Generated at\s\d+.+/
|
|
46
|
+
]
|
|
44
47
|
end
|
|
45
48
|
|
|
46
49
|
cfg :ssh do
|
|
47
50
|
password /^Password:\s*/
|
|
51
|
+
post_login 'no cli session paging enable'
|
|
48
52
|
pre_logout "\nexit"
|
|
49
53
|
end
|
|
50
54
|
end
|