rcmd 1.5.8 → 1.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rspec_status +7 -7
- data/Gemfile.lock +20 -1
- data/Rakefile +35 -2
- data/doc/rdocs/Rcmd.html +1 -1
- data/doc/rdocs/Rcmd/DB.html +489 -0
- data/doc/rdocs/created.rid +5 -4
- data/doc/rdocs/index.html +2 -0
- data/doc/rdocs/js/navigation.js.gz +0 -0
- data/doc/rdocs/js/search_index.js +1 -1
- data/doc/rdocs/js/search_index.js.gz +0 -0
- data/doc/rdocs/js/searcher.js.gz +0 -0
- data/doc/rdocs/table_of_contents.html +38 -0
- data/exe/rcmd +50 -6
- data/lib/rcmd.rb +4 -2
- data/lib/rcmd/db.rb +199 -0
- data/lib/rcmd/version.rb +2 -2
- data/rcmd.gemspec +2 -4
- metadata +18 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 43972a99b7fa833e8e8cb928e2b11a305bf4786f
|
4
|
+
data.tar.gz: 3c0b71cb37cfbbbb62e0ba008fe10f060a45a7c9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 47a65fd1edfc56767f2180455b72e028accd70e4077080ad0549a7dc54eaf893e036c52a36556f6335ca75c1a6687af0475fd734aba9e57f95f2d019f3a28fa1
|
7
|
+
data.tar.gz: 5ee4881c3f0a8c6f5edc65b2fb36f685d29e8323a24d6476b7f302435f0ec42237d478c2568716196dab672e5a28b1a333764dadbcb42c6e59740128bd32f134
|
data/.rspec_status
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
example_id | status | run_time |
|
2
2
|
------------------------ | ------ | --------------- |
|
3
|
-
./spec/rcmd_spec.rb[1:1] | passed | 0.
|
4
|
-
./spec/rcmd_spec.rb[1:2] | passed | 0.
|
5
|
-
./spec/rcmd_spec.rb[1:3] | passed | 0.
|
6
|
-
./spec/rcmd_spec.rb[1:4] | passed | 0.
|
7
|
-
./spec/rcmd_spec.rb[1:5] | passed | 0.
|
8
|
-
./spec/rcmd_spec.rb[1:6] | passed | 0.
|
9
|
-
./spec/rcmd_spec.rb[1:7] | passed | 0.
|
3
|
+
./spec/rcmd_spec.rb[1:1] | passed | 0.00078 seconds |
|
4
|
+
./spec/rcmd_spec.rb[1:2] | passed | 0.00116 seconds |
|
5
|
+
./spec/rcmd_spec.rb[1:3] | passed | 0.00099 seconds |
|
6
|
+
./spec/rcmd_spec.rb[1:4] | passed | 0.00018 seconds |
|
7
|
+
./spec/rcmd_spec.rb[1:5] | passed | 0.00019 seconds |
|
8
|
+
./spec/rcmd_spec.rb[1:6] | passed | 0.00133 seconds |
|
9
|
+
./spec/rcmd_spec.rb[1:7] | passed | 0.00011 seconds |
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
rcmd (1.
|
4
|
+
rcmd (1.6.0)
|
5
|
+
activerecord
|
5
6
|
io-console
|
6
7
|
net-ssh
|
7
8
|
regexp-examples
|
@@ -11,10 +12,25 @@ PATH
|
|
11
12
|
GEM
|
12
13
|
remote: https://rubygems.org/
|
13
14
|
specs:
|
15
|
+
activemodel (5.1.4)
|
16
|
+
activesupport (= 5.1.4)
|
17
|
+
activerecord (5.1.4)
|
18
|
+
activemodel (= 5.1.4)
|
19
|
+
activesupport (= 5.1.4)
|
20
|
+
arel (~> 8.0)
|
21
|
+
activesupport (5.1.4)
|
22
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
23
|
+
i18n (~> 0.7)
|
24
|
+
minitest (~> 5.1)
|
25
|
+
tzinfo (~> 1.1)
|
26
|
+
arel (8.0.0)
|
27
|
+
concurrent-ruby (1.0.5)
|
14
28
|
diff-lcs (1.3)
|
15
29
|
equatable (0.5.0)
|
16
30
|
hitimes (1.2.6)
|
31
|
+
i18n (0.8.6)
|
17
32
|
io-console (0.4.6)
|
33
|
+
minitest (5.10.3)
|
18
34
|
necromancer (0.4.0)
|
19
35
|
net-ssh (4.2.0)
|
20
36
|
pastel (0.7.1)
|
@@ -36,6 +52,7 @@ GEM
|
|
36
52
|
rspec-support (~> 3.6.0)
|
37
53
|
rspec-support (3.6.0)
|
38
54
|
thread (0.2.2)
|
55
|
+
thread_safe (0.3.6)
|
39
56
|
timers (4.1.2)
|
40
57
|
hitimes
|
41
58
|
tty-color (0.4.2)
|
@@ -48,6 +65,8 @@ GEM
|
|
48
65
|
tty-reader (~> 0.1.0)
|
49
66
|
tty-reader (0.1.0)
|
50
67
|
wisper (~> 2.0.0)
|
68
|
+
tzinfo (1.2.3)
|
69
|
+
thread_safe (~> 0.1)
|
51
70
|
wisper (2.0.0)
|
52
71
|
|
53
72
|
PLATFORMS
|
data/Rakefile
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require "bundler/gem_tasks"
|
2
2
|
require "rspec/core/rake_task"
|
3
3
|
require 'rdoc/task'
|
4
|
+
require 'sqlite3'
|
4
5
|
|
5
6
|
RSpec::Core::RakeTask.new(:spec)
|
6
7
|
|
@@ -10,7 +11,7 @@ desc "Open an IRB console with this gem loaded"
|
|
10
11
|
task :console do
|
11
12
|
require 'irb'
|
12
13
|
require 'irb/completion'
|
13
|
-
require 'rcmd'
|
14
|
+
require 'rcmd'
|
14
15
|
ARGV.clear
|
15
16
|
IRB.start
|
16
17
|
end
|
@@ -30,8 +31,40 @@ Rake::RDocTask.new do |rd|
|
|
30
31
|
rd.main = 'README.md'
|
31
32
|
rd.rdoc_files.include 'README.md', "lib/**/*\.rb", "exe/**/*"
|
32
33
|
|
33
|
-
rd.options << '--inline-source'
|
34
34
|
rd.options << '--line-numbers'
|
35
35
|
rd.options << '--all'
|
36
36
|
end
|
37
37
|
|
38
|
+
# desc 'generate and populate a test sqlite database'
|
39
|
+
# task :testdb do
|
40
|
+
# begin
|
41
|
+
# db = SQLite3::Database.new "testdb"
|
42
|
+
# db.execute "create table servers(id integer primary key autoincrement, hostname text not null, stype text not null, os_type text not null)"
|
43
|
+
# db.execute "INSERT INTO servers (hostname, stype, os_type) VALUES ( 'node1', 'dev', 'rhel6')"
|
44
|
+
# db.execute "INSERT INTO servers (hostname, stype, os_type) VALUES ( 'node2', 'dev', 'rhel6')"
|
45
|
+
# db.execute "INSERT INTO servers (hostname, stype, os_type) VALUES ( 'node3', 'dev', 'rhel6')"
|
46
|
+
# db.execute "INSERT INTO servers (hostname, stype, os_type) VALUES ( 'node4', 'dev', 'rhel7')"
|
47
|
+
# db.execute "INSERT INTO servers (hostname, stype, os_type) VALUES ( 'node5', 'dev', 'rhel6')"
|
48
|
+
# db.execute "INSERT INTO servers (hostname, stype, os_type) VALUES ( 'node6', 'web', 'rhel6')"
|
49
|
+
# db.execute "INSERT INTO servers (hostname, stype, os_type) VALUES ( 'node7', 'web', 'rhel6')"
|
50
|
+
# db.execute "INSERT INTO servers (hostname, stype, os_type) VALUES ( 'node8', 'web', 'rhel7')"
|
51
|
+
# db.execute "INSERT INTO servers (hostname, stype, os_type) VALUES ( 'node9', 'web', 'rhel7')"
|
52
|
+
# db.execute "INSERT INTO servers (hostname, stype, os_type) VALUES ( 'node10', 'admin', 'ubuntu-LTS')"
|
53
|
+
# db.execute "INSERT INTO servers (hostname, stype, os_type) VALUES ( 'node11', 'admin', 'ubuntu-LTS')"
|
54
|
+
# db.execute "INSERT INTO servers (hostname, stype, os_type) VALUES ( 'node12', 'admin', 'ubuntu')"
|
55
|
+
# db.execute "INSERT INTO servers (hostname, stype, os_type) VALUES ( 'node13', 'admin', 'ubuntu')"
|
56
|
+
# db.execute "INSERT INTO servers (hostname, stype, os_type) VALUES ( 'node14', 'compute', 'debiuan')"
|
57
|
+
# db.execute "INSERT INTO servers (hostname, stype, os_type) VALUES ( 'node15', 'compute', 'debiuan')"
|
58
|
+
# db.execute "INSERT INTO servers (hostname, stype, os_type) VALUES ( 'node16', 'compute', 'debiuan')"
|
59
|
+
# db.execute "INSERT INTO servers (hostname, stype, os_type) VALUES ( 'node17', 'compute', 'debiuan')"
|
60
|
+
# db.execute "INSERT INTO servers (hostname, stype, os_type) VALUES ( 'node18', 'db', 'slackware')"
|
61
|
+
# db.execute "INSERT INTO servers (hostname, stype, os_type) VALUES ( 'node19', 'db', 'slackware')"
|
62
|
+
# db.execute "INSERT INTO servers (hostname, stype, os_type) VALUES ( 'node20', 'db', 'slackware')"
|
63
|
+
|
64
|
+
# rescue SQLite3::Exception => e
|
65
|
+
# puts "Exception occurred"
|
66
|
+
# puts e
|
67
|
+
# ensure
|
68
|
+
# db.close if db
|
69
|
+
# end
|
70
|
+
# end
|
data/doc/rdocs/Rcmd.html
CHANGED
@@ -277,7 +277,7 @@ the thread count. This prevents spawning of unneeded threads.</p>
|
|
277
277
|
|
278
278
|
|
279
279
|
<div class="method-source-code" id="run_command-source">
|
280
|
-
<pre><span class="ruby-comment"># File lib/rcmd.rb, line
|
280
|
+
<pre><span class="ruby-comment"># File lib/rcmd.rb, line 80</span>
|
281
281
|
<span class="ruby-keyword">def</span> <span class="ruby-constant">Rcmd</span>.<span class="ruby-identifier">run_command</span>()
|
282
282
|
<span class="ruby-keyword">if</span> <span class="ruby-keyword">not</span> <span class="ruby-ivar">@command</span>
|
283
283
|
<span class="ruby-identifier">raise</span> <span class="ruby-constant">ArgumentError</span>.<span class="ruby-identifier">new</span>(<span class="ruby-string">"No command set for execution"</span>)
|
@@ -0,0 +1,489 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
|
3
|
+
<html>
|
4
|
+
<head>
|
5
|
+
<meta charset="UTF-8">
|
6
|
+
|
7
|
+
<title>class Rcmd::DB - RDoc Documentation</title>
|
8
|
+
|
9
|
+
<script type="text/javascript">
|
10
|
+
var rdoc_rel_prefix = "../";
|
11
|
+
var index_rel_prefix = "../";
|
12
|
+
</script>
|
13
|
+
|
14
|
+
<script src="../js/jquery.js"></script>
|
15
|
+
<script src="../js/darkfish.js"></script>
|
16
|
+
|
17
|
+
<link href="../css/fonts.css" rel="stylesheet">
|
18
|
+
<link href="../css/rdoc.css" rel="stylesheet">
|
19
|
+
|
20
|
+
|
21
|
+
|
22
|
+
<body id="top" role="document" class="class">
|
23
|
+
<nav role="navigation">
|
24
|
+
<div id="project-navigation">
|
25
|
+
<div id="home-section" role="region" title="Quick navigation" class="nav-section">
|
26
|
+
<h2>
|
27
|
+
<a href="../index.html" rel="home">Home</a>
|
28
|
+
</h2>
|
29
|
+
|
30
|
+
<div id="table-of-contents-navigation">
|
31
|
+
<a href="../table_of_contents.html#pages">Pages</a>
|
32
|
+
<a href="../table_of_contents.html#classes">Classes</a>
|
33
|
+
<a href="../table_of_contents.html#methods">Methods</a>
|
34
|
+
</div>
|
35
|
+
</div>
|
36
|
+
|
37
|
+
<div id="search-section" role="search" class="project-section initially-hidden">
|
38
|
+
<form action="#" method="get" accept-charset="utf-8">
|
39
|
+
<div id="search-field-wrapper">
|
40
|
+
<input id="search-field" role="combobox" aria-label="Search"
|
41
|
+
aria-autocomplete="list" aria-controls="search-results"
|
42
|
+
type="text" name="search" placeholder="Search" spellcheck="false"
|
43
|
+
title="Type to search, Up and Down to navigate, Enter to load">
|
44
|
+
</div>
|
45
|
+
|
46
|
+
<ul id="search-results" aria-label="Search Results"
|
47
|
+
aria-busy="false" aria-expanded="false"
|
48
|
+
aria-atomic="false" class="initially-hidden"></ul>
|
49
|
+
</form>
|
50
|
+
</div>
|
51
|
+
|
52
|
+
</div>
|
53
|
+
|
54
|
+
|
55
|
+
|
56
|
+
<div id="class-metadata">
|
57
|
+
|
58
|
+
<div id="parent-class-section" class="nav-section">
|
59
|
+
<h3>Parent</h3>
|
60
|
+
|
61
|
+
|
62
|
+
<p class="link">ActiveRecord::Base
|
63
|
+
|
64
|
+
</div>
|
65
|
+
|
66
|
+
|
67
|
+
|
68
|
+
<!-- Method Quickref -->
|
69
|
+
<div id="method-list-section" class="nav-section">
|
70
|
+
<h3>Methods</h3>
|
71
|
+
|
72
|
+
<ul class="link-list" role="directory">
|
73
|
+
|
74
|
+
<li ><a href="#method-c-create_config">::create_config</a>
|
75
|
+
|
76
|
+
<li ><a href="#method-c-db_connect">::db_connect</a>
|
77
|
+
|
78
|
+
<li ><a href="#method-c-load_config">::load_config</a>
|
79
|
+
|
80
|
+
<li ><a href="#method-c-override_config_file">::override_config_file</a>
|
81
|
+
|
82
|
+
<li ><a href="#method-c-query_by_hostname">::query_by_hostname</a>
|
83
|
+
|
84
|
+
<li ><a href="#method-c-query_by_os">::query_by_os</a>
|
85
|
+
|
86
|
+
<li ><a href="#method-c-query_by_type">::query_by_type</a>
|
87
|
+
|
88
|
+
</ul>
|
89
|
+
</div>
|
90
|
+
|
91
|
+
</div>
|
92
|
+
</nav>
|
93
|
+
|
94
|
+
<main role="main" aria-labelledby="class-Rcmd::DB">
|
95
|
+
<h1 id="class-Rcmd::DB" class="class">
|
96
|
+
class Rcmd::DB
|
97
|
+
</h1>
|
98
|
+
|
99
|
+
<section class="description">
|
100
|
+
|
101
|
+
<p>This class provides a middle layer for allowing a database to be queried
|
102
|
+
for hosts. This is accomplished by using ActiveRecord for the middle layer
|
103
|
+
and thus should support any database ActiveRecord supports. Currently
|
104
|
+
however, only the following are properly configured for backend use in this
|
105
|
+
class:</p>
|
106
|
+
|
107
|
+
<p>Backend Databases:</p>
|
108
|
+
<ul><li>
|
109
|
+
<p>sqlite3</p>
|
110
|
+
</li><li>
|
111
|
+
<p>mysql</p>
|
112
|
+
</li><li>
|
113
|
+
<p>frontbase</p>
|
114
|
+
</li><li>
|
115
|
+
<p>firebird</p>
|
116
|
+
</li><li>
|
117
|
+
<p>db2</p>
|
118
|
+
</li><li>
|
119
|
+
<p>openbase</p>
|
120
|
+
</li><li>
|
121
|
+
<p>oracle</p>
|
122
|
+
</li><li>
|
123
|
+
<p>postgresql</p>
|
124
|
+
</li></ul>
|
125
|
+
|
126
|
+
<p>This is achieved in the <a
|
127
|
+
href="DB.html#method-c-db_connect">::db_connect</a> method, which matches
|
128
|
+
the specifed adapter with the appropriate 'require' call by use of
|
129
|
+
a case statement. If you are needing/wanting to add another database to
|
130
|
+
this you will need to add your require code for the db backend there. As we
|
131
|
+
do this comparison, the various backends are not specified in the Gemspec
|
132
|
+
file as it is the responsibilty of the user to ensure the correct gems are
|
133
|
+
installed for the needed database.</p>
|
134
|
+
|
135
|
+
<p>This class relies on a yaml configuration file to be present and as such
|
136
|
+
the 'DB.create_config' method is provided to create an example
|
137
|
+
configuration which can be then edited. The options in the config file
|
138
|
+
are:</p>
|
139
|
+
|
140
|
+
</section>
|
141
|
+
|
142
|
+
|
143
|
+
|
144
|
+
|
145
|
+
<section id="5Buntitled-5D" class="documentation-section">
|
146
|
+
|
147
|
+
|
148
|
+
|
149
|
+
|
150
|
+
|
151
|
+
|
152
|
+
|
153
|
+
|
154
|
+
|
155
|
+
<section id="public-class-5Buntitled-5D-method-details" class="method-section">
|
156
|
+
<header>
|
157
|
+
<h3>Public Class Methods</h3>
|
158
|
+
</header>
|
159
|
+
|
160
|
+
|
161
|
+
<div id="method-c-create_config" class="method-detail ">
|
162
|
+
|
163
|
+
<div class="method-heading">
|
164
|
+
<span class="method-name">create_config</span><span
|
165
|
+
class="method-args">()</span>
|
166
|
+
|
167
|
+
<span class="method-click-advice">click to toggle source</span>
|
168
|
+
|
169
|
+
</div>
|
170
|
+
|
171
|
+
|
172
|
+
<div class="method-description">
|
173
|
+
|
174
|
+
<p>Create a base config file</p>
|
175
|
+
|
176
|
+
|
177
|
+
|
178
|
+
|
179
|
+
<div class="method-source-code" id="create_config-source">
|
180
|
+
<pre><span class="ruby-comment"># File lib/rcmd/db.rb, line 84</span>
|
181
|
+
<span class="ruby-keyword">def</span> <span class="ruby-constant">DB</span>.<span class="ruby-identifier">create_config</span>
|
182
|
+
<span class="ruby-identifier">puts</span> <span class="ruby-node">"Function: #{@config_dir}"</span>
|
183
|
+
<span class="ruby-keyword">unless</span> <span class="ruby-constant">File</span>.<span class="ruby-identifier">directory?</span>(<span class="ruby-ivar">@config_dir</span>)
|
184
|
+
<span class="ruby-constant">FileUtils</span>.<span class="ruby-identifier">mkdir_p</span>(<span class="ruby-ivar">@config_dir</span>)
|
185
|
+
<span class="ruby-keyword">end</span>
|
186
|
+
|
187
|
+
<span class="ruby-identifier">conf</span> = [ <span class="ruby-value">:adapter</span> =<span class="ruby-operator">></span> <span class="ruby-string">"sqlite3"</span>, <span class="ruby-value">:host</span> =<span class="ruby-operator">></span> <span class="ruby-keyword">nil</span>, <span class="ruby-value">:database</span> =<span class="ruby-operator">></span> <span class="ruby-string">':memory:'</span>, <span class="ruby-value">:table</span> =<span class="ruby-operator">></span> <span class="ruby-string">'servers'</span>, <span class="ruby-value">:username</span> =<span class="ruby-operator">></span> <span class="ruby-keyword">nil</span>, <span class="ruby-value">:password</span> =<span class="ruby-operator">></span> <span class="ruby-keyword">nil</span>, <span class="ruby-value">:host_field</span> =<span class="ruby-operator">></span> <span class="ruby-string">'hostname'</span>, <span class="ruby-value">:type_field</span> =<span class="ruby-operator">></span> <span class="ruby-string">'server_type'</span>, <span class="ruby-value">:os_field</span> =<span class="ruby-operator">></span> <span class="ruby-string">'osversion'</span> ]
|
188
|
+
|
189
|
+
<span class="ruby-constant">File</span>.<span class="ruby-identifier">open</span>(<span class="ruby-ivar">@config_file</span>, <span class="ruby-string">'w'</span>) <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">f</span><span class="ruby-operator">|</span>
|
190
|
+
<span class="ruby-identifier">f</span>.<span class="ruby-identifier">write</span>(<span class="ruby-identifier">conf</span>.<span class="ruby-identifier">to_yaml</span>)
|
191
|
+
<span class="ruby-keyword">end</span>
|
192
|
+
<span class="ruby-keyword">end</span></pre>
|
193
|
+
</div>
|
194
|
+
|
195
|
+
</div>
|
196
|
+
|
197
|
+
|
198
|
+
|
199
|
+
|
200
|
+
</div>
|
201
|
+
|
202
|
+
|
203
|
+
<div id="method-c-db_connect" class="method-detail ">
|
204
|
+
|
205
|
+
<div class="method-heading">
|
206
|
+
<span class="method-name">db_connect</span><span
|
207
|
+
class="method-args">()</span>
|
208
|
+
|
209
|
+
<span class="method-click-advice">click to toggle source</span>
|
210
|
+
|
211
|
+
</div>
|
212
|
+
|
213
|
+
|
214
|
+
<div class="method-description">
|
215
|
+
|
216
|
+
<p>Method for establishing a connection to the database backend according to
|
217
|
+
the configuration file. This is also where we set the 'require'
|
218
|
+
the need gems to interact with the chosen <a href="DB.html">DB</a> adapter
|
219
|
+
and set the table_name variable of the class.</p>
|
220
|
+
|
221
|
+
|
222
|
+
|
223
|
+
|
224
|
+
<div class="method-source-code" id="db_connect-source">
|
225
|
+
<pre><span class="ruby-comment"># File lib/rcmd/db.rb, line 162</span>
|
226
|
+
<span class="ruby-keyword">def</span> <span class="ruby-constant">DB</span>.<span class="ruby-identifier">db_connect</span>
|
227
|
+
<span class="ruby-keyword">self</span>.<span class="ruby-identifier">load_config</span>
|
228
|
+
|
229
|
+
<span class="ruby-keyword">case</span> <span class="ruby-ivar">@conf</span>[<span class="ruby-value">:adapter</span>].<span class="ruby-identifier">downcase</span>
|
230
|
+
<span class="ruby-keyword">when</span> <span class="ruby-string">"sqlite3"</span>
|
231
|
+
<span class="ruby-identifier">require</span> <span class="ruby-string">"sqlite3"</span>
|
232
|
+
<span class="ruby-keyword">when</span> <span class="ruby-string">"mysql"</span>
|
233
|
+
<span class="ruby-identifier">require</span> <span class="ruby-string">"mysql"</span>
|
234
|
+
<span class="ruby-keyword">when</span> <span class="ruby-string">"frontbase"</span>
|
235
|
+
<span class="ruby-identifier">require</span> <span class="ruby-string">"ruby-frontbase"</span>
|
236
|
+
<span class="ruby-keyword">when</span> <span class="ruby-string">"firebird"</span>
|
237
|
+
<span class="ruby-identifier">require</span> <span class="ruby-string">"fireruby"</span>
|
238
|
+
<span class="ruby-keyword">when</span> <span class="ruby-string">"db2"</span>
|
239
|
+
<span class="ruby-identifier">require</span> <span class="ruby-string">"ruby-db2"</span>
|
240
|
+
<span class="ruby-keyword">when</span> <span class="ruby-string">"openbase"</span>
|
241
|
+
<span class="ruby-identifier">require</span> <span class="ruby-string">"openbase"</span>
|
242
|
+
<span class="ruby-keyword">when</span> <span class="ruby-string">"oracle"</span>
|
243
|
+
<span class="ruby-identifier">require</span> <span class="ruby-string">"ruby-oci8"</span>
|
244
|
+
<span class="ruby-keyword">when</span> <span class="ruby-string">"postgresql"</span>
|
245
|
+
<span class="ruby-identifier">require</span> <span class="ruby-string">"ruby-postgres"</span>
|
246
|
+
<span class="ruby-keyword">end</span>
|
247
|
+
|
248
|
+
<span class="ruby-keyword">if</span> <span class="ruby-ivar">@conf</span>[<span class="ruby-value">:adapter</span>].<span class="ruby-identifier">downcase</span> <span class="ruby-operator">==</span> <span class="ruby-string">"sqlite3"</span>
|
249
|
+
<span class="ruby-constant">ActiveRecord</span><span class="ruby-operator">::</span><span class="ruby-constant">Base</span>.<span class="ruby-identifier">establish_connection</span>(<span class="ruby-value">:adapter</span> =<span class="ruby-operator">></span> <span class="ruby-ivar">@conf</span>[<span class="ruby-value">:adapter</span>].<span class="ruby-identifier">downcase</span>,
|
250
|
+
<span class="ruby-value">:database</span> =<span class="ruby-operator">></span> <span class="ruby-ivar">@conf</span>[<span class="ruby-value">:database</span>])
|
251
|
+
<span class="ruby-keyword">else</span>
|
252
|
+
<span class="ruby-constant">ActiveRecord</span><span class="ruby-operator">::</span><span class="ruby-constant">Base</span>.<span class="ruby-identifier">establish_connection</span>(
|
253
|
+
<span class="ruby-value">:adapter</span> =<span class="ruby-operator">></span> <span class="ruby-ivar">@conf</span>[<span class="ruby-value">:adapter</span>].<span class="ruby-identifier">downcase</span>,
|
254
|
+
<span class="ruby-value">:host</span> =<span class="ruby-operator">></span> <span class="ruby-ivar">@conf</span>[<span class="ruby-value">:host</span>],
|
255
|
+
<span class="ruby-value">:username</span> =<span class="ruby-operator">></span> <span class="ruby-ivar">@conf</span>[<span class="ruby-value">:username</span>],
|
256
|
+
<span class="ruby-value">:password</span> =<span class="ruby-operator">></span> <span class="ruby-ivar">@conf</span>[<span class="ruby-value">:password</span>],
|
257
|
+
<span class="ruby-value">:database</span> =<span class="ruby-operator">></span> <span class="ruby-ivar">@conf</span>[<span class="ruby-value">:database</span>] )
|
258
|
+
<span class="ruby-keyword">end</span>
|
259
|
+
|
260
|
+
<span class="ruby-ivar">@table_name</span> = <span class="ruby-ivar">@conf</span>[<span class="ruby-value">:table</span>]
|
261
|
+
<span class="ruby-keyword">end</span></pre>
|
262
|
+
</div>
|
263
|
+
|
264
|
+
</div>
|
265
|
+
|
266
|
+
|
267
|
+
|
268
|
+
|
269
|
+
</div>
|
270
|
+
|
271
|
+
|
272
|
+
<div id="method-c-load_config" class="method-detail ">
|
273
|
+
|
274
|
+
<div class="method-heading">
|
275
|
+
<span class="method-name">load_config</span><span
|
276
|
+
class="method-args">()</span>
|
277
|
+
|
278
|
+
<span class="method-click-advice">click to toggle source</span>
|
279
|
+
|
280
|
+
</div>
|
281
|
+
|
282
|
+
|
283
|
+
<div class="method-description">
|
284
|
+
|
285
|
+
<p>Method called by <a href="DB.html#method-c-db_connect">::db_connect</a> to
|
286
|
+
load the yaml configuration file and perform some basic sanity checks and
|
287
|
+
disabling of os/type queries if those fields are not in the configuration</p>
|
288
|
+
|
289
|
+
|
290
|
+
|
291
|
+
|
292
|
+
<div class="method-source-code" id="load_config-source">
|
293
|
+
<pre><span class="ruby-comment"># File lib/rcmd/db.rb, line 121</span>
|
294
|
+
<span class="ruby-keyword">def</span> <span class="ruby-constant">DB</span>.<span class="ruby-identifier">load_config</span>
|
295
|
+
<span class="ruby-keyword">unless</span> <span class="ruby-constant">File</span>.<span class="ruby-identifier">file?</span>(<span class="ruby-ivar">@config_file</span>)
|
296
|
+
<span class="ruby-identifier">raise</span> <span class="ruby-constant">RuntimeError</span>, <span class="ruby-node">"No database configuration file found: #{@config_file}"</span>
|
297
|
+
<span class="ruby-keyword">end</span>
|
298
|
+
|
299
|
+
<span class="ruby-ivar">@conf</span> = <span class="ruby-constant">YAML</span>.<span class="ruby-identifier">load_file</span>(<span class="ruby-ivar">@config_file</span>)[<span class="ruby-value">0</span>]
|
300
|
+
|
301
|
+
<span class="ruby-keyword">unless</span> <span class="ruby-ivar">@conf</span>[<span class="ruby-value">:adapter</span>]
|
302
|
+
<span class="ruby-identifier">raise</span> <span class="ruby-constant">RuntimeError</span>, <span class="ruby-string">"No adapter specified for database backend"</span>
|
303
|
+
<span class="ruby-keyword">end</span>
|
304
|
+
|
305
|
+
<span class="ruby-keyword">unless</span> <span class="ruby-ivar">@conf</span>[<span class="ruby-value">:type_field</span>]
|
306
|
+
<span class="ruby-ivar">@db_type_queries</span> = <span class="ruby-keyword">false</span>
|
307
|
+
<span class="ruby-keyword">end</span>
|
308
|
+
|
309
|
+
<span class="ruby-keyword">unless</span> <span class="ruby-ivar">@conf</span>[<span class="ruby-value">:os_field</span>]
|
310
|
+
<span class="ruby-ivar">@db_os_queries</span> = <span class="ruby-keyword">false</span>
|
311
|
+
<span class="ruby-keyword">end</span>
|
312
|
+
|
313
|
+
<span class="ruby-keyword">unless</span> <span class="ruby-ivar">@conf</span>[<span class="ruby-value">:adapter</span>].<span class="ruby-identifier">downcase</span> <span class="ruby-operator">==</span> <span class="ruby-string">"sqlite3"</span>
|
314
|
+
<span class="ruby-keyword">if</span> <span class="ruby-ivar">@conf</span>[<span class="ruby-value">:host</span>].<span class="ruby-identifier">nil?</span>
|
315
|
+
<span class="ruby-identifier">raise</span> <span class="ruby-constant">RuntimeError</span>, <span class="ruby-string">"No database host server specified"</span>
|
316
|
+
<span class="ruby-keyword">end</span>
|
317
|
+
<span class="ruby-keyword">if</span> <span class="ruby-ivar">@conf</span>[<span class="ruby-value">:username</span>].<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span> <span class="ruby-ivar">@conf</span>[<span class="ruby-value">:password</span>].<span class="ruby-identifier">nil?</span>
|
318
|
+
<span class="ruby-identifier">raise</span> <span class="ruby-constant">RuntimeError</span>, <span class="ruby-string">"No DB credentials specified"</span>
|
319
|
+
<span class="ruby-keyword">end</span>
|
320
|
+
<span class="ruby-keyword">end</span>
|
321
|
+
|
322
|
+
<span class="ruby-keyword">if</span> <span class="ruby-ivar">@conf</span>[<span class="ruby-value">:database</span>].<span class="ruby-identifier">nil?</span>
|
323
|
+
<span class="ruby-identifier">raise</span> <span class="ruby-constant">RuntimeError</span>, <span class="ruby-string">"No database specified"</span>
|
324
|
+
<span class="ruby-keyword">end</span>
|
325
|
+
|
326
|
+
<span class="ruby-keyword">if</span> <span class="ruby-ivar">@conf</span>[<span class="ruby-value">:table</span>].<span class="ruby-identifier">nil?</span>
|
327
|
+
<span class="ruby-identifier">raise</span> <span class="ruby-constant">RuntimeError</span>, <span class="ruby-string">"Table not specified"</span>
|
328
|
+
<span class="ruby-keyword">end</span>
|
329
|
+
<span class="ruby-keyword">end</span></pre>
|
330
|
+
</div>
|
331
|
+
|
332
|
+
</div>
|
333
|
+
|
334
|
+
|
335
|
+
|
336
|
+
|
337
|
+
</div>
|
338
|
+
|
339
|
+
|
340
|
+
<div id="method-c-override_config_file" class="method-detail ">
|
341
|
+
|
342
|
+
<div class="method-heading">
|
343
|
+
<span class="method-name">override_config_file</span><span
|
344
|
+
class="method-args">(path)</span>
|
345
|
+
|
346
|
+
<span class="method-click-advice">click to toggle source</span>
|
347
|
+
|
348
|
+
</div>
|
349
|
+
|
350
|
+
|
351
|
+
<div class="method-description">
|
352
|
+
|
353
|
+
<p>Method for overiding the location and name of the default config file</p>
|
354
|
+
|
355
|
+
|
356
|
+
|
357
|
+
|
358
|
+
<div class="method-source-code" id="override_config_file-source">
|
359
|
+
<pre><span class="ruby-comment"># File lib/rcmd/db.rb, line 79</span>
|
360
|
+
<span class="ruby-keyword">def</span> <span class="ruby-constant">DB</span>.<span class="ruby-identifier">override_config_file</span>(<span class="ruby-identifier">path</span>)
|
361
|
+
<span class="ruby-ivar">@config_file</span> = <span class="ruby-identifier">path</span>
|
362
|
+
<span class="ruby-keyword">end</span></pre>
|
363
|
+
</div>
|
364
|
+
|
365
|
+
</div>
|
366
|
+
|
367
|
+
|
368
|
+
|
369
|
+
|
370
|
+
</div>
|
371
|
+
|
372
|
+
|
373
|
+
<div id="method-c-query_by_hostname" class="method-detail ">
|
374
|
+
|
375
|
+
<div class="method-heading">
|
376
|
+
<span class="method-name">query_by_hostname</span><span
|
377
|
+
class="method-args">(term)</span>
|
378
|
+
|
379
|
+
<span class="method-click-advice">click to toggle source</span>
|
380
|
+
|
381
|
+
</div>
|
382
|
+
|
383
|
+
|
384
|
+
<div class="method-description">
|
385
|
+
|
386
|
+
<p>Performs “LIKE” queries on the host_field (hostname)</p>
|
387
|
+
|
388
|
+
|
389
|
+
|
390
|
+
|
391
|
+
<div class="method-source-code" id="query_by_hostname-source">
|
392
|
+
<pre><span class="ruby-comment"># File lib/rcmd/db.rb, line 98</span>
|
393
|
+
<span class="ruby-keyword">def</span> <span class="ruby-constant">DB</span>.<span class="ruby-identifier">query_by_hostname</span>(<span class="ruby-identifier">term</span>)
|
394
|
+
<span class="ruby-keyword">return</span> <span class="ruby-identifier">where</span>(<span class="ruby-node">"#{@conf[:host_field]} LIKE ?"</span>, <span class="ruby-identifier">term</span> ).<span class="ruby-identifier">map</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">r</span><span class="ruby-operator">|</span> <span class="ruby-identifier">r</span>[<span class="ruby-ivar">@conf</span>[<span class="ruby-value">:host_field</span>]] }
|
395
|
+
<span class="ruby-keyword">end</span></pre>
|
396
|
+
</div>
|
397
|
+
|
398
|
+
</div>
|
399
|
+
|
400
|
+
|
401
|
+
|
402
|
+
|
403
|
+
</div>
|
404
|
+
|
405
|
+
|
406
|
+
<div id="method-c-query_by_os" class="method-detail ">
|
407
|
+
|
408
|
+
<div class="method-heading">
|
409
|
+
<span class="method-name">query_by_os</span><span
|
410
|
+
class="method-args">(term)</span>
|
411
|
+
|
412
|
+
<span class="method-click-advice">click to toggle source</span>
|
413
|
+
|
414
|
+
</div>
|
415
|
+
|
416
|
+
|
417
|
+
<div class="method-description">
|
418
|
+
|
419
|
+
<p>Perform direct 'Hash style' queries on the os_field</p>
|
420
|
+
|
421
|
+
|
422
|
+
|
423
|
+
|
424
|
+
<div class="method-source-code" id="query_by_os-source">
|
425
|
+
<pre><span class="ruby-comment"># File lib/rcmd/db.rb, line 103</span>
|
426
|
+
<span class="ruby-keyword">def</span> <span class="ruby-constant">DB</span>.<span class="ruby-identifier">query_by_os</span>(<span class="ruby-identifier">term</span>)
|
427
|
+
<span class="ruby-keyword">unless</span> <span class="ruby-ivar">@db_os_queries</span>
|
428
|
+
<span class="ruby-identifier">raise</span> <span class="ruby-constant">RuntimeError</span>, <span class="ruby-string">"OS based queries not supported in the configuration supplied"</span>
|
429
|
+
<span class="ruby-keyword">end</span>
|
430
|
+
<span class="ruby-keyword">return</span> <span class="ruby-identifier">where</span>(<span class="ruby-ivar">@conf</span>[<span class="ruby-value">:os_field</span>] =<span class="ruby-operator">></span> <span class="ruby-identifier">term</span>).<span class="ruby-identifier">map</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">r</span><span class="ruby-operator">|</span> <span class="ruby-identifier">r</span>[<span class="ruby-ivar">@conf</span>[<span class="ruby-value">:host_field</span>]] }
|
431
|
+
<span class="ruby-keyword">end</span></pre>
|
432
|
+
</div>
|
433
|
+
|
434
|
+
</div>
|
435
|
+
|
436
|
+
|
437
|
+
|
438
|
+
|
439
|
+
</div>
|
440
|
+
|
441
|
+
|
442
|
+
<div id="method-c-query_by_type" class="method-detail ">
|
443
|
+
|
444
|
+
<div class="method-heading">
|
445
|
+
<span class="method-name">query_by_type</span><span
|
446
|
+
class="method-args">(term)</span>
|
447
|
+
|
448
|
+
<span class="method-click-advice">click to toggle source</span>
|
449
|
+
|
450
|
+
</div>
|
451
|
+
|
452
|
+
|
453
|
+
<div class="method-description">
|
454
|
+
|
455
|
+
<p>Perform direct 'Hash style' queries on the type_field</p>
|
456
|
+
|
457
|
+
|
458
|
+
|
459
|
+
|
460
|
+
<div class="method-source-code" id="query_by_type-source">
|
461
|
+
<pre><span class="ruby-comment"># File lib/rcmd/db.rb, line 111</span>
|
462
|
+
<span class="ruby-keyword">def</span> <span class="ruby-constant">DB</span>.<span class="ruby-identifier">query_by_type</span>(<span class="ruby-identifier">term</span>)
|
463
|
+
<span class="ruby-keyword">unless</span> <span class="ruby-ivar">@db_type_queries</span>
|
464
|
+
<span class="ruby-identifier">raise</span> <span class="ruby-constant">RuntimeError</span>, <span class="ruby-string">"Type queries not supported in the configuration supplied"</span>
|
465
|
+
<span class="ruby-keyword">end</span>
|
466
|
+
<span class="ruby-keyword">return</span> <span class="ruby-identifier">where</span>(<span class="ruby-ivar">@conf</span>[<span class="ruby-value">:type_field</span>] =<span class="ruby-operator">></span> <span class="ruby-identifier">term</span>).<span class="ruby-identifier">map</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">r</span><span class="ruby-operator">|</span> <span class="ruby-identifier">r</span>[<span class="ruby-ivar">@conf</span>[<span class="ruby-value">:host_field</span>]] }
|
467
|
+
<span class="ruby-keyword">end</span></pre>
|
468
|
+
</div>
|
469
|
+
|
470
|
+
</div>
|
471
|
+
|
472
|
+
|
473
|
+
|
474
|
+
|
475
|
+
</div>
|
476
|
+
|
477
|
+
|
478
|
+
</section>
|
479
|
+
|
480
|
+
</section>
|
481
|
+
</main>
|
482
|
+
|
483
|
+
|
484
|
+
<footer id="validator-badges" role="contentinfo">
|
485
|
+
<p><a href="http://validator.w3.org/check/referer">Validate</a>
|
486
|
+
<p>Generated by <a href="https://rdoc.github.io/rdoc">RDoc</a> 5.0.0.
|
487
|
+
<p>Based on <a href="http://deveiate.org/projects/Darkfish-RDoc/">Darkfish</a> by <a href="http://deveiate.org">Michael Granger</a>.
|
488
|
+
</footer>
|
489
|
+
|
data/doc/rdocs/created.rid
CHANGED
@@ -1,5 +1,6 @@
|
|
1
|
-
|
1
|
+
Fri, 06 Oct 2017 20:18:52 +0000
|
2
2
|
README.md Wed, 04 Oct 2017 13:14:39 +0000
|
3
|
-
lib/rcmd.rb
|
4
|
-
lib/rcmd/
|
5
|
-
|
3
|
+
lib/rcmd.rb Fri, 06 Oct 2017 19:05:45 +0000
|
4
|
+
lib/rcmd/db.rb Fri, 06 Oct 2017 20:07:48 +0000
|
5
|
+
lib/rcmd/version.rb Fri, 06 Oct 2017 19:04:22 +0000
|
6
|
+
exe/rcmd Fri, 06 Oct 2017 19:36:13 +0000
|
data/doc/rdocs/index.html
CHANGED
Binary file
|
@@ -1 +1 @@
|
|
1
|
-
var search_data = {"index":{"searchIndex":["optionparser","rcmd","run_command()","readme"],"longSearchIndex":["optionparser","rcmd","rcmd::run_command()",""],"info":[["OptionParser","","OptionParser.html","",""],["Rcmd","","Rcmd.html","","<p>This module is for parellel remote (SSH) execution of a single command\nstring on Multiple hosts. The …\n"],["run_command","Rcmd","Rcmd.html#method-c-run_command","()","<p>Main method for this module which should be called after the correct\nvariables have been set.\n<p>We iterate …\n"],["README","","README_md.html","","<p>Description\n<p>rcmd (remote command) is a command line utility written in Ruby for\nexecuting the same command …\n"]]}}
|
1
|
+
var search_data = {"index":{"searchIndex":["optionparser","rcmd","db","create_config()","db_connect()","load_config()","override_config_file()","query_by_hostname()","query_by_os()","query_by_type()","run_command()","readme"],"longSearchIndex":["optionparser","rcmd","rcmd::db","rcmd::db::create_config()","rcmd::db::db_connect()","rcmd::db::load_config()","rcmd::db::override_config_file()","rcmd::db::query_by_hostname()","rcmd::db::query_by_os()","rcmd::db::query_by_type()","rcmd::run_command()",""],"info":[["OptionParser","","OptionParser.html","",""],["Rcmd","","Rcmd.html","","<p>This module is for parellel remote (SSH) execution of a single command\nstring on Multiple hosts. The …\n"],["Rcmd::DB","","Rcmd/DB.html","","<p>This class provides a middle layer for allowing a database to be queried\nfor hosts. This is accomplished …\n"],["create_config","Rcmd::DB","Rcmd/DB.html#method-c-create_config","()","<p>Create a base config file\n"],["db_connect","Rcmd::DB","Rcmd/DB.html#method-c-db_connect","()","<p>Method for establishing a connection to the database backend according to\nthe configuration file. This …\n"],["load_config","Rcmd::DB","Rcmd/DB.html#method-c-load_config","()","<p>Method called by DB.db_connect to load the yaml configuration file and\nperform some basic sanity checks …\n"],["override_config_file","Rcmd::DB","Rcmd/DB.html#method-c-override_config_file","(path)","<p>Method for overiding the location and name of the default config file\n"],["query_by_hostname","Rcmd::DB","Rcmd/DB.html#method-c-query_by_hostname","(term)","<p>Performs “LIKE” queries on the host_field (hostname)\n"],["query_by_os","Rcmd::DB","Rcmd/DB.html#method-c-query_by_os","(term)","<p>Perform direct 'Hash style' queries on the os_field\n"],["query_by_type","Rcmd::DB","Rcmd/DB.html#method-c-query_by_type","(term)","<p>Perform direct 'Hash style' queries on the type_field\n"],["run_command","Rcmd","Rcmd.html#method-c-run_command","()","<p>Main method for this module which should be called after the correct\nvariables have been set.\n<p>We iterate …\n"],["README","","README_md.html","","<p>Description\n<p>rcmd (remote command) is a command line utility written in Ruby for\nexecuting the same command …\n"]]}}
|
Binary file
|
data/doc/rdocs/js/searcher.js.gz
CHANGED
Binary file
|
@@ -51,11 +51,49 @@
|
|
51
51
|
<li class="module">
|
52
52
|
<a href="Rcmd.html">Rcmd</a>
|
53
53
|
</li>
|
54
|
+
<li class="class">
|
55
|
+
<a href="Rcmd/DB.html">Rcmd::DB</a>
|
56
|
+
</li>
|
54
57
|
</ul>
|
55
58
|
|
56
59
|
<h2 id="methods">Methods</h2>
|
57
60
|
<ul>
|
58
61
|
|
62
|
+
<li class="method">
|
63
|
+
<a href="Rcmd/DB.html#method-c-create_config">::create_config</a>
|
64
|
+
—
|
65
|
+
<span class="container">Rcmd::DB</span>
|
66
|
+
|
67
|
+
<li class="method">
|
68
|
+
<a href="Rcmd/DB.html#method-c-db_connect">::db_connect</a>
|
69
|
+
—
|
70
|
+
<span class="container">Rcmd::DB</span>
|
71
|
+
|
72
|
+
<li class="method">
|
73
|
+
<a href="Rcmd/DB.html#method-c-load_config">::load_config</a>
|
74
|
+
—
|
75
|
+
<span class="container">Rcmd::DB</span>
|
76
|
+
|
77
|
+
<li class="method">
|
78
|
+
<a href="Rcmd/DB.html#method-c-override_config_file">::override_config_file</a>
|
79
|
+
—
|
80
|
+
<span class="container">Rcmd::DB</span>
|
81
|
+
|
82
|
+
<li class="method">
|
83
|
+
<a href="Rcmd/DB.html#method-c-query_by_hostname">::query_by_hostname</a>
|
84
|
+
—
|
85
|
+
<span class="container">Rcmd::DB</span>
|
86
|
+
|
87
|
+
<li class="method">
|
88
|
+
<a href="Rcmd/DB.html#method-c-query_by_os">::query_by_os</a>
|
89
|
+
—
|
90
|
+
<span class="container">Rcmd::DB</span>
|
91
|
+
|
92
|
+
<li class="method">
|
93
|
+
<a href="Rcmd/DB.html#method-c-query_by_type">::query_by_type</a>
|
94
|
+
—
|
95
|
+
<span class="container">Rcmd::DB</span>
|
96
|
+
|
59
97
|
<li class="method">
|
60
98
|
<a href="Rcmd.html#method-c-run_command">::run_command</a>
|
61
99
|
—
|
data/exe/rcmd
CHANGED
@@ -4,6 +4,7 @@ require 'optparse'
|
|
4
4
|
require 'regexp-examples'
|
5
5
|
require 'rcmd'
|
6
6
|
|
7
|
+
=begin rdoc
|
7
8
|
# This program is for executing a command on multiple nodes at the same time and accepts the following arguments.
|
8
9
|
#
|
9
10
|
# * -u, --username | Username for the connections
|
@@ -13,9 +14,9 @@ require 'rcmd'
|
|
13
14
|
# * -q, --quiet | Boolean flag for suppressing stdout of executed commands
|
14
15
|
# * -v, --version | Print version string and exit
|
15
16
|
|
16
|
-
|
17
|
+
=end
|
17
18
|
# Set default options
|
18
|
-
options = { :threads => 4, :nodes => nil, :environment => nil, :
|
19
|
+
options = { :threads => 4, :nodes => nil, :environment => nil, :user => 'root', :password => false, :command => nil, :quiet => false, :version => false, :debug => false, :expression => nil, :database => false, :config => false, :type => nil, :host => nil, :os => nil }
|
19
20
|
|
20
21
|
host_list = []
|
21
22
|
|
@@ -24,18 +25,24 @@ opts = OptionParser.new #:nodoc:
|
|
24
25
|
|
25
26
|
opts.on('-u username', '--username username', String, "Username for SSH connections") { |v| options[:user] = v }
|
26
27
|
opts.on('-n nodes', '--nodes x,y,z', Array, "Comma seperated list of nodes. use '-' for a space seperated list piped from another command") { |v| options[:nodes] = v }
|
27
|
-
opts.on('-r regex', '--regexp regex',
|
28
|
-
# opts.on('-d database', '--database', "Use hosts from database (~/.dbconf.yaml)") { |v| options[:database] = v}
|
28
|
+
opts.on('-r regex', '--regexp regex', Regexp, "Use Regex to build host list (ruby regexp)") { |v| options[:expression] = v}
|
29
29
|
opts.on('-t threads', '--threads threads', Integer, "Number of threads to run") { |v| options[:threads] = v }
|
30
30
|
opts.on('-c <command>', '--command <command>', String, "Quoted string containing the command to be run") { |v| options[:command] = v }
|
31
31
|
opts.on('-q', '--quiet', "Suppress stdout of commands. stderr will still be displayed") { |v| options[:quiet] = v }
|
32
32
|
opts.on('-v', '--version', "Print what version of the command is in use") { |v| options[:version] = v}
|
33
33
|
opts.on('-D', '--debug', "Print debug information") { |v| options[:debug] = v }
|
34
|
+
opts.separator " "
|
35
|
+
opts.separator "Database Options"
|
36
|
+
opts.on('-C', '--create-config', "Create template dbconfig file in ~/.rcmd") { |v| options[:config] = v}
|
37
|
+
opts.on('-T server-type ', '--type server-type', "Database query on server type") { |v| options[:type] = v}
|
38
|
+
opts.on('-H hostname-pattern', '--host hostname-pattern', "Database query on hostname (sql like query)") { |v| options[:host] = v}
|
39
|
+
opts.on('-O operating-system', '--os operating-system", "Database query on Operating System string') { |v| options[:os] = v}
|
34
40
|
|
35
41
|
# Process options
|
36
42
|
begin
|
37
43
|
opts.parse!(ARGV)
|
38
|
-
|
44
|
+
# need a smarter way then this ugly hack
|
45
|
+
unless options[:version] or options[:expression] or options[:config] or options[:type] or options[:host] or options[:os]
|
39
46
|
mandatory = [:command, :nodes]
|
40
47
|
missing = mandatory.select{ |param| options[param].nil? }
|
41
48
|
raise OptionParser::MissingArgument, missing.join(', ') unless missing.empty?
|
@@ -48,8 +55,45 @@ end
|
|
48
55
|
|
49
56
|
# Process Regex for node list generation
|
50
57
|
if options[:expression]
|
51
|
-
unless options[:database]
|
52
58
|
options[:nodes] = Regexp.new(options[:expression]).examples(max_group_results: 500)
|
59
|
+
end
|
60
|
+
|
61
|
+
if options[:config]
|
62
|
+
Rcmd::DB.create_config
|
63
|
+
puts "Configuration file created. Please adjust accordingly"
|
64
|
+
exit
|
65
|
+
end
|
66
|
+
|
67
|
+
# Process database options
|
68
|
+
if options[:host]
|
69
|
+
begin
|
70
|
+
Rcmd::DB.db_connect
|
71
|
+
options[:nodes] = Rcmd::DB.query_by_hostname(options[:host])
|
72
|
+
rescue e
|
73
|
+
puts "Error:: #{e}"
|
74
|
+
exit
|
75
|
+
ensure
|
76
|
+
Rcmd::DB.connection.disconnect!
|
77
|
+
end
|
78
|
+
elsif options[:type]
|
79
|
+
begin
|
80
|
+
Rcmd::DB.db_connect
|
81
|
+
options[:nodes] = Rcmd::DB.query_by_type(options[:type])
|
82
|
+
rescue e
|
83
|
+
puts "Error:: #{e}"
|
84
|
+
exit
|
85
|
+
ensure
|
86
|
+
Rcmd::DB.connection.disconnect!
|
87
|
+
end
|
88
|
+
elsif options[:os]
|
89
|
+
begin
|
90
|
+
Rcmd::DB.db_connect
|
91
|
+
options[:nodes] = Rcmd::DB.query_by_os(options[:os])
|
92
|
+
rescue e
|
93
|
+
puts "Error:: #{e}"
|
94
|
+
exit
|
95
|
+
ensure
|
96
|
+
Rcmd::DB.connection.disconnect!
|
53
97
|
end
|
54
98
|
end
|
55
99
|
|
data/lib/rcmd.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require "rcmd/version"
|
2
|
+
require "rcmd/db"
|
2
3
|
require 'net/ssh'
|
3
4
|
require 'thread'
|
4
5
|
|
@@ -16,7 +17,9 @@ module Rcmd
|
|
16
17
|
STDERR.sync = true
|
17
18
|
@queue = Queue.new
|
18
19
|
|
19
|
-
|
20
|
+
=begin rdoc
|
21
|
+
Self class for setting up accessors
|
22
|
+
=end
|
20
23
|
class << self
|
21
24
|
|
22
25
|
# Prefered/requested number of threads to be used. (Manditory)
|
@@ -124,4 +127,3 @@ module Rcmd
|
|
124
127
|
end
|
125
128
|
end
|
126
129
|
end
|
127
|
-
|
data/lib/rcmd/db.rb
ADDED
@@ -0,0 +1,199 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
require "active_record"
|
3
|
+
require "fileutils"
|
4
|
+
require "yaml"
|
5
|
+
|
6
|
+
module Rcmd #:notnew:
|
7
|
+
|
8
|
+
=begin rdoc
|
9
|
+
|
10
|
+
This class provides a middle layer for allowing a database to be
|
11
|
+
queried for hosts. This is accomplished by using ActiveRecord for the
|
12
|
+
middle layer and thus should support any database ActiveRecord
|
13
|
+
supports. Currently however, only the following are properly
|
14
|
+
configured for backend use in this class:
|
15
|
+
|
16
|
+
Backend Databases:
|
17
|
+
- sqlite3
|
18
|
+
- mysql
|
19
|
+
- frontbase
|
20
|
+
- firebird
|
21
|
+
- db2
|
22
|
+
- openbase
|
23
|
+
- oracle
|
24
|
+
- postgresql
|
25
|
+
|
26
|
+
This is achieved in the DB.db_connect method, which matches the
|
27
|
+
specifed adapter with the appropriate 'require' call by use of a case
|
28
|
+
statement. If you are needing/wanting to add another database to this
|
29
|
+
you will need to add your require code for the db backend there. As we
|
30
|
+
do this comparison, the various backends are not specified in the
|
31
|
+
Gemspec file as it is the responsibilty of the user to ensure the
|
32
|
+
correct gems are installed for the needed database.
|
33
|
+
|
34
|
+
This class relies on a yaml configuration file to be present and as
|
35
|
+
such the 'DB.create_config' method is provided to create an example
|
36
|
+
configuration which can be then edited. The options in the config
|
37
|
+
file are:
|
38
|
+
|
39
|
+
---
|
40
|
+
- :adapter: sqlite3 # The adapter to be used by ActiveRecord
|
41
|
+
:host: servername # The dns/IP/server name that hosts the database
|
42
|
+
:database: ":memory:" # The database/sid name to use for the connection
|
43
|
+
:table: servers # What table should be queried in the database
|
44
|
+
:username: username # The username for the DB connection
|
45
|
+
:password: passowrd # The password for the connection
|
46
|
+
:host_field: hostname # What column/field is used for the server/host name
|
47
|
+
:type_field: stype # What column/field is used for server type (if any)
|
48
|
+
:os_field: os_type # What column/field is used for os version (if any)
|
49
|
+
|
50
|
+
The host_field is required in order to perform any queries. If the
|
51
|
+
os_field or type_fields are not specified then those respective
|
52
|
+
queries will not run and instead raise a RuntimeError; stating that
|
53
|
+
the configuration prevents those options.
|
54
|
+
|
55
|
+
The remaining fields are dependent on the database backend to
|
56
|
+
determine if they are needed or not.
|
57
|
+
|
58
|
+
Quick usage:
|
59
|
+
|
60
|
+
Rcmd::DB.db_connect
|
61
|
+
Rcmd::DB.query_by_{hostname|type|os}(query term)
|
62
|
+
|
63
|
+
Raw queries directly on the Rcmd::DB object can be used, to include
|
64
|
+
adding records, but this is outside the scope of the command and thus
|
65
|
+
not implemented.
|
66
|
+
|
67
|
+
=end rdoc
|
68
|
+
|
69
|
+
class DB < ActiveRecord::Base
|
70
|
+
|
71
|
+
@config_dir = File.expand_path("~/.rcmd")
|
72
|
+
@config_file = "#{@config_dir}/dbconfig.yml"
|
73
|
+
@conf = nil
|
74
|
+
@db_type_queries = true
|
75
|
+
@db_os_queries = true
|
76
|
+
|
77
|
+
# Method for overiding the location and name of the default config
|
78
|
+
# file
|
79
|
+
def DB.override_config_file(path)
|
80
|
+
@config_file = path
|
81
|
+
end
|
82
|
+
|
83
|
+
# Create a base config file
|
84
|
+
def DB.create_config
|
85
|
+
puts "Function: #{@config_dir}"
|
86
|
+
unless File.directory?(@config_dir)
|
87
|
+
FileUtils.mkdir_p(@config_dir)
|
88
|
+
end
|
89
|
+
|
90
|
+
conf = [ :adapter => "sqlite3", :host => nil, :database => ':memory:', :table => 'servers', :username => nil, :password => nil, :host_field => 'hostname', :type_field => 'server_type', :os_field => 'osversion' ]
|
91
|
+
|
92
|
+
File.open(@config_file, 'w') do |f|
|
93
|
+
f.write(conf.to_yaml)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
# Performs "LIKE" queries on the host_field (hostname)
|
98
|
+
def DB.query_by_hostname(term)
|
99
|
+
return where("#{@conf[:host_field]} LIKE ?", term ).map { |r| r[@conf[:host_field]] }
|
100
|
+
end
|
101
|
+
|
102
|
+
# Perform direct 'Hash style' queries on the os_field
|
103
|
+
def DB.query_by_os(term)
|
104
|
+
unless @db_os_queries
|
105
|
+
raise RuntimeError, "OS based queries not supported in the configuration supplied"
|
106
|
+
end
|
107
|
+
return where(@conf[:os_field] => term).map { |r| r[@conf[:host_field]] }
|
108
|
+
end
|
109
|
+
|
110
|
+
# Perform direct 'Hash style' queries on the type_field
|
111
|
+
def DB.query_by_type(term)
|
112
|
+
unless @db_type_queries
|
113
|
+
raise RuntimeError, "Type queries not supported in the configuration supplied"
|
114
|
+
end
|
115
|
+
return where(@conf[:type_field] => term).map { |r| r[@conf[:host_field]] }
|
116
|
+
end
|
117
|
+
|
118
|
+
# Method called by DB.db_connect to load the yaml configuration
|
119
|
+
# file and perform some basic sanity checks and disabling of
|
120
|
+
# os/type queries if those fields are not in the configuration
|
121
|
+
def DB.load_config
|
122
|
+
unless File.file?(@config_file)
|
123
|
+
raise RuntimeError, "No database configuration file found: #{@config_file}"
|
124
|
+
end
|
125
|
+
|
126
|
+
@conf = YAML.load_file(@config_file)[0]
|
127
|
+
|
128
|
+
unless @conf[:adapter]
|
129
|
+
raise RuntimeError, "No adapter specified for database backend"
|
130
|
+
end
|
131
|
+
|
132
|
+
unless @conf[:type_field]
|
133
|
+
@db_type_queries = false
|
134
|
+
end
|
135
|
+
|
136
|
+
unless @conf[:os_field]
|
137
|
+
@db_os_queries = false
|
138
|
+
end
|
139
|
+
|
140
|
+
unless @conf[:adapter].downcase == "sqlite3"
|
141
|
+
if @conf[:host].nil?
|
142
|
+
raise RuntimeError, "No database host server specified"
|
143
|
+
end
|
144
|
+
if @conf[:username].nil? || @conf[:password].nil?
|
145
|
+
raise RuntimeError, "No DB credentials specified"
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
if @conf[:database].nil?
|
150
|
+
raise RuntimeError, "No database specified"
|
151
|
+
end
|
152
|
+
|
153
|
+
if @conf[:table].nil?
|
154
|
+
raise RuntimeError, "Table not specified"
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
# Method for establishing a connection to the database backend
|
159
|
+
# according to the configuration file. This is also where we set
|
160
|
+
# the 'require' the need gems to interact with the chosen DB
|
161
|
+
# adapter and set the table_name variable of the class.
|
162
|
+
def DB.db_connect
|
163
|
+
self.load_config
|
164
|
+
|
165
|
+
case @conf[:adapter].downcase
|
166
|
+
when "sqlite3"
|
167
|
+
require "sqlite3"
|
168
|
+
when "mysql"
|
169
|
+
require "mysql"
|
170
|
+
when "frontbase"
|
171
|
+
require "ruby-frontbase"
|
172
|
+
when "firebird"
|
173
|
+
require "fireruby"
|
174
|
+
when "db2"
|
175
|
+
require "ruby-db2"
|
176
|
+
when "openbase"
|
177
|
+
require "openbase"
|
178
|
+
when "oracle"
|
179
|
+
require "ruby-oci8"
|
180
|
+
when "postgresql"
|
181
|
+
require "ruby-postgres"
|
182
|
+
end
|
183
|
+
|
184
|
+
if @conf[:adapter].downcase == "sqlite3"
|
185
|
+
ActiveRecord::Base.establish_connection(:adapter => @conf[:adapter].downcase,
|
186
|
+
:database => @conf[:database])
|
187
|
+
else
|
188
|
+
ActiveRecord::Base.establish_connection(
|
189
|
+
:adapter => @conf[:adapter].downcase,
|
190
|
+
:host => @conf[:host],
|
191
|
+
:username => @conf[:username],
|
192
|
+
:password => @conf[:password],
|
193
|
+
:database => @conf[:database] )
|
194
|
+
end
|
195
|
+
|
196
|
+
@table_name = @conf[:table]
|
197
|
+
end
|
198
|
+
end
|
199
|
+
end
|
data/lib/rcmd/version.rb
CHANGED
data/rcmd.gemspec
CHANGED
@@ -3,6 +3,7 @@ lib = File.expand_path("../lib", __FILE__)
|
|
3
3
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
4
|
require "rcmd/version"
|
5
5
|
|
6
|
+
|
6
7
|
Gem::Specification.new do |spec|
|
7
8
|
spec.name = "rcmd"
|
8
9
|
spec.version = Rcmd::VERSION
|
@@ -35,12 +36,9 @@ Gem::Specification.new do |spec|
|
|
35
36
|
spec.add_runtime_dependency('io-console')
|
36
37
|
spec.add_runtime_dependency('thread')
|
37
38
|
spec.add_runtime_dependency('tty-prompt')
|
39
|
+
spec.add_runtime_dependency('activerecord')
|
38
40
|
spec.add_runtime_dependency('regexp-examples')
|
39
41
|
spec.add_development_dependency('rspec', '~> 3.0', '>= 2.0.0')
|
40
|
-
# spec.add_development_dependency('activerecord', '~>4.0.0')
|
41
|
-
# spec.add_development_dependency('sqlite3')
|
42
|
-
# spec.add_development_dependency('nokogiri', '~>1.6.0')
|
43
|
-
# spec.add_development_dependency('rails', '~>4.0.0')
|
44
42
|
spec.add_development_dependency "bundler", "~> 1.15"
|
45
43
|
spec.add_development_dependency "rake", "~> 10.0"
|
46
44
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rcmd
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Rose
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-10-
|
11
|
+
date: 2017-10-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: net-ssh
|
@@ -66,6 +66,20 @@ dependencies:
|
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: activerecord
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
84
|
name: regexp-examples
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -151,6 +165,7 @@ files:
|
|
151
165
|
- doc/rdocs/OptionParser.html
|
152
166
|
- doc/rdocs/README_md.html
|
153
167
|
- doc/rdocs/Rcmd.html
|
168
|
+
- doc/rdocs/Rcmd/DB.html
|
154
169
|
- doc/rdocs/created.rid
|
155
170
|
- doc/rdocs/css/fonts.css
|
156
171
|
- doc/rdocs/css/rdoc.css
|
@@ -198,6 +213,7 @@ files:
|
|
198
213
|
- doc/rdocs/table_of_contents.html
|
199
214
|
- exe/rcmd
|
200
215
|
- lib/rcmd.rb
|
216
|
+
- lib/rcmd/db.rb
|
201
217
|
- lib/rcmd/version.rb
|
202
218
|
- rcmd.gemspec
|
203
219
|
homepage: http://www.gitlab.com/daibhidh/rcmd
|