daemonizer 0.4.14 → 0.4.15

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/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.14
1
+ 0.4.15
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{daemonizer}
8
- s.version = "0.4.14"
8
+ s.version = "0.4.15"
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"]
@@ -7,7 +7,7 @@ require 'simple-statistics'
7
7
 
8
8
 
9
9
  module Daemonizer
10
-
10
+
11
11
  def self.root=(value)
12
12
  @@root = value
13
13
  end
@@ -19,12 +19,22 @@ module Daemonizer
19
19
  File.dirname(daemonfile)
20
20
  end
21
21
  end
22
-
22
+
23
+ def self.find_daemonfile(daemonfile_name)
24
+ previous = nil
25
+ current = File.expand_path(Dir.pwd)
26
+
27
+ until !File.directory?(current) || current == previous
28
+ filename = File.join(current, daemonfile_name)
29
+ return filename if File.file?(filename)
30
+ current, previous = File.expand_path("..", current), current
31
+ end
32
+ end
33
+
23
34
  def self.daemonfile=(daemonfile_name)
24
- @@daemonfile = File.expand_path(daemonfile_name)
25
- @@daemonfile
35
+ @@daemonfile = find_daemonfile(daemonfile_name)
26
36
  end
27
-
37
+
28
38
  def self.daemonfile
29
39
  if defined?(@@daemonfile)
30
40
  @@daemonfile
@@ -32,43 +42,51 @@ module Daemonizer
32
42
  "Demfile"
33
43
  end
34
44
  end
35
-
45
+
36
46
  def self.logger_context=(str)
37
47
  @@logger_context = str
38
48
  end
39
-
49
+
40
50
  def self.logger_context
41
51
  @@logger_context
42
52
  end
43
-
53
+
54
+ def self.log_level=(level)
55
+ @@log_level = level
56
+ end
57
+
58
+ def self.log_level
59
+ @@log_level ||= :info
60
+ end
61
+
44
62
  def self.init_logger(name, log_file)
45
63
  @@logger_file = File.open(log_file, File::WRONLY | File::APPEND)
46
64
  @@logger_file.sync = true
47
65
  @@logger = Logger.new(@@logger_file)
48
66
  set_logger_common_options
49
67
  end
50
-
68
+
51
69
  def self.set_logger_common_options
52
- @@logger.sev_threshold = Logger::INFO
70
+ @@logger.sev_threshold = Logger::const_get(Daemonizer.log_level.to_s.upcase) || Logger::INFO
53
71
  @@logger.formatter = Proc.new do |severity, datetime, progname, msg|
54
72
  "%s %s -- %s -- %s\n" % [ datetime.strftime("%Y-%m-%d %H:%M:%S"), severity, Daemonizer.logger_context, msg ]
55
73
  end
56
74
  end
57
-
75
+
58
76
  def self.reopen_log_file
59
77
  true #do not need it in append-only mode
60
78
  end
61
-
79
+
62
80
  def self.flush_logger
63
81
  @@logger_file.flush
64
82
  end
65
-
83
+
66
84
  def self.init_console_logger(name)
67
85
  @@logger_file = STDOUT
68
86
  @@logger = Logger.new(@@logger_file)
69
87
  set_logger_common_options
70
88
  end
71
-
89
+
72
90
  def self.logger
73
91
  if defined?(@@logger)
74
92
  @@logger
@@ -80,8 +98,8 @@ module Daemonizer
80
98
  def self.[](pool)
81
99
  find_pools(pool).first or nil
82
100
  end
83
-
84
- def self.find_pools(pool_name = nil)
101
+
102
+ def self.find_pools(pool_name = nil)
85
103
  pools = Dsl.evaluate(daemonfile)
86
104
 
87
105
  if pool_name
@@ -95,7 +113,7 @@ module Daemonizer
95
113
  pools.values
96
114
  end
97
115
  end
98
-
116
+
99
117
  end
100
118
 
101
119
  require File.dirname(__FILE__) + '/../lib/daemonizer/autoload'
@@ -1,7 +1,7 @@
1
1
  require 'thor'
2
2
  require 'rubygems/config_file'
3
3
 
4
- module Daemonizer
4
+ module Daemonizer
5
5
  class CLI < Thor
6
6
  check_unknown_options!
7
7
 
@@ -11,7 +11,7 @@ module Daemonizer
11
11
  super
12
12
  Daemonizer.daemonfile = options[:daemonfile] || "Daemonfile"
13
13
  end
14
-
14
+
15
15
  desc "start", "Start pool"
16
16
  def start(pool_name = nil)
17
17
  control_pools_loop(pool_name, "successfully started") do |pool|
@@ -24,7 +24,7 @@ module Daemonizer
24
24
  print_pool pool.name, "Starting pool"
25
25
 
26
26
  app_name = "#{pool.name} monitor\0"
27
-
27
+
28
28
  Daemonize.daemonize(app_name)
29
29
 
30
30
  Dir.chdir(Daemonizer.root) # Make sure we're in the working directory
@@ -41,7 +41,7 @@ module Daemonizer
41
41
  end
42
42
  return true
43
43
  end
44
-
44
+
45
45
  desc "stop", "Stop pool"
46
46
  def stop(pool_name = nil)
47
47
  control_pools_loop(pool_name, "successfully stoped") do |pool|
@@ -69,9 +69,9 @@ module Daemonizer
69
69
  desc "list", "List of pools"
70
70
  def list
71
71
  puts "List of configured pools:"
72
- puts ""
72
+ puts ""
73
73
  Daemonizer.find_pools(nil).each do |pool|
74
- puts " * #{pool.name}"
74
+ puts " * #{pool.name}"
75
75
  end
76
76
  puts ""
77
77
  return true
@@ -88,19 +88,19 @@ module Daemonizer
88
88
  if pool_name.nil?
89
89
  puts "You should supply pool_name to debug"
90
90
  exit 1
91
- end
92
- control_pools_loop(pool_name, "execution ended", true) do |pool|
91
+ end
92
+ control_pools_loop(pool_name, "execution ended", true) do |pool|
93
93
  STDOUT.sync = true
94
-
94
+
95
95
  engine = Engine.new(pool)
96
96
  engine.debug!
97
-
97
+
98
98
  print_pool pool.name, " Done!"
99
99
  exit(0)
100
100
  end
101
- return true
101
+ return true
102
102
  end
103
-
103
+
104
104
  desc "stats", "Pools statistics"
105
105
  def stats(pool_name = nil)
106
106
  Daemonizer.find_pools(pool_name).each do |pool|
@@ -108,29 +108,31 @@ module Daemonizer
108
108
  statistics.print
109
109
  end
110
110
  end
111
-
111
+
112
112
  private
113
113
  def control_pools_loop(pool_name, message = nil, debug = false, &block)
114
- Daemonizer.find_pools(pool_name).each do |pool|
115
- Process.fork do
116
- if debug
117
- Daemonizer.init_console_logger(pool.name.to_s)
118
- else
119
- Daemonizer.init_logger(pool.name.to_s, pool.log_file)
120
- end
114
+ if debug
115
+ pool = Daemonizer.find_pools(pool_name).first
116
+ Daemonizer.init_console_logger(pool.name.to_s)
117
+ begin
121
118
  yield(pool)
119
+ rescue Interrupt => e
120
+ puts "Interrupted from keyboard"
122
121
  end
123
- begin
122
+ else
123
+ Daemonizer.find_pools(pool_name).each do |pool|
124
+ Process.fork do
125
+ Daemonizer.init_logger(pool.name.to_s, pool.log_file)
126
+ yield(pool)
127
+ end
124
128
  Process.wait
125
129
  if $?.exitstatus == 0 and message
126
- print_pool pool.name, message
130
+ print_pool pool.name, message
127
131
  end
128
- rescue Interrupt => e
129
- puts "Interrupted from keyboard"
130
132
  end
131
133
  end
132
134
  end
133
-
135
+
134
136
  def print_pool(pool_name, message)
135
137
  puts "#{pool_name}: #{message}"
136
138
  end
@@ -1,5 +1,7 @@
1
1
  module Daemonizer
2
2
  class Config
3
+ VALID_LOG_LEVELS = [:debug, :info, :warn, :error, :fatal]
4
+
3
5
  class ConfigError < StandardError; end
4
6
 
5
7
  attr_reader :pool, :handler
@@ -34,8 +36,9 @@ module Daemonizer
34
36
  @options[:callbacks] ||= {}
35
37
  @options[:on_poll] ||= []
36
38
  @options[:cow_friendly] = true if @options[:cow_friendly].nil?
39
+ @options[:log_level] ||= :info
37
40
  end
38
-
41
+
39
42
  def validate_file(filename)
40
43
  # file validation
41
44
  if File.exist?(filename)
@@ -56,6 +59,7 @@ module Daemonizer
56
59
  def validate
57
60
  raise ConfigError, "Workers count should be more then zero" if @options[:workers] < 1
58
61
  raise ConfigError, "Poll period should be more then zero" if @options[:poll_period] < 1
62
+ raise ConfigError, "Log level should be one of [#{VALID_LOG_LEVELS.map(&:to_s).join(',')}]" unless VALID_LOG_LEVELS.include?(@options[:log_level].to_sym)
59
63
  if @options[:handler]
60
64
  raise ConfigError, "Handler should be a class" unless @options[:handler].is_a?(Class)
61
65
  raise ConfigError, "Handler should respond to :start" unless @options[:handler].public_instance_methods.include?('start')
@@ -67,6 +71,7 @@ module Daemonizer
67
71
  raise ConfigError, "start should be set" if @options[:start].nil?
68
72
  raise ConfigError, "start should have block" unless @options[:start].is_a?(Proc)
69
73
  end
74
+
70
75
  validate_file(self.log_file)
71
76
  validate_file(self.pid_file)
72
77
  end
@@ -82,7 +87,7 @@ module Daemonizer
82
87
  File.join(Daemonizer.root, @options[method.to_sym])
83
88
  end
84
89
  end
85
-
90
+
86
91
  def name
87
92
  @pool
88
93
  end
@@ -13,7 +13,7 @@ class Daemonizer::Dsl
13
13
  @pool = :default
14
14
  @configs = {}
15
15
  end
16
-
16
+
17
17
  def set_option(option, value = nil, &block)
18
18
  @options[:handler_options] ||= {}
19
19
  if not value.nil?
@@ -24,7 +24,7 @@ class Daemonizer::Dsl
24
24
  raise DslError, "you should supply block or value to :set_option"
25
25
  end
26
26
  end
27
-
27
+
28
28
  CALLBACKS = [:before_prepare, :after_prepare, :before_start]
29
29
  def set_callback(callback, &block)
30
30
  return unless CALLBACKS.include?(callback.to_sym)
@@ -32,13 +32,17 @@ class Daemonizer::Dsl
32
32
  @options[:callbacks][callback.to_sym] ||= []
33
33
  @options[:callbacks][callback.to_sym] << block
34
34
  end
35
-
35
+
36
36
  CALLBACKS.each do |callback|
37
37
  define_method callback.to_sym do |&block|
38
38
  set_callback callback.to_sym, &block
39
39
  end
40
40
  end
41
41
 
42
+ def log_level(level)
43
+ @options[:log_level] = level.to_sym
44
+ end
45
+
42
46
  def on_poll(&block)
43
47
  @options[:on_poll] ||= []
44
48
  @options[:on_poll] << block
@@ -48,31 +52,31 @@ class Daemonizer::Dsl
48
52
  def not_cow_friendly
49
53
  @options[:cow_friendly] = false
50
54
  end
51
-
55
+
52
56
  def handler(handler)
53
57
  @options[:handler] = handler
54
58
  end
55
-
59
+
56
60
  def poll_period(seconds)
57
61
  @options[:poll_period] = seconds.to_i
58
62
  end
59
-
63
+
60
64
  def log_file(log)
61
65
  @options[:log_file] = log
62
66
  end
63
-
67
+
64
68
  def workers(num)
65
69
  @options[:workers] = num.to_i
66
70
  end
67
-
71
+
68
72
  def prepare(&blk)
69
73
  @options[:prepare] = blk
70
74
  end
71
-
75
+
72
76
  def start(&blk)
73
77
  @options[:start] = blk
74
78
  end
75
-
79
+
76
80
  def pid_file(pid)
77
81
  @options[:pid_file] = pid
78
82
  end
@@ -95,7 +99,7 @@ class Daemonizer::Dsl
95
99
  @options = options
96
100
  @pool = nil
97
101
  end
98
-
102
+
99
103
  def config_copy
100
104
  options = @options.dup
101
105
  options[:handler_options] = @options[:handler_options].dup if @options[:handler_options]
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: 19
4
+ hash: 17
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 4
9
- - 14
10
- version: 0.4.14
9
+ - 15
10
+ version: 0.4.15
11
11
  platform: ruby
12
12
  authors:
13
13
  - Gleb Pomykalov