diff options
Diffstat (limited to 'projects/mongrel_config/lib')
-rw-r--r-- | projects/mongrel_config/lib/mongrel_config/app.rb | 158 | ||||
-rw-r--r-- | projects/mongrel_config/lib/mongrel_config/init.rb | 75 | ||||
-rw-r--r-- | projects/mongrel_config/lib/mongrel_config/win32.rb | 85 | ||||
-rw-r--r-- | projects/mongrel_config/lib/mongrel_config/win32_app.rb | 251 |
4 files changed, 0 insertions, 569 deletions
diff --git a/projects/mongrel_config/lib/mongrel_config/app.rb b/projects/mongrel_config/lib/mongrel_config/app.rb deleted file mode 100644 index b1a182a..0000000 --- a/projects/mongrel_config/lib/mongrel_config/app.rb +++ /dev/null @@ -1,158 +0,0 @@ -require 'erb' -require 'camping' -require 'mongrel/camping' - - -Camping.goes :Configure - -module Configure::Controllers - class Index < R '/' - def get - render :show - end - end - - class Start < R '/start' - def get - render :start - end - - def post - @results = `mongrel_rails start -d -p #{input.port} -e #{input.env} -n #{input.num_procs} -a #{input.address}` - render :start_done - end - end - - class Kill < R '/kill/(\w+)' - - def get(signal) - if _running? - @signal = signal.upcase - pid = open($PID_FILE) {|f| f.read } - begin - Process.kill(@signal, pid.to_i) - @results = "Mongrel sent PID #{pid} signal #{@signal}." - rescue - puts "ERROR: #$!" - @results = "Failed to signal the Mongrel process. Maybe it is not running?<p>#$!</p>" - end - else - @results = "Mongrel does not seem to be running. Maybe delete the pid file #{$PID_FILE} or start again." - end - - render :kill - end - end - - - class Stop < R '/stop' - def get - render :stop - end - end - - class Logs < R '/logs' - def get - @log_files = Dir.glob("log/**/*") - render :logs - end - end - -end - - -module Configure::Views - def layout - body_content = yield - currently_running = _running? - pid = _pid - open(GemPlugin::Manager.instance.resource("mongrel_config", "/index.html")) do |f| - template = ERB.new(f.read) - template.result(binding) - end - end - - def show - div do - h2 { "Status" } - if _running? - p { "Currently running with PID #{_pid}." } - else - p { "Mongrel is not running." } - end - end - end - - def start - div do - form :action => "/start", :method => "POST" do - p { span { "Port:" }; input :name => "port", :value => "4000" } - p { span { "Environment:" }; input :name => "env", :value => "development" } - p { span { "Address:" }; input :name => "address", :value => "0.0.0.0" } - input :type => "submit", :value => "START" - end - end - end - - def start_done - div do - p { @results } - end - end - - def kill - div do - p { @results } - - case @signal - when "HUP": - p { "A reload (HUP) does not stop the process, but may not be complete." } - when "TERM": - p { "Stopped with TERM signal. The process should exit shortly, but only after processing pending requests." } - when "USR2": - p { "Complete restart (USR2) may take a little while. Check status in a few seconds or read logs." } - when "KILL": - p { "Process was violently stopped (KILL) so pending requests will be lost." } - end - end - end - - def stop - if _running? - ul do - li { a "Stop (TERM)", :href => "/kill/term" } - li { a "Reload (HUP)", :href => "/kill/hup" } - li { a "Restart (USR2)", :href => "/kill/usr2" } - li { a "Kill (KILL)", :href => "/kill/kill" } - end - else - p { "Mongrel does not appear to be running (no PID file at #$PID_FILE)." } - end - end - - def logs - div do - h2 { "Logs" } - table do - tr do - th { "File"}; th { "Bytes" }; th { "Last Modified" } - end - @log_files.each do |file| - tr do - td { a file, :href => "../#{file}" } - td { File.size file } - td { File.mtime file } - end - end - end - end - end - - def _running? - File.exist? $PID_FILE - end - - def _pid - open($PID_FILE) {|f| f.read } if _running? - end -end diff --git a/projects/mongrel_config/lib/mongrel_config/init.rb b/projects/mongrel_config/lib/mongrel_config/init.rb deleted file mode 100644 index 623ea03..0000000 --- a/projects/mongrel_config/lib/mongrel_config/init.rb +++ /dev/null @@ -1,75 +0,0 @@ -require 'rubygems' -require 'gem_plugin' -require 'mongrel' - - -class ConfigTool < GemPlugin::Plugin "/commands" - include Mongrel::Command::Base - - def configure - if RUBY_PLATFORM =~ /mswin/ - options [ - ['-h', '--host ADDR', "Host to bind to for server", :@host, "0.0.0.0"], - ['-p', '--port NUMBER', "Port to bind to", :@port, "3001"], - ['-u', '--uri URI', "Where to put your config tool", :@uri, "/config"], - ['-R', '--mongrel PATH', "Path to mongrel_rails_service", :@mongrel_script, "c:\\ruby\\bin\\mongrel_rails_service"] - ] - else - options [ - ['-c', '--chdir PATH', "Change to dir before starting (will be expanded)", :@cwd, Dir.pwd], - ['-P', '--pid FILE', "Where to write the PID", :@pid_file, "log/mongrel.pid"], - ['-h', '--host ADDR', "Host to bind to for server", :@host, "0.0.0.0"], - ['-p', '--port NUMBER', "Port to bind to", :@port, "3001"], - ['-u', '--uri URI', "Where to put your config tool", :@uri, "/config"] - ] - end - end - - def validate - valid?(@uri, "Must give a uri") - valid?(@port && @port.to_i > 0, "Must give a valid port") - valid?(@host, "Host IP to bind must be given") - - if RUBY_PLATFORM !~ /mswin/ - valid_dir? @cwd, "Cannot change to a directory that doesn't exist" - Dir.chdir @cwd - valid_dir? "log", "Log directory does not exist" - end - - return @valid - end - - - def run - # must require this here since rails and camping don't like eachother - if RUBY_PLATFORM =~ /mswin/ - require 'mongrel_config/win32_app' - $mongrel_rails_service = @mongrel_script - else - require 'mongrel_config/app' - end - - resources = GemPlugin::Manager.instance.resource "mongrel_config", "/" - $PID_FILE = @pid_file - - $server = Mongrel::Camping::start(@host,@port,@uri,Configure) - - puts "** Configure is running at http://#{@host}:#{@port}#{@uri}" - if RUBY_PLATFORM !~ /mswin/ - trap("INT") { - $server.stop - } - puts "Use CTRL-C to quit." - else - puts "Use CTRL-Pause/Break to quit." - end - - # add our log directory - $server.register("/log", Mongrel::DirHandler.new("log")) - $server.register("/config/resources", Mongrel::DirHandler.new(resources)) - - $server.acceptor.join - end -end - - diff --git a/projects/mongrel_config/lib/mongrel_config/win32.rb b/projects/mongrel_config/lib/mongrel_config/win32.rb deleted file mode 100644 index 4cdf605..0000000 --- a/projects/mongrel_config/lib/mongrel_config/win32.rb +++ /dev/null @@ -1,85 +0,0 @@ -require 'win32/service' - - -# Simply abstracts the common stuff that the config tool needs to do -# when dealing with Win32. It is a very thin wrapper which may expand -# later. -module W32Support - - # Lists all of the services that have "mongrel" in the binary_path_name - # of the service. This detects the mongrel services. - def W32Support.list - Win32::Service.services.select {|s| s.binary_path_name =~ /mongrel/ } - end - - # Just gets the display name of the service. - def W32Support.display(name) - Win32::Service.getdisplayname(name) - end - - # Performs one operations (like :start or :start) which need - # to be "monitored" until they're done. The wait_for parameter - # should be a regex for the content of the status like /running/ - # or /stopped/ - def W32Support.do_and_wait(service_name, operation, wait_for) - status = W32Support.status(service_name) - if status =~ wait_for - # already running call the block once and leave - yield status - else - # start trying to start it - Win32::Service.send(operation, service_name) - status = W32Support.status(service_name) - while status !~ wait_for - yield status - status = W32Support.status(service_name) - end - - # do one last yield so they know it started - yield status - end - end - - # Starts the requested service and calls a passed in block - # until the service is done. You should sleep for a short - # period until it's done or there's an exception. - def W32Support.start(service_name) - W32Support.do_and_wait(service_name, :start, /running/) do |status| - yield status - end - end - - - # Stops the service. Just like W32Support.start is will call - # a block while it checks for the service to actually stop. - def W32Support.stop(service_name) - W32Support.do_and_wait(service_name, :stop, /stopped/) do |status| - yield status - end - end - - - # Returns the current_state field of the service. - def W32Support.status(service_name) - Win32::Service.status(service_name).current_state - end - - - # Deletes the service from the system. It first tries to stop - # the service, and if you pass in a block it will call it while - # the service is being stopped. - def W32Support.delete(service_name) - begin - W32Support.stop(service_name) do |status| - yield status if block_given? - end - rescue - end - - begin - Win32::Service.delete(service_name) - rescue - end - end - -end diff --git a/projects/mongrel_config/lib/mongrel_config/win32_app.rb b/projects/mongrel_config/lib/mongrel_config/win32_app.rb deleted file mode 100644 index d4e15b2..0000000 --- a/projects/mongrel_config/lib/mongrel_config/win32_app.rb +++ /dev/null @@ -1,251 +0,0 @@ -require 'erb' -require 'camping' -require 'mongrel/camping' -require 'yaml' -require 'thread' - -Camping.goes :Configure - -require 'mongrel_config/win32' - -$service_group = ThreadGroup.new -$service_logs = "" - -module Configure - module Controllers - class Index < R '/' - def get - @services = W32Support.list - render :list - end - end - - class Info < R '/info/(\w+)' - def get(name) - @services = W32Support.list.select {|s| s.service_name == name } - render :info - end - end - - class Start < R '/start/(\w+)' - def get(service) - runner = Thread.new do - W32Support.start(service) do |status| - $service_logs << "Starting #{service}: #{status}\n" - sleep 1 - end - end - - $service_group.add(runner) - - redirect Index - end - end - - class Stop < R '/stop/(\w+)' - def get(service) - runner = Thread.new do - W32Support.stop(service) do |status| - $service_logs << "Starting #{service}: #{status}\n" - sleep 1 - end - end - - $service_group.add(runner) - redirect Index - end - end - - # eventually this will also let you see a particular service's logs - class Logs < R '/logs' - def get - render :service_logs - end - end - - class ClearLogs < R '/clear_logs' - def get - $service_logs = "" - $service_logs << "#{Time.now}: CLEARED" - - redirect Logs - end - end - - class Install < R '/install' - def get - render :install_form - end - - def post - options = [] - if bad?(input.service_name) or bad?(input.root) or bad?(input.environment) or bad?(input.address) or bad?(input.port) - @result = "ERROR: You must fill out all mandatory (*) fields." - render :install_result - else - options << ["-n", input.service_name] - options << ["-r", '"' + input.root + '"'] - options << ["-e", input.environment] - options << ["-b", input.address] - options << ["-p", input.port] - options << ["-d", input.display_name] if good? input.display_name - options << ["-m", '"' + input.mime + '"'] if good? input.mime - options << ["-P", input.num_procs] if good? input.num_procs - options << ["-t", input.timeout] if good? input.timeout - options << ["-c", input.cpu] if good? input.cpu - - begin - @result = `ruby #$mongrel_rails_service install #{options.join(' ')}` - $service_logs << @result - rescue - @result = "Failed to start #{input.service_name}: #$!" - $service_logs << @result - end - - render :install_result - end - end - - def good?(field) - field and not field.strip.empty? - end - - def bad?(field) - not good? field - end - end - - - class Delete < R '/delete/(\w+)' - def get(name) - W32Support.delete(name) - $service_logs << "Deleted #{name}\n" - redirect Index - end - end - end - - - module Views - def layout - links = [ - ["/config", "Status"], - ["/config/install", "Install"], - ["/config/logs", "Logs"] - ] - body_content = yield - currently_running = _running_procs - - open(GemPlugin::Manager.instance.resource("mongrel_config", "/index_win32.html")) do |f| - template = ERB.new(f.read) - self << template.result(binding) - end - end - - - def list - div :id=>"viewport" do - table do - tr { th { "Service"}; th { "Status"}; th { "Control" }; th { "Delete" } } - @services.each do |s| - status = W32Support.status(s.service_name) - tr { - td { a(s.service_name, :href => "/info/#{s.service_name}") } - td { status.capitalize } - td { - if status =~ /stopped/ - a("start",:href => "/start/#{s.service_name}") - elsif status =~ /running/ - a("stop",:href => "/stop/#{s.service_name}") - else - b { "in progress" } - end - } - td { - a("delete!",:href => "/delete/#{s.service_name}", - :onclick=>"return confirm('Delete #{s.service_name}?') == '1'") - } - } - end - end - end - end - - - def info - div :id=>"viewport" do - @services.each do |s| - - h2 { "#{s.service_name} service information" } - table do - tr { th {"Attribute"}; th {"Value"} } - - s.each_pair do |memb,obj| - name = memb.to_s.tr("_"," ").capitalize - tr { - td { b { "#{name}: " } } - td { obj.inspect } - } - end - end - end - end - end - - def service_logs - h2 { "Latest Service Activity Logs" } - a("[clear logs]", :href => "/clear_logs") - - div :id=>"viewport" do - pre :style=>"font-size: 10pt;" do - self << $service_logs - end - end - end - - def install_form - div do - h2 { "Install New Mongrel Service" } - p { "Items with an * are mandatory. Leave an item blank to not specify it." } - form :action=>"/install", :method=>"POST" do - b { "* Service Name: "}; input :name => "service_name"; br - b { "* Root: "}; input :name => "root"; br - b { "* Environment: "}; input :name => "environment", :value => "development"; br - b { "*Address: "}; input :name => "address", :value => "0.0.0.0"; br - b { "*Port: "}; input :name => "port", :value => "4000", :size => 6; br - b { "Display Name: "}; input :name => "display_name"; br - b { "MIME Map File: "}; input :name => "mime"; br - b { "Number Processor Threads: "}; input :name => "num_procs", :size => 3; br - b { "Request Timeout: "}; input :name => "timeout", :size => 3; br - b { "Assigned CPU: " }; input :name => "cpu", :size => 2; br - - p { input :type=>"submit", :value => "INSTALL" } - end - end - end - - - def install_result - div :id=>"viewport" do - h2 { "Install Results"} - pre do - self << @result - end - end - end - - def _running_procs - running = [] - W32Support.list.each {|s| running << s.service_name if s.current_state =~ /running/} - running - end - - end -end - - - - - - - |