daemonizer 0.0.4 → 0.0.6

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