runit-man 2.3.21 → 2.4.0a1

Sign up to get free protection for your applications and to get access to all the features.
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: