oxidized-script 0.2.0 → 0.3.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/.gitignore +1 -0
- data/CHANGELOG.md +6 -0
- data/README.md +27 -8
- data/bin/oxs +1 -1
- data/lib/oxidized/script/cli.rb +83 -9
- data/lib/oxidized/script/script.rb +10 -8
- data/oxidized-script.gemspec +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1a38be515ce13472269675c5686f022207c5f394
|
4
|
+
data.tar.gz: 8a08ffbdbe0aa0326d32aaa9c9b59435ca4af3a1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8e0d9f0226991efd74bfb9a4896ed7b896f8f2b5ad86736047aa780c041dae5f77d343506720e975cac80e455fd22a7adf3aa6d7376dd18e64e057f53146c481
|
7
|
+
data.tar.gz: dff10d69c6fc2e601f8c030465541dff60a086fcd354a7054ea3570981d893abc7b9c667ba4af43f14373ba0b1441d89b20ca3ca97ead77599c8163eaf2633ff
|
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
# 0.3.0
|
2
|
+
- FEATURE on --regex to run commands on hosts matching a regex (by @nertwork)
|
3
|
+
- FEATURE on -g to run commands on entire group (by @nertwork)
|
4
|
+
- FEATURE on -r to thread commands run on entire group (by @nertwork)
|
5
|
+
- BUGFIX: fix for replacing escaped newlines in config files (by @nertwork)
|
6
|
+
|
1
7
|
# 0.2.0
|
2
8
|
- FEATURE on -x disable ssh exec mode (by @nickhilliard)
|
3
9
|
|
data/README.md
CHANGED
@@ -27,17 +27,36 @@ Default gateway is 62.236.123.198
|
|
27
27
|
Host Gateway Last Use Total Uses Interface
|
28
28
|
ICMP redirect cache is empty
|
29
29
|
%IPv4 CEF not running
|
30
|
+
|
31
|
+
[nertwork@lan-login2 ~]% oxs --verbose --group ios --threads 4 --regex ^test 'show vrf'
|
32
|
+
running list for hosts in group: ios and matching: ^test
|
33
|
+
## HOST - test-node-1
|
34
|
+
## OXS - show vrf
|
35
|
+
Name Default RD Protocols Interfaces
|
36
|
+
mgmtVRF <not set> ipv4,ipv6 Fa1
|
37
|
+
|
30
38
|
[fisakytt@lan-login1 ~]% oxs --help
|
31
39
|
Usage: oxs [options] hostname [command]
|
32
|
-
-m, --model
|
33
|
-
-x, --commands
|
34
|
-
-u, --username
|
35
|
-
-p, --password
|
36
|
-
-t, --timeout
|
37
|
-
-e, --enable
|
38
|
-
-
|
39
|
-
-
|
40
|
+
-m, --model host model (ios, junos, etc), otherwise discovered from Oxidized source
|
41
|
+
-x, --commands commands file to be sent
|
42
|
+
-u, --username username to use
|
43
|
+
-p, --password password to use
|
44
|
+
-t, --timeout timeout value to use
|
45
|
+
-e, --enable enable password to use
|
46
|
+
-c, --community snmp community to use for discovery
|
47
|
+
-g, --group group to run commands on (ios, junos, etc), specified in oxidized db
|
48
|
+
-r, --threads specify ammount of threads to use for running group (default: 1)
|
49
|
+
--regex run on all hosts that match the regexp
|
50
|
+
--protocols protocols to use, default "ssh, telnet"
|
51
|
+
-v, --verbose verbose output, e.g. show commands sent
|
52
|
+
-d, --debug turn on debugging
|
53
|
+
--terse display clean output
|
54
|
+
--list-models list supported models
|
55
|
+
--list-nodes list nodes in oxidized source
|
56
|
+
-h, --help Display this help message.
|
40
57
|
[fisakytt@lan-login1 ~]%
|
58
|
+
|
59
|
+
|
41
60
|
```
|
42
61
|
|
43
62
|
### Library
|
data/bin/oxs
CHANGED
data/lib/oxidized/script/cli.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
module Oxidized
|
2
2
|
require_relative 'script'
|
3
3
|
require 'slop'
|
4
|
+
require 'thread'
|
4
5
|
|
5
6
|
class Script
|
6
7
|
class CLI
|
@@ -9,11 +10,38 @@ module Oxidized
|
|
9
10
|
class NothingToDo < ScriptError; end
|
10
11
|
|
11
12
|
def run
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
13
|
+
if @group or @regex
|
14
|
+
nodes = get_hosts
|
15
|
+
work_q = Queue.new
|
16
|
+
nodes.each{|node| work_q.push node}
|
17
|
+
workers = (0...@threads.to_i).map do
|
18
|
+
Thread.new do
|
19
|
+
begin
|
20
|
+
while node = work_q.pop(true)
|
21
|
+
begin
|
22
|
+
@host = node
|
23
|
+
connect
|
24
|
+
if @opts[:commands]
|
25
|
+
puts run_file @opts[:commands]
|
26
|
+
elsif @cmd
|
27
|
+
puts @oxs.cmd @cmd
|
28
|
+
end
|
29
|
+
rescue
|
30
|
+
puts "Couldn't connect to: " + node
|
31
|
+
end
|
32
|
+
end
|
33
|
+
rescue ThreadError
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
workers.map(&:join)
|
38
|
+
else
|
39
|
+
connect
|
40
|
+
if @opts[:commands]
|
41
|
+
puts run_file @opts[:commands]
|
42
|
+
elsif @cmd
|
43
|
+
puts @oxs.cmd @cmd
|
44
|
+
end
|
17
45
|
end
|
18
46
|
end
|
19
47
|
|
@@ -33,10 +61,14 @@ module Oxidized
|
|
33
61
|
@cmd_class.run :args=>@args, :opts=>@opts, :host=>@host, :cmd=>@cmd
|
34
62
|
exit 0
|
35
63
|
else
|
36
|
-
@
|
37
|
-
|
64
|
+
if @group or @regex
|
65
|
+
@cmd = @args.shift
|
66
|
+
else
|
67
|
+
@host = @args.shift
|
68
|
+
@cmd = @args.shift if @args
|
69
|
+
end
|
38
70
|
@oxs = nil
|
39
|
-
raise NothingToDo, 'no host given' if not @host
|
71
|
+
raise NothingToDo, 'no host given' if not @host and not @group and not @regex
|
40
72
|
raise NothingToDo, 'nothing to do, give command or -x' if not @cmd and not @opts[:commands]
|
41
73
|
end
|
42
74
|
end
|
@@ -51,6 +83,9 @@ module Oxidized
|
|
51
83
|
slop.on 't=', '--timeout', 'timeout value to use'
|
52
84
|
slop.on 'e=', '--enable', 'enable password to use'
|
53
85
|
slop.on 'c=', '--community', 'snmp community to use for discovery'
|
86
|
+
slop.on 'g=', '--group', 'group to run commands on (ios, junos, etc), specified in oxidized db'
|
87
|
+
slop.on 'r=', '--threads', 'specify ammount of threads to use for running group', default: '1'
|
88
|
+
slop.on '--regex=', 'run on all hosts that match the regexp'
|
54
89
|
slop.on '--protocols=','protocols to use, default "ssh, telnet"'
|
55
90
|
slop.on 'v', '--verbose', 'verbose output, e.g. show commands sent'
|
56
91
|
slop.on 'd', '--debug', 'turn on debugging'
|
@@ -65,6 +100,10 @@ module Oxidized
|
|
65
100
|
end
|
66
101
|
end
|
67
102
|
slop.parse
|
103
|
+
@group = slop[:group]
|
104
|
+
@threads = slop[:threads]
|
105
|
+
@verbose = slop[:verbose]
|
106
|
+
@regex = slop[:regex]
|
68
107
|
[slop.parse!, slop]
|
69
108
|
end
|
70
109
|
|
@@ -82,7 +121,7 @@ module Oxidized
|
|
82
121
|
file = file == '-' ? $stdin : File.read(file)
|
83
122
|
file.each_line do |line|
|
84
123
|
line.chomp!
|
85
|
-
line.sub!(/\\n/, "\n") #
|
124
|
+
# line.sub!(/\\n/, "\n") # treat escaped newline as newline
|
86
125
|
out += @oxs.cmd line
|
87
126
|
end
|
88
127
|
out
|
@@ -104,6 +143,41 @@ module Oxidized
|
|
104
143
|
cmds
|
105
144
|
end
|
106
145
|
|
146
|
+
def get_hosts
|
147
|
+
if @group and @regex
|
148
|
+
puts "running list for hosts in group: #{@group} and matching: #{@regex}" if @verbose
|
149
|
+
nodes_group = run_group @group
|
150
|
+
nodes_regex = run_regex @regex
|
151
|
+
return nodes_group & nodes_regex
|
152
|
+
elsif @regex
|
153
|
+
puts 'running list for hosts matching: ' + @regex if @verbose
|
154
|
+
return run_regex @regex
|
155
|
+
else
|
156
|
+
puts 'running list for hosts in group: ' + @group if @verbose
|
157
|
+
return run_group @group
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
def run_group group
|
162
|
+
Oxidized.mgr = Manager.new
|
163
|
+
out = []
|
164
|
+
Nodes.new.each do |node|
|
165
|
+
next unless group == node.group
|
166
|
+
out << node.name
|
167
|
+
end
|
168
|
+
out
|
169
|
+
end
|
170
|
+
|
171
|
+
def run_regex regex
|
172
|
+
Oxidized.mgr = Manager.new
|
173
|
+
out = []
|
174
|
+
Nodes.new.each do |node|
|
175
|
+
next unless node.name =~ /#{regex}/
|
176
|
+
out << node.name
|
177
|
+
end
|
178
|
+
out
|
179
|
+
end
|
180
|
+
|
107
181
|
end
|
108
182
|
end
|
109
183
|
end
|
@@ -18,6 +18,7 @@ module Oxidized
|
|
18
18
|
# @return [String] output for command
|
19
19
|
def cmd command
|
20
20
|
out = ''
|
21
|
+
out += "## HOST - #{@host}\n" if @verbose
|
21
22
|
out += "## OXS - #{command}\n" if @verbose
|
22
23
|
cmd_out = @model.cmd command
|
23
24
|
out += cmd_out if cmd_out
|
@@ -34,7 +35,7 @@ module Oxidized
|
|
34
35
|
private
|
35
36
|
|
36
37
|
# @param [Hash] opts options for Oxidized::Script
|
37
|
-
# @option opts [String] :host hostname or ip address for Oxidized::Node
|
38
|
+
# @option opts [String] :host @hostname or ip address for Oxidized::Node
|
38
39
|
# @option opts [String] :model node model (ios, junos etc) if defined, nodes are not loaded from source
|
39
40
|
# @option opts [Fixnum] :timeout oxidized timeout
|
40
41
|
# @option opts [String] :username username for login
|
@@ -46,13 +47,14 @@ module Oxidized
|
|
46
47
|
# @yieldreturn [self] if called in block, returns self and disconnnects session after exiting block
|
47
48
|
# @return [void]
|
48
49
|
def initialize opts, &block
|
49
|
-
host
|
50
|
+
@host = opts.delete :host
|
50
51
|
model = opts.delete :model
|
51
52
|
timeout = opts.delete :timeout
|
52
53
|
username = opts.delete :username
|
53
54
|
password = opts.delete :password
|
54
55
|
enable = opts.delete :enable
|
55
56
|
community = opts.delete :community
|
57
|
+
group = opts.delete :group
|
56
58
|
@verbose = opts.delete :verbose
|
57
59
|
Oxidized.config.input.default = opts.delete :protocols if opts[:protocols]
|
58
60
|
raise InvalidOption, "#{opts} not recognized" unless opts.empty?
|
@@ -64,10 +66,10 @@ module Oxidized
|
|
64
66
|
end
|
65
67
|
|
66
68
|
@node = if model
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
69
|
+
Node.new(:name=>@host, :model=>model)
|
70
|
+
else
|
71
|
+
Nodes.new(:node=>@host).first
|
72
|
+
end
|
71
73
|
if not @node
|
72
74
|
begin
|
73
75
|
require 'corona'
|
@@ -75,9 +77,9 @@ module Oxidized
|
|
75
77
|
rescue LoadError
|
76
78
|
raise NoNode, 'node not found'
|
77
79
|
end
|
78
|
-
node = Corona.poll :host
|
80
|
+
node = Corona.poll :host=>@host, :community=>community
|
79
81
|
raise NoNode, 'node not found' unless node
|
80
|
-
@node = Node.new :name
|
82
|
+
@node = Node.new :name=>@host, :model=>node[:model]
|
81
83
|
end
|
82
84
|
@node.auth[:username] = username if username
|
83
85
|
@node.auth[:password] = password if password
|
data/oxidized-script.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: oxidized-script
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Saku Ytti
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-08-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: oxidized
|