rest-ftp-daemon 0.100 → 0.100.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1cd7cf3fc402f4257b9c878b5227467f3f250c95
4
- data.tar.gz: 441d0c886af8f6ba67347a82318efb40521862ce
3
+ metadata.gz: a45abd6abf0d38a6dca977c42e81c1cf538dbd77
4
+ data.tar.gz: a0d3f0fd02e570f9f0f3d56ae403607e0d854a43
5
5
  SHA512:
6
- metadata.gz: e774def2fa7622368cca0d28915aaf6c45a121c438d6a4da34c408e733fc79c5611a0c72b1355c1200d5c49ec00d52b8a70198f243442d607e65f8b85ebbd7f7
7
- data.tar.gz: 6696902d94a1130e840955a84c4cde5fac53b0df16bdebeb581c27ff7730efc12b22bf984a580be37448ea35e8aded345798ddc918fe1b89e7f90af7c0615902
6
+ metadata.gz: f3d570450921acd5a1c8d0c61c89ad6ce6b0a97be868e74f3cacf654b3a7695e055345aa3111ca74f068572786b9d52fdbcaa1c2315efee26f8c924211890707
7
+ data.tar.gz: 733164d4039e1660d50850b889c17704718a65097337d9a9b368ea1b3fc29879e67d4ef27e597a102b8775a1c58ec4dc8461bb81d8be2c790b393bce31d02ca3
data/README.md CHANGED
@@ -13,6 +13,8 @@ Features
13
13
 
14
14
  As of today, its main features are :
15
15
 
16
+ * Offer a basic dashboard directly within the daemon HTTP interface
17
+ * Periodically send an update-notification with transfer status and progress
16
18
  * Allow environment-specific configuration in a YAML file
17
19
  * Delegate a transfer job by ``POST```'ing a simple JSON structure
18
20
  * Spawn a dedicated thread to handle this job in its own context
@@ -24,6 +26,7 @@ As of today, its main features are :
24
26
  * Provide RESTful notifications to the requesting client
25
27
  * Allow authentication in FTP target in a standard URI-format
26
28
  * Allow configuration-based path templates to abstract local mounts or remote FTPs (endpoint tokens)
29
+ * Allow to specify random remote/local source/target
27
30
  * Remote supported protocols: FTP and FTPs
28
31
  * Allow main file transfer protocols: sFTP, FTPs / FTPes
29
32
  * Automatically clean-up jobs after a configurable amount of time (failed, finished)
@@ -34,13 +37,9 @@ As of today, its main features are :
34
37
 
35
38
  Expected features in a short-time range :
36
39
 
37
- * Allow change of priorities or other attributes after a job has been started
38
- * Offer a basic dashboard directly within the daemon HTTP interface
39
- * Periodically send an update-notification with transfer status and progress
40
40
  * Allow fallback file source when first file path is unavailable (failover)
41
41
  * Provide swagger-style API documentation
42
42
  * Authenticate API clients
43
- * Allow to specify random remote/local source/target
44
43
  * Allow more transfer protocols (sFTP, HTTP POST etc)
45
44
 
46
45
  Known bugs :
@@ -58,8 +57,8 @@ You may use ```rbenv``` and ```ruby-build``` to get the right Ruby version. If t
58
57
  ```
59
58
  # apt-get install ruby-build rbenv
60
59
  # ruby-build --definitions | grep '2.1'
61
-
62
60
  ```
61
+
63
62
  Otherwise, you way have to update ruby-build to include Ruby 2.1.0 definitions.
64
63
  On Debian, 2.1.0 is not included in Wheezy and appears in Jessie's version of the package.
65
64
 
@@ -90,18 +89,6 @@ Update RubyGems and install the gem from rubygems.org
90
89
  # rest-ftp-daemon start
91
90
  ```
92
91
 
93
- Finally start the daemon on the standart port, or on a specific port using ```-p```
94
-
95
- ```
96
- # rest-ftp-daemon -p 4000 start
97
- ```
98
-
99
- Check that the daemon is running and providing its status info.
100
- If the daemon seems to exit as soon as it's launched, this may be due to logfiles that cannot be written on (check permissions or owner).
101
-
102
- ```
103
- http://localhost:3200/
104
- ```
105
92
 
106
93
  Configuration
107
94
  ------------------------------------------------------------------------------------
@@ -123,6 +110,38 @@ As a starting point, ``rest-ftp-daemon.yml.sample`` is an exemple config file th
123
110
  Default administrator credentials are admin/admin. Please change the password in this configuration file before starting any kind of production.
124
111
 
125
112
 
113
+ Execution
114
+ ------------------------------------------------------------------------------------
115
+
116
+ You can simply start the daemon on the standart port, or on a specific port using ```-p```
117
+
118
+ ```
119
+ # rest-ftp-daemon -p 4000 start
120
+ ```
121
+
122
+ Check that the daemon is running and exposes a JSON status structure on ```http://localhost:3200/status```.
123
+
124
+ The dashbaord will provide a gobal view on ```http://localhost:3200/```
125
+
126
+ If the daemon appears to exit quickly when launched, it may be caused by logfiles that can't be written (check files permissions or owner).
127
+
128
+ Launcher options :
129
+
130
+ | Param | Short | Default | Description |
131
+ |------- |-------------- |------------- |----------------------------------------------------------- |
132
+ | -p | --port | (automatic) | Port to listen for API requests |
133
+ | -e | | production | Environment name |
134
+ | | --dev | | Equivalent to -e development |
135
+ | -w | --workers | 1 | Number of workers spawned at launch |
136
+ | -d | --daemonize | false | Wether to send the daemon to background |
137
+ | -f | --foreground | false | Wether to keep the daemon running in the shell |
138
+ | -P | --pid | (automatic) | Path of the file containing the PID |
139
+ | -u | --user | (none) | User to run the daemon as |
140
+ | -g | --group | (none) | Group of the user to run the daemon as |
141
+ | -h | --help | | Show info about the current version and available options |
142
+ | -v | --version | | Show the current version |
143
+
144
+
126
145
  Logging
127
146
  ------------------------------------------------------------------------------------
128
147
 
@@ -133,12 +152,12 @@ Otherwise separate logging paths can be provided for the Thin webserver, API rel
133
152
  Job cleanup
134
153
  ------------------------------------------------------------------------------------
135
154
 
136
- Job can be cleanup up after a certain amount of time, when they reach on of these status:
155
+ Job can be cleanup up after a certain delay, when they are on one of these status:
137
156
 
138
- - failed, after conchita.clean_failed seconds
139
- - finished, after conchita.clean_finished seconds
157
+ - "failed", cleaned up after conchita.clean_failed seconds
158
+ - "finished", cleaned up after conchita.clean_finished seconds
140
159
 
141
- Cleanup is done on a regular basis, every few seconds (conchita.timer)
160
+ Cleanup is done on a regular basis, every X seconds (X = conchita.timer)
142
161
 
143
162
 
144
163
  Usage examples
@@ -184,20 +203,18 @@ GET http://localhost:3100/jobs/1
184
203
  ```
185
204
 
186
205
 
187
-
188
- Doc TODO
206
+ TODO for this document
189
207
  ------------------------------------------------------------------------------------
190
208
 
191
- Document /status
192
-
193
- Document /routes
194
-
195
- Document multiple-files upload
196
-
197
- Document mkdir and overwrite options
198
-
199
- Document counters
200
-
209
+ * Update Apiary documentation
210
+ * Update Apiary documentation
211
+ * Update Apiary documentation
212
+ * Update Apiary documentation !
213
+ * Document /status
214
+ * Document /routes
215
+ * Document multiple-files upload
216
+ * Document mkdir and overwrite options
217
+ * Document counters
201
218
 
202
219
 
203
220
  About
@@ -17,10 +17,14 @@ module RestFtpDaemon
17
17
 
18
18
  expose :error
19
19
  expose :status
20
-
21
20
  expose :queued_at
22
21
  expose :updated_at
22
+ expose :started_at
23
+ expose :finished_at
24
+
25
+ # Computed fields
23
26
  expose :age
27
+ expose :exectime
24
28
 
25
29
  # Params
26
30
  # expose :wid, unless: lambda { |object, options| object.wid.nil? }
@@ -18,4 +18,3 @@ class Settings < Settingslogic
18
18
  end
19
19
 
20
20
  end
21
-
@@ -1,21 +1,20 @@
1
1
  # Terrific constants
2
2
  APP_NAME = "rest-ftp-daemon"
3
3
  APP_CONF = "/etc/#{APP_NAME}.yml"
4
- APP_VER = "0.100"
4
+ APP_VER = "0.100.2"
5
5
 
6
6
  # Some global constants
7
7
  IDENT_JOB_LEN = 4
8
8
  IDENT_NOTIF_LEN = 4
9
9
  IDENT_RANDOM_LEN = 8
10
+ DEFAULT_LOGS_PIPE_LEN = 15
11
+ DEFAULT_LOGS_ID_LEN = 8
10
12
 
11
13
  # Some defaults
12
14
  DEFAULT_CONNECT_TIMEOUT_SEC = 30
13
15
  DEFAULT_UPDATE_EVERY_KB = 2048
14
16
  DEFAULT_WORKERS = 1
15
17
 
16
- DEFAULT_LOGS_PIPE_WIDTH = 15
17
- DEFAULT_LOGS_ID_WIDTH = 8
18
-
19
18
  # Initialize markers
20
19
  APP_STARTED = Time.now
21
20
  APP_LIBS = File.dirname(__FILE__)
@@ -17,6 +17,9 @@ module RestFtpDaemon
17
17
  attr_reader :queued_at
18
18
  attr_reader :updated_at
19
19
 
20
+ attr_reader :started_at
21
+ attr_reader :finished_at
22
+
20
23
  attr_reader :params
21
24
 
22
25
  FIELDS.each do |field|
@@ -34,6 +37,12 @@ module RestFtpDaemon
34
37
  instance_variable_set("@#{field.to_s}", params[field])
35
38
  end
36
39
  @params = {}
40
+ @updated_at = nil
41
+ @started_at = nil
42
+ @finished_at = nil
43
+ @error = nil
44
+ @status = nil
45
+ @wid = nil
37
46
 
38
47
  # Logger
39
48
  # @logger = RestFtpDaemon::Logger.new(:workers, "JOB #{id}")
@@ -173,10 +182,15 @@ module RestFtpDaemon
173
182
  protected
174
183
 
175
184
  def age
176
- return 0 if @queued_at.nil?
185
+ return nil if @queued_at.nil?
177
186
  (Time.now - @queued_at).round(2)
178
187
  end
179
188
 
189
+ def exectime
190
+ return nil if (@started_at.nil? || @finished_at.nil?)
191
+ (@finished_at - @started_at).round(2)
192
+ end
193
+
180
194
  def wander time
181
195
  info "Job.wander #{time}"
182
196
  @wander_for = time
@@ -267,6 +281,9 @@ module RestFtpDaemon
267
281
  end
268
282
 
269
283
  def transfer
284
+ # Start transfert flag
285
+ @started_at = Time.now
286
+
270
287
  # Method assertions and init
271
288
  @status = :checking_source
272
289
  raise RestFtpDaemon::JobAssertionFailed unless @source_path && @target_url
@@ -311,13 +328,14 @@ module RestFtpDaemon
311
328
  set :source_processed, done
312
329
  end
313
330
 
314
- # Add total transferred to counter
315
- $queue.counter_add :transferred, @transfer_total
316
-
317
331
  # Close FTP connexion
318
332
  @ftp.close
319
333
  info "Job.transfer disconnecting"
320
334
  @status = :disconnecting
335
+
336
+ # Update counters and flags
337
+ $queue.counter_add :transferred, @transfer_total
338
+ @finished_at = Time.now
321
339
  end
322
340
 
323
341
  private
@@ -524,7 +542,7 @@ module RestFtpDaemon
524
542
  stack << (Helpers.format_bytes @transfer_sent, "B")
525
543
  stack << (Helpers.format_bytes @transfer_total, "B")
526
544
  stack << (Helpers.format_bytes bitrate0, "bps")
527
- info "Job.ftp_transfer" + stack.map{|txt| ("%#{DEFAULT_LOGS_PIPE_WIDTH.to_i}s" % txt)}.join("\t")
545
+ info "Job.ftp_transfer" + stack.map{|txt| ("%#{DEFAULT_LOGS_PIPE_LEN.to_i}s" % txt)}.join("\t")
528
546
 
529
547
  # Update time pointer
530
548
  t0 = Time.now
@@ -67,12 +67,14 @@ module RestFtpDaemon
67
67
  end
68
68
 
69
69
  def counter_get name
70
- @counters[name]
70
+ @mutex_counters.synchronize do
71
+ @counters[name]
72
+ end
71
73
  end
72
74
 
73
75
  def counters
74
76
  @mutex_counters.synchronize do
75
- @counters.clone
77
+ @counters
76
78
  end
77
79
  end
78
80
 
@@ -90,8 +92,6 @@ module RestFtpDaemon
90
92
  end
91
93
 
92
94
  def all
93
- # queued2 = @queued.clone
94
- # return queued2.merge(@popped)
95
95
  @queued + @popped
96
96
  end
97
97
  def all_size
@@ -115,7 +115,6 @@ module RestFtpDaemon
115
115
  @mutex.synchronize do
116
116
  # Push job into the queue
117
117
  @queued.push job
118
- #info "JobQueue.push: #{job.id}"
119
118
 
120
119
  # Tell the job it's been queued
121
120
  job.set_queued if job.respond_to? :set_queued
@@ -132,7 +131,6 @@ module RestFtpDaemon
132
131
  alias << push
133
132
  alias enq push
134
133
 
135
-
136
134
  def pop(non_block=false)
137
135
  # info "JobQueue.pop"
138
136
  @mutex.synchronize do
@@ -165,11 +163,15 @@ module RestFtpDaemon
165
163
  end
166
164
 
167
165
  def ordered_queue
168
- @queued.sort_by { |item| [item.priority.to_i, - item.id.to_i] }
166
+ @mutex_counters.synchronize do
167
+ @queued.sort_by { |item| [item.priority.to_i, - item.id.to_i] }
168
+ end
169
169
  end
170
170
 
171
171
  def ordered_popped
172
- @popped.sort_by { |item| [item.updated_at] }
172
+ @mutex_counters.synchronize do
173
+ @popped.sort_by { |item| [item.updated_at] }
174
+ end
173
175
  end
174
176
 
175
177
  protected
@@ -3,7 +3,7 @@ class Logger
3
3
  attr_accessor :pipe
4
4
 
5
5
  def info_with_id message, options = {}
6
- field_id = "%#{-DEFAULT_LOGS_ID_WIDTH.to_i}s" % options[:id].to_s
6
+ field_id = "%#{-DEFAULT_LOGS_ID_LEN.to_i}s" % options[:id].to_s
7
7
  add Logger::INFO, "#{field_id} \t#{' '*(options[:level].to_i+1)}#{message}"
8
8
  end
9
9
 
@@ -25,7 +25,7 @@ module RestFtpDaemon
25
25
  logger.formatter = proc do |severity, datetime, progname, message|
26
26
  # stamp = Time.now.strftime("%Y-%m-%d %H:%M:%S")
27
27
  stamp = datetime.strftime("%Y-%m-%d %H:%M:%S")
28
- field_pipe = "%-#{DEFAULT_LOGS_PIPE_WIDTH.to_i}s" % progname
28
+ field_pipe = "%-#{DEFAULT_LOGS_PIPE_LEN.to_i}s" % progname
29
29
  "#{stamp} #{field_pipe} #{message}\n"
30
30
  end
31
31
 
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.100'
4
+ version: 0.100.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bruno MEDICI
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-10 00:00:00.000000000 Z
11
+ date: 2014-12-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler