lib/phusion_passenger.rb in passenger-5.0.0.beta3 vs lib/phusion_passenger.rb in passenger-5.0.0.rc1

- old
+ new

@@ -21,301 +21,301 @@ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. module PhusionPassenger - FILE_LOCATION = File.expand_path(__FILE__) + FILE_LOCATION = File.expand_path(__FILE__) - ###### Names and version numbers ###### + ###### Names and version numbers ###### - PACKAGE_NAME = 'passenger' - # Run 'rake ext/common/Constants.h' after changing this number. - VERSION_STRING = '5.0.0.beta3' + PACKAGE_NAME = 'passenger' + # Run 'rake ext/common/Constants.h' after changing this number. + VERSION_STRING = '5.0.0.rc1' - PREFERRED_NGINX_VERSION = '1.6.2' - NGINX_SHA256_CHECKSUM = 'b5608c2959d3e7ad09b20fc8f9e5bd4bc87b3bc8ba5936a513c04ed8f1391a18' + PREFERRED_NGINX_VERSION = '1.6.2' + NGINX_SHA256_CHECKSUM = 'b5608c2959d3e7ad09b20fc8f9e5bd4bc87b3bc8ba5936a513c04ed8f1391a18' - PREFERRED_PCRE_VERSION = '8.34' - PCRE_SHA256_CHECKSUM = '1dd78994c81e44ac41cf30b2a21d4b4cc6d76ccde7fc6e77713ed51d7bddca47' + PREFERRED_PCRE_VERSION = '8.34' + PCRE_SHA256_CHECKSUM = '1dd78994c81e44ac41cf30b2a21d4b4cc6d76ccde7fc6e77713ed51d7bddca47' - STANDALONE_INTERFACE_VERSION = 1 + STANDALONE_INTERFACE_VERSION = 1 - ###### Directories ###### + ###### Directories ###### - GLOBAL_NAMESPACE_DIRNAME_ = "passenger" - # Subdirectory under $HOME to use for storing stuff. - USER_NAMESPACE_DIRNAME_ = ".passenger" - # The name for the /etc/apache2/mods-available/*.{load,conf} file. - APACHE2_MODULE_CONF_NAME = "passenger" + GLOBAL_NAMESPACE_DIRNAME_ = "passenger" + # Subdirectory under $HOME to use for storing stuff. + USER_NAMESPACE_DIRNAME_ = ".passenger" + # The name for the /etc/apache2/mods-available/*.{load,conf} file. + APACHE2_MODULE_CONF_NAME = "passenger" - # Directories in which to look for plugins. - PLUGIN_DIRS = [ - "/usr/share/#{GLOBAL_NAMESPACE_DIRNAME_}/plugins", - "/usr/local/share/#{GLOBAL_NAMESPACE_DIRNAME_}/plugins", - "~/#{USER_NAMESPACE_DIRNAME_}/plugins" - ] + # Directories in which to look for plugins. + PLUGIN_DIRS = [ + "/usr/share/#{GLOBAL_NAMESPACE_DIRNAME_}/plugins", + "/usr/local/share/#{GLOBAL_NAMESPACE_DIRNAME_}/plugins", + "~/#{USER_NAMESPACE_DIRNAME_}/plugins" + ] - REQUIRED_LOCATIONS_INI_FIELDS = [ - # User-invoked commands - :bin_dir, - # Support binaries - :support_binaries_dir, - # Library files like libboost_oxt.a and various .o files - :lib_dir, - # Scripts not directly invoked by users - :helper_scripts_dir, - # Various non-executable resources - :resources_dir, - # C header files, necessary for compiling Nginx - :include_dir, - # Documentation - :doc_dir, - # Ruby support libraries - :ruby_libdir, - # Node.js support libraries - :node_libdir, - # Path to the compiled Apache module - :apache2_module_path, - # Directory containing the source code of our Ruby extension - :ruby_extension_source_dir, - # Directory containing the source code of our Nginx module - :nginx_module_source_dir - ].freeze - OPTIONAL_LOCATIONS_INI_FIELDS = [ - # Directory which contains the main Phusion Passenger Rakefile. Only - # available when originally packaged, - :build_system_dir, - # Directory in which downloaded Phusion Passenger binaries are cached. - :download_cache_dir - ].freeze + REQUIRED_LOCATIONS_INI_FIELDS = [ + # User-invoked commands + :bin_dir, + # Support binaries + :support_binaries_dir, + # Library files like libboost_oxt.a and various .o files + :lib_dir, + # Scripts not directly invoked by users + :helper_scripts_dir, + # Various non-executable resources + :resources_dir, + # C header files, necessary for compiling Nginx + :include_dir, + # Documentation + :doc_dir, + # Ruby support libraries + :ruby_libdir, + # Node.js support libraries + :node_libdir, + # Path to the compiled Apache module + :apache2_module_path, + # Directory containing the source code of our Ruby extension + :ruby_extension_source_dir, + # Directory containing the source code of our Nginx module + :nginx_module_source_dir + ].freeze + OPTIONAL_LOCATIONS_INI_FIELDS = [ + # Directory which contains the main Phusion Passenger Rakefile. Only + # available when originally packaged, + :build_system_dir, + # Directory in which downloaded Phusion Passenger binaries are cached. + :download_cache_dir + ].freeze - # Follows the logic of ext/common/ResourceLocator.h, so don't forget to modify that too. - def self.locate_directories(install_spec = nil) - @install_spec = install_spec || infer_install_spec - if @install_spec && File.file?(@install_spec) - filename = @install_spec - options = parse_ini_file(filename) + # Follows the logic of ext/common/ResourceLocator.h, so don't forget to modify that too. + def self.locate_directories(install_spec = nil) + @install_spec = install_spec || infer_install_spec + if @install_spec && File.file?(@install_spec) + filename = @install_spec + options = parse_ini_file(filename) - @custom_packaged = true - @packaging_method = get_option(filename, options, 'packaging_method') - REQUIRED_LOCATIONS_INI_FIELDS.each do |field| - value = get_option(filename, options, field.to_s) - value.freeze unless value.nil? - instance_variable_set("@#{field}", value) - end - OPTIONAL_LOCATIONS_INI_FIELDS.each do |field| - value = get_option(filename, options, field.to_s, false) - value.freeze unless value.nil? - instance_variable_set("@#{field}", value) - end - else - source_root = File.dirname(File.dirname(FILE_LOCATION)) - @install_spec = source_root - @custom_packaged = false - @bin_dir = "#{source_root}/bin".freeze - @support_binaries_dir = "#{source_root}/buildout/support-binaries".freeze - @lib_dir = "#{source_root}/buildout".freeze - @helper_scripts_dir = "#{source_root}/helper-scripts".freeze - @resources_dir = "#{source_root}/resources".freeze - @include_dir = "#{source_root}/ext".freeze - @doc_dir = "#{source_root}/doc".freeze - @ruby_libdir = File.dirname(FILE_LOCATION).freeze - @node_libdir = "#{source_root}/node_lib".freeze - @apache2_module_path = "#{source_root}/buildout/apache2/mod_passenger.so".freeze - @ruby_extension_source_dir = "#{source_root}/ext/ruby".freeze - @nginx_module_source_dir = "#{source_root}/ext/nginx".freeze - @download_cache_dir = "#{source_root}/download_cache".freeze - @build_system_dir = source_root.dup.freeze - REQUIRED_LOCATIONS_INI_FIELDS.each do |field| - if instance_variable_get("@#{field}").nil? - raise "BUG: @#{field} not set" - end - end - end - end + @custom_packaged = true + @packaging_method = get_option(filename, options, 'packaging_method') + REQUIRED_LOCATIONS_INI_FIELDS.each do |field| + value = get_option(filename, options, field.to_s) + value.freeze unless value.nil? + instance_variable_set("@#{field}", value) + end + OPTIONAL_LOCATIONS_INI_FIELDS.each do |field| + value = get_option(filename, options, field.to_s, false) + value.freeze unless value.nil? + instance_variable_set("@#{field}", value) + end + else + source_root = File.dirname(File.dirname(FILE_LOCATION)) + @install_spec = source_root + @custom_packaged = false + @bin_dir = "#{source_root}/bin".freeze + @support_binaries_dir = "#{source_root}/buildout/support-binaries".freeze + @lib_dir = "#{source_root}/buildout".freeze + @helper_scripts_dir = "#{source_root}/helper-scripts".freeze + @resources_dir = "#{source_root}/resources".freeze + @include_dir = "#{source_root}/ext".freeze + @doc_dir = "#{source_root}/doc".freeze + @ruby_libdir = File.dirname(FILE_LOCATION).freeze + @node_libdir = "#{source_root}/node_lib".freeze + @apache2_module_path = "#{source_root}/buildout/apache2/mod_passenger.so".freeze + @ruby_extension_source_dir = "#{source_root}/ext/ruby".freeze + @nginx_module_source_dir = "#{source_root}/ext/nginx".freeze + @download_cache_dir = "#{source_root}/download_cache".freeze + @build_system_dir = source_root.dup.freeze + REQUIRED_LOCATIONS_INI_FIELDS.each do |field| + if instance_variable_get("@#{field}").nil? + raise "BUG: @#{field} not set" + end + end + end + end - # Returns whether this Phusion Passenger installation is in the 'originally packaged' - # configuration (as opposed to the 'custom packaged' configuration. - def self.originally_packaged? - return !@custom_packaged - end + # Returns whether this Phusion Passenger installation is in the 'originally packaged' + # configuration (as opposed to the 'custom packaged' configuration. + def self.originally_packaged? + return !@custom_packaged + end - def self.custom_packaged? - return @custom_packaged - end + def self.custom_packaged? + return @custom_packaged + end - # If Phusion Passenger is custom packaged, returns which packaging - # method was used. Can be 'deb', 'rpm', 'homebrew', 'test' - # or 'unknown'. - def self.packaging_method - return @custom_packaging_method - end + # If Phusion Passenger is custom packaged, returns which packaging + # method was used. Can be 'deb', 'rpm', 'homebrew', 'test' + # or 'unknown'. + def self.packaging_method + return @custom_packaging_method + end - # Whether the current Phusion Passenger installation is installed - # from a release package, e.g. an official gem or official tarball. - # Retruns false if e.g. the gem was built by the user, or if this - # install is from a git repository. - def self.installed_from_release_package? - File.exist?("#{resources_dir}/release.txt") - end + # Whether the current Phusion Passenger installation is installed + # from a release package, e.g. an official gem or official tarball. + # Retruns false if e.g. the gem was built by the user, or if this + # install is from a git repository. + def self.installed_from_release_package? + File.exist?("#{resources_dir}/release.txt") + end - # The installation specification string, as passed to #locate_directories. - def self.install_spec - return @install_spec - end + # The installation specification string, as passed to #locate_directories. + def self.install_spec + return @install_spec + end - # Generate getters for the directory types in locations.ini. - getters_code = "" - (REQUIRED_LOCATIONS_INI_FIELDS + OPTIONAL_LOCATIONS_INI_FIELDS).each do |field| - getters_code << %Q{ - def self.#{field} - return @#{field} - end - } - end - eval(getters_code, binding, __FILE__, __LINE__) + # Generate getters for the directory types in locations.ini. + getters_code = "" + (REQUIRED_LOCATIONS_INI_FIELDS + OPTIONAL_LOCATIONS_INI_FIELDS).each do |field| + getters_code << %Q{ + def self.#{field} + return @#{field} + end + } + end + eval(getters_code, binding, __FILE__, __LINE__) - def self.user_support_binaries_dir - return "#{home_dir}/#{USER_NAMESPACE_DIRNAME_}/support-binaries/#{VERSION_STRING}" - end + def self.user_support_binaries_dir + return "#{home_dir}/#{USER_NAMESPACE_DIRNAME_}/support-binaries/#{VERSION_STRING}" + end - def self.find_support_binary(name) - all_support_binary_dirs = [ - support_binaries_dir, - user_support_binaries_dir - ] - all_support_binary_dirs.each do |dir| - result = "#{dir}/#{name}" - if File.exist?(result) - return result - end - end - return nil - end + def self.find_support_binary(name) + all_support_binary_dirs = [ + support_binaries_dir, + user_support_binaries_dir + ] + all_support_binary_dirs.each do |dir| + result = "#{dir}/#{name}" + if File.exist?(result) + return result + end + end + return nil + end - def self.index_doc_path - return "#{doc_dir}/#{INDEX_DOC_NAME}" - end + def self.index_doc_path + return "#{doc_dir}/#{INDEX_DOC_NAME}" + end - def self.apache2_doc_path - return "#{doc_dir}/#{APACHE2_DOC_NAME}" - end + def self.apache2_doc_path + return "#{doc_dir}/#{APACHE2_DOC_NAME}" + end - def self.nginx_doc_path - return "#{doc_dir}/#{NGINX_DOC_NAME}" - end + def self.nginx_doc_path + return "#{doc_dir}/#{NGINX_DOC_NAME}" + end - def self.standalone_doc_path - return "#{doc_dir}/#{STANDALONE_DOC_NAME}" - end + def self.standalone_doc_path + return "#{doc_dir}/#{STANDALONE_DOC_NAME}" + end - ###### Other resource locations ###### + ###### Other resource locations ###### - INDEX_DOC_NAME = "Users guide.html".freeze - APACHE2_DOC_NAME = "Users guide Apache.html".freeze - NGINX_DOC_NAME = "Users guide Nginx.html".freeze - STANDALONE_DOC_NAME = "Users guide Standalone.html".freeze + INDEX_DOC_NAME = "Users guide.html".freeze + APACHE2_DOC_NAME = "Users guide Apache.html".freeze + NGINX_DOC_NAME = "Users guide Nginx.html".freeze + STANDALONE_DOC_NAME = "Users guide Standalone.html".freeze - def self.binaries_sites - return [ - { :url => "https://oss-binaries.phusionpassenger.com/binaries/passenger/by_release".freeze, - :cacert => "#{resources_dir}/oss-binaries.phusionpassenger.com.crt".freeze }, - { :url => "https://s3.amazonaws.com/phusion-passenger/binaries/passenger/by_release".freeze } - ] - end + def self.binaries_sites + return [ + { :url => "https://oss-binaries.phusionpassenger.com/binaries/passenger/by_release".freeze, + :cacert => "#{resources_dir}/oss-binaries.phusionpassenger.com.crt".freeze }, + { :url => "https://s3.amazonaws.com/phusion-passenger/binaries/passenger/by_release".freeze } + ] + end - # Instead of calling `require 'phusion_passenger/foo'`, you should call - # `PhusionPassenger.require_passenger_lib 'foo'`. This is because when Phusion - # Passenger is natively packaged, it may still be run with arbitrary Ruby - # interpreters. Adding ruby_libdir to $LOAD_PATH is then dangerous because ruby_libdir - # may be the distribution's Ruby's vendor_ruby directory, which may be incompatible - # with the active Ruby interpreter. This method looks up the exact filename directly. - # - # Using this method also has two more advantages: - # - # 1. It is immune to Bundler's load path mangling code. - # 2. It is faster than plan require() because it doesn't need to - # scan the entire load path. - def self.require_passenger_lib(name) - require("#{ruby_libdir}/phusion_passenger/#{name}") - end + # Instead of calling `require 'phusion_passenger/foo'`, you should call + # `PhusionPassenger.require_passenger_lib 'foo'`. This is because when Phusion + # Passenger is natively packaged, it may still be run with arbitrary Ruby + # interpreters. Adding ruby_libdir to $LOAD_PATH is then dangerous because ruby_libdir + # may be the distribution's Ruby's vendor_ruby directory, which may be incompatible + # with the active Ruby interpreter. This method looks up the exact filename directly. + # + # Using this method also has two more advantages: + # + # 1. It is immune to Bundler's load path mangling code. + # 2. It is faster than plan require() because it doesn't need to + # scan the entire load path. + def self.require_passenger_lib(name) + require("#{ruby_libdir}/phusion_passenger/#{name}") + end private - def self.infer_install_spec - filename = ENV['PASSENGER_LOCATION_CONFIGURATION_FILE'] - return filename if filename && !filename.empty? + def self.infer_install_spec + filename = ENV['PASSENGER_LOCATION_CONFIGURATION_FILE'] + return filename if filename && !filename.empty? - filename = File.dirname(FILE_LOCATION) + "/phusion_passenger/locations.ini" - return filename if filename && File.exist?(filename) + filename = File.dirname(FILE_LOCATION) + "/phusion_passenger/locations.ini" + return filename if filename && File.exist?(filename) - require 'etc' if !defined?(Etc) - begin - home_dir = Etc.getpwuid(Process.uid).dir - rescue ArgumentError - # Unknown user. - home_dir = ENV['HOME'] - end - if home_dir && !home_dir.empty? - filename = "#{home_dir}/#{USER_NAMESPACE_DIRNAME_}/locations.ini" - return filename if File.exist?(filename) - end + require 'etc' if !defined?(Etc) + begin + home_dir = Etc.getpwuid(Process.uid).dir + rescue ArgumentError + # Unknown user. + home_dir = ENV['HOME'] + end + if home_dir && !home_dir.empty? + filename = "#{home_dir}/#{USER_NAMESPACE_DIRNAME_}/locations.ini" + return filename if File.exist?(filename) + end - filename = "/etc/#{GLOBAL_NAMESPACE_DIRNAME_}/locations.ini" - return filename if File.exist?(filename) + filename = "/etc/#{GLOBAL_NAMESPACE_DIRNAME_}/locations.ini" + return filename if File.exist?(filename) - return nil - end + return nil + end - def self.parse_ini_file(filename) - options = {} - in_locations_section = false - File.open(filename, 'r') do |f| - while !f.eof? - line = f.readline - line.strip! - next if line.empty? - if line =~ /\A\[(.+)\]\Z/ - in_locations_section = $1 == 'locations' - elsif in_locations_section && line =~ /=/ - key, value = line.split(/ *= */, 2) - options[key.freeze] = value.freeze - end - end - end - return options - end + def self.parse_ini_file(filename) + options = {} + in_locations_section = false + File.open(filename, 'r') do |f| + while !f.eof? + line = f.readline + line.strip! + next if line.empty? + if line =~ /\A\[(.+)\]\Z/ + in_locations_section = $1 == 'locations' + elsif in_locations_section && line =~ /=/ + key, value = line.split(/ *= */, 2) + options[key.freeze] = value.freeze + end + end + end + return options + end - def self.get_option(filename, options, key, required = true) - value = options[key] - if value - return value - elsif required - raise "Option '#{key}' missing in file '#{filename}'" - else - return nil - end - end + def self.get_option(filename, options, key, required = true) + value = options[key] + if value + return value + elsif required + raise "Option '#{key}' missing in file '#{filename}'" + else + return nil + end + end - def self.get_bool_option(filename, options, key) - value = get_option(filename, options, key) - return value == 'yes' || value == 'true' || value == 'on' || value == '1' - end + def self.get_bool_option(filename, options, key) + value = get_option(filename, options, key) + return value == 'yes' || value == 'true' || value == 'on' || value == '1' + end - # The HOME environment variable is often unreliable, because for - # example `sudo` preserves it. That's why we don't respect it by - # default. - def self.home_dir(respect_home_env = false) - if respect_home_env - home = ENV['HOME'].to_s - end - if home.nil? || home.empty? - require 'etc' if !defined?(Etc) - home = Etc.getpwuid(Process.uid).dir - end - return home - end + # The HOME environment variable is often unreliable, because for + # example `sudo` preserves it. That's why we don't respect it by + # default. + def self.home_dir(respect_home_env = false) + if respect_home_env + home = ENV['HOME'].to_s + end + if home.nil? || home.empty? + require 'etc' if !defined?(Etc) + home = Etc.getpwuid(Process.uid).dir + end + return home + end end if !defined?(PhusionPassenger::VERSION_STRING)