class PhusionPassenger::Standalone::AppFinder

Security note: can run arbitrary ruby code by evaluating passenger.conf

Attributes

apps[R]
dirs[RW]

Public Class Methods

looks_like_app_directory?(dir) click to toggle source
# File lib/phusion_passenger/standalone/app_finder.rb, line 33
def self.looks_like_app_directory?(dir)
        return File.exist?("#{dir}/config.ru") ||
                File.exist?("#{dir}/config/environment.rb") ||
                File.exist?("#{dir}/passenger_wsgi.py") ||
                File.exist?("#{dir}/passenger_node.js")
end
new(dirs, options = {}) click to toggle source
# File lib/phusion_passenger/standalone/app_finder.rb, line 40
def initialize(dirs, options = {})
        @dirs = dirs
        @options = options
end

Public Instance Methods

monitor(termination_pipe) { |new_apps| ... } click to toggle source
# File lib/phusion_passenger/standalone/app_finder.rb, line 78
def monitor(termination_pipe)
        raise "You must call #scan first" if !@apps
        
        watcher = PhusionPassenger::Utils::FileSystemWatcher.new(@watchlist, termination_pipe)
        if wait_on_io(termination_pipe, 3)
                return
        end
        
        while true
                changed = watcher.wait_for_change
                watcher.close
                if changed
                        old_apps = @apps
                        # The change could be caused by a write to some passenger.conf file.
                        # Wait for a short period so that the write has a chance to finish.
                        if wait_on_io(termination_pipe, 0.25)
                                return
                        end
                        
                        new_apps = scan
                        watcher = PhusionPassenger::Utils::FileSystemWatcher.new(@watchlist, termination_pipe)
                        if old_apps != new_apps
                                yield(new_apps)
                        end
                        
                        # Don't process change events again for a short while,
                        # but do detect changes while waiting.
                        if wait_on_io(termination_pipe, 3)
                                return
                        end
                else
                        return
                end
        end
ensure
        watcher.close if watcher
end
scan() click to toggle source
# File lib/phusion_passenger/standalone/app_finder.rb, line 45
def scan
        apps = []
        watchlist = []
        
        app_root = find_app_root
        apps << {
                :server_names => ["_"],
                :root => app_root
        }
        watchlist << app_root
        watchlist << "#{app_root}/config" if File.exist?("#{app_root}/config")
        watchlist << "#{app_root}/passenger.conf" if File.exist?("#{app_root}/passenger.conf")
        
        apps.sort! do |a, b|
                a[:root] <=> b[:root]
        end
        apps.map! do |app|
                config_filename = File.join(app[:root], "passenger.conf")
                if File.exist?(config_filename)
                        local_options = load_config_file(:local_config, config_filename)
                        merged_options = @options.merge(app)
                        merged_options.merge!(local_options)
                        merged_options
                else
                        @options.merge(app)
                end
        end
        
        @apps = apps
        @watchlist = watchlist
        return apps
end

Private Instance Methods

filename_to_server_names(filename) click to toggle source
# File lib/phusion_passenger/standalone/app_finder.rb, line 136
def filename_to_server_names(filename)
        basename = File.basename(filename)
        names = [basename]
        if basename !~ /^www\.$/i
                names << "www.#{basename}"
        end
        return names
end
find_app_root() click to toggle source
# File lib/phusion_passenger/standalone/app_finder.rb, line 119
def find_app_root
        if @dirs.empty?
                return File.expand_path(".")
        else
                return File.expand_path(@dirs[0])
        end
end
load_config_file(context, filename) click to toggle source
# File lib/phusion_passenger/standalone/app_finder.rb, line 127
def load_config_file(context, filename)
        require 'phusion_passenger/standalone/config_file' unless defined?(ConfigFile)
        return ConfigFile.new(context, filename).options
end
looks_like_app_directory?(dir) click to toggle source
# File lib/phusion_passenger/standalone/app_finder.rb, line 132
def looks_like_app_directory?(dir)
        return AppFinder.looks_like_app_directory?(dir)
end
wait_on_io(io, timeout) click to toggle source

Wait until the given IO becomes readable, or until the timeout has been reached. Returns true if the IO became readable, false if the timeout has been reached.

# File lib/phusion_passenger/standalone/app_finder.rb, line 148
def wait_on_io(io, timeout)
        return !!select([io], nil, nil, timeout)
end