rcmd 1.5.8 → 1.6.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/.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
|