oxidized 0.12.2 → 0.13.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 +7 -0
- data/.travis.yml +2 -0
- data/CHANGELOG.md +16 -1
- data/Gemfile.lock +1 -1
- data/README.md +107 -4
- data/extra/oxidized.init.d +87 -0
- data/lib/oxidized.rb +1 -0
- data/lib/oxidized/cli.rb +4 -0
- data/lib/oxidized/config.rb +2 -2
- data/lib/oxidized/hook/githubrepo.rb +17 -5
- data/lib/oxidized/input/ssh.rb +15 -9
- data/lib/oxidized/model/airos.rb +1 -1
- data/lib/oxidized/model/datacom.rb +33 -0
- data/lib/oxidized/model/edgeswitch.rb +15 -8
- data/lib/oxidized/model/fortios.rb +7 -2
- data/lib/oxidized/model/ios.rb +4 -0
- data/lib/oxidized/model/ipos.rb +61 -0
- data/lib/oxidized/model/junos.rb +2 -0
- data/lib/oxidized/model/mtrlrfs.rb +37 -0
- data/lib/oxidized/model/netonix.rb +15 -0
- data/lib/oxidized/model/netscaler.rb +24 -0
- data/lib/oxidized/model/nos.rb +1 -1
- data/lib/oxidized/model/procurve.rb +25 -12
- data/lib/oxidized/model/tmos.rb +6 -4
- data/lib/oxidized/model/xos.rb +4 -2
- data/lib/oxidized/node.rb +11 -1
- data/lib/oxidized/output/http.rb +58 -0
- data/lib/oxidized/version.rb +1 -1
- metadata +37 -50
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 6abed81dacfe3d68bc4abd336da9ba97b39f47a7
|
4
|
+
data.tar.gz: 5110c826165ef2d14c19369e0c6662fde52c7bd6
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 96c4383cfa03d6ef2def511de0b23c2b28c4d275caa3f16f1c9e2b926514245ad8bdf945a0726892152fcda4a04454b43ec7cab6d0f10cb474dc6a4974767839
|
7
|
+
data.tar.gz: f6292b48c50e0d74d971df1345c7d391ef44b9a003eb429482f90e113f59633b2cf30b3227e8b8a372b1ff8203a169b49963f5bec75bb0f00d6f2f8a73de081a
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,18 @@
|
|
1
|
+
# 0.13.0
|
2
|
+
- FEATURE: http post for configs (by @jgroom33)
|
3
|
+
- FEATURE: support ericsson redbacks (by @roedie)
|
4
|
+
- FEATURE: support motorola wireless controllers (by @roadie)
|
5
|
+
- FEATURE: support citrix netscaler (by @roadie)
|
6
|
+
- FEATURE: support datacom devices (by @danilopopeye)
|
7
|
+
- FEATURE: support netonix devices
|
8
|
+
- FEATURE: support specifying ssh cipher and kex (by @roadie)
|
9
|
+
- FEATURE: rename proxy to ssh_proxy (by @roadie)
|
10
|
+
- FEATURE: support ssh keys on ssh_proxy (by @awix)
|
11
|
+
- BUGFIX: various (by @danilopopeye)
|
12
|
+
- BUGFIX: Node#repo with groups (by @danilopopeye)
|
13
|
+
- BUGFIX: githubrepohoook (by @danilopopeye)
|
14
|
+
- BUGFIX: fortios, airos, junos, xos, edgeswitch, nos, tmos, procurve, ipos models
|
15
|
+
|
1
16
|
# 0.12.2
|
2
17
|
- BUGFIX: more MRV model fixes (by @natm)
|
3
18
|
|
@@ -12,7 +27,7 @@
|
|
12
27
|
- FEATURE: EdgeSwitch support (by @doogieconsulting)
|
13
28
|
- BUGFIX: rename input debug log files
|
14
29
|
- BUGFIX: powerconnect model fixes (by @Madpilot0)
|
15
|
-
- BUGFIX: fortigate model fixes (by @ElvinEfendi)
|
30
|
+
- BUGFIX: fortigate model fixes (by @ElvinEfendi)
|
16
31
|
- BUGFIX: various (by @mikebryant)
|
17
32
|
- BUGFIX: write SSH debug to file without buffering
|
18
33
|
- BUGFIX: fix IOS XR prompt handling
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -31,6 +31,7 @@ Oxidized is a network device configuration backup tool. It's a RANCID replacemen
|
|
31
31
|
* [Source: SQLite](#source-sqlite)
|
32
32
|
* [Source: HTTP](#source-http)
|
33
33
|
* [Output: GIT](#output-git)
|
34
|
+
* [Output: HTTP](#output-http)
|
34
35
|
* [Output: File](#output-file)
|
35
36
|
* [Output types](#output-types)
|
36
37
|
* [Advanced Configuration](#advanced-configuration)
|
@@ -70,13 +71,20 @@ Oxidized is a network device configuration backup tool. It's a RANCID replacemen
|
|
70
71
|
* IOSXR
|
71
72
|
* NXOS
|
72
73
|
* SMB (Nikola series)
|
74
|
+
* Citrix
|
75
|
+
* NetScaler (Virtual Applicance)
|
73
76
|
* Cumulus
|
74
77
|
* Linux
|
78
|
+
* DataCom
|
79
|
+
* DmSwitch 3000
|
75
80
|
* DELL
|
76
81
|
* PowerConnect
|
77
82
|
* AOSW
|
83
|
+
* Ericsson/Redback
|
84
|
+
* IPOS (former SEOS)
|
78
85
|
* Extreme Networks
|
79
86
|
* XOS
|
87
|
+
* WM
|
80
88
|
* F5
|
81
89
|
* TMOS
|
82
90
|
* Force10
|
@@ -94,8 +102,12 @@ Oxidized is a network device configuration backup tool. It's a RANCID replacemen
|
|
94
102
|
* ScreenOS (Netscreen)
|
95
103
|
* Mikrotik
|
96
104
|
* RouterOS
|
105
|
+
* Motorola
|
106
|
+
* RFS
|
97
107
|
* MRV
|
98
108
|
* MasterOS
|
109
|
+
* Netonix
|
110
|
+
* WISP Switch (As Netonix)
|
99
111
|
* Opengear
|
100
112
|
* Opengear
|
101
113
|
* Palo Alto
|
@@ -121,7 +133,7 @@ gem install oxidized-script oxidized-web # if you don't install oxidized-web, ma
|
|
121
133
|
## CentOS, Oracle Linux, Red Hat Linux version 6
|
122
134
|
Install Ruby 1.9.3 or greater (for Ruby 2.1.2 installation instructions see "Installing Ruby 2.1.2 using RVM"), then install Oxidized dependencies
|
123
135
|
```shell
|
124
|
-
yum install cmake sqlite-devel openssl-devel
|
136
|
+
yum install cmake sqlite-devel openssl-devel libssh2-devel
|
125
137
|
```
|
126
138
|
|
127
139
|
Now lets install oxidized via Rubygems:
|
@@ -136,6 +148,21 @@ Oxidized configuration is in YAML format. Configuration files are subsequently s
|
|
136
148
|
|
137
149
|
To initialize a default configuration in your home directory ```~/.config/oxidized/config```, simply run ```oxidized``` once. If you don't further configure anything from the output and source sections, it'll extend the examples on a subsequent ```oxidized``` execution. This is useful to see what options for a specific source or output backend are available.
|
138
150
|
|
151
|
+
You can set the env variable `OXIDIZED_HOME` to change its home directory.
|
152
|
+
|
153
|
+
```
|
154
|
+
OXIDIZED_HOME=/etc/oxidized
|
155
|
+
|
156
|
+
$ tree -L 1 /etc/oxidized
|
157
|
+
/etc/oxidized/
|
158
|
+
├── config
|
159
|
+
├── log-router-ssh
|
160
|
+
├── log-router-telnet
|
161
|
+
├── pid
|
162
|
+
├── router.db
|
163
|
+
└── repository.git
|
164
|
+
```
|
165
|
+
|
139
166
|
## Source
|
140
167
|
|
141
168
|
Oxidized supports ```CSV```, ```SQLite``` and ```HTTP``` as source backends. The CSV backend reads nodes from a rancid compatible router.db file. The SQLite backend will fire queries against a database and map certain fields to model items. The HTTP backend will fire queries against a http/https url. Take a look at the [Cookbook](#cookbook) for more details.
|
@@ -181,7 +208,7 @@ Install Ruby 2.1.2 build dependencies
|
|
181
208
|
```
|
182
209
|
yum install curl gcc-c++ patch readline readline-devel zlib zlib-devel
|
183
210
|
yum install libyaml-devel libffi-devel openssl-devel make cmake
|
184
|
-
yum install bzip2 autoconf automake libtool bison iconv-devel
|
211
|
+
yum install bzip2 autoconf automake libtool bison iconv-devel libssh2-devel
|
185
212
|
```
|
186
213
|
|
187
214
|
Install RVM
|
@@ -283,7 +310,7 @@ source:
|
|
283
310
|
|
284
311
|
### SSH Proxy Command
|
285
312
|
|
286
|
-
Oxidized can `ssh` through a proxy as well. To do so we just need to set `
|
313
|
+
Oxidized can `ssh` through a proxy as well. To do so we just need to set `ssh_proxy` variable.
|
287
314
|
|
288
315
|
```
|
289
316
|
...
|
@@ -292,7 +319,7 @@ map:
|
|
292
319
|
model: 1
|
293
320
|
vars_map:
|
294
321
|
enable: 2
|
295
|
-
|
322
|
+
ssh_proxy: 3
|
296
323
|
...
|
297
324
|
```
|
298
325
|
|
@@ -354,13 +381,53 @@ output:
|
|
354
381
|
|
355
382
|
This uses the rugged/libgit2 interface. So you should remember that normal Git hooks will not be executed.
|
356
383
|
|
384
|
+
|
385
|
+
For a single repositories for all devices:
|
386
|
+
|
387
|
+
``` yaml
|
388
|
+
output:
|
389
|
+
default: git
|
390
|
+
git:
|
391
|
+
user: Oxidized
|
392
|
+
email: o@example.com
|
393
|
+
repo: "/var/lib/oxidized/devices.git"
|
357
394
|
```
|
395
|
+
|
396
|
+
And for groups repositories:
|
397
|
+
|
398
|
+
``` yaml
|
358
399
|
output:
|
359
400
|
default: git
|
360
401
|
git:
|
361
402
|
user: Oxidized
|
362
403
|
email: o@example.com
|
404
|
+
repo:
|
405
|
+
first: "/var/lib/oxidized/first.git"
|
406
|
+
second: "/var/lib/oxidized/second.git"
|
407
|
+
```
|
408
|
+
|
409
|
+
If you would like to use groups and a single repository, you can force this with the `single_repo` config.
|
410
|
+
|
411
|
+
``` yaml
|
412
|
+
output:
|
413
|
+
default: git
|
414
|
+
git:
|
415
|
+
single_repo: true
|
363
416
|
repo: "/var/lib/oxidized/devices.git"
|
417
|
+
|
418
|
+
```
|
419
|
+
|
420
|
+
### Output: Http
|
421
|
+
|
422
|
+
POST a config to the specified URL
|
423
|
+
|
424
|
+
```
|
425
|
+
output:
|
426
|
+
default: http
|
427
|
+
http:
|
428
|
+
user: admin
|
429
|
+
password: changeit
|
430
|
+
url: "http://192.168.162.50:8080/db/coll"
|
364
431
|
```
|
365
432
|
|
366
433
|
### Output types
|
@@ -525,6 +592,42 @@ hooks:
|
|
525
592
|
timeout: 120
|
526
593
|
```
|
527
594
|
|
595
|
+
### githubrepo
|
596
|
+
|
597
|
+
This hook configures the repository `remote` and _push_ the code when the specified event is triggerd. If the `username` and `password` are not provided, the `Rugged::Credentials::SshKeyFromAgent` will be used.
|
598
|
+
|
599
|
+
`githubrepo` hook recognizes following configuration keys:
|
600
|
+
|
601
|
+
* `remote_repo`: the remote repository to be pushed to.
|
602
|
+
* `username`: username for repository auth.
|
603
|
+
* `password`: password for repository auth.
|
604
|
+
* `publickey`: publickey for repository auth.
|
605
|
+
* `privatekey`: privatekey for repository auth.
|
606
|
+
|
607
|
+
When using groups repositories, each group must have its own `remote` in the `remote_repo` config.
|
608
|
+
|
609
|
+
``` yaml
|
610
|
+
hooks:
|
611
|
+
push_to_remote:
|
612
|
+
remote_repo:
|
613
|
+
routers: git@git.intranet:oxidized/routers.git
|
614
|
+
switches: git@git.intranet:oxidized/switches.git
|
615
|
+
firewalls: git@git.intranet:oxidized/firewalls.git
|
616
|
+
```
|
617
|
+
|
618
|
+
|
619
|
+
## Hook configuration example
|
620
|
+
|
621
|
+
``` yaml
|
622
|
+
hooks:
|
623
|
+
push_to_remote:
|
624
|
+
type: githubrepo
|
625
|
+
events: [post_store]
|
626
|
+
remote_repo: git@git.intranet:oxidized/test.git
|
627
|
+
username: user
|
628
|
+
password: pass
|
629
|
+
```
|
630
|
+
|
528
631
|
# Ruby API
|
529
632
|
|
530
633
|
The following objects exist in Oxidized.
|
@@ -0,0 +1,87 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
# chkconfig: - 99 01
|
3
|
+
# description: Oxidized - Network Device Configuration Backup Tool
|
4
|
+
# processname: /opt/ruby-2.1/bin/oxidized
|
5
|
+
|
6
|
+
# Source function library
|
7
|
+
. /etc/rc.d/init.d/functions
|
8
|
+
|
9
|
+
name="oxidized"
|
10
|
+
desc="Oxidized"
|
11
|
+
cmd=oxidized
|
12
|
+
args="--daemonize"
|
13
|
+
lockfile=/var/lock/subsys/$name
|
14
|
+
pidfile=/etc/oxidized/pid
|
15
|
+
|
16
|
+
export OXIDIZED_HOME=/etc/oxidized
|
17
|
+
|
18
|
+
# Source sysconfig configuration
|
19
|
+
[ -r /etc/sysconfig/$name ] && . /etc/sysconfig/$name
|
20
|
+
|
21
|
+
start() {
|
22
|
+
echo -n $"Starting $desc: "
|
23
|
+
daemon ${cmd} ${args}
|
24
|
+
retval=$?
|
25
|
+
if [ $retval = 0 ]
|
26
|
+
then
|
27
|
+
echo_success
|
28
|
+
touch $lockfile
|
29
|
+
else
|
30
|
+
echo_failure
|
31
|
+
fi
|
32
|
+
echo
|
33
|
+
return $retval
|
34
|
+
}
|
35
|
+
|
36
|
+
stop() {
|
37
|
+
echo -n $"Stopping $desc: "
|
38
|
+
killproc -p $pidfile
|
39
|
+
retval=$?
|
40
|
+
[ $retval -eq 0 ] && rm -f $lockfile
|
41
|
+
rm -f $pidfile
|
42
|
+
echo
|
43
|
+
return $retval
|
44
|
+
}
|
45
|
+
|
46
|
+
restart() {
|
47
|
+
stop
|
48
|
+
start
|
49
|
+
}
|
50
|
+
|
51
|
+
reload() {
|
52
|
+
echo -n $"Reloading config..."
|
53
|
+
curl -s http://localhost:8888/reload?format=json -O /dev/null
|
54
|
+
echo
|
55
|
+
}
|
56
|
+
|
57
|
+
rh_status() {
|
58
|
+
status -p $pidfile $cmd
|
59
|
+
}
|
60
|
+
|
61
|
+
rh_status_q() {
|
62
|
+
rh_status >/dev/null 2>&1
|
63
|
+
}
|
64
|
+
|
65
|
+
case "$1" in
|
66
|
+
start)
|
67
|
+
rh_status_q && exit 0
|
68
|
+
$1
|
69
|
+
;;
|
70
|
+
stop)
|
71
|
+
rh_status_q || exit 0
|
72
|
+
$1
|
73
|
+
;;
|
74
|
+
restart)
|
75
|
+
$1
|
76
|
+
;;
|
77
|
+
reload)
|
78
|
+
rh_status_q || exit 0
|
79
|
+
$1
|
80
|
+
;;
|
81
|
+
status)
|
82
|
+
rh_status
|
83
|
+
;;
|
84
|
+
*)
|
85
|
+
echo $"Usage: $0 {start|stop|restart|reload|status}"
|
86
|
+
exit 2
|
87
|
+
esac
|
data/lib/oxidized.rb
CHANGED
data/lib/oxidized/cli.rb
CHANGED
@@ -43,6 +43,10 @@ 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 'v', 'version', 'show version' do
|
47
|
+
puts Oxidized::VERSION
|
48
|
+
Kernel.exit
|
49
|
+
end
|
46
50
|
end
|
47
51
|
[opts.parse!, opts]
|
48
52
|
end
|
data/lib/oxidized/config.rb
CHANGED
@@ -3,7 +3,7 @@ module Oxidized
|
|
3
3
|
class NoConfig < OxidizedError; end
|
4
4
|
class InvalidConfig < OxidizedError; end
|
5
5
|
class Config
|
6
|
-
Root = File.join
|
6
|
+
Root = ENV['OXIDIZED_HOME'] || File.join(ENV['HOME'], '.config', 'oxidized')
|
7
7
|
Crash = File.join Root, 'crash'
|
8
8
|
Log = File.join Root, 'log'
|
9
9
|
InputDir = File.join Directory, %w(lib oxidized input)
|
@@ -27,7 +27,7 @@ module Oxidized
|
|
27
27
|
asetus.default.timeout = 20
|
28
28
|
asetus.default.retries = 3
|
29
29
|
asetus.default.prompt = /^([\w.@-]+[#>]\s?)$/
|
30
|
-
|
30
|
+
asetus.default.rest = '127.0.0.1:8888' # or false to disable
|
31
31
|
asetus.default.vars = {} # could be 'enable'=>'enablePW'
|
32
32
|
asetus.default.groups = {} # group level configuration
|
33
33
|
|
@@ -1,12 +1,12 @@
|
|
1
1
|
class GithubRepo < Oxidized::Hook
|
2
2
|
def validate_cfg!
|
3
|
-
|
3
|
+
raise KeyError, 'hook.remote_repo is required' unless cfg.has_key?('remote_repo')
|
4
4
|
end
|
5
5
|
|
6
6
|
def run_hook(ctx)
|
7
|
-
repo = Rugged::Repository.new(
|
7
|
+
repo = Rugged::Repository.new(ctx.node.repo)
|
8
8
|
log "Pushing local repository(#{repo.path})..."
|
9
|
-
remote = repo.remotes['origin'] || repo.remotes.create('origin',
|
9
|
+
remote = repo.remotes['origin'] || repo.remotes.create('origin', remote_repo(ctx.node))
|
10
10
|
log "to remote: #{remote.url}"
|
11
11
|
|
12
12
|
fetch_and_merge_remote(repo)
|
@@ -49,9 +49,21 @@ class GithubRepo < Oxidized::Hook
|
|
49
49
|
log "Using https auth", :debug
|
50
50
|
Rugged::Credentials::UserPassword.new(username: cfg.username, password: cfg.password)
|
51
51
|
else
|
52
|
-
|
53
|
-
|
52
|
+
if cfg.has_key?('publickey') && cfg.has_key?('privatekey')
|
53
|
+
log "Using ssh auth with key", :debug
|
54
|
+
Rugged::Credentials::SshKey.new(username: 'git', publickey: File.expand_path(cfg.publickey), privatekey: File.expand_path(cfg.privatekey))
|
55
|
+
else
|
56
|
+
log "Using ssh auth with agentforwarding", :debug
|
57
|
+
Rugged::Credentials::SshKeyFromAgent.new(username: 'git')
|
58
|
+
end
|
54
59
|
end
|
55
60
|
end
|
56
61
|
|
62
|
+
def remote_repo(node)
|
63
|
+
if node.group.nil? || cfg.remote_repo.is_a?(String)
|
64
|
+
cfg.remote_repo
|
65
|
+
else
|
66
|
+
cfg.remote_repo[node.group]
|
67
|
+
end
|
68
|
+
end
|
57
69
|
end
|
data/lib/oxidized/input/ssh.rb
CHANGED
@@ -23,15 +23,21 @@ module Oxidized
|
|
23
23
|
secure = Oxidized.config.input.ssh.secure
|
24
24
|
@log = File.open(Oxidized::Config::Log + "-#{@node.ip}-ssh", 'w') if Oxidized.config.input.debug?
|
25
25
|
port = vars(:ssh_port) || 22
|
26
|
-
if proxy_host = vars(:
|
27
|
-
proxy = Net::SSH::Proxy::Command.new("ssh #{proxy_host}
|
26
|
+
if proxy_host = vars(:ssh_proxy)
|
27
|
+
proxy = Net::SSH::Proxy::Command.new("ssh #{proxy_host} -W %h:%p")
|
28
28
|
end
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
29
|
+
ssh_opts = {
|
30
|
+
:port => port.to_i,
|
31
|
+
:password => @node.auth[:password], :timeout => Oxidized.config.timeout,
|
32
|
+
:paranoid => secure,
|
33
|
+
:auth_methods => %w(none publickey password keyboard-interactive),
|
34
|
+
:number_of_password_prompts => 0,
|
35
|
+
:proxy => proxy
|
36
|
+
}
|
37
|
+
ssh_opts[:kex] = vars(:ssh_kex).split(/,\s*/) if vars(:ssh_kex)
|
38
|
+
ssh_opts[:encryption] = vars(:ssh_encryption).split(/,\s*/) if vars(:ssh_encryption)
|
39
|
+
|
40
|
+
@ssh = Net::SSH.start(@node.ip, @node.auth[:username], ssh_opts)
|
35
41
|
unless @exec
|
36
42
|
shell_open @ssh
|
37
43
|
begin
|
@@ -86,7 +92,7 @@ module Oxidized
|
|
86
92
|
@output << data
|
87
93
|
@output = @node.model.expects @output
|
88
94
|
end
|
89
|
-
ch.request_pty (
|
95
|
+
ch.request_pty (_opts={:term=>'vt100'}) do |_ch, success_pty|
|
90
96
|
raise NoShell, "Can't get PTY" unless success_pty
|
91
97
|
ch.send_channel_request 'shell' do |_ch, success_shell|
|
92
98
|
raise NoShell, "Can't get shell" unless success_shell
|
data/lib/oxidized/model/airos.rb
CHANGED
@@ -0,0 +1,33 @@
|
|
1
|
+
class DataCom < Oxidized::Model
|
2
|
+
|
3
|
+
comment '! '
|
4
|
+
|
5
|
+
expect /^--More--\s+$/ do |data, re|
|
6
|
+
send ' '
|
7
|
+
data.sub re, ''
|
8
|
+
end
|
9
|
+
|
10
|
+
cmd :all do |cfg|
|
11
|
+
cfg.each_line.to_a[1..-2].join
|
12
|
+
cfg.cut_head.cut_tail
|
13
|
+
end
|
14
|
+
|
15
|
+
cmd 'show firmware' do |cfg|
|
16
|
+
comment cfg
|
17
|
+
end
|
18
|
+
|
19
|
+
cmd 'show system' do |cfg|
|
20
|
+
comment cfg
|
21
|
+
end
|
22
|
+
|
23
|
+
cmd 'show running-config' do |cfg|
|
24
|
+
cfg.cut_head
|
25
|
+
end
|
26
|
+
|
27
|
+
cfg :telnet, :ssh do
|
28
|
+
username /login:\s$/
|
29
|
+
password /^Password:\s$/
|
30
|
+
pre_logout 'exit'
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
@@ -4,22 +4,29 @@ class EdgeSwitch < Oxidized::Model
|
|
4
4
|
|
5
5
|
comment '!'
|
6
6
|
|
7
|
-
prompt
|
7
|
+
prompt /\(.*\)\s[#>]/
|
8
8
|
|
9
9
|
cmd 'show running-config' do |cfg|
|
10
|
-
|
10
|
+
cfg.each_line.to_a[2..-2].reject { |line| line.match /System Up Time.*/ or line.match /Current SNTP Synchronized Time.*/ }.join
|
11
11
|
end
|
12
12
|
|
13
13
|
cfg :telnet do
|
14
14
|
username /Username:\s/
|
15
|
-
|
15
|
+
password /^Password:\s/
|
16
16
|
end
|
17
17
|
|
18
18
|
cfg :telnet, :ssh do
|
19
|
-
post_login
|
20
|
-
|
21
|
-
|
22
|
-
|
19
|
+
post_login do
|
20
|
+
if vars :enable
|
21
|
+
send "enable\n"
|
22
|
+
cmd vars(:enable)
|
23
|
+
else
|
24
|
+
cmd 'enable'
|
25
|
+
end
|
26
|
+
cmd 'terminal length 0'
|
27
|
+
end
|
28
|
+
pre_logout 'quit'
|
29
|
+
pre_logout 'n'
|
23
30
|
end
|
24
31
|
|
25
|
-
end
|
32
|
+
end
|
@@ -2,11 +2,16 @@ class FortiOS < Oxidized::Model
|
|
2
2
|
|
3
3
|
comment '# '
|
4
4
|
|
5
|
-
prompt /^([-\w\.]+(\s[\(\w\-\.\)]+)?\~?\s?[
|
5
|
+
prompt /^([-\w\.]+(\s[\(\w\-\.\)]+)?\~?\s?[#>$]\s?)$/
|
6
|
+
|
7
|
+
expect /^--More--\s$/ do |data, re|
|
8
|
+
send ' '
|
9
|
+
data.sub re, ''
|
10
|
+
end
|
6
11
|
|
7
12
|
cmd :all do |cfg, cmdstring|
|
8
13
|
new_cfg = comment "COMMAND: #{cmdstring}\n"
|
9
|
-
new_cfg << cfg.each_line.to_a[1..-2].join
|
14
|
+
new_cfg << cfg.each_line.to_a[1..-2].map { |line| line.gsub(/(conf_file_ver=)(.*)/, '\1<stripped>\3') }.join
|
10
15
|
end
|
11
16
|
|
12
17
|
cmd 'get system status' do |cfg|
|
data/lib/oxidized/model/ios.rb
CHANGED
@@ -25,6 +25,10 @@ class IOS < Oxidized::Model
|
|
25
25
|
cmd :secret do |cfg|
|
26
26
|
cfg.gsub! /^(snmp-server community).*/, '\\1 <configuration removed>'
|
27
27
|
cfg.gsub! /username (\S+) privilege (\d+) (\S+).*/, '<secret hidden>'
|
28
|
+
cfg.gsub! /^username \S+ password \d \S+/, '<secret hidden>'
|
29
|
+
cfg.gsub! /^enable password \d \S+/, '<secret hidden>'
|
30
|
+
cfg.gsub! /wpa-psk ascii \d \S+/, '<secret hidden>'
|
31
|
+
cfg.gsub! /^tacacs-server key \d \S+/, '<secret hidden>'
|
28
32
|
cfg
|
29
33
|
end
|
30
34
|
|
@@ -0,0 +1,61 @@
|
|
1
|
+
class IPOS < Oxidized::Model
|
2
|
+
|
3
|
+
# Ericsson SSR (IPOS)
|
4
|
+
# Redback SE (SEOS)
|
5
|
+
|
6
|
+
prompt /^([\[\]\w.@-]+[#>]\s?)$/
|
7
|
+
comment '! '
|
8
|
+
|
9
|
+
cmd 'show chassis' do |cfg|
|
10
|
+
comment cfg.each_line.to_a[0..-2].join
|
11
|
+
end
|
12
|
+
|
13
|
+
cmd 'show hardware' do |cfg|
|
14
|
+
comment cfg.each_line.to_a[0..-2].join
|
15
|
+
end
|
16
|
+
|
17
|
+
cmd 'show release' do |cfg|
|
18
|
+
comment cfg.each_line.to_a[0..-2].join
|
19
|
+
end
|
20
|
+
|
21
|
+
cmd 'show configuration' do |cfg|
|
22
|
+
# SEOS regularly adds some odd line breaks in random places
|
23
|
+
# when showing the config, triggering changes.
|
24
|
+
cfg.gsub! "\r\n", "\n"
|
25
|
+
|
26
|
+
cfg = cfg.each_line.to_a
|
27
|
+
|
28
|
+
# Keeps the issued command commented but removes the uncommented "Building configuration..."
|
29
|
+
# and "Current configuration:" lines as well as the last prompt at the end.
|
30
|
+
cfg = cfg[4..-2].unshift comment cfg[0]
|
31
|
+
|
32
|
+
# Later IPOS releases add this line in addition to the usual "last changed" line.
|
33
|
+
# It's touched regularly (as often as multiple times per minute) by the OS without actual visible config changes.
|
34
|
+
cfg = cfg.reject { |line| line.match "Configuration last changed by system user" }
|
35
|
+
|
36
|
+
# Earlier IPOS releases lack the "changed by system user" line and instead overwrite
|
37
|
+
# the single "last changed by user" line. Because the line has a timestamp it will
|
38
|
+
# trigger constant changes if not removed. By doing so there will only be a single
|
39
|
+
# extra change trigged after an actual config change by a user but still have the
|
40
|
+
# real user.
|
41
|
+
cfg = cfg.reject { |line| line.match "Configuration last changed by user '%LICM%' at" }
|
42
|
+
cfg = cfg.reject { |line| line.match "Configuration last changed by user '<NO USER>' at" }
|
43
|
+
cfg = cfg.reject { |line| line.match "Configuration last changed by user '' at" }
|
44
|
+
|
45
|
+
cfg.join
|
46
|
+
end
|
47
|
+
|
48
|
+
cfg :telnet do
|
49
|
+
username /^login:/
|
50
|
+
password /^\r*password:/
|
51
|
+
end
|
52
|
+
|
53
|
+
cfg :telnet, :ssh do
|
54
|
+
post_login 'terminal length 0'
|
55
|
+
pre_logout do
|
56
|
+
send "exit\n"
|
57
|
+
send "n\n"
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
data/lib/oxidized/model/junos.rb
CHANGED
@@ -0,0 +1,37 @@
|
|
1
|
+
class Mtrlrfs < Oxidized::Model
|
2
|
+
|
3
|
+
# Motorola RFS/Extreme WM
|
4
|
+
|
5
|
+
comment '# '
|
6
|
+
|
7
|
+
cmd :all do |cfg|
|
8
|
+
# xos inserts leading \r characters and other trailing white space.
|
9
|
+
# 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"
|
11
|
+
end
|
12
|
+
|
13
|
+
cmd 'show version' do |cfg|
|
14
|
+
comment cfg
|
15
|
+
end
|
16
|
+
|
17
|
+
cmd 'show licenses' do |cfg|
|
18
|
+
comment cfg
|
19
|
+
end
|
20
|
+
|
21
|
+
cmd 'show running-config'
|
22
|
+
|
23
|
+
cfg :telnet do
|
24
|
+
username /^login:/
|
25
|
+
password /^\r*password:/
|
26
|
+
end
|
27
|
+
|
28
|
+
cfg :telnet, :ssh do
|
29
|
+
post_login 'terminal length 0'
|
30
|
+
pre_logout do
|
31
|
+
send "exit\n"
|
32
|
+
send "n\n"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
@@ -0,0 +1,24 @@
|
|
1
|
+
class NetScaler < Oxidized::Model
|
2
|
+
|
3
|
+
prompt /^\>\s*$/
|
4
|
+
comment '# '
|
5
|
+
|
6
|
+
cmd :all do |cfg|
|
7
|
+
cfg.each_line.to_a[1..-3].join
|
8
|
+
end
|
9
|
+
|
10
|
+
cmd 'show version' do |cfg|
|
11
|
+
comment cfg
|
12
|
+
end
|
13
|
+
|
14
|
+
cmd 'show hardware' do |cfg|
|
15
|
+
comment cfg
|
16
|
+
end
|
17
|
+
|
18
|
+
cmd 'show ns ns.conf'
|
19
|
+
|
20
|
+
cfg :ssh do
|
21
|
+
pre_logout 'exit'
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
data/lib/oxidized/model/nos.rb
CHANGED
@@ -1,36 +1,49 @@
|
|
1
1
|
class Procurve < Oxidized::Model
|
2
2
|
|
3
|
-
#
|
4
|
-
|
3
|
+
# some models start lines with \r
|
4
|
+
# previous command is repeated followed by "\eE", which sometimes ends up on last line
|
5
|
+
prompt /^\r?([\w -]+\eE)?([\w-]+# )$/
|
5
6
|
|
6
7
|
comment '! '
|
7
8
|
|
9
|
+
# replace all used vt100 control sequences
|
10
|
+
expect /\e\[\??\d+(;\d+)*[A-Za-z]/ do |data, re|
|
11
|
+
data.gsub re, ''
|
12
|
+
end
|
13
|
+
|
8
14
|
expect /Press any key to continue/ do
|
9
|
-
|
10
|
-
|
15
|
+
send ' '
|
16
|
+
""
|
11
17
|
end
|
12
18
|
|
13
19
|
cmd :all do |cfg|
|
14
20
|
cfg = cfg.each_line.to_a[1..-3].join
|
15
|
-
cfg = cfg.gsub
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
21
|
+
cfg = cfg.gsub /^\r/, ''
|
22
|
+
end
|
23
|
+
|
24
|
+
cmd :secret do |cfg|
|
25
|
+
cfg.gsub! /^(snmp-server community).*/, '\\1 <configuration removed>'
|
26
|
+
cfg.gsub! /^(snmp-server host).*/, '\\1 <configuration removed>'
|
27
|
+
cfg.gsub! /^(radius-server host).*/, '\\1 <configuration removed>'
|
28
|
+
cfg
|
23
29
|
end
|
24
30
|
|
25
31
|
cmd 'show version' do |cfg|
|
26
32
|
comment cfg
|
27
33
|
end
|
28
34
|
|
35
|
+
# not supported on all models
|
29
36
|
cmd 'show system-information' do |cfg|
|
30
37
|
cfg = cfg.split("\n")[0..-8].join("\n")
|
31
38
|
comment cfg
|
32
39
|
end
|
33
40
|
|
41
|
+
# not supported on all models
|
42
|
+
cmd 'show system information' do |cfg|
|
43
|
+
cfg = cfg.split("\n")[0..-8].join("\n")
|
44
|
+
comment cfg
|
45
|
+
end
|
46
|
+
|
34
47
|
cmd 'show running-config'
|
35
48
|
|
36
49
|
cfg :telnet do
|
data/lib/oxidized/model/tmos.rb
CHANGED
@@ -22,25 +22,27 @@ class TMOS < Oxidized::Model
|
|
22
22
|
|
23
23
|
cmd('cat /config/bigip.license') { |cfg| comment cfg }
|
24
24
|
|
25
|
-
cmd 'tmsh list' do |cfg|
|
26
|
-
cfg.gsub!(/state (up|down)/, '')
|
25
|
+
cmd 'tmsh -q list' do |cfg|
|
26
|
+
cfg.gsub!(/state (up|down|checking|irule-down)/, '')
|
27
27
|
cfg.gsub!(/errors (\d+)/, '')
|
28
28
|
cfg
|
29
29
|
end
|
30
30
|
|
31
|
-
cmd('tmsh list net route all') { |cfg| comment cfg }
|
31
|
+
cmd('tmsh -q list net route all') { |cfg| comment cfg }
|
32
32
|
|
33
33
|
cmd('/bin/ls --full-time --color=never /config/ssl/ssl.crt') { |cfg| comment cfg }
|
34
34
|
|
35
35
|
cmd('/bin/ls --full-time --color=never /config/ssl/ssl.key') { |cfg| comment cfg }
|
36
36
|
|
37
|
-
cmd 'tmsh show running-config sys db all-properties' do |cfg|
|
37
|
+
cmd 'tmsh -q show running-config sys db all-properties' do |cfg|
|
38
38
|
cfg.gsub!(/sys db configsync.localconfigtime {[^}]+}/m, '')
|
39
39
|
cfg.gsub!(/sys db gtm.configtime {[^}]+}/m, '')
|
40
40
|
cfg.gsub!(/sys db ltm.configtime {[^}]+}/m, '')
|
41
41
|
comment cfg
|
42
42
|
end
|
43
43
|
|
44
|
+
cmd('cat /config/partitions/*/bigip.conf') { |cfg| comment cfg }
|
45
|
+
|
44
46
|
cfg :ssh do
|
45
47
|
exec true # don't run shell, run each command in exec channel
|
46
48
|
end
|
data/lib/oxidized/model/xos.rb
CHANGED
data/lib/oxidized/node.rb
CHANGED
@@ -24,7 +24,7 @@ module Oxidized
|
|
24
24
|
@vars = opt[:vars]
|
25
25
|
@stats = Stats.new
|
26
26
|
@retry = 0
|
27
|
-
@repo =
|
27
|
+
@repo = resolve_repo
|
28
28
|
|
29
29
|
# model instance needs to access node instance
|
30
30
|
@model.node = self
|
@@ -170,5 +170,15 @@ module Oxidized
|
|
170
170
|
Oxidized.mgr.model[model].new
|
171
171
|
end
|
172
172
|
|
173
|
+
def resolve_repo
|
174
|
+
remote_repo = Oxidized.config.output.git.repo
|
175
|
+
|
176
|
+
if Oxidized.config.output.git.single_repo? || @group.nil? || remote_repo.is_a?(String)
|
177
|
+
remote_repo
|
178
|
+
else
|
179
|
+
remote_repo[@group]
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
173
183
|
end
|
174
184
|
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module Oxidized
|
2
|
+
class Http < Output
|
3
|
+
attr_reader :commitref
|
4
|
+
def initialize
|
5
|
+
@cfg = Oxidized.config.output.http
|
6
|
+
end
|
7
|
+
|
8
|
+
def setup
|
9
|
+
if @cfg.empty?
|
10
|
+
CFGS.user.output.http.user = 'Oxidized'
|
11
|
+
CFGS.user.output.http.pasword = 'secret'
|
12
|
+
CFGS.user.output.http.url = 'http://localhost/web-api/oxidized'
|
13
|
+
CFGS.save :user
|
14
|
+
raise NoConfig, 'no output http config, edit ~/.config/oxidized/config'
|
15
|
+
end
|
16
|
+
end
|
17
|
+
require "net/http"
|
18
|
+
require "uri"
|
19
|
+
require "json"
|
20
|
+
def store node, outputs, opt={}
|
21
|
+
@commitref = nil
|
22
|
+
json = JSON.pretty_generate(
|
23
|
+
{
|
24
|
+
'msg' => opt[:msg],
|
25
|
+
'user' => opt[:user],
|
26
|
+
'email' => opt[:email],
|
27
|
+
'group' => opt[:group],
|
28
|
+
'node' => node,
|
29
|
+
'config' => outputs.to_cfg,
|
30
|
+
# actually we need to also iterate outputs, for other types like in gitlab. But most people don't use 'type' functionality.
|
31
|
+
}
|
32
|
+
)
|
33
|
+
uri = URI.parse @cfg.url
|
34
|
+
http = Net::HTTP.new uri.host, uri.port
|
35
|
+
#http.use_ssl = true if uri.scheme = 'https'
|
36
|
+
req = Net::HTTP::Post.new(uri.request_uri, initheader = { 'Content-Type' => 'application/json'})
|
37
|
+
req.basic_auth @cfg.user, @cfg.password
|
38
|
+
req.body = json
|
39
|
+
response = http.request req
|
40
|
+
|
41
|
+
case response.code.to_i
|
42
|
+
when 200 || 201
|
43
|
+
Oxidized.logger.info "Configuration http backup complete for #{node}"
|
44
|
+
p [:success]
|
45
|
+
when (400..499)
|
46
|
+
Oxidized.logger.info "Configuration http backup for #{node} failed status: #{response.body}"
|
47
|
+
p [:bad_request]
|
48
|
+
when (500..599)
|
49
|
+
p [:server_problems]
|
50
|
+
Oxidized.logger.info "Configuration http backup for #{node} failed status: #{response.body}"
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
|
data/lib/oxidized/version.rb
CHANGED
metadata
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: oxidized
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.13.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Saku Ytti
|
@@ -11,162 +10,144 @@ authors:
|
|
11
10
|
autorequire:
|
12
11
|
bindir: bin
|
13
12
|
cert_chain: []
|
14
|
-
date: 2016-
|
13
|
+
date: 2016-03-30 00:00:00.000000000 Z
|
15
14
|
dependencies:
|
16
15
|
- !ruby/object:Gem::Dependency
|
17
16
|
name: asetus
|
18
17
|
requirement: !ruby/object:Gem::Requirement
|
19
|
-
none: false
|
20
18
|
requirements:
|
21
|
-
- - ~>
|
19
|
+
- - "~>"
|
22
20
|
- !ruby/object:Gem::Version
|
23
21
|
version: '0.1'
|
24
22
|
type: :runtime
|
25
23
|
prerelease: false
|
26
24
|
version_requirements: !ruby/object:Gem::Requirement
|
27
|
-
none: false
|
28
25
|
requirements:
|
29
|
-
- - ~>
|
26
|
+
- - "~>"
|
30
27
|
- !ruby/object:Gem::Version
|
31
28
|
version: '0.1'
|
32
29
|
- !ruby/object:Gem::Dependency
|
33
30
|
name: slop
|
34
31
|
requirement: !ruby/object:Gem::Requirement
|
35
|
-
none: false
|
36
32
|
requirements:
|
37
|
-
- - ~>
|
33
|
+
- - "~>"
|
38
34
|
- !ruby/object:Gem::Version
|
39
35
|
version: '3.5'
|
40
36
|
type: :runtime
|
41
37
|
prerelease: false
|
42
38
|
version_requirements: !ruby/object:Gem::Requirement
|
43
|
-
none: false
|
44
39
|
requirements:
|
45
|
-
- - ~>
|
40
|
+
- - "~>"
|
46
41
|
- !ruby/object:Gem::Version
|
47
42
|
version: '3.5'
|
48
43
|
- !ruby/object:Gem::Dependency
|
49
44
|
name: net-ssh
|
50
45
|
requirement: !ruby/object:Gem::Requirement
|
51
|
-
none: false
|
52
46
|
requirements:
|
53
|
-
- - ~>
|
47
|
+
- - "~>"
|
54
48
|
- !ruby/object:Gem::Version
|
55
49
|
version: '3.0'
|
56
|
-
- -
|
50
|
+
- - ">="
|
57
51
|
- !ruby/object:Gem::Version
|
58
52
|
version: 3.0.2
|
59
53
|
type: :runtime
|
60
54
|
prerelease: false
|
61
55
|
version_requirements: !ruby/object:Gem::Requirement
|
62
|
-
none: false
|
63
56
|
requirements:
|
64
|
-
- - ~>
|
57
|
+
- - "~>"
|
65
58
|
- !ruby/object:Gem::Version
|
66
59
|
version: '3.0'
|
67
|
-
- -
|
60
|
+
- - ">="
|
68
61
|
- !ruby/object:Gem::Version
|
69
62
|
version: 3.0.2
|
70
63
|
- !ruby/object:Gem::Dependency
|
71
64
|
name: rugged
|
72
65
|
requirement: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
66
|
requirements:
|
75
|
-
- - ~>
|
67
|
+
- - "~>"
|
76
68
|
- !ruby/object:Gem::Version
|
77
69
|
version: '0.21'
|
78
|
-
- -
|
70
|
+
- - ">="
|
79
71
|
- !ruby/object:Gem::Version
|
80
72
|
version: 0.21.4
|
81
73
|
type: :runtime
|
82
74
|
prerelease: false
|
83
75
|
version_requirements: !ruby/object:Gem::Requirement
|
84
|
-
none: false
|
85
76
|
requirements:
|
86
|
-
- - ~>
|
77
|
+
- - "~>"
|
87
78
|
- !ruby/object:Gem::Version
|
88
79
|
version: '0.21'
|
89
|
-
- -
|
80
|
+
- - ">="
|
90
81
|
- !ruby/object:Gem::Version
|
91
82
|
version: 0.21.4
|
92
83
|
- !ruby/object:Gem::Dependency
|
93
84
|
name: pry
|
94
85
|
requirement: !ruby/object:Gem::Requirement
|
95
|
-
none: false
|
96
86
|
requirements:
|
97
|
-
- - ~>
|
87
|
+
- - "~>"
|
98
88
|
- !ruby/object:Gem::Version
|
99
89
|
version: '0'
|
100
90
|
type: :development
|
101
91
|
prerelease: false
|
102
92
|
version_requirements: !ruby/object:Gem::Requirement
|
103
|
-
none: false
|
104
93
|
requirements:
|
105
|
-
- - ~>
|
94
|
+
- - "~>"
|
106
95
|
- !ruby/object:Gem::Version
|
107
96
|
version: '0'
|
108
97
|
- !ruby/object:Gem::Dependency
|
109
98
|
name: bundler
|
110
99
|
requirement: !ruby/object:Gem::Requirement
|
111
|
-
none: false
|
112
100
|
requirements:
|
113
|
-
- - ~>
|
101
|
+
- - "~>"
|
114
102
|
- !ruby/object:Gem::Version
|
115
103
|
version: '1.10'
|
116
104
|
type: :development
|
117
105
|
prerelease: false
|
118
106
|
version_requirements: !ruby/object:Gem::Requirement
|
119
|
-
none: false
|
120
107
|
requirements:
|
121
|
-
- - ~>
|
108
|
+
- - "~>"
|
122
109
|
- !ruby/object:Gem::Version
|
123
110
|
version: '1.10'
|
124
111
|
- !ruby/object:Gem::Dependency
|
125
112
|
name: rake
|
126
113
|
requirement: !ruby/object:Gem::Requirement
|
127
|
-
none: false
|
128
114
|
requirements:
|
129
|
-
- - ~>
|
115
|
+
- - "~>"
|
130
116
|
- !ruby/object:Gem::Version
|
131
117
|
version: '10.0'
|
132
118
|
type: :development
|
133
119
|
prerelease: false
|
134
120
|
version_requirements: !ruby/object:Gem::Requirement
|
135
|
-
none: false
|
136
121
|
requirements:
|
137
|
-
- - ~>
|
122
|
+
- - "~>"
|
138
123
|
- !ruby/object:Gem::Version
|
139
124
|
version: '10.0'
|
140
125
|
- !ruby/object:Gem::Dependency
|
141
126
|
name: minitest
|
142
127
|
requirement: !ruby/object:Gem::Requirement
|
143
|
-
none: false
|
144
128
|
requirements:
|
145
|
-
- - ~>
|
129
|
+
- - "~>"
|
146
130
|
- !ruby/object:Gem::Version
|
147
131
|
version: '5.8'
|
148
132
|
type: :development
|
149
133
|
prerelease: false
|
150
134
|
version_requirements: !ruby/object:Gem::Requirement
|
151
|
-
none: false
|
152
135
|
requirements:
|
153
|
-
- - ~>
|
136
|
+
- - "~>"
|
154
137
|
- !ruby/object:Gem::Version
|
155
138
|
version: '5.8'
|
156
139
|
- !ruby/object:Gem::Dependency
|
157
140
|
name: mocha
|
158
141
|
requirement: !ruby/object:Gem::Requirement
|
159
|
-
none: false
|
160
142
|
requirements:
|
161
|
-
- - ~>
|
143
|
+
- - "~>"
|
162
144
|
- !ruby/object:Gem::Version
|
163
145
|
version: '1.1'
|
164
146
|
type: :development
|
165
147
|
prerelease: false
|
166
148
|
version_requirements: !ruby/object:Gem::Requirement
|
167
|
-
none: false
|
168
149
|
requirements:
|
169
|
-
- - ~>
|
150
|
+
- - "~>"
|
170
151
|
- !ruby/object:Gem::Version
|
171
152
|
version: '1.1'
|
172
153
|
description: software to fetch configuration from network devices and store them
|
@@ -179,7 +160,7 @@ executables:
|
|
179
160
|
extensions: []
|
180
161
|
extra_rdoc_files: []
|
181
162
|
files:
|
182
|
-
- .travis.yml
|
163
|
+
- ".travis.yml"
|
183
164
|
- CHANGELOG.md
|
184
165
|
- Dockerfile
|
185
166
|
- Gemfile
|
@@ -193,6 +174,7 @@ files:
|
|
193
174
|
- extra/nagios_check_failing_nodes.rb
|
194
175
|
- extra/oxidized-report-git-commits
|
195
176
|
- extra/oxidized.init
|
177
|
+
- extra/oxidized.init.d
|
196
178
|
- extra/oxidized.runit
|
197
179
|
- extra/oxidized.service
|
198
180
|
- extra/oxidized.supervisord
|
@@ -228,6 +210,7 @@ files:
|
|
228
210
|
- lib/oxidized/model/ciscosmb.rb
|
229
211
|
- lib/oxidized/model/comware.rb
|
230
212
|
- lib/oxidized/model/cumulus.rb
|
213
|
+
- lib/oxidized/model/datacom.rb
|
231
214
|
- lib/oxidized/model/dnos.rb
|
232
215
|
- lib/oxidized/model/edgeos.rb
|
233
216
|
- lib/oxidized/model/edgeswitch.rb
|
@@ -237,11 +220,15 @@ files:
|
|
237
220
|
- lib/oxidized/model/ftos.rb
|
238
221
|
- lib/oxidized/model/ios.rb
|
239
222
|
- lib/oxidized/model/iosxr.rb
|
223
|
+
- lib/oxidized/model/ipos.rb
|
240
224
|
- lib/oxidized/model/ironware.rb
|
241
225
|
- lib/oxidized/model/isam.rb
|
242
226
|
- lib/oxidized/model/junos.rb
|
243
227
|
- lib/oxidized/model/masteros.rb
|
244
228
|
- lib/oxidized/model/model.rb
|
229
|
+
- lib/oxidized/model/mtrlrfs.rb
|
230
|
+
- lib/oxidized/model/netonix.rb
|
231
|
+
- lib/oxidized/model/netscaler.rb
|
245
232
|
- lib/oxidized/model/nos.rb
|
246
233
|
- lib/oxidized/model/nxos.rb
|
247
234
|
- lib/oxidized/model/opengear.rb
|
@@ -263,6 +250,7 @@ files:
|
|
263
250
|
- lib/oxidized/nodes.rb
|
264
251
|
- lib/oxidized/output/file.rb
|
265
252
|
- lib/oxidized/output/git.rb
|
253
|
+
- lib/oxidized/output/http.rb
|
266
254
|
- lib/oxidized/output/output.rb
|
267
255
|
- lib/oxidized/source/csv.rb
|
268
256
|
- lib/oxidized/source/http.rb
|
@@ -275,26 +263,25 @@ files:
|
|
275
263
|
homepage: http://github.com/ytti/oxidized
|
276
264
|
licenses:
|
277
265
|
- Apache-2.0
|
266
|
+
metadata: {}
|
278
267
|
post_install_message:
|
279
268
|
rdoc_options: []
|
280
269
|
require_paths:
|
281
270
|
- lib
|
282
271
|
required_ruby_version: !ruby/object:Gem::Requirement
|
283
|
-
none: false
|
284
272
|
requirements:
|
285
|
-
- -
|
273
|
+
- - ">="
|
286
274
|
- !ruby/object:Gem::Version
|
287
275
|
version: 2.0.0
|
288
276
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
289
|
-
none: false
|
290
277
|
requirements:
|
291
|
-
- -
|
278
|
+
- - ">="
|
292
279
|
- !ruby/object:Gem::Version
|
293
280
|
version: '0'
|
294
281
|
requirements: []
|
295
282
|
rubyforge_project: oxidized
|
296
|
-
rubygems_version:
|
283
|
+
rubygems_version: 2.5.1
|
297
284
|
signing_key:
|
298
|
-
specification_version:
|
285
|
+
specification_version: 4
|
299
286
|
summary: feeble attempt at rancid
|
300
287
|
test_files: []
|