lib/adhearsion/initializer.rb in adhearsion-0.8.3 vs lib/adhearsion/initializer.rb in adhearsion-0.8.4
- old
+ new
@@ -1,35 +1,35 @@
module Adhearsion
-
+
class << self
-
+
##
# Shuts down the framework.
#
def shutdown!
ahn_log "Shutting down gracefully at #{Time.now}."
Events.stop!
exit
- end
-
+ end
+
end
class PathString < String
-
+
class << self
-
+
##
# Will return a PathString for the application root folder to which the specified arbitrarily nested subfolder belongs.
# It works by traversing parent directories looking for the .ahnrc file. If no .ahnrc is found, nil is returned.
#
- # @param [String] folder The path to the directory which should be a
+ # @param [String] folder The path to the directory which should be a
# @return [nil] if the subdirectory does not belong to a parent Adhearsion app directory
- # @return [PathString] if a directory is found
+ # @return [PathString] if a directory is found
#
def from_application_subdirectory(folder)
folder = File.expand_path folder
ahn_rc = nil
-
+
until ahn_rc || folder == "/"
possible_ahn_rc = File.join(folder, ".ahnrc")
if File.exists?(possible_ahn_rc)
ahn_rc = possible_ahn_rc
else
@@ -37,72 +37,72 @@
end
end
ahn_rc ? new(folder) : nil
end
end
-
+
attr_accessor :component_path, :dialplan_path, :log_path
-
+
def initialize(path)
super
defaults
end
-
+
def defaults
@component_path = build_path_for "components"
@dialplan_path = dup
@log_path = build_path_for "logs"
end
def base_path=(value)
replace(value)
defaults
end
-
+
def using_base_path(temporary_base_path, &block)
original_path = dup
self.base_path = temporary_base_path
block.call
ensure
self.base_path = original_path
end
-
+
private
def build_path_for(path)
File.join(to_s, path)
end
end
-
+
class Initializer
-
+
class << self
def get_rules_from(location)
location = File.join location, ".ahnrc" if File.directory? location
File.exists?(location) ? YAML.load_file(location) : nil
end
-
+
def ahn_root=(path)
if Object.constants.include?("AHN_ROOT")
Object.const_get(:AHN_ROOT).base_path = File.expand_path(path)
else
Object.const_set(:AHN_ROOT, PathString.new(File.expand_path(path)))
end
end
-
+
def start(*args, &block)
new(*args, &block).start
end
-
+
def start_from_init_file(file, ahn_app_path)
return if defined?(@@started) && @@started
start ahn_app_path, :loaded_init_files => file
end
-
+
end
-
+
attr_reader :path, :daemon, :pid_file, :log_file, :ahn_app_log_directory
-
+
# Creation of pid_files
#
# - You may want to have Adhearsion create a process identification
# file when it boots so that a crash monitoring program such as
# Monit can reboot if necessary or so the init script can kill it
@@ -117,97 +117,98 @@
@path = path
@daemon = options[:daemon]
@pid_file = options[:pid_file].nil? ? ENV['PID_FILE'] : options[:pid_file]
@loaded_init_files = options[:loaded_init_files]
end
-
+
def start
self.class.ahn_root = path
-
+
resolve_pid_file_path
resolve_log_file_path
+ daemonize! if should_daemonize?
switch_to_root_directory
catch_termination_signal
+ create_pid_file if pid_file
bootstrap_rc
initialize_log_file
load_all_init_files
+ init_datasources
init_components_subsystem
init_modules
init_events_subsystem
load_components
init_events_file
- daemonize! if should_daemonize?
- create_pid_file if pid_file
-
+
ahn_log "Adhearsion initialized!"
-
+
trigger_after_initialized_hooks
join_important_threads
-
+
self
end
-
+
def default_pid_path
File.join AHN_ROOT, 'adhearsion.pid'
end
-
+
def resolve_pid_file_path
@pid_file = if pid_file.equal?(true) then default_pid_path
elsif pid_file then pid_file
elsif pid_file.equal?(false) then nil
# FIXME @pid_file = @daemon? Assignment or equality? I'm assuming equality.
else @pid_file = @daemon ? default_pid_path : nil
end
end
-
- def resolve_log_file_path
+
+ def resolve_log_file_path
@ahn_app_log_directory = AHN_ROOT + '/log'
@log_file = File.expand_path(ahn_app_log_directory + "/adhearsion.log")
end
-
+
def switch_to_root_directory
Dir.chdir AHN_ROOT
end
-
+
def catch_termination_signal
%w'INT TERM'.each do |process_signal|
trap process_signal do
ahn_log "Shutting down gracefully at #{Time.now}."
- Events.trigger :shutdown
+ Events.trigger_immediately :shutdown
exit
end
end
end
-
+
##
# This step in the initialization process loads the .ahnrc in the given app folder. With the information in .ahnrc, we
# can continue the initialization knowing where certain files are specifically.
#
def bootstrap_rc
rules = self.class.get_rules_from AHN_ROOT
-
+
AHN_CONFIG.ahnrc = rules
-
+
# DEPRECATION: Check if the old paths format is being used. If so, abort and notify.
if rules.has_key?("paths") && rules["paths"].kind_of?(Hash)
paths = rules["paths"].each_pair do |key,value|
if value.kind_of?(Hash)
if value.has_key?("directory") || value.has_key?("pattern")
puts
puts *caller
puts
-
+
abort <<-WARNING
Deprecation Warning
-------------------
The (hidden) .ahnrc file in this app is of an older format and needs to be fixed.
There is a rake task to automatically fix it or you can do it manually. Note: it's
best if you do it manually so you can retain the YAML comments in your .ahnrc file.
-
-The rake task is called "deprecations:fix_ahnrc_path_format".
+The rake task is called "deprecations:fix_ahnrc_path_format".
+
To do it manually, find all entries in the "paths" section of your ".ahnrc" file
which look like the following:
paths:
key_name_could_be_anything:
@@ -230,11 +231,11 @@
WARNING
end
end
end
end
-
+
gems = rules['gems']
if gems.kind_of?(Hash) && gems.any? && respond_to?(:gem)
gems.each_pair do |gem_name,properties_hash|
if properties_hash && properties_hash["version"]
gem gem_name, properties_hash["version"]
@@ -245,36 +246,44 @@
case properties_hash["require"]
when Array
properties_hash["require"].each { |lib| require lib }
when String
require properties_hash["require"]
- end
+ end
end
end
end
end
-
+
def load_all_init_files
init_files_from_rc = AHN_CONFIG.files_from_setting("paths", "init").map { |file| File.expand_path(file) }
already_loaded_init_files = Array(@loaded_init_files).map { |file| File.expand_path(file) }
(init_files_from_rc - already_loaded_init_files).each { |init| load init }
end
-
- def init_modules
+
+ def init_datasources
require 'adhearsion/initializer/database.rb'
+ require 'adhearsion/initializer/ldap.rb'
+
+ DatabaseInitializer.start if AHN_CONFIG.database_enabled?
+ LdapInitializer.start if AHN_CONFIG.ldap_enabled?
+ end
+
+ def init_modules
+
require 'adhearsion/initializer/asterisk.rb'
require 'adhearsion/initializer/drb.rb'
require 'adhearsion/initializer/rails.rb'
# require 'adhearsion/initializer/freeswitch.rb'
-
- DatabaseInitializer.start if AHN_CONFIG.database_enabled?
- AsteriskInitializer.start if AHN_CONFIG.asterisk_enabled?
- DrbInitializer.start if AHN_CONFIG.drb_enabled?
- RailsInitializer.start if AHN_CONFIG.rails_enabled?
+
+ AsteriskInitializer.start if AHN_CONFIG.asterisk_enabled?
+ DrbInitializer.start if AHN_CONFIG.drb_enabled?
+ RailsInitializer.start if AHN_CONFIG.rails_enabled?
# FreeswitchInitializer.start if AHN_CONFIG.freeswitch_enabled?
+
end
-
+
def init_events_subsystem
application_events_files = AHN_CONFIG.files_from_setting("paths", "events")
if application_events_files.any?
Events.register_callback(:shutdown) do
ahn_log.events "Performing a graceful stop of events subsystem"
@@ -283,52 +292,52 @@
Events.framework_theatre.start!
else
ahn_log.events.warn 'No entries in the "events" section of .ahnrc. Skipping its initialization.'
end
end
-
+
def init_events_file
application_events_files = AHN_CONFIG.files_from_setting("paths", "events")
application_events_files.each do |file|
Events.framework_theatre.load_events_file file
end
end
-
+
def should_daemonize?
@daemon || ENV['DAEMON']
end
-
+
def daemonize!
ahn_log "Daemonizing now! Creating #{pid_file}."
extend Adhearsion::CustomDaemonizer
daemonize log_file
end
-
+
def initialize_log_file
Dir.mkdir(ahn_app_log_directory) unless File.directory? ahn_app_log_directory
file_logger = Log4r::FileOutputter.new("Main Adhearsion log file", :filename => log_file, :trunc => false)
-
+
if should_daemonize?
Logging::AdhearsionLogger.outputters = file_logger
else
Logging::AdhearsionLogger.outputters << file_logger
end
Logging::DefaultAdhearsionLogger.redefine_outputters
end
-
+
def create_pid_file(file = pid_file)
if file
File.open pid_file, 'w' do |file|
file.puts Process.pid
end
-
+
Events.register_callback :shutdown do
File.delete(pid_file) if File.exists?(pid_file)
end
end
end
-
+
def init_components_subsystem
@components_directory = File.expand_path "components"
if File.directory? @components_directory
Components.component_manager = Components::ComponentManager.new @components_directory
Kernel.send(:const_set, :COMPONENTS, Components.component_manager.lazy_config_loader)
@@ -336,21 +345,21 @@
Components.component_manager.extend_object_with(Theatre::CallbackDefinitionLoader, :events)
else
ahn_log.warn "No components directory found. Not initializing any components."
end
end
-
+
def load_components
if Components.component_manager
Components.component_manager.load_components
end
end
-
+
def trigger_after_initialized_hooks
Events.trigger_immediately :after_initialized
end
-
+
##
# This method will block Thread.main() until calling join() has returned for all Threads in IMPORTANT_THREADS.
# Note: IMPORTANT_THREADS won't always contain Thread instances. It simply requires the objects respond to join().
#
def join_important_threads
@@ -365,9 +374,9 @@
ensure
index = index + 1
end
end
end
-
+
class InitializationFailedError < Exception; end
end
end