runit-man 2.3.21 → 2.4.0a1

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.
data/lib/runit-man/app.rb CHANGED
@@ -53,17 +53,21 @@ class RunitMan::App < Sinatra::Base
53
53
 
54
54
  def self.setup_i18n_files
55
55
  files = []
56
+
56
57
  Dir.glob("#{i18n_location}/*.yml") do |full_path|
57
- next unless File.file?(full_path)
58
+ next unless File.file?(full_path)
59
+
58
60
  files << full_path
59
61
  end
62
+
60
63
  I18n.load_path = files
61
64
  I18n.reload!
62
- nil
65
+ nil
63
66
  end
64
67
 
65
68
  configure do
66
69
  RunitMan::App.setup_i18n_files
70
+
67
71
  haml_options = { :ugly => true }
68
72
  haml_options[:encoding] = 'utf-8' if defined?(Encoding)
69
73
  set :haml, haml_options
@@ -76,16 +80,20 @@ class RunitMan::App < Sinatra::Base
76
80
  else
77
81
  ServiceInfo.klass = ServiceInfo::Logger
78
82
  end
83
+
79
84
  @read_write_mode = RunitMan::App.read_write_mode
80
85
  @scripts = []
86
+
81
87
  base_content_type = CONTENT_TYPES.keys.detect do |t|
82
88
  request.env['REQUEST_URI'] =~ /\.#{Regexp.escape(t.to_s)}$/
83
89
  end || :html
84
90
  content_type CONTENT_TYPES[base_content_type], :charset => 'utf-8'
91
+
85
92
  headers({
86
93
  'X-Powered-By' => 'runit-man',
87
94
  'X-Version' => RunitMan::VERSION
88
95
  })
96
+
89
97
  parse_language(request.env['HTTP_ACCEPT_LANGUAGE'])
90
98
  end
91
99
 
@@ -100,6 +108,7 @@ class RunitMan::App < Sinatra::Base
100
108
 
101
109
  def parse_language(header)
102
110
  weighted_locales = []
111
+
103
112
  if header
104
113
  header.split(',').each do |s|
105
114
  if s =~ /^(.+)\;q\=(\d(?:\.\d)?)$/
@@ -109,12 +118,15 @@ class RunitMan::App < Sinatra::Base
109
118
  end
110
119
  end
111
120
  end
121
+
112
122
  weighted_locales << { :locale => :en, :weight => 0.0 }
123
+
113
124
  if weighted_locales.length >= 2
114
125
  weighted_locales.sort! do |a, b|
115
126
  b[:weight] <=> a[:weight]
116
127
  end
117
128
  end
129
+
118
130
  locales = weighted_locales.map { |wl| wl[:locale] }
119
131
  setup_i18n(locales)
120
132
  end
@@ -146,7 +158,8 @@ class RunitMan::App < Sinatra::Base
146
158
  count = MIN_TAIL if count < MIN_TAIL
147
159
  count = MAX_TAIL if count > MAX_TAIL
148
160
  srv = ServiceInfo.klass[name]
149
- return nil if srv.nil? || !srv.logged?
161
+ return nil if srv.nil? || !srv.logged?
162
+
150
163
  text = ''
151
164
  File::Tail::Logfile.open(srv.log_file_location, :backward => count, :return_if_eof => true) do |log|
152
165
  log.tail do |line|
@@ -171,8 +184,10 @@ class RunitMan::App < Sinatra::Base
171
184
  if !request.GET.has_key?('file')
172
185
  return nil
173
186
  end
187
+
174
188
  file_path = request.GET['file']
175
- return nil unless all_files_to_view.include?(file_path)
189
+ return nil unless all_files_to_view.include?(file_path)
190
+
176
191
  text = IO.read(file_path)
177
192
  {
178
193
  :name => file_path,
@@ -182,7 +197,8 @@ class RunitMan::App < Sinatra::Base
182
197
 
183
198
  get %r[^/([^/]+)/log(?:/(\d+))?/?$] do |name, count|
184
199
  data = log_of_service(name, count, nil)
185
- return not_found if data.nil?
200
+ return not_found if data.nil?
201
+
186
202
  @title = t('runit.services.log.title', :name => name, :host => host_name, :count => count)
187
203
  haml :log, :locals => data
188
204
  end
@@ -193,15 +209,19 @@ class RunitMan::App < Sinatra::Base
193
209
  else
194
210
  count, no = nil, d1
195
211
  end
212
+
196
213
  no = no.to_i
214
+
197
215
  data = log_of_service(name, count, no)
198
- return not_found if data.nil?
216
+ return not_found if data.nil?
217
+
199
218
  data[:logs][no][:text]
200
219
  end
201
220
 
202
221
  get %r[^/([^/]+)/log\-downloads/?$] do |name|
203
222
  srv = ServiceInfo.klass[name]
204
- return not_found if srv.nil? || !srv.logged?
223
+ return not_found if srv.nil? || !srv.logged?
224
+
205
225
  haml :log_downloads, :locals => {
206
226
  :name => name,
207
227
  :files => srv.log_files
@@ -210,17 +230,18 @@ class RunitMan::App < Sinatra::Base
210
230
 
211
231
  get %r[^/([^/]+)/log\-download/(.+)$] do |name, file_name|
212
232
  srv = ServiceInfo.klass[name]
213
- return not_found if srv.nil? || !srv.logged?
233
+ return not_found if srv.nil? || !srv.logged?
234
+
214
235
  f = srv.log_files.detect { |f| f[:name] == file_name }
215
- return not_found unless f
236
+ return not_found unless f
237
+
216
238
  send_file(srv.log_file_path(file_name), :type => 'text/plain', :disposition => 'attachment', :filename => f[:label], :last_modified => f[:modified].httpdate)
217
239
  end
218
240
 
219
241
  get '/view' do
220
242
  data = data_of_file_view(request)
221
- if data.nil?
222
- return not_found
223
- end
243
+ return not_found if data.nil?
244
+
224
245
  @title = t('runit.view_file.title', :file => data[:name], :host => host_name)
225
246
  content_type CONTENT_TYPES[:html], :charset => 'utf-8'
226
247
  haml :view_file, :locals => data
@@ -228,9 +249,8 @@ class RunitMan::App < Sinatra::Base
228
249
 
229
250
  get '/view.txt' do
230
251
  data = data_of_file_view(request)
231
- if data.nil?
232
- return not_found
233
- end
252
+ return not_found if data.nil?
253
+
234
254
  content_type CONTENT_TYPES[:txt], :charset => 'utf-8'
235
255
  data[:text]
236
256
  end
@@ -248,7 +268,8 @@ class RunitMan::App < Sinatra::Base
248
268
  post '/:name/signal/:signal' do |name, signal|
249
269
  unless readonly?
250
270
  service = ServiceInfo.klass[name]
251
- return not_found if service.nil?
271
+ return not_found if service.nil?
272
+
252
273
  service.send_signal(signal)
253
274
  log_action(name, "send signal \"#{signal}\"")
254
275
  else
@@ -261,7 +282,8 @@ class RunitMan::App < Sinatra::Base
261
282
  unless readonly?
262
283
  service = ServiceInfo.klass[name]
263
284
  action = "#{action}!".to_sym
264
- return not_found if service.nil? || !service.respond_to?(action)
285
+ return not_found if service.nil? || !service.respond_to?(action)
286
+
265
287
  service.send(action)
266
288
  log_action(name, action)
267
289
  else
@@ -288,14 +310,18 @@ class RunitMan::App < Sinatra::Base
288
310
  active_r_dir = File.join(RunitMan::App.active_services_directory, 'runit-man')
289
311
  my_dir = File.join(GEM_FOLDER, 'sv')
290
312
  log_dir = File.join(all_r_dir, 'log')
313
+
291
314
  if File.symlink?(all_r_dir)
292
315
  File.unlink(all_r_dir)
293
316
  end
317
+
294
318
  unless File.directory?(all_r_dir)
295
319
  FileUtils.mkdir_p(log_dir)
296
320
  create_log_run_script(all_r_dir)
297
321
  end
322
+
298
323
  create_run_script(all_r_dir)
324
+
299
325
  unless File.symlink?(active_r_dir)
300
326
  File.symlink(all_r_dir, active_r_dir)
301
327
  end
@@ -340,9 +366,11 @@ class RunitMan::App < Sinatra::Base
340
366
  auth = RunitMan::App.allowed_users
341
367
  rackup_command_line = RunitMan::App.rackup_command_line
342
368
  read_write_mode = RunitMan::App.read_write_mode.to_s
369
+
343
370
  File.open(script_name, 'w') do |script_source|
344
371
  script_source.print ERB.new(IO.read(template_name)).result(binding())
345
372
  end
373
+
346
374
  File.chmod(0755, script_name)
347
375
  end
348
376
 
@@ -351,9 +379,11 @@ class RunitMan::App < Sinatra::Base
351
379
  script_name = File.join(dir, 'log', 'run')
352
380
  template_name = File.join(GEM_FOLDER, 'sv', 'log', 'run.erb')
353
381
  logger = RunitMan::App.runit_logger
382
+
354
383
  File.open(script_name, 'w') do |script_source|
355
384
  script_source.print ERB.new(IO.read(template_name)).result(binding())
356
385
  end
386
+
357
387
  File.chmod(0755, script_name)
358
388
  end
359
389
  end
@@ -72,6 +72,7 @@ module Helpers
72
72
  id = options[:id] || false
73
73
  hint = " title=\"#{h(hint)}\"" unless hint.empty?
74
74
  blank = blank ? ' target="_blank"' : ''
75
+
75
76
  "<a#{hint}#{blank} href=\"/#{name}/log#{ (count != 100) ? "/#{count}" : '' }#{ id ? "/#{id}" : '' }#{ raw ? '.txt' : '' }#footer\">#{h(title)}</a>"
76
77
  end
77
78
 
@@ -92,6 +93,7 @@ module Helpers
92
93
  sign = (bytes >= 0) ? '' : '-'
93
94
  suffix = 'b'
94
95
  bytes = bytes.abs.to_f
96
+
95
97
  if bytes > GIGABYTE
96
98
  bytes /= GIGABYTE
97
99
  suffix = 'Gb'
@@ -102,7 +104,9 @@ module Helpers
102
104
  bytes /= KILOBYTE
103
105
  suffix = 'Kb'
104
106
  end
107
+
105
108
  bytes = ((bytes * 100 + 0.5).to_i.to_f / 100)
109
+
106
110
  "#{sign}#{bytes}#{t("runit.services.log.#{suffix}")}"
107
111
  end
108
112
 
@@ -110,6 +114,7 @@ module Helpers
110
114
  s.split(/\s/).map do |s|
111
115
  if s =~ /(\w+)/
112
116
  word = $1
117
+
113
118
  if t("runit.services.table.subst.#{word}") !~ /translation missing/
114
119
  s.sub(word, t("runit.services.table.subst.#{word}"))
115
120
  else
@@ -13,12 +13,15 @@ class LogLocationCache::Base
13
13
  def [](pid)
14
14
  pid = pid.to_i
15
15
  loc = nil
16
+
16
17
  unless pids.include?(pid)
17
18
  loc = get_pid_location(pid)
18
19
  set_pid_log_location(pid, loc)
19
20
  end
20
- return loc unless loc.nil?
21
- return nil unless pids.include?(pid)
21
+
22
+ return loc unless loc.nil?
23
+ return nil unless pids.include?(pid)
24
+
22
25
  pids[pid][:value]
23
26
  end
24
27
 
@@ -40,6 +43,7 @@ protected
40
43
  self.query_counter = 0
41
44
  self.pids = {}
42
45
  end
46
+
43
47
  self
44
48
  end
45
49
 
@@ -49,21 +53,26 @@ protected
49
53
  if query_counter < 10
50
54
  return
51
55
  end
56
+
52
57
  self.query_counter = 0
53
58
  limit = Time.now - TIME_LIMIT
59
+
54
60
  pids.keys.each do |pid|
55
61
  if pids[pid][:time] < limit
56
62
  pids.delete(pid)
57
63
  end
58
64
  end
59
65
  end
66
+
60
67
  self
61
68
  end
62
69
 
63
70
  def log_command(lpid)
64
- return nil if lpid.nil?
71
+ return nil if lpid.nil?
72
+
65
73
  ps_output = `ps -o args -p #{lpid} 2>&1`.split("\n")
66
- return nil if ps_output.length < 2
74
+ return nil if ps_output.length < 2
75
+
67
76
  cmd = ps_output[1].chomp
68
77
  cmd != '' ? cmd : nil
69
78
  end
@@ -74,15 +83,18 @@ protected
74
83
 
75
84
  def log_command_args(lpid)
76
85
  cmd = log_command(lpid)
77
- return nil if cmd.nil?
86
+ return nil if cmd.nil?
87
+
78
88
  args = cmd.split(/\s+/).select { |arg| arg !~ /^\-/ }
79
- return nil if args.shift !~ /#{Regexp.escape(logger_name)}/
89
+ return nil if args.shift !~ /#{Regexp.escape(logger_name)}/
90
+
80
91
  args
81
92
  end
82
93
 
83
94
  def log_folder_base_name(lpid)
84
95
  args = log_command_args(lpid)
85
- return nil if args.nil?
96
+ return nil if args.nil?
97
+
86
98
  result = args.first
87
99
  result
88
100
  end
@@ -11,12 +11,14 @@ protected
11
11
 
12
12
  def get_pid_location(lpid)
13
13
  folder = log_folder(lpid)
14
- return nil if folder.nil?
14
+ return nil if folder.nil?
15
+
15
16
  loc = File.join(folder, Time.now.strftime('%Y-%m-%d'), "#{log_folder_base_name(lpid)}.log")
16
17
  unless File.exists?(loc)
17
18
  loc = "#{loc}.gz"
18
- loc = nil unless File.exists?(loc)
19
+ loc = nil unless File.exists?(loc)
19
20
  end
21
+
20
22
  loc
21
23
  end
22
24
 
@@ -44,8 +46,10 @@ protected
44
46
 
45
47
  def log_folder_base_name(lpid)
46
48
  result = super(lpid)
49
+
47
50
  # we should remove : from the end of the line for logger installations.
48
- result = $1 if result =~ /^(.+)\:$/
51
+ result = $1 if result =~ /^(.+)\:$/
52
+
49
53
  result
50
54
  end
51
55
  end
@@ -5,7 +5,8 @@ class LogLocationCache::Svlogd < LogLocationCache::Base
5
5
  protected
6
6
  def get_pid_location(lpid)
7
7
  folder = log_folder(lpid)
8
- return nil if folder.nil?
8
+ return nil if folder.nil?
9
+
9
10
  File.join(folder, 'current')
10
11
  end
11
12
 
@@ -19,12 +20,14 @@ protected
19
20
 
20
21
  def set_pid_log_location(pid, log_location)
21
22
  remove_old_values
23
+
22
24
  monitor.synchronize do
23
25
  pids[pid.to_i] = {
24
26
  :value => log_location,
25
27
  :time => Time.now
26
28
  }
27
29
  end
30
+
28
31
  self
29
32
  end
30
33
  end
@@ -101,7 +101,8 @@ class ServiceInfo::Base
101
101
 
102
102
  def log_file_location
103
103
  rel_path = ServiceInfo.klass.log_location_cache[log_pid]
104
- return nil if rel_path.nil?
104
+ return nil if rel_path.nil?
105
+
105
106
  File.expand_path(rel_path, log_run_folder)
106
107
  end
107
108
 
@@ -114,14 +115,16 @@ class ServiceInfo::Base
114
115
  end
115
116
 
116
117
  def send_signal(signal)
117
- return unless supervise?
118
+ return unless supervise?
119
+
118
120
  File.open(File.join(supervise_folder, 'control'), 'w') do |f|
119
121
  f.print signal.to_s
120
122
  end
121
123
  end
122
124
 
123
125
  def files_to_view
124
- return [] unless File.directory?(files_to_view_folder)
126
+ return [] unless File.directory?(files_to_view_folder)
127
+
125
128
  Dir.entries(files_to_view_folder).select do |name|
126
129
  File.symlink?(File.join(files_to_view_folder, name))
127
130
  end.map do |name|
@@ -135,7 +138,8 @@ class ServiceInfo::Base
135
138
  end
136
139
 
137
140
  def urls_to_view
138
- return [] unless File.directory?(urls_to_view_folder)
141
+ return [] unless File.directory?(urls_to_view_folder)
142
+
139
143
  Dir.entries(urls_to_view_folder).select do |name|
140
144
  name =~ /\.url$/ && File.file?(File.join(urls_to_view_folder, name))
141
145
  end.map do |name|
@@ -146,7 +150,8 @@ class ServiceInfo::Base
146
150
  end
147
151
 
148
152
  def allowed_signals
149
- return [] unless File.directory?(allowed_signals_folder)
153
+ return [] unless File.directory?(allowed_signals_folder)
154
+
150
155
  Dir.entries(allowed_signals_folder).reject do |name|
151
156
  ServiceInfo::Base.itself_or_parent?(name)
152
157
  end
@@ -190,12 +195,14 @@ protected
190
195
  end
191
196
 
192
197
  def data_from_file(file_name)
193
- return @files[file_name] if @files.include?(file_name)
198
+ return @files[file_name] if @files.include?(file_name)
199
+
194
200
  @files[file_name] = ServiceInfo::Base.real_data_from_file(file_name)
195
201
  end
196
202
 
197
203
  def sorted_log_files(log_files)
198
204
  return log_files if log_files.length < 2
205
+
199
206
  log_files.sort { |a, b| a[:created] <=> b[:created] }
200
207
  end
201
208
 
@@ -211,13 +218,15 @@ protected
211
218
  end
212
219
 
213
220
  def real_data_from_file(file_name)
214
- return nil unless File.readable?(file_name)
221
+ return nil unless File.readable?(file_name)
222
+
215
223
  if RUBY_VERSION >= '1.9'
216
224
  data = IO.read(file_name, :external_encoding => 'ASCII-8BIT')
217
225
  else
218
226
  data = IO.read(file_name)
219
227
  end
220
- data.chomp! unless data.nil?
228
+
229
+ data.chomp! unless data.nil?
221
230
  data.empty? ? nil : data
222
231
  end
223
232
 
@@ -227,7 +236,8 @@ protected
227
236
 
228
237
  private
229
238
  def active_service_names
230
- return [] unless File.directory?(RunitMan::App.active_services_directory)
239
+ return [] unless File.directory?(RunitMan::App.active_services_directory)
240
+
231
241
  Dir.entries(RunitMan::App.active_services_directory).reject do |name|
232
242
  full_name = File.join(RunitMan::App.active_services_directory, name)
233
243
  itself_or_parent?(name) || (!File.symlink?(full_name) && !File.directory?(full_name))
@@ -235,8 +245,10 @@ protected
235
245
  end
236
246
 
237
247
  def inactive_service_names
238
- return [] unless File.directory?(RunitMan::App.all_services_directory)
248
+ return [] unless File.directory?(RunitMan::App.all_services_directory)
249
+
239
250
  actives = active_service_names
251
+
240
252
  Dir.entries(RunitMan::App.all_services_directory).reject do |name|
241
253
  full_name = File.join(RunitMan::App.all_services_directory, name)
242
254
  itself_or_parent?(name) || !File.directory?(full_name) || actives.include?(name)
@@ -5,37 +5,44 @@ class ServiceInfo::Logger < ServiceInfo::Base
5
5
  def log_file_path(file_name)
6
6
  dir_name = File.dirname(File.dirname(log_file_location))
7
7
  loc = File.expand_path(File.join(file_name, "#{name}.log"), dir_name)
8
- loc = "#{loc}.gz" unless File.exists?(loc)
9
- loc = nil unless File.exists?(loc)
8
+
9
+ loc = "#{loc}.gz" unless File.exists?(loc)
10
+ loc = nil unless File.exists?(loc)
11
+
10
12
  loc
11
13
  end
12
14
 
13
15
  def log_files
14
16
  lfloc = log_file_location
15
17
  return [] if lfloc.nil?
18
+
19
+ dir_name = File.expand_path(File.dirname(File.dirname(lfloc)))
20
+ return [] unless File.directory?(dir_name)
21
+
16
22
  r = []
17
- dir_name = File.dirname(File.dirname(lfloc))
18
- Dir.foreach(dir_name) do |name|
19
- next if ServiceInfo::Base.itself_or_parent?(name)
20
- full_name = File.expand_path(name, dir_name)
21
- next unless File.directory?(full_name)
22
- file_name = File.join(full_name, "#{self.name}.log")
23
- label = "#{Utils.host_name}-#{self.name}-#{name}.log"
24
- unless File.exists?(file_name)
25
- file_name = "#{file_name}.gz"
26
- label = "#{label}.gz"
23
+ Dir.foreach(dir_name) do |subdirname|
24
+ next if ServiceInfo::Base.itself_or_parent?(subdirname)
25
+ subdirpath = File.expand_path(subdirname, dir_name)
26
+ next unless File.directory?(subdirpath)
27
+
28
+ Dir.foreach(subdirpath) do |filename|
29
+ next if ServiceInfo::Base.itself_or_parent?(filename)
30
+ filepath = File.expand_path(filename, subdirpath)
31
+ label = "#{Utils.host_name}-#{filename}"
32
+ next unless File.file?(filepath) && File.readable?(filepath)
33
+
34
+ stats = File.stat(file_name)
35
+ stat_times = [stats.ctime.utc, stats.atime.utc, stats.mtime.utc]
36
+ min_time, max_time = stat_times.min, stat_times.max
37
+
38
+ r << {
39
+ :name => name,
40
+ :label => label,
41
+ :size => stats.size,
42
+ :created => min_time,
43
+ :modified => max_time
44
+ }
27
45
  end
28
- stats = File.stat(file_name)
29
- stat_times = [stats.ctime.utc, stats.atime.utc, stats.mtime.utc]
30
- min_time, max_time = stat_times.min, stat_times.max
31
-
32
- r << {
33
- :name => name,
34
- :label => label,
35
- :size => stats.size,
36
- :created => min_time,
37
- :modified => max_time
38
- }
39
46
  end
40
47
  sorted_log_files(r)
41
48
  end
@@ -45,6 +52,5 @@ class ServiceInfo::Logger < ServiceInfo::Base
45
52
  @log_location_cache ||= LogLocationCache::Logger.new(RunitMan::App.runit_logger)
46
53
  end
47
54
  end
48
-
49
55
  end
50
56
 
@@ -14,6 +14,7 @@ class ServiceInfo::Svlogd < ServiceInfo::Base
14
14
  Dir.foreach(dir_name) do |name|
15
15
  next if ServiceInfo::Base.itself_or_parent?(name)
16
16
  next if SPECIAL_LOG_FILES.include?(name)
17
+
17
18
  full_name = File.expand_path(name, dir_name)
18
19
  stats = File.stat(full_name)
19
20
  stat_times = [stats.ctime.utc, stats.atime.utc, stats.mtime.utc]
@@ -33,13 +34,9 @@ class ServiceInfo::Svlogd < ServiceInfo::Base
33
34
  end
34
35
 
35
36
  class << self
36
-
37
37
  def log_location_cache
38
38
  @log_location_cache ||= LogLocationCache::Svlogd.new
39
39
  end
40
-
41
40
  end
42
-
43
-
44
41
  end
45
42
 
@@ -9,6 +9,7 @@ class ServiceStatus
9
9
  # status in daemontools supervise format
10
10
  # look at runit's sv.c for details
11
11
  data = (!data.nil? && data.length == STATUS_SIZE) ? data : nil
12
+
12
13
  @raw = data.nil? ? nil : data.unpack('NNxxxxVxa1CC')
13
14
  end
14
15
 
@@ -54,12 +55,13 @@ class ServiceStatus
54
55
  end
55
56
 
56
57
  def to_s
57
- return 'inactive' if inactive?
58
+ return 'inactive' if inactive?
59
+
58
60
  # try to mimics stat behaviour to minimize readings
59
61
  result = status_string
60
- result += ', got TERM' if got_term?
61
- result += ', want down' if want_down?
62
- result += ', want up' if want_up?
62
+ result += ', got TERM' if got_term?
63
+ result += ', want down' if want_down?
64
+ result += ', want up' if want_up?
63
65
  result
64
66
  end
65
67
 
@@ -70,9 +72,9 @@ private
70
72
 
71
73
  def status_string
72
74
  case status_byte
73
- when S_DOWN then 'down'
74
- when S_RUN then 'run'
75
- when S_FINISH then 'finish'
75
+ when S_DOWN; 'down'
76
+ when S_RUN; 'run'
77
+ when S_FINISH; 'finish'
76
78
  end
77
79
  end
78
80
  end
@@ -11,6 +11,7 @@ class Utils
11
11
  @host_name = Socket.gethostname
12
12
  end
13
13
  end
14
+
14
15
  @host_name
15
16
  end
16
17
 
@@ -1,4 +1,4 @@
1
1
  module RunitMan
2
- VERSION = '2.3.21'.freeze
2
+ VERSION = '2.4.0a1'.freeze
3
3
  end
4
4
 
metadata CHANGED
@@ -1,13 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: runit-man
3
3
  version: !ruby/object:Gem::Version
4
- hash: 41
5
- prerelease:
4
+ hash: -3194798914
5
+ prerelease: 5
6
6
  segments:
7
7
  - 2
8
- - 3
9
- - 21
10
- version: 2.3.21
8
+ - 4
9
+ - 0
10
+ - a
11
+ - 1
12
+ version: 2.4.0a1
11
13
  platform: ruby
12
14
  authors:
13
15
  - Akzhan Abdulin
@@ -15,7 +17,7 @@ autorequire:
15
17
  bindir: bin
16
18
  cert_chain: []
17
19
 
18
- date: 2012-03-28 00:00:00 +04:00
20
+ date: 2012-04-03 00:00:00 +04:00
19
21
  default_executable:
20
22
  dependencies:
21
23
  - !ruby/object:Gem::Dependency
@@ -311,12 +313,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
311
313
  required_rubygems_version: !ruby/object:Gem::Requirement
312
314
  none: false
313
315
  requirements:
314
- - - ">="
316
+ - - ">"
315
317
  - !ruby/object:Gem::Version
316
- hash: 3
318
+ hash: 25
317
319
  segments:
318
- - 0
319
- version: "0"
320
+ - 1
321
+ - 3
322
+ - 1
323
+ version: 1.3.1
320
324
  requirements:
321
325
  - none
322
326
  rubyforge_project: