diff options
author | luislavena <luislavena@19e92222-5c0b-0410-8929-a290d50e31e9> | 2006-02-23 01:16:51 +0000 |
---|---|---|
committer | luislavena <luislavena@19e92222-5c0b-0410-8929-a290d50e31e9> | 2006-02-23 01:16:51 +0000 |
commit | 3cbe8df054903effa65ff23bb2e2d99d1e32efc5 (patch) | |
tree | 4e9f43c8e4a9fa5370829c987a81cedb02366e51 /bin | |
parent | 4d72d0fc62ea71880fc0ede0ee1f894178643361 (diff) | |
download | unicorn-3cbe8df054903effa65ff23bb2e2d99d1e32efc5.tar.gz |
git-svn-id: svn+ssh://rubyforge.org/var/svn/mongrel/trunk@59 19e92222-5c0b-0410-8929-a290d50e31e9
Diffstat (limited to 'bin')
-rw-r--r-- | bin/mongrel_rails_svc | 159 |
1 files changed, 119 insertions, 40 deletions
diff --git a/bin/mongrel_rails_svc b/bin/mongrel_rails_svc index 0b270c9..53ec17b 100644 --- a/bin/mongrel_rails_svc +++ b/bin/mongrel_rails_svc @@ -11,14 +11,9 @@ require 'optparse' require 'win32/service'
DEBUG_LOG_FILE = File.expand_path(File.dirname(__FILE__) + '/debug.log')
-#STDERR.reopen(DEBUG_LOG_FILE)
-
-# There are need for SimpleHandler
-require 'yaml'
-require 'zlib'
+DEBUG_THREAD_LOG_FILE = File.expand_path(File.dirname(__FILE__) + '/debug_thread.log')
class RailsHandler < Mongrel::HttpHandler
-
def initialize(dir, mime_map = {})
@files = Mongrel::DirHandler.new(dir,false)
@guard = Mutex.new
@@ -53,26 +48,12 @@ class RailsHandler < Mongrel::HttpHandler end
-class SimpleHandler < Mongrel::HttpHandler
- def process(request, response)
- response.start do |head,out|
- head["Content-Type"] = "text/html"
- results = "<html><body>Your request:<br /><pre>#{request.params.to_yaml}</pre><a href=\"/files\">View the files.</a></body></html>"
- if request.params["HTTP_ACCEPT_ENCODING"] == "gzip,deflate"
- head["Content-Encoding"] = "deflate"
- # send it back deflated
- out << Zlib::Deflate.deflate(results)
- else
- # no gzip supported, send it back normal
- out << results
- end
- end
- end
-end
-
-class RailsDaemon < Win32::Daemon
+# This class encapsulate the handler registering, http_server and working thread
+# Is standalone, so using MongrelRails in your app get everything runnig
+# (in case you don't want use mongrel_rails script)
+class MongrelRails
def initialize(ip, port, rails_root, docroot, environment, mime_map, num_procs, timeout)
- File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - daemon_initialize entered") }
+ File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - mongrelrails_initialize entered") }
@ip = ip
@port = port
@@ -83,9 +64,22 @@ class RailsDaemon < Win32::Daemon @num_procs = num_procs
@timeout = timeout
- File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - daemon_initialize left") }
+ File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - mongrelrails_initialize left") }
end
+
+ def configure
+ File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - mongrelrails_configure entered") }
+ @rails = configure_rails
+ #@rails = SimpleHandler.new
+
+ # start up mongrel with the right configurations
+ @server = Mongrel::HttpServer.new(@ip, @port, @num_procs.to_i, @timeout.to_i)
+ @server.register("/", @rails)
+
+ File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - mongrelrails_configure left") }
+ end
+
def load_mime_map
File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - load_mime_map entered") }
@@ -121,15 +115,54 @@ class RailsDaemon < Win32::Daemon return rails
end
+ def start_serve
+ File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - start_serve entered") }
+
+ @runner = Thread.new do
+ File.open(DEBUG_THREAD_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - runner_thread suspended") }
+ Thread.stop
+
+ File.open(DEBUG_THREAD_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - runner_thread resumed") }
+ File.open(DEBUG_THREAD_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - runner_thread acceptor.join") }
+ @server.acceptor.join
+ end
+
+ File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - server.run") }
+ @server.run
+
+ File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - runner.run") }
+ @runner.run
+
+ File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - start_serve left") }
+ end
+
+ def stop_serve
+ File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - stop_serve entered") }
+
+ if @runner.alive?
+ File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - killing thread") }
+ @runner.kill
+ end
+
+ @server.stop
+
+ File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - stop_serve left") }
+ end
+end
+
+class RailsDaemon < Win32::Daemon
+ def initialize(rails)
+ File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - daemon_initialize entered") }
+
+ @rails = rails
+
+ File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - daemon_initialize left") }
+ end
+
def service_init
File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - service_init entered") }
- @rails = configure_rails
- #@rails = SimpleHandler.new
-
- # start up mongrel with the right configurations
- @server = Mongrel::HttpServer.new(@ip, @port, @num_procs.to_i, @timeout.to_i)
- @server.register("/", @rails)
+ @rails.configure
File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - service_init left") }
end
@@ -137,23 +170,24 @@ class RailsDaemon < Win32::Daemon def service_main
File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - service_main entered") }
- File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - server.run") }
- @server.run
+ File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - rails.start_serve") }
+ @rails.start_serve
File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - while RUNNING") }
while state == RUNNING
sleep 1
end
+ File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - state !RUNNING") }
+ File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - rails.stop_serve") }
+ @rails.stop_serve
+
File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - service_main left") }
end
def service_stop
File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - service_stop entered") }
-
- #File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - server.stop") }
- #@server.stop
-
+
File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - service_stop left") }
end
end
@@ -187,8 +221,53 @@ if ARGV[0] == 'service' OPTIONS[:docroot] = File.expand_path(OPTIONS[:rails_root] + '/public')
- rails_svc = RailsDaemon.new(OPTIONS[:ip], OPTIONS[:port], OPTIONS[:rails_root], OPTIONS[:docroot], OPTIONS[:environment], OPTIONS[:mime_map], OPTIONS[:num_procs].to_i, OPTIONS[:timeout].to_i)
+ rails = MongrelRails.new(OPTIONS[:ip], OPTIONS[:port], OPTIONS[:rails_root], OPTIONS[:docroot], OPTIONS[:environment], OPTIONS[:mime_map], OPTIONS[:num_procs].to_i, OPTIONS[:timeout].to_i)
+ rails_svc = RailsDaemon.new(rails)
rails_svc.mainloop
-end
+elsif ARGV[0] == 'debug'
+ ARGV.shift
+
+ # default options
+ OPTIONS = {
+ :rails_root => Dir.pwd,
+ :environment => 'production',
+ :ip => '0.0.0.0',
+ :port => 3000,
+ :mime_map => nil,
+ :num_procs => 20,
+ :timeout => 120
+ }
+
+ ARGV.options do |opts|
+ opts.on('-r', '--root PATH', "Set the root path where your rails app resides.") { |OPTIONS[:rails_root]| }
+ opts.on('-e', '--environment ENV', "Rails environment to run as.") { |OPTIONS[:environment]| }
+ opts.on('-b', '--binding ADDR', "Address to bind to") { |OPTIONS[:ip]| }
+ opts.on('-p', '--port PORT', "Which port to bind to") { |OPTIONS[:port]| }
+ opts.on('-m', '--mime PATH', "A YAML file that lists additional MIME types") { |OPTIONS[:mime_map]| }
+ opts.on('-P', '--num-procs INT', "Number of processor threads to use") { |OPTIONS[:num_procs]| }
+ opts.on('-t', '--timeout SECONDS', "Timeout all requests after SECONDS time") { |OPTIONS[:timeout]| }
+
+ opts.parse!
+ end
+
+ #expand RAILS_ROOT
+ OPTIONS[:rails_root] = File.expand_path(OPTIONS[:rails_root])
+
+ OPTIONS[:docroot] = File.expand_path(OPTIONS[:rails_root] + '/public')
+ rails = MongrelRails.new(OPTIONS[:ip], OPTIONS[:port], OPTIONS[:rails_root], OPTIONS[:docroot], OPTIONS[:environment], OPTIONS[:mime_map], OPTIONS[:num_procs].to_i, OPTIONS[:timeout].to_i)
+ rails.configure
+ rails.start_serve
+ begin
+ sleep
+ rescue Interrupt
+ puts "graceful shutdown?"
+ end
+
+ begin
+ rails.stop_serve
+ rescue
+ end
+
+end
|