rest-ftp-daemon 0.502.2 → 1.0.1
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.
- 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
|