Class | PhusionPassenger::Standalone::AppFinder |
In: |
lib/phusion_passenger/standalone/app_finder.rb
|
Parent: | Object |
Security note: can run arbitrary ruby code by evaluating passenger.conf
apps | [R] | |
dirs | [RW] |
# File lib/phusion_passenger/standalone/app_finder.rb, line 33 33: def self.looks_like_app_directory?(dir) 34: return File.exist?("#{dir}/config.ru") || 35: File.exist?("#{dir}/config/environment.rb") || 36: File.exist?("#{dir}/passenger_wsgi.py") 37: end
# File lib/phusion_passenger/standalone/app_finder.rb, line 39 39: def initialize(dirs, options = {}) 40: @dirs = dirs 41: @options = options 42: end
# File lib/phusion_passenger/standalone/app_finder.rb, line 77 77: def monitor(termination_pipe) 78: raise "You must call #scan first" if !@apps 79: 80: watcher = PhusionPassenger::Utils::FileSystemWatcher.new(@watchlist, termination_pipe) 81: if wait_on_io(termination_pipe, 3) 82: return 83: end 84: 85: while true 86: changed = watcher.wait_for_change 87: watcher.close 88: if changed 89: old_apps = @apps 90: # The change could be caused by a write to some passenger.conf file. 91: # Wait for a short period so that the write has a chance to finish. 92: if wait_on_io(termination_pipe, 0.25) 93: return 94: end 95: 96: new_apps = scan 97: watcher = PhusionPassenger::Utils::FileSystemWatcher.new(@watchlist, termination_pipe) 98: if old_apps != new_apps 99: yield(new_apps) 100: end 101: 102: # Don't process change events again for a short while, 103: # but do detect changes while waiting. 104: if wait_on_io(termination_pipe, 3) 105: return 106: end 107: else 108: return 109: end 110: end 111: ensure 112: watcher.close if watcher 113: end
# File lib/phusion_passenger/standalone/app_finder.rb, line 44 44: def scan 45: apps = [] 46: watchlist = [] 47: 48: app_root = find_app_root 49: apps << { 50: :server_names => ["_"], 51: :root => app_root 52: } 53: watchlist << app_root 54: watchlist << "#{app_root}/config" if File.exist?("#{app_root}/config") 55: watchlist << "#{app_root}/passenger.conf" if File.exist?("#{app_root}/passenger.conf") 56: 57: apps.sort! do |a, b| 58: a[:root] <=> b[:root] 59: end 60: apps.map! do |app| 61: config_filename = File.join(app[:root], "passenger.conf") 62: if File.exist?(config_filename) 63: local_options = load_config_file(:local_config, config_filename) 64: merged_options = @options.merge(app) 65: merged_options.merge!(local_options) 66: merged_options 67: else 68: @options.merge(app) 69: end 70: end 71: 72: @apps = apps 73: @watchlist = watchlist 74: return apps 75: end