sshkit 0.0.23 → 0.0.24
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +22 -0
- data/EXAMPLES.md +17 -8
- data/lib/sshkit/backends/netssh.rb +10 -7
- data/lib/sshkit/command.rb +2 -0
- data/lib/sshkit/formatters/pretty.rb +2 -2
- data/lib/sshkit/version.rb +1 -1
- metadata +2 -2
data/CHANGELOG.md
CHANGED
@@ -3,6 +3,28 @@
|
|
3
3
|
This file is written in reverse chronological order, newer releases will
|
4
4
|
appear at the top.
|
5
5
|
|
6
|
+
## 0.0.24
|
7
|
+
|
8
|
+
* Pretty output now streams stdout and stderr. Previous versions would
|
9
|
+
append (`+=`) chunks of data written by the remote host to the `Command`
|
10
|
+
instance, and the `Pretty` formatter would only print stdout/stderr if the
|
11
|
+
command was `#complete?`. Historically this lead to issues where the
|
12
|
+
remote process was blocking for input, had written the prompt to stdout,
|
13
|
+
but it was not visible on the client side.
|
14
|
+
|
15
|
+
Now each time the command is passed to the output stream, the
|
16
|
+
stdout/stderr are replaced with the lines returned from the remote server
|
17
|
+
in this chunk. (i.e were yielded to the callback block). Commands now have
|
18
|
+
attribute accessors for `#full_stdout` and `#full_stderr` which are appended
|
19
|
+
in the way that `#stdout` and `#stderr` were previously.
|
20
|
+
|
21
|
+
This should be considered a private API, and one should beware of relying
|
22
|
+
on `#full_stdout` or `#full_stderr`, they will likely be replaced with a
|
23
|
+
cleaner soltion eventually.
|
24
|
+
|
25
|
+
* `upload!` and `download!` now print progress reports at the `Logger::INFO`
|
26
|
+
verbosity level.
|
27
|
+
|
6
28
|
## 0.0.23
|
7
29
|
|
8
30
|
* Explicitly rely on `net-scp` gem.
|
data/EXAMPLES.md
CHANGED
@@ -42,14 +42,14 @@
|
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
45
|
-
The `debug()
|
45
|
+
The `debug()`, `info()`, `warn()`, `error()` and `fatal()` honor the current
|
46
46
|
log level of `SSHKit.config.output_verbosity`
|
47
47
|
|
48
48
|
## Run a command in a different directory as a different user
|
49
49
|
|
50
50
|
on hosts do |host|
|
51
51
|
as 'www-data' do
|
52
|
-
|
52
|
+
within '/var/log' do
|
53
53
|
puts capture(:whoami)
|
54
54
|
puts capture(:pwd)
|
55
55
|
end
|
@@ -70,7 +70,7 @@ have a shell defined, one cannot switch to that user.
|
|
70
70
|
upload! '/config/database.yml', '/opt/my_project/shared/databse.yml'
|
71
71
|
end
|
72
72
|
|
73
|
-
**Note:** The `upload!()` method doesn't honor the values of `
|
73
|
+
**Note:** The `upload!()` method doesn't honor the values of `within()`, `as()`
|
74
74
|
etc, this will be improved as the library matures, but we're not there yet.
|
75
75
|
|
76
76
|
## Upload a file from a stream
|
@@ -93,14 +93,23 @@ for example
|
|
93
93
|
This spares one from having to figure out the correct escaping sequences for
|
94
94
|
something like "echo(:cat, '...?...', '> /etc/sudoers.d/yolo')".
|
95
95
|
|
96
|
-
**Note:** The `upload!()` method doesn't honor the values of `
|
96
|
+
**Note:** The `upload!()` method doesn't honor the values of `within()`, `as()`
|
97
97
|
etc, this will be improved as the library matures, but we're not there yet.
|
98
98
|
|
99
|
+
## Upload a directory of files
|
100
|
+
|
101
|
+
on hosts do |host|
|
102
|
+
upload! '.', '/tmp/mypwd', recursive: true
|
103
|
+
end
|
104
|
+
|
105
|
+
In this case the `recursive: true` option mirrors the same options which are
|
106
|
+
available to `Net::{SCP,SFTP}`.
|
107
|
+
|
99
108
|
## Run a command with a different effective group ID
|
100
109
|
|
101
110
|
on hosts do |host|
|
102
111
|
as user: 'www-data', group: 'project-group' do
|
103
|
-
|
112
|
+
within '/var/log' do
|
104
113
|
execute :touch, 'somefile'
|
105
114
|
execute :ls, '-l'
|
106
115
|
end
|
@@ -116,9 +125,9 @@ scripts for deployment between team members without sharing logins.
|
|
116
125
|
## Stack directory nestings
|
117
126
|
|
118
127
|
on hosts do
|
119
|
-
|
128
|
+
within "/var" do
|
120
129
|
puts capture(:pwd)
|
121
|
-
|
130
|
+
within :log do
|
122
131
|
puts capture(:pwd)
|
123
132
|
end
|
124
133
|
end
|
@@ -138,7 +147,7 @@ joined according to the expectations of the machine receiving the commands.
|
|
138
147
|
## Running a task in the background
|
139
148
|
|
140
149
|
on hosts do
|
141
|
-
|
150
|
+
within '/opt/sites/example.com' do
|
142
151
|
background :rails, :server
|
143
152
|
end
|
144
153
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'net/ssh'
|
2
|
+
require 'net/scp'
|
2
3
|
|
3
4
|
module SSHKit
|
4
5
|
module Backend
|
@@ -34,18 +35,18 @@ module SSHKit
|
|
34
35
|
|
35
36
|
def capture(*args)
|
36
37
|
options = args.extract_options!.merge(verbosity: Logger::DEBUG)
|
37
|
-
_execute(*[*args, options]).
|
38
|
+
_execute(*[*args, options]).full_stdout.strip
|
38
39
|
end
|
39
40
|
|
40
41
|
def upload!(local, remote, options = {})
|
41
|
-
ssh.scp.upload!(local, remote, options) do
|
42
|
-
|
42
|
+
ssh.scp.upload!(local, remote, options) do |ch, name, sent, total|
|
43
|
+
info "Uploading #{name} #{(sent.to_f * 100 / total.to_f).to_i}%"
|
43
44
|
end
|
44
45
|
end
|
45
46
|
|
46
47
|
def download!(remote, local=nil, options = {})
|
47
|
-
ssh.scp.download!(remote, local, options) do
|
48
|
-
|
48
|
+
ssh.scp.download!(remote, local, options) do |ch, name, received, total|
|
49
|
+
info "Downloading #{name} #{(received.to_f * 100 / total.to_f).to_i}%"
|
49
50
|
end
|
50
51
|
end
|
51
52
|
|
@@ -69,11 +70,13 @@ module SSHKit
|
|
69
70
|
chan.request_pty if Netssh.config.pty
|
70
71
|
chan.exec cmd.to_command do |ch, success|
|
71
72
|
chan.on_data do |ch, data|
|
72
|
-
cmd.stdout
|
73
|
+
cmd.stdout = data
|
74
|
+
cmd.full_stdout += data
|
73
75
|
output << cmd
|
74
76
|
end
|
75
77
|
chan.on_extended_data do |ch, type, data|
|
76
|
-
cmd.stderr
|
78
|
+
cmd.stderr = data
|
79
|
+
cmd.full_stderr += data
|
77
80
|
output << cmd
|
78
81
|
end
|
79
82
|
chan.on_request("exit-status") do |ch, data|
|
data/lib/sshkit/command.rb
CHANGED
@@ -36,6 +36,7 @@ module SSHKit
|
|
36
36
|
attr_reader :command, :args, :options, :started_at, :started, :exit_status
|
37
37
|
|
38
38
|
attr_accessor :stdout, :stderr
|
39
|
+
attr_accessor :full_stdout, :full_stderr
|
39
40
|
|
40
41
|
# Initialize a new Command object
|
41
42
|
#
|
@@ -52,6 +53,7 @@ module SSHKit
|
|
52
53
|
@options.symbolize_keys!
|
53
54
|
sanitize_command!
|
54
55
|
@stdout, @stderr = String.new, String.new
|
56
|
+
@full_stdout, @full_stderr = String.new, String.new
|
55
57
|
end
|
56
58
|
|
57
59
|
def complete?
|
@@ -28,13 +28,13 @@ module SSHKit
|
|
28
28
|
end
|
29
29
|
|
30
30
|
if SSHKit.config.output_verbosity == Logger::DEBUG
|
31
|
-
|
31
|
+
unless command.stdout.empty?
|
32
32
|
command.stdout.lines.each do |line|
|
33
33
|
original_output << level(Logger::DEBUG) + uuid(command) + c.green("\t" + line)
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
|
-
|
37
|
+
unless command.stderr.empty?
|
38
38
|
command.stderr.lines.each do |line|
|
39
39
|
original_output << level(Logger::DEBUG) + uuid(command) + c.red("\t" + line)
|
40
40
|
end
|
data/lib/sshkit/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
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.24
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2013-
|
13
|
+
date: 2013-04-04 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: net-ssh
|