Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/local/bin/ruby
- require 'rubygems'
- require 'merb'
- require 'optparse'
- require 'ostruct'
- require 'fileutils'
- module Merb
- end
- class Merb::Config
- def self.setup
- defaults = {
- :host => "0.0.0.0",
- :port => "4000",
- :allow_reloading => true,
- :merb_root => Dir.pwd
- }
- begin
- options = defaults.merge(YAML.load(ERB.new(IO.read("#{defaults[:merb_root]}/dist/conf/merb.yml")).result))
- rescue
- options = defaults
- end
- options
- end
- end
- class Merb::Server
- def self.merb_config
- options = Merb::Config.setup
- opts = OptionParser.new do |opts|
- opts.on("-f", "--config-file [String]") do |config|
- options[:config] = config
- end
- opts.on("-d", "--daemonize [String]") do |config|
- options[:daemonize] = true
- end
- opts.on("-c", "--cluster-nodes [String]") do |nodes|
- options[:cluster] = nodes
- end
- opts.on("-p", "--port [Integer]") do |port|
- options[:port] = port
- end
- opts.on("-n", "--num-procs [Integer]") do |numprocs|
- options[:numprocs] = numprocs
- end
- opts.on("-h", "--host [String]") do |host|
- options[:host] = host
- end
- opts.on("-m", "--merb-root [String]") do |merb_root|
- options[:merb_root] = File.expand_path(merb_root)
- end
- opts.on("-i", "--irb-console [String]") do |console|
- options[:console] = true
- end
- end
- opts.parse!(@@merb_raw_opts)
- @@merb_opts = options
- puts %{Merb started with these options:}
- puts @@merb_opts.to_yaml; puts
- end
- def self.run
- @@merb_raw_opts = ARGV
- merb_config
- @@merb_opts[:dist_root] = @@merb_opts[:merb_root]+'/dist'
- $LOAD_PATH.unshift( File.join(@@merb_opts[:merb_root] , '/dist/app/controllers') )
- $LOAD_PATH.unshift( File.join(@@merb_opts[:merb_root] , '/dist/lib') )
- require @@merb_opts[:merb_root]+'/dist/conf/router.rb'
- require @@merb_opts[:merb_root]+'/dist/conf/merb_init.rb'
- if @@merb_opts[:console]
- ARGV.clear # Avoid passing args to IRB
- require 'irb'
- require 'irb/completion'
- def exit
- exit!
- end
- if File.exists? ".irbrc"
- ENV['IRBRC'] = ".irbrc"
- end
- IRB.start
- exit!
- end
- if @@merb_opts[:cluster]
- delete_pidfile
- @@merb_opts[:port].to_i.upto(@@merb_opts[:port].to_i+@@merb_opts[:cluster].to_i-1) do |port|
- puts "Starting merb server on port: #{port}"
- start(port)
- end
- elsif @@merb_opts[:daemonize]
- delete_pidfile
- start(@@merb_opts[:port])
- else
- trap('INT') {exit}
- mongrel_start(@@merb_opts[:port])
- end
- end
- def self.store_pid(pid)
- File.open("#{@@merb_opts[:merb_root]}/log/merb.pid", 'a'){|f| f.write("#{Process.pid}\n")}
- end
- def self.start(port)
- fork do
- Process.setsid
- exit if fork
- store_pid(Process.pid)
- Dir.chdir @@merb_opts[:merb_root]
- File.umask 0000
- STDIN.reopen "/dev/null"
- STDOUT.reopen "/dev/null", "a"
- STDERR.reopen STDOUT
- trap("TERM") { exit }
- mongrel_start(port)
- end
- end
- def self.delete_pidfile
- FileUtils.rm("#{@@merb_opts[:merb_root]}/log/merb.pid") rescue nil
- end
- def self.start_cluster(ports)
- delete_pidfile
- ports.each do |p|
- start(port)
- end
- end
- def self.mongrel_start(port)
- h = Mongrel::HttpServer.new((@@merb_opts[:host]||"0.0.0.0"), (port ||4000), (@@merb_opts[:numprocs]||100))
- h.register("/", MerbHandler.new(@@merb_opts[:dist_root]+'/public'))
- h.register("/favicon.ico", Mongrel::Error404Handler.new(""))
- h.run.join
- end
- def self.config
- @@merb_opts
- end
- end
- Merb::Server.run
Add Comment
Please, Sign In to add comment