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/COPYING +504 -0
- data/LICENSE +504 -0
- data/README +7 -0
- data/Rakefile +40 -0
- data/lib/mongrel_config/app.rb +159 -0
- data/lib/mongrel_config/app.rb~ +156 -0
- data/lib/mongrel_config/init.rb +58 -0
- data/resources/defaults.yaml +2 -0
- data/resources/images/0170_bubble.png +0 -0
- data/resources/images/0171_new_page.png +0 -0
- data/resources/images/bottom.gif +0 -0
- data/resources/images/bottom_orig.gif +0 -0
- data/resources/images/middle.jpg +0 -0
- data/resources/images/top.jpg +0 -0
- data/resources/images/topbar.jpg +0 -0
- data/resources/index.html +71 -0
- data/resources/style.css +165 -0
- data/test/test_config.rb +7 -0
- data/tools/rakehelp.rb +105 -0
- metadata +91 -0
data/README
ADDED
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
|
+
|
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"> </div>
|
68
|
+
|
69
|
+
<div id="footertext">Copyright 2006 © Zed A. Shaw | Design by Kenneth Barbour.</div>
|
70
|
+
</body>
|
71
|
+
</html>
|