runssh 0.1.1 → 0.2.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.
- data/.autotest +12 -0
- data/.gitignore +9 -0
- data/.rspec +1 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +42 -0
- data/README.rdoc +28 -9
- data/Rakefile +5 -33
- data/autotest/discover.rb +1 -0
- data/bin/runssh +2 -0
- data/lib/runsshlib/cli.rb +79 -32
- data/lib/runsshlib/config_file.rb +61 -13
- data/lib/runsshlib/ssh_backend.rb +15 -10
- data/lib/runsshlib/ssh_host_def.rb +49 -0
- data/lib/runsshlib/version.rb +27 -0
- data/lib/runsshlib.rb +7 -8
- data/runssh.gemspec +37 -0
- data/spec/fixtures/runssh.yml +24 -19
- data/spec/fixtures/runssh_v_none.yml +19 -0
- data/spec/runsshlib/cli_spec.rb +126 -62
- data/spec/runsshlib/config_file_spec.rb +151 -38
- data/spec/runsshlib/ssh_backend_spec.rb +37 -35
- data/spec/runsshlib/ssh_host_def_spec.rb +91 -0
- data/spec/spec_helper.rb +5 -0
- metadata +103 -20
@@ -16,52 +16,87 @@
|
|
16
16
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
17
17
|
#
|
18
18
|
|
19
|
-
require 'lib/runsshlib'
|
20
|
-
require 'tmpdir'
|
21
19
|
require 'spec_helper'
|
20
|
+
require 'runsshlib'
|
21
|
+
require 'tmpdir'
|
22
|
+
require 'yaml'
|
22
23
|
|
23
24
|
describe "RunSSH Configuration class" do
|
24
25
|
|
25
|
-
def read_config
|
26
|
-
File.open(
|
26
|
+
def read_config from_file=@temp_file
|
27
|
+
File.open(from_file) { |io| Marshal.load(io) }
|
27
28
|
end
|
28
29
|
|
29
30
|
def initial_data
|
30
31
|
@c = RunSSHLib::ConfigFile.new(@temp_file)
|
31
|
-
|
32
|
-
|
32
|
+
host = {:host_name => 'www.example.com', :login => "me"}
|
33
|
+
@c.add_host_def([:one, :two, :three], :www, RunSSHLib::SshHostDef.new(host))
|
33
34
|
end
|
34
35
|
|
35
36
|
before(:all) do
|
36
|
-
|
37
|
+
cleanup_tmp_file # make sure there are no leftovers
|
38
|
+
@temp_file = TMP_FILE
|
37
39
|
@temp_file_bak = @temp_file + '.bak'
|
38
|
-
@h1 = RunSSHLib::
|
39
|
-
@h2 = RunSSHLib::
|
40
|
+
@h1 = RunSSHLib::SshHostDef.new('a.b.c')
|
41
|
+
@h2 = RunSSHLib::SshHostDef.new(:host_name => 'b.b.c',
|
42
|
+
:login => 'meme')
|
40
43
|
@tmp_yml = File.join(Dir.tmpdir, 'tempyml')
|
41
44
|
end
|
42
45
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
46
|
+
describe 'when initializing' do
|
47
|
+
it "should save a new empty configuration if none exists" do
|
48
|
+
RunSSHLib::ConfigFile.new(@temp_file)
|
49
|
+
read_config.should == {'VERSION' => RunSSHLib::ConfigFile::Version}
|
50
|
+
end
|
47
51
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
52
|
+
it "should create a backup while saving" do
|
53
|
+
c = RunSSHLib::ConfigFile.new(@temp_file)
|
54
|
+
c.send(:save)
|
55
|
+
# the 2 files should match
|
56
|
+
File.read(@temp_file).should == File.read(@temp_file_bak)
|
57
|
+
end
|
54
58
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
59
|
+
it "should overwrite existing backup if one already exists" do
|
60
|
+
# create a new file and a copy of it
|
61
|
+
c = RunSSHLib::ConfigFile.new(@temp_file)
|
62
|
+
c.send(:save)
|
63
|
+
# sanity
|
64
|
+
File.read(@temp_file).should == File.read(@temp_file_bak)
|
65
|
+
b = RunSSHLib::ConfigFile.new(@temp_file)
|
66
|
+
b.add_host_def([:one, :two, :three], :www, @h1)
|
67
|
+
File.read(@temp_file).should_not == File.read(@temp_file_bak)
|
68
|
+
end
|
64
69
|
|
70
|
+
it "should raise OlderConfigVersionError if missing config version" do
|
71
|
+
# create an empty file to represent a config file without a version
|
72
|
+
dump_config Hash.new
|
73
|
+
expect {
|
74
|
+
RunSSHLib::ConfigFile.new(@temp_file)
|
75
|
+
}.to raise_error(RunSSHLib::OlderConfigVersionError, 'none')
|
76
|
+
end
|
77
|
+
|
78
|
+
it "should accept older/no config version of old_version=true" do
|
79
|
+
dump_config Hash.new
|
80
|
+
RunSSHLib::ConfigFile.new(TMP_FILE, true).should be_instance_of(RunSSHLib::ConfigFile)
|
81
|
+
end
|
82
|
+
|
83
|
+
it "should raise ConfigError if version is higher then supported" do
|
84
|
+
hsh = Hash.new
|
85
|
+
hsh['VERSION'] = 1.1
|
86
|
+
dump_config hsh
|
87
|
+
expect do
|
88
|
+
RunSSHLib::ConfigFile.new(@temp_file)
|
89
|
+
end.to raise_error(RunSSHLib::ConfigError, /newer version of runssh!/)
|
90
|
+
# even if old_version=true
|
91
|
+
expect do
|
92
|
+
RunSSHLib::ConfigFile.new(@temp_file, true)
|
93
|
+
end.to raise_error(RunSSHLib::ConfigError, /newer version of runssh!/)
|
94
|
+
end
|
95
|
+
|
96
|
+
it "should create new config files with the correct version" do
|
97
|
+
cf = RunSSHLib::ConfigFile.new(@temp_file)
|
98
|
+
read_config['VERSION'].should eql(RunSSHLib::ConfigFile::Version)
|
99
|
+
end
|
65
100
|
end
|
66
101
|
|
67
102
|
describe "when adding host" do
|
@@ -95,8 +130,8 @@ describe "RunSSH Configuration class" do
|
|
95
130
|
c.add_host_def([:one, :two], :h1, @h1)
|
96
131
|
c.add_host_def([:three, :four], :h2, @h2)
|
97
132
|
d = RunSSHLib::ConfigFile.new(@temp_file)
|
98
|
-
d.get_host([:one, :two, :h1]).should
|
99
|
-
d.get_host([:three, :four, :h2]).should
|
133
|
+
d.get_host([:one, :two, :h1]).should eql(@h1)
|
134
|
+
d.get_host([:three, :four, :h2]).should eql(@h2)
|
100
135
|
end
|
101
136
|
|
102
137
|
it "should correctly merge paths with common path" do
|
@@ -249,15 +284,93 @@ describe "RunSSH Configuration class" do
|
|
249
284
|
@c.list_groups([:one, :two]).should include(:three, :four)
|
250
285
|
@c.list_groups([:one, :two, :three]).should include(:host, :www)
|
251
286
|
end
|
287
|
+
|
288
|
+
it "should not return the VERSION as a group" do
|
289
|
+
@c.list_groups([]).should_not include('VERSION')
|
290
|
+
end
|
252
291
|
end
|
253
292
|
|
254
|
-
|
255
|
-
yml
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
293
|
+
describe "when importing" do
|
294
|
+
let(:yml) { File.join(File.dirname(__FILE__), '../fixtures', 'runssh.yml') }
|
295
|
+
|
296
|
+
it "should not accept config from different config version" do
|
297
|
+
y = YAML.load_file(yml)
|
298
|
+
y['VERSION'] = 2.0
|
299
|
+
File.open(@tmp_yml, 'w') { |out| YAML.dump(y, out) }
|
300
|
+
expect do
|
301
|
+
c = RunSSHLib::ConfigFile.new(@temp_file)
|
302
|
+
c.import(@tmp_yml)
|
303
|
+
end.to raise_error(RunSSHLib::ConfigError, /different version.*2.0/)
|
304
|
+
end
|
305
|
+
|
306
|
+
it "should correctly export and import YAML files" do
|
307
|
+
c = RunSSHLib::ConfigFile.new(@temp_file)
|
308
|
+
c.import(yml)
|
309
|
+
c.export(@tmp_yml)
|
310
|
+
YAML.load_file(@tmp_yml).should == YAML.load_file(yml)
|
311
|
+
end
|
312
|
+
end
|
313
|
+
|
314
|
+
describe "when updating configuration version" do
|
315
|
+
let(:config_v_none) do
|
316
|
+
YAML.load_file(File.join(File.dirname(__FILE__), '..',
|
317
|
+
'fixtures', 'runssh_v_none.yml'))
|
318
|
+
end
|
319
|
+
|
320
|
+
it "'config_none_to_10' should correctly convert all old HostDef to SshHostDef" do
|
321
|
+
c = RunSSHLib::ConfigFile.new(TMP_FILE, true)
|
322
|
+
result = c.send(:config_none_to_10, config_v_none)
|
323
|
+
result[:cust1][:dc1][:host2].should be_instance_of(RunSSHLib::SshHostDef)
|
324
|
+
result[:cust1][:dc1][:host1].should be_instance_of(RunSSHLib::SshHostDef)
|
325
|
+
result[:cust1][:dc2][:host1].should be_instance_of(RunSSHLib::SshHostDef)
|
326
|
+
end
|
327
|
+
|
328
|
+
it "'update_config' should call config_none_to_10 with right parameters" do
|
329
|
+
dump_config(config_v_none)
|
330
|
+
c = RunSSHLib::ConfigFile.new(TMP_FILE, true)
|
331
|
+
c.should_receive(:config_none_to_10).with(config_v_none).and_return(Hash.new)
|
332
|
+
c.update_config
|
333
|
+
end
|
334
|
+
|
335
|
+
it "'update_config' should create backup with appropriate name" do
|
336
|
+
bf = TMP_FILE + '.none'
|
337
|
+
dump_config(config_v_none)
|
338
|
+
c = RunSSHLib::ConfigFile.new(TMP_FILE, true)
|
339
|
+
c.update_config
|
340
|
+
read_config(bf).should eql(config_v_none)
|
341
|
+
end
|
342
|
+
|
343
|
+
it "'update_config' should return the backup file for notifying the user" do
|
344
|
+
dump_config(config_v_none)
|
345
|
+
c = RunSSHLib::ConfigFile.new(TMP_FILE, true)
|
346
|
+
c.update_config.should eql(TMP_FILE + '.none')
|
347
|
+
end
|
348
|
+
|
349
|
+
it "'update_config' should return nil if there was no need for backup" do
|
350
|
+
hsh = {'VERSION' => RunSSHLib::ConfigFile::Version}
|
351
|
+
dump_config(hsh)
|
352
|
+
c = RunSSHLib::ConfigFile.new(TMP_FILE, true)
|
353
|
+
c.update_config.should be_nil
|
354
|
+
end
|
355
|
+
|
356
|
+
it "should correctly save the new configuration" do
|
357
|
+
dump_config(config_v_none)
|
358
|
+
c = RunSSHLib::ConfigFile.new(TMP_FILE, true)
|
359
|
+
c.update_config
|
360
|
+
new_config = RunSSHLib::ConfigFile.new(TMP_FILE)
|
361
|
+
cc = new_config.instance_variable_get(:@config)
|
362
|
+
cc['VERSION'].should eql(RunSSHLib::ConfigFile::Version)
|
363
|
+
cc[:cust1][:dc1][:host2].should be_instance_of(RunSSHLib::SshHostDef)
|
364
|
+
cc[:cust1][:dc1][:host1].should be_instance_of(RunSSHLib::SshHostDef)
|
365
|
+
cc[:cust1][:dc2][:host1].should be_instance_of(RunSSHLib::SshHostDef)
|
366
|
+
end
|
367
|
+
|
368
|
+
after(:each) do
|
369
|
+
bf = TMP_FILE + '.none'
|
370
|
+
if File.exists? bf
|
371
|
+
File.delete(bf)
|
372
|
+
end
|
373
|
+
end
|
261
374
|
end
|
262
375
|
|
263
376
|
after(:each) do
|
@@ -272,4 +385,4 @@ describe "RunSSH Configuration class" do
|
|
272
385
|
end
|
273
386
|
end
|
274
387
|
|
275
|
-
end
|
388
|
+
end
|
@@ -16,53 +16,55 @@
|
|
16
16
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
17
17
|
#
|
18
18
|
|
19
|
-
require 'lib/runsshlib'
|
20
19
|
require 'spec_helper'
|
20
|
+
require 'runsshlib'
|
21
21
|
|
22
|
-
describe
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
22
|
+
describe RunSSHLib::SshBackend do
|
23
|
+
context "shell" do
|
24
|
+
let(:test_data) do
|
25
|
+
{:host_name => "a",
|
26
|
+
:login => "user",
|
27
|
+
:remote_cmd => "uptime"}
|
27
28
|
end
|
28
29
|
|
29
|
-
it "should
|
30
|
-
|
31
|
-
|
32
|
-
|
30
|
+
it "should handle null user correctly" do
|
31
|
+
data = {:host_name => "a"}
|
32
|
+
RunSSHLib::SshBackend.should_receive(:exec).
|
33
|
+
with(/^ssh\s+#{data[:host_name]}$/).
|
34
|
+
and_return(nil)
|
35
|
+
RunSSHLib::SshBackend.shell(data)
|
33
36
|
end
|
34
37
|
|
35
|
-
it "should
|
36
|
-
|
37
|
-
|
38
|
-
|
38
|
+
it "should handle user correctly" do
|
39
|
+
data = {
|
40
|
+
:host_name => "a",
|
41
|
+
:login => "user"
|
42
|
+
}
|
43
|
+
RunSSHLib::SshBackend.should_receive(:exec).
|
44
|
+
with(/^ssh\s+-l\s+#{data[:login]}\s+#{data[:host_name]}$/).
|
45
|
+
and_return(nil)
|
46
|
+
RunSSHLib::SshBackend.shell(data)
|
39
47
|
end
|
40
|
-
end
|
41
48
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
end
|
47
|
-
|
48
|
-
it "should handle null user correctly" do
|
49
|
-
ssh = RunSSHLib::SshBackend.new(@hd1, {})
|
50
|
-
ssh.should_receive(:exec).with(/^ssh\s+a.example.com$/).and_return(nil)
|
51
|
-
ssh.shell
|
49
|
+
it "should raise error if no :host_name in definition" do
|
50
|
+
expect do
|
51
|
+
RunSSHLib::SshBackend.shell({:login => 'me'})
|
52
|
+
end.to raise_error(RuntimeError, /no hostname/i)
|
52
53
|
end
|
53
54
|
|
54
|
-
it "should handle
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
55
|
+
it "should handle correctly remote commands" do
|
56
|
+
RunSSHLib::SshBackend.should_receive(:exec).
|
57
|
+
with(/^ssh\s+-l\s+#{test_data[:login]}\s+#{test_data[:host_name]}\s+--\s+"uptime"$/).
|
58
|
+
and_return(nil)
|
59
|
+
RunSSHLib::SshBackend.shell(test_data)
|
59
60
|
end
|
60
61
|
|
61
|
-
it "should
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
62
|
+
it "should ignore empty remote commands" do
|
63
|
+
data = test_data.merge(:remote_cmd => "")
|
64
|
+
RunSSHLib::SshBackend.should_receive(:exec).
|
65
|
+
with(/^ssh\s+-l\s+#{data[:login]}\s+#{data[:host_name]}$/).
|
66
|
+
and_return(nil)
|
67
|
+
RunSSHLib::SshBackend.shell(data)
|
66
68
|
end
|
67
69
|
end
|
68
70
|
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (C) 2010 Haim Ashkenazi
|
3
|
+
#
|
4
|
+
# This program is free software; you can redistribute it and/or
|
5
|
+
# modify it under the terms of the GNU General Public License
|
6
|
+
# as published by the Free Software Foundation; either version 2
|
7
|
+
# of the License, or (at your option) any later version.
|
8
|
+
#
|
9
|
+
# This program is distributed in the hope that it will be useful,
|
10
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
11
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
12
|
+
# GNU General Public License for more details.
|
13
|
+
#
|
14
|
+
# You should have received a copy of the GNU General Public License
|
15
|
+
# along with this program; if not, write to the Free Software
|
16
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
17
|
+
#
|
18
|
+
require 'spec_helper'
|
19
|
+
require 'runsshlib'
|
20
|
+
|
21
|
+
describe 'SshHostDef' do
|
22
|
+
context 'when initialized' do
|
23
|
+
let(:data) { {:host_name => 'myname'} }
|
24
|
+
|
25
|
+
it "should raise ArgumentError if not initialized with host_name" do
|
26
|
+
expect {
|
27
|
+
RunSSHLib::SshHostDef.new({:login => 'haim'})
|
28
|
+
}.to raise_error(ArgumentError, /Missing hostname/)
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should initialize correctly if supplied a hostname as string" do
|
32
|
+
shd = RunSSHLib::SshHostDef.new('myname')
|
33
|
+
shd.instance_variable_get(:@definition).should eql(data)
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should initialize correctly if supplied with a hash with :host_name" do
|
37
|
+
shd = RunSSHLib::SshHostDef.new(data)
|
38
|
+
shd.instance_variable_get(:@definition).should eql(data)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
context 'when testing for equality' do
|
43
|
+
let(:definition) do
|
44
|
+
{ :host_name => 'host', :login => "login" }
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should not equal nil" do
|
48
|
+
RunSSHLib::SshHostDef.new(definition).should_not == nil
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should not equal any object" do
|
52
|
+
class MyTest
|
53
|
+
attr_reader :definition
|
54
|
+
def initialize definition
|
55
|
+
@definition = definition
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
RunSSHLib::SshHostDef.new(definition).should_not == MyTest.new(definition)
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should return true for == if @definition is equal" do
|
63
|
+
h1 = RunSSHLib::SshHostDef.new(definition)
|
64
|
+
h2 = RunSSHLib::SshHostDef.new('hostname')
|
65
|
+
RunSSHLib::SshHostDef.new(definition).should == h1
|
66
|
+
RunSSHLib::SshHostDef.new('hostname').should == h2
|
67
|
+
end
|
68
|
+
|
69
|
+
it "should return true for eql? if @definition is equal" do
|
70
|
+
h1 = RunSSHLib::SshHostDef.new(definition)
|
71
|
+
h2 = RunSSHLib::SshHostDef.new('hostname')
|
72
|
+
RunSSHLib::SshHostDef.new(definition).should eql(h1)
|
73
|
+
RunSSHLib::SshHostDef.new('hostname').should eql(h2)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
context "to_print" do
|
78
|
+
it "should run correctly without user" do
|
79
|
+
h = RunSSHLib::SshHostDef.new('myhostname')
|
80
|
+
p h.to_print
|
81
|
+
h.to_print.should match(/^.*host:.*myhostname\n.*login:.*current user$/)
|
82
|
+
end
|
83
|
+
|
84
|
+
it "should run correctly with user" do
|
85
|
+
h = RunSSHLib::SshHostDef.new({
|
86
|
+
:host_name => 'myhostname', :login => 'me'
|
87
|
+
})
|
88
|
+
h.to_print.should match(/^.*host:.*myhostname\n.*login:.*me$/)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -17,6 +17,7 @@
|
|
17
17
|
#
|
18
18
|
require 'rspec'
|
19
19
|
require 'tmpdir'
|
20
|
+
$:.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
|
20
21
|
|
21
22
|
# got the idea from:
|
22
23
|
# http://stackoverflow.com/questions/1480537/how-can-i-validate-exits-and-aborts-in-rspec
|
@@ -83,3 +84,7 @@ def import_fixtures
|
|
83
84
|
c = RunSSHLib::ConfigFile.new(TMP_FILE)
|
84
85
|
c.import(yml)
|
85
86
|
end
|
87
|
+
|
88
|
+
def dump_config hsh
|
89
|
+
File.open(TMP_FILE, 'w') { |out| Marshal.dump(hsh, out) }
|
90
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: runssh
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 23
|
5
|
+
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 2
|
9
|
+
- 0
|
10
|
+
version: 0.2.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Haim Ashkenazi
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date:
|
18
|
+
date: 2011-01-25 00:00:00 +02:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -35,7 +35,7 @@ dependencies:
|
|
35
35
|
type: :runtime
|
36
36
|
version_requirements: *id001
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
|
-
name:
|
38
|
+
name: highline
|
39
39
|
prerelease: false
|
40
40
|
requirement: &id002 !ruby/object:Gem::Requirement
|
41
41
|
none: false
|
@@ -44,16 +44,32 @@ dependencies:
|
|
44
44
|
- !ruby/object:Gem::Version
|
45
45
|
hash: 13
|
46
46
|
segments:
|
47
|
+
- 1
|
48
|
+
- 6
|
49
|
+
- 1
|
50
|
+
version: 1.6.1
|
51
|
+
type: :runtime
|
52
|
+
version_requirements: *id002
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
name: rspec
|
55
|
+
prerelease: false
|
56
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
hash: 11
|
62
|
+
segments:
|
47
63
|
- 2
|
48
|
-
- 0
|
49
64
|
- 1
|
50
|
-
|
65
|
+
- 0
|
66
|
+
version: 2.1.0
|
51
67
|
type: :development
|
52
|
-
version_requirements: *
|
68
|
+
version_requirements: *id003
|
53
69
|
- !ruby/object:Gem::Dependency
|
54
70
|
name: rcov
|
55
71
|
prerelease: false
|
56
|
-
requirement: &
|
72
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
57
73
|
none: false
|
58
74
|
requirements:
|
59
75
|
- - ~>
|
@@ -65,7 +81,55 @@ dependencies:
|
|
65
81
|
- 9
|
66
82
|
version: 0.9.9
|
67
83
|
type: :development
|
68
|
-
version_requirements: *
|
84
|
+
version_requirements: *id004
|
85
|
+
- !ruby/object:Gem::Dependency
|
86
|
+
name: autotest
|
87
|
+
prerelease: false
|
88
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ~>
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
hash: 39
|
94
|
+
segments:
|
95
|
+
- 4
|
96
|
+
- 4
|
97
|
+
- 4
|
98
|
+
version: 4.4.4
|
99
|
+
type: :development
|
100
|
+
version_requirements: *id005
|
101
|
+
- !ruby/object:Gem::Dependency
|
102
|
+
name: autotest-fsevent
|
103
|
+
prerelease: false
|
104
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ~>
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
hash: 17
|
110
|
+
segments:
|
111
|
+
- 0
|
112
|
+
- 2
|
113
|
+
- 3
|
114
|
+
version: 0.2.3
|
115
|
+
type: :development
|
116
|
+
version_requirements: *id006
|
117
|
+
- !ruby/object:Gem::Dependency
|
118
|
+
name: autotest-growl
|
119
|
+
prerelease: false
|
120
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ~>
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
hash: 27
|
126
|
+
segments:
|
127
|
+
- 0
|
128
|
+
- 2
|
129
|
+
- 6
|
130
|
+
version: 0.2.6
|
131
|
+
type: :development
|
132
|
+
version_requirements: *id007
|
69
133
|
description: |
|
70
134
|
Runssh is a command line utility to help bookmark many
|
71
135
|
ssh connections in heirarchial groups.
|
@@ -78,19 +142,30 @@ extensions: []
|
|
78
142
|
extra_rdoc_files:
|
79
143
|
- README.rdoc
|
80
144
|
files:
|
145
|
+
- .autotest
|
146
|
+
- .gitignore
|
147
|
+
- .rspec
|
148
|
+
- Gemfile
|
149
|
+
- Gemfile.lock
|
81
150
|
- README.rdoc
|
82
|
-
- gpl-2.0.txt
|
83
151
|
- Rakefile
|
152
|
+
- autotest/discover.rb
|
153
|
+
- bin/runssh
|
154
|
+
- bin/runssh_comp.sh
|
155
|
+
- gpl-2.0.txt
|
156
|
+
- lib/runsshlib.rb
|
84
157
|
- lib/runsshlib/cli.rb
|
85
158
|
- lib/runsshlib/config_file.rb
|
86
159
|
- lib/runsshlib/ssh_backend.rb
|
87
|
-
- lib/runsshlib.rb
|
88
|
-
-
|
89
|
-
-
|
160
|
+
- lib/runsshlib/ssh_host_def.rb
|
161
|
+
- lib/runsshlib/version.rb
|
162
|
+
- runssh.gemspec
|
90
163
|
- spec/fixtures/runssh.yml
|
164
|
+
- spec/fixtures/runssh_v_none.yml
|
91
165
|
- spec/runsshlib/cli_spec.rb
|
92
166
|
- spec/runsshlib/config_file_spec.rb
|
93
167
|
- spec/runsshlib/ssh_backend_spec.rb
|
168
|
+
- spec/runsshlib/ssh_host_def_spec.rb
|
94
169
|
- spec/spec_helper.rb
|
95
170
|
has_rdoc: true
|
96
171
|
homepage: http://github.com/babysnakes/runssh
|
@@ -100,12 +175,14 @@ post_install_message:
|
|
100
175
|
rdoc_options:
|
101
176
|
- --main
|
102
177
|
- README.rdoc
|
178
|
+
- -c
|
179
|
+
- UTF-8
|
103
180
|
require_paths:
|
104
181
|
- lib
|
105
182
|
required_ruby_version: !ruby/object:Gem::Requirement
|
106
183
|
none: false
|
107
184
|
requirements:
|
108
|
-
- -
|
185
|
+
- - ">="
|
109
186
|
- !ruby/object:Gem::Version
|
110
187
|
hash: 57
|
111
188
|
segments:
|
@@ -125,9 +202,15 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
125
202
|
requirements: []
|
126
203
|
|
127
204
|
rubyforge_project:
|
128
|
-
rubygems_version: 1.
|
205
|
+
rubygems_version: 1.4.2
|
129
206
|
signing_key:
|
130
207
|
specification_version: 3
|
131
208
|
summary: CLI utility to bookmark multiple ssh connections with hierarchy.
|
132
|
-
test_files:
|
133
|
-
|
209
|
+
test_files:
|
210
|
+
- spec/fixtures/runssh.yml
|
211
|
+
- spec/fixtures/runssh_v_none.yml
|
212
|
+
- spec/runsshlib/cli_spec.rb
|
213
|
+
- spec/runsshlib/config_file_spec.rb
|
214
|
+
- spec/runsshlib/ssh_backend_spec.rb
|
215
|
+
- spec/runsshlib/ssh_host_def_spec.rb
|
216
|
+
- spec/spec_helper.rb
|