oxidized 0.28.0 → 0.29.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/.github/workflows/publishdocker.yml +8 -1
- data/.github/workflows/ruby.yml +42 -0
- data/.rubocop.yml +30 -10
- data/.rubocop_todo.yml +95 -41
- data/CHANGELOG.md +139 -2
- data/Dockerfile +13 -9
- data/README.md +66 -32
- data/Rakefile +2 -0
- data/docs/Configuration.md +49 -7
- data/docs/Creating-Models.md +10 -4
- data/docs/Hooks.md +35 -6
- data/docs/Model-Notes/ADVA.md +12 -0
- data/docs/Model-Notes/Cumulus.md +7 -1
- data/docs/Model-Notes/IOS.md +36 -0
- data/docs/Model-Notes/JunOS.md +3 -3
- data/docs/Model-Notes/LenovoNOS.md +29 -0
- data/docs/Model-Notes/LinksysSRW.md +15 -0
- data/docs/Model-Notes/Nokia.md +3 -0
- data/docs/Model-Notes/OS10.md +33 -0
- data/docs/Model-Notes/PanOS_API.md +28 -0
- data/docs/Model-Notes/README.md +2 -0
- data/docs/Sources.md +18 -0
- data/docs/Supported-OS-Types.md +51 -6
- data/docs/Troubleshooting.md +1 -1
- data/extra/gitdiff-msteams.sh +91 -0
- data/extra/nagios_check_failing_nodes.rb +6 -9
- data/extra/oxidized-report-git-commits +71 -14
- data/extra/oxidized.init +2 -5
- data/extra/oxidized.logrotate +1 -0
- data/extra/oxidized.runit +4 -1
- data/extra/oxidized.service +5 -8
- data/extra/rest_client.rb +1 -1
- data/extra/syslog.rb +2 -2
- data/lib/oxidized/cli.rb +1 -1
- data/lib/oxidized/config/vars.rb +5 -2
- data/lib/oxidized/config.rb +6 -3
- data/lib/oxidized/core.rb +1 -1
- data/lib/oxidized/hook/exec.rb +6 -6
- data/lib/oxidized/hook/githubrepo.rb +42 -11
- data/lib/oxidized/hook/slackdiff.rb +2 -2
- data/lib/oxidized/hook/xmppdiff.rb +45 -25
- data/lib/oxidized/hook.rb +4 -8
- data/lib/oxidized/input/exec.rb +1 -1
- data/lib/oxidized/input/input.rb +1 -0
- data/lib/oxidized/input/ssh.rb +23 -20
- data/lib/oxidized/input/telnet.rb +52 -44
- data/lib/oxidized/job.rb +1 -0
- data/lib/oxidized/jobs.rb +11 -6
- data/lib/oxidized/manager.rb +1 -0
- data/lib/oxidized/model/acmepacket.rb +38 -0
- data/lib/oxidized/model/adtran.rb +5 -3
- data/lib/oxidized/model/adva.rb +66 -0
- data/lib/oxidized/model/airfiber.rb +1 -1
- data/lib/oxidized/model/aoscx.rb +96 -0
- data/lib/oxidized/model/aosw.rb +1 -1
- data/lib/oxidized/model/asa.rb +2 -0
- data/lib/oxidized/model/awplus.rb +1 -1
- data/lib/oxidized/model/bdcom.rb +49 -0
- data/lib/oxidized/model/cambiumepmp.rb +17 -0
- data/lib/oxidized/model/casa.rb +4 -1
- data/lib/oxidized/model/ciscoce.rb +12 -0
- data/lib/oxidized/model/ciscosmb.rb +2 -0
- data/lib/oxidized/model/comware.rb +16 -1
- data/lib/oxidized/model/cumulus.rb +58 -44
- data/lib/oxidized/model/dellx.rb +1 -3
- data/lib/oxidized/model/dlink.rb +2 -1
- data/lib/oxidized/model/edgecos.rb +22 -2
- data/lib/oxidized/model/edgeswitch.rb +4 -4
- data/lib/oxidized/model/eltex.rb +48 -0
- data/lib/oxidized/model/enterasys.rb +18 -3
- data/lib/oxidized/model/enterasys800.rb +29 -0
- data/lib/oxidized/model/eos.rb +2 -1
- data/lib/oxidized/model/fabricos.rb +1 -1
- data/lib/oxidized/model/fastiron.rb +3 -2
- data/lib/oxidized/model/fortios.rb +24 -11
- data/lib/oxidized/model/fortiwlc.rb +24 -0
- data/lib/oxidized/model/gaiaos.rb +40 -3
- data/lib/oxidized/model/h3c.rb +40 -0
- data/lib/oxidized/model/hatteras.rb +2 -2
- data/lib/oxidized/model/hios.rb +38 -0
- data/lib/oxidized/model/hpebladesystem.rb +1 -1
- data/lib/oxidized/model/ios.rb +13 -10
- data/lib/oxidized/model/iosxe.rb +1 -1
- data/lib/oxidized/model/ironware.rb +8 -4
- data/lib/oxidized/model/junos.rb +5 -1
- data/lib/oxidized/model/lancom.rb +23 -0
- data/lib/oxidized/model/lenovonos.rb +82 -0
- data/lib/oxidized/model/linksyssrw.rb +71 -0
- data/lib/oxidized/model/mlnxos.rb +2 -0
- data/lib/oxidized/model/model.rb +29 -3
- data/lib/oxidized/model/necix.rb +30 -0
- data/lib/oxidized/model/netgear.rb +5 -2
- data/lib/oxidized/model/netscaler.rb +38 -1
- data/lib/oxidized/model/nodegrid.rb +23 -0
- data/lib/oxidized/model/nxos.rb +3 -2
- data/lib/oxidized/model/openbsd.rb +9 -0
- data/lib/oxidized/model/opengear.rb +1 -1
- data/lib/oxidized/model/opnsense.rb +12 -4
- data/lib/oxidized/model/panos_api.rb +71 -0
- data/lib/oxidized/model/pfsense.rb +12 -7
- data/lib/oxidized/model/powerconnect.rb +1 -3
- data/lib/oxidized/model/procurve.rb +2 -2
- data/lib/oxidized/model/purityos.rb +8 -1
- data/lib/oxidized/model/quantaos.rb +1 -5
- data/lib/oxidized/model/routeros.rb +15 -2
- data/lib/oxidized/model/slxos.rb +1 -0
- data/lib/oxidized/model/smartcs.rb +40 -0
- data/lib/oxidized/model/sonicos.rb +9 -1
- data/lib/oxidized/model/srosmd.rb +97 -0
- data/lib/oxidized/model/stoneos.rb +6 -2
- data/lib/oxidized/model/supermicro.rb +1 -1
- data/lib/oxidized/model/swos.rb +9 -0
- data/lib/oxidized/model/timos.rb +1 -1
- data/lib/oxidized/model/tmos.rb +2 -1
- data/lib/oxidized/model/tplink.rb +2 -0
- data/lib/oxidized/model/trango.rb +11 -11
- data/lib/oxidized/model/truenas.rb +20 -0
- data/lib/oxidized/model/vrp.rb +1 -1
- data/lib/oxidized/model/xos.rb +4 -3
- data/lib/oxidized/model/yamaha.rb +57 -0
- data/lib/oxidized/model/zteolt.rb +52 -0
- data/lib/oxidized/model/zy1308.rb +11 -0
- data/lib/oxidized/node/stats.rb +1 -0
- data/lib/oxidized/node.rb +16 -11
- data/lib/oxidized/nodes.rb +7 -6
- data/lib/oxidized/output/file.rb +2 -1
- data/lib/oxidized/output/git.rb +4 -3
- data/lib/oxidized/output/gitcrypt.rb +5 -8
- data/lib/oxidized/output/http.rb +2 -0
- data/lib/oxidized/source/csv.rb +1 -0
- data/lib/oxidized/source/http.rb +4 -0
- data/lib/oxidized/source/source.rb +7 -2
- data/lib/oxidized/source/sql.rb +15 -5
- data/lib/oxidized/string.rb +9 -3
- data/lib/oxidized/version.rb +2 -2
- data/lib/oxidized/worker.rb +5 -5
- data/oxidized.gemspec +22 -16
- metadata +116 -29
- data/.travis.yml +0 -10
data/docs/Sources.md
CHANGED
|
@@ -85,6 +85,23 @@ source:
|
|
|
85
85
|
enable: enable
|
|
86
86
|
```
|
|
87
87
|
|
|
88
|
+
### MySQL with TLS support
|
|
89
|
+
By default SSL is disabled, but if you would like enable connection via TLS add the following configuration:
|
|
90
|
+
```yaml
|
|
91
|
+
source:
|
|
92
|
+
default: sql
|
|
93
|
+
sql:
|
|
94
|
+
...
|
|
95
|
+
with_ssl: true
|
|
96
|
+
ssl_mode: <mode>
|
|
97
|
+
ssl_ca: <path to CA certificate>
|
|
98
|
+
ssl_cert: <path to client certificate>
|
|
99
|
+
ssl_key: <path to client certificate key>
|
|
100
|
+
```
|
|
101
|
+
ssl_mode may be one of the next: disabled / preferred / required / verify_ca / verify_identity
|
|
102
|
+
|
|
103
|
+
For more information visit: https://github.com/brianmario/mysql2
|
|
104
|
+
|
|
88
105
|
## Source: SQLite
|
|
89
106
|
|
|
90
107
|
One row per device, filtered by hostname.
|
|
@@ -148,6 +165,7 @@ source:
|
|
|
148
165
|
delimiter: !ruby/regexp /:/
|
|
149
166
|
user: username
|
|
150
167
|
pass: password
|
|
168
|
+
read_timeout: 120
|
|
151
169
|
map:
|
|
152
170
|
name: hostname
|
|
153
171
|
model: os
|
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
|
+
* Acme Packet
|
|
10
|
+
* [ACMEPACKET](/lib/oxidized/model/acmepacket.rb)
|
|
9
11
|
* Adtran
|
|
10
12
|
* [Total Access (AOS)](/lib/oxidized/model/adtran.rb)
|
|
11
13
|
* Alcatel-Lucent
|
|
@@ -28,6 +30,7 @@
|
|
|
28
30
|
* Arris
|
|
29
31
|
* [C4CMTS](/lib/oxidized/model/c4cmts.rb)
|
|
30
32
|
* Aruba
|
|
33
|
+
* [AOS-CX](/lib/oxidized/model/aoscx.rb)
|
|
31
34
|
* [AOSW](/lib/oxidized/model/aosw.rb)
|
|
32
35
|
* AudioCodes
|
|
33
36
|
* [AudioCodes](/lib/oxdized/model/audiocodes.rb)
|
|
@@ -35,6 +38,15 @@
|
|
|
35
38
|
* Avaya
|
|
36
39
|
* [VOSS (VSP Operating System Software)](/lib/oxidized/model/voss.rb)
|
|
37
40
|
* [BOSS (Baystack Operating System Software)](/lib/oxidized/model/boss.rb)
|
|
41
|
+
* BDCOM
|
|
42
|
+
* [S2200 series](/lib/oxidized/model/bdcom.rb)
|
|
43
|
+
* [S2200PB series](/lib/oxidized/model/bdcom.rb)
|
|
44
|
+
* [S2200-B series](/lib/oxidized/model/bdcom.rb)
|
|
45
|
+
* [S2500-B series](/lib/oxidized/model/bdcom.rb)
|
|
46
|
+
* [S2500-C series](/lib/oxidized/model/bdcom.rb)
|
|
47
|
+
* [S2500PB series](/lib/oxidized/model/bdcom.rb)
|
|
48
|
+
* [S2500-P series](/lib/oxidized/model/bdcom.rb)
|
|
49
|
+
* [S2900 series](/lib/oxidized/model/bdcom.rb)
|
|
38
50
|
* Brocade
|
|
39
51
|
* [FabricOS](/lib/oxidized/model/fabricos.rb)
|
|
40
52
|
* [FastIron](/lib/oxidized/model/fastiron.rb)
|
|
@@ -47,6 +59,7 @@
|
|
|
47
59
|
* [AXOS](/lib/oxidized/model/axos.rb)
|
|
48
60
|
* Cambium
|
|
49
61
|
* [Cambium (PMP450 Series)](/lib/oxidized/model/cambium.rb)
|
|
62
|
+
* [Cambium (ePMP Series)](/lib/oxidized/model/cambiumepmp.rb)
|
|
50
63
|
* Casa
|
|
51
64
|
* [Casa](/lib/oxidized/model/casa.rb)
|
|
52
65
|
* Centec Networks
|
|
@@ -61,7 +74,8 @@
|
|
|
61
74
|
* [ASA](/lib/oxidized/model/asa.rb)
|
|
62
75
|
* [AsyncOS](/lib/oxidized/model/asyncos.rb)
|
|
63
76
|
* [CatOS](/lib/oxidized/model/catos.rb)
|
|
64
|
-
* [
|
|
77
|
+
* [Cisco Catalyst Express](/lib/oxidized/model/ciscoce.rb)
|
|
78
|
+
* [FireLinuxOS](/lib/oxidized/model/firelinuxos.rb)
|
|
65
79
|
* [IOS](/lib/oxidized/model/ios.rb)
|
|
66
80
|
* [IOSXR](/lib/oxidized/model/iosxr.rb)
|
|
67
81
|
* [NGA](/lib/oxidized/model/cisconga.rb)
|
|
@@ -96,11 +110,15 @@
|
|
|
96
110
|
* ECI Telecom
|
|
97
111
|
* [ECIapollo](/lib/oxidized/model/eciapollo.rb)
|
|
98
112
|
* EdgeCore
|
|
99
|
-
* [ES3528M](/lib/oxidized/model/edgecos.rb)
|
|
113
|
+
* [ECS3510, ES3528M](/lib/oxidized/model/edgecos.rb)
|
|
114
|
+
* [ECS3510, ES3526XA-V2, ES3528M](/lib/oxidized/model/edgecos.rb)
|
|
115
|
+
* Eltex
|
|
116
|
+
* [Eltex](/lib/oxidized/model/eltex.rb)
|
|
100
117
|
* Ericsson/Redback
|
|
101
118
|
* [IPOS (former SEOS)](/lib/oxidized/model/ipos.rb)
|
|
102
119
|
* Extreme Networks
|
|
103
|
-
* [Enterasys](/lib/oxidized/model/enterasys.rb)
|
|
120
|
+
* [Enterasys B/C-Series](/lib/oxidized/model/enterasys.rb)
|
|
121
|
+
* [Enterasys 800-Series](/lib/oxidized/model/enterasys800.rb)
|
|
104
122
|
* [WM](/lib/oxidized/model/mtrlrfs.rb)
|
|
105
123
|
* [XOS](/lib/oxidized/model/xos.rb)
|
|
106
124
|
* [ExtremeWare](/lib/oxidized/model/xos.rb)
|
|
@@ -109,6 +127,7 @@
|
|
|
109
127
|
* Fiberstore
|
|
110
128
|
* [S3800](/lib/oxidized/model/gcombnps.rb)
|
|
111
129
|
* [S3900](/lib/oxidized/model/edgecos.rb)
|
|
130
|
+
* [S3900-R](/lib/oxidized/model/bdcom.rb)
|
|
112
131
|
* [S5800](/lib/oxidized/model/cnos.rb)
|
|
113
132
|
* [S5850](/lib/oxidized/model/cnos.rb)
|
|
114
133
|
* Firebrick
|
|
@@ -118,6 +137,8 @@
|
|
|
118
137
|
* [FTOS](/lib/oxidized/model/ftos.rb)
|
|
119
138
|
* FortiGate
|
|
120
139
|
* [FortiOS](/lib/oxidized/model/fortios.rb)
|
|
140
|
+
* FortiWLC
|
|
141
|
+
* [FortiWLC](/lib/oxidized/model/fortiwlc.rb)
|
|
121
142
|
* Fujitsu
|
|
122
143
|
* [PRIMERGY Blade switch 1/10Gbe](/lib/oxidized/model/fujitsupy.rb)
|
|
123
144
|
* GCOM Technologies
|
|
@@ -129,13 +150,16 @@
|
|
|
129
150
|
* Hillstone Networks
|
|
130
151
|
* [StoneOS](/lib/oxidized/model/stoneos.rb)
|
|
131
152
|
* Hirschmann
|
|
132
|
-
* [
|
|
153
|
+
* [Classic](/lib/oxidized/model/hirschmann.rb)
|
|
154
|
+
* [HiOS](/lib/oxidized/model/hios.rb)
|
|
133
155
|
* HP
|
|
134
156
|
* [Comware (HP A-series, H3C, 3Com)](/lib/oxidized/model/comware.rb)
|
|
135
157
|
* [Procurve](/lib/oxidized/model/procurve.rb)
|
|
136
158
|
* [BladeSystem (Onboard Administrator)](/lib/oxidized/model/hpebladesystem.rb)
|
|
137
159
|
* [MSA](/lib/oxidized/model/hpemsa.rb)
|
|
138
160
|
* [MSM (Wireless Controller)](/lib/oxidized/model/hpmsm.rb)
|
|
161
|
+
* H3C
|
|
162
|
+
* [S6520X](/lib/oxidized/model/h3c.rb)
|
|
139
163
|
* Huawei
|
|
140
164
|
* [VRP](/lib/oxidized/model/vrp.rb)
|
|
141
165
|
* [SmartAX series](/lib/oxidized/model/smartax.rb)
|
|
@@ -144,6 +168,12 @@
|
|
|
144
168
|
* Juniper
|
|
145
169
|
* [JunOS](/lib/oxidized/model/junos.rb)
|
|
146
170
|
* [ScreenOS (Netscreen)](/lib/oxidized/model/screenos.rb)
|
|
171
|
+
* LANCOM Systems GmbH
|
|
172
|
+
* [LCOS](/lib/oxidized/model/lancom.rb)
|
|
173
|
+
* Lenovo
|
|
174
|
+
* [Lenovo Network OS](/lib/oxidized/model/lenovonos.rb)
|
|
175
|
+
* Linkys
|
|
176
|
+
* [SRW](/lib/oxidized/model/linksyssrw.rb)
|
|
147
177
|
* Linuxgeneric
|
|
148
178
|
* [CentOS](/lib/oxidized/model/linuxgeneric.rb)
|
|
149
179
|
* Mellanox
|
|
@@ -151,11 +181,14 @@
|
|
|
151
181
|
* [Voltaire](/lib/oxidized/model/voltaire.rb)
|
|
152
182
|
* Mikrotik
|
|
153
183
|
* [RouterOS](/lib/oxidized/model/routeros.rb)
|
|
184
|
+
* [SwOS and SwOS Lite](/lib/oxidized/model/swos.rb)
|
|
154
185
|
* Motorola
|
|
155
186
|
* [RFS](/lib/oxidized/model/mtrlrfs.rb)
|
|
156
187
|
* MRV
|
|
157
188
|
* [MasterOS](/lib/oxidized/model/masteros.rb)
|
|
158
189
|
* [FiberDriver](/lib/oxidized/model/fiberdriver.rb)
|
|
190
|
+
* NEC
|
|
191
|
+
* [NEC IX](/lib/oxidized/model/necix.rb)
|
|
159
192
|
* Netgear
|
|
160
193
|
* [Netgear switches](/lib/oxidized/model/netgear.rb)
|
|
161
194
|
* Netonix
|
|
@@ -171,7 +204,8 @@
|
|
|
171
204
|
* [OpenWRT](/lib/oxidized/model/openwrt.rb)
|
|
172
205
|
* [OPNsense](/lib/oxidized/model/opnsense.rb)
|
|
173
206
|
* Palo Alto
|
|
174
|
-
* [
|
|
207
|
+
* [PanOS API](/lib/oxidized/model/panos_api.rb)
|
|
208
|
+
* [PanOS](/lib/oxidized/model/panos.rb)
|
|
175
209
|
* [PLANET SG/SGS Switches](/lib/oxidized/model/planet.rb)
|
|
176
210
|
* [pfSense](/lib/oxidized/model/pfsense.rb)
|
|
177
211
|
* Pure Storage
|
|
@@ -186,8 +220,10 @@
|
|
|
186
220
|
* [Quanta / VxWorks 6.6 (1.1.0.8)](/lib/oxidized/model/quantaos.rb)
|
|
187
221
|
* Siklu
|
|
188
222
|
* [EtherHaul](/lib/oxidized/model/siklu.rb)
|
|
223
|
+
* Seiko Solutions
|
|
224
|
+
* [SmartCS, SmartCS mini](/lib/oxidized/model/smartcs.rb)
|
|
189
225
|
* SonicWALL
|
|
190
|
-
* [SonicOS](lib/oxidized/model/sonicos.rb)
|
|
226
|
+
* [SonicOS](/lib/oxidized/model/sonicos.rb)
|
|
191
227
|
* SNR
|
|
192
228
|
* [SNR-S300G, S2xxx, S3xxx, S4xxx](/lib/oxidized/model/dcnos.rb)
|
|
193
229
|
* Speedtouch
|
|
@@ -203,6 +239,8 @@
|
|
|
203
239
|
* [Telco Systems T-Marc 3306](/lib/oxidized/model/telco.rb)
|
|
204
240
|
* Trango Systems
|
|
205
241
|
* [Trango](/lib/oxidized/model/trango.rb)
|
|
242
|
+
* TrueNAS
|
|
243
|
+
* [TrueNAS](/lib/oxidized/model/truenas.rb)
|
|
206
244
|
* TPLink
|
|
207
245
|
* [TPLink](/lib/oxidized/model/tplink.rb)
|
|
208
246
|
* [TL-SL5428](/lib/oxidized/model/edgecos.rb)
|
|
@@ -219,9 +257,16 @@
|
|
|
219
257
|
* [Fireware OS](/lib/oxidized/model/firewareos.rb)
|
|
220
258
|
* Westell
|
|
221
259
|
* [Westell 8178G, Westell 8266G](/lib/oxidized/model/weos.rb)
|
|
260
|
+
* YAMAHA
|
|
261
|
+
* [YAMAHA NVR/RTX Series](/lib/oxidized/model/yamaha.rb)
|
|
222
262
|
* Zhone
|
|
223
263
|
* [Zhone (OLT and MX)](/lib/oxidized/model/zhoneolt.rb)
|
|
264
|
+
* ZPE
|
|
265
|
+
* [Nodegrid OS](/lib/oxidized/model/nodegrid.rb)
|
|
266
|
+
* ZTE
|
|
267
|
+
* [C300&C320 OLT](/lib/oxidized/model/zteolt.rb)
|
|
224
268
|
* Zyxel
|
|
225
269
|
* [ZyNOS](/lib/oxidized/model/zynos.rb)
|
|
226
270
|
* [ZyNOS GS-series variant](/lib/oxidized/model/zynosgs.rb)
|
|
227
271
|
* [NDMS](/lib/oxidized/model/ndms.rb)
|
|
272
|
+
* [1308](/lib/oxidized/model/zy1308.rb)
|
data/docs/Troubleshooting.md
CHANGED
|
@@ -53,7 +53,7 @@ irb(main):003:0> '$EKRET-5A-X20#'.match /^([\$\w.@()-]+[#>]\s?)$/
|
|
|
53
53
|
=> #<MatchData "$EKRET-5A-X20#" 1:"$EKRET-5A-X20#">
|
|
54
54
|
```
|
|
55
55
|
|
|
56
|
-
The new prompt now matches. You can copy the current model into the `~/.config/oxidized/` directory (keeping the original file name), and modify the prompt within the model file. After restarting Oxidized, the adapted model will be used.
|
|
56
|
+
The new prompt now matches. You can copy the current model into the `~/.config/oxidized/model/` directory (keeping the original file name), and modify the prompt within the model file. After restarting Oxidized, the adapted model will be used.
|
|
57
57
|
|
|
58
58
|
*Troubleshooting an overly greedy prompt:*
|
|
59
59
|
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Posts a git diff to MS Team Channel using webhooks
|
|
3
|
+
#
|
|
4
|
+
# Usage:
|
|
5
|
+
# Make sure jq and curl are installed.
|
|
6
|
+
# Save this script in /var/lib/oxidized/extra/
|
|
7
|
+
# Add to oxidized config:
|
|
8
|
+
#
|
|
9
|
+
# hooks:
|
|
10
|
+
# ms_teams_webhook:
|
|
11
|
+
# type: exec
|
|
12
|
+
# events: [post_store]
|
|
13
|
+
# cmd: '/var/lib/oxidized/extra/gitdiff-msteams.sh'
|
|
14
|
+
# async: true
|
|
15
|
+
# timeout: 120
|
|
16
|
+
#
|
|
17
|
+
# Add webhook to your MS Teams channel and set the next variable to the full url
|
|
18
|
+
|
|
19
|
+
weburl="https://contoso.webhook.office.com/webhookb2/etc etc etc"
|
|
20
|
+
|
|
21
|
+
postdata()
|
|
22
|
+
{
|
|
23
|
+
COMMIT=$(git --bare --git-dir="${OX_REPO_NAME}" show --pretty='' --no-color "${OX_REPO_COMMITREF}" | jq --raw-input --slurp --compact-output)
|
|
24
|
+
cat <<EOF
|
|
25
|
+
{
|
|
26
|
+
"type":"message",
|
|
27
|
+
"attachments":[
|
|
28
|
+
{
|
|
29
|
+
"contentType":"application/vnd.microsoft.card.adaptive",
|
|
30
|
+
"contentUrl":null,
|
|
31
|
+
"content":{
|
|
32
|
+
"$schema":"http://adaptivecards.io/schemas/adaptive-card.json",
|
|
33
|
+
"type":"AdaptiveCard",
|
|
34
|
+
"version":"1.2",
|
|
35
|
+
"msTeams": { "width": "full" },
|
|
36
|
+
"body":[
|
|
37
|
+
{
|
|
38
|
+
"type": "TextBlock",
|
|
39
|
+
"text": "Oxidized update for ${OX_NODE_NAME}",
|
|
40
|
+
"size": "medium",
|
|
41
|
+
"weight": "Bolder",
|
|
42
|
+
"style": "heading",
|
|
43
|
+
"wrap": "true"
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"type": "FactSet",
|
|
47
|
+
"facts": [
|
|
48
|
+
{
|
|
49
|
+
"title": "Node name",
|
|
50
|
+
"value": "${OX_NODE_NAME}"
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"title": "Job status",
|
|
54
|
+
"value": "${OX_JOB_STATUS}"
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"title": "Job time",
|
|
58
|
+
"value": "${OX_JOB_TIME}"
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"title": "Git repo",
|
|
62
|
+
"value": "${OX_REPO_NAME}"
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"title": "Git commit ID",
|
|
66
|
+
"value": "${OX_REPO_COMMITREF}"
|
|
67
|
+
}
|
|
68
|
+
]
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"type": "RichTextBlock",
|
|
72
|
+
"inlines": [
|
|
73
|
+
{
|
|
74
|
+
"type": "TextRun",
|
|
75
|
+
"text": ${COMMIT},
|
|
76
|
+
"fontType": "monospace",
|
|
77
|
+
"size": "small"
|
|
78
|
+
}
|
|
79
|
+
]
|
|
80
|
+
}
|
|
81
|
+
]
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
]
|
|
85
|
+
}
|
|
86
|
+
EOF
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
curl -i \
|
|
90
|
+
-H "Content-Type: application/json" \
|
|
91
|
+
-X POST --data "$(postdata)" "${weburl}"
|
|
@@ -12,17 +12,14 @@ pending_nodes = []
|
|
|
12
12
|
|
|
13
13
|
json = JSON.parse(open("http://localhost:8888/nodes.json").read)
|
|
14
14
|
json.each do |node|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
if not node['last'].nil?
|
|
19
|
-
if node['last']['status'] != 'success'
|
|
20
|
-
critical_nodes << node['name']
|
|
21
|
-
critical = true
|
|
22
|
-
end
|
|
23
|
-
else
|
|
15
|
+
next if !ARGV.empty? && (ARGV[0] != node['name'])
|
|
16
|
+
|
|
17
|
+
if node['last'].nil?
|
|
24
18
|
pending_nodes << node['name']
|
|
25
19
|
pending = true
|
|
20
|
+
elsif node['last']['status'] != 'success'
|
|
21
|
+
critical_nodes << node['name']
|
|
22
|
+
critical = true
|
|
26
23
|
end
|
|
27
24
|
end
|
|
28
25
|
|
|
@@ -21,41 +21,98 @@
|
|
|
21
21
|
# Removed requirement for Git working directory
|
|
22
22
|
# Check job status
|
|
23
23
|
#
|
|
24
|
+
# 20200926 - Nick Hilliard <nick@foobar.org>
|
|
25
|
+
# sends email
|
|
26
|
+
# add command-line options to stop blank emails from being sent
|
|
27
|
+
# more sanity-checking
|
|
24
28
|
#
|
|
25
29
|
# usage: add the following hook to the oxidized config file:
|
|
26
30
|
#
|
|
31
|
+
# --
|
|
27
32
|
# hooks:
|
|
28
33
|
# email_output:
|
|
29
34
|
# type: exec
|
|
30
35
|
# events: [post_store, node_fail]
|
|
31
|
-
# cmd: '/home/oxidized/extra/oxidized-report-git-commits
|
|
36
|
+
# cmd: '/home/oxidized/extra/oxidized-report-git-commits -s "Oxidized updates for ${OX_NODE_NAME}" -r update-recipient@example.com'
|
|
32
37
|
# async: true
|
|
33
38
|
# timeout: 120
|
|
34
|
-
#
|
|
39
|
+
# --
|
|
35
40
|
#
|
|
41
|
+
# Options:
|
|
42
|
+
# -r email_recipient - send email to specified recipient
|
|
43
|
+
# -s email_subject - specify the email subject line
|
|
44
|
+
# -f - don't send email if git fails to find commit
|
|
45
|
+
#
|
|
46
|
+
|
|
47
|
+
trap '/bin/rm -f "$tmpfile"' EXIT
|
|
48
|
+
|
|
49
|
+
tmpfile=$(mktemp) || exit 1
|
|
50
|
+
|
|
51
|
+
subject="Oxidized updates for ${OX_NODE_NAME}"
|
|
52
|
+
scriptname=`basename $0`
|
|
53
|
+
|
|
54
|
+
usage()
|
|
55
|
+
{
|
|
56
|
+
echo "Usage: ${scriptname} [-f] [ -s email_subject ] [ -r email_recipient ]"
|
|
57
|
+
exit 1
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
email_on_gitfail=1
|
|
61
|
+
while getopts "fs:r:" opt; do
|
|
62
|
+
case $opt in
|
|
63
|
+
s)
|
|
64
|
+
subject=$OPTARG
|
|
65
|
+
;;
|
|
66
|
+
r)
|
|
67
|
+
recipient=$OPTARG
|
|
68
|
+
;;
|
|
69
|
+
f)
|
|
70
|
+
email_on_gitfail=0
|
|
71
|
+
;;
|
|
72
|
+
*)
|
|
73
|
+
usage
|
|
74
|
+
;;
|
|
75
|
+
esac
|
|
76
|
+
done
|
|
36
77
|
|
|
37
|
-
echo "Node name: ${OX_NODE_NAME}"
|
|
38
|
-
echo "Group name: ${OX_NODE_GROUP}"
|
|
39
|
-
echo "Job status: ${OX_JOB_STATUS}"
|
|
40
|
-
echo "Job time: ${OX_JOB_TIME}"
|
|
41
78
|
|
|
42
79
|
if [ "${OX_EVENT}" = "node_fail" ]; then
|
|
43
|
-
echo 'Job failed'
|
|
80
|
+
echo "${scriptname}: ${OX_NODE_NAME}": 'Job failed'
|
|
44
81
|
exit 64
|
|
45
82
|
fi
|
|
46
83
|
|
|
47
84
|
if [ -z "${OX_REPO_COMMITREF}" ]; then
|
|
48
|
-
echo '$OX_REPO_COMMITREF not set'
|
|
85
|
+
echo "${scriptname}: "'$OX_REPO_COMMITREF not set'
|
|
49
86
|
exit 64
|
|
50
87
|
fi
|
|
51
88
|
|
|
52
89
|
if [ -z "${OX_REPO_NAME}" ]; then
|
|
53
|
-
echo '$OX_REPO_NAME not set'
|
|
90
|
+
echo "${scriptname}: "'$OX_REPO_NAME not set'
|
|
54
91
|
exit 64
|
|
55
92
|
fi
|
|
56
|
-
|
|
57
|
-
echo "Git repo: ${OX_REPO_NAME}"
|
|
58
|
-
echo "Git commit ID: ${OX_REPO_COMMITREF}"
|
|
59
|
-
echo ""
|
|
60
93
|
|
|
61
|
-
|
|
94
|
+
cat > ${tmpfile} <<EOF
|
|
95
|
+
Node name: ${OX_NODE_NAME}
|
|
96
|
+
Group name: ${OX_NODE_GROUP}
|
|
97
|
+
Job status: ${OX_JOB_STATUS}
|
|
98
|
+
Job time: ${OX_JOB_TIME}
|
|
99
|
+
Git repo: ${OX_REPO_NAME}
|
|
100
|
+
Git commit ID: ${OX_REPO_COMMITREF}
|
|
101
|
+
|
|
102
|
+
EOF
|
|
103
|
+
|
|
104
|
+
# test if commit exists
|
|
105
|
+
git --bare --git-dir="${OX_REPO_NAME}" rev-parse --quiet --verify "${OX_REPO_COMMITREF}" > /dev/null 2>&1
|
|
106
|
+
gitret=$?
|
|
107
|
+
|
|
108
|
+
if [ ${gitret} -eq 0 ]; then
|
|
109
|
+
git --bare --git-dir="${OX_REPO_NAME}" show --pretty='' --no-color "${OX_REPO_COMMITREF}" >> ${tmpfile} 2>&1
|
|
110
|
+
else
|
|
111
|
+
echo "${scriptname}: commit ${OX_REPO_COMMITREF} does not exist" >> ${tmpfile}
|
|
112
|
+
fi
|
|
113
|
+
|
|
114
|
+
if [ ! -z "${recipient}" -a \( ${gitret} -eq 0 -o ${email_on_gitfail} -eq 1 \) ]; then
|
|
115
|
+
cat ${tmpfile} | mail -s "${subject}" "${recipient}"
|
|
116
|
+
else
|
|
117
|
+
cat ${tmpfile}
|
|
118
|
+
fi
|
data/extra/oxidized.init
CHANGED
|
@@ -18,7 +18,6 @@ PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
|
|
|
18
18
|
DAEMON=$(which oxidized)
|
|
19
19
|
NAME="oxidized"
|
|
20
20
|
DESC="Oxidized - Network Device Configuration Backup Tool"
|
|
21
|
-
ARGS=""
|
|
22
21
|
USER="oxidized"
|
|
23
22
|
|
|
24
23
|
test -x $DAEMON || exit 0
|
|
@@ -29,20 +28,18 @@ if [ -r /etc/default/$NAME ]; then
|
|
|
29
28
|
. /etc/default/$NAME
|
|
30
29
|
fi
|
|
31
30
|
|
|
32
|
-
CONFIG="${CONFIG:-/etc/oxidized/config}"
|
|
33
|
-
|
|
34
31
|
PIDFILE=/var/run/$NAME.pid
|
|
35
32
|
|
|
36
33
|
do_start()
|
|
37
34
|
{
|
|
38
35
|
start-stop-daemon --start --quiet --background --pidfile $PIDFILE --make-pidfile \
|
|
39
|
-
--oknodo --chuid $USER --exec $DAEMON
|
|
36
|
+
--oknodo --chuid $USER --exec $DAEMON
|
|
40
37
|
}
|
|
41
38
|
|
|
42
39
|
do_stop()
|
|
43
40
|
{
|
|
44
41
|
start-stop-daemon --oknodo --stop --quiet -v --pidfile $PIDFILE \
|
|
45
|
-
--chuid $USER --retry KILL/10
|
|
42
|
+
--chuid $USER --retry KILL/10
|
|
46
43
|
}
|
|
47
44
|
|
|
48
45
|
case "$1" in
|
data/extra/oxidized.logrotate
CHANGED
data/extra/oxidized.runit
CHANGED
|
@@ -1,2 +1,5 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
|
-
|
|
2
|
+
[ ! -d /home/oxidized/.config/oxidized ] && mkdir -p /home/oxidized/.config/oxidized
|
|
3
|
+
[ -f /home/oxidized/.config/oxidized/pid ] && rm /home/oxidized/.config/oxidized/pid
|
|
4
|
+
chown -R oxidized:oxidized /home/oxidized/.config/oxidized
|
|
5
|
+
exec setuser oxidized oxidized
|
data/extra/oxidized.service
CHANGED
|
@@ -1,12 +1,9 @@
|
|
|
1
|
-
#
|
|
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.
|
|
1
|
+
# Put this file in /etc/systemd/system.
|
|
7
2
|
#
|
|
8
|
-
#
|
|
9
|
-
#
|
|
3
|
+
# To set OXIDIZED_HOME instead of the default,
|
|
4
|
+
# ~oxidized/.config/oxidized, uncomment (and modify as required) the
|
|
5
|
+
# "Environment" variable below so systemd sets the correct
|
|
6
|
+
# environment.
|
|
10
7
|
|
|
11
8
|
[Unit]
|
|
12
9
|
Description=Oxidized - Network Device Configuration Backup Tool
|
data/extra/rest_client.rb
CHANGED
|
@@ -6,7 +6,7 @@ module Oxidized
|
|
|
6
6
|
require 'asetus'
|
|
7
7
|
|
|
8
8
|
class Config
|
|
9
|
-
Root = Root = ENV['OXIDIZED_HOME'] || File.join(
|
|
9
|
+
Root = Root = ENV['OXIDIZED_HOME'] || File.join(Dir.home, '.config', 'oxidized')
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
CFGS = Asetus.new name: 'oxidized', load: false, key_to_s: true
|
data/extra/syslog.rb
CHANGED
|
@@ -29,7 +29,7 @@ require_relative 'rest_client'
|
|
|
29
29
|
module Oxidized
|
|
30
30
|
require 'asetus'
|
|
31
31
|
class Config
|
|
32
|
-
Root = File.join
|
|
32
|
+
Root = File.join Dir.home, '.config', 'oxidized'
|
|
33
33
|
end
|
|
34
34
|
|
|
35
35
|
CFGS = Asetus.new name: 'oxidized', load: false, key_to_s: true
|
|
@@ -105,7 +105,7 @@ module Oxidized
|
|
|
105
105
|
end
|
|
106
106
|
|
|
107
107
|
def handle_log(log, ipaddr)
|
|
108
|
-
log = log.to_s.split
|
|
108
|
+
log = log.to_s.split
|
|
109
109
|
index, vendor = MSG.find do |key, value|
|
|
110
110
|
index = log.find_index { |e| e.match value }
|
|
111
111
|
break index, key if index
|
data/lib/oxidized/cli.rb
CHANGED
|
@@ -72,7 +72,7 @@ module Oxidized
|
|
|
72
72
|
|
|
73
73
|
begin
|
|
74
74
|
File.open(pidfile, ::File::CREAT | ::File::EXCL | ::File::WRONLY) { |f| f.write(Process.pid.to_s) }
|
|
75
|
-
at_exit {
|
|
75
|
+
at_exit { FileUtils.rm_f(pidfile) }
|
|
76
76
|
rescue Errno::EEXIST
|
|
77
77
|
check_pid
|
|
78
78
|
retry
|
data/lib/oxidized/config/vars.rb
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
module Oxidized::Config::Vars
|
|
2
2
|
# convenience method for accessing node, group or global level user variables
|
|
3
3
|
def vars(name)
|
|
4
|
+
model_name = @node.model.class.name.to_s.downcase
|
|
4
5
|
if @node.vars&.has_key?(name)
|
|
5
6
|
@node.vars[name]
|
|
7
|
+
elsif Oxidized.config.groups.has_key?(@node.group) && Oxidized.config.groups[@node.group].models.has_key(model_name) && Oxidized.config.groups[@node.group].models[model_name].vars.has_key?(name.to_s)
|
|
8
|
+
Oxidized.config.groups[@node.group].models[model_name].vars[name.to_s]
|
|
6
9
|
elsif Oxidized.config.groups.has_key?(@node.group) && Oxidized.config.groups[@node.group].vars.has_key?(name.to_s)
|
|
7
10
|
Oxidized.config.groups[@node.group].vars[name.to_s]
|
|
8
|
-
elsif Oxidized.config.models.has_key(
|
|
9
|
-
Oxidized.config.models[
|
|
11
|
+
elsif Oxidized.config.models.has_key(model_name) && Oxidized.config.models[model_name].vars.has_key?(name.to_s)
|
|
12
|
+
Oxidized.config.models[model_name].vars[name.to_s]
|
|
10
13
|
elsif Oxidized.config.vars.has_key?(name.to_s)
|
|
11
14
|
Oxidized.config.vars[name.to_s]
|
|
12
15
|
end
|
data/lib/oxidized/config.rb
CHANGED
|
@@ -2,8 +2,9 @@ module Oxidized
|
|
|
2
2
|
require 'asetus'
|
|
3
3
|
class NoConfig < OxidizedError; end
|
|
4
4
|
class InvalidConfig < OxidizedError; end
|
|
5
|
+
|
|
5
6
|
class Config
|
|
6
|
-
Root = ENV['OXIDIZED_HOME'] || File.join(
|
|
7
|
+
Root = ENV['OXIDIZED_HOME'] || File.join(Dir.home, '.config', 'oxidized')
|
|
7
8
|
Crash = File.join(ENV['OXIDIZED_LOGS'] || Root, 'crash')
|
|
8
9
|
Log = File.join(ENV['OXIDIZED_LOGS'] || Root, 'logs')
|
|
9
10
|
InputDir = File.join Directory, %w[lib oxidized input]
|
|
@@ -14,7 +15,7 @@ module Oxidized
|
|
|
14
15
|
Sleep = 1
|
|
15
16
|
|
|
16
17
|
def self.load(cmd_opts = {})
|
|
17
|
-
asetus = Asetus.new(name: 'oxidized', load: false, key_to_s: true)
|
|
18
|
+
asetus = Asetus.new(name: 'oxidized', load: false, key_to_s: true, usrdir: Oxidized::Config::Root)
|
|
18
19
|
Oxidized.asetus = asetus
|
|
19
20
|
|
|
20
21
|
asetus.default.username = 'username'
|
|
@@ -25,6 +26,7 @@ module Oxidized
|
|
|
25
26
|
asetus.default.use_syslog = false
|
|
26
27
|
asetus.default.debug = false
|
|
27
28
|
asetus.default.threads = 30
|
|
29
|
+
asetus.default.use_max_threads = false
|
|
28
30
|
asetus.default.timeout = 20
|
|
29
31
|
asetus.default.retries = 3
|
|
30
32
|
asetus.default.prompt = /^([\w.@-]+[#>]\s?)$/
|
|
@@ -32,6 +34,7 @@ module Oxidized
|
|
|
32
34
|
asetus.default.next_adds_job = false # if true, /next adds job, so device is fetched immmeiately
|
|
33
35
|
asetus.default.vars = {} # could be 'enable'=>'enablePW'
|
|
34
36
|
asetus.default.groups = {} # group level configuration
|
|
37
|
+
asetus.default.group_map = {} # map aliases of groups to names
|
|
35
38
|
asetus.default.models = {} # model level configuration
|
|
36
39
|
asetus.default.pid = File.join(Oxidized::Config::Root, 'pid')
|
|
37
40
|
|
|
@@ -69,6 +72,6 @@ module Oxidized
|
|
|
69
72
|
end
|
|
70
73
|
|
|
71
74
|
class << self
|
|
72
|
-
attr_accessor :mgr, :
|
|
75
|
+
attr_accessor :mgr, :hooks
|
|
73
76
|
end
|
|
74
77
|
end
|
data/lib/oxidized/core.rb
CHANGED
|
@@ -10,7 +10,7 @@ module Oxidized
|
|
|
10
10
|
|
|
11
11
|
def initialize(_args)
|
|
12
12
|
Oxidized.mgr = Manager.new
|
|
13
|
-
Oxidized.
|
|
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.zero?
|
|
16
16
|
|
data/lib/oxidized/hook/exec.rb
CHANGED
|
@@ -30,11 +30,9 @@ class Exec < Oxidized::Hook
|
|
|
30
30
|
env = make_env ctx
|
|
31
31
|
log "Execute: #{@cmd.inspect}", :debug
|
|
32
32
|
th = Thread.new do
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
raise e unless @async
|
|
37
|
-
end
|
|
33
|
+
run_cmd! env
|
|
34
|
+
rescue StandardError => e
|
|
35
|
+
raise e unless @async
|
|
38
36
|
end
|
|
39
37
|
th.join unless @async
|
|
40
38
|
end
|
|
@@ -70,7 +68,9 @@ class Exec < Oxidized::Hook
|
|
|
70
68
|
"OX_NODE_GROUP" => ctx.node.group.to_s,
|
|
71
69
|
"OX_NODE_MODEL" => ctx.node.model.class.name,
|
|
72
70
|
"OX_REPO_COMMITREF" => ctx.commitref.to_s,
|
|
73
|
-
"OX_REPO_NAME" => ctx.node.repo.to_s
|
|
71
|
+
"OX_REPO_NAME" => ctx.node.repo.to_s,
|
|
72
|
+
"OX_ERR_TYPE" => ctx.node.err_type.to_s,
|
|
73
|
+
"OX_ERR_REASON" => ctx.node.err_reason.to_s
|
|
74
74
|
)
|
|
75
75
|
end
|
|
76
76
|
if ctx.job
|