rest-ftp-daemon 0.410.5 → 0.420.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +7 -1
- data/bin/rest-ftp-daemon +3 -3
- data/defaults.yml +1 -0
- data/lib/rest-ftp-daemon.rb +2 -0
- data/lib/rest-ftp-daemon/api/dashboard.rb +1 -0
- data/lib/rest-ftp-daemon/api/debug.rb +1 -0
- data/lib/rest-ftp-daemon/api/jobs.rb +1 -0
- data/lib/rest-ftp-daemon/api/root.rb +2 -0
- data/lib/rest-ftp-daemon/api/status.rb +1 -0
- data/lib/rest-ftp-daemon/helpers/views.rb +2 -0
- data/lib/rest-ftp-daemon/job.rb +30 -25
- data/lib/rest-ftp-daemon/jobs/errors.rb +1 -0
- data/lib/rest-ftp-daemon/jobs/transfer.rb +11 -6
- data/lib/rest-ftp-daemon/location.rb +38 -16
- data/lib/rest-ftp-daemon/pretty_json.rb +5 -0
- data/lib/rest-ftp-daemon/remote.rb +29 -12
- data/lib/rest-ftp-daemon/remote_ftp.rb +6 -9
- data/lib/rest-ftp-daemon/remote_s3.rb +52 -0
- data/lib/rest-ftp-daemon/remote_sftp.rb +6 -11
- data/rest-ftp-daemon.gemspec +2 -1
- metadata +17 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a1dc08f8d5c0fc9a671b36144561e504e25bb80e
|
4
|
+
data.tar.gz: 9e8eae9daf0a21d56f6fe6c27a32d19327fc099e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 08d906444c38c286123f1eacef7f7c37ba30ff64ea9a4da83913c745514288eeefda8ee8bdcfe1f8de52f2c29132cb2fcfa902f978b600fc387439970978b6e8
|
7
|
+
data.tar.gz: d4a131e6f37dca12e5478443e2bfffb2975de3ae59481c67c47428eedabaeee045866a17640c0e1875be5357cdb29726f3052f4b314fe0660bc4d6dd15a0db66
|
data/Gemfile.lock
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
rest-ftp-daemon (0.
|
4
|
+
rest-ftp-daemon (0.420.1)
|
5
5
|
activesupport (~> 4.2)
|
6
6
|
api-auth
|
7
|
+
aws-sdk-resources (~> 2)
|
7
8
|
bmc-daemon-lib (~> 0.3.4)
|
8
9
|
double-bag-ftps
|
9
10
|
facter
|
@@ -38,6 +39,10 @@ GEM
|
|
38
39
|
ast (2.3.0)
|
39
40
|
astrolabe (1.3.1)
|
40
41
|
parser (~> 2.2)
|
42
|
+
aws-sdk-core (2.5.7)
|
43
|
+
jmespath (~> 1.0)
|
44
|
+
aws-sdk-resources (2.5.7)
|
45
|
+
aws-sdk-core (= 2.5.7)
|
41
46
|
axiom-types (0.1.1)
|
42
47
|
descendants_tracker (~> 0.0.4)
|
43
48
|
ice_nine (~> 0.11.0)
|
@@ -102,6 +107,7 @@ GEM
|
|
102
107
|
http_parser.rb (0.6.0)
|
103
108
|
i18n (0.7.0)
|
104
109
|
ice_nine (0.11.2)
|
110
|
+
jmespath (1.3.1)
|
105
111
|
json (1.8.3)
|
106
112
|
method_source (0.8.2)
|
107
113
|
mime-types (2.99.2)
|
data/bin/rest-ftp-daemon
CHANGED
@@ -59,11 +59,11 @@ begin
|
|
59
59
|
command = ARGV.shift
|
60
60
|
|
61
61
|
rescue OptionParser::InvalidOption => e
|
62
|
-
abort "EXITING: InvalidOption: #{e.message}
|
62
|
+
abort "EXITING: InvalidOption: #{e.message}"
|
63
63
|
rescue ConfigParseError => e
|
64
|
-
abort "EXITING: ConfigParseError: #{e.message}
|
64
|
+
abort "EXITING: ConfigParseError: #{e.message}"
|
65
65
|
rescue StandardError => e
|
66
|
-
abort "EXITING: StandardError: #{e.message}
|
66
|
+
abort "EXITING: StandardError: #{e.message}"
|
67
67
|
else
|
68
68
|
abort parser.to_s unless ["start", "stop"].include? command
|
69
69
|
end
|
data/defaults.yml
CHANGED
data/lib/rest-ftp-daemon.rb
CHANGED
@@ -26,11 +26,13 @@ require_relative "rest-ftp-daemon/job_queue"
|
|
26
26
|
require_relative "rest-ftp-daemon/counters"
|
27
27
|
require_relative "rest-ftp-daemon/notification"
|
28
28
|
require_relative "rest-ftp-daemon/location"
|
29
|
+
require_relative "rest-ftp-daemon/pretty_json"
|
29
30
|
|
30
31
|
# Remotes
|
31
32
|
require_relative "rest-ftp-daemon/remote"
|
32
33
|
require_relative "rest-ftp-daemon/remote_ftp"
|
33
34
|
require_relative "rest-ftp-daemon/remote_sftp"
|
35
|
+
require_relative "rest-ftp-daemon/remote_s3"
|
34
36
|
|
35
37
|
# Jobs
|
36
38
|
require_relative "rest-ftp-daemon/job"
|
@@ -7,6 +7,7 @@ module RestFtpDaemon
|
|
7
7
|
module API
|
8
8
|
class Root < Grape::API
|
9
9
|
include ::NewRelic::Agent::Instrumentation::ControllerInstrumentation
|
10
|
+
include BmcDaemonLib
|
10
11
|
|
11
12
|
### LOGGING & HELPERS
|
12
13
|
helpers RestFtpDaemon::CommonHelpers
|
@@ -33,6 +34,7 @@ module RestFtpDaemon
|
|
33
34
|
do_not_route_options!
|
34
35
|
# version 'v1'
|
35
36
|
format :json
|
37
|
+
formatter :json, PrettyJSON
|
36
38
|
content_type :json, 'application/json; charset=utf-8'
|
37
39
|
|
38
40
|
|
data/lib/rest-ftp-daemon/job.rb
CHANGED
@@ -43,9 +43,13 @@ module RestFtpDaemon
|
|
43
43
|
attr_reader name
|
44
44
|
end
|
45
45
|
|
46
|
-
def initialize job_id, params = {}
|
47
|
-
#
|
48
|
-
|
46
|
+
def initialize job_id = nil, params = {}
|
47
|
+
# Minimal init
|
48
|
+
@infos = {}
|
49
|
+
@mutex = Mutex.new
|
50
|
+
|
51
|
+
# Skip if no job_id passed or null (mock Job)
|
52
|
+
return if job_id.nil?
|
49
53
|
|
50
54
|
# Init context
|
51
55
|
@id = job_id.to_s
|
@@ -56,7 +60,6 @@ module RestFtpDaemon
|
|
56
60
|
@status = nil
|
57
61
|
@runs = 0
|
58
62
|
@wid = nil
|
59
|
-
@infos = {}
|
60
63
|
|
61
64
|
# Prepare configuration
|
62
65
|
@config = Conf[:transfer] || {}
|
@@ -66,8 +69,6 @@ module RestFtpDaemon
|
|
66
69
|
# Logger
|
67
70
|
@logger = BmcDaemonLib::LoggerPool.instance.get :transfer
|
68
71
|
|
69
|
-
# Protect with a mutex
|
70
|
-
@mutex = Mutex.new
|
71
72
|
|
72
73
|
# Import query params
|
73
74
|
FIELDS.each do |name|
|
@@ -101,7 +102,6 @@ module RestFtpDaemon
|
|
101
102
|
# Job has been prepared, reset infos
|
102
103
|
set_status JOB_STATUS_PREPARED
|
103
104
|
@infos = {}
|
104
|
-
set_info :job, :prepared_at, Time.now
|
105
105
|
set_info_location :source, @source_loc
|
106
106
|
set_info_location :target, @target_loc
|
107
107
|
|
@@ -140,7 +140,7 @@ module RestFtpDaemon
|
|
140
140
|
do_after
|
141
141
|
|
142
142
|
rescue StandardError => exception
|
143
|
-
log_debug "Job.process caught #{exception.class} #{exception.message}"
|
143
|
+
log_debug "Job.process caught [#{exception.class}] #{exception.message}"
|
144
144
|
return oops current_signal, exception
|
145
145
|
|
146
146
|
else
|
@@ -214,6 +214,23 @@ module RestFtpDaemon
|
|
214
214
|
end
|
215
215
|
end
|
216
216
|
|
217
|
+
def set_info level1, level2, value
|
218
|
+
@mutex.synchronize do
|
219
|
+
@infos || {}
|
220
|
+
@infos[level1] ||= {}
|
221
|
+
|
222
|
+
# Force strings to UTF8
|
223
|
+
if value.is_a? Symbol
|
224
|
+
@infos[level1][level2] = value.to_s.force_encoding(Encoding::UTF_8)
|
225
|
+
elsif value.is_a? String
|
226
|
+
@infos[level1][level2] = value.dup.force_encoding(Encoding::UTF_8)
|
227
|
+
else
|
228
|
+
@infos[level1][level2] = value
|
229
|
+
end
|
230
|
+
end
|
231
|
+
touch_job
|
232
|
+
end
|
233
|
+
|
217
234
|
protected
|
218
235
|
|
219
236
|
def alert_common_method_called
|
@@ -236,8 +253,13 @@ module RestFtpDaemon
|
|
236
253
|
return unless location.is_a? Location
|
237
254
|
set_info prefix, :uri, location.to_s
|
238
255
|
set_info prefix, :scheme, location.scheme
|
256
|
+
set_info prefix, :user, location.user
|
239
257
|
set_info prefix, :host, location.host
|
258
|
+
set_info prefix, :port, location.port
|
240
259
|
set_info prefix, :path, location.path
|
260
|
+
set_info prefix, :aws_region, location.aws_region
|
261
|
+
set_info prefix, :aws_bucket, location.aws_bucket
|
262
|
+
set_info prefix, :aws_id, location.aws_id
|
241
263
|
end
|
242
264
|
|
243
265
|
private
|
@@ -266,23 +288,6 @@ module RestFtpDaemon
|
|
266
288
|
touch_job
|
267
289
|
end
|
268
290
|
|
269
|
-
def set_info level1, level2, value
|
270
|
-
@mutex.synchronize do
|
271
|
-
@infos || {}
|
272
|
-
@infos[level1] ||= {}
|
273
|
-
|
274
|
-
# Force strings to UTF8
|
275
|
-
if value.is_a? Symbol
|
276
|
-
@infos[level1][level2] = value.to_s.force_encoding(Encoding::UTF_8)
|
277
|
-
elsif value.is_a? String
|
278
|
-
@infos[level1][level2] = value.dup.force_encoding(Encoding::UTF_8)
|
279
|
-
else
|
280
|
-
@infos[level1][level2] = value
|
281
|
-
end
|
282
|
-
end
|
283
|
-
touch_job
|
284
|
-
end
|
285
|
-
|
286
291
|
def utf8 value
|
287
292
|
value.to_s.encode("UTF-8")
|
288
293
|
end
|
@@ -17,6 +17,7 @@ module RestFtpDaemon
|
|
17
17
|
target_file_exists: RestFtpDaemon::TargetFileExists,
|
18
18
|
target_directory_error: RestFtpDaemon::TargetDirectoryError,
|
19
19
|
target_permission_error: RestFtpDaemon::TargetPermissionError,
|
20
|
+
target_not_supported: RestFtpDaemon::TargetNotSupported,
|
20
21
|
assertion_failed: RestFtpDaemon::AssertionFailed,
|
21
22
|
|
22
23
|
conn_socket_error: SocketError,
|
@@ -18,23 +18,28 @@ module RestFtpDaemon
|
|
18
18
|
# Ensure source is FILE
|
19
19
|
raise RestFtpDaemon::SourceNotSupported, @source_loc.scheme unless source_uri.is_a? URI::FILE
|
20
20
|
|
21
|
-
# Prepare remote
|
22
|
-
# as target could be of a descendent class of URI:XXX and not matching directly)
|
21
|
+
# Prepare remote object
|
23
22
|
case target_uri
|
24
23
|
when URI::FTP
|
25
24
|
log_info "JobTransfer.before target_method FTP"
|
26
|
-
@remote = RemoteFTP.new @target_loc
|
25
|
+
@remote = RemoteFTP.new @target_loc, log_prefix, @config[:debug_ftps]
|
27
26
|
when URI::FTPES, URI::FTPS
|
28
27
|
log_info "JobTransfer.before target_method FTPES/FTPS"
|
29
|
-
@remote = RemoteFTP.new @target_loc
|
28
|
+
@remote = RemoteFTP.new @target_loc, log_prefix, @config[:debug_ftps], :ftpes
|
30
29
|
when URI::SFTP
|
31
30
|
log_info "JobTransfer.before target_method SFTP"
|
32
|
-
@remote = RemoteSFTP.new @target_loc
|
31
|
+
@remote = RemoteSFTP.new @target_loc, log_prefix, @config[:debug_sftp]
|
32
|
+
when URI::S3
|
33
|
+
log_info "JobTransfer.before target_method S3"
|
34
|
+
@remote = RemoteS3.new @target_loc, log_prefix, @config[:debug_s3]
|
33
35
|
else
|
34
36
|
log_info "JobTransfer.before unknown scheme [#{@target_loc.scheme}]"
|
35
37
|
raise RestFtpDaemon::TargetNotSupported, @target_loc.scheme
|
36
38
|
end
|
37
39
|
|
40
|
+
# Plug this Job into @remote to allow it to log
|
41
|
+
@remote.job = self
|
42
|
+
|
38
43
|
# rescue URI::InvalidURIError => exception
|
39
44
|
# return oops :started, exception, "target_invalid"
|
40
45
|
end
|
@@ -84,7 +89,7 @@ module RestFtpDaemon
|
|
84
89
|
remote_push source, target_final
|
85
90
|
|
86
91
|
# Add it to transferred target names
|
87
|
-
targets << target_final.
|
92
|
+
targets << target_final.name
|
88
93
|
set_info :target, :files, targets
|
89
94
|
|
90
95
|
# Update counters
|
@@ -4,21 +4,27 @@ require 'active_support/core_ext/module/delegation'
|
|
4
4
|
module RestFtpDaemon
|
5
5
|
class Location
|
6
6
|
# Accessors
|
7
|
+
attr_accessor :name
|
8
|
+
|
7
9
|
attr_reader :uri
|
8
10
|
attr_reader :scheme
|
9
11
|
attr_reader :dir
|
10
|
-
|
12
|
+
|
13
|
+
|
14
|
+
attr_reader :aws_region
|
15
|
+
attr_reader :aws_bucket
|
16
|
+
attr_reader :aws_id
|
17
|
+
attr_reader :aws_secret
|
11
18
|
|
12
19
|
# Logging
|
13
20
|
#attr_reader :logger
|
14
21
|
#include BmcDaemonLib::LoggerHelper
|
15
22
|
|
16
23
|
# def_delegators :@uri,
|
17
|
-
delegate :scheme, :host, :user, :password, :to_s,
|
24
|
+
delegate :scheme, :host, :port, :user, :password, :to_s,
|
25
|
+
to: :uri
|
18
26
|
|
19
27
|
def initialize path
|
20
|
-
#@logger = BmcDaemonLib::LoggerPool.instance.get :transfer
|
21
|
-
#log_debug "Location.initialize path[#{path}]"
|
22
28
|
# Strip spaces before/after, copying original "path" at the same time
|
23
29
|
location_uri = path.strip
|
24
30
|
|
@@ -27,12 +33,16 @@ module RestFtpDaemon
|
|
27
33
|
fix_scheme! location_uri
|
28
34
|
|
29
35
|
# Parse URL
|
30
|
-
#log_debug "Location.initialize uri[#{location_uri}]"
|
31
36
|
parse_url location_uri
|
32
37
|
|
38
|
+
# Match AWS URL with BUCKET.s3.amazonaws.com
|
39
|
+
init_aws if @uri.is_a? URI::S3
|
40
|
+
|
41
|
+
# Set default user if not provided
|
42
|
+
init_username
|
43
|
+
|
33
44
|
# Ensure result does not contain tokens after replacement
|
34
45
|
detected_tokens = detect_tokens(location_uri)
|
35
|
-
#log_debug "Location.initialize detected_tokens: #{detected_tokens.inspect}"
|
36
46
|
unless detected_tokens.empty?
|
37
47
|
raise RestFtpDaemon::UnresolvedTokens, detected_tokens.join(' ')
|
38
48
|
end
|
@@ -41,13 +51,6 @@ module RestFtpDaemon
|
|
41
51
|
unless @uri.scheme
|
42
52
|
raise RestFtpDaemon::UnsupportedScheme, url
|
43
53
|
end
|
44
|
-
|
45
|
-
# All done
|
46
|
-
#log_debug "Location.initialize class[#{@uri.class}] scheme[#{@uri.scheme}] dir[#{@dir}] name[#{@name}]"
|
47
|
-
end
|
48
|
-
|
49
|
-
def is? klass
|
50
|
-
@uri.is_a? klass
|
51
54
|
end
|
52
55
|
|
53
56
|
def path
|
@@ -88,7 +91,7 @@ module RestFtpDaemon
|
|
88
91
|
|
89
92
|
# Replace endpoints defined in config
|
90
93
|
vectors.each do |from, to|
|
91
|
-
next if to.to_s.
|
94
|
+
next if to.to_s.empty?
|
92
95
|
path.gsub! tokenize(from), to
|
93
96
|
end
|
94
97
|
end
|
@@ -105,10 +108,9 @@ module RestFtpDaemon
|
|
105
108
|
def parse_url path
|
106
109
|
# Parse that URL
|
107
110
|
@uri = URI.parse path # rescue nil
|
108
|
-
raise RestFtpDaemon::LocationParseError, location_path unless uri
|
111
|
+
raise RestFtpDaemon::LocationParseError, location_path unless @uri
|
109
112
|
|
110
113
|
# Store URL parts
|
111
|
-
# remove_multiple_slashes
|
112
114
|
@ori_path = path
|
113
115
|
@uri_path = uri.path
|
114
116
|
@dir = extract_dirname uri.path
|
@@ -118,6 +120,26 @@ module RestFtpDaemon
|
|
118
120
|
raise RestFtpDaemon::LocationParseError, exception.message unless uri
|
119
121
|
end
|
120
122
|
|
123
|
+
def init_username
|
124
|
+
@uri.user ||= "anonymous"
|
125
|
+
end
|
126
|
+
|
127
|
+
def init_aws
|
128
|
+
# Split hostname
|
129
|
+
parts = @uri.host.split('.')
|
130
|
+
|
131
|
+
# Pop parts
|
132
|
+
aws_tld = parts.pop
|
133
|
+
aws_domain = parts.pop
|
134
|
+
@aws_region = parts.pop
|
135
|
+
aws_tag = parts.pop
|
136
|
+
@aws_bucket = parts.pop
|
137
|
+
|
138
|
+
# Credentials from config
|
139
|
+
@aws_id = Conf.at(:credentials, @uri.host, :id)
|
140
|
+
@aws_secret = Conf.at(:credentials, @uri.host, :secret)
|
141
|
+
end
|
142
|
+
|
121
143
|
def extract_filename path
|
122
144
|
# match everything that's after a slash at the end of the string
|
123
145
|
m = path.match(/\/?([^\/]+)$/)
|
@@ -7,20 +7,33 @@ module RestFtpDaemon
|
|
7
7
|
attr_reader :logger
|
8
8
|
attr_reader :log_prefix
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
10
|
+
attr_accessor :job
|
11
|
+
|
12
|
+
# Delegate set_info info to Job
|
13
|
+
delegate :set_info, to: :job
|
14
|
+
|
15
|
+
def initialize target, log_prefix, debug = false, ftpes = false
|
16
|
+
# Init
|
17
|
+
@target = target
|
18
|
+
@ftpes = ftpes
|
19
|
+
@debug = debug
|
20
|
+
|
21
|
+
# Build and empty job to protect set_info delegation
|
22
|
+
@job = Job.new(nil, {})
|
13
23
|
|
14
24
|
# Logger
|
15
25
|
@log_prefix = log_prefix || {}
|
16
26
|
@logger = BmcDaemonLib::LoggerPool.instance.get :transfer
|
17
27
|
|
18
|
-
# Extract URL parts
|
19
|
-
@url = url
|
20
|
-
@url.user ||= "anonymous"
|
21
|
-
|
22
28
|
# Annnounce object
|
23
|
-
log_info "Remote.initialize [#{
|
29
|
+
log_info "Remote.initialize [#{target.path}]"
|
30
|
+
log_debug "Remote.initialize target[#{@target.inspect}]"
|
31
|
+
|
32
|
+
# Prepare real object
|
33
|
+
prepare
|
34
|
+
end
|
35
|
+
|
36
|
+
def prepare
|
24
37
|
end
|
25
38
|
|
26
39
|
def connect
|
@@ -29,12 +42,16 @@ module RestFtpDaemon
|
|
29
42
|
puts
|
30
43
|
puts "-------------------- SESSION STARTING -------------------------"
|
31
44
|
puts "class\t #{myname}"
|
32
|
-
puts "host\t #{@
|
33
|
-
puts "user\t #{@
|
34
|
-
puts "port\t #{@
|
35
|
-
puts "options\t #{@options.inspect}"
|
45
|
+
puts "host\t #{@target.host}"
|
46
|
+
puts "user\t #{@target.user}"
|
47
|
+
puts "port\t #{@target.port}"
|
36
48
|
puts "---------------------------------------------------------------"
|
49
|
+
end
|
50
|
+
|
51
|
+
def chdir_or_create directory, mkdir = false
|
52
|
+
end
|
37
53
|
|
54
|
+
def remove! target
|
38
55
|
end
|
39
56
|
|
40
57
|
def close
|
@@ -8,12 +8,9 @@ module RestFtpDaemon
|
|
8
8
|
# Class options
|
9
9
|
attr_reader :ftp
|
10
10
|
|
11
|
-
def
|
12
|
-
# Call super
|
13
|
-
super
|
14
|
-
|
11
|
+
def prepare
|
15
12
|
# Create FTP object
|
16
|
-
if
|
13
|
+
if @ftpes
|
17
14
|
prepare_ftpes
|
18
15
|
else
|
19
16
|
prepare_ftp
|
@@ -25,14 +22,14 @@ module RestFtpDaemon
|
|
25
22
|
@chunk_size = DEFAULT_FTP_CHUNK.to_i * 1024
|
26
23
|
|
27
24
|
# Announce object
|
28
|
-
log_debug "RemoteFTP.
|
25
|
+
log_debug "RemoteFTP.prepare chunk_size:#{@chunk_size}"
|
29
26
|
end
|
30
27
|
|
31
28
|
def connect
|
32
29
|
# Connect remote server
|
33
30
|
super
|
34
|
-
@ftp.connect @
|
35
|
-
@ftp.login @
|
31
|
+
@ftp.connect @target.host, @target.port
|
32
|
+
@ftp.login @target.user, @target.password
|
36
33
|
end
|
37
34
|
|
38
35
|
def present? target
|
@@ -88,7 +85,7 @@ module RestFtpDaemon
|
|
88
85
|
|
89
86
|
def push source, target, tempname = nil, &callback
|
90
87
|
# Push init
|
91
|
-
raise RestFtpDaemon::AssertionFailed, "push/
|
88
|
+
raise RestFtpDaemon::AssertionFailed, "push/ftp" if @ftp.nil?
|
92
89
|
|
93
90
|
# Temp file if provided
|
94
91
|
destination = target.clone
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'aws-sdk-resources'
|
2
|
+
|
3
|
+
# Handle sFTP transfers for Remote class
|
4
|
+
module RestFtpDaemon
|
5
|
+
class RemoteS3 < Remote
|
6
|
+
|
7
|
+
# Class options
|
8
|
+
attr_reader :client
|
9
|
+
attr_reader :target
|
10
|
+
|
11
|
+
def prepare
|
12
|
+
log_debug "RemoteS3.prepare target[#{@target.inspect}]"
|
13
|
+
end
|
14
|
+
|
15
|
+
def connect
|
16
|
+
# Connect init
|
17
|
+
super
|
18
|
+
log_debug "RemoteS3.connect [#{@target.aws_id}]@[#{@target.aws_bucket}]"
|
19
|
+
|
20
|
+
# Debug level
|
21
|
+
verbosity = @debug ? Logger::DEBUG : false
|
22
|
+
|
23
|
+
# Connect remote server
|
24
|
+
@client = Aws::S3::Resource.new(
|
25
|
+
region: @target.aws_region,
|
26
|
+
credentials: Aws::Credentials.new(@target.aws_id, @target.aws_secret)
|
27
|
+
)
|
28
|
+
end
|
29
|
+
|
30
|
+
def push source, target, tempname = nil, &callback
|
31
|
+
# Push init
|
32
|
+
raise RestFtpDaemon::AssertionFailed, "push/client" if @client.nil?
|
33
|
+
log_debug "RemoteS3.push bucket[#{target.aws_bucket}] name[#{target.name}]"
|
34
|
+
|
35
|
+
# Do the transfer
|
36
|
+
bucket = @client.bucket(target.aws_bucket)
|
37
|
+
object = bucket.object(target.name)
|
38
|
+
object.put(body:'Hello World!')
|
39
|
+
|
40
|
+
# Dump information about this file
|
41
|
+
log_debug "RemoteS3.push url[#{object.public_url}]"
|
42
|
+
log_debug "RemoteS3.push etag[#{object.etag}]"
|
43
|
+
set_info :target, :aws_public_url, object.public_url
|
44
|
+
set_info :target, :aws_etag, object.etag
|
45
|
+
end
|
46
|
+
|
47
|
+
def connected?
|
48
|
+
!@client.nil?
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
@@ -7,27 +7,22 @@ module RestFtpDaemon
|
|
7
7
|
# Class options
|
8
8
|
attr_reader :sftp
|
9
9
|
|
10
|
-
def
|
11
|
-
# Call super
|
12
|
-
super
|
13
|
-
|
14
|
-
# Announce object
|
15
|
-
log_debug "RemoteSFTP.initialize"
|
10
|
+
def prepare
|
16
11
|
end
|
17
12
|
|
18
13
|
def connect
|
19
14
|
# Connect init
|
20
15
|
super
|
21
|
-
log_debug "RemoteSFTP.connect [#{@
|
16
|
+
log_debug "RemoteSFTP.connect [#{@target.user}]@[#{@target.host}]:[#{@target.port}]"
|
22
17
|
|
23
18
|
# Debug level
|
24
19
|
verbosity = @debug ? Logger::DEBUG : false
|
25
20
|
|
26
21
|
# Connect remote server
|
27
|
-
@sftp = Net::SFTP.start(@
|
28
|
-
password: @
|
22
|
+
@sftp = Net::SFTP.start(@target.host.to_s, @target.user.to_s,
|
23
|
+
password: @target.password.to_s,
|
29
24
|
verbose: verbosity,
|
30
|
-
port: @
|
25
|
+
port: @target.port,
|
31
26
|
non_interactive: true,
|
32
27
|
timeout: DEFAULT_SFTP_TIMEOUT
|
33
28
|
)
|
@@ -93,7 +88,7 @@ module RestFtpDaemon
|
|
93
88
|
|
94
89
|
def push source, target, tempname = nil, &callback
|
95
90
|
# Push init
|
96
|
-
raise RestFtpDaemon::AssertionFailed, "push/
|
91
|
+
raise RestFtpDaemon::AssertionFailed, "push/sftp" if @sftp.nil?
|
97
92
|
|
98
93
|
# Temp file if provided
|
99
94
|
destination = target.clone
|
data/rest-ftp-daemon.gemspec
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
Gem::Specification.new do |spec|
|
3
3
|
|
4
4
|
# Project version
|
5
|
-
spec.version = "0.
|
5
|
+
spec.version = "0.420.1"
|
6
6
|
|
7
7
|
# Project description
|
8
8
|
spec.name = "rest-ftp-daemon"
|
@@ -56,6 +56,7 @@ Gem::Specification.new do |spec|
|
|
56
56
|
|
57
57
|
spec.add_runtime_dependency "net-sftp"
|
58
58
|
spec.add_runtime_dependency "double-bag-ftps"
|
59
|
+
spec.add_runtime_dependency "aws-sdk-resources", '~> 2'
|
59
60
|
|
60
61
|
spec.add_runtime_dependency "streamio-ffmpeg"
|
61
62
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rest-ftp-daemon
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.420.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bruno MEDICI
|
@@ -360,6 +360,20 @@ dependencies:
|
|
360
360
|
- - ">="
|
361
361
|
- !ruby/object:Gem::Version
|
362
362
|
version: '0'
|
363
|
+
- !ruby/object:Gem::Dependency
|
364
|
+
name: aws-sdk-resources
|
365
|
+
requirement: !ruby/object:Gem::Requirement
|
366
|
+
requirements:
|
367
|
+
- - "~>"
|
368
|
+
- !ruby/object:Gem::Version
|
369
|
+
version: '2'
|
370
|
+
type: :runtime
|
371
|
+
prerelease: false
|
372
|
+
version_requirements: !ruby/object:Gem::Requirement
|
373
|
+
requirements:
|
374
|
+
- - "~>"
|
375
|
+
- !ruby/object:Gem::Version
|
376
|
+
version: '2'
|
363
377
|
- !ruby/object:Gem::Dependency
|
364
378
|
name: streamio-ffmpeg
|
365
379
|
requirement: !ruby/object:Gem::Requirement
|
@@ -422,8 +436,10 @@ files:
|
|
422
436
|
- lib/rest-ftp-daemon/metrics.rb
|
423
437
|
- lib/rest-ftp-daemon/notification.rb
|
424
438
|
- lib/rest-ftp-daemon/paginate.rb
|
439
|
+
- lib/rest-ftp-daemon/pretty_json.rb
|
425
440
|
- lib/rest-ftp-daemon/remote.rb
|
426
441
|
- lib/rest-ftp-daemon/remote_ftp.rb
|
442
|
+
- lib/rest-ftp-daemon/remote_s3.rb
|
427
443
|
- lib/rest-ftp-daemon/remote_sftp.rb
|
428
444
|
- lib/rest-ftp-daemon/static/config.json
|
429
445
|
- lib/rest-ftp-daemon/static/css/bootstrap.min.css
|