net-scp 1.1.2 → 1.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/CHANGES.txt +4 -0
- data/Rakefile +2 -2
- data/lib/net/scp.rb +7 -1
- data/lib/net/scp/download.rb +16 -1
- data/lib/net/scp/version.rb +2 -2
- data/lib/uri/open-scp.rb +3 -1
- data/net-scp.gemspec +3 -5
- data/test/test_download.rb +27 -0
- metadata +4 -32
- data.tar.gz.sig +0 -0
- metadata.gz.sig +0 -1
data/CHANGES.txt
CHANGED
data/Rakefile
CHANGED
@@ -30,8 +30,8 @@ begin
|
|
30
30
|
|
31
31
|
s.license = "MIT"
|
32
32
|
|
33
|
-
s.signing_key = File.join('/mnt/gem/', 'gem-private_key.pem')
|
34
|
-
s.cert_chain = ['gem-public_cert.pem']
|
33
|
+
#s.signing_key = File.join('/mnt/gem/', 'gem-private_key.pem')
|
34
|
+
#s.cert_chain = ['gem-public_cert.pem']
|
35
35
|
end
|
36
36
|
Jeweler::GemcutterTasks.new
|
37
37
|
rescue LoadError
|
data/lib/net/scp.rb
CHANGED
@@ -128,6 +128,11 @@ module Net
|
|
128
128
|
# * E -- terminator directive. Indicates the end of a directory, and subsequent
|
129
129
|
# files and directories should be received by the parent of the current
|
130
130
|
# directory.
|
131
|
+
# * \0 -- indicates a successful response from the other end.
|
132
|
+
# * \1 -- warning directive. Indicates a warning from the other end. Text from
|
133
|
+
# this warning will be reported if the SCP results in an error.
|
134
|
+
# * \2 -- error directive. Indicates an error from the other end. Text from
|
135
|
+
# this error will be reported if the SCP results in an error.
|
131
136
|
#
|
132
137
|
# If a 'C' directive is received, we switch over to
|
133
138
|
# Net::SCP::Download#read_data_state. If an 'E' directive is received, and
|
@@ -355,8 +360,9 @@ module Net
|
|
355
360
|
channel[:buffer ] = Net::SSH::Buffer.new
|
356
361
|
channel[:state ] = "#{mode}_start"
|
357
362
|
channel[:stack ] = []
|
363
|
+
channel[:error_string] = ''
|
358
364
|
|
359
|
-
channel.on_close { |ch| raise Net::SCP::Error, "SCP did not finish successfully (#{
|
365
|
+
channel.on_close { |ch| send("#{channel[:state]}_state", channel); raise Net::SCP::Error, "SCP did not finish successfully (#{channel[:exit]}): #{channel[:error_string]}" if channel[:exit] != 0 }
|
360
366
|
channel.on_data { |ch, data| channel[:buffer].append(data) }
|
361
367
|
channel.on_extended_data { |ch, type, data| debug { data.chomp } }
|
362
368
|
channel.on_request("exit-status") { |ch, data| channel[:exit] = data.read_long }
|
data/lib/net/scp/download.rb
CHANGED
@@ -37,7 +37,13 @@ module Net; class SCP
|
|
37
37
|
|
38
38
|
directive = parse_directive(line)
|
39
39
|
case directive[:type]
|
40
|
-
when :
|
40
|
+
when :OK
|
41
|
+
return
|
42
|
+
when :warning
|
43
|
+
channel[:error_string] << directive[:message]
|
44
|
+
when :error
|
45
|
+
channel[:error_string] << directive[:message]
|
46
|
+
when :times
|
41
47
|
channel[:times] = directive
|
42
48
|
when :directory
|
43
49
|
read_directory(channel, directive)
|
@@ -87,6 +93,15 @@ module Net; class SCP
|
|
87
93
|
# data.
|
88
94
|
def parse_directive(text)
|
89
95
|
case type = text[0]
|
96
|
+
when "\x00"
|
97
|
+
# Success
|
98
|
+
{ :type => :OK }
|
99
|
+
when "\x01"
|
100
|
+
{ :type => :warning,
|
101
|
+
:message => text[1..-1] }
|
102
|
+
when "\x02"
|
103
|
+
{ :type => :error,
|
104
|
+
:message => text[1..-1] }
|
90
105
|
when ?T
|
91
106
|
parts = text[1..-1].split(/ /, 4).map { |i| i.to_i }
|
92
107
|
{ :type => :times,
|
data/lib/net/scp/version.rb
CHANGED
@@ -5,8 +5,8 @@ module Net; class SCP
|
|
5
5
|
# Describes the current version of the Net::SCP library.
|
6
6
|
class Version < Net::SSH::Version
|
7
7
|
MAJOR = 1
|
8
|
-
MINOR =
|
9
|
-
TINY =
|
8
|
+
MINOR = 2
|
9
|
+
TINY = 0
|
10
10
|
|
11
11
|
# The current version, as a Version instance
|
12
12
|
CURRENT = new(MAJOR, MINOR, TINY)
|
data/lib/uri/open-scp.rb
CHANGED
@@ -2,13 +2,15 @@ require 'open-uri'
|
|
2
2
|
require 'uri/scp'
|
3
3
|
require 'net/scp'
|
4
4
|
|
5
|
+
OpenURI::Options[:ssh] = nil
|
6
|
+
|
5
7
|
module URI
|
6
8
|
|
7
9
|
class SCP
|
8
10
|
def buffer_open(buf, proxy, open_options)
|
9
11
|
options = open_options.merge(:port => port, :password => password)
|
10
12
|
progress = options.delete(:progress_proc)
|
11
|
-
buf << Net::SCP.download!(host, user, path, nil,
|
13
|
+
buf << Net::SCP.download!(host, user, path, nil, options, &progress)
|
12
14
|
buf.io.rewind
|
13
15
|
end
|
14
16
|
|
data/net-scp.gemspec
CHANGED
@@ -5,12 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "net-scp"
|
8
|
-
s.version = "1.
|
8
|
+
s.version = "1.2.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Jamis Buck", "Delano Mandelbaum"]
|
12
|
-
s.
|
13
|
-
s.date = "2013-07-06"
|
12
|
+
s.date = "2014-04-11"
|
14
13
|
s.description = "A pure Ruby implementation of the SCP client protocol"
|
15
14
|
s.email = "net-ssh@solutious.com"
|
16
15
|
s.extra_rdoc_files = [
|
@@ -43,8 +42,7 @@ Gem::Specification.new do |s|
|
|
43
42
|
s.licenses = ["MIT"]
|
44
43
|
s.require_paths = ["lib"]
|
45
44
|
s.rubyforge_project = "net-scp"
|
46
|
-
s.rubygems_version = "1.8.
|
47
|
-
s.signing_key = "/mnt/gem/gem-private_key.pem"
|
45
|
+
s.rubygems_version = "1.8.23"
|
48
46
|
s.summary = "A pure Ruby implementation of the SCP client protocol"
|
49
47
|
|
50
48
|
if s.respond_to? :specification_version then
|
data/test/test_download.rb
CHANGED
@@ -54,6 +54,33 @@ class TestDownload < Net::SCP::TestCase
|
|
54
54
|
assert_equal "a" * 1234, file.io.string
|
55
55
|
end
|
56
56
|
|
57
|
+
def test_download_with_error_should_respond_with_error_text
|
58
|
+
story do |session|
|
59
|
+
channel = session.opens_channel
|
60
|
+
channel.sends_exec "scp -f /path/to/remote.txt"
|
61
|
+
|
62
|
+
channel.sends_ok
|
63
|
+
channel.gets_data "\x01File not found: /path/to/remote.txt\n"
|
64
|
+
channel.sends_ok
|
65
|
+
|
66
|
+
channel.gets_eof
|
67
|
+
channel.gets_exit_status(1)
|
68
|
+
channel.gets_close
|
69
|
+
channel.sends_close
|
70
|
+
end
|
71
|
+
|
72
|
+
error = nil
|
73
|
+
assert_scripted do
|
74
|
+
begin
|
75
|
+
scp.download!("/path/to/remote.txt")
|
76
|
+
rescue
|
77
|
+
error = $!
|
78
|
+
end
|
79
|
+
end
|
80
|
+
assert_equal Net::SCP::Error, error.class
|
81
|
+
assert_equal "SCP did not finish successfully (1): File not found: /path/to/remote.txt\n", error.message
|
82
|
+
end
|
83
|
+
|
57
84
|
def test_download_with_progress_callback_should_invoke_callback
|
58
85
|
prepare_file("/path/to/local.txt", "a" * 3000 + "b" * 3000 + "c" * 3000 + "d" * 3000)
|
59
86
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: net-scp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,36 +9,8 @@ authors:
|
|
9
9
|
- Delano Mandelbaum
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
|
-
cert_chain:
|
13
|
-
-
|
14
|
-
LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUROakNDQWg2Z0F3SUJB
|
15
|
-
Z0lCQURBTkJna3Foa2lHOXcwQkFRVUZBREJCTVE4d0RRWURWUVFEREFaa1pX
|
16
|
-
eGgKYm04eEdUQVhCZ29Ka2lhSmsvSXNaQUVaRmdsemIyeDFkR2x2ZFhNeEV6
|
17
|
-
QVJCZ29Ka2lhSmsvSXNaQUVaRmdOagpiMjB3SGhjTk1UTXdNakEyTVRFMU56
|
18
|
-
UTFXaGNOTVRRd01qQTJNVEUxTnpRMVdqQkJNUTh3RFFZRFZRUUREQVprClpX
|
19
|
-
eGhibTh4R1RBWEJnb0praWFKay9Jc1pBRVpGZ2x6YjJ4MWRHbHZkWE14RXpB
|
20
|
-
UkJnb0praWFKay9Jc1pBRVoKRmdOamIyMHdnZ0VpTUEwR0NTcUdTSWIzRFFF
|
21
|
-
QkFRVUFBNElCRHdBd2dnRUtBb0lCQVFEZzFoTXRsMFhzTXVVSwpBS1RnWVd2
|
22
|
-
M2dqajd2dUVzRTJFalQrdnlCZzgvTHBxVlZ3WnppaWFlYkpUOUlaaVErc0NG
|
23
|
-
cWJpYWtqMGI1M3BJCmhnMXlPYUJFbUg2L1cwTDdyd3pxYVJWOXNXMWVKczlK
|
24
|
-
eEZZUUNuZDY3elVuemo4bm5SbE9qRytoaElHK1ZzaWoKbnBzR2J0MjhwZWZ1
|
25
|
-
TlpKak81cTJjbEFsZlNuaUlJSGZJc1U3L1N0RVl1NkZVR09qbndyeVowcjV5
|
26
|
-
SmxyOVJyRQpHcytxMERXOFFuWjlVcEFmdURGUVp1SXFlS1FGRkxFN25NbUNH
|
27
|
-
YUErMEJOMW5MbDNmVkhOYkxIcTdBdms4K1orClp1dXZrZHNjYkhsTy9sKzN4
|
28
|
-
Q05RNW5Vbkh3cTBBREFiTUxPbG1pWVl6cVhvV0xqbWVJNm1lL2Nsa3RKQ2ZO
|
29
|
-
MlIKb1pHM1VRdnZBZ01CQUFHak9UQTNNQWtHQTFVZEV3UUNNQUF3SFFZRFZS
|
30
|
-
ME9CQllFRk1TSk9FdEh6RTRsMGF6dgpNMEpLMGtLTlRvSzFNQXNHQTFVZER3
|
31
|
-
UUVBd0lFc0RBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQXRPZEU3M3F4Ck9I
|
32
|
-
MnlkaTlvVDJoUzVmOUcweTFaNzBUbHdoK1ZHRXh5Znh6VkU5WHdDK2lQcEp4
|
33
|
-
TnJhaUhZZ0YvOS9va3k3WloKUjlxMC90Sm5ldWhBZW5aZGlRa1g3b2k0TzN2
|
34
|
-
OXdSUzZZSG9XQnhNUEZLVlJMTlR6dlZKc2JtZnBDQWxwNS81ZwpwczR3UUZ5
|
35
|
-
NW1pYkVsR1ZsT29iZi9naHFaMjVIUzlKNmtkMC9DL3J5MEFVdFRvZ3NMN1R4
|
36
|
-
R3dUNGtiQ3g2M3ViCjN2eXdFRWhzSlV6ZmQ5N0dDQUJtdFFmUlRsZFgvajdG
|
37
|
-
MXovNXdkOHAraGZkb3gxaWliZHM5WnRmYVpBM0t6S24Ka2NoV045QjZ6Zzly
|
38
|
-
MVhNUThCTTJKejBYb1BhblBlMzU0K2xXd2pwa1JLYkZvdy9aYlFIY0NMQ3Ey
|
39
|
-
NCtONmI2ZwpkZ0tmTkR6d2lEcHFDQT09Ci0tLS0tRU5EIENFUlRJRklDQVRF
|
40
|
-
LS0tLS0K
|
41
|
-
date: 2013-07-06 00:00:00.000000000 Z
|
12
|
+
cert_chain: []
|
13
|
+
date: 2014-04-11 00:00:00.000000000 Z
|
42
14
|
dependencies:
|
43
15
|
- !ruby/object:Gem::Dependency
|
44
16
|
name: net-ssh
|
@@ -137,7 +109,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
137
109
|
version: '0'
|
138
110
|
requirements: []
|
139
111
|
rubyforge_project: net-scp
|
140
|
-
rubygems_version: 1.8.
|
112
|
+
rubygems_version: 1.8.23
|
141
113
|
signing_key:
|
142
114
|
specification_version: 3
|
143
115
|
summary: A pure Ruby implementation of the SCP client protocol
|
data.tar.gz.sig
DELETED
Binary file
|
metadata.gz.sig
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
��2��=�C��r�K��C�6x�+�?[k�3��j�&����Uz�_V�.lm?ЁDgӕhW�'�?O��j�_ƃP�&q�ģ֣ �Z�M�)+��Y|���Ф���O@!�� w/_[dxq/���|�=�:I���R�ѷ�h�������d�+dZ�4[ݣ���$g&��{�X)�>�ۓ2ҡ���;U��W��QqA��Ƕ!}j��7-�`(��Y�ʢ�ՕnpE~4�����<x�+R��{r6��D���
|