mongrel_cluster 0.2.1 → 1.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/Rakefile +4 -4
- data/bin/mongrel_cluster_ctl +8 -5
- data/lib/mongrel_cluster/init.rb +233 -75
- data/lib/mongrel_cluster/init.rb~ +351 -0
- data/lib/mongrel_cluster/recipes.rb +30 -6
- data/resources/mongrel_cluster +14 -4
- metadata +7 -5
data/Rakefile
CHANGED
@@ -15,15 +15,15 @@ setup_rdoc ['README', 'LICENSE', 'COPYING', 'lib/**/*.rb', 'doc/**/*.rdoc']
|
|
15
15
|
desc "Does a full compile, test run"
|
16
16
|
task :default => [:test, :package]
|
17
17
|
|
18
|
-
version="0.2
|
18
|
+
version="1.0.2"
|
19
19
|
name="mongrel_cluster"
|
20
20
|
|
21
21
|
setup_gem(name, version) do |spec|
|
22
22
|
spec.summary = "Mongrel plugin that provides commands and Capistrano tasks for managing multiple Mongrel processes."
|
23
23
|
spec.description = spec.summary
|
24
24
|
spec.author="Bradley Taylor"
|
25
|
-
spec.add_dependency('gem_plugin', '>= 0.2.
|
26
|
-
spec.add_dependency('mongrel', '>= 0.
|
25
|
+
spec.add_dependency('gem_plugin', '>= 0.2.2')
|
26
|
+
spec.add_dependency('mongrel', '>= 1.0.1')
|
27
27
|
spec.files += Dir.glob("resources/**/*")
|
28
28
|
spec.has_rdoc = false
|
29
29
|
spec.files += Dir.glob("bin/*")
|
@@ -49,6 +49,6 @@ task :gem_source do
|
|
49
49
|
rm_rf "pkg/#{name}-#{version}"
|
50
50
|
|
51
51
|
sh %{ generate_yaml_index.rb -d pkg }
|
52
|
-
sh %{ scp -r pkg/* #{ENV['SSH_USER']}@rubyforge.org:/var/www/gforge-projects/
|
52
|
+
sh %{ scp -r pkg/* #{ENV['SSH_USER']}@rubyforge.org:/var/www/gforge-projects/mongrel/releases/ }
|
53
53
|
end
|
54
54
|
|
data/bin/mongrel_cluster_ctl
CHANGED
@@ -8,11 +8,11 @@ def run(command, verbose)
|
|
8
8
|
confs = Dir.glob("*.yml")
|
9
9
|
confs += Dir.glob("*.conf")
|
10
10
|
confs.each do |conf|
|
11
|
-
cmd = "mongrel_rails cluster::#{command} -
|
11
|
+
cmd = "mongrel_rails cluster::#{command} -C #{conf}"
|
12
12
|
cmd += " -v" if verbose
|
13
|
-
puts cmd if verbose
|
13
|
+
puts cmd if verbose || command == "status"
|
14
14
|
output = `#{cmd}`
|
15
|
-
puts output if verbose
|
15
|
+
puts output if verbose || command == "status"
|
16
16
|
puts "mongrel_rails cluster::#{command} returned an error." unless $?.success?
|
17
17
|
end
|
18
18
|
end
|
@@ -23,7 +23,7 @@ end
|
|
23
23
|
@options[:verbose] = false
|
24
24
|
|
25
25
|
OptionParser.new do |opts|
|
26
|
-
opts.banner = "Usage: #{$0} (start|stop|restart) [options]"
|
26
|
+
opts.banner = "Usage: #{$0} (start|stop|restart|status) [options]"
|
27
27
|
|
28
28
|
opts.on("-c", "--conf_path PATH", "Path to mongrel_cluster configuration files") { |value| @options[:conf_path] = value }
|
29
29
|
opts.on('-v', '--verbose', "Print all called commands and output.") { |value| @options[:verbose] = value }
|
@@ -57,8 +57,11 @@ when "restart":
|
|
57
57
|
puts "Restarting all mongrel_clusters..."
|
58
58
|
run "stop", @options[:verbose]
|
59
59
|
run "start", @options[:verbose]
|
60
|
+
when "status":
|
61
|
+
puts "Checking all mongrel_clusters..."
|
62
|
+
run "status", @options[:verbose]
|
60
63
|
else
|
61
64
|
puts "Unknown command."
|
62
65
|
end
|
63
66
|
|
64
|
-
exit
|
67
|
+
exit
|
data/lib/mongrel_cluster/init.rb
CHANGED
@@ -3,91 +3,228 @@ require 'mongrel'
|
|
3
3
|
require 'yaml'
|
4
4
|
|
5
5
|
module Cluster
|
6
|
-
|
7
6
|
module ExecBase
|
8
|
-
|
9
|
-
|
10
|
-
def validate
|
11
|
-
valid_exists?(@config_file, "Configuration file does not exist. Run mongrel_rails cluster::configure.")
|
12
|
-
return @valid
|
13
|
-
end
|
7
|
+
include Mongrel::Command::Base
|
14
8
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
conf = YAML.load_file(@config_file)
|
23
|
-
@options.merge! conf if conf
|
24
|
-
end
|
9
|
+
STATUS_OK = 0
|
10
|
+
STATUS_ERROR = 2
|
11
|
+
|
12
|
+
def validate
|
13
|
+
valid_exists?(@config_file, "Configuration file does not exist. Run mongrel_rails cluster::configure.")
|
14
|
+
return @valid
|
15
|
+
end
|
25
16
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
17
|
+
def read_options
|
18
|
+
@options = {
|
19
|
+
"environment" => ENV['RAILS_ENV'] || "development",
|
20
|
+
"port" => 3000,
|
21
|
+
"pid_file" => "tmp/pids/mongrel.pid",
|
22
|
+
"log_file" => "log/mongrel.log",
|
23
|
+
"servers" => 2
|
24
|
+
}
|
25
|
+
conf = YAML.load_file(@config_file)
|
26
|
+
@options.merge! conf if conf
|
27
|
+
|
28
|
+
process_pid_file @options["pid_file"]
|
29
|
+
process_log_file @options["log_file"]
|
30
|
+
|
31
|
+
start_port = end_port = @only
|
32
|
+
start_port ||= @options["port"].to_i
|
33
|
+
end_port ||= start_port + @options["servers"] - 1
|
34
|
+
@ports = (start_port..end_port).to_a
|
35
|
+
end
|
36
|
+
|
37
|
+
def process_pid_file(pid_file)
|
38
|
+
@pid_file_ext = File.extname(pid_file)
|
39
|
+
@pid_file_base = File.basename(pid_file, @pid_file_ext)
|
40
|
+
@pid_file_dir = File.dirname(pid_file)
|
41
|
+
end
|
42
|
+
|
43
|
+
def process_log_file(log_file)
|
44
|
+
@log_file_ext = File.extname(log_file)
|
45
|
+
@log_file_base = File.basename(log_file, @log_file_ext)
|
46
|
+
@log_file_dir = File.dirname(log_file)
|
47
|
+
end
|
48
|
+
|
49
|
+
def port_pid_file(port)
|
50
|
+
pid_file = [@pid_file_base, port].join(".") + @pid_file_ext
|
51
|
+
File.join(@pid_file_dir, pid_file)
|
52
|
+
end
|
53
|
+
|
54
|
+
def port_log_file(port)
|
55
|
+
log_file = [@log_file_base, port].join(".") + @log_file_ext
|
56
|
+
File.join(@log_file_dir, log_file)
|
57
|
+
end
|
58
|
+
|
59
|
+
def start
|
60
|
+
read_options
|
61
|
+
|
62
|
+
argv = [ "mongrel_rails" ]
|
63
|
+
argv << "start"
|
64
|
+
argv << "-d"
|
65
|
+
argv << "-e #{@options["environment"]}" if @options["environment"]
|
66
|
+
argv << "-a #{@options["address"]}" if @options["address"]
|
67
|
+
argv << "-c #{@options["cwd"]}" if @options["cwd"]
|
68
|
+
argv << "-t #{@options["timeout"]}" if @options["timeout"]
|
69
|
+
argv << "-m #{@options["mime_map"]}" if @options["mime_map"]
|
70
|
+
argv << "-r #{@options["docroot"]}" if @options["docroot"]
|
71
|
+
argv << "-n #{@options["num_procs"]}" if @options["num_procs"]
|
72
|
+
argv << "-B" if @options["debug"]
|
73
|
+
argv << "-S #{@options["config_script"]}" if @options["config_script"]
|
74
|
+
argv << "--user #{@options["user"]}" if @options["user"]
|
75
|
+
argv << "--group #{@options["group"]}" if @options["group"]
|
76
|
+
argv << "--prefix #{@options["prefix"]}" if @options["prefix"]
|
77
|
+
cmd = argv.join " "
|
78
|
+
|
79
|
+
@ports.each do |port|
|
80
|
+
if @clean && pid_file_exists?(port) && !check_process(port)
|
81
|
+
pid_file = port_pid_file(port)
|
82
|
+
log "missing process: removing #{pid_file}"
|
83
|
+
File.unlink(pid_file)
|
58
84
|
end
|
85
|
+
|
86
|
+
if pid_file_exists?(port) && check_process(port)
|
87
|
+
log "already started port #{port}"
|
88
|
+
next
|
89
|
+
end
|
90
|
+
|
91
|
+
exec_cmd = cmd + " -p #{port} -P #{port_pid_file(port)}"
|
92
|
+
exec_cmd += " -l #{port_log_file(port)}"
|
93
|
+
log "starting port #{port}"
|
94
|
+
log_verbose exec_cmd
|
95
|
+
output = `#{exec_cmd}`
|
96
|
+
log_error output unless $?.success?
|
59
97
|
end
|
98
|
+
end
|
60
99
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
100
|
+
def stop
|
101
|
+
read_options
|
102
|
+
|
103
|
+
argv = [ "mongrel_rails" ]
|
104
|
+
argv << "stop"
|
105
|
+
argv << "-c #{@options["cwd"]}" if @options["cwd"]
|
106
|
+
argv << "-f" if @force
|
107
|
+
cmd = argv.join " "
|
108
|
+
|
109
|
+
@ports.each do |port|
|
110
|
+
pid = check_process(port)
|
111
|
+
if @clean && pid && !pid_file_exists?(port)
|
112
|
+
log "missing pid_file: killing mongrel_rails port #{port}, pid #{pid}"
|
113
|
+
Process.kill("KILL", pid.to_i)
|
114
|
+
end
|
115
|
+
|
116
|
+
if !check_process(port)
|
117
|
+
log "already stopped port #{port}"
|
118
|
+
next
|
79
119
|
end
|
120
|
+
|
121
|
+
exec_cmd = cmd + " -P #{port_pid_file(port)}"
|
122
|
+
log "stopping port #{port}"
|
123
|
+
log_verbose exec_cmd
|
124
|
+
output = `#{exec_cmd}`
|
125
|
+
log_error output unless $?.success?
|
126
|
+
|
80
127
|
end
|
128
|
+
end
|
129
|
+
|
130
|
+
def status
|
131
|
+
read_options
|
81
132
|
|
133
|
+
status = STATUS_OK
|
134
|
+
|
135
|
+
@ports.each do |port|
|
136
|
+
pid = check_process(port)
|
137
|
+
unless pid_file_exists?(port)
|
138
|
+
log "missing pid_file: #{port_pid_file(port)}"
|
139
|
+
status = STATUS_ERROR
|
140
|
+
else
|
141
|
+
log "found pid_file: #{port_pid_file(port)}"
|
142
|
+
end
|
143
|
+
if pid
|
144
|
+
log "found mongrel_rails: port #{port}, pid #{pid}"
|
145
|
+
else
|
146
|
+
log "missing mongrel_rails: port #{port}"
|
147
|
+
status = STATUS_ERROR
|
148
|
+
end
|
149
|
+
puts ""
|
150
|
+
end
|
151
|
+
|
152
|
+
return status
|
153
|
+
end
|
154
|
+
|
155
|
+
def pid_file_exists?(port)
|
156
|
+
pid_file = port_pid_file(port)
|
157
|
+
exists = false
|
158
|
+
chdir_cwd do
|
159
|
+
exists = File.exists?(pid_file)
|
160
|
+
end
|
161
|
+
exists
|
162
|
+
end
|
163
|
+
|
164
|
+
def check_process(port)
|
165
|
+
if pid_file_exists?(port)
|
166
|
+
pid = read_pid(port)
|
167
|
+
ps_output = `ps -o #{cmd_name}= -p #{pid}`
|
168
|
+
pid = ps_output =~ /mongrel_rails/ ? pid : nil
|
169
|
+
else
|
170
|
+
pid = find_pid(port)
|
171
|
+
end
|
172
|
+
return pid
|
173
|
+
end
|
174
|
+
|
175
|
+
def cmd_name
|
176
|
+
RUBY_PLATFORM =~ /solaris/i ? "args" : "command"
|
177
|
+
end
|
178
|
+
|
179
|
+
def chdir_cwd
|
180
|
+
pwd = Dir.pwd
|
181
|
+
Dir.chdir(@options["cwd"]) if @options["cwd"]
|
182
|
+
yield
|
183
|
+
Dir.chdir(pwd) if @options["cwd"]
|
184
|
+
end
|
185
|
+
|
186
|
+
def read_pid(port)
|
187
|
+
pid_file = port_pid_file(port)
|
188
|
+
pid = 0
|
189
|
+
chdir_cwd do
|
190
|
+
pid = File.read(pid_file)
|
191
|
+
end
|
192
|
+
return pid
|
193
|
+
end
|
194
|
+
|
195
|
+
def find_pid(port)
|
196
|
+
ps_cmd = "ps -ewwo pid,#{cmd_name}"
|
197
|
+
ps_output = `#{ps_cmd}`
|
198
|
+
ps_output.each do |line|
|
199
|
+
if line =~ /-P #{Regexp.escape(port_pid_file(port))} /
|
200
|
+
pid = line.split[0]
|
201
|
+
return pid
|
202
|
+
end
|
203
|
+
end
|
204
|
+
return nil
|
205
|
+
end
|
206
|
+
|
207
|
+
def log_error(message)
|
208
|
+
log(message)
|
209
|
+
end
|
210
|
+
|
211
|
+
def log_verbose(message)
|
212
|
+
log(message) if @verbose
|
213
|
+
end
|
214
|
+
|
215
|
+
def log(message)
|
216
|
+
puts message
|
217
|
+
end
|
82
218
|
end
|
83
|
-
|
84
219
|
class Start < GemPlugin::Plugin "/commands"
|
85
220
|
include ExecBase
|
86
221
|
|
87
222
|
def configure
|
88
223
|
options [
|
89
224
|
['-C', '--config PATH', "Path to cluster configuration file", :@config_file, "config/mongrel_cluster.yml"],
|
90
|
-
['-v', '--verbose', "Print all called commands and output.", :@verbose, false]
|
225
|
+
['-v', '--verbose', "Print all called commands and output.", :@verbose, false],
|
226
|
+
['', '--clean', "Remove pid_file if needed before starting", :@clean, false],
|
227
|
+
['', '--only PORT', "Port number of cluster member", :@only, nil]
|
91
228
|
]
|
92
229
|
end
|
93
230
|
|
@@ -103,7 +240,9 @@ module Cluster
|
|
103
240
|
options [
|
104
241
|
['-C', '--config PATH', "Path to cluster configuration file", :@config_file, "config/mongrel_cluster.yml"],
|
105
242
|
['-f', '--force', "Force the shutdown.", :@force, false],
|
106
|
-
['-v', '--verbose', "Print all called commands and output.", :@verbose, false]
|
243
|
+
['-v', '--verbose', "Print all called commands and output.", :@verbose, false],
|
244
|
+
['', '--clean', "Remove orphaned process if needed before stopping", :@clean, false],
|
245
|
+
['', '--only PORT', "Port number of cluster member", :@only, nil]
|
107
246
|
]
|
108
247
|
end
|
109
248
|
|
@@ -119,7 +258,9 @@ module Cluster
|
|
119
258
|
options [
|
120
259
|
['-C', '--config PATH', "Path to cluster configuration file", :@config_file, "config/mongrel_cluster.yml"],
|
121
260
|
['-f', '--force', "Force the shutdown.", :@force, false],
|
122
|
-
['-v', '--verbose', "Print all called commands and output.", :@verbose, false]
|
261
|
+
['-v', '--verbose', "Print all called commands and output.", :@verbose, false],
|
262
|
+
['', '--clean', "Call stop and start with --clean", :@clean, false],
|
263
|
+
['', '--only PORT', "Port number of cluster member", :@only, nil]
|
123
264
|
]
|
124
265
|
end
|
125
266
|
|
@@ -131,15 +272,15 @@ module Cluster
|
|
131
272
|
end
|
132
273
|
|
133
274
|
class Configure < GemPlugin::Plugin "/commands"
|
134
|
-
include
|
275
|
+
include ExecBase
|
135
276
|
|
136
277
|
def configure
|
137
278
|
options [
|
138
279
|
["-e", "--environment ENV", "Rails environment to run as", :@environment, nil],
|
139
280
|
['-p', '--port PORT', "Starting port to bind to", :@port, 3000],
|
140
281
|
['-a', '--address ADDR', "Address to bind to", :@address, nil],
|
141
|
-
['-l', '--log FILE', "Where to write log messages", :@log_file,
|
142
|
-
['-P', '--pid FILE', "Where to write the PID", :@pid_file, "
|
282
|
+
['-l', '--log FILE', "Where to write log messages", :@log_file, "log/mongrel.log"],
|
283
|
+
['-P', '--pid FILE', "Where to write the PID", :@pid_file, "tmp/pids/mongrel.pid"],
|
143
284
|
['-c', '--chdir PATH', "Change to dir before starting (will be expanded)", :@cwd, nil],
|
144
285
|
['-t', '--timeout SECONDS', "Timeout all requests after SECONDS time", :@timeout, nil],
|
145
286
|
['-m', '--mime PATH', "A YAML file that lists additional MIME types", :@mime_map, nil],
|
@@ -185,9 +326,26 @@ module Cluster
|
|
185
326
|
@options["group"] = @group if @group
|
186
327
|
@options["prefix"] = @prefix if @prefix
|
187
328
|
|
188
|
-
|
329
|
+
log "Writing configuration file to #{@config_file}."
|
189
330
|
File.open(@config_file,"w") {|f| f.write(@options.to_yaml)}
|
190
331
|
end
|
191
332
|
end
|
333
|
+
|
334
|
+
class Status < GemPlugin::Plugin "/commands"
|
335
|
+
include ExecBase
|
336
|
+
|
337
|
+
def configure
|
338
|
+
options [
|
339
|
+
['-C', '--config PATH', "Path to cluster configuration file", :@config_file, "config/mongrel_cluster.yml"],
|
340
|
+
['-v', '--verbose', "Print all called commands and output.", :@verbose, false],
|
341
|
+
['', '--only PORT', "Port number of cluster member", :@only, nil]
|
342
|
+
]
|
343
|
+
end
|
344
|
+
|
345
|
+
def run
|
346
|
+
status
|
347
|
+
end
|
348
|
+
|
349
|
+
end
|
192
350
|
end
|
193
351
|
|
@@ -0,0 +1,351 @@
|
|
1
|
+
require 'gem_plugin'
|
2
|
+
require 'mongrel'
|
3
|
+
require 'yaml'
|
4
|
+
|
5
|
+
module Cluster
|
6
|
+
module ExecBase
|
7
|
+
include Mongrel::Command::Base
|
8
|
+
|
9
|
+
STATUS_OK = 0
|
10
|
+
STATUS_ERROR = 2
|
11
|
+
|
12
|
+
def validate
|
13
|
+
valid_exists?(@config_file, "Configuration file does not exist. Run mongrel_rails cluster::configure.")
|
14
|
+
return @valid
|
15
|
+
end
|
16
|
+
|
17
|
+
def read_options
|
18
|
+
@options = {
|
19
|
+
"environment" => ENV['RAILS_ENV'] || "development",
|
20
|
+
"port" => 3000,
|
21
|
+
"pid_file" => "tmp/pids/mongrel.pid",
|
22
|
+
"log_file" => "log/mongrel.log",
|
23
|
+
"servers" => 2
|
24
|
+
}
|
25
|
+
conf = YAML.load_file(@config_file)
|
26
|
+
@options.merge! conf if conf
|
27
|
+
|
28
|
+
process_pid_file @options["pid_file"]
|
29
|
+
process_log_file @options["log_file"]
|
30
|
+
|
31
|
+
start_port = end_port = @only
|
32
|
+
start_port ||= @options["port"].to_i
|
33
|
+
end_port ||= start_port + @options["servers"] - 1
|
34
|
+
@ports = (start_port..end_port).to_a
|
35
|
+
end
|
36
|
+
|
37
|
+
def process_pid_file(pid_file)
|
38
|
+
@pid_file_ext = File.extname(pid_file)
|
39
|
+
@pid_file_base = File.basename(pid_file, @pid_file_ext)
|
40
|
+
@pid_file_dir = File.dirname(pid_file)
|
41
|
+
end
|
42
|
+
|
43
|
+
def process_log_file(log_file)
|
44
|
+
@log_file_ext = File.extname(log_file)
|
45
|
+
@log_file_base = File.basename(log_file, @log_file_ext)
|
46
|
+
@log_file_dir = File.dirname(log_file)
|
47
|
+
end
|
48
|
+
|
49
|
+
def port_pid_file(port)
|
50
|
+
pid_file = [@pid_file_base, port].join(".") + @pid_file_ext
|
51
|
+
File.join(@pid_file_dir, pid_file)
|
52
|
+
end
|
53
|
+
|
54
|
+
def port_log_file(port)
|
55
|
+
log_file = [@log_file_base, port].join(".") + @log_file_ext
|
56
|
+
File.join(@log_file_dir, log_file)
|
57
|
+
end
|
58
|
+
|
59
|
+
def start
|
60
|
+
read_options
|
61
|
+
|
62
|
+
argv = [ "mongrel_rails" ]
|
63
|
+
argv << "start"
|
64
|
+
argv << "-d"
|
65
|
+
argv << "-e #{@options["environment"]}" if @options["environment"]
|
66
|
+
argv << "-a #{@options["address"]}" if @options["address"]
|
67
|
+
argv << "-c #{@options["cwd"]}" if @options["cwd"]
|
68
|
+
argv << "-t #{@options["timeout"]}" if @options["timeout"]
|
69
|
+
argv << "-m #{@options["mime_map"]}" if @options["mime_map"]
|
70
|
+
argv << "-r #{@options["docroot"]}" if @options["docroot"]
|
71
|
+
argv << "-n #{@options["num_procs"]}" if @options["num_procs"]
|
72
|
+
argv << "-B" if @options["debug"]
|
73
|
+
argv << "-S #{@options["config_script"]}" if @options["config_script"]
|
74
|
+
argv << "--user #{@options["user"]}" if @options["user"]
|
75
|
+
argv << "--group #{@options["group"]}" if @options["group"]
|
76
|
+
argv << "--prefix #{@options["prefix"]}" if @options["prefix"]
|
77
|
+
cmd = argv.join " "
|
78
|
+
|
79
|
+
@ports.each do |port|
|
80
|
+
if @clean && pid_file_exists?(port) && !check_process(port)
|
81
|
+
pid_file = port_pid_file(port)
|
82
|
+
log "missing process: removing #{pid_file}"
|
83
|
+
File.unlink(pid_file)
|
84
|
+
end
|
85
|
+
|
86
|
+
if pid_file_exists?(port) && check_process(port)
|
87
|
+
log "already started port #{port}"
|
88
|
+
next
|
89
|
+
end
|
90
|
+
|
91
|
+
exec_cmd = cmd + " -p #{port} -P #{port_pid_file(port)}"
|
92
|
+
exec_cmd += " -l #{port_log_file(port)}"
|
93
|
+
log "starting port #{port}"
|
94
|
+
log_verbose exec_cmd
|
95
|
+
output = `#{exec_cmd}`
|
96
|
+
log_error output unless $?.success?
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def stop
|
101
|
+
read_options
|
102
|
+
|
103
|
+
argv = [ "mongrel_rails" ]
|
104
|
+
argv << "stop"
|
105
|
+
argv << "-c #{@options["cwd"]}" if @options["cwd"]
|
106
|
+
argv << "-f" if @force
|
107
|
+
cmd = argv.join " "
|
108
|
+
|
109
|
+
@ports.each do |port|
|
110
|
+
pid = check_process(port)
|
111
|
+
if @clean && pid && !pid_file_exists?(port)
|
112
|
+
log "missing pid_file: killing mongrel_rails port #{port}, pid #{pid}"
|
113
|
+
Process.kill("KILL", pid.to_i)
|
114
|
+
end
|
115
|
+
|
116
|
+
if !check_process(port)
|
117
|
+
log "already stopped port #{port}"
|
118
|
+
next
|
119
|
+
end
|
120
|
+
|
121
|
+
exec_cmd = cmd + " -P #{port_pid_file(port)}"
|
122
|
+
log "stopping port #{port}"
|
123
|
+
log_verbose exec_cmd
|
124
|
+
output = `#{exec_cmd}`
|
125
|
+
log_error output unless $?.success?
|
126
|
+
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
def status
|
131
|
+
read_options
|
132
|
+
|
133
|
+
status = STATUS_OK
|
134
|
+
|
135
|
+
@ports.each do |port|
|
136
|
+
pid = check_process(port)
|
137
|
+
unless pid_file_exists?(port)
|
138
|
+
log "missing pid_file: #{port_pid_file(port)}"
|
139
|
+
status = STATUS_ERROR
|
140
|
+
else
|
141
|
+
log "found pid_file: #{port_pid_file(port)}"
|
142
|
+
end
|
143
|
+
if pid
|
144
|
+
log "found mongrel_rails: port #{port}, pid #{pid}"
|
145
|
+
else
|
146
|
+
log "missing mongrel_rails: port #{port}"
|
147
|
+
status = STATUS_ERROR
|
148
|
+
end
|
149
|
+
puts ""
|
150
|
+
end
|
151
|
+
|
152
|
+
return status
|
153
|
+
end
|
154
|
+
|
155
|
+
def pid_file_exists?(port)
|
156
|
+
pid_file = port_pid_file(port)
|
157
|
+
exists = false
|
158
|
+
chdir_cwd do
|
159
|
+
exists = File.exists?(pid_file)
|
160
|
+
end
|
161
|
+
exists
|
162
|
+
end
|
163
|
+
|
164
|
+
def check_process(port)
|
165
|
+
if pid_file_exists?(port)
|
166
|
+
pid = read_pid(port)
|
167
|
+
ps_output = `ps -o #{cmd_name}= -p #{pid}`
|
168
|
+
pid = ps_output =~ /mongrel_rails/ ? pid : nil
|
169
|
+
else
|
170
|
+
pid = find_pid(port)
|
171
|
+
end
|
172
|
+
return pid
|
173
|
+
end
|
174
|
+
|
175
|
+
def cmd_name
|
176
|
+
RUBY_PLATFORM =~ /solaris/i ? "args" : "command"
|
177
|
+
end
|
178
|
+
|
179
|
+
def chdir_cwd
|
180
|
+
pwd = Dir.pwd
|
181
|
+
Dir.chdir(@options["cwd"]) if @options["cwd"]
|
182
|
+
yield
|
183
|
+
Dir.chdir(pwd) if @options["cwd"]
|
184
|
+
end
|
185
|
+
|
186
|
+
def read_pid(port)
|
187
|
+
pid_file = port_pid_file(port)
|
188
|
+
pid = 0
|
189
|
+
chdir_cwd do
|
190
|
+
pid = File.read(pid_file)
|
191
|
+
end
|
192
|
+
return pid
|
193
|
+
end
|
194
|
+
|
195
|
+
def find_pid(port)
|
196
|
+
ps_cmd = "ps -ewwo pid,#{cmd_name}"
|
197
|
+
ps_output = `#{ps_cmd}`
|
198
|
+
ps_output.each do |line|
|
199
|
+
if line =~ /-P #{Regexp.escape(port_pid_file(port))} /
|
200
|
+
pid = line.split[0]
|
201
|
+
return pid
|
202
|
+
end
|
203
|
+
end
|
204
|
+
return nil
|
205
|
+
end
|
206
|
+
|
207
|
+
def log_error(message)
|
208
|
+
log(message)
|
209
|
+
end
|
210
|
+
|
211
|
+
def log_verbose(message)
|
212
|
+
log(message) if @verbose
|
213
|
+
end
|
214
|
+
|
215
|
+
def log(message)
|
216
|
+
puts message
|
217
|
+
end
|
218
|
+
end
|
219
|
+
class Start < GemPlugin::Plugin "/commands"
|
220
|
+
include ExecBase
|
221
|
+
|
222
|
+
def configure
|
223
|
+
options [
|
224
|
+
['-C', '--config PATH', "Path to cluster configuration file", :@config_file, "config/mongrel_cluster.yml"],
|
225
|
+
['-v', '--verbose', "Print all called commands and output.", :@verbose, false],
|
226
|
+
['', '--clean', "Remove pid_file if needed before starting", :@clean, false],
|
227
|
+
['', '--only PORT', "Port number of cluster member", :@only, nil]
|
228
|
+
]
|
229
|
+
end
|
230
|
+
|
231
|
+
def run
|
232
|
+
start
|
233
|
+
end
|
234
|
+
end
|
235
|
+
|
236
|
+
class Stop < GemPlugin::Plugin "/commands"
|
237
|
+
include ExecBase
|
238
|
+
|
239
|
+
def configure
|
240
|
+
options [
|
241
|
+
['-C', '--config PATH', "Path to cluster configuration file", :@config_file, "config/mongrel_cluster.yml"],
|
242
|
+
['-f', '--force', "Force the shutdown.", :@force, false],
|
243
|
+
['-v', '--verbose', "Print all called commands and output.", :@verbose, false],
|
244
|
+
['', '--clean', "Remove orphaned process if needed before stopping", :@clean, false],
|
245
|
+
['', '--only PORT', "Port number of cluster member", :@only, nil]
|
246
|
+
]
|
247
|
+
end
|
248
|
+
|
249
|
+
def run
|
250
|
+
stop
|
251
|
+
end
|
252
|
+
end
|
253
|
+
|
254
|
+
class Restart < GemPlugin::Plugin "/commands"
|
255
|
+
include ExecBase
|
256
|
+
|
257
|
+
def configure
|
258
|
+
options [
|
259
|
+
['-C', '--config PATH', "Path to cluster configuration file", :@config_file, "config/mongrel_cluster.yml"],
|
260
|
+
['-f', '--force', "Force the shutdown.", :@force, false],
|
261
|
+
['-v', '--verbose', "Print all called commands and output.", :@verbose, false],
|
262
|
+
['', '--clean', "Call stop and start with --clean", :@clean, false],
|
263
|
+
['', '--only PORT', "Port number of cluster member", :@only, nil]
|
264
|
+
]
|
265
|
+
end
|
266
|
+
|
267
|
+
def run
|
268
|
+
stop
|
269
|
+
start
|
270
|
+
end
|
271
|
+
|
272
|
+
end
|
273
|
+
|
274
|
+
class Configure < GemPlugin::Plugin "/commands"
|
275
|
+
include ExecBase
|
276
|
+
|
277
|
+
def configure
|
278
|
+
options [
|
279
|
+
["-e", "--environment ENV", "Rails environment to run as", :@environment, nil],
|
280
|
+
['-p', '--port PORT', "Starting port to bind to", :@port, 3000],
|
281
|
+
['-a', '--address ADDR', "Address to bind to", :@address, nil],
|
282
|
+
['-l', '--log FILE', "Where to write log messages", :@log_file, "log/mongrel.log"],
|
283
|
+
['-P', '--pid FILE', "Where to write the PID", :@pid_file, "tmp/pids/mongrel.pid"],
|
284
|
+
['-c', '--chdir PATH', "Change to dir before starting (will be expanded)", :@cwd, nil],
|
285
|
+
['-t', '--timeout SECONDS', "Timeout all requests after SECONDS time", :@timeout, nil],
|
286
|
+
['-m', '--mime PATH', "A YAML file that lists additional MIME types", :@mime_map, nil],
|
287
|
+
['-r', '--root PATH', "Set the document root (default 'public')", :@docroot, nil],
|
288
|
+
['-n', '--num-procs INT', "Number of processor threads to use", :@num_procs, nil],
|
289
|
+
['-B', '--debug', "Enable debugging mode", :@debug, nil],
|
290
|
+
['-S', '--script PATH', "Load the given file as an extra config script.", :@config_script, nil],
|
291
|
+
['-N', '--num-servers INT', "Number of Mongrel servers", :@servers, 2],
|
292
|
+
['-C', '--config PATH', "Path to cluster configuration file", :@config_file, "config/mongrel_cluster.yml"],
|
293
|
+
['', '--user USER', "User to run as", :@user, nil],
|
294
|
+
['', '--group GROUP', "Group to run as", :@group, nil],
|
295
|
+
['', '--prefix PREFIX', "Rails prefix to use", :@prefix, nil]
|
296
|
+
]
|
297
|
+
end
|
298
|
+
|
299
|
+
def validate
|
300
|
+
@servers = @servers.to_i
|
301
|
+
|
302
|
+
valid?(@servers > 0, "Must give a valid number of servers")
|
303
|
+
valid_dir? File.dirname(@config_file), "Path to config file not valid: #{@config_file}"
|
304
|
+
|
305
|
+
return @valid
|
306
|
+
end
|
307
|
+
|
308
|
+
def run
|
309
|
+
@options = {
|
310
|
+
"port" => @port,
|
311
|
+
"servers" => @servers,
|
312
|
+
"pid_file" => @pid_file
|
313
|
+
}
|
314
|
+
|
315
|
+
@options["log_file"] = @log_file if @log_file
|
316
|
+
@options["debug"] = @debug if @debug
|
317
|
+
@options["num_procs"] = @num_procs if @num_procs
|
318
|
+
@options["docroot"] = @docroot if @docroots
|
319
|
+
@options["address"] = @address if @address
|
320
|
+
@options["timeout"] = @timeout if @timeout
|
321
|
+
@options["environment"] = @environment if @environment
|
322
|
+
@options["mime_map"] = @mime_map if @mime_map
|
323
|
+
@options["config_script"] = @config_script if @config_script
|
324
|
+
@options["cwd"] = @cwd if @cwd
|
325
|
+
@options["user"] = @user if @user
|
326
|
+
@options["group"] = @group if @group
|
327
|
+
@options["prefix"] = @prefix if @prefix
|
328
|
+
|
329
|
+
log "Writing configuration file to #{@config_file}."
|
330
|
+
File.open(@config_file,"w") {|f| f.write(@options.to_yaml)}
|
331
|
+
end
|
332
|
+
end
|
333
|
+
|
334
|
+
class Status < GemPlugin::Plugin "/commands"
|
335
|
+
include ExecBase
|
336
|
+
|
337
|
+
def configure
|
338
|
+
options [
|
339
|
+
['-C', '--config PATH', "Path to cluster configuration file", :@config_file, "config/mongrel_cluster.yml"],
|
340
|
+
['-v', '--verbose', "Print all called commands and output.", :@verbose, false],
|
341
|
+
['', '--only PORT', "Port number of cluster member", :@only, nil]
|
342
|
+
]
|
343
|
+
end
|
344
|
+
|
345
|
+
def run
|
346
|
+
status
|
347
|
+
end
|
348
|
+
|
349
|
+
end
|
350
|
+
end
|
351
|
+
|
@@ -7,7 +7,12 @@ Capistrano.configuration(:must_exist).load do
|
|
7
7
|
set :mongrel_user, nil
|
8
8
|
set :mongrel_group, nil
|
9
9
|
set :mongrel_prefix, nil
|
10
|
-
|
10
|
+
set :mongrel_rails, 'mongrel_rails'
|
11
|
+
set :mongrel_clean, false
|
12
|
+
set :mongrel_pid_file, nil
|
13
|
+
set :mongrel_log_file, nil
|
14
|
+
set :mongrel_config_script, nil
|
15
|
+
|
11
16
|
desc <<-DESC
|
12
17
|
Configure Mongrel processes on the app server. This uses the :use_sudo
|
13
18
|
variable to determine whether to use sudo or not. By default, :use_sudo is
|
@@ -17,16 +22,19 @@ Capistrano.configuration(:must_exist).load do
|
|
17
22
|
set_mongrel_conf
|
18
23
|
|
19
24
|
argv = []
|
20
|
-
argv << "mongrel_rails cluster::configure"
|
25
|
+
argv << "#{mongrel_rails} cluster::configure"
|
21
26
|
argv << "-N #{mongrel_servers.to_s}"
|
22
27
|
argv << "-p #{mongrel_port.to_s}"
|
23
28
|
argv << "-e #{mongrel_environment}"
|
24
29
|
argv << "-a #{mongrel_address}"
|
25
30
|
argv << "-c #{current_path}"
|
26
31
|
argv << "-C #{mongrel_conf}"
|
32
|
+
argv << "-P #{mongrel_pid_file}" if mongrel_pid_file
|
33
|
+
argv << "-l #{mongrel_log_file}" if mongrel_log_file
|
27
34
|
argv << "--user #{mongrel_user}" if mongrel_user
|
28
35
|
argv << "--group #{mongrel_group}" if mongrel_group
|
29
36
|
argv << "--prefix #{mongrel_prefix}" if mongrel_prefix
|
37
|
+
argv << "-S #{mongrel_config_script}" if mongrel_config_script
|
30
38
|
cmd = argv.join " "
|
31
39
|
send(run_method, cmd)
|
32
40
|
end
|
@@ -37,7 +45,9 @@ Capistrano.configuration(:must_exist).load do
|
|
37
45
|
DESC
|
38
46
|
task :start_mongrel_cluster , :roles => :app do
|
39
47
|
set_mongrel_conf
|
40
|
-
|
48
|
+
cmd = "#{mongrel_rails} cluster::start -C #{mongrel_conf}"
|
49
|
+
cmd += " --clean" if mongrel_clean
|
50
|
+
send(run_method, cmd)
|
41
51
|
end
|
42
52
|
|
43
53
|
desc <<-DESC
|
@@ -46,7 +56,9 @@ Capistrano.configuration(:must_exist).load do
|
|
46
56
|
DESC
|
47
57
|
task :restart_mongrel_cluster , :roles => :app do
|
48
58
|
set_mongrel_conf
|
49
|
-
|
59
|
+
cmd = "#{mongrel_rails} cluster::restart -C #{mongrel_conf}"
|
60
|
+
cmd += " --clean" if mongrel_clean
|
61
|
+
send(run_method, cmd)
|
50
62
|
end
|
51
63
|
|
52
64
|
desc <<-DESC
|
@@ -56,7 +68,19 @@ Capistrano.configuration(:must_exist).load do
|
|
56
68
|
DESC
|
57
69
|
task :stop_mongrel_cluster , :roles => :app do
|
58
70
|
set_mongrel_conf
|
59
|
-
|
71
|
+
cmd = "#{mongrel_rails} cluster::stop -C #{mongrel_conf}"
|
72
|
+
cmd += " --clean" if mongrel_clean
|
73
|
+
send(run_method, cmd)
|
74
|
+
end
|
75
|
+
|
76
|
+
desc <<-DESC
|
77
|
+
Check the status of the Mongrel processes on the app server. This uses the :use_sudo
|
78
|
+
variable to determine whether to use sudo or not. By default, :use_sudo is
|
79
|
+
set to true.
|
80
|
+
DESC
|
81
|
+
task :status_mongrel_cluster , :roles => :app do
|
82
|
+
set_mongrel_conf
|
83
|
+
send(run_method, "#{mongrel_rails} cluster::status -C #{mongrel_conf}")
|
60
84
|
end
|
61
85
|
|
62
86
|
desc <<-DESC
|
@@ -77,4 +101,4 @@ Capistrano.configuration(:must_exist).load do
|
|
77
101
|
set :mongrel_conf, "/etc/mongrel_cluster/#{application}.yml" unless mongrel_conf
|
78
102
|
end
|
79
103
|
|
80
|
-
end
|
104
|
+
end
|
data/resources/mongrel_cluster
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
#!/bin/bash
|
2
2
|
#
|
3
|
-
# Copyright (c)
|
3
|
+
# Copyright (c) 2007 Bradley Taylor, bradley@railsmachine.com
|
4
4
|
#
|
5
5
|
# mongrel_cluster Startup script for Mongrel clusters.
|
6
6
|
#
|
@@ -10,8 +10,10 @@
|
|
10
10
|
#
|
11
11
|
|
12
12
|
CONF_DIR=/etc/mongrel_cluster
|
13
|
-
|
13
|
+
PID_DIR=/var/run/mongrel_cluster
|
14
|
+
USER=mongrel
|
14
15
|
|
16
|
+
RETVAL=0
|
15
17
|
|
16
18
|
# Gracefully exit if the controller is missing.
|
17
19
|
which mongrel_cluster_ctl >/dev/null || exit 0
|
@@ -21,6 +23,10 @@ which mongrel_cluster_ctl >/dev/null || exit 0
|
|
21
23
|
|
22
24
|
case "$1" in
|
23
25
|
start)
|
26
|
+
# Create pid directory
|
27
|
+
mkdir -p $PID_DIR
|
28
|
+
chown $USER:$USER $PID_DIR
|
29
|
+
|
24
30
|
mongrel_cluster_ctl start -c $CONF_DIR
|
25
31
|
RETVAL=$?
|
26
32
|
;;
|
@@ -31,11 +37,15 @@ case "$1" in
|
|
31
37
|
restart)
|
32
38
|
mongrel_cluster_ctl restart -c $CONF_DIR
|
33
39
|
RETVAL=$?
|
40
|
+
;;
|
41
|
+
status)
|
42
|
+
mongrel_cluster_ctl status -c $CONF_DIR
|
43
|
+
RETVAL=$?
|
34
44
|
;;
|
35
45
|
*)
|
36
|
-
echo "Usage: mongrel_cluster {start|stop|restart}"
|
46
|
+
echo "Usage: mongrel_cluster {start|stop|restart|status}"
|
37
47
|
exit 1
|
38
48
|
;;
|
39
49
|
esac
|
40
50
|
|
41
|
-
exit $RETVAL
|
51
|
+
exit $RETVAL
|
metadata
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.
|
2
|
+
rubygems_version: 0.9.2
|
3
3
|
specification_version: 1
|
4
4
|
name: mongrel_cluster
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.2
|
7
|
-
date:
|
6
|
+
version: 1.0.2
|
7
|
+
date: 2007-07-10 00:00:00 -04:00
|
8
8
|
summary: Mongrel plugin that provides commands and Capistrano tasks for managing multiple Mongrel processes.
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -25,6 +25,7 @@ required_ruby_version: !ruby/object:Gem::Version::Requirement
|
|
25
25
|
platform: ruby
|
26
26
|
signing_key:
|
27
27
|
cert_chain:
|
28
|
+
post_install_message:
|
28
29
|
authors:
|
29
30
|
- Bradley Taylor
|
30
31
|
files:
|
@@ -35,6 +36,7 @@ files:
|
|
35
36
|
- bin/mongrel_cluster_ctl
|
36
37
|
- lib/mongrel_cluster
|
37
38
|
- lib/mongrel_cluster/recipes.rb
|
39
|
+
- lib/mongrel_cluster/init.rb~
|
38
40
|
- lib/mongrel_cluster/init.rb
|
39
41
|
- tools/rakehelp.rb
|
40
42
|
- resources/mongrel_cluster
|
@@ -59,7 +61,7 @@ dependencies:
|
|
59
61
|
requirements:
|
60
62
|
- - ">="
|
61
63
|
- !ruby/object:Gem::Version
|
62
|
-
version: 0.2.
|
64
|
+
version: 0.2.2
|
63
65
|
version:
|
64
66
|
- !ruby/object:Gem::Dependency
|
65
67
|
name: mongrel
|
@@ -68,5 +70,5 @@ dependencies:
|
|
68
70
|
requirements:
|
69
71
|
- - ">="
|
70
72
|
- !ruby/object:Gem::Version
|
71
|
-
version: 0.
|
73
|
+
version: 1.0.1
|
72
74
|
version:
|