oxidized 0.24.0 → 0.25.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/.codeclimate.yml +4 -0
- data/.rubocop.yml +3 -0
- data/CHANGELOG.md +26 -2
- data/Dockerfile +8 -32
- data/README.md +17 -5
- data/bin/oxidized +1 -1
- data/docs/Configuration.md +41 -3
- data/docs/Hooks.md +26 -0
- data/docs/Model-Notes/AireOS.md +1 -2
- data/docs/Model-Notes/ArbOS.md +1 -2
- data/docs/Model-Notes/Comware.md +1 -2
- data/docs/Model-Notes/EOS.md +1 -2
- data/docs/Model-Notes/JunOS.md +1 -2
- data/docs/Model-Notes/Netgear.md +5 -6
- data/docs/Model-Notes/Nokia.md +9 -0
- data/docs/Model-Notes/README.md +3 -2
- data/docs/Model-Notes/VRP-Huawei.md +1 -2
- data/docs/Model-Notes/Viptela.md +12 -0
- data/docs/Model-Notes/XGS4600-Zyxel.md +1 -2
- data/docs/Ruby-API.md +54 -2
- data/docs/Supported-OS-Types.md +12 -0
- data/extra/oxidized.service +7 -0
- data/lib/oxidized/cli.rb +7 -0
- data/lib/oxidized/config.rb +3 -0
- data/lib/oxidized/core.rb +1 -0
- data/lib/oxidized/hook/ciscosparkdiff.rb +11 -17
- data/lib/oxidized/hook/slackdiff.rb +5 -11
- data/lib/oxidized/hook/xmppdiff.rb +1 -0
- data/lib/oxidized/input/ssh.rb +43 -27
- data/lib/oxidized/input/telnet.rb +1 -0
- data/lib/oxidized/model/acos.rb +2 -2
- data/lib/oxidized/model/acsw.rb +6 -6
- data/lib/oxidized/model/adtran.rb +22 -0
- data/lib/oxidized/model/aen.rb +2 -2
- data/lib/oxidized/model/aireos.rb +3 -2
- data/lib/oxidized/model/alteonos.rb +2 -2
- data/lib/oxidized/model/aos.rb +1 -1
- data/lib/oxidized/model/aos7.rb +1 -1
- data/lib/oxidized/model/aosw.rb +5 -3
- data/lib/oxidized/model/apc_aos.rb +1 -1
- data/lib/oxidized/model/arbos.rb +2 -2
- data/lib/oxidized/model/asa.rb +8 -2
- data/lib/oxidized/model/awplus.rb +1 -1
- data/lib/oxidized/model/axos.rb +16 -0
- data/lib/oxidized/model/c4cmts.rb +3 -5
- data/lib/oxidized/model/casa.rb +1 -1
- data/lib/oxidized/model/catos.rb +1 -1
- data/lib/oxidized/model/ciscosma.rb +1 -1
- data/lib/oxidized/model/ciscosmb.rb +10 -4
- data/lib/oxidized/model/comtrol.rb +41 -0
- data/lib/oxidized/model/comware.rb +1 -1
- data/lib/oxidized/model/coriantgroove.rb +4 -6
- data/lib/oxidized/model/cumulus.rb +14 -1
- data/lib/oxidized/model/datacom.rb +1 -2
- data/lib/oxidized/model/dcnos.rb +1 -1
- data/lib/oxidized/model/dellx.rb +76 -0
- data/lib/oxidized/model/dlink.rb +2 -2
- data/lib/oxidized/model/dnos.rb +3 -1
- data/lib/oxidized/model/eciapollo.rb +34 -0
- data/lib/oxidized/model/edgecos.rb +1 -0
- data/lib/oxidized/model/edgeos.rb +6 -1
- data/lib/oxidized/model/eos.rb +3 -2
- data/lib/oxidized/model/fiberdriver.rb +1 -1
- data/lib/oxidized/model/firebrick.rb +31 -0
- data/lib/oxidized/model/firewareos.rb +1 -1
- data/lib/oxidized/model/fortios.rb +5 -4
- data/lib/oxidized/model/ftos.rb +4 -1
- data/lib/oxidized/model/fujitsupy.rb +3 -3
- data/lib/oxidized/model/gaiaos.rb +1 -1
- data/lib/oxidized/model/gcombnps.rb +3 -1
- data/lib/oxidized/model/hatteras.rb +1 -1
- data/lib/oxidized/model/hirschmann.rb +2 -2
- data/lib/oxidized/model/hpebladesystem.rb +1 -1
- data/lib/oxidized/model/ios.rb +21 -13
- data/lib/oxidized/model/ipos.rb +3 -3
- data/lib/oxidized/model/ironware.rb +3 -3
- data/lib/oxidized/model/isam.rb +1 -1
- data/lib/oxidized/model/junos.rb +1 -1
- data/lib/oxidized/model/masteros.rb +2 -3
- data/lib/oxidized/model/mlnxos.rb +5 -5
- data/lib/oxidized/model/model.rb +3 -0
- data/lib/oxidized/model/ndms.rb +1 -2
- data/lib/oxidized/model/netgear.rb +7 -9
- data/lib/oxidized/model/netonix.rb +1 -1
- data/lib/oxidized/model/netscaler.rb +6 -1
- data/lib/oxidized/model/nos.rb +2 -2
- data/lib/oxidized/model/oneos.rb +1 -1
- data/lib/oxidized/model/openbsd.rb +8 -22
- data/lib/oxidized/model/openwrt.rb +1 -0
- data/lib/oxidized/model/opnsense.rb +1 -1
- data/lib/oxidized/model/panos.rb +9 -9
- data/lib/oxidized/model/pfsense.rb +2 -1
- data/lib/oxidized/model/planet.rb +1 -1
- data/lib/oxidized/model/powerconnect.rb +7 -4
- data/lib/oxidized/model/procurve.rb +7 -5
- data/lib/oxidized/model/routeros.rb +1 -1
- data/lib/oxidized/model/saos.rb +1 -1
- data/lib/oxidized/model/screenos.rb +3 -3
- data/lib/oxidized/model/sros.rb +2 -2
- data/lib/oxidized/model/stoneos.rb +1 -1
- data/lib/oxidized/model/tmos.rb +2 -0
- data/lib/oxidized/model/tplink.rb +4 -0
- data/lib/oxidized/model/viptela.rb +29 -0
- data/lib/oxidized/model/voltaire.rb +5 -5
- data/lib/oxidized/model/voss.rb +4 -4
- data/lib/oxidized/model/vrp.rb +1 -1
- data/lib/oxidized/model/vyatta.rb +1 -1
- data/lib/oxidized/model/weos.rb +1 -1
- data/lib/oxidized/model/xos.rb +9 -2
- data/lib/oxidized/node.rb +20 -31
- data/lib/oxidized/nodes.rb +3 -0
- data/lib/oxidized/output/git.rb +17 -20
- data/lib/oxidized/output/gitcrypt.rb +2 -1
- data/lib/oxidized/output/http.rb +19 -12
- data/lib/oxidized/source/csv.rb +15 -8
- data/lib/oxidized/source/http.rb +26 -22
- data/lib/oxidized/string.rb +9 -4
- data/lib/oxidized/version.rb +2 -2
- data/lib/oxidized/worker.rb +44 -36
- data/oxidized.gemspec +1 -4
- metadata +26 -16
data/docs/Ruby-API.md
CHANGED
|
@@ -43,6 +43,8 @@ it at least once is required for a model to work.
|
|
|
43
43
|
The block may contain commands to change some behaviour for the given methods
|
|
44
44
|
(e.g. calling `post_login` to disable the pager).
|
|
45
45
|
|
|
46
|
+
Supports [monkey patching](#monkey-patching).
|
|
47
|
+
|
|
46
48
|
#### `cmd`
|
|
47
49
|
|
|
48
50
|
Is used to specify commands that should be executed on a model in order to
|
|
@@ -75,6 +77,8 @@ string.
|
|
|
75
77
|
Execution order is `:all`, `:secret`, and lastly the command specific block, if
|
|
76
78
|
given.
|
|
77
79
|
|
|
80
|
+
Supports [monkey patching](#monkey-patching).
|
|
81
|
+
|
|
78
82
|
#### `comment`
|
|
79
83
|
|
|
80
84
|
Called with a single string containing the string to prepend for comments in
|
|
@@ -99,6 +103,8 @@ The passed data is replaced by the return value of the block.
|
|
|
99
103
|
`expect` can be used to, for example, strip escape sequences from output before
|
|
100
104
|
it's further processed.
|
|
101
105
|
|
|
106
|
+
Supports [monkey patching](#monkey-patching).
|
|
107
|
+
|
|
102
108
|
### At the second level
|
|
103
109
|
|
|
104
110
|
The following methods are available:
|
|
@@ -119,7 +125,11 @@ Used inside `cfg` invocations to specify commands to run once Oxidized has
|
|
|
119
125
|
logged in to the device. Takes one argument that is either a block (taking zero
|
|
120
126
|
parameters) or a string containing a command to execute.
|
|
121
127
|
|
|
122
|
-
This allows `post_login` to be used for any model-specific items prior to
|
|
128
|
+
This allows `post_login` to be used for any model-specific items prior to
|
|
129
|
+
running the regular commands. This could include disabling the output pager
|
|
130
|
+
or timestamp outputs that would cause constant differences.
|
|
131
|
+
|
|
132
|
+
Supports [monkey patching](#monkey-patching).
|
|
123
133
|
|
|
124
134
|
#### `pre_logout`
|
|
125
135
|
|
|
@@ -127,9 +137,51 @@ Used to specify commands to run before Oxidized closes the connection to the
|
|
|
127
137
|
device. Takes one argument that is either a block (taking zero parameters) or a
|
|
128
138
|
string containing a command to execute.
|
|
129
139
|
|
|
130
|
-
This allows `pre_logout` to be used to 'undo' any changes that may have been
|
|
140
|
+
This allows `pre_logout` to be used to 'undo' any changes that may have been
|
|
141
|
+
needed via `post_login` (restore pager output, etc.)
|
|
142
|
+
|
|
143
|
+
Supports [monkey patching](#monkey-patching).
|
|
131
144
|
|
|
132
145
|
#### `send`
|
|
133
146
|
|
|
134
147
|
Usually used inside `expect` or blocks passed to `post_login`/`pre_logout`.
|
|
135
148
|
Takes a single parameter: a string to be sent to the device.
|
|
149
|
+
|
|
150
|
+
### Monkey patching
|
|
151
|
+
|
|
152
|
+
Several model blocks accept behavior-modifying arguments that make monkey
|
|
153
|
+
patching existing blocks easier. This is primarily useful when a user-supplied
|
|
154
|
+
model aims to override or extend existing behavior of a model included in Oxidized.
|
|
155
|
+
|
|
156
|
+
This functionality is supported by `cfg`, `cmd`, `pre_*`, `post_*`, and `expect`
|
|
157
|
+
blocks.
|
|
158
|
+
|
|
159
|
+
#### `clear: true`
|
|
160
|
+
|
|
161
|
+
Resets the existing block, allowing the user to completely override its contents.
|
|
162
|
+
|
|
163
|
+
#### `prepend: true`
|
|
164
|
+
|
|
165
|
+
Ensures that the contents of the block are prepended, rather than appended (the
|
|
166
|
+
default) to an existing block.
|
|
167
|
+
|
|
168
|
+
### `String` convenience methods
|
|
169
|
+
|
|
170
|
+
Since configuration processing tasks are occasionally similar across models,
|
|
171
|
+
Oxidized provides an extended [`String`](/lib/oxidized/string.rb) class with the
|
|
172
|
+
intention of providing convenience methods and eliminating code duplication.
|
|
173
|
+
|
|
174
|
+
#### `cut_tail`
|
|
175
|
+
|
|
176
|
+
Returns a multi-line string without the last line, or an empty string if only a
|
|
177
|
+
single line was present.
|
|
178
|
+
|
|
179
|
+
#### `cut_head`
|
|
180
|
+
|
|
181
|
+
Returns a multi-line string without the first line, or an empty string if only a
|
|
182
|
+
single line was present.
|
|
183
|
+
|
|
184
|
+
#### `cut_both`
|
|
185
|
+
|
|
186
|
+
Returns a multi-line string without the first and last lines, or an empty string
|
|
187
|
+
if fewer than three lines were present.
|
data/docs/Supported-OS-Types.md
CHANGED
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
* [ACOS](/lib/oxidized/model/acos.rb)
|
|
7
7
|
* Accedian Performance Elements (NIDs)
|
|
8
8
|
* [AEN](/lib/oxidized/model/aen.rb)
|
|
9
|
+
* Adtran
|
|
10
|
+
* [Total Access (AOS)](/lib/oxidized/model/adtran.rb)
|
|
9
11
|
* Alcatel-Lucent
|
|
10
12
|
* [AOS](/lib/oxidized/model/aos.rb)
|
|
11
13
|
* [AOS7](/lib/oxidized/model/aos7.rb)
|
|
@@ -38,6 +40,8 @@
|
|
|
38
40
|
* [Vyatta](/lib/oxidized/model/vyatta.rb)
|
|
39
41
|
* [6910](/lib/oxidized/model/br6910.rb)
|
|
40
42
|
* [SLX-OS](/lib/oxidized/model/slxos.rb)
|
|
43
|
+
* Calix
|
|
44
|
+
* [AXOS](/lib/oxidized/model/axos.rb)
|
|
41
45
|
* Casa
|
|
42
46
|
* [Casa](/lib/oxidized/model/casa.rb)
|
|
43
47
|
* Check Point
|
|
@@ -65,6 +69,8 @@
|
|
|
65
69
|
* [Groove](/lib/oxidized/model/coriantgroove.rb)
|
|
66
70
|
* ComNet
|
|
67
71
|
* [ComNet Microsemi Switch](/lib/oxidized/model/comnetms.rb)
|
|
72
|
+
* Comtrol
|
|
73
|
+
* [RocketLinx](/lib/oxidized/model/comtrol.rb)
|
|
68
74
|
* Cumulus
|
|
69
75
|
* [Linux](/lib/oxidized/model/cumulus.rb)
|
|
70
76
|
* DataCom
|
|
@@ -74,8 +80,11 @@
|
|
|
74
80
|
* DELL
|
|
75
81
|
* [PowerConnect](/lib/oxidized/model/powerconnect.rb)
|
|
76
82
|
* [AOSW](/lib/oxidized/model/aosw.rb)
|
|
83
|
+
* [DellX](/lib/oxidized/model/dellx.rb)
|
|
77
84
|
* D-Link
|
|
78
85
|
* [D-Link](/lib/oxidized/model/dlink.rb)
|
|
86
|
+
* ECI Telecom
|
|
87
|
+
* [ECIapollo](/lib/oxidized/model/eciapollo.rb)
|
|
79
88
|
* EdgeCore
|
|
80
89
|
* [ES3528M](/lib/oxidized/model/edgecos.rb)
|
|
81
90
|
* Ericsson/Redback
|
|
@@ -84,10 +93,13 @@
|
|
|
84
93
|
* [Enterasys](/lib/oxidized/model/enterasys.rb)
|
|
85
94
|
* [WM](/lib/oxidized/model/mtrlrfs.rb)
|
|
86
95
|
* [XOS](/lib/oxidized/model/xos.rb)
|
|
96
|
+
* [ExtremeWare](/lib/oxidized/model/xos.rb)
|
|
87
97
|
* F5
|
|
88
98
|
* [TMOS](/lib/oxidized/model/tmos.rb)
|
|
89
99
|
* Fiberstore
|
|
90
100
|
* [S3800](/lib/oxidized/model/gcombnps.rb)
|
|
101
|
+
* Firebrick
|
|
102
|
+
* [FBxxxx](/lib/oxidized/model/firebrick.rb)
|
|
91
103
|
* Force10
|
|
92
104
|
* [DNOS](/lib/oxidized/model/dnos.rb)
|
|
93
105
|
* [FTOS](/lib/oxidized/model/ftos.rb)
|
data/extra/oxidized.service
CHANGED
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
#For debian 8 put it in /lib/systemd/system/
|
|
2
|
+
#To set OXIDIZED_HOME instead of the default:
|
|
3
|
+
# ~${oxidized_user}/.config/oxidized in debian 8, then uncomment
|
|
4
|
+
#(and modify as required) the "Environment" variable below so
|
|
5
|
+
#systemd sets the correct environment. Tested only on Debian 8.8.
|
|
6
|
+
#YMMV otherwise.
|
|
7
|
+
#
|
|
2
8
|
#For RHEL / CentOS 7 put it in /etc/systemd/system/
|
|
3
9
|
#and call it with systemctl start oxidized.service
|
|
4
10
|
|
|
@@ -11,6 +17,7 @@ Wants=network-online.target
|
|
|
11
17
|
ExecStart=/usr/local/bin/oxidized
|
|
12
18
|
User=oxidized
|
|
13
19
|
KillSignal=SIGKILL
|
|
20
|
+
#Environment="OXIDIZED_HOME=/etc/oxidized"
|
|
14
21
|
|
|
15
22
|
[Install]
|
|
16
23
|
WantedBy=multi-user.target
|
data/lib/oxidized/cli.rb
CHANGED
|
@@ -43,6 +43,11 @@ module Oxidized
|
|
|
43
43
|
opts = Slop.new(:help => true) do
|
|
44
44
|
on 'd', 'debug', 'turn on debugging'
|
|
45
45
|
on 'daemonize', 'Daemonize/fork the process'
|
|
46
|
+
on 'show-exhaustive-config', 'output entire configuration, including defaults' do
|
|
47
|
+
asetus = Config.load
|
|
48
|
+
puts asetus.to_yaml asetus.cfg
|
|
49
|
+
Kernel.exit
|
|
50
|
+
end
|
|
46
51
|
on 'v', 'version', 'show version' do
|
|
47
52
|
puts Oxidized::VERSION_FULL
|
|
48
53
|
Kernel.exit
|
|
@@ -85,8 +90,10 @@ module Oxidized
|
|
|
85
90
|
|
|
86
91
|
def pid_status(pidfile)
|
|
87
92
|
return :exited unless File.exists?(pidfile)
|
|
93
|
+
|
|
88
94
|
pid = ::File.read(pidfile).to_i
|
|
89
95
|
return :dead if pid == 0
|
|
96
|
+
|
|
90
97
|
Process.kill(0, pid)
|
|
91
98
|
:running
|
|
92
99
|
rescue Errno::ESRCH
|
data/lib/oxidized/config.rb
CHANGED
|
@@ -35,6 +35,9 @@ module Oxidized
|
|
|
35
35
|
asetus.default.models = {} # model level configuration
|
|
36
36
|
asetus.default.pid = File.join(Oxidized::Config::Root, 'pid')
|
|
37
37
|
|
|
38
|
+
asetus.default.crash.directory = File.join(Oxidized::Config::Root, 'crashes')
|
|
39
|
+
asetus.default.crash.hostnames = false
|
|
40
|
+
|
|
38
41
|
asetus.default.stats.history_size = 10
|
|
39
42
|
asetus.default.input.default = 'ssh, telnet'
|
|
40
43
|
asetus.default.input.debug = false # or String for session log file
|
data/lib/oxidized/core.rb
CHANGED
|
@@ -13,6 +13,7 @@ module Oxidized
|
|
|
13
13
|
Oxidized.Hooks = HookManager.from_config(Oxidized.config)
|
|
14
14
|
nodes = Nodes.new
|
|
15
15
|
raise NoNodesFound, 'source returns no usable nodes' if nodes.size == 0
|
|
16
|
+
|
|
16
17
|
@worker = Worker.new nodes
|
|
17
18
|
trap('HUP') { nodes.load }
|
|
18
19
|
if Oxidized.config.rest?
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
require 'cisco_spark'
|
|
2
2
|
|
|
3
3
|
# defaults to posting a diff, if messageformat is supplied them a message will be posted too
|
|
4
|
-
#
|
|
4
|
+
# diff defaults to true
|
|
5
5
|
# Modified from slackdiff
|
|
6
6
|
|
|
7
7
|
class CiscoSparkDiff < Oxidized::Hook
|
|
@@ -13,37 +13,31 @@ class CiscoSparkDiff < Oxidized::Hook
|
|
|
13
13
|
def run_hook(ctx)
|
|
14
14
|
return unless ctx.node
|
|
15
15
|
return unless ctx.event.to_s == "post_store"
|
|
16
|
+
|
|
16
17
|
log "Connecting to Cisco Spark"
|
|
17
18
|
CiscoSpark.configure do |config|
|
|
18
19
|
config.api_key = cfg.accesskey
|
|
19
20
|
config.proxy = cfg.proxy if cfg.has_key?('proxy')
|
|
20
21
|
end
|
|
21
|
-
|
|
22
|
-
client = CiscoSpark::Room.new(id: space)
|
|
23
|
-
client.fetch
|
|
22
|
+
room = CiscoSpark::Room.new(id: cfg.space)
|
|
24
23
|
log "Connected"
|
|
25
|
-
|
|
26
|
-
if cfg.has_key?(
|
|
27
|
-
if cfg.diff == false
|
|
28
|
-
diffenable = false
|
|
29
|
-
end
|
|
30
|
-
end
|
|
31
|
-
if diffenable == true
|
|
24
|
+
|
|
25
|
+
if cfg.has_key?("diff") ? cfg.diff : true
|
|
32
26
|
gitoutput = ctx.node.output.new
|
|
33
27
|
diff = gitoutput.get_diff ctx.node, ctx.node.group, ctx.commitref, nil
|
|
34
28
|
title = ctx.node.name.to_s
|
|
35
29
|
log "Posting diff as snippet to #{cfg.space}"
|
|
36
|
-
|
|
37
|
-
room = CiscoSpark::Room.new(id: space)
|
|
38
|
-
room.send_message(message)
|
|
30
|
+
room.send_message CiscoSpark::Message.new(text: 'Device ' + title + ' modified:' + "\n" + diff[:patch].lines.to_a[4..-1].join)
|
|
39
31
|
end
|
|
40
|
-
|
|
32
|
+
|
|
33
|
+
if cfg.message?
|
|
41
34
|
log cfg.message
|
|
42
|
-
msg = cfg.message % { :
|
|
35
|
+
msg = cfg.message % { node: ctx.node.name.to_s, group: ctx.node.group.to_s, commitref: ctx.commitref, model: ctx.node.model.class.name.to_s.downcase }
|
|
43
36
|
log msg
|
|
44
37
|
log "Posting message to #{cfg.space}"
|
|
45
|
-
|
|
38
|
+
room.send_message CiscoSpark::Message.new(text: msg)
|
|
46
39
|
end
|
|
40
|
+
|
|
47
41
|
log "Finished"
|
|
48
42
|
end
|
|
49
43
|
end
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
require 'slack'
|
|
2
2
|
|
|
3
3
|
# defaults to posting a diff, if messageformat is supplied them a message will be posted too
|
|
4
|
-
#
|
|
4
|
+
# diff defaults to true
|
|
5
5
|
|
|
6
6
|
class SlackDiff < Oxidized::Hook
|
|
7
7
|
def validate_cfg!
|
|
@@ -12,6 +12,7 @@ class SlackDiff < Oxidized::Hook
|
|
|
12
12
|
def run_hook(ctx)
|
|
13
13
|
return unless ctx.node
|
|
14
14
|
return unless ctx.event.to_s == "post_store"
|
|
15
|
+
|
|
15
16
|
log "Connecting to slack"
|
|
16
17
|
Slack.configure do |config|
|
|
17
18
|
config.token = cfg.token
|
|
@@ -20,14 +21,7 @@ class SlackDiff < Oxidized::Hook
|
|
|
20
21
|
client = Slack::Client.new
|
|
21
22
|
client.auth_test
|
|
22
23
|
log "Connected"
|
|
23
|
-
|
|
24
|
-
diffenable = true
|
|
25
|
-
if cfg.has_key?('diff') == true
|
|
26
|
-
if cfg.diff == false
|
|
27
|
-
diffenable = false
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
if diffenable == true
|
|
24
|
+
if cfg.has_key?("diff") ? cfg.diff : true
|
|
31
25
|
gitoutput = ctx.node.output.new
|
|
32
26
|
diff = gitoutput.get_diff ctx.node, ctx.node.group, ctx.commitref, nil
|
|
33
27
|
unless diff == "no diffs"
|
|
@@ -41,9 +35,9 @@ class SlackDiff < Oxidized::Hook
|
|
|
41
35
|
end
|
|
42
36
|
end
|
|
43
37
|
# message custom formatted - optional
|
|
44
|
-
if cfg.
|
|
38
|
+
if cfg.message?
|
|
45
39
|
log cfg.message
|
|
46
|
-
msg = cfg.message % { :
|
|
40
|
+
msg = cfg.message % { node: ctx.node.name.to_s, group: ctx.node.group.to_s, commitref: ctx.commitref, model: ctx.node.model.class.name.to_s.downcase }
|
|
47
41
|
log msg
|
|
48
42
|
log "Posting message to #{cfg.channel}"
|
|
49
43
|
client.chat_postMessage(channel: cfg.channel, text: msg, as_user: true)
|
data/lib/oxidized/input/ssh.rb
CHANGED
|
@@ -21,36 +21,10 @@ module Oxidized
|
|
|
21
21
|
@output = ''
|
|
22
22
|
@pty_options = { term: "vt100" }
|
|
23
23
|
@node.model.cfg['ssh'].each { |cb| instance_exec(&cb) }
|
|
24
|
-
secure = Oxidized.config.input.ssh.secure
|
|
25
24
|
@log = File.open(Oxidized::Config::Log + "/#{@node.ip}-ssh", 'w') if Oxidized.config.input.debug?
|
|
26
|
-
port = vars(:ssh_port) || 22
|
|
27
|
-
|
|
28
|
-
ssh_opts = {
|
|
29
|
-
port: port.to_i,
|
|
30
|
-
paranoid: secure,
|
|
31
|
-
keepalive: true,
|
|
32
|
-
password: @node.auth[:password], :timeout => Oxidized.config.timeout,
|
|
33
|
-
number_of_password_prompts: 0,
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
auth_methods = vars(:auth_methods) || %w(none publickey password)
|
|
37
|
-
ssh_opts[:auth_methods] = auth_methods
|
|
38
|
-
Oxidized.logger.debug "AUTH METHODS::#{auth_methods}"
|
|
39
|
-
|
|
40
|
-
if proxy_host = vars(:ssh_proxy)
|
|
41
|
-
proxy_command = "ssh "
|
|
42
|
-
proxy_command += "-o StrictHostKeyChecking=no " unless secure
|
|
43
|
-
proxy_command += "#{proxy_host} -W %h:%p"
|
|
44
|
-
proxy = Net::SSH::Proxy::Command.new(proxy_command)
|
|
45
|
-
ssh_opts[:proxy] = proxy
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
ssh_opts[:keys] = vars(:ssh_keys).is_a?(Array) ? vars(:ssh_keys) : [vars(:ssh_keys)] if vars(:ssh_keys)
|
|
49
|
-
ssh_opts[:kex] = vars(:ssh_kex).split(/,\s*/) if vars(:ssh_kex)
|
|
50
|
-
ssh_opts[:encryption] = vars(:ssh_encryption).split(/,\s*/) if vars(:ssh_encryption)
|
|
51
25
|
|
|
52
26
|
Oxidized.logger.debug "lib/oxidized/input/ssh.rb: Connecting to #{@node.name}"
|
|
53
|
-
@ssh = Net::SSH.start(@node.ip, @node.auth[:username],
|
|
27
|
+
@ssh = Net::SSH.start(@node.ip, @node.auth[:username], make_ssh_opts)
|
|
54
28
|
unless @exec
|
|
55
29
|
shell_open @ssh
|
|
56
30
|
begin
|
|
@@ -111,6 +85,7 @@ module Oxidized
|
|
|
111
85
|
end
|
|
112
86
|
ch.request_pty (@pty_options) do |_ch, success_pty|
|
|
113
87
|
raise NoShell, "Can't get PTY" unless success_pty
|
|
88
|
+
|
|
114
89
|
ch.send_channel_request 'shell' do |_ch, success_shell|
|
|
115
90
|
raise NoShell, "Can't get shell" unless success_shell
|
|
116
91
|
end
|
|
@@ -138,9 +113,50 @@ module Oxidized
|
|
|
138
113
|
sleep 0.1
|
|
139
114
|
match = regexps.find { |regexp| @output.match regexp }
|
|
140
115
|
return match if match
|
|
116
|
+
|
|
141
117
|
true
|
|
142
118
|
end
|
|
143
119
|
end
|
|
144
120
|
end
|
|
121
|
+
|
|
122
|
+
def make_ssh_opts
|
|
123
|
+
secure = Oxidized.config.input.ssh.secure?
|
|
124
|
+
ssh_opts = {
|
|
125
|
+
port: (vars(:ssh_port) || 22).to_i,
|
|
126
|
+
paranoid: secure,
|
|
127
|
+
keepalive: vars(:ssh_no_keepalive) ? false : true,
|
|
128
|
+
password: @node.auth[:password],
|
|
129
|
+
timeout: Oxidized.config.timeout,
|
|
130
|
+
number_of_password_prompts: 0
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
auth_methods = vars(:auth_methods) || %w(none publickey password)
|
|
134
|
+
ssh_opts[:auth_methods] = auth_methods
|
|
135
|
+
Oxidized.logger.debug "AUTH METHODS::#{auth_methods}"
|
|
136
|
+
|
|
137
|
+
if proxy_host = vars(:ssh_proxy)
|
|
138
|
+
proxy_command = "ssh "
|
|
139
|
+
proxy_command += "-o StrictHostKeyChecking=no " unless secure
|
|
140
|
+
if proxy_port = vars(:ssh_proxy_port)
|
|
141
|
+
proxy_command += "-p #{proxy_port} "
|
|
142
|
+
end
|
|
143
|
+
proxy_command += "#{proxy_host} -W %h:%p"
|
|
144
|
+
proxy = Net::SSH::Proxy::Command.new(proxy_command)
|
|
145
|
+
ssh_opts[:proxy] = proxy
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
ssh_opts[:keys] = [vars(:ssh_keys)].flatten if vars(:ssh_keys)
|
|
149
|
+
ssh_opts[:kex] = vars(:ssh_kex).split(/,\s*/) if vars(:ssh_kex)
|
|
150
|
+
ssh_opts[:encryption] = vars(:ssh_encryption).split(/,\s*/) if vars(:ssh_encryption)
|
|
151
|
+
ssh_opts[:host_key] = vars(:ssh_host_key).split(/,\s*/) if vars(:ssh_host_key)
|
|
152
|
+
ssh_opts[:hmac] = vars(:ssh_hmac).split(/,\s*/) if vars(:ssh_hmac)
|
|
153
|
+
|
|
154
|
+
if Oxidized.config.input.debug?
|
|
155
|
+
ssh_opts[:logger] = Oxidized.logger
|
|
156
|
+
ssh_opts[:verbose] = Logger::DEBUG
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
ssh_opts
|
|
160
|
+
end
|
|
145
161
|
end
|
|
146
162
|
end
|
data/lib/oxidized/model/acos.rb
CHANGED
|
@@ -4,7 +4,7 @@ class ACOS < Oxidized::Model
|
|
|
4
4
|
comment '! '
|
|
5
5
|
|
|
6
6
|
# ACOS prompt changes depending on the state of the device
|
|
7
|
-
prompt /^([-\w.\/:?\[\]
|
|
7
|
+
prompt /^([-\w.\/:?\[\]()]+[#>]\s?)$/
|
|
8
8
|
|
|
9
9
|
cmd :secret do |cfg|
|
|
10
10
|
cfg.gsub!(/community read encrypted (\S+)/, 'community read encrypted <hidden>') # snmp
|
|
@@ -60,7 +60,7 @@ class ACOS < Oxidized::Model
|
|
|
60
60
|
|
|
61
61
|
cmd :all do |cfg, cmdstring|
|
|
62
62
|
new_cfg = comment "COMMAND: #{cmdstring}\n"
|
|
63
|
-
new_cfg << cfg.
|
|
63
|
+
new_cfg << cfg.cut_both
|
|
64
64
|
end
|
|
65
65
|
|
|
66
66
|
pre do
|
data/lib/oxidized/model/acsw.rb
CHANGED
|
@@ -4,7 +4,7 @@ class ACSW < Oxidized::Model
|
|
|
4
4
|
|
|
5
5
|
cmd :all do |cfg|
|
|
6
6
|
cfg.gsub! /^% Invalid input detected at '\^' marker\.$|^\s+\^$/, ''
|
|
7
|
-
cfg.
|
|
7
|
+
cfg.cut_both
|
|
8
8
|
end
|
|
9
9
|
|
|
10
10
|
cmd :secret do |cfg|
|
|
@@ -36,11 +36,11 @@ class ACSW < Oxidized::Model
|
|
|
36
36
|
cfg = cfg.each_line.to_a[3..-1]
|
|
37
37
|
cfg = cfg.reject { |line| line.match /^ntp clock-period / }.join
|
|
38
38
|
cfg.gsub! /^Current configuration : [^\n]*\n/, ''
|
|
39
|
-
cfg.gsub!
|
|
40
|
-
(
|
|
41
|
-
tunnel
|
|
42
|
-
cfg.gsub! /^([\s\t
|
|
43
|
-
cfg.gsub! /^([\s\t
|
|
39
|
+
cfg.gsub! /^ tunnel mpls traffic-eng bandwidth[^\n]*\n*(
|
|
40
|
+
(?: [^\n]*\n*)*
|
|
41
|
+
tunnel mpls traffic-eng auto-bw)/mx, '\1'
|
|
42
|
+
cfg.gsub! /^([\s\t!]*Last configuration change ).*/, ''
|
|
43
|
+
cfg.gsub! /^([\s\t!]*NVRAM config last ).*/, ''
|
|
44
44
|
cfg
|
|
45
45
|
end
|
|
46
46
|
|