sshkit 0.0.21 → 0.0.22
Sign up to get free protection for your applications and to get access to all the features.
- 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
|