daemonizer 0.0.4 → 0.0.6

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/README CHANGED
@@ -34,15 +34,11 @@ pool :daemonizer do
34
34
  end
35
35
 
36
36
  pool :new_daemonizer do
37
+ workers 4
38
+ poll_period 5
39
+ log_file "log/daemonizer.log" #relative to Demfile
37
40
 
38
- before_init do |logger, block|
39
- logger.info "New: Preparing master process"
40
- block.call
41
- end
41
+ handler ::AsyncObserver::DaemonizerHandler
42
42
 
43
- after_init do |logger, worker_id, workers_count|
44
- logger.info "Started #{worker_id}/#{workers_count}"
45
- sleep 1
46
- logger.info "Stopped #{worker_id}/#{workers_count}"
47
- end
43
+ set_option :queue, lambda { |worker_id, worker_count| "queue_#{worker_id}"}
48
44
  end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.4
1
+ 0.0.6
data/daemonizer.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{daemonizer}
8
- s.version = "0.0.4"
8
+ s.version = "0.0.6"
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"]
12
- s.date = %q{2010-07-06}
12
+ s.date = %q{2010-07-08}
13
13
  s.default_executable = %q{daemonizer}
14
14
  s.description = %q{Inspired by bundler and rack. Mostly built on top of Alexey Kovyrin's loops code. http://github.com/kovyrin/loops}
15
15
  s.email = %q{glebpom@gmail.com}
@@ -31,6 +31,7 @@ Gem::Specification.new do |s|
31
31
  "lib/daemonizer/dsl.rb",
32
32
  "lib/daemonizer/engine.rb",
33
33
  "lib/daemonizer/errors.rb",
34
+ "lib/daemonizer/handler.rb",
34
35
  "lib/daemonizer/process_manager.rb",
35
36
  "lib/daemonizer/worker.rb",
36
37
  "lib/daemonizer/worker_pool.rb"
@@ -11,6 +11,8 @@ module Daemonizer
11
11
  autoload :Worker, __p('worker')
12
12
  autoload :WorkerPool, __p('worker_pool')
13
13
  autoload :ProcessManager, __p('process_manager')
14
+ autoload :Handler, __p('handler')
15
+ autoload :FakeHandler, __p('handler')
14
16
 
15
17
  include Errors
16
18
  end
@@ -66,12 +66,14 @@ module Daemonizer
66
66
  end
67
67
 
68
68
  desc "restart", "Restart pool"
69
+ method_option :demfile, :type => :string, :aliases => "-D", :banner => "Path to Demfile"
69
70
  def restart(pool_name = nil)
70
71
  invoke :stop, pool_name
71
72
  invoke :start, pool_name
72
73
  end
73
74
 
74
75
  desc "debug", "Debug pool (do not demonize)"
76
+ method_option :demfile, :type => :string, :aliases => "-D", :banner => "Path to Demfile"
75
77
  def debug(pool_name = nil)
76
78
  puts "You should supply pool_name to debug" if pool_name.nil?
77
79
  control_pools_loop(pool_name, "execution ended", options[:demfile]) do |pool|
@@ -84,7 +86,8 @@ module Daemonizer
84
86
  print_pool pool.name, " Done!"
85
87
  exit(0)
86
88
  end
87
- return true end
89
+ return true
90
+ end
88
91
 
89
92
  private
90
93
  def control_pools_loop(pool_name, message = nil, demfile = nil, &block)
@@ -110,7 +113,7 @@ module Daemonizer
110
113
  if pool = pools[pool_name.to_sym]
111
114
  [pool]
112
115
  else
113
- print_pool pool_name, "Pool with name `#{pool_name}` is not configured"
116
+ print_pool pool_name, "pool is not configured"
114
117
  []
115
118
  end
116
119
  else
@@ -2,7 +2,7 @@ module Daemonizer
2
2
  class Config
3
3
  class ConfigError < StandardError; end
4
4
 
5
- attr_reader :pool
5
+ attr_reader :pool, :handler
6
6
 
7
7
  def initialize(pool, options)
8
8
  @pool = pool
@@ -10,6 +10,17 @@ module Daemonizer
10
10
  init_defaults
11
11
  init_logger
12
12
  validate
13
+ initialize_handler
14
+ end
15
+
16
+ def initialize_handler
17
+ if @options[:after_init]
18
+ @handler = FakeHandler.new(@options[:before_init], @options[:after_init], @options)
19
+ @options[:after_init] = @options[:before_init] = nil
20
+ elsif
21
+ @handler = @options[:handler].new(@options[:handler_options])
22
+ end
23
+ @handler.logger = @logger
13
24
  end
14
25
 
15
26
  def init_logger
@@ -22,30 +33,49 @@ module Daemonizer
22
33
  end
23
34
 
24
35
  def init_defaults
25
- @options[:before_init] ||= Proc.new
36
+ @options[:before_init] ||= nil
37
+ @options[:after_init] ||= nil
26
38
  @options[:engine] ||= :fork
27
39
  @options[:workers] ||= 1
28
40
  @options[:log_file] ||= "log/#{@pool}.log"
29
41
  @options[:poll_period] ||= 5
30
42
  @options[:pid_file] ||= "pid/#{@pool}.pid"
43
+ @options[:handler] ||= nil
44
+ @options[:handler_options] ||= {}
31
45
  end
32
46
 
33
47
  def validate
34
- Daemonizer.report_fatal_error "Workers count should be more then zero", @logger if @options[:workers] < 1
35
- Daemonizer.report_fatal_error "Engine #{@options[:engine]} is not known", @logger unless [:fork, :thread].include?(@options[:engine])
36
- if @options[:before_init]
37
- Daemonizer.report_fatal_error "before_init should have block", @logger unless @options[:before_init].is_a?(Proc)
48
+ raise ConfigError, "Workers count should be more then zero" if @options[:workers] < 1
49
+ raise ConfigError, "Engine #{@options[:engine]} is not known" unless [:fork, :thread].include?(@options[:engine])
50
+
51
+ raise ConfigError, "Poll period should be more then zero" if @options[:poll_period] < 1
52
+ if @options[:handler]
53
+ raise ConfigError, "Handler should be a class" unless @options[:handler].is_a?(Class)
54
+ raise ConfigError, "Handler should respond to :after_init" unless @options[:handler].public_instance_methods.include?('after_init')
55
+ raise ConfigError, "Handler set. Don't use :after_init and :before init in Demfile" if @options[:before_init] || @options[:after_init]
56
+ else
57
+ raise ConfigError, "set_option can be used only with handler" if @options[:handler_options].any?
58
+ if @options[:before_init]
59
+ raise ConfigError, "before_init should have block" unless @options[:before_init].is_a?(Proc)
60
+ end
61
+ raise ConfigError, "after_init should be set" if @options[:after_init].nil?
62
+ raise ConfigError, "after_init should have block" unless @options[:after_init].is_a?(Proc)
38
63
  end
39
- Daemonizer.report_fatal_error "after_init should be set", @logger if @options[:after_init].nil?
40
- Daemonizer.report_fatal_error "after_init should have block", @logger unless @options[:after_init].is_a?(Proc)
41
- Daemonizer.report_fatal_error "Poll period should be more then zero", @logger if @options[:poll_period] < 1
42
64
  end
43
65
 
44
- [:before_init, :engine, :workers, :after_init, :poll_period, :root].each do |method|
66
+ [:engine, :workers, :poll_period, :root].each do |method|
45
67
  define_method method do
46
68
  @options[method.to_sym]
47
69
  end
48
70
  end
71
+
72
+ def before_init
73
+ @handler.method(:before_init)
74
+ end
75
+
76
+ def after_init
77
+ @handler.method(:after_init)
78
+ end
49
79
 
50
80
  [:log_file, :pid_file].each do |method|
51
81
  define_method method do
@@ -48,9 +48,13 @@ module Daemonizer
48
48
 
49
49
  fork && exit # Fork and exit from the parent
50
50
 
51
+ STDIN.reopen '/dev/null'
52
+ STDOUT.reopen '/dev/null', 'a'
53
+ STDERR.reopen STDOUT
54
+
51
55
  # Detach from the controlling terminal
52
56
  unless sess_id = Process.setsid
53
- raise Daemons.RuntimeException.new('cannot detach from controlling terminal')
57
+ raise 'cannot detach from controlling terminal'
54
58
  end
55
59
 
56
60
  # Prevent the possibility of acquiring a controlling terminal
@@ -14,6 +14,15 @@ module Daemonizer
14
14
  @pool = :default
15
15
  @configs = {}
16
16
  end
17
+
18
+ def set_option(option, value)
19
+ @options[:handler_options] ||= {}
20
+ @options[:handler_options][option.to_sym] = value
21
+ end
22
+
23
+ def handler(handler)
24
+ @options[:handler] = handler
25
+ end
17
26
 
18
27
  def poll_period(seconds)
19
28
  @options[:poll_period] = seconds.to_i
@@ -16,17 +16,20 @@ module Daemonizer
16
16
  init_block = Proc.new do
17
17
  begin
18
18
  @pm.start_workers do |process_id|
19
- @config.after_init.call(logger, process_id, @config.workers)
19
+ @config.handler.worker_id = process_id
20
+ @config.handler.workers_count = @config.workers
21
+ @config.handler.after_init
20
22
  end
21
23
  rescue Exception => e
22
- logger.fatal e.to_s
24
+ log_error(e)
23
25
  end
24
26
  end
25
27
 
26
28
  begin
27
- @config.before_init.call(@config.logger, init_block)
29
+ @config.handler.logger = logger
30
+ @config.handler.before_init(init_block)
28
31
  rescue Exception => e
29
- logger.fatal e.to_s
32
+ log_error(e)
30
33
  end
31
34
  # Start monitoring loop
32
35
 
@@ -35,22 +38,32 @@ module Daemonizer
35
38
  end
36
39
 
37
40
  def debug!
38
- logger.outputters = Outputter.stdout
41
+ outputter = Outputter.stdout
42
+ outputter.formatter = PatternFormatter.new :pattern => "%d - %l %g - %m"
43
+ logger.outputters = outputter
39
44
 
40
45
  init_block = Proc.new do
41
46
  begin
42
- @config.after_init.call(logger, 1, 1)
47
+ @config.handler.worker_id = 1
48
+ @config.handler.workers_count = 1
49
+ @config.handler.after_init
43
50
  rescue Exception => e
44
- logger.fatal e.to_s
51
+ log_error(e)
45
52
  end
46
53
  end
47
54
 
48
55
  begin
49
- @config.before_init.call(@config.logger, init_block)
56
+ @config.handler.logger = logger
57
+ @config.handler.before_init(init_block)
50
58
  rescue Exception => e
51
- logger.fatal e.to_s
59
+ log_error(e)
52
60
  end
53
61
  end
62
+
63
+ def log_error(e)
64
+ logger.fatal e.to_s
65
+ logger.fatal "#{e.class}: #{e}\n" + e.backtrace.join("\n")
66
+ end
54
67
 
55
68
  private
56
69
  def setup_signals
@@ -0,0 +1,43 @@
1
+ module Daemonizer
2
+ class Handler
3
+ attr_accessor :worker_id
4
+ attr_accessor :workers_count
5
+ attr_accessor :logger
6
+
7
+ def initialize(options = {})
8
+ @options = options
9
+ end
10
+
11
+ def before_init(block)
12
+ block.call
13
+ end
14
+
15
+ def option(key)
16
+ if option = @options[key.to_sym] and option.is_a?(Proc)
17
+ option.call(@worker_id, @workers_count)
18
+ else
19
+ option
20
+ end
21
+ end
22
+ end
23
+
24
+ class FakeHandler < Handler
25
+ def initialize(before_init, after_init, options = {})
26
+ @before_init = before_init
27
+ @after_init = after_init
28
+ super(options)
29
+ end
30
+
31
+ def before_init(block)
32
+ if @before_init
33
+ @before_init.call(@logger, block)
34
+ else
35
+ super
36
+ end
37
+ end
38
+
39
+ def after_init
40
+ @after_init.call(@logger, @worker_id, @workers_count)
41
+ end
42
+ end
43
+ end
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: 23
4
+ hash: 19
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 4
10
- version: 0.0.4
9
+ - 6
10
+ version: 0.0.6
11
11
  platform: ruby
12
12
  authors:
13
13
  - Gleb Pomykalov
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-07-06 00:00:00 +04:00
18
+ date: 2010-07-08 00:00:00 +04:00
19
19
  default_executable: daemonizer
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -72,6 +72,7 @@ files:
72
72
  - lib/daemonizer/dsl.rb
73
73
  - lib/daemonizer/engine.rb
74
74
  - lib/daemonizer/errors.rb
75
+ - lib/daemonizer/handler.rb
75
76
  - lib/daemonizer/process_manager.rb
76
77
  - lib/daemonizer/worker.rb
77
78
  - lib/daemonizer/worker_pool.rb