lib/conf/default.rb in rsence-2.0.0.10.pre vs lib/conf/default.rb in rsence-2.0.0.11

- old
+ new

@@ -1,227 +1,219 @@ -#-- ## RSence # Copyright 2008 Riassence Inc. # http://riassence.com/ # # You should have received a copy of the GNU General Public License along # with this software package. If not, contact licensing@riassence.com ## - #++ + require 'rubygems' require 'rack' require 'yaml' -if RUBY_VERSION.to_f >= 1.9 - # -- - # Ruby 1.9 encoding defaults. - # This is clearly not enough but a good start for fixing the encoding madness. - # ++ - Encoding.default_external = Encoding::BINARY - Encoding.default_internal = Encoding::BINARY - # -- - # Ruby 1.9 doesn't have String#each anymore. - # This is a backwards-compatible work-around. - # ++ - class String - def each - self.split($/).each { |e| yield e } - end - end -end -# Configuration handles config files and such. -class Configuration + +require 'util/ruby19_fixes' if RUBY_VERSION.to_f >= 1.9 + + +module RSence - # Method for combining two arrays - def array_merge( target, source ) - source.each do |item| - unless target.include?(item) - if item.class == Array - sub_arr = [] - array_merge( sub_arr, item ) - target.push( sub_arr ) - elsif item.class == Hash - sub_hash = {} - hash_merge( sub_hash, item ) - target.push( sub_hash ) - else - target.push( item ) + + # Configuration handles config files and such. + class Configuration + + # Combines the Arrays `target` and `source` recursively. + # @param [Array] target Gets merged with `source` + # @param [Array] source Has its items pushed to `target` unless an identical item already exists in `target`. If an item class is a Hash, then uses {#hash_merge} to combine them. + def array_merge( target, source ) + source.each do |item| + unless target.include?(item) + if item.class == Array + sub_arr = [] + array_merge( sub_arr, item ) + target.push( sub_arr ) + elsif item.class == Hash + sub_hash = {} + hash_merge( sub_hash, item ) + target.push( sub_hash ) + else + target.push( item ) + end end end end - end - # Method for combining two hashes. - def hash_merge( target, source ) - source.each do |key,item| - if not target.has_key?key or target[key] != item - if item.class == Array - target[key] = [] unless target.has_key?(key) - array_merge( target[key], item ) - elsif item.class == Hash - target[key] = {} unless target.has_key?key - hash_merge( target[key], item ) - else - target[key] = item + # Combines the Hashes `target` and `source` recursively. + # @param [Hash] target Gets merged with `source` + # @param [Hash] source Has its items merged to `target` unless a key with an identical value already exists in `target`. If an item class is Array, then uses {#array_merge} to combine them. + def hash_merge( target, source ) + source.each do |key,item| + if not target.has_key?key or target[key] != item + if item.class == Array + target[key] = [] unless target.has_key?(key) + array_merge( target[key], item ) + elsif item.class == Hash + target[key] = {} unless target.has_key?key + hash_merge( target[key], item ) + else + target[key] = item + end end end end - end - # The args structure comes from RSence::ARGVParser - # The dont_expand_path is for special cases, when - # Configuration is used without running RSence. - def initialize( args, dont_expand_path=false ) + # @param args A parsed structure of the command-line arguments. + # @param dont_expand_path Is reserved for special cases, when Configuration is used without running RSence. + def initialize( args, dont_expand_path=false ) - ## Paths for log and pid files - pidpath = File.join( args[:env_path], 'run' ) - logpath = File.join( args[:env_path], 'log' ) + ## Paths for log and pid files + pidpath = File.join( args[:env_path], 'run' ) + logpath = File.join( args[:env_path], 'log' ) - # The default configuration path, this one is distributed with the system. - yaml_conf_path = File.join( SERVER_PATH, 'conf', 'default_conf.yaml' ) + # The default configuration path, this one is distributed with the system. + yaml_conf_path = File.join( SERVER_PATH, 'conf', 'default_conf.yaml' ) - # Parses the default configuration from yaml first. - # This is used as the basis for overriding the defaults in various other config files. - config = YAML.load( File.read( yaml_conf_path ) ) + # Parses the default configuration from yaml first. + # This is used as the basis for overriding the defaults in various other config files. + config = YAML.load( File.read( yaml_conf_path ) ) - # The default strings for various messages, this one is distributed with the system. - yaml_strings_path = File.join( SERVER_PATH, 'conf', 'default_strings.yaml' ) - strings = YAML.load( File.read( yaml_strings_path ) ) + # The default strings for various messages, this one is distributed with the system. + yaml_strings_path = File.join( SERVER_PATH, 'conf', 'default_strings.yaml' ) + strings = YAML.load( File.read( yaml_strings_path ) ) - # Transporter-specific strings are set. - config[:transporter_conf][:messages] = strings[:messages][:transporter] + # Transporter-specific strings are set. + config[:transporter_conf][:messages] = strings[:messages][:transporter] - # Makes the distribution 'js' directory containing the client core the - # first client package source directory. - config[:client_pkg][:src_dirs].unshift( File.join( SERVER_PATH, 'js' ) ) + # Makes the distribution 'js' directory containing the client core the + # first client package source directory. + config[:client_pkg][:src_dirs].unshift( File.join( SERVER_PATH, 'js' ) ) - # The distributed standard plugins are in this directory. - default_plugins_path = File.join( SERVER_PATH, 'plugins' ) - unless config[:plugin_paths].include? default_plugins_path - config[:plugin_paths].push( default_plugins_path ) - end + # The distributed standard plugins are in this directory. + default_plugins_path = File.join( SERVER_PATH, 'plugins' ) + unless config[:plugin_paths].include? default_plugins_path + config[:plugin_paths].push( default_plugins_path ) + end - # Paths to add to $LOAD_PATH after all configuration files are read. - lib_paths = [] + # Paths to add to $LOAD_PATH after all configuration files are read. + lib_paths = [] - # List of configuration files to look for. - local_config_file_paths = [ - File.join(SERVER_PATH,'conf','local_conf.yaml'), - '/etc/rsence/config.yaml', - File.expand_path('~/.rsence/config.yaml'), - File.join( File.split( SERVER_PATH )[0], 'conf', 'local_conf.yaml' ) - ] + # List of configuration files to look for. + local_config_file_paths = [ + File.join(SERVER_PATH,'conf','local_conf.yaml'), + '/etc/rsence/config.yaml', + File.expand_path('~/.rsence/config.yaml'), + File.join( File.split( SERVER_PATH )[0], 'conf', 'local_conf.yaml' ) + ] - # Add the additional config files optionally specified in ARGVParser - args[:conf_files].each do |conf_file| - local_config_file_paths.push( conf_file ) - end + # Add the additional config files optionally specified in ARGVParser + args[:conf_files].each do |conf_file| + local_config_file_paths.push( conf_file ) + end - # Loads the configuration files - local_config_file_paths.each do |local_config_file_path| - if File.exists? local_config_file_path and File.file? local_config_file_path - if local_config_file_path.end_with? '.yaml' - puts "loading config file: #{local_config_file_path}" if args[:verbose] - local_conf = YAML.load( File.read( local_config_file_path ) ) - unless local_conf.class == Hash - warn "invalid configuration file: #{local_config_file_path.inspect}" - next + # Loads the configuration files + local_config_file_paths.each do |local_config_file_path| + if File.exists? local_config_file_path and File.file? local_config_file_path + if local_config_file_path.end_with? '.yaml' + puts "loading config file: #{local_config_file_path}" if args[:verbose] + local_conf = YAML.load( File.read( local_config_file_path ) ) + unless local_conf.class == Hash + warn "invalid configuration file: #{local_config_file_path.inspect}" + next + end + hash_merge( config, local_conf ) + else + warn "Only Yaml configuration files are supported." end - hash_merge( config, local_conf ) - else - warn "Only Yaml configuration files are supported." end end - end - # Adds the plugins directory of the environment - # to the configuration automatically - env_plugins_path = File.expand_path( 'plugins', args[:env_path] ) - unless config[:plugin_paths].include? env_plugins_path - config[:plugin_paths].push( env_plugins_path ) - end + # Adds the plugins directory of the environment + # to the configuration automatically + env_plugins_path = File.expand_path( 'plugins', args[:env_path] ) + unless config[:plugin_paths].include? env_plugins_path + config[:plugin_paths].push( env_plugins_path ) + end - # At this point, configuration files are read and ready. + # At this point, configuration files are read and ready. - puts "plugin paths: #{config[:plugin_paths].inspect}" if args[:debug] + puts "plugin paths: #{config[:plugin_paths].inspect}" if args[:debug] - # Override configuration options with command-line-options. - config[:trace] = true if args[:trace_js] - config[:debug_mode] = true if args[:debug] - config[:http_server][:latency] = args[:latency] - config[:http_server][:port] = args[:port] if args[:port] - config[:http_server][:bind_address] = args[:addr] if args[:addr] - config[:http_server][:rack_require] = args[:server] if args[:server] - config[:session_conf][:reset_sessions] = true if args[:reset_ses] + # Override configuration options with command-line-options. + config[:trace] = true if args[:trace_js] + config[:debug_mode] = true if args[:debug] + config[:http_server][:latency] = args[:latency] + config[:http_server][:port] = args[:port] if args[:port] + config[:http_server][:bind_address] = args[:addr] if args[:addr] + config[:http_server][:rack_require] = args[:server] if args[:server] + config[:session_conf][:reset_sessions] = true if args[:reset_ses] - config[:client_pkg][:no_obfuscation] = true if args[:client_pkg_no_obfuscation] - config[:client_pkg][:no_whitespace_removal] = true if args[:client_pkg_no_whitespace_removal] + config[:client_pkg][:no_obfuscation] = true if args[:client_pkg_no_obfuscation] + config[:client_pkg][:no_whitespace_removal] = true if args[:client_pkg_no_whitespace_removal] - # Sets the default pid and log paths used by the HTTPDaemon - config[:daemon][:pid_fn] = File.join(pidpath, "rsence.pid") unless config[:daemon].has_key?(:pid_fn) - config[:daemon][:log_fn] = File.join(logpath, "rsence") unless config[:daemon].has_key?(:log_fn) + # Sets the default pid and log paths used by the HTTPDaemon + config[:daemon][:pid_fn] = File.join(pidpath, "rsence.pid") unless config[:daemon].has_key?(:pid_fn) + config[:daemon][:log_fn] = File.join(logpath, "rsence") unless config[:daemon].has_key?(:log_fn) - # Check database path for sqlite databases. - if config[:database][:ses_db].start_with?('sqlite://') and not dont_expand_path - db_url = File.expand_path( config[:database][:ses_db].split('sqlite://')[1], args[:env_path] ) - config[:database][:ses_db] = "sqlite://#{db_url}" - end + # Check database path for sqlite databases. + if config[:database][:ses_db].start_with?('sqlite://') and not dont_expand_path + db_url = File.expand_path( config[:database][:ses_db].split('sqlite://')[1], args[:env_path] ) + config[:database][:ses_db] = "sqlite://#{db_url}" + end - # Sets the various standard url prefixes: - [ ## POST-requests - # broker_key # default_uri - # The default responder for transporter requests. - [ :x, File.join(config[:base_url],'x') ], - # The default responder for cookie-enabled "handshake" transporter requests - [ :hello, File.join(config[:base_url],'hello') ], - # The default responder for file uploads - [ :u, File.join(config[:base_url],'U') ], + # Sets the various standard url prefixes: + [ ## POST-requests + # broker_key # default_uri + # The default responder for transporter requests. + [ :x, File.join(config[:base_url],'x') ], + # The default responder for cookie-enabled "handshake" transporter requests + [ :hello, File.join(config[:base_url],'hello') ], + # The default responder for file uploads + [ :u, File.join(config[:base_url],'U') ], - ## GET-requests - # broker_key # default_uri - # The default address of built javascript and theme packages - [ :h, File.join(config[:base_url],'H/') ], - # The default address of the ticketserve :img -category - [ :i, File.join(config[:base_url],'i/') ], - # The default address of the ticketserve :rsrc -category - [ :d, File.join(config[:base_url],'d/') ], - # The default address of the ticketserve :file -category - [ :f, File.join(config[:base_url],'f/') ], - # The default address of the ticketserve :blobobj -category - [ :b, File.join(config[:base_url],'b/') ], - # The default address of the favicon - [ :favicon, '/favicon.ico' ], - # The default address of the "empty" iframe of uploader - [ :uploader_iframe, File.join(config[:base_url],'U/iframe_html') ], - ].each do |broker_key, default_uri| - unless config[:broker_urls].has_key?( broker_key ) - config[:broker_urls][broker_key] = default_uri + ## GET-requests + # broker_key # default_uri + # The default address of built javascript and theme packages + [ :h, File.join(config[:base_url],'H/') ], + # The default address of the ticketserve :img -category + [ :i, File.join(config[:base_url],'i/') ], + # The default address of the ticketserve :rsrc -category + [ :d, File.join(config[:base_url],'d/') ], + # The default address of the ticketserve :file -category + [ :f, File.join(config[:base_url],'f/') ], + # The default address of the ticketserve :blobobj -category + [ :b, File.join(config[:base_url],'b/') ], + # The default address of the favicon + [ :favicon, '/favicon.ico' ], + # The default address of the "empty" iframe of uploader + [ :uploader_iframe, File.join(config[:base_url],'U/iframe_html') ], + ].each do |broker_key, default_uri| + unless config[:broker_urls].has_key?( broker_key ) + config[:broker_urls][broker_key] = default_uri + end end - end - if RUBY_VERSION.to_f >= 1.9 - # The encodings mess up compression when using ruby1.9 - warn "Disabling gzip support for ruby 1.9" if args[:debug] - config[:no_gzip] = true - end + if RUBY_VERSION.to_f >= 1.9 + # The encodings mess up compression when using ruby1.9 + warn "Disabling gzip support for ruby 1.9" if args[:debug] + config[:no_gzip] = true + end - # The default address of the index_html plugin - unless config[:index_html].has_key?(:respond_address) - config[:index_html][:respond_address] = File.join(config[:base_url]) - end + # The default address of the index_html plugin + unless config[:index_html].has_key?(:respond_address) + config[:index_html][:respond_address] = File.join(config[:base_url]) + end - ## Uses the lib paths as search paths - lib_paths.merge( config[:lib_paths] ) if config.has_key?(:lib_paths) - lib_paths.each do |lib_path| - $LOAD_PATH << lib_path - end + ## Uses the lib paths as search paths + lib_paths.merge( config[:lib_paths] ) if config.has_key?(:lib_paths) + lib_paths.each do |lib_path| + $LOAD_PATH << lib_path + end - @config = config - end + @config = config + end - attr_reader :config + attr_reader :config + end end -