rest-ftp-daemon 0.230.3 → 0.231.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: 3f72c3669b691a64c1051949e27b3c5bef4674da
4
- data.tar.gz: 5fcab534e9f49e300e496fe87d6a38c4f19f678f
3
+ metadata.gz: 66b0655649ee2a3e30ef38f68e1af2d49f1f734f
4
+ data.tar.gz: 6eada364e7297144b6d72f1c3b51a3dd109f0566
5
5
  SHA512:
6
- metadata.gz: 0e67365b6601e4f2ae720277283a5474252097a04fc58b728327dcf755a80c39c50b77fde796dc3810a872dccd50f5b7c4f574c719dac37e102d02de91bde239
7
- data.tar.gz: 1a836471155747b9be417dc4196d1dbcee9abce63502cbe47dc9f9075642ed4fc010e1623350184754b475f7af7fd1579b45c3e16f904f1b71b1647e92af2502
6
+ metadata.gz: a7ce9aad2b8f6bcf1cbc9bfa806c184b67ad79740279e66e73e3c219579fa29c24a4333bbd0b9203fa7d4f67a26bf7b9dd83a4fe8e4bf3ed8e52d68864cc242e
7
+ data.tar.gz: 460b89ca8c5d7405fefa708c42c1a6c9e2c6c5ad9511d363d6561797d387591b073458f52af8caff1c3546e5b9fde34b8bed00e54a229fa48ae9d9c2a6088d26
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rest-ftp-daemon (0.230.3)
4
+ rest-ftp-daemon (0.231.0)
5
5
  double-bag-ftps
6
6
  facter
7
7
  get_process_mem
@@ -19,14 +19,14 @@ GEM
19
19
  remote: http://rubygems.org/
20
20
  specs:
21
21
  CFPropertyList (2.2.8)
22
- activesupport (4.2.3)
22
+ activesupport (4.2.4)
23
23
  i18n (~> 0.7)
24
24
  json (~> 1.7, >= 1.7.7)
25
25
  minitest (~> 5.1)
26
26
  thread_safe (~> 0.3, >= 0.3.4)
27
27
  tzinfo (~> 1.1)
28
28
  addressable (2.3.8)
29
- ast (2.0.0)
29
+ ast (2.1.0)
30
30
  astrolabe (1.3.1)
31
31
  parser (~> 2.2)
32
32
  axiom-types (0.1.1)
@@ -45,12 +45,12 @@ GEM
45
45
  unf (>= 0.0.5, < 1.0.0)
46
46
  double-bag-ftps (0.1.2)
47
47
  equalizer (0.0.11)
48
- eventmachine (1.0.7)
48
+ eventmachine (1.0.8)
49
49
  facter (2.4.4)
50
50
  CFPropertyList (~> 2.2.6)
51
51
  ffi (1.9.10)
52
52
  get_process_mem (0.2.0)
53
- grape (0.12.0)
53
+ grape (0.13.0)
54
54
  activesupport
55
55
  builder
56
56
  hashie (>= 2.1.0)
@@ -60,13 +60,13 @@ GEM
60
60
  rack-accept
61
61
  rack-mount
62
62
  virtus (>= 1.0.0)
63
- grape-entity (0.4.5)
63
+ grape-entity (0.4.8)
64
64
  activesupport
65
65
  multi_json (>= 1.3.2)
66
- haml (4.0.6)
66
+ haml (4.0.7)
67
67
  tilt
68
68
  hashie (3.4.2)
69
- http (0.8.12)
69
+ http (0.9.4)
70
70
  addressable (~> 2.3)
71
71
  http-cookie (~> 1.0)
72
72
  http-form_data (~> 1.0.1)
@@ -79,13 +79,13 @@ GEM
79
79
  ice_nine (0.11.1)
80
80
  json (1.8.3)
81
81
  method_source (0.8.2)
82
- minitest (5.7.0)
82
+ minitest (5.8.0)
83
83
  multi_json (1.11.2)
84
84
  multi_xml (0.5.5)
85
85
  net-sftp (2.1.2)
86
86
  net-ssh (>= 2.6.5)
87
87
  net-ssh (2.9.2)
88
- newrelic_rpm (3.12.1.298)
88
+ newrelic_rpm (3.13.0.299)
89
89
  parser (2.2.2.6)
90
90
  ast (>= 1.1, < 3.0)
91
91
  powerpack (0.1.1)
data/bin/rest-ftp-daemon CHANGED
@@ -20,18 +20,6 @@ end
20
20
  puts
21
21
 
22
22
 
23
- # Provide default config file information
24
- DEFAULT_CONFIG_PATH = File.expand_path "/etc/#{APP_NAME}.yml"
25
- SAMPLE_CONFIG_FILE = File.expand_path("#{app_root}/rest-ftp-daemon.yml.sample")
26
- #SAMPLE_CONFIG_FILE = File.expand_path("#{app_root}/#{APP_NAME}.yml.sample")
27
- TAIL_MESSAGE = <<EOD
28
-
29
- A default configuration is available here: #{SAMPLE_CONFIG_FILE}.
30
- You should copy it to the expected location #{DEFAULT_CONFIG_PATH}:
31
-
32
- sudo cp #{SAMPLE_CONFIG_FILE} #{DEFAULT_CONFIG_PATH}
33
- EOD
34
-
35
23
  # Detect options from ARGV
36
24
  options = {}
37
25
  parser = OptionParser.new do |opts|
@@ -50,7 +38,7 @@ parser = OptionParser.new do |opts|
50
38
  opts.separator ""
51
39
  opts.on_tail("-h", "--help", "Show this message") do
52
40
  puts opts
53
- puts TAIL_MESSAGE unless File.exists?(DEFAULT_CONFIG_PATH)
41
+ puts TAIL_MESSAGE unless File.exist?(DEFAULT_CONFIG_PATH)
54
42
  exit
55
43
  end
56
44
  opts.on_tail("-v", "--version", "Show version (#{APP_VER})") { puts APP_VER; exit }
@@ -72,7 +60,7 @@ end
72
60
  # Load config, and merge options from ARGV into settings
73
61
  # FIXME: file configuration detection could reside in settings.rb
74
62
  APP_CONF ||= DEFAULT_CONFIG_PATH
75
- abort "EXITING: cannot read configuration file: #{APP_CONF}" unless File.exists? APP_CONF
63
+ abort "EXITING: cannot read configuration file: #{APP_CONF}" unless File.exist? APP_CONF
76
64
  begin
77
65
  # Import settings
78
66
  require File.expand_path("#{app_root}/lib/rest-ftp-daemon/settings")
@@ -81,15 +81,15 @@ module RestFtpDaemon
81
81
  optional :overwrite,
82
82
  type: Boolean,
83
83
  desc: "Overwrites files at target server",
84
- default: Settings.transfer[:overwrite]
84
+ default: Settings.at(:transfer, :overwrite)
85
85
  optional :mkdir,
86
86
  type: Boolean,
87
87
  desc: "Create missing directories on target server",
88
- default: Settings.transfer[:mkdir]
88
+ default: Settings.at(:transfer, :mkdir)
89
89
  optional :tempfile,
90
90
  type: Boolean,
91
91
  desc: "Upload to a temp file before renaming it to the target filename",
92
- default: Settings.transfer[:tempfile]
92
+ default: Settings.at(:transfer, :tempfile)
93
93
  end
94
94
 
95
95
  post "/" do
@@ -73,12 +73,22 @@ module RestFtpDaemon
73
73
  status: $queue.counts_by_status,
74
74
  workers: $pool.worker_variables,
75
75
  jobs_count: $queue.jobs_count,
76
- jobs_queued: $queue.queued_ids,
77
- config: Helpers.get_censored_config
76
+ jobs_queued: $queue.queued_ids
78
77
  }
79
78
  end
80
79
 
81
80
 
81
+ ####### GET /config
82
+
83
+ # Server config
84
+ get "/config" do
85
+ log_info "GET /config"
86
+
87
+ status 200
88
+ return Helpers.get_censored_config
89
+ end
90
+
91
+
82
92
  end
83
93
  end
84
94
  end
@@ -1,8 +1,23 @@
1
1
  # Terrific constants
2
2
  APP_NAME = "rest-ftp-daemon"
3
3
  APP_NICK = "rftpd"
4
- APP_VER = "0.230.3"
4
+ APP_VER = "0.231.0"
5
5
 
6
+ # Provide default config file information
7
+ APP_LIB = File.expand_path File.dirname(__FILE__)
8
+ APP_ROOT = File.expand_path(File.dirname(__FILE__) + "/../../")
9
+
10
+ DEFAULT_CONFIG_PATH = File.expand_path "/etc/#{APP_NAME}.yml"
11
+ SAMPLE_CONFIG_FILE = File.expand_path(File.join File.dirname(__FILE__), "/../../rest-ftp-daemon.yml.sample")
12
+
13
+ #SAMPLE_CONFIG_FILE = File.expand_path("#{app_root}/#{APP_NAME}.yml.sample")
14
+ TAIL_MESSAGE = <<EOD
15
+
16
+ A default configuration is available here: #{SAMPLE_CONFIG_FILE}.
17
+ You should copy it to the expected location #{DEFAULT_CONFIG_PATH}:
18
+
19
+ sudo cp #{SAMPLE_CONFIG_FILE} #{DEFAULT_CONFIG_PATH}
20
+ EOD
6
21
 
7
22
  # Jobs and workers
8
23
  JOB_RANDOM_LEN = 8
@@ -40,6 +55,10 @@ LOG_FORMAT_MESSAGE = "%#{-LOG_COL_WID.to_i}s\t%#{-LOG_COL_JID.to_i}s\t%#{-L
40
55
  LOG_NEWLINE = "\n"
41
56
  LOG_INDENT = "\t"
42
57
 
58
+ BIND_PORT_TIMEOUT = 3
59
+ BIND_PORT_LOCALHOST = '127.0.0.1'
60
+
61
+
43
62
 
44
63
  # Notifications
45
64
  NOTIFY_PREFIX = "rftpd"
@@ -64,6 +83,10 @@ DASHBOARD_WORKER_STYLES = {
64
83
  }
65
84
 
66
85
 
86
+ # API server
87
+ # API_LISTEN_HOST = "0.0.0.0"
88
+
89
+
67
90
  # Configuration defaults
68
91
  DEFAULT_WORKER_TIMEOUT = 3600
69
92
  DEFAULT_FTP_CHUNK = 512
@@ -75,4 +98,3 @@ DEFAULT_WORKERS = 1
75
98
  APP_STARTED = Time.now
76
99
  APP_LIBS = File.dirname(__FILE__)
77
100
 
78
-
@@ -43,7 +43,7 @@ module RestFtpDaemon
43
43
  def self.extract_filename path
44
44
  return unless path.is_a? String
45
45
  # match everything that's after a slash at the end of the string
46
- m = path.match /\/?([^\/]+)$/
46
+ m = path.match(/\/?([^\/]+)$/)
47
47
  return m[1] unless m.nil?
48
48
  end
49
49
 
@@ -61,12 +61,10 @@ module RestFtpDaemon
61
61
  end
62
62
 
63
63
  def self.local_port_used? port
64
- ip = "127.0.0.1"
65
- timeout = 1
66
64
  begin
67
- Timeout.timeout(timeout) do
65
+ Timeout.timeout(BIND_PORT_TIMEOUT) do
68
66
  begin
69
- TCPSocket.new(ip, port).close
67
+ TCPSocket.new(BIND_PORT_LOCALHOST, port).close
70
68
  true
71
69
  rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH
72
70
  false
@@ -59,7 +59,7 @@ module RestFtpDaemon
59
59
  flag_default :tempfile, false
60
60
 
61
61
  # Read source file size and parameters
62
- @notify_after_sec = Settings.transfer.notify_after_sec rescue nil
62
+ @notify_after_sec = Settings.at(:transfer, :notify_after_sec) rescue nil
63
63
 
64
64
  # Flag current job
65
65
  @queued_at = Time.now
@@ -176,7 +176,6 @@ module RestFtpDaemon
176
176
  log_info "Job.process notify [ended]"
177
177
  client_notify :ended
178
178
  end
179
-
180
179
  end
181
180
 
182
181
  def get attribute
@@ -440,7 +439,6 @@ module RestFtpDaemon
440
439
  if @tempfile
441
440
  tempname = "#{target.name}.temp-#{Helpers.identifier(JOB_TEMPFILE_LEN)}"
442
441
  #log_info "Job.remote_push tempname [#{tempname}]"
443
- else
444
442
  end
445
443
 
446
444
  # Remove any existing version if expected, or test its presence
@@ -536,7 +534,7 @@ module RestFtpDaemon
536
534
 
537
535
  rescue StandardError => ex
538
536
  log_error "Job.client_notify EXCEPTION: #{ex.inspect}"
539
- end
537
+ end
540
538
 
541
539
  def get_bitrate delta_data, delta_time
542
540
  return nil if delta_time.nil? || delta_time.zero?
@@ -103,7 +103,7 @@ module RestFtpDaemon
103
103
  log_info "find_by_id (#{id}, #{prefixed}) > #{id}"
104
104
 
105
105
  # Search in jobs queues
106
- @jobs.select { |item| item.id == id }.last
106
+ @jobs.reverse.find { |item| item.id == id }
107
107
  end
108
108
 
109
109
  def push job
@@ -138,7 +138,7 @@ module RestFtpDaemon
138
138
 
139
139
  def pop non_block=false
140
140
  @mutex.synchronize do
141
- while true
141
+ loop do
142
142
  if @queue.empty?
143
143
  # info "JobQueue.pop: empty"
144
144
  raise ThreadError, "queue empty" if non_block
@@ -174,7 +174,7 @@ module RestFtpDaemon
174
174
  before = Time.now - maxage.to_i
175
175
 
176
176
  # Verbose output ?
177
- log_info "JobQueue.expire \t[#{status.to_s}] \tbefore \t[#{before}]" if verbose
177
+ log_info "JobQueue.expire \t[#{status}] \tbefore \t[#{before}]" if verbose
178
178
 
179
179
  @mutex.synchronize do
180
180
  # Delete jobs from the queue when they match status and age limits
@@ -186,12 +186,11 @@ module RestFtpDaemon
186
186
  next if job.updated_at > before
187
187
 
188
188
  # Ok, we have to clean it up ..
189
- log_info "expire [#{status.to_s}] [#{maxage}] > [#{job.id}] [#{job.updated_at}]"
189
+ log_info "expire [#{status}] [#{maxage}] > [#{job.id}] [#{job.updated_at}]"
190
190
  log_info "#{LOG_INDENT}unqueued" if @queue.delete(job)
191
191
 
192
192
  true
193
193
  end
194
-
195
194
  end
196
195
 
197
196
  end
@@ -204,7 +203,7 @@ module RestFtpDaemon
204
203
 
205
204
  def sort_queue!
206
205
  @mutex_counters.synchronize do
207
- @queue.sort_by! &:weight
206
+ @queue.sort_by!(&:weight)
208
207
  end
209
208
  end
210
209
 
@@ -25,8 +25,7 @@ class Logger
25
25
  end
26
26
 
27
27
  # Prepend plain message to output
28
- #output.unshift (prefix1 + message.strip)
29
- output.unshift (prefix1 + message)
28
+ output.unshift prefix1 + message
30
29
 
31
30
  # Send all this to logger
32
31
  add context[:level], output
@@ -85,10 +85,8 @@ module RestFtpDaemon
85
85
  # Handle exceptions
86
86
  rescue StandardError => ex
87
87
  log_error "EXCEPTION: #{ex.inspect}"
88
-
89
88
  end
90
89
 
91
-
92
90
  def log_context
93
91
  {
94
92
  id: @id,
@@ -18,14 +18,14 @@ module RestFtpDaemon
18
18
  end
19
19
 
20
20
  def size
21
- File.size full if File.exists? full
21
+ File.size full if File.exist? full
22
22
  end
23
23
 
24
24
  private
25
25
 
26
26
  def extract_filename path
27
27
  # match everything that's after a slash at the end of the string
28
- m = path.match /\/?([^\/]+)$/
28
+ m = path.match(/\/?([^\/]+)$/)
29
29
  return m[1].to_s unless m.nil?
30
30
  end
31
31
 
@@ -14,7 +14,7 @@ module RestFtpDaemon
14
14
  @url.user ||= "anonymous"
15
15
 
16
16
  # Annnounce object
17
- log_info "Remote.initialize [#{url.to_s}]"
17
+ log_info "Remote.initialize [#{url}]"
18
18
  end
19
19
 
20
20
  def connect
@@ -68,15 +68,13 @@ module RestFtpDaemon
68
68
  def chdir_or_create directory, mkdir = false
69
69
  # Init, extract my parent name and my own name
70
70
  log_info "RemoteFTP.chdir_or_create mkdir[#{mkdir}] dir[#{directory}]"
71
- parent, current = Helpers.extract_parent(directory)
72
-
73
- fulldir = "/#{directory}"
71
+ parent, _current = Helpers.extract_parent(directory)
74
72
 
75
73
  # Access this directory
76
74
  begin
77
75
  @ftp.chdir "/#{directory}"
78
76
 
79
- rescue Net::FTPPermError => e
77
+ rescue Net::FTPPermError => _e
80
78
  # If not allowed to create path, that's over, we're stuck
81
79
  return false unless mkdir
82
80
 
@@ -112,7 +110,6 @@ module RestFtpDaemon
112
110
  # Update job status after this block transfer
113
111
  yield data.bytesize, destination.name
114
112
  end
115
-
116
113
  end
117
114
 
118
115
  def close
@@ -137,7 +134,7 @@ module RestFtpDaemon
137
134
  @ftp = DoubleBagFTPS.new
138
135
  @ftp.ssl_context = DoubleBagFTPS.create_ssl_context(verify_mode: OpenSSL::SSL::VERIFY_NONE)
139
136
  @ftp.ftps_mode = DoubleBagFTPS::EXPLICIT
140
- end
137
+ end
141
138
 
142
139
 
143
140
  end
@@ -30,12 +30,11 @@ module RestFtpDaemon
30
30
  def present? target
31
31
  log_info "RemoteSFTP.present? [#{target.name}]"
32
32
  stat = @sftp.stat! target.full
33
- size = "?"
34
33
 
35
- rescue Net::SFTP::StatusException
36
- return false
37
- else
38
- return stat.size
34
+ rescue Net::SFTP::StatusException
35
+ return false
36
+ else
37
+ return stat.size
39
38
  end
40
39
 
41
40
  # def remove target
@@ -64,14 +63,14 @@ module RestFtpDaemon
64
63
  def chdir_or_create directory, mkdir = false
65
64
  # Init, extract my parent name and my own name
66
65
  log_info "RemoteSFTP.chdir_or_create mkdir[#{mkdir}] dir[#{directory}]"
67
- parent, current = Helpers.extract_parent(directory)
66
+ parent, _current = Helpers.extract_parent(directory)
68
67
 
69
68
  # Access this directory
70
69
  begin
71
70
  # log_info " chdir [/#{directory}]"
72
- handle = @sftp.opendir! "./#{directory}"
71
+ @sftp.opendir! "./#{directory}"
73
72
 
74
- rescue Net::SFTP::StatusException => e
73
+ rescue Net::SFTP::StatusException => _e
75
74
  # If not allowed to create path, that's over, we're stuck
76
75
  return false unless mkdir
77
76
 
@@ -3,16 +3,10 @@ require "settingslogic"
3
3
  # Configuration class
4
4
  class Settings < Settingslogic
5
5
  # Read configuration
6
- namespace (defined?(APP_ENV) ? APP_ENV : "production")
7
- source ((File.exists? APP_CONF) ? APP_CONF : Hash.new)
6
+ namespace defined?(APP_ENV) ? APP_ENV : "production"
7
+ source File.exist?(APP_CONF) ? APP_CONF : Hash.new
8
8
  suppress_errors true
9
9
 
10
- # Compute my PID filename
11
- def pidfile
12
- port = self["port"]
13
- self["pidfile"] || "/tmp/#{APP_NAME}.port#{port}.pid"
14
- end
15
-
16
10
  # Direct access to any depth
17
11
  def at *path
18
12
  path.reduce(Settings) { |m, key| m && m[key.to_s] }
@@ -23,31 +17,42 @@ class Settings < Settingslogic
23
17
  to_hash.to_yaml(indent: 4, useheader: true, useversion: false )
24
18
  end
25
19
 
26
- def init_defaults
27
- Settings["host"] ||= `hostname`.chomp.split(".").first
28
- end
29
-
30
20
  def newrelic_enabled?
31
21
  Settings.at(:newrelic)
32
22
  end
33
23
 
34
- def init_newrelic
35
- # Skip if not enabled
36
- return ENV["NEWRELIC_AGENT_ENABLED"] = "false" unless Settings.newrelic_enabled?
24
+ def init_defaults
25
+ # Init host if missing
26
+ Settings["host"] ||= `hostname`.chomp.split(".").first
27
+
28
+ # Init PID file name if missing
29
+ Settings["pidfile"] ||= "/tmp/#{APP_NAME}-#{Settings['host']}-#{Settings['port']}.pid"
37
30
 
38
- # Enable module
39
- ENV["NEWRELIC_AGENT_ENABLED"] = "true"
40
- ENV["NEW_RELIC_MONITOR_MODE"] = "true"
31
+ # Init NEWRELIC env
32
+ if Settings.newrelic_enabled?
33
+ # Enable module
34
+ ENV["NEWRELIC_AGENT_ENABLED"] = "true"
35
+ ENV["NEW_RELIC_MONITOR_MODE"] = "true"
41
36
 
42
- # License
43
- ENV["NEW_RELIC_LICENSE_KEY"] = Settings.at(:newrelic, :licence)
37
+ # License
38
+ ENV["NEW_RELIC_LICENSE_KEY"] = Settings.at(:newrelic, :licence)
44
39
 
45
- # Appname
46
- platform = Settings.at(:newrelic, :platform) || Settings["host"]
47
- ENV["NEW_RELIC_APP_NAME"] = "#{APP_NICK}-#{platform}-#{APP_ENV}"
40
+ # Appname
41
+ platform = Settings.newrelic[:platform] || Settings["host"]
42
+ Settings.newrelic[:app_name] ||= "#{APP_NICK}-#{platform}-#{Settings.namespace}"
43
+ ENV["NEW_RELIC_APP_NAME"] = Settings.newrelic[:app_name]
44
+
45
+ # Logfile
46
+ ENV["NEW_RELIC_LOG"] = Settings.at(:logs, :newrelic)
47
+ else
48
+ ENV["NEWRELIC_AGENT_ENABLED"] = "false"
49
+ end
50
+
51
+ # That's it!
52
+ end
48
53
 
49
- # Logfile
50
- ENV["NEW_RELIC_LOG"] = Settings.at(:logs, :newrelic)
54
+ def overwrite options
55
+ Settings.merge!(options) if options.is_a? Enumerable
51
56
  end
52
57
 
53
58
  end
@@ -57,7 +57,6 @@ module RestFtpDaemon
57
57
  else
58
58
  # Clean job status
59
59
  job.wid = nil
60
-
61
60
  end
62
61
 
63
62
 
@@ -72,7 +72,6 @@ module RestFtpDaemon
72
72
 
73
73
  rescue StandardError => ex
74
74
  log_error "UNHDNALED EXCEPTION: #{ex.message}", ex.backtrace
75
-
76
75
  end
77
76
 
78
77
  def create_worker_thread wid
@@ -97,12 +96,12 @@ module RestFtpDaemon
97
96
  end
98
97
  end
99
98
 
100
- protected
101
99
 
102
- if Settings.newrelic_enabled?
103
- add_transaction_tracer :create_conchita_thread, category: :task
104
- add_transaction_tracer :create_worker_thread, category: :task
105
- end
100
+
101
+ if Settings.newrelic_enabled?
102
+ add_transaction_tracer :create_conchita_thread, category: :task
103
+ add_transaction_tracer :create_worker_thread, category: :task
104
+ end
106
105
 
107
106
  end
108
107
  end
@@ -21,8 +21,9 @@ defaults: &defaults
21
21
  # clean_queued: 86400
22
22
 
23
23
  newrelic:
24
- licence: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
25
- platform: devel # nickname used for naming app
24
+ licence: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
25
+ platform: "bigbusiness" # app platform name
26
+ app_name: "rftpd-bigbusiness-dev" # nickname used for naming app
26
27
 
27
28
  debug:
28
29
  ftp: false
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.230.3
4
+ version: 0.231.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-07-22 00:00:00.000000000 Z
11
+ date: 2015-08-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler