about summary refs log tree commit homepage
path: root/bin
diff options
context:
space:
mode:
authorluislavena <luislavena@19e92222-5c0b-0410-8929-a290d50e31e9>2006-02-23 01:16:51 +0000
committerluislavena <luislavena@19e92222-5c0b-0410-8929-a290d50e31e9>2006-02-23 01:16:51 +0000
commit3cbe8df054903effa65ff23bb2e2d99d1e32efc5 (patch)
tree4e9f43c8e4a9fa5370829c987a81cedb02366e51 /bin
parent4d72d0fc62ea71880fc0ede0ee1f894178643361 (diff)
downloadunicorn-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_svc159
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