mongrel_config 0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README ADDED
@@ -0,0 +1,7 @@
1
+ = Mongrel Config Plugin
2
+
3
+ This plugin uses the Camping micro-framework to implement a
4
+ simple config tool for any Mongrel Rails application.
5
+ Doesn't do too much right now but will be a littl more
6
+ advanced later.
7
+
data/Rakefile ADDED
@@ -0,0 +1,40 @@
1
+ require 'rake'
2
+ require 'rake/testtask'
3
+ require 'rake/clean'
4
+ require 'rake/gempackagetask'
5
+ require 'rake/rdoctask'
6
+ require 'tools/rakehelp'
7
+ require 'fileutils'
8
+ include FileUtils
9
+
10
+ setup_tests
11
+ setup_clean ["pkg", "lib/*.bundle", "*.gem", ".config"]
12
+
13
+ setup_rdoc ['README', 'LICENSE', 'COPYING', 'lib/**/*.rb', 'doc/**/*.rdoc']
14
+
15
+ desc "Does a full compile, test run"
16
+ task :default => [:test, :package]
17
+
18
+ version="0.2"
19
+ name="mongrel_config"
20
+
21
+ setup_gem(name, version) do |spec|
22
+ spec.summary = "Mongrel plugin that gives you web based config tool using Camping"
23
+ spec.description = spec.summary
24
+ spec.test_file = "test/test_config.rb"
25
+ spec.author="Zed A. Shaw"
26
+ spec.add_dependency('mongrel', '>= 0.3.10')
27
+ spec.add_dependency('gem_plugin', '>= 0.1')
28
+ spec.add_dependency('camping', '>= 1.3')
29
+ spec.files += Dir.glob("resources/**/*")
30
+ end
31
+
32
+
33
+ task :install => [:test, :package] do
34
+ sh %{sudo gem install pkg/#{name}-#{version}.gem}
35
+ end
36
+
37
+ task :uninstall => [:clean] do
38
+ sh %{sudo gem uninstall #{name}}
39
+ end
40
+
@@ -0,0 +1,159 @@
1
+ require 'erb'
2
+ require 'camping'
3
+ require 'mongrel/camping'
4
+
5
+
6
+ Camping.goes :Configure
7
+
8
+ module Configure::Controllers
9
+ class Index < R '/'
10
+ def get
11
+ render :show
12
+ end
13
+ end
14
+
15
+ class Start < R '/start'
16
+ def get
17
+ render :start
18
+ end
19
+
20
+ def post
21
+ @results = `mongrel_rails start -d -p #{input.port} -e #{input.env} -n #{input.num_procs} -a #{input.address}`
22
+ render :start_done
23
+ end
24
+ end
25
+
26
+ class Kill < R '/kill/(\w+)'
27
+
28
+ def get(signal)
29
+ if _running?
30
+ @signal = signal.upcase
31
+ pid = open($PID_FILE) {|f| f.read }
32
+ begin
33
+ Process.kill(@signal, pid.to_i)
34
+ @results = "Mongrel sent PID #{pid} signal #{@signal}."
35
+ rescue
36
+ puts "ERROR: #$!"
37
+ @results = "Failed to signal the Mongrel process. Maybe it is not running?<p>#$!</p>"
38
+ end
39
+ else
40
+ @results = "Mongrel does not seem to be running. Maybe delete the pid file #{$PID_FILE} or start again."
41
+ end
42
+
43
+ render :kill
44
+ end
45
+ end
46
+
47
+
48
+ class Stop < R '/stop'
49
+ def get
50
+ render :stop
51
+ end
52
+ end
53
+
54
+ class Logs < R '/logs'
55
+ def get
56
+ @log_files = Dir.glob("log/**/*")
57
+ render :logs
58
+ end
59
+ end
60
+
61
+ end
62
+
63
+
64
+ module Configure::Views
65
+ def layout
66
+ body_content = yield
67
+ currently_running = _running?
68
+ pid = _pid
69
+ open(GemPlugin::Manager.instance.resource("mongrel_config", "/index.html")) do |f|
70
+ template = ERB.new(f.read)
71
+ self << template.result(binding)
72
+ end
73
+ end
74
+
75
+ def show
76
+ div do
77
+ h2 { "Status" }
78
+ if _running?
79
+ p { "Currently running with PID #{_pid}." }
80
+ else
81
+ p { "Mongrel is not running." }
82
+ end
83
+ end
84
+ end
85
+
86
+ def start
87
+ div do
88
+ form :action => "/start", :method => "POST" do
89
+ p { span { "Port:" }; input :name => "port", :value => "4000" }
90
+ p { span { "Environment:" }; input :name => "env", :value => "development" }
91
+ p { span { "Address:" }; input :name => "address", :value => "0.0.0.0" }
92
+ p { span { "Number Processors:" }; input :name => "num_procs", :value => "20" }
93
+ input :type => "submit", :value => "START"
94
+ end
95
+ end
96
+ end
97
+
98
+ def start_done
99
+ div do
100
+ p { @results }
101
+ end
102
+ end
103
+
104
+ def kill
105
+ div do
106
+ p { @results }
107
+
108
+ case @signal
109
+ when "HUP":
110
+ p { "A reload (HUP) does not stop the process, but may not be complete." }
111
+ when "TERM":
112
+ p { "Stopped with TERM signal. The process should exit shortly, but only after processing pending requests." }
113
+ when "USR2":
114
+ p { "Complete restart (USR2) may take a little while. Check status in a few seconds or read logs." }
115
+ when "KILL":
116
+ p { "Process was violently stopped (KILL) so pending requests will be lost." }
117
+ end
118
+ end
119
+ end
120
+
121
+ def stop
122
+ if _running?
123
+ ul do
124
+ li { a "Stop (TERM)", :href => "/kill/term" }
125
+ li { a "Reload (HUP)", :href => "/kill/hup" }
126
+ li { a "Restart (USR2)", :href => "/kill/usr2" }
127
+ li { a "Kill (KILL)", :href => "/kill/kill" }
128
+ end
129
+ else
130
+ p { "Mongrel does not appear to be running (no PID file at #$PID_FILE)." }
131
+ end
132
+ end
133
+
134
+ def logs
135
+ div do
136
+ h2 { "Logs" }
137
+ table do
138
+ tr do
139
+ th { "File"}; th { "Bytes" }; th { "Last Modified" }
140
+ end
141
+ @log_files.each do |file|
142
+ tr do
143
+ td { a file, :href => "../#{file}" }
144
+ td { File.size file }
145
+ td { File.mtime file }
146
+ end
147
+ end
148
+ end
149
+ end
150
+ end
151
+
152
+ def _running?
153
+ File.exist? $PID_FILE
154
+ end
155
+
156
+ def _pid
157
+ open($PID_FILE) {|f| f.read } if _running?
158
+ end
159
+ end
@@ -0,0 +1,156 @@
1
+ require 'erb'
2
+
3
+ Camping.goes :Configure
4
+
5
+ module Configure::Controllers
6
+ class Index < R '/'
7
+ def get
8
+ render :show
9
+ end
10
+ end
11
+
12
+ class Start < R '/start'
13
+ def get
14
+ render :start
15
+ end
16
+
17
+ def post
18
+ @results = `mongrel_rails start -d -p #{input.port} -e #{input.env} -n #{input.num_procs} -a #{input.address}`
19
+ render :start_done
20
+ end
21
+ end
22
+
23
+ class Kill < R '/kill/(\w+)'
24
+
25
+ def get(signal)
26
+ if _running?
27
+ @signal = signal.upcase
28
+ pid = open($PID_FILE) {|f| f.read }
29
+ begin
30
+ Process.kill(@signal, pid.to_i)
31
+ @results = "Mongrel sent PID #{pid} signal #{@signal}."
32
+ rescue
33
+ puts "ERROR: #$!"
34
+ @results = "Failed to signal the Mongrel process. Maybe it is not running?<p>#$!</p>"
35
+ end
36
+ else
37
+ @results = "Mongrel does not seem to be running. Maybe delete the pid file #{$PID_FILE} or start again."
38
+ end
39
+
40
+ render :kill
41
+ end
42
+ end
43
+
44
+
45
+ class Stop < R '/stop'
46
+ def get
47
+ render :stop
48
+ end
49
+ end
50
+
51
+ class Logs < R '/logs'
52
+ def get
53
+ @log_files = Dir.glob("log/**/*")
54
+ render :logs
55
+ end
56
+ end
57
+
58
+ end
59
+
60
+
61
+ module Configure::Views
62
+ def layout
63
+ body_content = yield
64
+ currently_running = _running?
65
+ pid = _pid
66
+ open(GemPlugin::Manager.instance.resource("mongrel_config", "/index.html")) do |f|
67
+ template = ERB.new(f.read)
68
+ self << template.result(binding)
69
+ end
70
+ end
71
+
72
+ def show
73
+ div do
74
+ h2 { "Status" }
75
+ if _running?
76
+ p { "Currently running with PID #{_pid}." }
77
+ else
78
+ p { "Mongrel is not running." }
79
+ end
80
+ end
81
+ end
82
+
83
+ def start
84
+ div do
85
+ form :action => "/start", :method => "POST" do
86
+ p { span { "Port:" }; input :name => "port", :value => "4000" }
87
+ p { span { "Environment:" }; input :name => "env", :value => "development" }
88
+ p { span { "Address:" }; input :name => "address", :value => "0.0.0.0" }
89
+ p { span { "Number Processors:" }; input :name => "num_procs", :value => "20" }
90
+ input :type => "submit", :value => "START"
91
+ end
92
+ end
93
+ end
94
+
95
+ def start_done
96
+ div do
97
+ p { @results }
98
+ end
99
+ end
100
+
101
+ def kill
102
+ div do
103
+ p { @results }
104
+
105
+ case @signal
106
+ when "HUP":
107
+ p { "A reload (HUP) does not stop the process, but may not be complete." }
108
+ when "TERM":
109
+ p { "Stopped with TERM signal. The process should exit shortly, but only after processing pending requests." }
110
+ when "USR2":
111
+ p { "Complete restart (USR2) may take a little while. Check status in a few seconds or read logs." }
112
+ when "KILL":
113
+ p { "Process was violently stopped (KILL) so pending requests will be lost." }
114
+ end
115
+ end
116
+ end
117
+
118
+ def stop
119
+ if _running?
120
+ ul do
121
+ li { a "Stop (TERM)", :href => "/kill/term" }
122
+ li { a "Reload (HUP)", :href => "/kill/hup" }
123
+ li { a "Restart (USR2)", :href => "/kill/usr2" }
124
+ li { a "Kill (KILL)", :href => "/kill/kill" }
125
+ end
126
+ else
127
+ p { "Mongrel does not appear to be running (no PID file at #$PID_FILE)." }
128
+ end
129
+ end
130
+
131
+ def logs
132
+ div do
133
+ h2 { "Logs" }
134
+ table do
135
+ tr do
136
+ th { "File"}; th { "Bytes" }; th { "Last Modified" }
137
+ end
138
+ @log_files.each do |file|
139
+ tr do
140
+ td { a file, :href => "../#{file}" }
141
+ td { File.size file }
142
+ td { File.mtime file }
143
+ end
144
+ end
145
+ end
146
+ end
147
+ end
148
+
149
+ def _running?
150
+ File.exist? $PID_FILE
151
+ end
152
+
153
+ def _pid
154
+ open($PID_FILE) {|f| f.read } if _running?
155
+ end
156
+ end
@@ -0,0 +1,58 @@
1
+ require 'gem_plugin'
2
+ require 'mongrel'
3
+
4
+
5
+ class ConfigTool < GemPlugin::Plugin "/commands"
6
+ include Mongrel::Command::Base
7
+
8
+ def configure
9
+ options [
10
+ ['-c', '--chdir PATH', "Change to dir before starting (will be expanded)", :@cwd, Dir.pwd],
11
+ ['-P', '--pid FILE', "Where to write the PID", :@pid_file, "log/mongrel.pid"],
12
+ ['-h', '--host ADDR', "Host to bind to for server", :@host, "0.0.0.0"],
13
+ ['-p', '--port NUMBER', "Port to bind to", :@port, "3001"],
14
+ ['-u', '--uri URI', "Where to put your config tool", :@uri, "/config"]
15
+ ]
16
+ end
17
+
18
+ def validate
19
+ valid?(@uri, "Must give a uri")
20
+ valid?(@port && @port.to_i > 0, "Must give a valid port")
21
+ valid?(@host, "Host IP to bind must be given")
22
+
23
+ valid_dir? @cwd, "Cannot change to a directory that doesn't exist"
24
+ Dir.chdir @cwd
25
+ valid_dir? "log", "Log directory does not exist"
26
+
27
+ return @valid
28
+ end
29
+
30
+
31
+ def run
32
+ # must require this here since rails and camping don't like eachother
33
+ require 'mongrel_config/app'
34
+
35
+ resources = GemPlugin::Manager.instance.resource "mongrel_config", "/"
36
+ $PID_FILE = @pid_file
37
+
38
+ $server = Mongrel::Camping::start(@host,@port,@uri,Configure)
39
+
40
+ puts "** Configure is running at http://#{@host}:#{@port}#{@uri}"
41
+ if RUBY_PLATFORM !~ /mswin/
42
+ trap("INT") {
43
+ $server.stop
44
+ }
45
+ puts "Use CTRL-C to quit."
46
+ else
47
+ puts "Use CTRL-Pause/Break to quit."
48
+ end
49
+
50
+ # add our log directory
51
+ $server.register("/log", Mongrel::DirHandler.new("log"))
52
+ $server.register("/config/resources", Mongrel::DirHandler.new(resources))
53
+
54
+ $server.acceptor.join
55
+ end
56
+ end
57
+
58
+
@@ -0,0 +1,2 @@
1
+ ---
2
+ :debug: false
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,71 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2
+ <html>
3
+ <head>
4
+ <title>Mongrel Config Tool</title>
5
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
6
+ <link href="/config/resources/style.css" rel="stylesheet" type="text/css" />
7
+ </head>
8
+ <body>
9
+ <div id="container">
10
+ <div id="top">
11
+ <div id="title">Mongrel Config Tool</div>
12
+ </div>
13
+ <div id="middle">
14
+ <div id="nav">
15
+ <ul>
16
+ <li><a href="/config">Status</a></li>
17
+ <li><a href="/config/start">Start</a></li>
18
+ <li><a href="/config/stop">Stop</a></li>
19
+ <li><a href="/config/logs">Logs</a></li>
20
+ </ul>
21
+ </div>
22
+ <div id="content">
23
+ <div id="side">
24
+ <% if currently_running %>
25
+ <strong>Status</strong> <br />
26
+ <br />
27
+ Mongrel is running with PID <%= pid %>.
28
+ <% else %>
29
+ <strong>Status</strong> <br />
30
+ <br />
31
+ Mongrel is not running.
32
+ <% end %>
33
+ <br /><br />
34
+ <br />
35
+ <strong>Documentation</strong><br />
36
+ <br />
37
+ <a href="http://mongrel.rubyforge.org">Mongrel Home</a> <br />
38
+ <br />
39
+
40
+ <a href="http://mongrel.rubyforge.org/news.html">News</a><br />
41
+ <br />
42
+
43
+ <a href="http://mongrel.rubyforge.org/docs/started.html">Getting Started</a> <br />
44
+ <br />
45
+
46
+ <a href="http://mongrel.rubyforge.org/docs/win32.html">Win32 Guide</a><br />
47
+ <br />
48
+
49
+ <a href="http://mongrel.rubyforge.org/docs/lighttpd.html">Lighttpd Guide</a><br />
50
+ <br />
51
+
52
+ <a href="http://mongrel.rubyforge.org/rdoc/index.html">Mongrel API</a><br />
53
+ <br />
54
+
55
+ <a href="http://api.rubyonrails.org/">Ruby On Rails API</a><br />
56
+ <br />
57
+
58
+ <br /><br />
59
+ </div>
60
+
61
+ <%= body_content %>
62
+
63
+ </div>
64
+ </div>
65
+ </div>
66
+
67
+ <div id="bottom">&nbsp;</div>
68
+
69
+ <div id="footertext">Copyright 2006 &copy; Zed A. Shaw &nbsp; | &nbsp; Design by Kenneth Barbour.</div>
70
+ </body>
71
+ </html>