rest-ftp-daemon 0.250.0 → 0.250.3

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: 56ef0db0f52451ad8dd48acea697310637a460a7
4
- data.tar.gz: 8c1c45f0077e055a48c6d80bb1d9f60892019d2e
3
+ metadata.gz: 9162a08e5a91acc98b1fd1f8fe6f56fe06546f35
4
+ data.tar.gz: ae4b76ce6b9dbf8ff240797c5365d453430ca1d4
5
5
  SHA512:
6
- metadata.gz: d8120b207886ab8a2667b68761e539a23cc547d04880844d0898ac6560a2edeea313033dca26de45b6af51f0715a97a3e7ad82e626b3915f2255d530ab0dadee
7
- data.tar.gz: 43e8dff779837f56751a1accb9ddf69fe122cc31af4ec97c83ce556028b27199164bb9bc9b7aebe708b1a108e060a3fbb8a8752aae33d21f90eb137ab33d0378
6
+ metadata.gz: bc0ec566787db7bbb2dfb9c54941e80dc070a868ab7fa1b643f311acb0c893675b4067ee5645bd557a29327d0fbd9992b20bce88f2ff7b0ecd1e719258e314b4
7
+ data.tar.gz: 48d4bf8f2576b314a03cf33a3dace71000aaa23efc6c54e99af19541f14b89d593ee9a9508e533e2ed470f4deb3ad822b2c70ce054702fc5a9e562550b9b9133
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rest-ftp-daemon (0.250.0)
4
+ rest-ftp-daemon (0.250.3)
5
5
  double-bag-ftps
6
6
  facter
7
7
  get_process_mem
@@ -13,7 +13,7 @@ PATH
13
13
  newrelic_rpm
14
14
  settingslogic
15
15
  sys-cpu
16
- thin (~> 1.6.4)
16
+ thin (~> 1.6)
17
17
 
18
18
  GEM
19
19
  remote: http://rubygems.org/
data/README.md CHANGED
@@ -4,7 +4,7 @@ rest-ftp-daemon
4
4
  [![Gem Version](https://badge.fury.io/rb/rest-ftp-daemon.svg)](http://badge.fury.io/rb/rest-ftp-daemon)
5
5
  [![Code Climate](https://codeclimate.com/github/bmedici/rest-ftp-daemon/badges/gpa.svg)](https://codeclimate.com/github/bmedici/rest-ftp-daemon)
6
6
  [![Test Coverage](https://codeclimate.com/github/bmedici/rest-ftp-daemon/badges/coverage.svg)](https://codeclimate.com/github/bmedici/rest-ftp-daemon/coverage)
7
-
7
+ [ ![Codeship](https://codeship.com/projects/46492fd0-00a4-0134-6639-66759d382560/status?branch=master)](https://codeship.com/projects/153245)
8
8
 
9
9
  A pretty simple but configurable and efficient FTP-client daemon, driven
10
10
  through a RESTful API. Create transfer jobs by POSTing a simple JSON structure,
@@ -28,6 +28,7 @@ Features
28
28
  * static path pointers in configuration to abstract local mounts or remote FTPs (endpoint tokens)
29
29
  * local source path and local/remote target path can use patterns to match multiple files (`/dir/file*.jpg`)
30
30
  * several file transfer protocols supported: FTPs, FTPes, sFTP
31
+ * display bitrate to any pool or any FTP destination currently transferring (API and dashboard)
31
32
 
32
33
  * Job management
33
34
  * highly parrallel job processing using dedicated worker threads with their own context
data/config.ru CHANGED
@@ -6,8 +6,8 @@ require "rest-ftp-daemon"
6
6
  # Create global queue
7
7
  $queue = RestFtpDaemon::JobQueue.new
8
8
 
9
- # Create global stats
10
- $stats = RestFtpDaemon::Stats.new
9
+ # Create global counters
10
+ $counters = RestFtpDaemon::Counters.new
11
11
 
12
12
  # Initialize workers and conchita subsystem
13
13
  $pool = RestFtpDaemon::WorkerPool.new
@@ -25,7 +25,7 @@ require_relative "rest-ftp-daemon/logger"
25
25
  require_relative "rest-ftp-daemon/paginate"
26
26
  require_relative "rest-ftp-daemon/uri"
27
27
  require_relative "rest-ftp-daemon/job_queue"
28
- require_relative "rest-ftp-daemon/stats"
28
+ require_relative "rest-ftp-daemon/counters"
29
29
  require_relative "rest-ftp-daemon/worker"
30
30
  require_relative "rest-ftp-daemon/worker_conchita"
31
31
  require_relative "rest-ftp-daemon/worker_job"
@@ -37,9 +37,6 @@ module RestFtpDaemon
37
37
  @jobs_queued = []
38
38
  end
39
39
 
40
- # Get workers status
41
- @worker_variables = $pool.worker_variables
42
-
43
40
  # Build paginator
44
41
  @paginate = Paginate.new jobs_with_status
45
42
  @paginate.filter = filter
@@ -15,7 +15,7 @@ module RestFtpDaemon
15
15
  # expose :error
16
16
  expose :json_error, as: :error
17
17
  expose :json_status, as: :status
18
- expose :json_target, as: :target_method
18
+ #expose :json_target, as: :target_method
19
19
 
20
20
  expose :queued_at
21
21
  expose :updated_at
@@ -77,7 +77,7 @@ module RestFtpDaemon
77
77
  $queue.push job
78
78
 
79
79
  # Increment a counter
80
- $stats.increment :jobs, :received
80
+ $counters.increment :jobs, :received
81
81
 
82
82
  rescue JSON::ParserError => exception
83
83
  log_error "JSON::ParserError: #{exception.message}"
@@ -8,6 +8,20 @@ module RestFtpDaemon
8
8
  get "/" do
9
9
  mem = GetProcessMem.new
10
10
  status 200
11
+
12
+ # Get counters
13
+ counters = $counters.stats
14
+
15
+ # Amend counters with legacy attributes
16
+ if counters[:jobs].is_a? Hash
17
+ counters[:jobs_finished] = counters[:jobs][:finished] || 0
18
+ counters[:jobs_failed] = counters[:jobs][:failed] || 0
19
+ end
20
+ if counters[:data].is_a? Hash
21
+ counters[:transferred] = counters[:data][:transferred] || 0
22
+ end
23
+
24
+ # Generate sutrcture
11
25
  return {
12
26
  hostname: `hostname`.to_s.chomp,
13
27
  version: APP_VER,
@@ -18,21 +32,15 @@ module RestFtpDaemon
18
32
  memory_bytes: mem.bytes.to_i,
19
33
  memory_mb: mem.mb.round(0),
20
34
 
21
- stats: $stats.stats,
22
-
35
+ status: $queue.jobs_by_status,
23
36
  jobs_count: $queue.jobs_count,
24
- status: $queue.jobs_count_by_status,
25
37
 
26
- # jobs_finished: $queue.jobs_finished,
27
- #rate_by_pool1: $queue.rate_by_pool,
38
+ counters: counters,
39
+
28
40
  rate_by_pool: $queue.rate_by(:pool),
29
41
  rate_by_targethost: $queue.rate_by(:targethost),
30
- jobs_by_status: $queue.jobs_by_status,
31
-
32
- #rates_per_host: $queue.rates_per_host,
33
42
 
34
43
  workers: $pool.worker_variables,
35
- #kpis: $queue.queued_ids,
36
44
  }
37
45
  end
38
46
 
@@ -1,7 +1,7 @@
1
1
  # Terrific constants
2
2
  APP_NAME = "rest-ftp-daemon"
3
3
  APP_NICK = "rftpd"
4
- APP_VER = "0.250.0"
4
+ APP_VER = "0.250.3"
5
5
 
6
6
  # Provide default config file information
7
7
  APP_LIB = File.expand_path(File.dirname(__FILE__))
@@ -57,6 +57,14 @@ JOB_STYLES = {
57
57
  JOB_STATUS_RENAMING => :info,
58
58
  }
59
59
 
60
+
61
+ # Jobs statuses
62
+ JOB_METHOD_FTP = "ftp"
63
+ JOB_METHOD_FTPS = "ftps"
64
+ JOB_METHOD_SFTP = "sftp"
65
+ JOB_METHOD_FILE = "file"
66
+
67
+
60
68
  # Worker statuses
61
69
  WORKER_STATUS_STARTING = "starting"
62
70
  WORKER_STATUS_WAITING = "waiting"
@@ -66,7 +74,7 @@ WORKER_STATUS_TIMEOUT = "timeout"
66
74
  WORKER_STATUS_CRASHED = "crashed"
67
75
  WORKER_STATUS_CLEANING = "cleaning"
68
76
  WORKER_STYLES = {
69
- WORKER_STATUS_WAITING => :success,
77
+ WORKER_STATUS_WAITING => nil,
70
78
  WORKER_STATUS_RUNNING => :info,
71
79
  WORKER_STATUS_CRASHED => :danger,
72
80
  WORKER_STATUS_FINISHED => :success,
@@ -1,7 +1,7 @@
1
1
  module RestFtpDaemon
2
2
 
3
3
  # Queue that stores all the Jobs waiting to be processed or fully processed
4
- class Stats
4
+ class Counters
5
5
  attr_reader :stats
6
6
 
7
7
  if Settings.newrelic_enabled?
@@ -22,7 +22,7 @@ module RestFtpDaemon
22
22
 
23
23
  def get group, name
24
24
  @mutex_stats.synchronize do
25
- @stats[group][name] if @stats[group]
25
+ @stats[group][name] if @stats[group].is_a? Hash
26
26
  end
27
27
  end
28
28
 
@@ -78,11 +78,11 @@ module RestFtpDaemon
78
78
  def self.job_method_label method
79
79
  return if method.nil?
80
80
  klass = case method
81
- when :file
81
+ when JOB_METHOD_FILE
82
82
  "label-primary"
83
- when :ftp
83
+ when JOB_METHOD_FTP
84
84
  "label-warning"
85
- when :ftps, :ftpes
85
+ when JOB_METHOD_FTPS
86
86
  "label-success"
87
87
  else
88
88
  "label-default"
@@ -19,7 +19,6 @@ module RestFtpDaemon
19
19
  attr_reader :error
20
20
  attr_reader :status
21
21
  attr_reader :runs
22
- attr_reader :target_method
23
22
 
24
23
  attr_reader :queued_at
25
24
  attr_reader :updated_at
@@ -213,13 +212,6 @@ module RestFtpDaemon
213
212
  end
214
213
  end
215
214
 
216
- def get attribute
217
- @mutex.synchronize do
218
- @infos || {}
219
- @infos[attribute]
220
- end
221
- end
222
-
223
215
  def weight
224
216
  @weight = [
225
217
  - @runs.to_i,
@@ -247,12 +239,12 @@ module RestFtpDaemon
247
239
  end
248
240
 
249
241
  def targethost
250
- get(:target_host)
242
+ get_info :target, :host
251
243
  end
252
244
 
253
- def json_target
254
- utf8 @target_method
255
- end
245
+ # def json_target
246
+ # utf8 get_info(:target, :method)
247
+ # end
256
248
 
257
249
  def json_error
258
250
  utf8 @error unless @error.nil?
@@ -262,6 +254,13 @@ module RestFtpDaemon
262
254
  utf8 @status unless @status.nil?
263
255
  end
264
256
 
257
+ def get_info level1, level2
258
+ @mutex.synchronize do
259
+ @infos || {}
260
+ @infos[level1][level2] if @infos[level1].is_a? Hash
261
+ end
262
+ end
263
+
265
264
  protected
266
265
 
267
266
  def expand_path path
@@ -304,21 +303,19 @@ module RestFtpDaemon
304
303
  @runs += 1
305
304
 
306
305
  # Init
307
- @source_method = :file
308
- @target_method = nil
309
306
  @source_path = nil
310
307
 
311
308
  # Prepare source
312
309
  raise RestFtpDaemon::JobMissingAttribute unless @source
313
310
  @source_path = expand_path @source
314
- set_info :source_path, @source_path
315
- set_info :source_method, :file
311
+ set_info :source, :path, @source_path
312
+ set_info :source, :method, JOB_METHOD_FILE
316
313
 
317
314
  # Prepare target
318
315
  raise RestFtpDaemon::JobMissingAttribute unless @target
319
316
  target_uri = expand_url @target
320
- set_info :target_uri, target_uri.to_s
321
- set_info :target_host, target_uri.host
317
+ set_info :target, :uri, target_uri.to_s
318
+ set_info :target, :host, target_uri.host
322
319
  @target_path = Path.new target_uri.path, true
323
320
 
324
321
  #puts "@target_path: #{@target_path.inspect}"
@@ -328,20 +325,23 @@ module RestFtpDaemon
328
325
 
329
326
  if target_uri.is_a? URI::FTP
330
327
  log_info "Job.prepare target_method FTP"
331
- # set_info :target_method, :ftp
332
- @target_method = :ftp
328
+ # set_info :target, :method, :ftp
329
+ set_info :target, :method, JOB_METHOD_FTP
330
+ #@target_method = :ftp
333
331
  @remote = RemoteFTP.new target_uri, log_context
334
332
 
335
333
  elsif (target_uri.is_a? URI::FTPES) || (target_uri.is_a? URI::FTPS)
336
334
  log_info "Job.prepare target_method FTPES"
337
- # set_info :target_method, :ftpes
338
- @target_method = :ftpes
335
+ # set_info :target, :method, :ftpes
336
+ set_info :target, :method, JOB_METHOD_FTPS
337
+ # @target_method = :ftpes
339
338
  @remote = RemoteFTP.new target_uri, log_context, ftpes: true
340
339
 
341
340
  elsif target_uri.is_a? URI::SFTP
342
341
  log_info "Job.prepare target_method SFTP"
343
- # set_info :target_method, :sftp
344
- @target_method = :sftp
342
+ # set_info :target, :method, :sftp
343
+ set_info :target, :method, JOB_METHOD_SFTP
344
+ # @target_method = :sftp
345
345
  @remote = RemoteSFTP.new target_uri, log_context
346
346
 
347
347
  else
@@ -360,13 +360,13 @@ module RestFtpDaemon
360
360
  raise RestFtpDaemon::JobAssertionFailed, "run/1" unless @source_path
361
361
  raise RestFtpDaemon::JobAssertionFailed, "run/2" unless @target_path
362
362
  @transfer_sent = 0
363
- set_info :source_processed, 0
363
+ set_info :source, :processed, 0
364
364
 
365
365
  # Guess source files from disk
366
366
  set_status JOB_STATUS_CHECKING_SRC
367
367
  sources = find_local @source_path
368
- set_info :source_count, sources.count
369
- set_info :source_files, sources.collect(&:full)
368
+ set_info :source, :count, sources.count
369
+ set_info :source, :files, sources.collect(&:full)
370
370
  log_info "Job.run sources #{sources.collect(&:name)}"
371
371
  raise RestFtpDaemon::JobSourceNotFound if sources.empty?
372
372
 
@@ -383,7 +383,7 @@ module RestFtpDaemon
383
383
 
384
384
  # Compute total files size
385
385
  @transfer_total = sources.collect(&:size).sum
386
- set_info :transfer_total, @transfer_total
386
+ set_info :transfer, :total, @transfer_total
387
387
 
388
388
  # Reset counters
389
389
  @last_data = 0
@@ -404,7 +404,7 @@ module RestFtpDaemon
404
404
  remote_push source, full_target
405
405
 
406
406
  # Update counters
407
- set_info :source_processed, source_processed += 1
407
+ set_info :source, :processed, source_processed += 1
408
408
  end
409
409
 
410
410
  # FTP transfer finished
@@ -434,18 +434,18 @@ module RestFtpDaemon
434
434
  Thread.current.thread_variable_set :updated_at, now
435
435
  end
436
436
 
437
- def set_info attribute, value
437
+ def set_info level1, level2, value
438
438
  @mutex.synchronize do
439
439
  @infos || {}
440
+ @infos[level1] ||= {}
440
441
 
441
442
  # Force strings to UTF8
442
443
  if value.is_a? Symbol
443
- @infos[attribute] = value.to_s.force_encoding(Encoding::UTF_8)
444
+ @infos[level1][level2] = value.to_s.force_encoding(Encoding::UTF_8)
444
445
  elsif value.is_a? String
445
- # @infos[attribute] = utf8(value)
446
- @infos[attribute] = value.force_encoding(Encoding::UTF_8)
446
+ @infos[level1][level2] = value.dup.force_encoding(Encoding::UTF_8)
447
447
  else
448
- @infos[attribute] = value
448
+ @infos[level1][level2] = value
449
449
  end
450
450
 
451
451
  # Mark the job as updated
@@ -490,9 +490,9 @@ module RestFtpDaemon
490
490
  set_status JOB_STATUS_DISCONNECTING
491
491
  @finished_at = Time.now
492
492
 
493
- # Update stats
494
- $stats.increment :jobs, :finished
495
- $stats.add :global, :transferred, @transfer_total
493
+ # Update counters
494
+ $counters.increment :jobs, :finished
495
+ $counters.add :data, :transferred, @transfer_total
496
496
  end
497
497
 
498
498
  def remote_push source, target
@@ -503,7 +503,7 @@ module RestFtpDaemon
503
503
 
504
504
  # Use source filename if target path provided none (typically with multiple sources)
505
505
  log_info "Job.remote_push [#{source.name}]: [#{source.full}] > [#{target.full}]"
506
- set_info :source_current, source.name
506
+ set_info :source, :current, source.name
507
507
 
508
508
  # Compute temp target name
509
509
  tempname = nil
@@ -537,10 +537,10 @@ module RestFtpDaemon
537
537
 
538
538
  # Compute final bitrate
539
539
  global_transfer_bitrate = get_bitrate @transfer_total, (Time.now - transfer_started_at)
540
- set_info :transfer_bitrate, global_transfer_bitrate.round(0)
540
+ set_info :transfer, :bitrate, global_transfer_bitrate.round(0)
541
541
 
542
542
  # Done
543
- set_info :source_current, nil
543
+ set_info :source, :current, nil
544
544
  end
545
545
 
546
546
  def progress transferred, name = ""
@@ -549,17 +549,17 @@ module RestFtpDaemon
549
549
 
550
550
  # Update counters
551
551
  @transfer_sent += transferred
552
- set_info :transfer_sent, @transfer_sent
552
+ set_info :transfer, :sent, @transfer_sent
553
553
 
554
554
  # Update job info
555
555
  percent0 = (100.0 * @transfer_sent / @transfer_total).round(0)
556
- set_info :progress, percent0
556
+ set_info :transfer, :progress, percent0
557
557
 
558
558
  # Update job status after each NOTIFY_UPADE_STATUS
559
559
  progressed_ago = (now.to_f - @progress_at.to_f)
560
560
  if (!JOB_UPDATE_INTERVAL.to_f.zero?) && (progressed_ago > JOB_UPDATE_INTERVAL.to_f)
561
561
  @current_bitrate = running_bitrate @transfer_sent
562
- set_info :transfer_bitrate, @current_bitrate.round(0)
562
+ set_info :transfer, :bitrate, @current_bitrate.round(0)
563
563
 
564
564
  # Log progress
565
565
  stack = []
@@ -644,21 +644,21 @@ module RestFtpDaemon
644
644
  # Update job's internal status
645
645
  set_status JOB_STATUS_FAILED
646
646
  set_error error
647
- set_info :error_exception, exception.class.to_s
648
- set_info :error_message, exception.message
647
+ set_info :error, :exception, exception.class.to_s
648
+ set_info :error, :message, exception.message
649
649
 
650
650
  # Build status stack
651
651
  notif_status = nil
652
652
  if include_backtrace
653
- set_info :error_backtrace, exception.backtrace
653
+ set_info :error, :backtrace, exception.backtrace
654
654
  notif_status = {
655
655
  backtrace: exception.backtrace,
656
656
  }
657
657
  end
658
658
 
659
659
  # Increment counter for this error
660
- $stats.increment :errors, error
661
- $stats.increment :jobs, :failed
660
+ $counters.increment :errors, error
661
+ $counters.increment :jobs, :failed
662
662
 
663
663
  # Prepare notification if signal given
664
664
  return unless event
@@ -16,16 +16,13 @@ module RestFtpDaemon
16
16
  # Instance variables
17
17
  @queues = {}
18
18
  @waitings = {}
19
-
20
- # @queue = []
21
- # @waiting = []
22
-
23
19
  @jobs = []
24
20
 
25
21
  @queues.taint # enable tainted communication
26
22
  @waitings.taint
27
-
28
23
  taint
24
+
25
+ # Global mutex for the queue
29
26
  @mutex = Mutex.new
30
27
 
31
28
  # Logger
@@ -44,30 +41,42 @@ module RestFtpDaemon
44
41
  prefixed_id @last_id
45
42
  end
46
43
 
47
- def jobs_queued
44
+ def jobs_queued
48
45
  @queues
49
- #@queues.map { |status, jobs| jobs.size }
50
46
  end
51
47
 
52
- # Statistics on average rates
53
48
  def rate_by method_name
54
49
  # Init
55
- rates = {}
50
+ result = {}
56
51
  return unless Job.new(0, {}).respond_to? method_name
57
52
 
58
- # Group jobs by method_name
59
- jobs_grouped = @jobs.group_by do |job|
60
- job.send(method_name)
61
- end
53
+ # Select only running jobs
54
+ @jobs.each do |job|
55
+
56
+ # Compute jobs's group, next if empty
57
+ group = job.send(method_name)
58
+ next if group.nil?
62
59
 
63
- # Inside each group, sum up rates for interesting statuses
64
- jobs_grouped.map do |group, jobs|
65
- # Store their sum
66
- rates[group] = rates_by_status (jobs)
60
+ # Initialize rate entry
61
+ result[group] ||= nil
62
+
63
+ # If job is not uploading, next !
64
+ next unless job.status == JOB_STATUS_UPLOADING
65
+
66
+ # Extract current rate, next if not available
67
+ rate = job.get_info :transfer, :bitrate
68
+ next if rate.nil?
69
+
70
+
71
+ # Add its current rate
72
+ result[group] ||= 0
73
+ #log_info " 2: #{result.inspect} (rate: #{rate})"
74
+ result[group] += rate
75
+ #log_info " 3: #{result.inspect}"
67
76
  end
68
77
 
69
78
  # Return the rate
70
- rates
79
+ result
71
80
  end
72
81
 
73
82
  # Queue infos
@@ -80,20 +89,18 @@ module RestFtpDaemon
80
89
  @jobs.group_by { |job| job.status }.map { |status, jobs| statuses[status] = jobs.size }
81
90
  statuses
82
91
  end
83
- alias jobs_count_by_status jobs_by_status
84
92
 
85
- def jobs_ids
86
- @jobs.collect(&:id)
87
- end
93
+ # def jobs_ids
94
+ # @jobs.collect(&:id)
95
+ # end
88
96
 
89
97
  def empty?
90
98
  @queue.empty?
91
99
  end
92
100
 
93
- def num_waiting
94
- @waiting.size
95
- end
96
-
101
+ # def num_waiting
102
+ # @waiting.size
103
+ # end
97
104
 
98
105
  # Queue access
99
106
  def find_by_id id, prefixed = false
@@ -176,7 +183,7 @@ module RestFtpDaemon
176
183
 
177
184
  # Status filtering: only those jobs
178
185
  else
179
- @jobs.select { |job| job.status.to_s == status.to_s }
186
+ @jobs.select { |job| job.status == status.to_s }
180
187
 
181
188
  end
182
189
  end
@@ -222,26 +229,6 @@ module RestFtpDaemon
222
229
  "#{@prefix}.#{id}"
223
230
  end
224
231
 
225
- def rates_by_status jobs
226
- rates = {}
227
-
228
- # Sub-group by status
229
- jobs.group_by(&:status).each do |status, jobset|
230
-
231
- # Extract bitrate values
232
- bitrates = jobset.collect do |job|
233
- job.get(:transfer_bitrate)
234
- end
235
-
236
- # Store their sum
237
- rates[status] = bitrates.reject(&:nil?).sum
238
- # rates["#{status}_ids"] = jobset.collect(&:id).join(', ')
239
- end
240
-
241
- # Return rates
242
- rates
243
- end
244
-
245
232
  if Settings.newrelic_enabled?
246
233
  add_transaction_tracer :push, category: :task
247
234
  add_transaction_tracer :pop, category: :task
@@ -15,13 +15,10 @@ class Logger
15
15
 
16
16
  if lines.is_a? Hash
17
17
  output = build_from_hash prefix2, lines
18
-
19
18
  elsif lines.is_a? Array
20
19
  output = build_from_array prefix2, lines
21
-
22
20
  else
23
21
  output = []
24
-
25
22
  end
26
23
 
27
24
  # Prepend plain message to output
@@ -52,9 +52,7 @@ module RestFtpDaemon
52
52
 
53
53
  def link p
54
54
  klass = (p == @page)? "primary" : "default"
55
-
56
55
  url = Helpers.dashboard_filter_url(@filter)
57
-
58
56
  "<a class='btn btn-%s' href='%s?page=%d'>%p</a>" % [
59
57
  klass,
60
58
  @filter,
@@ -31,10 +31,6 @@ module RestFtpDaemon
31
31
 
32
32
  private
33
33
 
34
- # def log_context
35
- # @log_context
36
- # end
37
-
38
34
  def myname
39
35
  self.class.to_s
40
36
  end
@@ -43,7 +43,6 @@ module RestFtpDaemon
43
43
  log_info "RemoteFTP.present? [#{target.name}]"
44
44
 
45
45
  rescue Net::FTPPermError
46
- # log_info "RemoteFTP.present? [#{target.name}] NOT_FOUND"
47
46
  return false
48
47
  else
49
48
  return size
@@ -102,9 +101,6 @@ module RestFtpDaemon
102
101
  log_info "RemoteFTP.push to [#{destination.name}]"
103
102
 
104
103
  @ftp.putbinaryfile source.full, target.name, @chunk_size do |data|
105
- # Update the worker activity marker
106
- # FIXME: worker_is_still_active
107
-
108
104
  # Update job status after this block transfer
109
105
  yield data.bytesize, destination.name
110
106
  end
@@ -134,6 +130,5 @@ module RestFtpDaemon
134
130
  @ftp.ftps_mode = DoubleBagFTPS::EXPLICIT
135
131
  end
136
132
 
137
-
138
133
  end
139
134
  end
@@ -123,9 +123,6 @@ module RestFtpDaemon
123
123
  # args[2] : data being written (as string)
124
124
  # puts "writing #{args[2].length} bytes to #{args[0].remote} starting at #{args[1]}"
125
125
 
126
- # Update the worker activity marker
127
- # FIXME: worker_is_still_active
128
-
129
126
  # Update job status after this block transfer
130
127
  yield args[2].length, destination.name
131
128
 
@@ -154,8 +151,6 @@ module RestFtpDaemon
154
151
  def close
155
152
  # Close init
156
153
  super
157
-
158
- # @sftp.close
159
154
  end
160
155
 
161
156
  def connected?
@@ -48,7 +48,6 @@ class Settings < Settingslogic
48
48
  ENV["NEWRELIC_AGENT_ENABLED"] = "false"
49
49
  end
50
50
 
51
- # That's it!
52
51
  end
53
52
 
54
53
  def overwrite options
@@ -14,11 +14,7 @@
14
14
  .container-fluid
15
15
  = render :dashboard_header
16
16
 
17
-
18
17
  .container-fluid
19
-
20
- %br
21
-
22
18
  .row
23
19
  #box-jobs.col-md-12
24
20
  = render :dashboard_jobs
@@ -29,13 +25,11 @@
29
25
 
30
26
  #box-workers.col-md-3
31
27
  = render :dashboard_workers
32
- = render :dashboard_stats
33
28
 
34
29
  #box-rates.col-md-3
30
+ = render :dashboard_counters
35
31
  = render :dashboard_rates
36
32
 
37
-
38
33
  .footer
39
34
  .container-fluid
40
35
  = render :dashboard_footer
41
-
@@ -1,5 +1,5 @@
1
1
  -# coding: utf-8
2
- %h2 Stats
2
+ %h2 Counters
3
3
 
4
4
  %table.table.table-striped.table-hover.table-condensed
5
5
 
@@ -11,11 +11,10 @@
11
11
 
12
12
  %tbody
13
13
 
14
- - $stats.stats.each do |group, values|
14
+ - $counters.stats.each do |group, values|
15
15
 
16
16
  - values.each do |name, value|
17
17
  %tr
18
18
  %td= group
19
19
  %td= name
20
20
  %td.text-right= value
21
-
@@ -1,7 +1,6 @@
1
1
  -# coding: utf-8
2
2
  - info_procs = (Facter.value :processorcount).to_i
3
3
 
4
-
5
4
  .footer-signature.pull-left
6
5
 
7
6
  &copy;
@@ -31,5 +30,3 @@
31
30
  .btn-group.btn-group-sm
32
31
  .btn.btn-default.btn-info Started
33
32
  .btn.btn-default= Helpers.datetime_short(APP_STARTED)
34
-
35
-
@@ -2,8 +2,8 @@
2
2
  - info_procs = (Facter.value :processorcount).to_i
3
3
  - info_load = Sys::CPU.load_avg.first.to_f
4
4
  - info_norm = info_procs.zero? ? "N/A" : (100 * info_load / info_procs).round(1)
5
- - info_trans = $stats.get :global, :transferred
6
- - info_processed = $stats.get(:global, :processed)
5
+ - info_trans = $counters.get :data, :transferred
6
+ - info_processed = $counters.get :jobs, :processed
7
7
  - mem = GetProcessMem.new
8
8
 
9
9
 
@@ -36,5 +36,3 @@
36
36
  .btn-group.btn-group-sm
37
37
  .btn.btn-default.btn-success Transferred
38
38
  .btn.btn-default= Helpers.format_bytes(info_trans, "B", 1)
39
-
40
-
@@ -1,5 +1,5 @@
1
1
  -# coding: utf-8
2
- - jobs_count_by_status = $queue.jobs_count_by_status
2
+ - jobs_by_status = $queue.jobs_by_status
3
3
  - counts_all = $queue.jobs_count
4
4
  - jobs = @paginate.subset
5
5
 
@@ -9,7 +9,7 @@
9
9
  ALL (#{counts_all})
10
10
 
11
11
  .btn-group.btn-group-xs.filters
12
- - jobs_count_by_status.each do |status, count|
12
+ - jobs_by_status.each do |status, count|
13
13
  - klass = (status.to_s == @filter) ? "btn-info" : ""
14
14
  %a.btn.btn-default{href: Helpers.dashboard_filter_url(status), class: klass}
15
15
  #{status} (#{count})
@@ -33,7 +33,7 @@
33
33
  %th label
34
34
  %th pool
35
35
  %th source
36
- %th mode
36
+ %th method
37
37
  %th target
38
38
  %th queued
39
39
  %th.error status
@@ -44,7 +44,6 @@
44
44
  %th{title: "Priority"} P
45
45
  %th{title: "Runs count"} R
46
46
 
47
-
48
47
  - @jobs_queued.each do |pool, jobs|
49
48
  - unless jobs.empty?
50
49
  %tbody.jobs
@@ -59,5 +58,3 @@
59
58
  %tbody.jobs
60
59
  = render :dashboard_table, {jobs: jobs}
61
60
 
62
-
63
-
@@ -13,24 +13,20 @@
13
13
  %thead
14
14
  %tr
15
15
  %th= group_title
16
- %th.text-right=JOB_STATUS_FINISHED
17
- %th.text-right=JOB_STATUS_UPLOADING
16
+ %th.text-right bitrate
18
17
 
19
18
  %tbody
20
- - rates_by_status.each do |group, rates|
19
+ - rates_by_status.each do |group, rate|
21
20
  - next if group.nil?
21
+ - trclass = (rate.nil? ? "" : "info")
22
22
 
23
- %tr.info
24
- %td= group
23
+ %tr{class: trclass}
24
+ %td
25
+ = group
25
26
  %td.text-right
26
- = Helpers.format_bytes(rates[JOB_STATUS_FINISHED], "bps")
27
- %td.text-right
28
- = Helpers.format_bytes(rates[JOB_STATUS_UPLOADING], "bps")
29
- -# %td= rates.inspect
27
+ = Helpers.format_bytes(rate, "bps")
30
28
 
31
29
  %thead
32
30
  %tr
33
31
  %td{colspan: 3}
34
32
  %br
35
-
36
- -# JOB_STATUS_UPLOADING
@@ -1,10 +1,10 @@
1
1
  -# coding: utf-8
2
2
  - jobs.each do |job|
3
- - progress = job.get :progress
4
- - source_count = job.get(:source_count) || 0
5
- - source_processed = job.get(:source_processed) || 0
6
- - source_current = job.get(:source_current)
7
- - bitrate = job.get :transfer_bitrate
3
+ - progress = job.get_info(:transfer, :progress)
4
+ - source_count = job.get_info(:source, :count) || 0
5
+ - source_processed = job.get_info(:source, :processed) || 0
6
+ - source_current = job.get_info(:source, :current)
7
+ - bitrate = job.get_info(:transfer, :bitrate)
8
8
  - trclass = JOB_STYLES[job.status]
9
9
  - runs = job.runs.to_i
10
10
 
@@ -20,14 +20,14 @@
20
20
 
21
21
  %td= job.pool
22
22
 
23
- %td{title: job.get(:source_path)}
23
+ %td{title: job.get_info(:source, :path)}
24
24
  = Helpers.highlight_tokens job.source
25
25
 
26
26
  %td
27
- =# Helpers.job_method_label (job.get :target_method)
28
- = Helpers.job_method_label job.target_method
27
+ = Helpers.job_method_label (job.get_info :target, :method)
28
+ =# Helpers.job_method_label job.target_method
29
29
 
30
- %td{title: job.get(:target_url)}
30
+ %td{title: job.get_info(:target, :url)}
31
31
  = Helpers.highlight_tokens job.target
32
32
 
33
33
  %td
@@ -54,14 +54,14 @@
54
54
  - if job.status == JOB_STATUS_UPLOADING
55
55
  .progress
56
56
  .progress-bar{style:"width: #{progress}%;"}
57
- = Helpers.format_bytes(job.get(:transfer_sent), "B")
57
+ = Helpers.format_bytes(job.get_info(:transfer, :sent), "B")
58
58
 
59
59
  - else
60
- .error{title: job.get(:error_message)}
60
+ .error{title: job.get_info(:error, :message)}
61
61
  = Helpers.text_or_empty(job.error)
62
62
 
63
63
  %td.nobr.text-right
64
- = Helpers.format_bytes(job.get(:transfer_total), "B")
64
+ = Helpers.format_bytes(job.get_info(:transfer, :total), "B")
65
65
 
66
66
  %td.nobr.text-right{title: "time: #{job.exectime} s"}
67
67
  - if bitrate
@@ -78,5 +78,3 @@
78
78
 
79
79
  %td
80
80
  .label.flag.worker-label{class: Helpers.job_runs_style(runs)}= runs
81
-
82
-
@@ -1,4 +1,6 @@
1
1
  -# coding: utf-8
2
+ - variables = $pool.worker_variables
3
+
2
4
  %h2 Workers
3
5
 
4
6
  %table.table.table-striped.table-hover.table-condensed
@@ -12,7 +14,7 @@
12
14
  %th.text-right seen
13
15
 
14
16
  %tbody
15
- - @worker_variables.each do |vars|
17
+ - variables.each do |vars|
16
18
  - wid = vars[:wid]
17
19
  - status = vars[:status]
18
20
  - alive = $pool.worker_alive? wid
@@ -22,7 +24,6 @@
22
24
  - trclass = "danger"
23
25
  - status = "DEAD"
24
26
 
25
-
26
27
  %tr{class: trclass.to_s}
27
28
  %td= vars[:pool]
28
29
  %td= wid
@@ -13,7 +13,6 @@ module RestFtpDaemon
13
13
  @log_worker_status_changes = true
14
14
 
15
15
  # Worker name
16
- #@wid = wid
17
16
  @pool = pool
18
17
 
19
18
  # Set thread context
@@ -35,8 +35,6 @@ module RestFtpDaemon
35
35
  max_age = Settings.at(:retry, :max_age)
36
36
  max_runs = Settings.at(:retry, :max_runs)
37
37
  delay = Settings.at(:retry, :delay)
38
- # log_error "on_errors: #{on_errors.inspect} (#{on_errors.first.class})"
39
- # log_error "job.error: #{job.error} (#{job.error.class})"
40
38
 
41
39
  if !job.error
42
40
  #log_info "job succeeded"
@@ -86,7 +84,7 @@ module RestFtpDaemon
86
84
  worker_status WORKER_STATUS_FINISHED, job
87
85
 
88
86
  # Increment total processed jobs count
89
- $stats.increment :global, :processed
87
+ $counters.increment :jobs, :processed
90
88
 
91
89
  rescue RestFtpDaemon::JobTimeout => ex
92
90
  log_error "JOB TIMED OUT", ex.backtrace
@@ -31,7 +31,7 @@ Gem::Specification.new do |spec|
31
31
  spec.add_development_dependency "rubocop", "~> 0.32.0"
32
32
  spec.add_development_dependency "pry"
33
33
 
34
- spec.add_runtime_dependency "thin", "~> 1.6.4"
34
+ spec.add_runtime_dependency "thin", "~> 1.6"
35
35
  spec.add_runtime_dependency "grape"
36
36
  spec.add_runtime_dependency "grape-entity"
37
37
  spec.add_runtime_dependency "settingslogic"
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.250.0
4
+ version: 0.250.3
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-05-19 00:00:00.000000000 Z
11
+ date: 2016-05-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -100,14 +100,14 @@ dependencies:
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: 1.6.4
103
+ version: '1.6'
104
104
  type: :runtime
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: 1.6.4
110
+ version: '1.6'
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: grape
113
113
  requirement: !ruby/object:Gem::Requirement
@@ -291,6 +291,7 @@ files:
291
291
  - lib/rest-ftp-daemon/api/status.rb
292
292
  - lib/rest-ftp-daemon/array.rb
293
293
  - lib/rest-ftp-daemon/constants.rb
294
+ - lib/rest-ftp-daemon/counters.rb
294
295
  - lib/rest-ftp-daemon/exceptions.rb
295
296
  - lib/rest-ftp-daemon/helpers.rb
296
297
  - lib/rest-ftp-daemon/job.rb
@@ -308,14 +309,13 @@ files:
308
309
  - lib/rest-ftp-daemon/settings.rb
309
310
  - lib/rest-ftp-daemon/static/css/bootstrap.css
310
311
  - lib/rest-ftp-daemon/static/css/main.css
311
- - lib/rest-ftp-daemon/stats.rb
312
312
  - lib/rest-ftp-daemon/uri.rb
313
313
  - lib/rest-ftp-daemon/views/dashboard.haml
314
+ - lib/rest-ftp-daemon/views/dashboard_counters.haml
314
315
  - lib/rest-ftp-daemon/views/dashboard_footer.haml
315
316
  - lib/rest-ftp-daemon/views/dashboard_header.haml
316
317
  - lib/rest-ftp-daemon/views/dashboard_jobs.haml
317
318
  - lib/rest-ftp-daemon/views/dashboard_rates.haml
318
- - lib/rest-ftp-daemon/views/dashboard_stats.haml
319
319
  - lib/rest-ftp-daemon/views/dashboard_table.haml
320
320
  - lib/rest-ftp-daemon/views/dashboard_tokens.haml
321
321
  - lib/rest-ftp-daemon/views/dashboard_workers.haml