rest-ftp-daemon 0.231.1 → 0.240.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: 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