Skip to content

Instantly share code, notes, and snippets.

@canton7
Created April 20, 2012 17:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save canton7/2430321 to your computer and use it in GitHub Desktop.
Save canton7/2430321 to your computer and use it in GitHub Desktop.
Rack MultiLoader
class MultiLoader
def initialize(input)
@input = input
initial_map
end
def initial_map
@map = {}
@input.each do |host, opts|
if opts.is_a?(String)
reload_file = File.join(File.dirname(opts), 'restart.txt')
if opts.end_with?('.ru')
rackup_file = opts
else
rackup_file = File.join(opts, 'config.ru')
end
else
dir = opts[:dir] || '.'
rackup_file, reload_file = File.join(dir, opts[:rackup] || 'config.ru'), File.join(dir, opts[:reload] || 'restart.txt')
end
@map[host] = {:rackup => rackup_file, :reload => reload_file}
reload(host)
end
end
def reload(host)
@map[host][:inst] = Object.new.instance_eval("Rack::Builder.new {( " + File.read(@map[host][:rackup]) + "\n )}")
@map[host][:last_start] = Time.now
end
def needs_reload?(host)
reload_file = @map[host][:reload]
return false unless reload_file && File.exist?(reload_file)
File.mtime(reload_file) > @map[host][:last_start]
end
def call(env)
server_name = env['SERVER_NAME']
raise "No configured map for domain #{server_name}" unless @map.has_key?(server_name)
if needs_reload?(server_name)
puts "RELOADING #{server_name}"
reload(server_name)
end
@map[server_name][:inst].call(env)
end
end
run MultiLoader.new \
"localhost" => 'app1',
"127.0.0.1" => 'app2.ru'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment