sshkit 0.0.21 → 0.0.22
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/CHANGELOG.md +18 -1
- data/EXAMPLES.md +47 -1
- data/Gemfile +2 -1
- data/README.md +10 -5
- data/Vagrantfile +3 -2
- data/lib/sshkit/all.rb +2 -0
- data/lib/sshkit/backends/abstract.rb +29 -2
- data/lib/sshkit/backends/netssh.rb +12 -0
- data/lib/sshkit/formatters/dot.rb +3 -4
- data/lib/sshkit/formatters/pretty.rb +32 -26
- data/lib/sshkit/log_message.rb +13 -0
- data/lib/sshkit/version.rb +1 -1
- data/sshkit.gemspec +0 -1
- data/test/functional/backends/test_netssh.rb +39 -0
- data/test/unit/formatters/test_pretty.rb +51 -0
- metadata +57 -43
- checksums.yaml +0 -7
data/CHANGELOG.md
CHANGED
@@ -3,10 +3,27 @@
|
|
3
3
|
This file is written in reverse chronological order, newer releases will
|
4
4
|
appear at the top.
|
5
5
|
|
6
|
+
## 0.0.22
|
7
|
+
|
8
|
+
* Added naïve implementations of `upload!()` and `download!()` (syncoronous) to
|
9
|
+
the Net::SSH backend. See `EXAMPLES.md` for more extensive usage examples.
|
10
|
+
|
11
|
+
The `upload!()` method can take a filename, or an `IO`, this reflects the way
|
12
|
+
the underlying Net::SCP implementation works. The same is true of
|
13
|
+
`download!()`, when called with a single argument it captures the file's
|
14
|
+
contents, otherwise it downloads the file to the local disk.
|
15
|
+
|
16
|
+
on hosts do |host|
|
17
|
+
upload!(StringIO.new('some-data-here'), '~/.ssh/authorized_keys')
|
18
|
+
upload!('~/.ssh/id_rsa.pub', '~/.ssh/authorized_keys')
|
19
|
+
puts download!('/etc/monit/monitrc')
|
20
|
+
download!('/etc/monit/monitrc', '~/monitrc')
|
21
|
+
end
|
22
|
+
|
6
23
|
## 0.0.21
|
7
24
|
|
8
25
|
* Fixed an issue with default formatter
|
9
|
-
* Modified SSHKit.config.output_verbosity
|
26
|
+
* Modified `SSHKit.config.output_verbosity=` to accept different objects:
|
10
27
|
|
11
28
|
SSHKit.config.output_verbosity = Logger::INFO
|
12
29
|
SSHKit.config.output_verbosity = :info
|
data/EXAMPLES.md
CHANGED
@@ -31,6 +31,20 @@
|
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
34
|
+
## Print some arbitrary output with the logging methods
|
35
|
+
|
36
|
+
on hosts do |host|
|
37
|
+
f = '/some/file'
|
38
|
+
if test("[ -d #{f} ]")
|
39
|
+
execute :touch, f
|
40
|
+
else
|
41
|
+
info "#{f} already exists on #{host}!"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
The `debug()``, `info()`, `warn()`, `error()` and `fatal()` honor the current
|
46
|
+
log level of `SSHKit.config.output_verbosity`
|
47
|
+
|
34
48
|
## Run a command in a different directory as a different user
|
35
49
|
|
36
50
|
on hosts do |host|
|
@@ -50,8 +64,39 @@ This will output:
|
|
50
64
|
**Note:** This example is a bit misleading, as the `www-data` user doesn't
|
51
65
|
have a shell defined, one cannot switch to that user.
|
52
66
|
|
53
|
-
##
|
67
|
+
## Upload a file from disk
|
68
|
+
|
69
|
+
on hosts do |host|
|
70
|
+
upload! '/config/database.yml', '/opt/my_project/shared/databse.yml'
|
71
|
+
end
|
72
|
+
|
73
|
+
**Note:** The `upload!()` method doesn't honor the values of `in()`, `as()`
|
74
|
+
etc, this will be improved as the library matures, but we're not there yet.
|
54
75
|
|
76
|
+
## Upload a file from a stream
|
77
|
+
|
78
|
+
on hosts do |host|
|
79
|
+
file = File.open('/config/database.yml')
|
80
|
+
io = StringIO.new(....)
|
81
|
+
upload! file, '/opt/my_project/shared/databse.yml'
|
82
|
+
upload! io, '/opt/my_project/shared/io.io.io'
|
83
|
+
end
|
84
|
+
|
85
|
+
The IO streaming is useful for uploading something rather than "cat"ing it,
|
86
|
+
for example
|
87
|
+
|
88
|
+
on hosts do |host|
|
89
|
+
contents = StringIO.new('ALL ALL = (ALL) NOPASSWD: ALL')
|
90
|
+
upload! contents, '/etc/sudoers.d/yolo'
|
91
|
+
end
|
92
|
+
|
93
|
+
This spares one from having to figure out the correct escaping sequences for
|
94
|
+
something like "echo(:cat, '...?...', '> /etc/sudoers.d/yolo')".
|
95
|
+
|
96
|
+
**Note:** The `upload!()` method doesn't honor the values of `in()`, `as()`
|
97
|
+
etc, this will be improved as the library matures, but we're not there yet.
|
98
|
+
|
99
|
+
## Run a command with a different effective group ID
|
55
100
|
|
56
101
|
on hosts do |host|
|
57
102
|
as user: 'www-data', group: 'project-group' do
|
@@ -60,6 +105,7 @@ have a shell defined, one cannot switch to that user.
|
|
60
105
|
execute :ls, '-l'
|
61
106
|
end
|
62
107
|
end
|
108
|
+
end
|
63
109
|
|
64
110
|
One will see that the created file is owned by the user `www-data` and the
|
65
111
|
group `project-group`.
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -193,13 +193,13 @@ At present the `Logger::WARN`, `ERROR` and `FATAL` are not used.
|
|
193
193
|
* No environment handling (sshkit might not need to care)
|
194
194
|
* ~~No arbitrary `Host` properties (example storing `roles` on servers, or other
|
195
195
|
metadata that might be useful in the `on()` block)~~
|
196
|
-
* No log/warning facility (passing Log messages to the output would work)
|
196
|
+
* ~~No log/warning facility (passing Log messages to the output would work)
|
197
197
|
A log object could be made available globally which would emit a LogMessage
|
198
198
|
type object which would be recognised by the formatters that need to care
|
199
|
-
about them
|
200
|
-
* No verbosity control, commands should have a `Logger::LEVEL` on them,
|
199
|
+
about them.~~
|
200
|
+
* ~~No verbosity control, commands should have a `Logger::LEVEL` on them,
|
201
201
|
user-generated should be at a high level, the commands auto-generated from
|
202
|
-
the guards and checks from as() and within() should have a lower level
|
202
|
+
the guards and checks from as() and within() should have a lower level.~~
|
203
203
|
* ~~Decide if `execute()` (and friends) should raise on non-zero exit statuses or
|
204
204
|
not, perhaps a family of similarly named bang methods should be the ones to
|
205
205
|
raise. (Perhaps `test()` should be a way to `execute()` without raising, and
|
@@ -208,8 +208,13 @@ At present the `Logger::WARN`, `ERROR` and `FATAL` are not used.
|
|
208
208
|
have that method setter do the legwork of updating `SSHKit.config.output` to
|
209
209
|
be an instance of the correct formatter class wrapping the existing output
|
210
210
|
stream.~~
|
211
|
+
* No "trace" level debugging for internal stuff, the debug level should be
|
212
|
+
reserved for client-level debugging, with trace being (int -1) used
|
213
|
+
internally for logging about connection opening, closing, timing out, etc.
|
214
|
+
* No method for uploading or downloading files, or the same for saving/loading
|
215
|
+
a string to/from a remote file.
|
211
216
|
* No closing of connections, the abstract backend class should include a
|
212
|
-
cleanup method which is empty but can be overriden by
|
217
|
+
cleanup method which is empty but can be overriden by other implementations.
|
213
218
|
* No conncetion pooling, the `connection` method of the NetSSH backend could
|
214
219
|
easily be modified to look into some connection factory for it's objects,
|
215
220
|
saving half a second when running lots of `on()` blocks.
|
data/Vagrantfile
CHANGED
data/lib/sshkit/all.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
module SSHKit
|
2
|
+
|
2
3
|
module Backend
|
3
4
|
|
4
5
|
MethodUnavailableError = Class.new(SSHKit::StandardError)
|
@@ -17,6 +18,30 @@ module SSHKit
|
|
17
18
|
@block = block
|
18
19
|
end
|
19
20
|
|
21
|
+
def log(messages)
|
22
|
+
info(messages)
|
23
|
+
end
|
24
|
+
|
25
|
+
def fatal(messages)
|
26
|
+
output << LogMessage.new(Logger::FATAL, messages)
|
27
|
+
end
|
28
|
+
|
29
|
+
def error(messages)
|
30
|
+
output << LogMessage.new(Logger::ERROR, messages)
|
31
|
+
end
|
32
|
+
|
33
|
+
def warn(messages)
|
34
|
+
output << LogMessage.new(Logger::WARN, messages)
|
35
|
+
end
|
36
|
+
|
37
|
+
def info(messages)
|
38
|
+
output << LogMessage.new(Logger::INFO, messages)
|
39
|
+
end
|
40
|
+
|
41
|
+
def debug(messages)
|
42
|
+
output << LogMessage.new(Logger::DEBUG, messages)
|
43
|
+
end
|
44
|
+
|
20
45
|
def make(commands=[])
|
21
46
|
raise MethodUnavailableError
|
22
47
|
end
|
@@ -48,8 +73,8 @@ module SSHKit
|
|
48
73
|
then echo "Directory does not exist '#{File.join(@pwd)}'" 1>&2
|
49
74
|
false
|
50
75
|
fi
|
51
|
-
|
52
|
-
|
76
|
+
EOTEST
|
77
|
+
yield
|
53
78
|
ensure
|
54
79
|
@pwd.pop
|
55
80
|
end
|
@@ -95,5 +120,7 @@ module SSHKit
|
|
95
120
|
end
|
96
121
|
|
97
122
|
end
|
123
|
+
|
98
124
|
end
|
125
|
+
|
99
126
|
end
|
@@ -37,6 +37,18 @@ module SSHKit
|
|
37
37
|
_execute(*[*args, options]).stdout.strip
|
38
38
|
end
|
39
39
|
|
40
|
+
def upload!(local, remote, options = {})
|
41
|
+
ssh.scp.upload!(local, remote, options) do
|
42
|
+
warn "Progress"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def download!(remote, local=nil, options = {})
|
47
|
+
ssh.scp.download!(remote, local, options) do
|
48
|
+
warn "Progress"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
40
52
|
class << self
|
41
53
|
def configure
|
42
54
|
yield config
|
@@ -7,10 +7,9 @@ module SSHKit
|
|
7
7
|
class Dot < Abstract
|
8
8
|
|
9
9
|
def write(obj)
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
end
|
10
|
+
return unless obj === SSHKit::Command
|
11
|
+
if obj.finished?
|
12
|
+
original_output << (obj.failure? ? c.red('.') : c.green('.'))
|
14
13
|
end
|
15
14
|
end
|
16
15
|
alias :<< :write
|
@@ -7,42 +7,48 @@ module SSHKit
|
|
7
7
|
class Pretty < Abstract
|
8
8
|
|
9
9
|
def write(obj)
|
10
|
-
if obj.
|
11
|
-
|
12
|
-
|
10
|
+
return if obj.verbosity < SSHKit.config.output_verbosity
|
11
|
+
case obj
|
12
|
+
when SSHKit::Command then write_command(obj)
|
13
|
+
when SSHKit::LogMessage then write_log_message(obj)
|
14
|
+
else
|
15
|
+
original_output << c.black(c.on_yellow("Output formatter doesn't know how to handle #{obj.class}\n"))
|
16
|
+
end
|
17
|
+
end
|
18
|
+
alias :<< :write
|
13
19
|
|
14
|
-
|
15
|
-
original_output << level(obj.verbosity) + uuid(obj) + "Running #{c.yellow(c.bold(String(obj)))} on #{c.blue(obj.host.to_s)}\n"
|
16
|
-
if SSHKit.config.output_verbosity == Logger::DEBUG
|
17
|
-
original_output << level(Logger::DEBUG) + uuid(obj) + c.white("Command: #{c.blue(obj.to_command)}") + "\n"
|
18
|
-
end
|
19
|
-
end
|
20
|
+
private
|
20
21
|
|
22
|
+
def write_command(command)
|
23
|
+
unless command.started?
|
24
|
+
original_output << level(command.verbosity) + uuid(command) + "Running #{c.yellow(c.bold(String(command)))} on #{c.blue(command.host.to_s)}\n"
|
21
25
|
if SSHKit.config.output_verbosity == Logger::DEBUG
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
end
|
26
|
-
end
|
26
|
+
original_output << level(Logger::DEBUG) + uuid(command) + c.white("Command: #{c.blue(command.to_command)}") + "\n"
|
27
|
+
end
|
28
|
+
end
|
27
29
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
30
|
+
if SSHKit.config.output_verbosity == Logger::DEBUG
|
31
|
+
if command.complete? && !command.stdout.empty?
|
32
|
+
command.stdout.lines.each do |line|
|
33
|
+
original_output << level(Logger::DEBUG) + uuid(command) + c.green("\t" + line)
|
32
34
|
end
|
33
35
|
end
|
34
36
|
|
35
|
-
if
|
36
|
-
|
37
|
+
if command.complete? && !command.stderr.empty?
|
38
|
+
command.stderr.lines.each do |line|
|
39
|
+
original_output << level(Logger::DEBUG) + uuid(command) + c.red("\t" + line)
|
40
|
+
end
|
37
41
|
end
|
42
|
+
end
|
38
43
|
|
39
|
-
|
40
|
-
original_output <<
|
44
|
+
if command.finished?
|
45
|
+
original_output << level(command.verbosity) + uuid(command) + "Finished in #{sprintf('%5.3f seconds', command.runtime)} command #{c.bold { command.failure? ? c.red('failed') : c.green('successful') }}.\n"
|
41
46
|
end
|
42
47
|
end
|
43
|
-
alias :<< :write
|
44
48
|
|
45
|
-
|
49
|
+
def write_log_message(log_message)
|
50
|
+
original_output << level(log_message.verbosity) + log_message.to_s + "\n"
|
51
|
+
end
|
46
52
|
|
47
53
|
def c
|
48
54
|
@c ||= Term::ANSIColor
|
@@ -59,11 +65,11 @@ module SSHKit
|
|
59
65
|
end
|
60
66
|
|
61
67
|
def level_formatting(level_num)
|
62
|
-
%w{black blue yellow red red }[level_num]
|
68
|
+
%w{ black blue yellow red red }[level_num]
|
63
69
|
end
|
64
70
|
|
65
71
|
def level_names(level_num)
|
66
|
-
%w{DEBUG INFO WARN ERROR FATAL}[level_num]
|
72
|
+
%w{ DEBUG INFO WARN ERROR FATAL }[level_num]
|
67
73
|
end
|
68
74
|
|
69
75
|
end
|
data/lib/sshkit/version.rb
CHANGED
data/sshkit.gemspec
CHANGED
@@ -20,7 +20,6 @@ Gem::Specification.new do |gem|
|
|
20
20
|
gem.add_dependency('term-ansicolor')
|
21
21
|
|
22
22
|
gem.add_development_dependency('minitest', ['>= 2.11.3', '< 2.12.0'])
|
23
|
-
gem.add_development_dependency('autotest')
|
24
23
|
gem.add_development_dependency('rake')
|
25
24
|
gem.add_development_dependency('turn')
|
26
25
|
gem.add_development_dependency('unindent')
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'helper'
|
2
|
+
require 'securerandom'
|
2
3
|
require 'benchmark'
|
3
4
|
|
4
5
|
module SSHKit
|
@@ -92,6 +93,44 @@ module SSHKit
|
|
92
93
|
assert_match "sleep 5", process_list
|
93
94
|
end
|
94
95
|
|
96
|
+
def test_upload_file
|
97
|
+
file_contents = ""
|
98
|
+
file_name = File.join("/tmp", SecureRandom.uuid)
|
99
|
+
File.open file_name, 'w+' do |f|
|
100
|
+
f.write 'example_file'
|
101
|
+
end
|
102
|
+
Netssh.new(a_host) do
|
103
|
+
upload!(file_name, file_name)
|
104
|
+
file_contents = capture(:cat, file_name)
|
105
|
+
end.run
|
106
|
+
assert_equal "example_file", file_contents
|
107
|
+
end
|
108
|
+
|
109
|
+
def test_upload_string_io
|
110
|
+
file_contents = ""
|
111
|
+
Netssh.new(a_host) do |host|
|
112
|
+
file_name = File.join("/tmp", SecureRandom.uuid)
|
113
|
+
upload!(StringIO.new('example_io'), file_name)
|
114
|
+
file_contents = download!(file_name)
|
115
|
+
end.run
|
116
|
+
assert_equal "example_io", file_contents
|
117
|
+
end
|
118
|
+
|
119
|
+
def test_upload_large_file
|
120
|
+
size = 25
|
121
|
+
fills = SecureRandom.random_bytes(1024*1024)
|
122
|
+
file_name = "/tmp/file-#{size}.txt"
|
123
|
+
File.open(file_name, 'w') do |f|
|
124
|
+
(size).times {f.write(fills) }
|
125
|
+
end
|
126
|
+
file_contents = ""
|
127
|
+
Netssh.new(a_host) do
|
128
|
+
upload!(file_name, file_name)
|
129
|
+
file_contents = download!(file_name)
|
130
|
+
end.run
|
131
|
+
assert_equal File.open(file_name).read, file_contents
|
132
|
+
end
|
133
|
+
|
95
134
|
end
|
96
135
|
|
97
136
|
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'helper'
|
2
|
+
require 'sshkit'
|
3
|
+
|
4
|
+
module SSHKit
|
5
|
+
class TestPretty < UnitTest
|
6
|
+
|
7
|
+
def setup
|
8
|
+
SSHKit.config.output_verbosity = Logger::DEBUG
|
9
|
+
end
|
10
|
+
|
11
|
+
def output
|
12
|
+
@_output ||= String.new
|
13
|
+
end
|
14
|
+
|
15
|
+
def pretty
|
16
|
+
@_pretty ||= SSHKit::Formatter::Pretty.new(output)
|
17
|
+
end
|
18
|
+
|
19
|
+
def teardown
|
20
|
+
remove_instance_variable :@_pretty
|
21
|
+
remove_instance_variable :@_output
|
22
|
+
SSHKit.reset_configuration!
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_logging_fatal
|
26
|
+
pretty << SSHKit::LogMessage.new(Logger::FATAL, "Test")
|
27
|
+
assert_equal output.strip, " \e[31mFATAL\e[0m Test \n".strip
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_logging_error
|
31
|
+
pretty << SSHKit::LogMessage.new(Logger::ERROR, "Test")
|
32
|
+
assert_equal output.strip, " \e[31mERROR\e[0m Test \n".strip
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_logging_warn
|
36
|
+
pretty << SSHKit::LogMessage.new(Logger::WARN, "Test")
|
37
|
+
assert_equal output.strip, " \e[33mWARN\e[0m Test \n".strip
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_logging_info
|
41
|
+
pretty << SSHKit::LogMessage.new(Logger::INFO, "Test")
|
42
|
+
assert_equal output.strip, " \e[34mINFO\e[0m Test \n".strip
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_logging_debug
|
46
|
+
pretty << SSHKit::LogMessage.new(Logger::DEBUG, "Test")
|
47
|
+
assert_equal output.strip, " \e[30mDEBUG\e[0m Test \n".strip
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sshkit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.22
|
5
|
+
prerelease:
|
5
6
|
platform: ruby
|
6
7
|
authors:
|
7
8
|
- Lee Hambley
|
@@ -9,41 +10,46 @@ authors:
|
|
9
10
|
autorequire:
|
10
11
|
bindir: bin
|
11
12
|
cert_chain: []
|
12
|
-
date: 2013-03-
|
13
|
+
date: 2013-03-29 00:00:00.000000000 Z
|
13
14
|
dependencies:
|
14
15
|
- !ruby/object:Gem::Dependency
|
15
16
|
name: net-ssh
|
16
17
|
requirement: !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
17
19
|
requirements:
|
18
|
-
- - '>='
|
20
|
+
- - ! '>='
|
19
21
|
- !ruby/object:Gem::Version
|
20
22
|
version: '0'
|
21
23
|
type: :runtime
|
22
24
|
prerelease: false
|
23
25
|
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
24
27
|
requirements:
|
25
|
-
- - '>='
|
28
|
+
- - ! '>='
|
26
29
|
- !ruby/object:Gem::Version
|
27
30
|
version: '0'
|
28
31
|
- !ruby/object:Gem::Dependency
|
29
32
|
name: term-ansicolor
|
30
33
|
requirement: !ruby/object:Gem::Requirement
|
34
|
+
none: false
|
31
35
|
requirements:
|
32
|
-
- - '>='
|
36
|
+
- - ! '>='
|
33
37
|
- !ruby/object:Gem::Version
|
34
38
|
version: '0'
|
35
39
|
type: :runtime
|
36
40
|
prerelease: false
|
37
41
|
version_requirements: !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
38
43
|
requirements:
|
39
|
-
- - '>='
|
44
|
+
- - ! '>='
|
40
45
|
- !ruby/object:Gem::Version
|
41
46
|
version: '0'
|
42
47
|
- !ruby/object:Gem::Dependency
|
43
48
|
name: minitest
|
44
49
|
requirement: !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
45
51
|
requirements:
|
46
|
-
- - '>='
|
52
|
+
- - ! '>='
|
47
53
|
- !ruby/object:Gem::Version
|
48
54
|
version: 2.11.3
|
49
55
|
- - <
|
@@ -52,137 +58,140 @@ dependencies:
|
|
52
58
|
type: :development
|
53
59
|
prerelease: false
|
54
60
|
version_requirements: !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
55
62
|
requirements:
|
56
|
-
- - '>='
|
63
|
+
- - ! '>='
|
57
64
|
- !ruby/object:Gem::Version
|
58
65
|
version: 2.11.3
|
59
66
|
- - <
|
60
67
|
- !ruby/object:Gem::Version
|
61
68
|
version: 2.12.0
|
62
|
-
- !ruby/object:Gem::Dependency
|
63
|
-
name: autotest
|
64
|
-
requirement: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - '>='
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '0'
|
69
|
-
type: :development
|
70
|
-
prerelease: false
|
71
|
-
version_requirements: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - '>='
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '0'
|
76
69
|
- !ruby/object:Gem::Dependency
|
77
70
|
name: rake
|
78
71
|
requirement: !ruby/object:Gem::Requirement
|
72
|
+
none: false
|
79
73
|
requirements:
|
80
|
-
- - '>='
|
74
|
+
- - ! '>='
|
81
75
|
- !ruby/object:Gem::Version
|
82
76
|
version: '0'
|
83
77
|
type: :development
|
84
78
|
prerelease: false
|
85
79
|
version_requirements: !ruby/object:Gem::Requirement
|
80
|
+
none: false
|
86
81
|
requirements:
|
87
|
-
- - '>='
|
82
|
+
- - ! '>='
|
88
83
|
- !ruby/object:Gem::Version
|
89
84
|
version: '0'
|
90
85
|
- !ruby/object:Gem::Dependency
|
91
86
|
name: turn
|
92
87
|
requirement: !ruby/object:Gem::Requirement
|
88
|
+
none: false
|
93
89
|
requirements:
|
94
|
-
- - '>='
|
90
|
+
- - ! '>='
|
95
91
|
- !ruby/object:Gem::Version
|
96
92
|
version: '0'
|
97
93
|
type: :development
|
98
94
|
prerelease: false
|
99
95
|
version_requirements: !ruby/object:Gem::Requirement
|
96
|
+
none: false
|
100
97
|
requirements:
|
101
|
-
- - '>='
|
98
|
+
- - ! '>='
|
102
99
|
- !ruby/object:Gem::Version
|
103
100
|
version: '0'
|
104
101
|
- !ruby/object:Gem::Dependency
|
105
102
|
name: unindent
|
106
103
|
requirement: !ruby/object:Gem::Requirement
|
104
|
+
none: false
|
107
105
|
requirements:
|
108
|
-
- - '>='
|
106
|
+
- - ! '>='
|
109
107
|
- !ruby/object:Gem::Version
|
110
108
|
version: '0'
|
111
109
|
type: :development
|
112
110
|
prerelease: false
|
113
111
|
version_requirements: !ruby/object:Gem::Requirement
|
112
|
+
none: false
|
114
113
|
requirements:
|
115
|
-
- - '>='
|
114
|
+
- - ! '>='
|
116
115
|
- !ruby/object:Gem::Version
|
117
116
|
version: '0'
|
118
117
|
- !ruby/object:Gem::Dependency
|
119
118
|
name: mocha
|
120
119
|
requirement: !ruby/object:Gem::Requirement
|
120
|
+
none: false
|
121
121
|
requirements:
|
122
|
-
- - '>='
|
122
|
+
- - ! '>='
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: '0'
|
125
125
|
type: :development
|
126
126
|
prerelease: false
|
127
127
|
version_requirements: !ruby/object:Gem::Requirement
|
128
|
+
none: false
|
128
129
|
requirements:
|
129
|
-
- - '>='
|
130
|
+
- - ! '>='
|
130
131
|
- !ruby/object:Gem::Version
|
131
132
|
version: '0'
|
132
133
|
- !ruby/object:Gem::Dependency
|
133
134
|
name: debugger
|
134
135
|
requirement: !ruby/object:Gem::Requirement
|
136
|
+
none: false
|
135
137
|
requirements:
|
136
|
-
- - '>='
|
138
|
+
- - ! '>='
|
137
139
|
- !ruby/object:Gem::Version
|
138
140
|
version: '0'
|
139
141
|
type: :development
|
140
142
|
prerelease: false
|
141
143
|
version_requirements: !ruby/object:Gem::Requirement
|
144
|
+
none: false
|
142
145
|
requirements:
|
143
|
-
- - '>='
|
146
|
+
- - ! '>='
|
144
147
|
- !ruby/object:Gem::Version
|
145
148
|
version: '0'
|
146
149
|
- !ruby/object:Gem::Dependency
|
147
150
|
name: vagrant
|
148
151
|
requirement: !ruby/object:Gem::Requirement
|
152
|
+
none: false
|
149
153
|
requirements:
|
150
|
-
- - '>='
|
154
|
+
- - ! '>='
|
151
155
|
- !ruby/object:Gem::Version
|
152
156
|
version: '0'
|
153
157
|
type: :development
|
154
158
|
prerelease: false
|
155
159
|
version_requirements: !ruby/object:Gem::Requirement
|
160
|
+
none: false
|
156
161
|
requirements:
|
157
|
-
- - '>='
|
162
|
+
- - ! '>='
|
158
163
|
- !ruby/object:Gem::Version
|
159
164
|
version: '0'
|
160
165
|
- !ruby/object:Gem::Dependency
|
161
166
|
name: yard
|
162
167
|
requirement: !ruby/object:Gem::Requirement
|
168
|
+
none: false
|
163
169
|
requirements:
|
164
|
-
- - '>='
|
170
|
+
- - ! '>='
|
165
171
|
- !ruby/object:Gem::Version
|
166
172
|
version: '0'
|
167
173
|
type: :development
|
168
174
|
prerelease: false
|
169
175
|
version_requirements: !ruby/object:Gem::Requirement
|
176
|
+
none: false
|
170
177
|
requirements:
|
171
|
-
- - '>='
|
178
|
+
- - ! '>='
|
172
179
|
- !ruby/object:Gem::Version
|
173
180
|
version: '0'
|
174
181
|
- !ruby/object:Gem::Dependency
|
175
182
|
name: redcarpet
|
176
183
|
requirement: !ruby/object:Gem::Requirement
|
184
|
+
none: false
|
177
185
|
requirements:
|
178
|
-
- - '>='
|
186
|
+
- - ! '>='
|
179
187
|
- !ruby/object:Gem::Version
|
180
188
|
version: '0'
|
181
189
|
type: :development
|
182
190
|
prerelease: false
|
183
191
|
version_requirements: !ruby/object:Gem::Requirement
|
192
|
+
none: false
|
184
193
|
requirements:
|
185
|
-
- - '>='
|
194
|
+
- - ! '>='
|
186
195
|
- !ruby/object:Gem::Version
|
187
196
|
version: '0'
|
188
197
|
description: A comprehensive toolkit for remotely running commands in a structured
|
@@ -225,6 +234,7 @@ files:
|
|
225
234
|
- lib/sshkit/formatters/dot.rb
|
226
235
|
- lib/sshkit/formatters/pretty.rb
|
227
236
|
- lib/sshkit/host.rb
|
237
|
+
- lib/sshkit/log_message.rb
|
228
238
|
- lib/sshkit/runners/abstract.rb
|
229
239
|
- lib/sshkit/runners/group.rb
|
230
240
|
- lib/sshkit/runners/parallel.rb
|
@@ -238,32 +248,34 @@ files:
|
|
238
248
|
- test/unit/backends/test_netssh.rb
|
239
249
|
- test/unit/backends/test_printer.rb
|
240
250
|
- test/unit/core_ext/test_string.rb
|
251
|
+
- test/unit/formatters/test_pretty.rb
|
241
252
|
- test/unit/test_command.rb
|
242
253
|
- test/unit/test_configuration.rb
|
243
254
|
- test/unit/test_coordinator.rb
|
244
255
|
- test/unit/test_host.rb
|
245
256
|
homepage: http://wacku.github.com/sshkit
|
246
257
|
licenses: []
|
247
|
-
metadata: {}
|
248
258
|
post_install_message:
|
249
259
|
rdoc_options: []
|
250
260
|
require_paths:
|
251
261
|
- lib
|
252
262
|
required_ruby_version: !ruby/object:Gem::Requirement
|
263
|
+
none: false
|
253
264
|
requirements:
|
254
|
-
- - '>='
|
265
|
+
- - ! '>='
|
255
266
|
- !ruby/object:Gem::Version
|
256
267
|
version: '0'
|
257
268
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
269
|
+
none: false
|
258
270
|
requirements:
|
259
|
-
- - '>='
|
271
|
+
- - ! '>='
|
260
272
|
- !ruby/object:Gem::Version
|
261
273
|
version: '0'
|
262
274
|
requirements: []
|
263
275
|
rubyforge_project:
|
264
|
-
rubygems_version:
|
276
|
+
rubygems_version: 1.8.23
|
265
277
|
signing_key:
|
266
|
-
specification_version:
|
278
|
+
specification_version: 3
|
267
279
|
summary: SSHKit makes it easy to write structured, testable SSH commands in Ruby
|
268
280
|
test_files:
|
269
281
|
- test/functional/backends/test_netssh.rb
|
@@ -273,7 +285,9 @@ test_files:
|
|
273
285
|
- test/unit/backends/test_netssh.rb
|
274
286
|
- test/unit/backends/test_printer.rb
|
275
287
|
- test/unit/core_ext/test_string.rb
|
288
|
+
- test/unit/formatters/test_pretty.rb
|
276
289
|
- test/unit/test_command.rb
|
277
290
|
- test/unit/test_configuration.rb
|
278
291
|
- test/unit/test_coordinator.rb
|
279
292
|
- test/unit/test_host.rb
|
293
|
+
has_rdoc:
|
checksums.yaml
DELETED
@@ -1,7 +0,0 @@
|
|
1
|
-
---
|
2
|
-
SHA1:
|
3
|
-
metadata.gz: 8db213100be25113e238342987c5a12ed7412b15
|
4
|
-
data.tar.gz: 7067bc10963a3d8f98f45711075418bed865c590
|
5
|
-
SHA512:
|
6
|
-
metadata.gz: ab26645180f7f6ecc458735ec542b620024ee612d35738c0219d7add6a20fc7388e1b9f4c872370e9a2fb74dd100a7efc740d0b73d517b391a411b7f29104e92
|
7
|
-
data.tar.gz: f3f840a846d275c20ad325134eb37caa582cf20d7025bf15a69ca82c024ef10ee2c797505d26e4d7f284499b4a5707f46c2c783ac66534db9e2ccdad23fe4342
|