rest-ftp-daemon 0.231.1 → 0.240.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b0b3836e8b886599053c67f24487187570d24f7f
4
- data.tar.gz: 678679b81b46d4cb3282c3ed28a1f668e82bb127
3
+ metadata.gz: d93647c6c82dc619334ae8f906604f0b3472def0
4
+ data.tar.gz: 00175925d0ffe1d63c3f8b6f21a79985f02ebbb5
5
5
  SHA512:
6
- metadata.gz: e5f5dad39c56dae2b4a08b720851d884375ecbf0ba8e43e33fce0f700d629b1831102ec1d20658513559d38491a7debb15b9352e32f2cc0e306d5927c8d17ae7
7
- data.tar.gz: 724fcc5d35cbd4b6190490b88403b78f56ba6a904a63468991cb8ad9937b62ca21fd9ad7c9b4b07cbab0b1025ff5e81d41cf508be70826395fb5734ed0af02bb
6
+ metadata.gz: 08ec5e3fe94b08fd1caa9cae780e32a5ddff96736ce8dcee10d0da70356b36adc3b60bee52c825eac97f3a1704c4aab450c7d778b710eb42477ac2c74ef5defc
7
+ data.tar.gz: 3479a4a57c9396f39bf8cb5a50b061a1887b5bd2e565621f856976dc7b55b4a51a0c4b078cde8e216c41e81aa91f40cae6b0ee10091f550a725281530012c43f
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rest-ftp-daemon (0.231.1)
4
+ rest-ftp-daemon (0.240.0)
5
5
  double-bag-ftps
6
6
  facter
7
7
  get_process_mem
@@ -10,6 +10,7 @@ PATH
10
10
  haml
11
11
  json
12
12
  net-sftp
13
+ net-ssh (~> 2.10.1.rc1)
13
14
  newrelic_rpm
14
15
  settingslogic
15
16
  sys-cpu
@@ -84,7 +85,7 @@ GEM
84
85
  multi_xml (0.5.5)
85
86
  net-sftp (2.1.2)
86
87
  net-ssh (>= 2.6.5)
87
- net-ssh (2.9.2)
88
+ net-ssh (2.10.1.rc1)
88
89
  newrelic_rpm (3.13.0.299)
89
90
  parser (2.2.2.6)
90
91
  ast (>= 1.1, < 3.0)
data/bin/rest-ftp-daemon CHANGED
@@ -45,7 +45,6 @@ parser = OptionParser.new do |opts|
45
45
  end
46
46
 
47
47
 
48
-
49
48
  # Parse options and check compliance
50
49
  begin
51
50
  parser.order!(ARGV)
@@ -60,6 +59,7 @@ end
60
59
  # Load config, and merge options from ARGV into settings
61
60
  # FIXME: file configuration detection could reside in settings.rb
62
61
  APP_CONF ||= DEFAULT_CONFIG_PATH
62
+ APP_ENV ||= "production"
63
63
  abort "EXITING: cannot read configuration file: #{APP_CONF}" unless File.exist? APP_CONF
64
64
  begin
65
65
  # Import settings
@@ -92,12 +92,13 @@ end
92
92
 
93
93
 
94
94
  # ARGV: build final
95
+ thin_logs = Settings.at(:logs, :thin)
95
96
  argv = []
96
97
  argv << ["-e", Settings.namespace]
97
98
  argv << ["-p", Settings.port.to_s] if Settings.port
98
99
  argv << ["--pid", Settings.pidfile]
99
100
  argv << ["--tag", "'#{APP_NAME}/#{Settings.namespace}'"]
100
- argv << ["--log", Settings.at(:logs, :thin)]
101
+ argv << ["--log", thin_logs] unless !thin_logs
101
102
  argv << ["--daemonize"] if [1, true].include? Settings.daemonize
102
103
 
103
104
 
@@ -29,7 +29,7 @@ module RestFtpDaemon
29
29
 
30
30
  # Check that Queue and Pool are available
31
31
  raise RestFtpDaemon::MissingQueue unless defined? $queue
32
- raise RestFtpDaemon::MissingQueue unless defined? $pool
32
+ raise RestFtpDaemon::MissingPool unless defined? $pool
33
33
  end
34
34
 
35
35
 
@@ -63,7 +63,7 @@ module RestFtpDaemon
63
63
 
64
64
  status 200
65
65
  return {
66
- hostname: `hostname`.chomp,
66
+ hostname: `hostname`.to_s.chomp,
67
67
  version: APP_VER,
68
68
  started: APP_STARTED,
69
69
  uptime: (Time.now - APP_STARTED).round(1),
@@ -88,6 +88,19 @@ module RestFtpDaemon
88
88
  return Helpers.get_censored_config
89
89
  end
90
90
 
91
+ # Server config
92
+ post "/config/reload" do
93
+ log_info "POST /config/reload"
94
+
95
+ if Settings.at(:debug, :allow_reload)==true
96
+ Settings.reload!
97
+ status 200
98
+ return Helpers.get_censored_config
99
+ else
100
+ status 403
101
+ return "Config reload not permitted"
102
+ end
103
+ end
91
104
 
92
105
  end
93
106
  end
@@ -1,7 +1,7 @@
1
1
  # Terrific constants
2
2
  APP_NAME = "rest-ftp-daemon"
3
3
  APP_NICK = "rftpd"
4
- APP_VER = "0.231.1"
4
+ APP_VER = "0.240.0"
5
5
 
6
6
  # Provide default config file information
7
7
  APP_LIB = File.expand_path File.dirname(__FILE__)
@@ -16,6 +16,7 @@ module RestFtpDaemon
16
16
  attr_reader :id
17
17
  attr_reader :error
18
18
  attr_reader :status
19
+ attr_reader :runs
19
20
 
20
21
  attr_reader :queued_at
21
22
  attr_reader :updated_at
@@ -40,6 +41,7 @@ module RestFtpDaemon
40
41
  @finished_at = nil
41
42
  @error = nil
42
43
  @status = nil
44
+ @runs = 0
43
45
  @wid = nil
44
46
 
45
47
  # Logger
@@ -146,6 +148,9 @@ module RestFtpDaemon
146
148
  rescue Net::SFTP::StatusException => exception
147
149
  return oops :ended, exception, :sftp_exception
148
150
 
151
+ rescue Net::SSH::AuthenticationFailed => exception
152
+ return oops :ended, exception, :sftp_auth_failed
153
+
149
154
  rescue Errno::EMFILE => exception
150
155
  return oops :ended, exception, :too_many_open_files
151
156
 
@@ -186,7 +191,11 @@ module RestFtpDaemon
186
191
  end
187
192
 
188
193
  def weight
189
- @weight = [@priority.to_i, -@queued_at.to_i]
194
+ @weight = [
195
+ - @runs.to_i,
196
+ + @priority.to_i,
197
+ - @queued_at.to_i
198
+ ]
190
199
  end
191
200
 
192
201
  def exectime
@@ -207,13 +216,13 @@ module RestFtpDaemon
207
216
  oops :ended, exception, :timeout
208
217
  end
209
218
 
210
- protected
211
-
212
219
  def age
213
220
  return nil if @queued_at.nil?
214
221
  (Time.now - @queued_at).round(2)
215
222
  end
216
223
 
224
+ protected
225
+
217
226
  def set attribute, value
218
227
  @mutex.synchronize do
219
228
  @params || {}
@@ -259,6 +268,7 @@ module RestFtpDaemon
259
268
  def prepare
260
269
  # Update job status
261
270
  newstatus :prepare
271
+ @runs += 1
262
272
 
263
273
  # Init
264
274
  @source_method = :file
@@ -81,10 +81,6 @@ module RestFtpDaemon
81
81
  statuses
82
82
  end
83
83
 
84
- def jobs # change for accessor
85
- @jobs
86
- end
87
-
88
84
  def jobs_count
89
85
  @jobs.length
90
86
  end
@@ -106,17 +102,18 @@ module RestFtpDaemon
106
102
  @jobs.reverse.find { |item| item.id == id }
107
103
  end
108
104
 
105
+
109
106
  def push job
110
107
  # Check that item responds to "priorty" method
111
108
  raise "JobQueue.push: job should respond to priority method" unless job.respond_to? :priority
112
109
  raise "JobQueue.push: job should respond to id method" unless job.respond_to? :id
113
110
 
114
111
  @mutex.synchronize do
115
- # Push job into the queue
116
- @queue.push job
112
+ # Store the job into the global jobs list, if not already inside
113
+ @jobs.push(job) unless @jobs.include?(job)
117
114
 
118
- # Store the job into the global jobs list
119
- @jobs.push job
115
+ # Push job into the queue, if not already inside
116
+ @queue.push(job) unless @queue.include?(job)
120
117
 
121
118
  # Inform the job that it's been queued
122
119
  job.set_queued if job.respond_to? :set_queued
@@ -133,8 +130,9 @@ module RestFtpDaemon
133
130
  end
134
131
  end
135
132
  end
136
- alias << push
137
- alias enq push
133
+ alias << push
134
+ alias enq push
135
+ alias requeue push
138
136
 
139
137
  def pop non_block=false
140
138
  @mutex.synchronize do
@@ -84,7 +84,7 @@ module RestFtpDaemon
84
84
 
85
85
  # Handle exceptions
86
86
  rescue StandardError => ex
87
- log_error "EXCEPTION: #{ex.inspect}"
87
+ log_error "NOTIFICATION EXCEPTION: #{ex.inspect}"
88
88
  end
89
89
 
90
90
  def log_context
@@ -49,7 +49,7 @@ module RestFtpDaemon
49
49
  def link p
50
50
  klass = (p == @page)? " btn-info" : ""
51
51
 
52
- "<a class='page btn btn-default%s' href='?only=%s&page=%d'>%p</a>" % [
52
+ "<a class='paginate btn btn-default%s' href='?only=%s&page=%d'>%p</a>" % [
53
53
  klass,
54
54
  @only,
55
55
  p,
@@ -24,7 +24,13 @@ module RestFtpDaemon
24
24
  verbosity = @debug ? Logger::INFO : false
25
25
 
26
26
  # Connect remote server
27
- @sftp = Net::SFTP.start(@url.host, @url.user, password: @url.password, verbose: verbosity, port: @url.port)
27
+ @sftp = Net::SFTP.start(@url.host.to_s, @url.user.to_s,
28
+ password: @url.password.to_s,
29
+ verbose: verbosity,
30
+ port: @url.port,
31
+ non_interactive: true,
32
+ #timeout: 3
33
+ )
28
34
  end
29
35
 
30
36
  def present? target
@@ -3,7 +3,7 @@ require "settingslogic"
3
3
  # Configuration class
4
4
  class Settings < Settingslogic
5
5
  # Read configuration
6
- namespace defined?(APP_ENV) ? APP_ENV : "production"
6
+ namespace APP_ENV
7
7
  source File.exist?(APP_CONF) ? APP_CONF : Hash.new
8
8
  suppress_errors true
9
9
 
@@ -23,7 +23,7 @@ class Settings < Settingslogic
23
23
 
24
24
  def init_defaults
25
25
  # Init host if missing
26
- Settings["host"] ||= `hostname`.chomp.split(".").first
26
+ Settings["host"] ||= `hostname`.to_s.chomp.split(".").first
27
27
 
28
28
  # Init PID file name if missing
29
29
  Settings["pidfile"] ||= "/tmp/#{APP_NICK}-#{Settings['host']}-#{Settings['port']}.pid"
@@ -21,8 +21,8 @@ body, table tr td, .fixed {
21
21
 
22
22
  .label {
23
23
  font-size: 1em;
24
- padding: 3px 3px 1px 3px;
25
- margin-bottom: 1px ;
24
+ padding: 2px 3px 2px 3px;
25
+ margin-bottom: 1px;
26
26
  font-weight: normal;
27
27
  display: inline-block;
28
28
  font-family: sans-serif;
@@ -68,9 +68,6 @@ a.class {
68
68
  }
69
69
 
70
70
 
71
-
72
-
73
-
74
71
  /* Header styles
75
72
  -------------------------------------------------- */
76
73
  .header-indicators {
@@ -80,6 +77,12 @@ a.class {
80
77
  }
81
78
 
82
79
 
80
+ .paginate {
81
+ padding-left: 7px !important;
82
+ padding-right: 7px !important;
83
+ }
84
+
85
+
83
86
  /* Footer styles
84
87
  -------------------------------------------------- */
85
88
  html {
@@ -4,7 +4,7 @@
4
4
 
5
5
  .row
6
6
 
7
- .col-md-5
7
+ .col-md-4
8
8
  .btn-group.btn-group-sm
9
9
  - klass = @only.empty? ? "btn-info" : ""
10
10
  %a.btn.btn-default{href: "?only=", class: klass}
@@ -15,7 +15,7 @@
15
15
  %a.btn.btn-default{href: "?only=#{status}", class: klass}
16
16
  #{status} (#{count})
17
17
 
18
- .col-md-7
18
+ .col-md-8
19
19
  .btn-group.btn-group-sm
20
20
  = @paginate.browser
21
21
 
@@ -38,7 +38,9 @@
38
38
  %th{"min-width" => 120} error
39
39
  %th.text-right size
40
40
  %th.text-right bitrate
41
- %th info
41
+ %th W
42
+ %th P
43
+ %th R
42
44
 
43
45
  - unless @queue.empty?
44
46
  %tbody.jobs
@@ -63,13 +63,22 @@
63
63
  = Helpers.format_bytes(bitrate, "bps")
64
64
 
65
65
  %td
66
- - unless job.priority.nil?
67
- .label.label-default.flag.worker-label= job.priority
68
-
69
66
  - unless job.wid.nil?
70
67
  .label.label-warning.flag.worker-label= job.wid
71
68
 
69
+ %td
70
+ - unless job.priority.nil?
71
+ .label.label-default.flag.worker-label= job.priority
72
+
73
+ %td
74
+ - unless job.runs.nil? || job.runs.zero?
75
+ .label.label-info.flag.worker-label= job.runs
72
76
 
77
+ -#%td
78
+ - unless job.priority.nil?
79
+ .label.label-default.flag.worker-label= job.priority
73
80
 
81
+ - unless job.wid.nil?
82
+ .label.label-warning.flag.worker-label= job.wid
74
83
 
75
84
 
@@ -26,7 +26,7 @@ module RestFtpDaemon
26
26
  def log_context
27
27
  {
28
28
  wid: @wid,
29
- tag_1_worker_object: true
29
+ jid: Thread.current.thread_variable_get(:jid),
30
30
  }
31
31
  end
32
32
 
@@ -41,7 +41,7 @@ module RestFtpDaemon
41
41
  end
42
42
  end
43
43
 
44
- def worker_status status, extra = ""
44
+ def worker_status status, job = nil
45
45
  # Update thread variables
46
46
  Thread.current.thread_variable_set :status, status
47
47
  Thread.current.thread_variable_set :updted_at, Time.now
@@ -50,7 +50,11 @@ module RestFtpDaemon
50
50
  return unless @log_worker_status_changes
51
51
 
52
52
  # Log this status change
53
- log_info "worker: #{status} #{extra}"
53
+ if job.is_a?(Job)
54
+ log_info "#{status} - job[#{job.id}] status[#{job.status}] error[#{job.error}]"
55
+ else
56
+ log_info "#{status}"
57
+ end
54
58
  end
55
59
 
56
60
  def worker_jid jid
@@ -37,7 +37,7 @@ module RestFtpDaemon
37
37
  GC.start if @conchita["garbage_collector"]
38
38
 
39
39
  rescue StandardError => e
40
- log_error "EXCEPTION: #{e.inspect}"
40
+ log_error "CONCHITA EXCEPTION: #{e.inspect}"
41
41
  sleep 1
42
42
  else
43
43
  # Restore previous status
@@ -16,13 +16,50 @@ module RestFtpDaemon
16
16
  protected
17
17
 
18
18
  def work
19
- # Wait for a job to come into the queue
19
+ # Wait for a job to be available in the queue
20
20
  worker_status WORKER_STATUS_WAITING
21
- #log_info "waiting"
22
21
  job = $queue.pop
23
22
 
24
- # Prepare the job for processing
25
- worker_status WORKER_STATUS_RUNNING, "job [#{job.id}]"
23
+ # Work on this job
24
+ work_on_job(job)
25
+
26
+ # Clean job status and sleep for 1s
27
+ job.wid = nil
28
+ sleep 1
29
+
30
+ # If job status requires a retry, just restack it
31
+ on_errors = Settings.at(:retry, :on_errors)
32
+ max_age = Settings.at(:retry, :max_age)
33
+ max_runs = Settings.at(:retry, :max_runs)
34
+
35
+ if !job.error
36
+ #log_info "job succeeded"
37
+
38
+ elsif !(on_errors.is_a?(Enumerable) && on_errors.include?(job.error.to_s))
39
+ log_error "not retrying: error not eligible"
40
+
41
+ elsif max_age && (job.age >= max_age)
42
+ log_error "not retrying: too old (max_age: #{max_age})"
43
+
44
+ elsif max_runs && (job.runs >= max_runs)
45
+ log_error "not retrying: too many runs (max_runs: #{max_runs})"
46
+
47
+ else
48
+ log_info "retrying job: requeued"
49
+ $queue.requeue job
50
+ end
51
+
52
+ # Clean worker status
53
+ worker_jid nil
54
+
55
+ rescue StandardError => ex
56
+ log_error "WORKER UNHANDLED EXCEPTION: #{ex.message}", ex.backtrace
57
+ worker_status WORKER_STATUS_CRASHED
58
+ end
59
+
60
+ def work_on_job job
61
+ # Prepare job and worker for processing
62
+ worker_status WORKER_STATUS_RUNNING, job
26
63
  worker_jid job.id
27
64
  job.wid = Thread.current.thread_variable_get :wid
28
65
 
@@ -32,9 +69,7 @@ module RestFtpDaemon
32
69
  end
33
70
 
34
71
  # Processing done
35
- worker_status WORKER_STATUS_FINISHED, "job [#{job.id}]"
36
- worker_jid nil
37
- job.wid = nil
72
+ worker_status WORKER_STATUS_FINISHED, job
38
73
 
39
74
  # Increment total processed jobs count
40
75
  $queue.counter_inc :jobs_processed
@@ -42,24 +77,18 @@ module RestFtpDaemon
42
77
  rescue RestFtpDaemon::JobTimeout => ex
43
78
  log_error "JOB TIMED OUT", ex.backtrace
44
79
  worker_status WORKER_STATUS_TIMEOUT
45
- worker_jid nil
46
- job.wid = nil
47
80
 
81
+ # Inform the job
48
82
  job.oops_you_stop_now ex unless job.nil?
49
- sleep 1
50
83
 
51
84
  rescue StandardError => ex
52
- log_error "JOB UNHDNALED EXCEPTION: #{ex.message}", ex.backtrace
85
+ log_error "JOB UNHANDLED EXCEPTION: #{ex.message}", ex.backtrace
53
86
  worker_status WORKER_STATUS_CRASHED
54
- job.oops_after_crash ex unless job.nil?
55
- sleep 1
56
87
 
57
- else
58
- # Clean job status
59
- job.wid = nil
88
+ # Inform the job
89
+ job.oops_after_crash ex unless job.nil?
60
90
  end
61
91
 
62
-
63
92
  if Settings.newrelic_enabled?
64
93
  add_transaction_tracer :work, category: :task
65
94
  end
@@ -71,7 +71,7 @@ module RestFtpDaemon
71
71
  @conchita = create_conchita_thread
72
72
 
73
73
  rescue StandardError => ex
74
- log_error "UNHDNALED EXCEPTION: #{ex.message}", ex.backtrace
74
+ log_error "UNHANDLED EXCEPTION: #{ex.message}", ex.backtrace
75
75
  end
76
76
 
77
77
  def create_worker_thread wid
@@ -80,7 +80,7 @@ module RestFtpDaemon
80
80
  worker = JobWorker.new wid
81
81
  log_info "JobWorker [#{wid}]: #{worker}"
82
82
  rescue StandardError => ex
83
- log_error "EXCEPTION: #{ex.message}"
83
+ log_error "JobWorker EXCEPTION: #{ex.message}"
84
84
  end
85
85
  end
86
86
  end
@@ -91,13 +91,11 @@ module RestFtpDaemon
91
91
  worker = ConchitaWorker.new :conchita
92
92
  log_info "ConchitaWorker: #{worker}"
93
93
  rescue StandardError => ex
94
- log_error "EXCEPTION: #{ex.message}"
94
+ log_error "ConchitaWorker EXCEPTION: #{ex.message}"
95
95
  end
96
96
  end
97
97
  end
98
98
 
99
-
100
-
101
99
  if Settings.newrelic_enabled?
102
100
  add_transaction_tracer :create_conchita_thread, category: :task
103
101
  add_transaction_tracer :create_worker_thread, category: :task
@@ -39,6 +39,7 @@ Gem::Specification.new do |spec|
39
39
  spec.add_runtime_dependency "settingslogic"
40
40
  spec.add_runtime_dependency "haml"
41
41
  spec.add_runtime_dependency "json"
42
+ spec.add_runtime_dependency "net-ssh", "~> 2.10.1.rc1"
42
43
  spec.add_runtime_dependency "net-sftp"
43
44
  spec.add_runtime_dependency "double-bag-ftps"
44
45
  spec.add_runtime_dependency "facter"
@@ -7,11 +7,16 @@ defaults: &defaults
7
7
  #host: "myhost"
8
8
 
9
9
  transfer:
10
- notify_after_sec: 5 # wait at least X seconds between HTTP notifications
11
- mkdir: true # build directory tree if missing
12
- tempfile: true # transfer to temporary file, rename after sucessful transfer
13
- overwrite: false # overwrite any target file with the same name
14
- timeout: 1800 # jobs running for longer than X seconds will be killed
10
+ # notify_after_sec: 5 # wait at least X seconds between HTTP notifications
11
+ # mkdir: true # build directory tree if missing
12
+ # tempfile: true # transfer to temporary file, rename after sucessful transfer
13
+ # overwrite: false # overwrite any target file with the same name
14
+ # timeout: 1800 # jobs running for longer than X seconds will be killed
15
+
16
+ retry:
17
+ # on_errors: ["net_temp_error", "conn_reset_by_peer", "conn_timed_out", "conn_refused"]
18
+ # max_runs: 5
19
+ # max_age: 1800
15
20
 
16
21
  conchita:
17
22
  # timer: 60
@@ -26,9 +31,10 @@ defaults: &defaults
26
31
  app_name: "rftpd-bigbusiness-dev" # nickname used for naming app
27
32
 
28
33
  debug:
29
- ftp: false
30
- sftp: false
31
- conchita: false
34
+ # ftp: false
35
+ # sftp: false
36
+ # conchita: false
37
+ # allow_reload: false
32
38
 
33
39
  logs:
34
40
  thin: "/var/log/rftpd-environment-thin.log"
data/spec/spec_helper.rb CHANGED
@@ -57,10 +57,16 @@ RSpec.configure do |config|
57
57
 
58
58
  config.before :suite do
59
59
  call_server(:start)
60
- sleep 2
60
+ puts
61
+ puts ">> waiting for server to bootup"
62
+ puts
63
+ sleep 5
61
64
  end
62
65
 
63
66
  config.after :suite do
67
+ puts
68
+ puts ">> shutting sown server"
69
+ puts
64
70
  call_server(:stop)
65
71
  end
66
72
  end
@@ -3,7 +3,7 @@ test:
3
3
  port: 5678
4
4
  workers: 2
5
5
  adminpwd: "admin"
6
- host: 127.0.0.1
6
+ host: local
7
7
 
8
8
  transfer:
9
9
  notify_after_sec: 5
@@ -16,10 +16,10 @@ test:
16
16
  ftp: false
17
17
 
18
18
  logs:
19
- thin: "./tmp/log/rftpd-environment-thin.log"
20
- queue: "./tmp/log/rftpd-environment-core.log"
21
- api: "./tmp/log/rftpd-environment-core.log"
22
- workers: "./tmp/log/rftpd-environment-work.log"
23
- jobs: "./tmp/log/rftpd-environment-work.log"
24
- notify: "./tmp/log/rftpd-environment-work.log"
25
- newrelic: "/var/log/rftpd-environment-newrelic.log"
19
+ thin: "/tmp/rftpd-tests-thin.log"
20
+ queue: "/tmp/rftpd-tests-core.log"
21
+ api: "/tmp/rftpd-tests-core.log"
22
+ workers: "/tmp/rftpd-tests-work.log"
23
+ jobs: "/tmp/rftpd-tests-work.log"
24
+ notify: "/tmp/rftpd-tests-work.log"
25
+ newrelic: "/tmp/rftpd-tests-newrelic.log"
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.231.1
4
+ version: 0.240.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-08-26 00:00:00.000000000 Z
11
+ date: 2015-08-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -178,6 +178,20 @@ dependencies:
178
178
  - - ">="
179
179
  - !ruby/object:Gem::Version
180
180
  version: '0'
181
+ - !ruby/object:Gem::Dependency
182
+ name: net-ssh
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - "~>"
186
+ - !ruby/object:Gem::Version
187
+ version: 2.10.1.rc1
188
+ type: :runtime
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - "~>"
193
+ - !ruby/object:Gem::Version
194
+ version: 2.10.1.rc1
181
195
  - !ruby/object:Gem::Dependency
182
196
  name: net-sftp
183
197
  requirement: !ruby/object:Gem::Requirement