daemonizer 0.3.10 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.10
1
+ 0.4.0
data/daemonizer.gemspec CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{daemonizer}
8
- s.version = "0.3.10"
8
+ s.version = "0.4.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Gleb Pomykalov"]
@@ -10,11 +10,12 @@ module Daemonizer
10
10
  init_defaults
11
11
  validate
12
12
  initialize_handler
13
+ @handler
13
14
  end
14
15
 
15
16
  def initialize_handler
16
17
  if @options[:start]
17
- @handler = FakeHandler.new(@options[:prepare], @options[:start], @options)
18
+ @handler = FakeHandler.new(@options[:prepare], @options[:start], @options[:handler_options])
18
19
  @options[:start] = @options[:prepare] = nil
19
20
  elsif
20
21
  @handler = @options[:handler].new(@options[:handler_options])
@@ -30,8 +31,26 @@ module Daemonizer
30
31
  @options[:pid_file] ||= "pid/#{@pool}.pid"
31
32
  @options[:handler] ||= nil
32
33
  @options[:handler_options] ||= {}
34
+ @options[:callbacks] ||= {}
33
35
  @options[:cow_friendly] = true if @options[:cow_friendly].nil?
34
36
  end
37
+
38
+ def validate_file(filename)
39
+ # file validation
40
+ if File.exist?(filename)
41
+ if !File.file?(filename)
42
+ raise ConfigError, "'#{filename}' is not a regular file"
43
+ elsif !File.writable?(filename)
44
+ raise ConfigError, "'#{filename}' is not writable!"
45
+ end
46
+ else # ensure directory is writable
47
+ dir = File.dirname(filename)
48
+ if not File.writable?(dir)
49
+ raise ConfigError, "'#{dir}' is not writable!"
50
+ end
51
+ File.open(filename, 'w') { |f| f.write('') } #creating empty file
52
+ end
53
+ end
35
54
 
36
55
  def validate
37
56
  raise ConfigError, "Workers count should be more then zero" if @options[:workers] < 1
@@ -47,25 +66,11 @@ module Daemonizer
47
66
  raise ConfigError, "start should be set" if @options[:start].nil?
48
67
  raise ConfigError, "start should have block" unless @options[:start].is_a?(Proc)
49
68
  end
50
-
51
- # file validation
52
- if File.exist?(self.log_file)
53
- if !File.file?(self.log_file)
54
- raise ConfigError, "'#{self.log_file}' is not a regular file"
55
- elsif !File.writable?(self.log_file)
56
- raise ConfigError, "'#{self.log_file}' is not writable!"
57
- end
58
- else # ensure directory is writable
59
- dir = File.dirname(self.log_file)
60
- if not File.writable?(dir)
61
- raise ConfigError, "'#{dir}' is not writable!"
62
- end
63
- File.open(self.log_file, 'w') { |f| f.write('') } #creating empty file
64
- end
65
-
69
+ validate_file(self.log_file)
70
+ validate_file(self.pid_file)
66
71
  end
67
72
 
68
- [:workers, :poll_period, :root, :cow_friendly].each do |method|
73
+ [:workers, :poll_period, :root, :cow_friendly, :callbacks].each do |method|
69
74
  define_method method do
70
75
  @options[method.to_sym]
71
76
  end
@@ -25,8 +25,17 @@ class Daemonizer::Dsl
25
25
  end
26
26
  end
27
27
 
28
- def after_fork(&block)
29
- set_option :after_fork, block
28
+ CALLBACKS = [:before_prepare, :after_prepare, :before_start]
29
+ def set_callback(callback, &block)
30
+ return unless CALLBACKS.include?(callback.to_sym)
31
+ @options[:callbacks] ||= {}
32
+ @options[:callbacks][callback.to_sym] = block
33
+ end
34
+
35
+ CALLBACKS.each do |callback|
36
+ define_method callback.to_sym do |&block|
37
+ set_callback callback.to_sym, &block
38
+ end
30
39
  end
31
40
 
32
41
  def not_cow_friendly
@@ -7,6 +7,13 @@ module Daemonizer
7
7
  Daemonizer.logger_context = "#{Process.pid}/monitor"
8
8
  end
9
9
 
10
+ def run_callback(callback, *args)
11
+ if block = @config.callbacks[callback.to_sym]
12
+ Daemonizer.logger.info "Running :#{callback} callback"
13
+ block.call(*args)
14
+ end
15
+ end
16
+
10
17
  def start!
11
18
  @pm = ProcessManager.new(@config)
12
19
 
@@ -15,7 +22,7 @@ module Daemonizer
15
22
  @pm.start_workers do |process_id|
16
23
  @config.handler.worker_id = process_id
17
24
  @config.handler.workers_count = @config.workers
18
- @config.handler.after_fork
25
+ run_callback(:before_start, Daemonizer.logger, process_id, @config.workers)
19
26
  @config.handler.start
20
27
  end
21
28
  rescue Exception => e
@@ -32,9 +39,12 @@ module Daemonizer
32
39
  Daemonizer.logger.info "COW-friendly feature is not supported by currently used ruby version"
33
40
  end
34
41
  end
35
- Daemonizer.logger.info "Workers count is #{config.workers}"
36
42
  @config.handler.logger = Daemonizer.logger
37
- @config.handler.prepare(init_block)
43
+ run_callback(:before_prepare, Daemonizer.logger)
44
+ Daemonizer.logger.info "Workers count is #{config.workers}"
45
+ @config.handler.prepare(init_block) do
46
+ run_callback(:after_prepare, Daemonizer.logger)
47
+ end
38
48
  rescue Exception => e
39
49
  log_error(e)
40
50
  end
@@ -52,6 +62,7 @@ module Daemonizer
52
62
  begin
53
63
  @config.handler.worker_id = 1
54
64
  @config.handler.workers_count = 1
65
+ run_callback(:before_start, Daemonizer.logger, 1, 1)
55
66
  @config.handler.start
56
67
  rescue Exception => e
57
68
  log_error(e)
@@ -59,7 +70,10 @@ module Daemonizer
59
70
  end
60
71
 
61
72
  begin
62
- @config.handler.prepare(init_block)
73
+ run_callback(:before_prepare, Daemonizer.logger)
74
+ @config.handler.prepare(init_block) do
75
+ run_callback(:after_prepare, Daemonizer.logger)
76
+ end
63
77
  rescue Exception => e
64
78
  log_error(e)
65
79
  end
@@ -8,8 +8,11 @@ module Daemonizer
8
8
  @handler_options = handler_options
9
9
  end
10
10
 
11
- def prepare(block)
12
- block.call
11
+ def prepare(starter, &block)
12
+ if block_given?
13
+ yield
14
+ end
15
+ starter.call
13
16
  end
14
17
 
15
18
  def option(key)
@@ -19,12 +22,6 @@ module Daemonizer
19
22
  nil
20
23
  end
21
24
  end
22
-
23
- def after_fork
24
- if block = option(:after_fork)
25
- block.call(Daemonizer.logger, @worker_id, @workers_count)
26
- end
27
- end
28
25
  end
29
26
 
30
27
  class FakeHandler < Handler
@@ -34,7 +31,7 @@ module Daemonizer
34
31
  super(handler_options)
35
32
  end
36
33
 
37
- def prepare(block)
34
+ def prepare(starter, &block)
38
35
  if @prepare
39
36
  @prepare.call(Daemonizer.logger, block)
40
37
  else
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: daemonizer
3
3
  version: !ruby/object:Gem::Version
4
- hash: 7
4
+ hash: 15
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 3
9
- - 10
10
- version: 0.3.10
8
+ - 4
9
+ - 0
10
+ version: 0.4.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Gleb Pomykalov