lib/phusion_passenger.rb in passenger-3.0.21 vs lib/phusion_passenger.rb in passenger-3.9.1.beta
- old
+ new
@@ -1,5 +1,6 @@
+# encoding: utf-8
# Phusion Passenger - http://www.modrails.com/
# Copyright (c) 2010, 2011, 2012 Phusion
#
# "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.
#
@@ -20,96 +21,193 @@
# 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__)
+
+
###### Version numbers ######
# Phusion Passenger version number. Don't forget to edit ext/common/Constants.h too.
- VERSION_STRING = '3.0.21'
+ VERSION_STRING = '3.9.1.beta'
- PREFERRED_NGINX_VERSION = '1.2.9'
+ PREFERRED_NGINX_VERSION = '1.2.4'
PREFERRED_PCRE_VERSION = '8.31'
STANDALONE_INTERFACE_VERSION = 1
###### Directories ######
- # Don't forget to modify ext/common/ResourceLocator.h too.
- # Returns whether this Phusion Passenger installation is packaged
- # using the OS's native package management system, i.e. as opposed
- # to being installed from source or with RubyGems.
- def self.natively_packaged?
- if !defined?(@natively_packaged)
- @natively_packaged = !File.exist?("#{LIBDIR}/../Rakefile") ||
- !File.exist?("#{LIBDIR}/../DEVELOPERS.TXT")
+ GLOBAL_NAMESPACE_DIRNAME = "phusion-passenger"
+ GLOBAL_STANDALONE_NAMESPACE_DIRNAME = "passenger-standalone"
+ # Subdirectory under $HOME to use for storing stuff.
+ USER_NAMESPACE_DIRNAME = ".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"
+ ]
+
+ # Directory under $HOME for storing Phusion Passenger Standalone runtime files.
+ LOCAL_STANDALONE_RESOURCE_DIR = File.join(USER_NAMESPACE_DIRNAME, "standalone")
+
+ # System-wide directory for storing Phusion Passenger Standalone runtime files.
+ GLOBAL_STANDALONE_RESOURCE_DIR = "/var/lib/#{GLOBAL_STANDALONE_NAMESPACE_DIRNAME}".freeze
+
+ NATIVELY_PACKAGED_BIN_DIR = "/usr/bin".freeze
+ NATIVELY_PACKAGED_AGENTS_DIR = "/usr/lib/#{GLOBAL_NAMESPACE_DIRNAME}/agents".freeze
+ NATIVELY_PACKAGED_HELPER_SCRIPTS_DIR = "/usr/share/#{GLOBAL_NAMESPACE_DIRNAME}/helper-scripts".freeze
+ NATIVELY_PACKAGED_RESOURCES_DIR = "/usr/share/#{GLOBAL_NAMESPACE_DIRNAME}".freeze
+ NATIVELY_PACKAGED_DOC_DIR = "/usr/share/doc/#{GLOBAL_NAMESPACE_DIRNAME}".freeze
+ NATIVELY_PACKAGED_RUNTIME_LIBDIR = "/usr/lib/#{GLOBAL_NAMESPACE_DIRNAME}".freeze
+ NATIVELY_PACKAGED_HEADER_DIR = "/usr/include/#{GLOBAL_NAMESPACE_DIRNAME}".freeze
+ NATIVELY_PACKAGED_APACHE2_MODULE = "/usr/lib/apache2/modules/mod_passenger.so".freeze
+
+ # Follows the logic of ext/common/ResourceLocator.h, so don't forget to modify that too.
+ def self.locate_directories(source_root_or_location_configuration_file = nil)
+ source_root_or_location_configuration_file ||= find_location_configuration_file
+ root_or_file = @source_root = source_root_or_location_configuration_file
+
+ if root_or_file && File.file?(root_or_file)
+ filename = root_or_file
+ 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
+
+ @natively_packaged = get_bool_option(filename, options, 'natively_packaged')
+ @bin_dir = get_option(filename, options, 'bin').freeze
+ @agents_dir = get_option(filename, options, 'agents').freeze
+ @helper_scripts_dir = get_option(filename, options, 'helper_scripts').freeze
+ @resources_dir = get_option(filename, options, 'resources').freeze
+ @doc_dir = get_option(filename, options, 'doc').freeze
+ @apache2_module_path = get_option(filename, options, 'apache2_module').freeze
+ @ruby_extension_source_dir = get_option(filename, options, 'ruby_extension_source').freeze
+ else
+ @source_root = File.dirname(File.dirname(FILE_LOCATION))
+ @natively_packaged = false
+ @bin_dir = "#{@source_root}/bin".freeze
+ @agents_dir = "#{@source_root}/agents".freeze
+ @helper_scripts_dir = "#{@source_root}/helper-scripts".freeze
+ @resources_dir = "#{@source_root}/resources".freeze
+ @doc_dir = "#{@source_root}/doc".freeze
+ @apache2_module_path = "#{@source_root}/libout/apache2/mod_passenger.so".freeze
+ @ruby_extension_source_dir = "#{@source_root}/ext/ruby"
end
+ end
+
+ # Returns whether this Phusion Passenger installation is in the 'originally packaged'
+ # configuration (as opposed to the 'natively packaged' configuration.
+ def self.originally_packaged?
+ return !@natively_packaged
+ end
+
+ def self.natively_packaged?
return @natively_packaged
end
+
+ # When originally packaged, returns the source root.
+ # When natively packaged, returns the location of the location configuration file.
+ def self.source_root
+ return @source_root
+ end
- NATIVELY_PACKAGED_SOURCE_ROOT = "/usr/share/phusion-passenger/source"
- NATIVELY_PACKAGED_DOCDIR = "/usr/share/doc/phusion-passenger"
- NATIVELY_PACKAGED_RESOURCES_DIR = "/usr/share/phusion-passenger"
- NATIVELY_PACKAGED_AGENTS_DIR = "/usr/lib/phusion-passenger/agents"
- NATIVELY_PACKAGED_HELPER_SCRIPTS_DIR = "/usr/share/phusion-passenger/helper-scripts"
- NATIVELY_PACKAGED_APACHE2_MODULE = "/usr/lib/apache2/modules/mod_passenger.so"
+ def self.bin_dir
+ return @bin_dir
+ end
- # Directory containing the Phusion Passenger Ruby libraries.
- LIBDIR = File.expand_path(File.dirname(__FILE__))
+ def self.agents_dir
+ return @agents_dir
+ end
- # Directory containing templates.
- TEMPLATES_DIR = File.join(LIBDIR, "phusion_passenger", "templates")
+ def self.helper_scripts_dir
+ return @helper_scripts_dir
+ end
- # Subdirectory under $HOME to use for storing resource files.
- LOCAL_DIR = ".passenger"
+ def self.resources_dir
+ return @resources_dir
+ end
- # Directories in which to look for plugins.
- PLUGIN_DIRS = ["/usr/share/phusion-passenger/plugins",
- "/usr/local/share/phusion-passenger/plugins",
- "~/#{LOCAL_DIR}/plugins"]
+ def self.doc_dir
+ return @doc_dir
+ end
- # Directory under $HOME for storing Phusion Passenger Standalone resource files.
- LOCAL_STANDALONE_RESOURCE_DIR = File.join(LOCAL_DIR, "standalone")
+ def self.ruby_libdir
+ @libdir ||= File.dirname(FILE_LOCATION)
+ end
- # System-wide directory for storing Phusion Passenger Standalone resource files.
- GLOBAL_STANDALONE_RESOURCE_DIR = "/var/lib/passenger-standalone"
-
- if !natively_packaged?
- # Top directory of the Phusion Passenger source code.
- SOURCE_ROOT = File.expand_path(File.join(LIBDIR, ".."))
-
- # Documentation directory.
- DOCDIR = File.join(SOURCE_ROOT, "doc")
-
- # Directory containing Phusion Passenger resource files.
- RESOURCES_DIR = File.join(SOURCE_ROOT, "resources")
-
- AGENTS_DIR = File.join(SOURCE_ROOT, "agents")
-
- HELPER_SCRIPTS_DIR = File.join(SOURCE_ROOT, "helper-scripts")
-
- # Location of the Apache 2 module.
- APACHE2_MODULE = File.join(SOURCE_ROOT, "ext", "apache2", "mod_passenger.so")
-
- # Directory possibly containing #{archdir}/passenger_native_support.so.
- # Not available when natively packaged.
- NATIVE_SUPPORT_DIR = File.join(SOURCE_ROOT, "ext", "ruby")
- else
- SOURCE_ROOT = NATIVELY_PACKAGED_SOURCE_ROOT
- DOCDIR = NATIVELY_PACKAGED_DOCDIR
- RESOURCES_DIR = NATIVELY_PACKAGED_RESOURCES_DIR
- AGENTS_DIR = NATIVELY_PACKAGED_AGENTS_DIR
- HELPER_SCRIPTS_DIR = NATIVELY_PACKAGED_HELPER_SCRIPTS_DIR
- APACHE2_MODULE = NATIVELY_PACKAGED_APACHE2_MODULE
+ def self.apache2_module_path
+ return @apache2_module_path
end
+
+ def self.ruby_extension_source_dir
+ return @ruby_extension_source_dir
+ end
###### Other resource locations ######
STANDALONE_BINARIES_URL_ROOT = "http://standalone-binaries.modrails.com"
- if !$LOAD_PATH.include?(LIBDIR)
- $LOAD_PATH.unshift(LIBDIR)
+ if !$LOAD_PATH.include?(ruby_libdir)
+ $LOAD_PATH.unshift(ruby_libdir)
$LOAD_PATH.uniq!
end
-end if !defined?(PhusionPassenger::LIBDIR)
+
+
+private
+ def self.find_location_configuration_file
+ 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)
+
+ 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}/.passenger/locations.ini"
+ return filename if File.exist?(filename)
+ end
+
+ filename = "/etc/#{GLOBAL_NAMESPACE_DIRNAME}/locations.ini"
+ return filename if File.exist?(filename)
+
+ return nil
+ 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
+end if !defined?(PhusionPassenger::VERSION_STRING)