rest-ftp-daemon 0.502.2 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.dockerignore +7 -0
- data/Dockerfile +18 -7
- data/Gemfile.lock +10 -10
- data/lib/rest-ftp-daemon.rb +6 -3
- data/lib/rest-ftp-daemon/helpers/transfer.rb +122 -0
- data/lib/rest-ftp-daemon/jobs/transfer.rb +2 -119
- data/lib/tasks/dockerize.rake +4 -3
- data/rest-ftp-daemon.gemspec +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a5e2703802ed5c64bd834898aa2e689a03e7db00
|
4
|
+
data.tar.gz: bd4dd0c7f81f402269e088c66d25fefa54b44da1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 912d7b5bf50aef05ca5627d18602a5403bfb3fe6ee3ac6e2ff3d7d0da24cf8ed8bcd23a9deaf9f27338563ba8da1e7589632eaa6475c595c0c7b7f42b9fec19e
|
7
|
+
data.tar.gz: 68e8fdc3ad403729d459a497762032baf56e8634e6b198b7492f5343c897198b358a6f3736a0f7e5ac3cfc6db4d13ab47ad26f5a9bec4ce915376a0d6349ca3d
|
data/.dockerignore
ADDED
data/Dockerfile
CHANGED
@@ -1,21 +1,32 @@
|
|
1
1
|
# Docker headers
|
2
2
|
FROM ruby:2.3.0-slim
|
3
3
|
MAINTAINER Bruno MEDICI <rest-ftp-daemon@bmconseil.com>
|
4
|
+
|
5
|
+
|
6
|
+
# Environment
|
4
7
|
ENV LANG=C.UTF-8
|
8
|
+
ENV INSTALL_PATH /app/
|
9
|
+
ENV app /app/
|
5
10
|
|
6
11
|
|
7
12
|
# Install packages, and first app gem for caching history only
|
8
13
|
RUN apt-get update && apt-get install -y build-essential git --fix-missing --no-install-recommends
|
9
|
-
RUN gem install
|
14
|
+
RUN gem install bundler --no-rdoc --no-ri
|
15
|
+
|
10
16
|
|
17
|
+
# Change to INSTALL_PATH and install base packages
|
18
|
+
WORKDIR $INSTALL_PATH
|
19
|
+
ADD Gemfile $INSTALL_PATH
|
20
|
+
ADD Gemfile.lock $INSTALL_PATH
|
21
|
+
ADD rest-ftp-daemon.gemspec $INSTALL_PATH
|
22
|
+
RUN bundle install --system --without="development test" -j4
|
11
23
|
|
12
|
-
|
13
|
-
|
14
|
-
RUN
|
15
|
-
|
24
|
+
|
25
|
+
# Install app code
|
26
|
+
RUN mkdir -p $INSTALL_PATH
|
27
|
+
ADD . $INSTALL_PATH
|
16
28
|
|
17
29
|
|
18
30
|
# App run
|
19
31
|
EXPOSE 3000
|
20
|
-
CMD ["
|
21
|
-
|
32
|
+
CMD ["bin/rest-ftp-daemon", "-p", "3000", "-f", "start"]
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
rest-ftp-daemon (0.
|
4
|
+
rest-ftp-daemon (1.0.1)
|
5
5
|
activesupport (~> 4.2)
|
6
6
|
api-auth
|
7
7
|
aws-sdk-resources (~> 2)
|
@@ -38,17 +38,17 @@ GEM
|
|
38
38
|
public_suffix (~> 2.0, >= 2.0.2)
|
39
39
|
api-auth (2.0.1)
|
40
40
|
ast (2.3.0)
|
41
|
-
aws-sdk-core (2.6.
|
41
|
+
aws-sdk-core (2.6.32)
|
42
42
|
aws-sigv4 (~> 1.0)
|
43
43
|
jmespath (~> 1.0)
|
44
|
-
aws-sdk-resources (2.6.
|
45
|
-
aws-sdk-core (= 2.6.
|
44
|
+
aws-sdk-resources (2.6.32)
|
45
|
+
aws-sdk-core (= 2.6.32)
|
46
46
|
aws-sigv4 (1.0.0)
|
47
47
|
axiom-types (0.1.1)
|
48
48
|
descendants_tracker (~> 0.0.4)
|
49
49
|
ice_nine (~> 0.11.0)
|
50
50
|
thread_safe (~> 0.3, >= 0.3.1)
|
51
|
-
bmc-daemon-lib (0.5.
|
51
|
+
bmc-daemon-lib (0.5.3)
|
52
52
|
chamber (~> 2.9.1)
|
53
53
|
builder (3.2.2)
|
54
54
|
chamber (2.9.1)
|
@@ -85,7 +85,7 @@ GEM
|
|
85
85
|
grape-entity (0.6.0)
|
86
86
|
activesupport
|
87
87
|
multi_json (>= 1.3.2)
|
88
|
-
grape-swagger (0.25.
|
88
|
+
grape-swagger (0.25.2)
|
89
89
|
grape (>= 0.12.0)
|
90
90
|
grape-swagger-entity (0.1.5)
|
91
91
|
grape-entity
|
@@ -111,7 +111,7 @@ GEM
|
|
111
111
|
json (1.8.3)
|
112
112
|
method_source (0.8.2)
|
113
113
|
mime-types (2.99.3)
|
114
|
-
minitest (5.
|
114
|
+
minitest (5.10.1)
|
115
115
|
multi_json (1.12.1)
|
116
116
|
multi_xml (0.5.5)
|
117
117
|
mustermann (0.4.0)
|
@@ -123,7 +123,7 @@ GEM
|
|
123
123
|
net-ssh (3.2.0)
|
124
124
|
netrc (0.11.0)
|
125
125
|
newrelic_rpm (3.17.1.326)
|
126
|
-
parser (2.3.3.
|
126
|
+
parser (2.3.3.1)
|
127
127
|
ast (~> 2.2)
|
128
128
|
powerpack (0.1.1)
|
129
129
|
pry (0.10.4)
|
@@ -136,7 +136,7 @@ GEM
|
|
136
136
|
rack (>= 0.4)
|
137
137
|
rainbow (2.1.0)
|
138
138
|
rake (11.3.0)
|
139
|
-
representable (3.0.
|
139
|
+
representable (3.0.2)
|
140
140
|
declarative (~> 0.0.5)
|
141
141
|
uber (>= 0.0.15, < 0.2.0)
|
142
142
|
rest-client (1.8.0)
|
@@ -158,7 +158,7 @@ GEM
|
|
158
158
|
diff-lcs (>= 1.2.0, < 2.0)
|
159
159
|
rspec-support (~> 3.5.0)
|
160
160
|
rspec-support (3.5.0)
|
161
|
-
rubocop (0.
|
161
|
+
rubocop (0.46.0)
|
162
162
|
parser (>= 2.3.1.1, < 3.0)
|
163
163
|
powerpack (~> 0.1)
|
164
164
|
rainbow (>= 1.99.1, < 3.0)
|
data/lib/rest-ftp-daemon.rb
CHANGED
@@ -15,12 +15,15 @@ require_relative "shared/patch_array"
|
|
15
15
|
require_relative "shared/patch_haml"
|
16
16
|
require_relative "shared/patch_file"
|
17
17
|
|
18
|
-
#
|
19
|
-
require_relative "rest-ftp-daemon/constants"
|
20
|
-
require_relative "rest-ftp-daemon/exceptions"
|
18
|
+
# Helpers
|
21
19
|
require_relative "rest-ftp-daemon/helpers/common"
|
22
20
|
require_relative "rest-ftp-daemon/helpers/views"
|
23
21
|
require_relative "rest-ftp-daemon/helpers/api"
|
22
|
+
require_relative "rest-ftp-daemon/helpers/transfer"
|
23
|
+
|
24
|
+
# Project's libs
|
25
|
+
require_relative "rest-ftp-daemon/constants"
|
26
|
+
require_relative "rest-ftp-daemon/exceptions"
|
24
27
|
require_relative "rest-ftp-daemon/metrics"
|
25
28
|
require_relative "rest-ftp-daemon/paginate"
|
26
29
|
require_relative "rest-ftp-daemon/uri"
|
@@ -0,0 +1,122 @@
|
|
1
|
+
module RestFtpDaemon
|
2
|
+
module TransferHelpers
|
3
|
+
|
4
|
+
def remote_upload source, target
|
5
|
+
# Method assertions
|
6
|
+
raise RestFtpDaemon::AssertionFailed, "remote_upload/remote" if @remote.nil?
|
7
|
+
raise RestFtpDaemon::AssertionFailed, "remote_upload/source" if source.nil?
|
8
|
+
raise RestFtpDaemon::AssertionFailed, "remote_upload/target" if target.nil?
|
9
|
+
|
10
|
+
# Use source filename if target path provided none (typically with multiple sources)
|
11
|
+
log_info "remote_upload temp[#{@tempfile}] source[#{source.path}] target[#{target.path}]"
|
12
|
+
set_info INFO_SOURCE_CURRENT, source.name
|
13
|
+
|
14
|
+
# Remove any existing version if present, or check if it's there
|
15
|
+
if @overwrite
|
16
|
+
@remote.remove! target
|
17
|
+
elsif (size = @remote.size_if_exists(target)) # won't be triggered when NIL or 0 is returned
|
18
|
+
log_debug "remote_upload file exists ! (#{format_bytes size, 'B'})"
|
19
|
+
raise RestFtpDaemon::TargetFileExists
|
20
|
+
end
|
21
|
+
|
22
|
+
# Start transfer
|
23
|
+
transfer_started_at = Time.now
|
24
|
+
@last_notify_at = transfer_started_at
|
25
|
+
|
26
|
+
# Start the transfer, update job status after each block transfer
|
27
|
+
set_status JOB_STATUS_UPLOADING
|
28
|
+
@remote.upload source, target, @tempfile do |transferred, name|
|
29
|
+
# Update transfer statistics
|
30
|
+
update_progress transferred, name
|
31
|
+
end
|
32
|
+
|
33
|
+
# Compute final bitrate
|
34
|
+
global_transfer_bitrate = get_bitrate @transfer_total, (Time.now - transfer_started_at)
|
35
|
+
set_info INFO_TRANFER_BITRATE, global_transfer_bitrate.round(0)
|
36
|
+
|
37
|
+
# Done
|
38
|
+
set_info INFO_SOURCE_CURRENT, nil
|
39
|
+
end
|
40
|
+
|
41
|
+
def update_progress transferred, name = ""
|
42
|
+
# Update counters
|
43
|
+
@transfer_sent += transferred
|
44
|
+
set_info INFO_TRANFER_SENT, @transfer_sent
|
45
|
+
|
46
|
+
# Update job info
|
47
|
+
percent0 = (100.0 * @transfer_sent / @transfer_total).round(0)
|
48
|
+
set_info INFO_TRANFER_PROGRESS, percent0
|
49
|
+
|
50
|
+
# Update bitrates
|
51
|
+
@current_bitrate = running_bitrate @transfer_sent
|
52
|
+
set_info INFO_TRANFER_BITRATE, @current_bitrate.round(0)
|
53
|
+
|
54
|
+
# What's current time ?
|
55
|
+
now = Time.now
|
56
|
+
|
57
|
+
# Notify if requested
|
58
|
+
progress_notify now, percent0, name
|
59
|
+
|
60
|
+
# Touch my worker status
|
61
|
+
touch_job
|
62
|
+
end
|
63
|
+
|
64
|
+
private
|
65
|
+
|
66
|
+
def progress_notify now, percent0, name
|
67
|
+
# No delay provided ?
|
68
|
+
return if @config[:notify_after].nil?
|
69
|
+
|
70
|
+
# Still too early to notify again ?
|
71
|
+
how_long_ago = (now.to_f - @last_notify_at.to_f)
|
72
|
+
return unless how_long_ago > @config[:notify_after]
|
73
|
+
|
74
|
+
# # Update bitrates
|
75
|
+
# @current_bitrate = running_bitrate @transfer_sent
|
76
|
+
# set_info INFO_TRANFER_BITRATE, @current_bitrate.round(0)
|
77
|
+
|
78
|
+
# Log progress
|
79
|
+
stack = [
|
80
|
+
"#{percent0} %",
|
81
|
+
format_bytes(@transfer_sent, "B"),
|
82
|
+
format_bytes(@current_bitrate.round(0), "bps")
|
83
|
+
]
|
84
|
+
stack2 = stack.map { |txt| ("%#{LOG_PIPE_LEN.to_i}s" % txt) }.join("\t")
|
85
|
+
log_info "progress #{stack2} \t#{name}"
|
86
|
+
|
87
|
+
# Prepare and send notification
|
88
|
+
client_notify :progress, status: {
|
89
|
+
progress: percent0,
|
90
|
+
transfer_sent: @transfer_sent,
|
91
|
+
transfer_total: @transfer_total,
|
92
|
+
transfer_bitrate: @current_bitrate.round(0),
|
93
|
+
transfer_current: name,
|
94
|
+
}
|
95
|
+
|
96
|
+
# Remember when we last did it
|
97
|
+
@last_notify_at = now
|
98
|
+
end
|
99
|
+
|
100
|
+
def get_bitrate delta_data, delta_time
|
101
|
+
return nil if delta_time.nil? || delta_time.zero?
|
102
|
+
8 * delta_data.to_f.to_f / delta_time
|
103
|
+
end
|
104
|
+
|
105
|
+
def running_bitrate current_data
|
106
|
+
return if @last_time.nil?
|
107
|
+
|
108
|
+
# Compute deltas
|
109
|
+
@last_data ||= 0
|
110
|
+
delta_data = current_data - @last_data
|
111
|
+
delta_time = Time.now - @last_time
|
112
|
+
|
113
|
+
# Update counters
|
114
|
+
@last_time = Time.now
|
115
|
+
@last_data = current_data
|
116
|
+
|
117
|
+
# Return bitrate
|
118
|
+
get_bitrate delta_data, delta_time
|
119
|
+
end
|
120
|
+
|
121
|
+
end
|
122
|
+
end
|
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
module RestFtpDaemon
|
4
4
|
class JobTransfer < Job
|
5
|
+
include TransferHelpers
|
5
6
|
|
6
7
|
protected
|
7
8
|
|
@@ -111,126 +112,8 @@ module RestFtpDaemon
|
|
111
112
|
RestFtpDaemon::Counters.instance.add :data, :transferred, @transfer_total
|
112
113
|
end
|
113
114
|
|
114
|
-
def remote_upload source, target
|
115
|
-
# Method assertions
|
116
|
-
raise RestFtpDaemon::AssertionFailed, "remote_upload/remote" if @remote.nil?
|
117
|
-
raise RestFtpDaemon::AssertionFailed, "remote_upload/source" if source.nil?
|
118
|
-
raise RestFtpDaemon::AssertionFailed, "remote_upload/target" if target.nil?
|
119
|
-
|
120
|
-
# Use source filename if target path provided none (typically with multiple sources)
|
121
|
-
log_info "remote_upload temp[#{@tempfile}] source[#{source.path}] target[#{target.path}]"
|
122
|
-
set_info INFO_SOURCE_CURRENT, source.name
|
123
|
-
|
124
|
-
# Remove any existing version if present, or check if it's there
|
125
|
-
if @overwrite
|
126
|
-
@remote.remove! target
|
127
|
-
elsif (size = @remote.size_if_exists(target)) # won't be triggered when NIL or 0 is returned
|
128
|
-
log_debug "remote_upload file exists ! (#{format_bytes size, 'B'})"
|
129
|
-
raise RestFtpDaemon::TargetFileExists
|
130
|
-
end
|
131
|
-
|
132
|
-
# Start transfer
|
133
|
-
transfer_started_at = Time.now
|
134
|
-
@last_notify_at = transfer_started_at
|
135
|
-
|
136
|
-
# Start the transfer, update job status after each block transfer
|
137
|
-
set_status JOB_STATUS_UPLOADING
|
138
|
-
@remote.upload source, target, @tempfile do |transferred, name|
|
139
|
-
# Update transfer statistics
|
140
|
-
update_progress transferred, name
|
141
|
-
end
|
142
|
-
|
143
|
-
# Compute final bitrate
|
144
|
-
global_transfer_bitrate = get_bitrate @transfer_total, (Time.now - transfer_started_at)
|
145
|
-
set_info INFO_TRANFER_BITRATE, global_transfer_bitrate.round(0)
|
146
|
-
|
147
|
-
# Done
|
148
|
-
set_info INFO_SOURCE_CURRENT, nil
|
149
|
-
end
|
150
|
-
|
151
|
-
def update_progress transferred, name = ""
|
152
|
-
# Update counters
|
153
|
-
@transfer_sent += transferred
|
154
|
-
set_info INFO_TRANFER_SENT, @transfer_sent
|
155
|
-
|
156
|
-
# Update job info
|
157
|
-
percent0 = (100.0 * @transfer_sent / @transfer_total).round(0)
|
158
|
-
set_info INFO_TRANFER_PROGRESS, percent0
|
159
|
-
|
160
|
-
# Update bitrates
|
161
|
-
@current_bitrate = running_bitrate @transfer_sent
|
162
|
-
set_info INFO_TRANFER_BITRATE, @current_bitrate.round(0)
|
163
|
-
|
164
|
-
# What's current time ?
|
165
|
-
now = Time.now
|
166
|
-
|
167
|
-
# Notify if requested
|
168
|
-
progress_notify now, percent0, name
|
169
|
-
|
170
|
-
# Touch my worker status
|
171
|
-
touch_job
|
172
|
-
end
|
173
|
-
|
174
|
-
private
|
175
|
-
|
176
|
-
def progress_notify now, percent0, name
|
177
|
-
# No delay provided ?
|
178
|
-
return if @config[:notify_after].nil?
|
179
|
-
|
180
|
-
# Still too early to notify again ?
|
181
|
-
how_long_ago = (now.to_f - @last_notify_at.to_f)
|
182
|
-
return unless how_long_ago > @config[:notify_after]
|
183
|
-
|
184
|
-
# # Update bitrates
|
185
|
-
# @current_bitrate = running_bitrate @transfer_sent
|
186
|
-
# set_info INFO_TRANFER_BITRATE, @current_bitrate.round(0)
|
187
|
-
|
188
|
-
# Log progress
|
189
|
-
stack = [
|
190
|
-
"#{percent0} %",
|
191
|
-
format_bytes(@transfer_sent, "B"),
|
192
|
-
format_bytes(@current_bitrate.round(0), "bps")
|
193
|
-
]
|
194
|
-
stack2 = stack.map { |txt| ("%#{LOG_PIPE_LEN.to_i}s" % txt) }.join("\t")
|
195
|
-
log_info "progress #{stack2} \t#{name}"
|
196
|
-
|
197
|
-
# Prepare and send notification
|
198
|
-
client_notify :progress, status: {
|
199
|
-
progress: percent0,
|
200
|
-
transfer_sent: @transfer_sent,
|
201
|
-
transfer_total: @transfer_total,
|
202
|
-
transfer_bitrate: @current_bitrate.round(0),
|
203
|
-
transfer_current: name,
|
204
|
-
}
|
205
|
-
|
206
|
-
# Remember when we last did it
|
207
|
-
@last_notify_at = now
|
208
|
-
end
|
209
|
-
|
210
|
-
def get_bitrate delta_data, delta_time
|
211
|
-
return nil if delta_time.nil? || delta_time.zero?
|
212
|
-
8 * delta_data.to_f.to_f / delta_time
|
213
|
-
end
|
214
|
-
|
215
|
-
def running_bitrate current_data
|
216
|
-
return if @last_time.nil?
|
217
|
-
|
218
|
-
# Compute deltas
|
219
|
-
@last_data ||= 0
|
220
|
-
delta_data = current_data - @last_data
|
221
|
-
delta_time = Time.now - @last_time
|
222
|
-
|
223
|
-
# Update counters
|
224
|
-
@last_time = Time.now
|
225
|
-
@last_data = current_data
|
226
|
-
|
227
|
-
# Return bitrate
|
228
|
-
get_bitrate delta_data, delta_time
|
229
|
-
end
|
230
|
-
end
|
231
|
-
|
232
115
|
# NewRelic instrumentation
|
233
116
|
# add_transaction_tracer :prepare, category: :task
|
234
117
|
# add_transaction_tracer :run, category: :task
|
235
|
-
|
118
|
+
end
|
236
119
|
end
|
data/lib/tasks/dockerize.rake
CHANGED
@@ -1,18 +1,19 @@
|
|
1
|
-
DOCKER_REPO = "
|
1
|
+
DOCKER_REPO = "bmconseil/rest-ftp-daemon"
|
2
2
|
|
3
3
|
desc "Build docker image from latest tag"
|
4
4
|
|
5
5
|
task :dockerize => [] do
|
6
6
|
version = `git describe --tags`.strip
|
7
|
+
version += "-dev"
|
7
8
|
|
8
9
|
puts
|
9
10
|
puts "* build [#{version}]"
|
11
|
+
# sh "docker build --build-arg GEM_VERSION=#{version} . -t '#{DOCKER_REPO}:#{version}' -t '#{DOCKER_REPO}:latest'"
|
10
12
|
sh "docker build . -t '#{DOCKER_REPO}:#{version}' -t '#{DOCKER_REPO}:latest'"
|
11
13
|
|
12
14
|
puts
|
13
|
-
puts "* push to
|
15
|
+
puts "* push to [#{DOCKER_REPO}]"
|
14
16
|
sh "docker push #{DOCKER_REPO}:#{version}"
|
15
17
|
sh "docker push #{DOCKER_REPO}:latest"
|
16
|
-
|
17
18
|
puts
|
18
19
|
end
|
data/rest-ftp-daemon.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rest-ftp-daemon
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bruno MEDICI
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-12-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -411,6 +411,7 @@ extensions: []
|
|
411
411
|
extra_rdoc_files: []
|
412
412
|
files:
|
413
413
|
- ".codeclimate.yml"
|
414
|
+
- ".dockerignore"
|
414
415
|
- ".gitignore"
|
415
416
|
- ".rspec"
|
416
417
|
- ".rubocop.yml"
|
@@ -439,6 +440,7 @@ files:
|
|
439
440
|
- lib/rest-ftp-daemon/exceptions.rb
|
440
441
|
- lib/rest-ftp-daemon/helpers/api.rb
|
441
442
|
- lib/rest-ftp-daemon/helpers/common.rb
|
443
|
+
- lib/rest-ftp-daemon/helpers/transfer.rb
|
442
444
|
- lib/rest-ftp-daemon/helpers/views.rb
|
443
445
|
- lib/rest-ftp-daemon/initialize.rb
|
444
446
|
- lib/rest-ftp-daemon/job.rb
|