rest-ftp-daemon 0.241 → 0.242.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 17f4eefbc675627b89a5d71dc78253b53077d0b9
4
- data.tar.gz: b5df884a47a2204cc87a9ceb05ba4bfccb35a44b
3
+ metadata.gz: 5fe06b493b45467f188f2bb44abf1c8cc1afea28
4
+ data.tar.gz: dc2b03120828edc2131efba729df7faf1e042912
5
5
  SHA512:
6
- metadata.gz: 54ae88ce58e703b530929940f11b87dfa30468727fcc156ae62ac88499f10d5a62ad2c3874a9b85b220ade47ee4a0d3ef4030fc4fd85a06394fd69ce3414315e
7
- data.tar.gz: 74df9fd3193fe8326af484e2e4a839c63fed6ae64d8c1a4e0ec456ebba65999446424c455544365a2013af4ccecf484667cd6a6764d2b58136edb9f009909b73
6
+ metadata.gz: 882dbf325e495f70f89e5a948b144b6646ab4d3c1e37422d8c783fda51c7b24653e419c3b29bb7b2e0b1bc31bb5349b1896fbf30f5eabbfe86c5d81f1739c276
7
+ data.tar.gz: a9e48d701b53d0d7f43880d2dc401ccdfc18a8048b8b1ab38b17d4b57b7055952c69b18e5c6dbac528e630a0e0fac5379daffa4e6edfb023ecda56336e58b41f
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rest-ftp-daemon (0.241)
4
+ rest-ftp-daemon (0.242.0)
5
5
  double-bag-ftps
6
6
  facter
7
7
  get_process_mem
@@ -41,7 +41,7 @@ GEM
41
41
  descendants_tracker (0.0.4)
42
42
  thread_safe (~> 0.3, >= 0.3.1)
43
43
  diff-lcs (1.2.5)
44
- domain_name (0.5.24)
44
+ domain_name (0.5.25)
45
45
  unf (>= 0.0.5, < 1.0.0)
46
46
  double-bag-ftps (0.1.2)
47
47
  equalizer (0.0.11)
@@ -66,7 +66,7 @@ GEM
66
66
  haml (4.0.7)
67
67
  tilt
68
68
  hashie (3.4.2)
69
- http (0.9.7)
69
+ http (0.9.8)
70
70
  addressable (~> 2.3)
71
71
  http-cookie (~> 1.0)
72
72
  http-form_data (~> 1.0.1)
@@ -84,12 +84,12 @@ GEM
84
84
  multi_xml (0.5.5)
85
85
  net-sftp (2.1.2)
86
86
  net-ssh (>= 2.6.5)
87
- net-ssh (2.9.2)
88
- newrelic_rpm (3.13.1.300)
89
- parser (2.2.2.6)
87
+ net-ssh (3.0.1)
88
+ newrelic_rpm (3.14.0.305)
89
+ parser (2.2.3.0)
90
90
  ast (>= 1.1, < 3.0)
91
91
  powerpack (0.1.1)
92
- pry (0.10.1)
92
+ pry (0.10.3)
93
93
  coderay (~> 1.1.0)
94
94
  method_source (~> 0.8.1)
95
95
  slop (~> 3.4)
data/README.md CHANGED
@@ -17,42 +17,45 @@ be notified of their completion, watch their status on a dedicated dashboard.
17
17
  Features
18
18
  ------------------------------------------------------------------------------------
19
19
 
20
- As of today, its main features are :
21
-
22
- * Offer a basic dashboard directly within the daemon HTTP interface
23
- * Periodically send an update-notification with transfer status and progress
24
- * Allow environment-specific configuration in a YAML file
25
- * Delegate a transfer job by `POST`'ing a simple JSON structure
26
- * Spawn a dedicated thread to handle this job in its own context
27
- * Report transfer status, progress and errors for each job in realtime
28
- * Expose JSON status of workers on `GET /jobs/` for automated monitoring
29
- * Parallelize jobs as soon as they arrive
30
- * Handle job queues and priority as an attribute of the job
31
- * Allow dynamic evaluation of priorities, and change of any attribute until the job is picked
32
- * Provide RESTful notifications to the requesting client
33
- * Allow authentication in FTP target in a standard URI-format
34
- * Allow configuration-based path templates to abstract local mounts or remote FTPs (endpoint tokens)
35
- * Allow to specify random remote/local source/target
36
- * Remote supported protocols: FTP and FTPs
37
- * Allow main file transfer protocols: sFTP, FTPs / FTPes
38
- * Automatically clean-up jobs after a configurable amount of time (failed, finished)
39
- * Current bitrate on the last blocks chunk updated in the job attributes
40
- * Global bitrate on the whole file transfer is re-computed after the transfer finishes
41
- * Daemon process is tagged with its name and environment in process lists
42
- * Allow basic patterns in source filename to match multiple files (`/dir/file*.jpg`)
20
+ * System and process features
21
+ * environment-aware configuration in a YAML file
22
+ * daemon process is tagged with its name and environment in process lists
23
+ * global dashboard directly served within the daemon HTTP interface
24
+
25
+
26
+ * File management ans transferts
27
+ * allow authentication in FTP target in a standard URI-format
28
+ * static path pointers in configuration to abstract local mounts or remote FTPs (endpoint tokens)
29
+ * local source path and local/remote target path can use patterns to match multiple files (`/dir/file*.jpg`)
30
+ * several file transfer protocols supported: FTPs, FTPes, sFTP
31
+
32
+ * Job management
33
+ * highly parrallel job processing using dedicated worker threads with their own context
34
+ * jobs are taken into account as soon as they are submitted
35
+ * each job carry its own attributes: build subdirectories (mkdir), overwrite target file, priority weight
36
+ * dynamic evaluation of priorities, honoring any change on context until the job is picked
37
+ * automatically clean-up jobs after a configurable amount of time (failed, finished)
38
+
39
+ * Realtime status reporting
40
+ * realtime transfer status reporting, with progress and errors
41
+ * periodic update notifications sent along with transfer status and progress to an arbitrary URL (JSON resource POSTed)
42
+
43
+
44
+
45
+ Status
46
+ ------------------------------------------------------------------------------------
47
+
48
+ Though it may need more robust tests, this gem has been used successfully in production for
49
+ a while without glitches at France Télévisions.
43
50
 
44
51
  Expected features in a short-time range :
45
52
 
46
- * Allow fallback file source when first file path is unavailable (failover)
47
53
  * Provide swagger-style API documentation
48
54
  * Authenticate API clients
49
55
  * Allow more transfer protocols (sFTP, HTTP POST etc)
56
+ * Expose JSON status of workers on `GET /jobs/` for automated monitoring
50
57
 
51
- Status
52
- ------------------------------------------------------------------------------------
53
58
 
54
- Though lacking testing, this gem has been used successfully in production for
55
- a while without glitches.
56
59
 
57
60
 
58
61
  Installation
@@ -176,19 +179,21 @@ Default administrator credentials are `admin/admin`. Please change the password
176
179
  Logging
177
180
  ------------------------------------------------------------------------------------
178
181
 
179
- The application will not log to any file by default, if not specified in its configuration.
180
- Otherwise separate logging paths can be provided for the Thin webserver, API related messages, and workers related messages. Providing and empty value will simply activate logging to `STDOUT`.
182
+ The application will log to paths specified in the configuration file, if any.
183
+ Separate logging paths can be provided for the Thin webserver, API related messages, and workers related messages.
184
+ Providing empty values as paths, will simply activate logging to `STDOUT`.
181
185
 
182
186
 
183
187
  Job cleanup
184
188
  ------------------------------------------------------------------------------------
185
189
 
186
- Job can be cleanup up after a certain delay, when they are on one of these status:
190
+ Job queue can be set to automatically cleanup after a certain delay. Entries are removed from the queue when they have been idle (updated_at) for more than X seconds, and in any of the following statuses:
187
191
 
188
- - "failed", cleaned up after conchita.clean_failed seconds
189
- - "finished", cleaned up after conchita.clean_finished seconds
192
+ - failed (conchita.clean_failed)
193
+ - finished (conchita.clean_finished)
194
+ - queued, (conchita.clean_queued)
190
195
 
191
- Cleanup is done on a regular basis, every X seconds (X = conchita.timer)
196
+ Cleanup is done on a regular basis, every (conchita.timer) seconds.
192
197
 
193
198
 
194
199
  TODO for this document
@@ -200,7 +205,6 @@ TODO for this document
200
205
  * Update Apiary documentation !
201
206
  * Document /status
202
207
  * Document /routes
203
- * Document multiple-files upload
204
208
  * Document mkdir and overwrite options
205
209
  * Document counters
206
210
 
@@ -253,6 +257,12 @@ Known bugs
253
257
 
254
258
  * As this project is based on SettingsLogic, which in turns uses Syck YAML parser, configuration merge from "defaults" section and environment-specific section is broken. A sub-tree defined for a specific environment, will overwrite the corresponding subtree from "defaults".
255
259
 
260
+ * If you get ```fatal error: 'openssl/ssl.h' file not found when installing ```eventmachine``` on OSX El Capitan, you can try with:
261
+ ```
262
+ gem install eventmachine -v '1.0.8' -- --with-cppflags=-I/usr/local/opt/openssl/include
263
+ bundle install
264
+ ```
265
+
256
266
 
257
267
  Contributing
258
268
  ------------------------------------------------------------------------------------
@@ -293,5 +303,8 @@ About
293
303
 
294
304
  Thanks to https://github.com/berkshelf/berkshelf-api for parts and ideas used in this project
295
305
 
296
- Bruno MEDICI Consultant
297
- http://bmconseil.com/
306
+ This project has been initiated and originally written by
307
+ Bruno MEDICI Consultant (http://bmconseil.com/)
308
+
309
+
310
+
data/config.ru CHANGED
@@ -9,11 +9,6 @@ $queue = RestFtpDaemon::JobQueue.new
9
9
  # Initialize workers and conchita subsystem
10
10
  $pool = RestFtpDaemon::WorkerPool.new
11
11
 
12
- # Rack reloader
13
- unless Settings.namespace == "production"
14
- use Rack::Reloader, 0
15
- end
16
-
17
12
  # Rack authent
18
13
  unless Settings.adminpwd.nil?
19
14
  use Rack::Auth::Basic, "Restricted Area" do |username, password|
@@ -27,6 +22,12 @@ GC::Profiler.enable if Settings.newrelic_enabled?
27
22
  # Serve static assets
28
23
  use Rack::Static, :urls => ["/css", "/js", "/images"], :root => "#{APP_LIBS}/static/"
29
24
 
25
+ # Rack reloader and mini-profiler
26
+ unless Settings.namespace == "production"
27
+ use Rack::Reloader, 0
28
+ # use Rack::MiniProfiler
29
+ end
30
+
30
31
  # Launch the main daemon
31
32
  run RestFtpDaemon::API::Root
32
33
  #run Rack::Cascade.new [RestFtpDaemon::API::Root]
@@ -10,6 +10,14 @@ require "singleton"
10
10
  require "newrelic_rpm"
11
11
 
12
12
 
13
+ # Development libs /?pp=flamegraph
14
+ # unless Settings.namespace == "production"
15
+ # require 'rack-mini-profiler'
16
+ # # require 'stackprof'
17
+ # require 'flamegraph'
18
+ # end
19
+
20
+
13
21
  # Project's libs
14
22
  require_relative "rest-ftp-daemon/constants"
15
23
  require_relative "rest-ftp-daemon/settings"
@@ -1,7 +1,7 @@
1
1
  # Terrific constants
2
2
  APP_NAME = "rest-ftp-daemon"
3
3
  APP_NICK = "rftpd"
4
- APP_VER = "0.241"
4
+ APP_VER = "0.242.0"
5
5
 
6
6
  # Provide default config file information
7
7
  APP_LIB = File.expand_path File.dirname(__FILE__)
@@ -91,7 +91,8 @@ DASHBOARD_WORKER_STYLES = {
91
91
  DEFAULT_WORKER_TIMEOUT = 3600
92
92
  DEFAULT_FTP_CHUNK = 1024
93
93
  DEFAULT_PAGE_SIZE = 40
94
- DEFAULT_WORKERS = 1
94
+ DEFAULT_WORKERS = 2
95
+ DEFAULT_RETRY_DELAY = 10
95
96
 
96
97
  DEFAULT_SFTP_TIMEOUT = 30
97
98
 
@@ -1,6 +1,8 @@
1
1
  module RestFtpDaemon
2
2
  class Paginate
3
3
 
4
+ attr_writer :only
5
+
4
6
  def initialize data
5
7
  # Defaults
6
8
  @pages = 0
@@ -22,10 +24,6 @@ module RestFtpDaemon
22
24
  @pages = 1 if @pages < 1
23
25
  end
24
26
 
25
- def only= raw_only
26
- @only = raw_only
27
- end
28
-
29
27
  def page= raw_page
30
28
  @page = [1, raw_page.to_i, @pages].sort[1]
31
29
  end
@@ -13,14 +13,9 @@
13
13
 
14
14
  %tr{class: trclass.to_s}
15
15
  %td
16
-
17
-
18
16
  %a{href: Helpers.dashboard_job_link(job)}
19
17
  %b= job.id
20
18
 
21
-
22
-
23
-
24
19
  %td= job.label
25
20
 
26
21
  %td{title: job.get(:source_path)}
@@ -78,8 +73,14 @@
78
73
  .label.label-default.flag.worker-label= job.priority
79
74
 
80
75
  %td
81
- - unless job.runs.nil? || job.runs.zero?
82
- .label.label-info.flag.worker-label= job.runs
76
+ - if job.runs.nil?
77
+ .label.label-info.flag.worker-label= "-"
78
+ - elsif job.runs == 1
79
+ .label.label-default.flag.worker-label= job.runs
80
+ - elsif job.runs == 2
81
+ .label.label-warning.flag.worker-label= job.runs
82
+ - elsif job.runs > 2
83
+ .label.label-danger.flag.worker-label= job.runs
83
84
 
84
85
  -#%td
85
86
  - unless job.priority.nil?
@@ -31,6 +31,7 @@ module RestFtpDaemon
31
31
  on_errors = Settings.at(:retry, :on_errors)
32
32
  max_age = Settings.at(:retry, :max_age)
33
33
  max_runs = Settings.at(:retry, :max_runs)
34
+ delay = Settings.at(:retry, :delay)
34
35
 
35
36
  if !job.error
36
37
  #log_info "job succeeded"
@@ -39,13 +40,21 @@ module RestFtpDaemon
39
40
  log_error "not retrying: error not eligible"
40
41
 
41
42
  elsif max_age && (job.age >= max_age)
42
- log_error "not retrying: too old (max_age: #{max_age})"
43
+ log_error "not retrying: max_age reached (#{max_age} s)"
43
44
 
44
45
  elsif max_runs && (job.runs >= max_runs)
45
- log_error "not retrying: too many runs (max_runs: #{max_runs})"
46
+ log_error "not retrying: max_runs reached (#{max_runs} tentatives)"
46
47
 
47
48
  else
48
- log_info "retrying job: requeued"
49
+ # Delay cannot be negative, and will be 1s minimum
50
+ retry_after = [delay || DEFAULT_RETRY_DELAY, 1].max
51
+ log_info "retrying job: waiting for #{retry_after} seconds"
52
+
53
+ # Wait !
54
+ sleep retry_after
55
+ log_info "retrying job: requeued after delay"
56
+
57
+ # Now, requeue this job
49
58
  $queue.requeue job
50
59
  end
51
60
 
@@ -32,6 +32,9 @@ Gem::Specification.new do |spec|
32
32
  spec.add_development_dependency "http", "~> 0.8"
33
33
  spec.add_development_dependency "rubocop", "~> 0.32.0"
34
34
  spec.add_development_dependency "pry"
35
+ # spec.add_development_dependency "rack-mini-profiler"
36
+ # spec.add_development_dependency "stackprof"
37
+ # spec.add_development_dependency "flamegraph"
35
38
 
36
39
  spec.add_runtime_dependency "thin", "~> 1.6"
37
40
  spec.add_runtime_dependency "grape"
@@ -17,6 +17,7 @@ defaults: &defaults
17
17
  # on_errors: ["net_temp_error", "conn_reset_by_peer", "conn_timed_out", "conn_refused", "sftp_auth_failed", "conn_host_is_down", "conn_unreachable", "conn_failed", "conn_openssl_error"]
18
18
  # max_runs: 5
19
19
  # max_age: 1800
20
+ # delay: 10
20
21
 
21
22
  conchita:
22
23
  # timer: 60
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.241'
4
+ version: 0.242.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bruno MEDICI
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-09-24 00:00:00.000000000 Z
11
+ date: 2015-10-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler