Parent

Class/Module Index [+]

Quicksearch

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) 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

[Validate]

Generated with the Darkfish Rdoc Generator 2.