about summary refs log tree commit homepage
path: root/projects/mongrel_config/lib/mongrel_config/win32_app.rb
diff options
context:
space:
mode:
Diffstat (limited to 'projects/mongrel_config/lib/mongrel_config/win32_app.rb')
-rw-r--r--projects/mongrel_config/lib/mongrel_config/win32_app.rb251
1 files changed, 251 insertions, 0 deletions
diff --git a/projects/mongrel_config/lib/mongrel_config/win32_app.rb b/projects/mongrel_config/lib/mongrel_config/win32_app.rb
new file mode 100644
index 0000000..592ee47
--- /dev/null
+++ b/projects/mongrel_config/lib/mongrel_config/win32_app.rb
@@ -0,0 +1,251 @@
+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
+          selv << $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
+
+
+
+
+
+
+