lib/zeusd/daemon.rb in zeusd-0.2.3 vs lib/zeusd/daemon.rb in zeusd-0.2.4
- old
+ new
@@ -10,23 +10,27 @@
class DaemonException < StandardError; end
class Daemon
include Hooks
- define_hooks :after_start!, :after_stop!, :before_stop!, :after_output
+ define_hooks :before_action, :after_action, :after_output
- after_start! { log_event :start, :process => process ? process.attributes : nil }
- before_stop! { log_event :stop, :process => process ? process.attributes : nil }
+ before_action do |action|
+ details = {}
+ details[:process] = process.attributes if process
+ log_event("Before: #{action}", details)
+ end
- after_stop! do
- (zeus_socket_file.delete rescue nil) if zeus_socket_file.exist?
+ after_action do |action|
+ details = {}
+ details[:process] = process.attributes if process
+ log_event("After: #{action}", details)
end
after_output do |output|
interpreter.translate(output)
- # logger.info("Zeus"){output}
- puts(output) if verbose
+ puts output if verbose
end
attr_reader :cwd, :verbose, :log_file, :interpreter, :child_process
def initialize(options = {})
@@ -34,43 +38,54 @@
@verbose = !!options[:verbose]
@interpreter = Interpreter.new
end
def start!(options = {})
+ run_hook :before_action, __method__
+
start_child_process!
@process = Zeusd::Process.find(child_process.pid)
if options.fetch(:block, false)
sleep(0.1) until loaded?
end
- run_hook :after_start!
+ run_hook :after_action, __method__
self
end
def restart!(options = {})
+ run_hook :before_action, __method__
+
stop!.start!(options)
+
+ run_hook :after_action, __method__
+
+ self
end
def stop!
- run_hook :before_stop!
+ run_hook :before_action, __method__
return self unless process
# Kill process tree and wait for exits
process.kill!(:recursive => true, :wait => true)
+ # Clean up socket file if stil exists
+ (zeus_socket_file.delete rescue nil) if zeus_socket_file.exist?
+
# Check for remaining processes
if[process, process.descendants].flatten.select(&:alive?).any?
raise DaemonException, "Unable to KILL processes: " + alive_processes.join(', ')
end
@process = nil
- run_hook :after_stop!
+ run_hook :after_action, __method__
self
end
def process
@@ -79,40 +94,35 @@
def loaded?
interpreter.complete?
end
- def log_event(type, details = nil)
- logger.info("EVENT") do
- ">>> #{type.to_s.upcase}" + (details ? (" >>> " + JSON.pretty_generate(details)) : "")
- end
- end
-
- def logger
- @logger ||= Logger.new(log_file.to_path).tap do |x|
- x.formatter = proc do |severity, datetime, type, msg|
- prefix = "[#{datetime.strftime('%Y-%m-%d %H:%M:%S')}][#{type}]"
- msg = msg.chomp.gsub("\n", "\n".ljust(prefix.length) + "\e[36m|\e[0m ")
- "\e[36m#{prefix}\e[0m" + " #{msg}\n"
- end
- end
- end
-
def zeus_socket_file
cwd.join('.zeus.sock')
end
- def log_file
- cwd.join('log/zeusd.log')
- end
-
def zeus_log_file
- cwd.join('.zeus.log').tap do |path|
+ cwd.join('log', 'zeus.log').tap do |path|
FileUtils.touch(path.to_path)
end
end
protected
+
+ def log_event(type, details = nil)
+ logger.info do
+ "\e[35m[Event] (#{type})\e[0m" + (!details.empty? ? " " + JSON.pretty_generate(details) : "")
+ end
+ end
+
+ def logger
+ @logger ||= Logger.new(cwd.join('log', 'zeusd.log').to_path).tap do |x|
+ x.formatter = proc do |severity, datetime, progname, msg|
+ prefix = "[#{datetime.strftime('%Y-%m-%d %H:%M:%S')}]"
+ "\e[36m#{prefix}\e[0m" + " #{msg}\n"
+ end
+ end
+ end
def start_child_process!
# Truncate and cast to File
zeus_log_file.open("w") {}
std_file = File.new(zeus_log_file, 'w+').tap{|x| x.sync = true}
\ No newline at end of file