mongrel_config 0.2

Sign up to get free protection for your applications and to get access to all the features.
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>