oxidized 0.20.0 → 0.28.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.codeclimate.yml +4 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +12 -0
- data/.github/no-response.yml +13 -0
- data/.github/workflows/publishdocker.yml +13 -0
- data/.gitignore +4 -0
- data/.rubocop.yml +73 -0
- data/.rubocop_todo.yml +120 -0
- data/.travis.yml +6 -1
- data/CHANGELOG.md +693 -243
- data/Dockerfile +27 -19
- data/LICENSE +201 -0
- data/README.md +234 -913
- data/Rakefile +48 -7
- data/TODO.md +29 -23
- data/bin/console +1 -1
- data/bin/oxidized +6 -5
- data/docs/Configuration.md +313 -0
- data/docs/Creating-Models.md +140 -0
- data/docs/Hooks.md +274 -0
- data/docs/Model-Notes/AireOS.md +11 -0
- data/docs/Model-Notes/ArbOS.md +11 -0
- data/docs/Model-Notes/Comware.md +13 -0
- data/docs/Model-Notes/Cumulus.md +40 -0
- data/docs/Model-Notes/EOS.md +12 -0
- data/docs/Model-Notes/IOS.md +29 -0
- data/docs/Model-Notes/JunOS.md +33 -0
- data/docs/Model-Notes/LinuxGeneric.md +24 -0
- data/docs/Model-Notes/Netgear.md +87 -0
- data/docs/Model-Notes/Nokia.md +9 -0
- data/docs/Model-Notes/README.md +24 -0
- data/docs/Model-Notes/SmartAX-Huawei.md +35 -0
- data/docs/Model-Notes/VRP-Huawei.md +34 -0
- data/docs/Model-Notes/Viptela.md +12 -0
- data/docs/Model-Notes/XGS4600-Zyxel.md +36 -0
- data/docs/Outputs.md +190 -0
- data/docs/Ruby-API.md +199 -0
- data/docs/Sources.md +171 -0
- data/docs/Supported-OS-Types.md +227 -0
- data/docs/Troubleshooting.md +66 -0
- data/extra/nagios_check_failing_nodes.rb +9 -2
- data/extra/oxidized-report-git-commits +21 -40
- data/extra/oxidized-ubuntu.haproxy +45 -0
- data/extra/oxidized.logrotate +7 -0
- data/extra/oxidized.service +13 -0
- data/extra/rest_client.rb +7 -10
- data/extra/syslog.rb +47 -42
- data/lib/oxidized/cli.rb +41 -31
- data/lib/oxidized/config/vars.rb +9 -14
- data/lib/oxidized/config.rb +20 -13
- data/lib/oxidized/core.rb +8 -10
- data/lib/oxidized/hook/awssns.rb +6 -7
- data/lib/oxidized/hook/ciscosparkdiff.rb +43 -0
- data/lib/oxidized/hook/exec.rb +19 -24
- data/lib/oxidized/hook/githubrepo.rb +17 -17
- data/lib/oxidized/hook/noophook.rb +1 -1
- data/lib/oxidized/hook/slackdiff.rb +32 -19
- data/lib/oxidized/hook/xmppdiff.rb +59 -0
- data/lib/oxidized/hook.rb +63 -64
- data/lib/oxidized/input/cli.rb +22 -12
- data/lib/oxidized/input/exec.rb +28 -0
- data/lib/oxidized/input/ftp.rb +16 -15
- data/lib/oxidized/input/http.rb +72 -0
- data/lib/oxidized/input/input.rb +6 -6
- data/lib/oxidized/input/ssh.rb +64 -56
- data/lib/oxidized/input/telnet.rb +59 -102
- data/lib/oxidized/input/tftp.rb +9 -10
- data/lib/oxidized/jobs.rb +9 -10
- data/lib/oxidized/manager.rb +42 -44
- data/lib/oxidized/model/acos.rb +19 -20
- data/lib/oxidized/model/acsw.rb +62 -0
- data/lib/oxidized/model/adtran.rb +26 -0
- data/lib/oxidized/model/aen.rb +19 -0
- data/lib/oxidized/model/aireos.rb +9 -10
- data/lib/oxidized/model/airfiber.rb +22 -0
- data/lib/oxidized/model/alteonos.rb +58 -0
- data/lib/oxidized/model/alvarion.rb +0 -4
- data/lib/oxidized/model/aos.rb +11 -5
- data/lib/oxidized/model/aos7.rb +6 -7
- data/lib/oxidized/model/aosw.rb +30 -27
- data/lib/oxidized/model/apc_aos.rb +2 -5
- data/lib/oxidized/model/arbos.rb +26 -0
- data/lib/oxidized/model/aricentiss.rb +49 -0
- data/lib/oxidized/model/asa.rb +61 -22
- data/lib/oxidized/model/asyncos.rb +46 -0
- data/lib/oxidized/model/audiocodes.rb +28 -0
- data/lib/oxidized/model/audiocodesmp.rb +28 -0
- data/lib/oxidized/model/awplus.rb +84 -0
- data/lib/oxidized/model/axos.rb +16 -0
- data/lib/oxidized/model/boss.rb +77 -0
- data/lib/oxidized/model/br6910.rb +42 -45
- data/lib/oxidized/model/c4cmts.rb +6 -10
- data/lib/oxidized/model/cambium.rb +23 -0
- data/lib/oxidized/model/casa.rb +1 -1
- data/lib/oxidized/model/catos.rb +1 -3
- data/lib/oxidized/model/cisconga.rb +1 -3
- data/lib/oxidized/model/ciscosma.rb +42 -0
- data/lib/oxidized/model/ciscosmb.rb +30 -10
- data/lib/oxidized/model/ciscovpn3k.rb +11 -0
- data/lib/oxidized/model/cnos.rb +33 -0
- data/lib/oxidized/model/comnetms.rb +43 -0
- data/lib/oxidized/model/comtrol.rb +41 -0
- data/lib/oxidized/model/comware.rb +28 -16
- data/lib/oxidized/model/coriant8600.rb +3 -5
- data/lib/oxidized/model/coriantgroove.rb +26 -0
- data/lib/oxidized/model/corianttmos.rb +1 -3
- data/lib/oxidized/model/cumulus.rb +60 -49
- data/lib/oxidized/model/datacom.rb +1 -4
- data/lib/oxidized/model/dcnos.rb +46 -0
- data/lib/oxidized/model/dellx.rb +76 -0
- data/lib/oxidized/model/dlink.rb +5 -4
- data/lib/oxidized/model/dnos.rb +11 -5
- data/lib/oxidized/model/eciapollo.rb +34 -0
- data/lib/oxidized/model/edgecos.rb +49 -0
- data/lib/oxidized/model/edgeos.rb +12 -5
- data/lib/oxidized/model/edgeswitch.rb +2 -4
- data/lib/oxidized/model/enterasys.rb +28 -0
- data/lib/oxidized/model/eos.rb +8 -8
- data/lib/oxidized/model/fabricos.rb +4 -6
- data/lib/oxidized/model/fastiron.rb +66 -0
- data/lib/oxidized/model/fiberdriver.rb +2 -2
- data/lib/oxidized/model/firebrick.rb +31 -0
- data/lib/oxidized/model/firelinuxos.rb +41 -0
- data/lib/oxidized/model/firewareos.rb +3 -6
- data/lib/oxidized/model/fortios.rb +31 -19
- data/lib/oxidized/model/ftos.rb +8 -5
- data/lib/oxidized/model/fujitsupy.rb +5 -7
- data/lib/oxidized/model/gaiaos.rb +7 -11
- data/lib/oxidized/model/gcombnps.rb +84 -0
- data/lib/oxidized/model/grandstream.rb +9 -0
- data/lib/oxidized/model/hatteras.rb +9 -6
- data/lib/oxidized/model/hirschmann.rb +39 -0
- data/lib/oxidized/model/hpebladesystem.rb +20 -18
- data/lib/oxidized/model/hpemsa.rb +10 -0
- data/lib/oxidized/model/hpmsm.rb +84 -0
- data/lib/oxidized/model/ibos.rb +55 -0
- data/lib/oxidized/model/icotera.rb +27 -0
- data/lib/oxidized/model/ios.rb +63 -70
- data/lib/oxidized/model/iosxe.rb +5 -0
- data/lib/oxidized/model/iosxr.rb +2 -3
- data/lib/oxidized/model/ipos.rb +10 -6
- data/lib/oxidized/model/ironware.rb +20 -19
- data/lib/oxidized/model/isam.rb +5 -6
- data/lib/oxidized/model/junos.rb +9 -11
- data/lib/oxidized/model/linuxgeneric.rb +74 -0
- data/lib/oxidized/model/masteros.rb +3 -6
- data/lib/oxidized/model/mlnxos.rb +9 -10
- data/lib/oxidized/model/model.rb +72 -46
- data/lib/oxidized/model/mtrlrfs.rb +1 -4
- data/lib/oxidized/model/ndms.rb +23 -0
- data/lib/oxidized/model/netgear.rb +35 -15
- data/lib/oxidized/model/netonix.rb +2 -2
- data/lib/oxidized/model/netscaler.rb +6 -3
- data/lib/oxidized/model/nos.rb +5 -7
- data/lib/oxidized/model/nsxconfig.rb +22 -0
- data/lib/oxidized/model/nsxfirewall.rb +22 -0
- data/lib/oxidized/model/nxos.rb +13 -3
- data/lib/oxidized/model/oneos.rb +15 -9
- data/lib/oxidized/model/openbsd.rb +63 -0
- data/lib/oxidized/model/opengear.rb +3 -5
- data/lib/oxidized/model/openwrt.rb +78 -0
- data/lib/oxidized/model/opnsense.rb +19 -0
- data/lib/oxidized/model/os10.rb +46 -0
- data/lib/oxidized/model/outputs.rb +5 -7
- data/lib/oxidized/model/panos.rb +11 -12
- data/lib/oxidized/model/pfsense.rb +11 -6
- data/lib/oxidized/model/planet.rb +14 -17
- data/lib/oxidized/model/powerconnect.rb +24 -19
- data/lib/oxidized/model/procurve.rb +43 -11
- data/lib/oxidized/model/purityos.rb +12 -0
- data/lib/oxidized/model/qtech.rb +41 -0
- data/lib/oxidized/model/quantaos.rb +4 -6
- data/lib/oxidized/model/raisecom.rb +19 -0
- data/lib/oxidized/model/routeros.rb +26 -8
- data/lib/oxidized/model/saos.rb +1 -2
- data/lib/oxidized/model/screenos.rb +8 -11
- data/lib/oxidized/model/sgos.rb +45 -0
- data/lib/oxidized/model/siklu.rb +1 -3
- data/lib/oxidized/model/slxos.rb +59 -0
- data/lib/oxidized/model/smartax.rb +25 -0
- data/lib/oxidized/model/sonicos.rb +51 -0
- data/lib/oxidized/model/speedtouch.rb +34 -0
- data/lib/oxidized/model/sros.rb +96 -0
- data/lib/oxidized/model/stoneos.rb +32 -0
- data/lib/oxidized/model/supermicro.rb +6 -41
- data/lib/oxidized/model/tdre.rb +30 -0
- data/lib/oxidized/model/telco.rb +24 -0
- data/lib/oxidized/model/timos.rb +6 -114
- data/lib/oxidized/model/tmos.rb +6 -3
- data/lib/oxidized/model/tplink.rb +11 -11
- data/lib/oxidized/model/trango.rb +21 -42
- data/lib/oxidized/model/ucs.rb +30 -0
- data/lib/oxidized/model/viptela.rb +29 -0
- data/lib/oxidized/model/voltaire.rb +9 -12
- data/lib/oxidized/model/voss.rb +17 -6
- data/lib/oxidized/model/vrp.rb +11 -6
- data/lib/oxidized/model/vyatta.rb +8 -6
- data/lib/oxidized/model/weos.rb +20 -0
- data/lib/oxidized/model/xos.rb +20 -8
- data/lib/oxidized/model/zhoneolt.rb +2 -2
- data/lib/oxidized/model/zynos.rb +1 -3
- data/lib/oxidized/model/zynoscli.rb +36 -0
- data/lib/oxidized/model/zynosgs.rb +38 -0
- data/lib/oxidized/node/stats.rb +33 -8
- data/lib/oxidized/node.rb +86 -95
- data/lib/oxidized/nodes.rb +48 -44
- data/lib/oxidized/output/file.rb +32 -37
- data/lib/oxidized/output/git.rb +138 -153
- data/lib/oxidized/output/gitcrypt.rb +228 -242
- data/lib/oxidized/output/http.rb +35 -34
- data/lib/oxidized/output/output.rb +2 -3
- data/lib/oxidized/source/csv.rb +50 -44
- data/lib/oxidized/source/http.rb +58 -58
- data/lib/oxidized/source/source.rb +9 -10
- data/lib/oxidized/source/sql.rb +47 -45
- data/lib/oxidized/string.rb +18 -14
- data/lib/oxidized/version.rb +17 -1
- data/lib/oxidized/worker.rb +72 -33
- data/oxidized.gemspec +20 -19
- metadata +180 -36
- data/.ruby-version +0 -1
- data/Gemfile.lock +0 -44
data/lib/oxidized/model/model.rb
CHANGED
@@ -6,43 +6,62 @@ module Oxidized
|
|
6
6
|
include Oxidized::Config::Vars
|
7
7
|
|
8
8
|
class << self
|
9
|
-
def inherited
|
10
|
-
klass.
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
def
|
9
|
+
def inherited(klass)
|
10
|
+
if klass.superclass == Oxidized::Model
|
11
|
+
klass.instance_variable_set '@cmd', (Hash.new { |h, k| h[k] = [] })
|
12
|
+
klass.instance_variable_set '@cfg', (Hash.new { |h, k| h[k] = [] })
|
13
|
+
klass.instance_variable_set '@procs', (Hash.new { |h, k| h[k] = [] })
|
14
|
+
klass.instance_variable_set '@expect', []
|
15
|
+
klass.instance_variable_set '@comment', nil
|
16
|
+
klass.instance_variable_set '@prompt', nil
|
17
|
+
else # we're subclassing some existing model, take its variables
|
18
|
+
instance_variables.each do |var|
|
19
|
+
klass.instance_variable_set var, instance_variable_get(var)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def comment(str = "# ")
|
25
|
+
@comment = if block_given?
|
26
|
+
yield
|
27
|
+
elsif not @comment
|
28
|
+
str
|
29
|
+
else
|
30
|
+
@comment
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def prompt(regex = nil)
|
35
|
+
@prompt = regex || @prompt
|
36
|
+
end
|
37
|
+
|
38
|
+
def cfg(*methods, **args, &block)
|
25
39
|
[methods].flatten.each do |method|
|
26
|
-
@cfg[method.to_s]
|
40
|
+
process_args_block(@cfg[method.to_s], args, block)
|
27
41
|
end
|
28
42
|
end
|
43
|
+
|
29
44
|
def cfgs
|
30
45
|
@cfg
|
31
46
|
end
|
32
|
-
|
33
|
-
|
34
|
-
|
47
|
+
|
48
|
+
def cmd(cmd_arg = nil, **args, &block)
|
49
|
+
if cmd_arg.class == Symbol
|
50
|
+
process_args_block(@cmd[cmd_arg], args, block)
|
35
51
|
else
|
36
|
-
@cmd[:cmd]
|
52
|
+
process_args_block(@cmd[:cmd], args, [cmd_arg, block])
|
37
53
|
end
|
38
|
-
Oxidized.logger.debug "lib/oxidized/model/model.rb Added #{
|
54
|
+
Oxidized.logger.debug "lib/oxidized/model/model.rb Added #{cmd_arg} to the commands list"
|
39
55
|
end
|
56
|
+
|
40
57
|
def cmds
|
41
58
|
@cmd
|
42
59
|
end
|
43
|
-
|
44
|
-
|
60
|
+
|
61
|
+
def expect(regex, **args, &block)
|
62
|
+
process_args_block(@expect, args, [regex, block])
|
45
63
|
end
|
64
|
+
|
46
65
|
def expects
|
47
66
|
@expect
|
48
67
|
end
|
@@ -54,8 +73,8 @@ module Oxidized
|
|
54
73
|
# @since 0.0.39
|
55
74
|
# @yield expects block which should return [String]
|
56
75
|
# @return [void]
|
57
|
-
def pre &block
|
58
|
-
@procs[:pre]
|
76
|
+
def pre(**args, &block)
|
77
|
+
process_args_block(@procs[:pre], args, block)
|
59
78
|
end
|
60
79
|
|
61
80
|
# calls the block at the end of the model, adding the output of the block
|
@@ -65,24 +84,35 @@ module Oxidized
|
|
65
84
|
# @since 0.0.39
|
66
85
|
# @yield expects block which should return [String]
|
67
86
|
# @return [void]
|
68
|
-
def post &block
|
69
|
-
@procs[:post]
|
87
|
+
def post(**args, &block)
|
88
|
+
process_args_block(@procs[:post], args, block)
|
70
89
|
end
|
71
90
|
|
72
91
|
# @author Saku Ytti <saku@ytti.fi>
|
73
92
|
# @since 0.0.39
|
74
93
|
# @return [Hash] hash proc procs :pre+:post to be prepended/postfixed to output
|
75
|
-
|
76
|
-
|
94
|
+
attr_reader :procs
|
95
|
+
|
96
|
+
private
|
97
|
+
|
98
|
+
def process_args_block(target, args, block)
|
99
|
+
if args[:clear]
|
100
|
+
target.replace([block])
|
101
|
+
else
|
102
|
+
method = args[:prepend] ? :unshift : :push
|
103
|
+
target.send(method, block)
|
104
|
+
end
|
77
105
|
end
|
78
106
|
end
|
79
107
|
|
80
108
|
attr_accessor :input, :node
|
81
109
|
|
82
|
-
def cmd
|
110
|
+
def cmd(string, &block)
|
83
111
|
Oxidized.logger.debug "lib/oxidized/model/model.rb Executing #{string}"
|
84
112
|
out = @input.cmd(string)
|
85
113
|
return false unless out
|
114
|
+
|
115
|
+
out = out.b unless Oxidized.config.input.utf8_encoded?
|
86
116
|
self.class.cmds[:all].each do |all_block|
|
87
117
|
out = instance_exec Oxidized::String.new(out), string, &all_block
|
88
118
|
end
|
@@ -99,12 +129,12 @@ module Oxidized
|
|
99
129
|
@input.output
|
100
130
|
end
|
101
131
|
|
102
|
-
def send
|
132
|
+
def send(data)
|
103
133
|
@input.send data
|
104
134
|
end
|
105
135
|
|
106
|
-
def expect
|
107
|
-
self.class.expect
|
136
|
+
def expect(regex, &block)
|
137
|
+
self.class.expect regex, &block
|
108
138
|
end
|
109
139
|
|
110
140
|
def cfg
|
@@ -115,14 +145,10 @@ module Oxidized
|
|
115
145
|
self.class.prompt
|
116
146
|
end
|
117
147
|
|
118
|
-
def expects
|
148
|
+
def expects(data)
|
119
149
|
self.class.expects.each do |re, cb|
|
120
150
|
if data.match re
|
121
|
-
|
122
|
-
data = instance_exec [data, re], &cb
|
123
|
-
else
|
124
|
-
data = instance_exec data, &cb
|
125
|
-
end
|
151
|
+
data = cb.arity == 2 ? instance_exec([data, re], &cb) : instance_exec(data, &cb)
|
126
152
|
end
|
127
153
|
end
|
128
154
|
data
|
@@ -135,6 +161,7 @@ module Oxidized
|
|
135
161
|
self.class.cmds[:cmd].each do |command, block|
|
136
162
|
out = cmd command, &block
|
137
163
|
return false unless out
|
164
|
+
|
138
165
|
outputs << out
|
139
166
|
end
|
140
167
|
procs[:pre].each do |pre_proc|
|
@@ -146,9 +173,9 @@ module Oxidized
|
|
146
173
|
outputs
|
147
174
|
end
|
148
175
|
|
149
|
-
def comment
|
176
|
+
def comment(str)
|
150
177
|
data = ''
|
151
|
-
|
178
|
+
str.each_line do |line|
|
152
179
|
data << self.class.comment << line
|
153
180
|
end
|
154
181
|
data
|
@@ -160,12 +187,11 @@ module Oxidized
|
|
160
187
|
|
161
188
|
private
|
162
189
|
|
163
|
-
def process_cmd_output
|
164
|
-
output = Oxidized::String.new
|
165
|
-
output = Oxidized::String.new
|
190
|
+
def process_cmd_output(output, name)
|
191
|
+
output = Oxidized::String.new(output) if output.is_a?(::String)
|
192
|
+
output = Oxidized::String.new('') unless output.instance_of?(Oxidized::String)
|
166
193
|
output.set_cmd(name)
|
167
194
|
output
|
168
195
|
end
|
169
|
-
|
170
196
|
end
|
171
197
|
end
|
@@ -1,5 +1,4 @@
|
|
1
1
|
class Mtrlrfs < Oxidized::Model
|
2
|
-
|
3
2
|
# Motorola RFS/Extreme WM
|
4
3
|
|
5
4
|
comment '# '
|
@@ -7,7 +6,7 @@ class Mtrlrfs < Oxidized::Model
|
|
7
6
|
cmd :all do |cfg|
|
8
7
|
# xos inserts leading \r characters and other trailing white space.
|
9
8
|
# this deletes extraneous \r and trailing white space.
|
10
|
-
cfg.each_line.to_a[1..-2].map{|line|line.delete("\r").rstrip}.join("\n") + "\n"
|
9
|
+
cfg.each_line.to_a[1..-2].map { |line| line.delete("\r").rstrip }.join("\n") + "\n"
|
11
10
|
end
|
12
11
|
|
13
12
|
cmd 'show version' do |cfg|
|
@@ -32,6 +31,4 @@ class Mtrlrfs < Oxidized::Model
|
|
32
31
|
send "n\n"
|
33
32
|
end
|
34
33
|
end
|
35
|
-
|
36
34
|
end
|
37
|
-
|
@@ -0,0 +1,23 @@
|
|
1
|
+
class NDMS < Oxidized::Model
|
2
|
+
# Pull config from Zyxel Keenetic devices from version NDMS >= 2.0
|
3
|
+
|
4
|
+
comment '! '
|
5
|
+
|
6
|
+
prompt /^([\w.@()-]+[#>]\s?)/m
|
7
|
+
|
8
|
+
cmd 'show version' do |cfg|
|
9
|
+
cfg = cfg.each_line.to_a[1..-3].join
|
10
|
+
comment cfg
|
11
|
+
end
|
12
|
+
|
13
|
+
cmd 'show running-config' do |cfg|
|
14
|
+
cfg = cfg.cut_both.each_line.reject { |line| line.match /(clock date|checksum)/ }.join
|
15
|
+
cfg
|
16
|
+
end
|
17
|
+
|
18
|
+
cfg :telnet do
|
19
|
+
username /^Login:/
|
20
|
+
password /^Password:/
|
21
|
+
pre_logout 'exit'
|
22
|
+
end
|
23
|
+
end
|
@@ -1,32 +1,52 @@
|
|
1
1
|
class Netgear < Oxidized::Model
|
2
|
-
|
3
2
|
comment '!'
|
4
|
-
prompt /^(\([\w
|
3
|
+
prompt /^(\([\w\s\-.]+\)\s[#>])$/
|
5
4
|
|
6
5
|
cmd :secret do |cfg|
|
7
6
|
cfg.gsub!(/password (\S+)/, 'password <hidden>')
|
7
|
+
cfg.gsub!(/encrypted (\S+)/, 'encrypted <hidden>')
|
8
|
+
cfg.gsub!(/snmp-server community (\S+)/, 'snmp-server community <hidden>') # snmp
|
8
9
|
cfg
|
9
10
|
end
|
10
11
|
|
12
|
+
cfg :telnet do
|
13
|
+
username /^(User:|Applying Interface configuration, please wait ...)/
|
14
|
+
password /^Password:/i
|
15
|
+
end
|
16
|
+
|
11
17
|
cfg :telnet, :ssh do
|
12
|
-
|
13
|
-
|
14
|
-
cmd
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
cmd vars(:enable) + "\n"
|
19
|
-
end
|
20
|
-
expect /^.+[#]$/
|
18
|
+
post_login do
|
19
|
+
if vars(:enable) == true
|
20
|
+
cmd "enable"
|
21
|
+
elsif vars(:enable)
|
22
|
+
cmd "enable", /[pP]assword:\s?$/
|
23
|
+
cmd vars(:enable)
|
21
24
|
end
|
22
25
|
end
|
23
26
|
post_login 'terminal length 0'
|
24
|
-
|
25
|
-
|
27
|
+
# quit / logout will sometimes prompt the user:
|
28
|
+
#
|
29
|
+
# The system has unsaved changes.
|
30
|
+
# Would you like to save them now? (y/n)
|
31
|
+
#
|
32
|
+
# So it is safer simply to disconnect and not issue a pre_logout command
|
26
33
|
end
|
27
34
|
|
28
|
-
cmd
|
29
|
-
|
35
|
+
cmd :all do |cfg, cmdstring|
|
36
|
+
new_cfg = comment "COMMAND: #{cmdstring}\n"
|
37
|
+
new_cfg << cfg.each_line.to_a[1..-2].join
|
30
38
|
end
|
31
39
|
|
40
|
+
cmd 'show version' do |cfg|
|
41
|
+
cfg.gsub! /(Current Time\.+ ).*/, '\\1 <removed>'
|
42
|
+
comment cfg
|
43
|
+
end
|
44
|
+
|
45
|
+
cmd 'show bootvar' do |cfg|
|
46
|
+
comment cfg
|
47
|
+
end
|
48
|
+
cmd 'show running-config' do |cfg|
|
49
|
+
cfg.gsub! /(System Up Time\s+).*/, '\\1 <removed>'
|
50
|
+
cfg.gsub! /(Current SNTP Synchronized Time:).*/, '\\1 <removed>'
|
51
|
+
end
|
32
52
|
end
|
@@ -1,6 +1,5 @@
|
|
1
1
|
class NetScaler < Oxidized::Model
|
2
|
-
|
3
|
-
prompt /^\>\s*$/
|
2
|
+
prompt /^([\w\.-]*>\s?)$/
|
4
3
|
comment '# '
|
5
4
|
|
6
5
|
cmd :all do |cfg|
|
@@ -15,10 +14,14 @@ class NetScaler < Oxidized::Model
|
|
15
14
|
comment cfg
|
16
15
|
end
|
17
16
|
|
17
|
+
cmd :secret do |cfg|
|
18
|
+
cfg.gsub! /\w+\s(-encrypted)/, '<secret hidden> \\1'
|
19
|
+
cfg
|
20
|
+
end
|
21
|
+
|
18
22
|
cmd 'show ns ns.conf'
|
19
23
|
|
20
24
|
cfg :ssh do
|
21
25
|
pre_logout 'exit'
|
22
26
|
end
|
23
|
-
|
24
27
|
end
|
data/lib/oxidized/model/nos.rb
CHANGED
@@ -1,16 +1,15 @@
|
|
1
1
|
class NOS < Oxidized::Model
|
2
|
-
|
3
2
|
# Brocade Network Operating System
|
4
3
|
|
5
4
|
prompt /^(?:\e\[..h)?[\w.-]+# $/
|
6
5
|
comment '! '
|
7
6
|
|
8
7
|
cmd :all do |cfg|
|
9
|
-
cfg.
|
8
|
+
cfg.cut_both
|
10
9
|
end
|
11
10
|
|
12
11
|
cmd 'show version' do |cfg|
|
13
|
-
comment cfg
|
12
|
+
comment cfg.each_line.reject { |line| line.match /([Ss]ystem [Uu]p\s?[Tt]ime|[Uu]p\s?[Tt]ime is \d)/ }.join
|
14
13
|
end
|
15
14
|
|
16
15
|
cmd 'show inventory' do |cfg|
|
@@ -22,11 +21,11 @@ class NOS < Oxidized::Model
|
|
22
21
|
end
|
23
22
|
|
24
23
|
cmd 'show chassis' do |cfg|
|
25
|
-
comment cfg.each_line.reject { |line| line.match
|
24
|
+
comment cfg.each_line.reject { |line| line.match(/Time/) || line.match(/Update/) }.join
|
26
25
|
end
|
27
26
|
|
28
27
|
cfg 'show system' do |cfg|
|
29
|
-
comment
|
28
|
+
comment(cfg.each_line.reject { |line| line.match(/Time/) || line.match(/speed/) })
|
30
29
|
end
|
31
30
|
|
32
31
|
cmd 'show running-config | nomore'
|
@@ -38,8 +37,7 @@ class NOS < Oxidized::Model
|
|
38
37
|
|
39
38
|
cfg :telnet, :ssh do
|
40
39
|
post_login 'terminal length 0'
|
41
|
-
#post_login 'terminal width 0'
|
40
|
+
# post_login 'terminal width 0'
|
42
41
|
pre_logout 'exit'
|
43
42
|
end
|
44
|
-
|
45
43
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
class NSXConfig < Oxidized::Model
|
3
|
+
cmd "/api/4.0/edges/" do |cfg|
|
4
|
+
edges = JSON.parse(cfg.encode('UTF-8', { invalid: :replace, undef: :replace, replace: '?' }))["edgePage"]["data"]
|
5
|
+
data = []
|
6
|
+
edges.each do |edge|
|
7
|
+
firewall_config = cmd "/api/4.0/edges/#{edge['id']}"
|
8
|
+
json_config = JSON.parse(firewall_config.encode('UTF-8', { invalid: :replace, undef: :replace, replace: '?' }))
|
9
|
+
json_config["edgeInfo"] = "#{edge['id']} #{edge['name']}"
|
10
|
+
data.push(json_config)
|
11
|
+
end
|
12
|
+
JSON.pretty_generate(data)
|
13
|
+
end
|
14
|
+
|
15
|
+
cfg :http do
|
16
|
+
@username = @node.auth[:username]
|
17
|
+
@password = @node.auth[:password]
|
18
|
+
@headers['Content-Type'] = 'application/json'
|
19
|
+
@headers['Accept'] = 'application/json'
|
20
|
+
@secure = true
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
class NSXFirewall < Oxidized::Model
|
3
|
+
cmd "/api/4.0/edges/" do |cfg|
|
4
|
+
edges = JSON.parse(cfg.encode('UTF-8', { invalid: :replace, undef: :replace, replace: '?' }))["edgePage"]["data"]
|
5
|
+
data = []
|
6
|
+
edges.each do |edge|
|
7
|
+
firewall_config = cmd "/api/4.0/edges/#{edge['id']}/firewall/config"
|
8
|
+
json_config = {}
|
9
|
+
json_config["#{edge['id']} #{edge['name']}"] = JSON.parse(firewall_config.encode('UTF-8', { invalid: :replace, undef: :replace, replace: '?' }))
|
10
|
+
data.push(json_config)
|
11
|
+
end
|
12
|
+
JSON.pretty_generate(data)
|
13
|
+
end
|
14
|
+
|
15
|
+
cfg :http do
|
16
|
+
@username = @node.auth[:username]
|
17
|
+
@password = @node.auth[:password]
|
18
|
+
@headers['Content-Type'] = 'application/json'
|
19
|
+
@headers['Accept'] = 'application/json'
|
20
|
+
@secure = true
|
21
|
+
end
|
22
|
+
end
|
data/lib/oxidized/model/nxos.rb
CHANGED
@@ -1,8 +1,12 @@
|
|
1
1
|
class NXOS < Oxidized::Model
|
2
|
-
|
3
2
|
prompt /^(\r?[\w.@_()-]+[#]\s?)$/
|
4
3
|
comment '! '
|
5
4
|
|
5
|
+
def filter(cfg)
|
6
|
+
cfg.gsub! /\r\n?/, "\n"
|
7
|
+
cfg.gsub! prompt, ''
|
8
|
+
end
|
9
|
+
|
6
10
|
cmd :secret do |cfg|
|
7
11
|
cfg.gsub! /^(snmp-server community).*/, '\\1 <configuration removed>'
|
8
12
|
cfg.gsub! /^(snmp-server user (\S+) (\S+) auth (\S+)) (\S+) (priv) (\S+)/, '\\1 <configuration removed> '
|
@@ -10,18 +14,24 @@ class NXOS < Oxidized::Model
|
|
10
14
|
cfg.gsub! /^(radius-server key).*/, '\\1 <secret hidden>'
|
11
15
|
cfg
|
12
16
|
end
|
13
|
-
|
17
|
+
|
14
18
|
cmd 'show version' do |cfg|
|
19
|
+
cfg = filter cfg
|
15
20
|
cfg = cfg.each_line.take_while { |line| not line.match(/uptime/i) }
|
16
21
|
comment cfg.join ""
|
17
22
|
end
|
18
23
|
|
19
24
|
cmd 'show inventory' do |cfg|
|
25
|
+
cfg = filter cfg
|
20
26
|
comment cfg
|
21
|
-
end
|
27
|
+
end
|
22
28
|
|
23
29
|
cmd 'show running-config' do |cfg|
|
30
|
+
cfg = filter cfg
|
31
|
+
cfg.gsub! /^(show run.*)$/, '! \1'
|
24
32
|
cfg.gsub! /^!Time:[^\n]*\n/, ''
|
33
|
+
cfg.gsub! /^[\w.@_()-]+[#].*$/, ''
|
34
|
+
cfg
|
25
35
|
end
|
26
36
|
|
27
37
|
cfg :ssh, :telnet do
|
data/lib/oxidized/model/oneos.rb
CHANGED
@@ -1,25 +1,24 @@
|
|
1
1
|
class OneOS < Oxidized::Model
|
2
|
-
|
3
2
|
prompt /^([\w.@()-]+#\s?)$/
|
4
3
|
comment '! '
|
5
4
|
|
6
5
|
# example how to handle pager
|
7
|
-
#expect /^\s--More--\s+.*$/ do |data, re|
|
6
|
+
# expect /^\s--More--\s+.*$/ do |data, re|
|
8
7
|
# send ' '
|
9
8
|
# data.sub re, ''
|
10
|
-
#end
|
9
|
+
# end
|
11
10
|
|
12
11
|
# non-preferred way to handle additional PW prompt
|
13
|
-
#expect /^[\w.]+>$/ do |data|
|
12
|
+
# expect /^[\w.]+>$/ do |data|
|
14
13
|
# send "enable\n"
|
15
14
|
# send vars(:enable) + "\n"
|
16
15
|
# data
|
17
|
-
#end
|
16
|
+
# end
|
18
17
|
|
19
18
|
cmd :all do |cfg|
|
20
|
-
#cfg.gsub! /\cH+\s{8}/, '' # example how to handle pager
|
21
|
-
#cfg.gsub! /\cH+/, '' # example how to handle pager
|
22
|
-
cfg.
|
19
|
+
# cfg.gsub! /\cH+\s{8}/, '' # example how to handle pager
|
20
|
+
# cfg.gsub! /\cH+/, '' # example how to handle pager
|
21
|
+
cfg.cut_both
|
23
22
|
end
|
24
23
|
|
25
24
|
cmd :secret do |cfg|
|
@@ -31,6 +30,14 @@ class OneOS < Oxidized::Model
|
|
31
30
|
comment cfg
|
32
31
|
end
|
33
32
|
|
33
|
+
cmd 'show system hardware' do |cfg|
|
34
|
+
comment cfg
|
35
|
+
end
|
36
|
+
|
37
|
+
cmd 'show product-info-area' do |cfg|
|
38
|
+
comment cfg
|
39
|
+
end
|
40
|
+
|
34
41
|
cmd 'show running-config' do |cfg|
|
35
42
|
cfg = cfg.each_line.to_a[0..-1].join
|
36
43
|
cfg.gsub! /^Building configuration...\s*[^\n]*\n/, ''
|
@@ -54,5 +61,4 @@ class OneOS < Oxidized::Model
|
|
54
61
|
post_login 'term len 0'
|
55
62
|
pre_logout 'exit'
|
56
63
|
end
|
57
|
-
|
58
64
|
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
class Openbsd < Oxidized::Model
|
2
|
+
# OpenBSD with custom promp, like user@hostname:~$
|
3
|
+
# you can edit the one that your user uses, with root would be /root/.profile using the next PS1 def
|
4
|
+
# export PS1="\033[32m\u@\h\033[00m:\033[36m\w\033[00m$ "
|
5
|
+
|
6
|
+
prompt /^.+@.+\:.+\$/
|
7
|
+
comment '# '
|
8
|
+
|
9
|
+
# Add a comment between files/configs
|
10
|
+
def add_comment(comment)
|
11
|
+
"\n+++++++++++++++++++++++++++++++++++++++++ #{comment} ++++++++++++++++++++++++++++++++++++++++++++++\n"
|
12
|
+
end
|
13
|
+
|
14
|
+
def add_small_comment(comment)
|
15
|
+
"\n=============== #{comment} ===============\n"
|
16
|
+
end
|
17
|
+
|
18
|
+
cmd :all do |cfg|
|
19
|
+
cfg.each_line.to_a[1..-2].join
|
20
|
+
end
|
21
|
+
|
22
|
+
# Issue the show commands
|
23
|
+
pre do
|
24
|
+
cfg = add_comment('HOSTNAME FILE')
|
25
|
+
cfg += cmd('cat /etc/myname')
|
26
|
+
|
27
|
+
cfg += add_comment('RESOLV.CONF FILE')
|
28
|
+
cfg += cmd('cat /etc/resolv.conf')
|
29
|
+
|
30
|
+
cfg += add_comment('NTP.CONF FILE')
|
31
|
+
cfg += cmd('cat /etc/ntp.conf')
|
32
|
+
|
33
|
+
cfg += add_comment('PF FILE')
|
34
|
+
cfg += cmd('cat /etc/pf.conf')
|
35
|
+
|
36
|
+
cfg += add_comment('HOSTS FILE')
|
37
|
+
cfg += cmd('cat /etc/hosts')
|
38
|
+
|
39
|
+
cfg += add_comment('INTERFACE FILES')
|
40
|
+
cfg += cmd('tail -n +1 /etc/hostname.*')
|
41
|
+
|
42
|
+
cfg += add_comment('SNMP FILE')
|
43
|
+
cfg += cmd('cat /etc/snmpd.conf')
|
44
|
+
|
45
|
+
cfg += add_comment('MOTD FILE')
|
46
|
+
cfg += cmd('cat /etc/motd')
|
47
|
+
|
48
|
+
cfg += add_comment('PASSWD FILE')
|
49
|
+
cfg += cmd('cat /etc/passwd')
|
50
|
+
|
51
|
+
cfg += add_small_comment('END')
|
52
|
+
cfg
|
53
|
+
end
|
54
|
+
|
55
|
+
cfg :telnet do
|
56
|
+
username /^Username:/
|
57
|
+
password /^Password:/
|
58
|
+
end
|
59
|
+
|
60
|
+
cfg :telnet, :ssh do
|
61
|
+
pre_logout 'exit'
|
62
|
+
end
|
63
|
+
end
|
@@ -1,8 +1,7 @@
|
|
1
1
|
class OpenGear < Oxidized::Model
|
2
|
+
comment '# '
|
2
3
|
|
3
|
-
|
4
|
-
|
5
|
-
prompt /^(\$\s)?$/
|
4
|
+
prompt /^(\$\s)$/
|
6
5
|
|
7
6
|
cmd :secret do |cfg|
|
8
7
|
cfg.gsub!(/password (\S+)/, 'password <secret removed>')
|
@@ -15,7 +14,6 @@ class OpenGear < Oxidized::Model
|
|
15
14
|
cmd 'config -g config'
|
16
15
|
|
17
16
|
cfg :ssh do
|
18
|
-
exec true
|
17
|
+
exec true # don't run shell, run each command in exec channel
|
19
18
|
end
|
20
|
-
|
21
19
|
end
|