rest-ftp-daemon 0.435.2 → 0.501.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.
- checksums.yaml +4 -4
- data/Gemfile.lock +35 -29
- data/config.ru +1 -1
- data/defaults.yml +16 -12
- data/lib/rest-ftp-daemon.rb +1 -0
- data/lib/rest-ftp-daemon/api/config.rb +1 -2
- data/lib/rest-ftp-daemon/api/dashboard.rb +6 -4
- data/lib/rest-ftp-daemon/api/debug.rb +6 -5
- data/lib/rest-ftp-daemon/api/jobs.rb +1 -1
- data/lib/rest-ftp-daemon/api/root.rb +11 -10
- data/lib/rest-ftp-daemon/api/status.rb +1 -1
- data/lib/rest-ftp-daemon/constants.rb +12 -3
- data/lib/rest-ftp-daemon/counters.rb +1 -1
- data/lib/rest-ftp-daemon/entities/job.rb +1 -5
- data/lib/rest-ftp-daemon/entities/location.rb +4 -3
- data/lib/rest-ftp-daemon/entities/options.rb +1 -1
- data/lib/rest-ftp-daemon/exceptions.rb +1 -1
- data/lib/rest-ftp-daemon/helpers/api.rb +1 -1
- data/lib/rest-ftp-daemon/helpers/common.rb +1 -1
- data/lib/rest-ftp-daemon/helpers/views.rb +29 -10
- data/lib/rest-ftp-daemon/initialize.rb +1 -1
- data/lib/rest-ftp-daemon/job.rb +11 -13
- data/lib/rest-ftp-daemon/job_queue.rb +9 -10
- data/lib/rest-ftp-daemon/jobs/dummy.rb +1 -1
- data/lib/rest-ftp-daemon/jobs/errors.rb +13 -15
- data/lib/rest-ftp-daemon/jobs/transfer.rb +15 -15
- data/lib/rest-ftp-daemon/jobs/video.rb +7 -7
- data/lib/rest-ftp-daemon/launcher.rb +1 -1
- data/lib/rest-ftp-daemon/location.rb +91 -67
- data/lib/rest-ftp-daemon/metrics.rb +2 -2
- data/lib/rest-ftp-daemon/notification.rb +1 -1
- data/lib/rest-ftp-daemon/paginate.rb +1 -1
- data/lib/rest-ftp-daemon/remote/base.rb +8 -3
- data/lib/rest-ftp-daemon/remote/ftp.rb +18 -18
- data/lib/rest-ftp-daemon/remote/s3.rb +100 -41
- data/lib/rest-ftp-daemon/remote/sftp.rb +15 -15
- data/lib/rest-ftp-daemon/static/css/main.css +34 -4
- data/lib/rest-ftp-daemon/uri.rb +1 -1
- data/lib/rest-ftp-daemon/views/dashboard.haml +1 -1
- data/lib/rest-ftp-daemon/views/dashboard_counters.haml +1 -1
- data/lib/rest-ftp-daemon/views/dashboard_footer.haml +1 -1
- data/lib/rest-ftp-daemon/views/dashboard_header.haml +1 -1
- data/lib/rest-ftp-daemon/views/dashboard_jobs.haml +1 -2
- data/lib/rest-ftp-daemon/views/dashboard_rates.haml +1 -1
- data/lib/rest-ftp-daemon/views/dashboard_table.haml +8 -5
- data/lib/rest-ftp-daemon/views/dashboard_tokens.haml +1 -1
- data/lib/rest-ftp-daemon/views/dashboard_workers.haml +1 -1
- data/lib/rest-ftp-daemon/worker_pool.rb +2 -2
- data/lib/rest-ftp-daemon/workers/conchita.rb +1 -1
- data/lib/rest-ftp-daemon/workers/reporter.rb +1 -1
- data/lib/rest-ftp-daemon/workers/transfer.rb +3 -3
- data/lib/rest-ftp-daemon/workers/worker.rb +1 -1
- data/lib/shared/patch_file.rb +5 -0
- data/rest-ftp-daemon.gemspec +2 -2
- data/spec/spec_helper.rb +2 -1
- data/spec/support/request_helpers.rb +1 -1
- metadata +6 -5
@@ -29,7 +29,7 @@ module RestFtpDaemon
|
|
29
29
|
def do_work
|
30
30
|
# Guess source files from disk
|
31
31
|
set_status JOB_STATUS_TRANSFORMING
|
32
|
-
sources = @source_loc.
|
32
|
+
sources = @source_loc.local_files
|
33
33
|
raise RestFtpDaemon::SourceNotFound if sources.empty?
|
34
34
|
|
35
35
|
# Add the source file name if none found in the target path
|
@@ -38,8 +38,9 @@ module RestFtpDaemon
|
|
38
38
|
log_info "JobVideo.work target_final.path [#{target_final.path}]"
|
39
39
|
|
40
40
|
# Ensure target directory exists
|
41
|
-
|
42
|
-
|
41
|
+
t_dir = @target_loc.filedir
|
42
|
+
log_info "JobVideo.work mkdir_p [#{t_dir}]"
|
43
|
+
FileUtils.mkdir_p t_dir
|
43
44
|
|
44
45
|
# Do the work, for each file
|
45
46
|
set_info INFO_SOURCE_CURRENT, @source_loc.name
|
@@ -81,10 +82,10 @@ module RestFtpDaemon
|
|
81
82
|
log_info "JobVideo.ffmpeg_command [#{FFMPEG.ffmpeg_binary}] [#{source.name}] > [#{target.name}]", options
|
82
83
|
|
83
84
|
# Build command
|
84
|
-
movie.transcode(target.
|
85
|
+
movie.transcode(target.filepath, options) do |ffmpeg_progress|
|
85
86
|
# set_info :work, :ffmpeg_progress, ffmpeg_progress
|
86
87
|
set_info INFO_TRANFER_PROGRESS, (100.0 * ffmpeg_progress).round(1)
|
87
|
-
|
88
|
+
log_info "progress #{ffmpeg_progress}"
|
88
89
|
end
|
89
90
|
end
|
90
91
|
|
@@ -117,7 +118,6 @@ module RestFtpDaemon
|
|
117
118
|
end
|
118
119
|
end
|
119
120
|
|
120
|
-
|
121
121
|
# require "stringio"
|
122
122
|
# def capture_stderr
|
123
123
|
# real_stderr, $stderr = $stderr, StringIO.new
|
@@ -125,4 +125,4 @@ end
|
|
125
125
|
# $stderr.string
|
126
126
|
# ensure
|
127
127
|
# $stderr = real_stderr
|
128
|
-
# end
|
128
|
+
# end
|
@@ -8,8 +8,9 @@ module RestFtpDaemon
|
|
8
8
|
# Accessors
|
9
9
|
attr_accessor :name
|
10
10
|
|
11
|
-
attr_reader :
|
11
|
+
attr_reader :url
|
12
12
|
attr_reader :uri
|
13
|
+
attr_reader :tokens
|
13
14
|
attr_reader :scheme
|
14
15
|
attr_reader :dir
|
15
16
|
|
@@ -22,37 +23,34 @@ module RestFtpDaemon
|
|
22
23
|
delegate :scheme, :host, :port, :user, :password, :to_s,
|
23
24
|
to: :uri
|
24
25
|
|
25
|
-
def initialize
|
26
|
-
|
27
|
-
|
28
|
-
|
26
|
+
def initialize url
|
27
|
+
# Check parameters
|
28
|
+
# unless url.is_a? String
|
29
|
+
# raise RestFtpDaemon::AssertionFailed, "location/init/string: #{url.inspect}"
|
30
|
+
# end
|
31
|
+
debug nil
|
29
32
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
+
@url = url
|
34
|
+
debug :url, url
|
35
|
+
@tokens = []
|
33
36
|
|
34
|
-
#
|
35
|
-
|
36
|
-
|
37
|
+
# Detect tokens in string
|
38
|
+
@tokens = detect_tokens(url)
|
39
|
+
debug :tokens, @tokens.inspect
|
37
40
|
|
38
|
-
#
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
41
|
+
# First resolve tokens
|
42
|
+
resolve_tokens! url
|
43
|
+
|
44
|
+
# Build URI from parameters
|
45
|
+
build_uri url
|
46
|
+
|
47
|
+
# Extract dir and name
|
48
|
+
build_dir_name
|
43
49
|
|
44
|
-
#
|
45
|
-
parse_url location_uri
|
50
|
+
# Specific initializations
|
46
51
|
case @uri
|
47
|
-
when URI::FILE then init_file
|
48
52
|
when URI::S3 then init_aws # Match AWS URL with BUCKET.s3.amazonaws.com
|
49
53
|
end
|
50
|
-
|
51
|
-
# Check that scheme is supported
|
52
|
-
unless @uri.scheme
|
53
|
-
raise RestFtpDaemon::SchemeUnsupported, url
|
54
|
-
# raise RestFtpDaemon::SchemeUnsupported, @uri
|
55
|
-
end
|
56
54
|
end
|
57
55
|
|
58
56
|
def is? kind
|
@@ -60,13 +58,18 @@ module RestFtpDaemon
|
|
60
58
|
end
|
61
59
|
|
62
60
|
def path
|
63
|
-
|
64
|
-
|
61
|
+
File.join(@dir.to_s, name.to_s)
|
62
|
+
end
|
63
|
+
|
64
|
+
def filedir
|
65
|
+
"/#{@dir}"
|
66
|
+
end
|
67
|
+
def filepath
|
68
|
+
"/#{path}"
|
65
69
|
end
|
66
|
-
alias :to_s :path
|
67
70
|
|
68
|
-
def
|
69
|
-
Dir.glob(path).collect do |file|
|
71
|
+
def local_files
|
72
|
+
Dir.glob("/#{path}").collect do |file|
|
70
73
|
next unless File.readable? file
|
71
74
|
next unless File.file? file
|
72
75
|
# Create a new location object
|
@@ -76,15 +79,19 @@ module RestFtpDaemon
|
|
76
79
|
|
77
80
|
def size
|
78
81
|
return unless uri.is_a? URI::FILE
|
79
|
-
|
80
|
-
return unless File.exist?
|
81
|
-
return File.size
|
82
|
+
local_file_path = filepath
|
83
|
+
return unless File.exist? local_file_path
|
84
|
+
return File.size local_file_path
|
82
85
|
end
|
83
86
|
|
84
87
|
def generate_temp_name!
|
85
88
|
@name = "#{@name}.temp-#{identifier(JOB_TEMPFILE_LEN)}"
|
86
89
|
end
|
87
90
|
|
91
|
+
# def scheme? condition
|
92
|
+
# return @uri.scheme == condition
|
93
|
+
# end
|
94
|
+
|
88
95
|
private
|
89
96
|
|
90
97
|
def tokenize item
|
@@ -92,6 +99,28 @@ module RestFtpDaemon
|
|
92
99
|
"[#{item}]"
|
93
100
|
end
|
94
101
|
|
102
|
+
def build_uri url
|
103
|
+
# Fix scheme if URL as none
|
104
|
+
url.gsub! /^\/(.*)/, 'file:/\1'
|
105
|
+
|
106
|
+
# Parse that URL
|
107
|
+
@uri = URI.parse url # rescue nil
|
108
|
+
raise RestFtpDaemon::LocationParseError, location_path unless @uri
|
109
|
+
|
110
|
+
# Remove unnecessary double slahes
|
111
|
+
@uri.path.gsub!(/\/+/, '/')
|
112
|
+
|
113
|
+
# Check we finally have a scheme
|
114
|
+
debug :scheme, @uri.scheme
|
115
|
+
debug :path, @uri.path
|
116
|
+
debug :host, @uri.host
|
117
|
+
debug :to_s, @uri.to_s
|
118
|
+
|
119
|
+
# Raise if still no scheme #FIXME
|
120
|
+
raise RestFtpDaemon::SchemeUnsupported, url unless @uri.scheme
|
121
|
+
# raise RestFtpDaemon::LocationParseError, base unless @uri
|
122
|
+
end
|
123
|
+
|
95
124
|
def resolve_tokens! path
|
96
125
|
# Gther endpoints, and copy path string to alter it later
|
97
126
|
endpoints = BmcDaemonLib::Conf[:endpoints]
|
@@ -107,39 +136,21 @@ module RestFtpDaemon
|
|
107
136
|
next if to.to_s.empty?
|
108
137
|
path.gsub! tokenize(from), to
|
109
138
|
end
|
110
|
-
end
|
111
|
-
|
112
|
-
def fix_scheme! path
|
113
|
-
# path.gsub!(/^\/(.*)/, 'file:///\1')
|
114
|
-
path.gsub! /^\/(.*)/, 'file:/\1'
|
115
|
-
end
|
116
|
-
|
117
|
-
def parse_url path
|
118
|
-
# Parse that URL
|
119
|
-
@uri = URI.parse path # rescue nil
|
120
|
-
raise RestFtpDaemon::LocationParseError, location_path unless @uri
|
121
|
-
|
122
|
-
# Path cleanup
|
123
|
-
cleaned = @uri.path.clone
|
124
|
-
|
125
|
-
# remove_leading_slashes
|
126
|
-
cleaned.gsub! /^\//, ''
|
127
|
-
|
128
|
-
# remove_multiple_slashes
|
129
|
-
cleaned.gsub! /([^:])\/\//, '\1/'
|
130
139
|
|
131
|
-
#
|
132
|
-
|
133
|
-
|
140
|
+
# Ensure result does not contain tokens after replacement
|
141
|
+
detected = detect_tokens(path)
|
142
|
+
unless detected.empty?
|
143
|
+
raise RestFtpDaemon::JobUnresolvedTokens, 'unresolved tokens: ' + detected.join(' ')
|
144
|
+
end
|
134
145
|
end
|
135
146
|
|
136
|
-
|
137
|
-
|
138
|
-
|
147
|
+
def build_dir_name
|
148
|
+
# Store URL parts (remove leading slashes in dir)
|
149
|
+
@dir = extract_dirname(@uri.path).gsub(/^\//, '')
|
150
|
+
@name = extract_filename(@uri.path)
|
139
151
|
|
140
|
-
|
141
|
-
|
142
|
-
@dir = File.join('/', @dir.to_s)
|
152
|
+
debug :dir, dir
|
153
|
+
debug :name, name
|
143
154
|
end
|
144
155
|
|
145
156
|
def init_aws
|
@@ -156,9 +167,6 @@ module RestFtpDaemon
|
|
156
167
|
# Credentials from config
|
157
168
|
@aws_id = Conf.at(:credentials, @uri.host, :id)
|
158
169
|
@aws_secret = Conf.at(:credentials, @uri.host, :secret)
|
159
|
-
|
160
|
-
# Clear @dir
|
161
|
-
@dir = nil
|
162
170
|
end
|
163
171
|
|
164
172
|
def extract_filename path
|
@@ -174,8 +182,24 @@ module RestFtpDaemon
|
|
174
182
|
end
|
175
183
|
|
176
184
|
def detect_tokens item
|
177
|
-
item.scan /\[[^\[\]]
|
185
|
+
# item.scan /\[([^\[\]]*)\]/
|
186
|
+
item.scan(/\[([^\[\]]*)\]/).map(&:first)
|
187
|
+
end
|
188
|
+
|
189
|
+
def debug var, val = nil
|
190
|
+
# Read conf if not already cached
|
191
|
+
@debug ||= Conf.at(:debug, :location)
|
192
|
+
|
193
|
+
# Skip if no debug requeste
|
194
|
+
return unless @debug
|
195
|
+
|
196
|
+
# Dump line
|
197
|
+
if var.nil?
|
198
|
+
printf("|%s \n", "-"*100)
|
199
|
+
else
|
200
|
+
printf("| %-15s: %s \n", var, val)
|
201
|
+
end
|
178
202
|
end
|
179
203
|
|
180
204
|
end
|
181
|
-
end
|
205
|
+
end
|
@@ -27,7 +27,7 @@ module RestFtpDaemon
|
|
27
27
|
# Init
|
28
28
|
counts = {}
|
29
29
|
|
30
|
-
|
30
|
+
WorkerPool.instance.worker_variables.group_by do |wid, vars|
|
31
31
|
vars[:status]
|
32
32
|
end.each do |status, workers|
|
33
33
|
counts[status] = workers.count
|
@@ -38,4 +38,4 @@ module RestFtpDaemon
|
|
38
38
|
end
|
39
39
|
|
40
40
|
end
|
41
|
-
end
|
41
|
+
end
|
@@ -3,6 +3,7 @@ module RestFtpDaemon
|
|
3
3
|
module Remote
|
4
4
|
class RemoteBase
|
5
5
|
include BmcDaemonLib::LoggerHelper
|
6
|
+
include CommonHelpers
|
6
7
|
|
7
8
|
# Class options
|
8
9
|
attr_reader :log_prefix
|
@@ -25,12 +26,16 @@ module RestFtpDaemon
|
|
25
26
|
log_pipe :transfer
|
26
27
|
|
27
28
|
# Annnounce object
|
28
|
-
log_info "
|
29
|
+
log_info "initialize debug[#{debug}] target[#{target.path}] "
|
29
30
|
|
30
31
|
# Prepare real object
|
31
32
|
prepare
|
32
33
|
end
|
33
34
|
|
35
|
+
def size_if_exists target
|
36
|
+
false
|
37
|
+
end
|
38
|
+
|
34
39
|
def prepare
|
35
40
|
end
|
36
41
|
|
@@ -53,7 +58,7 @@ module RestFtpDaemon
|
|
53
58
|
end
|
54
59
|
|
55
60
|
def close
|
56
|
-
log_debug "
|
61
|
+
log_debug "close"
|
57
62
|
|
58
63
|
# Debug mode ?
|
59
64
|
return unless @debug
|
@@ -85,4 +90,4 @@ module RestFtpDaemon
|
|
85
90
|
|
86
91
|
end
|
87
92
|
end
|
88
|
-
end
|
93
|
+
end
|
@@ -10,6 +10,8 @@ module RestFtpDaemon
|
|
10
10
|
attr_reader :ftp
|
11
11
|
|
12
12
|
def prepare
|
13
|
+
super
|
14
|
+
|
13
15
|
# Create FTP object
|
14
16
|
if @ftpes
|
15
17
|
prepare_ftpes
|
@@ -19,11 +21,8 @@ module RestFtpDaemon
|
|
19
21
|
@ftp.passive = true
|
20
22
|
@ftp.debug_mode = @debug
|
21
23
|
|
22
|
-
# Config
|
23
|
-
@chunk_size = JOB_FTP_CHUNKMB.to_i * 1024
|
24
|
-
|
25
24
|
# Announce object
|
26
|
-
log_debug "
|
25
|
+
log_debug "prepare chunk_size:#{format_bytes(JOB_FTP_CHUNKMB, "B")}"
|
27
26
|
end
|
28
27
|
|
29
28
|
def connect
|
@@ -34,9 +33,9 @@ module RestFtpDaemon
|
|
34
33
|
@ftp.login @target.user, @target.password
|
35
34
|
end
|
36
35
|
|
37
|
-
def
|
38
|
-
size = @ftp.size target.
|
39
|
-
log_debug "
|
36
|
+
def size_if_exists target
|
37
|
+
size = @ftp.size target.filepath
|
38
|
+
log_debug "size_if_exists [#{target.name}]"
|
40
39
|
|
41
40
|
rescue Net::FTPPermError
|
42
41
|
return false
|
@@ -45,15 +44,15 @@ module RestFtpDaemon
|
|
45
44
|
end
|
46
45
|
|
47
46
|
def remove! target
|
48
|
-
@ftp.delete target.
|
47
|
+
@ftp.delete target.filepath
|
49
48
|
rescue Net::FTPPermError
|
50
|
-
log_debug "
|
49
|
+
log_debug "remove! [#{target.name}] not found"
|
51
50
|
else
|
52
|
-
log_debug "
|
51
|
+
log_debug "remove! [#{target.name}] removed"
|
53
52
|
end
|
54
53
|
|
55
54
|
def mkdir directory
|
56
|
-
log_debug "
|
55
|
+
log_debug "mkdir [#{directory}]"
|
57
56
|
@ftp.mkdir directory
|
58
57
|
|
59
58
|
rescue StandardError => ex
|
@@ -63,7 +62,7 @@ module RestFtpDaemon
|
|
63
62
|
def chdir_or_create thedir, mkdir = true
|
64
63
|
# Init, extract my parent name and my own name
|
65
64
|
parent, current = split_path(thedir)
|
66
|
-
log_debug "
|
65
|
+
log_debug "chdir_or_create mkdir[#{mkdir}] dir[#{thedir}] parent[#{parent}] current[#{current}]"
|
67
66
|
|
68
67
|
# Access this directory
|
69
68
|
begin
|
@@ -104,21 +103,22 @@ module RestFtpDaemon
|
|
104
103
|
end
|
105
104
|
|
106
105
|
# Move to the directory
|
107
|
-
log_debug "
|
108
|
-
@ftp.chdir
|
106
|
+
log_debug "upload chdir [#{dest.filedir}]"
|
107
|
+
@ftp.chdir dest.filedir
|
109
108
|
|
110
109
|
# Do the transfer
|
111
|
-
log_debug "
|
112
|
-
@ftp.putbinaryfile source.
|
110
|
+
log_debug "upload putbinaryfile [#{source.filepath}] [#{dest.name}]"
|
111
|
+
@ftp.putbinaryfile source.filepath, dest.name, JOB_FTP_CHUNKMB do |data|
|
113
112
|
# Update job status after this block transfer
|
114
113
|
yield data.bytesize, dest.name
|
115
114
|
end
|
116
115
|
|
117
116
|
# Move the file back to its original name
|
118
117
|
if use_temp_name
|
119
|
-
log_debug "
|
118
|
+
log_debug "upload rename [#{dest.name}] > [#{target.name}]"
|
120
119
|
@ftp.rename dest.name, target.name
|
121
120
|
end
|
121
|
+
|
122
122
|
end
|
123
123
|
|
124
124
|
def close
|
@@ -147,4 +147,4 @@ module RestFtpDaemon
|
|
147
147
|
|
148
148
|
end
|
149
149
|
end
|
150
|
-
end
|
150
|
+
end
|