mongrel_cluster 1.0.2 → 1.0.3

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.
Binary file
@@ -0,0 +1,2 @@
1
+
2
+ v1.0.3. Signed gem; Capistrano 2.0 tasks (require 'mongrel_cluster/recipes_2').
data/COPYING CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2006 Bradley Taylor, bradley@fluxura.com
1
+ Copyright (c) 2007 Bradley Taylor, bradley@fluxura.com
2
2
 
3
3
  GNU LESSER GENERAL PUBLIC LICENSE
4
4
  Version 2.1, February 1999
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2006 Bradley Taylor, bradley@fluxura.com
1
+ Copyright (c) 2007 Bradley Taylor, bradley@fluxura.com
2
2
 
3
3
  GNU LESSER GENERAL PUBLIC LICENSE
4
4
  Version 2.1, February 1999
@@ -0,0 +1,10 @@
1
+ resources/mongrel_cluster
2
+ resources/defaults.yaml
3
+ README
4
+ Manifest
5
+ LICENSE
6
+ lib/mongrel_cluster/recipes.rb
7
+ lib/mongrel_cluster/init.rb
8
+ COPYING
9
+ CHANGELOG
10
+ bin/mongrel_cluster_ctl
data/README CHANGED
@@ -3,45 +3,57 @@
3
3
  Tool to help start/stop/restart multiple mongrel servers to use behind a load balancer like Apache 2.2 (mod_proxy_balancer), Lighttpd, Pound, Pen or Balance. This plugin adds an option to specify a number of Mongrel servers to launch, a range of ports, and a configuration file for the cluster. Use "-h" to see command syntax.
4
4
 
5
5
  Configure cluster and write configuration file:
6
- mongrel_rails cluster::configure
6
+ mongrel_rails cluster::configure
7
7
 
8
8
  Start cluster:
9
- mongrel_rails cluster::start
9
+ mongrel_rails cluster::start
10
10
 
11
11
  Restart cluster:
12
- mongrel_rails cluster::restart
12
+ mongrel_rails cluster::restart
13
13
 
14
14
  Stop cluster:
15
- mongrel_rails cluster::stop
15
+ mongrel_rails cluster::stop
16
16
 
17
- Capistrano Recipe
17
+ == Capistrano 1.0 Recipes
18
18
 
19
19
  Add to config/deploy.rb:
20
- require 'mongrel_cluster/recipes'
20
+ require 'mongrel_cluster/recipes'
21
21
 
22
- Example usage:
23
- cap -a configure_mongrel_cluster
24
-
25
- Variables
26
- mongrel_servers: Number of Mongrel servers to start.
27
- mongrel_port: Starting port to bind to.
28
- mongrel_address: Address to bind to.
29
- mongrel_environment: Rails environment to run as.
30
- mongrel_conf: Path to conf file. Defaults to /etc/mongrel_cluster/app_name.conf
31
- mongrel_user: User to run mongrels in cluster as. Unset by default
32
- mongrel_group: Group to run mongrels in cluster as. Unset by default.
22
+ Variables:
23
+ mongrel_servers: Number of Mongrel servers to start.
24
+ mongrel_port: Starting port to bind to.
25
+ mongrel_address: Address to bind to.
26
+ mongrel_environment: Rails environment to run as.
27
+ mongrel_conf: Path to conf file. Defaults to /etc/mongrel_cluster/app_name.conf
28
+ mongrel_user: User to run mongrels in cluster as. Unset by default
29
+ mongrel_group: Group to run mongrels in cluster as. Unset by default.
33
30
 
34
31
  Tasks (performed on :app role)
35
- configure_mongrel_cluster: Configure the cluster with variables.
36
- start_mongrel_cluster: Start Mongrel processes on the app server.
37
- stop_mongrel_cluster: Stop the Mongrel processes on the app server.
38
- restart_mongrel_cluster: Restart the Mongrel processes on the app server by starting and stopping mongrel_cluster.
39
- restart: Calls restart_mongrel_cluster to allow Mongrel to be used with the standard Capistrano deploy task.
40
- spinner: Calls start_mongrel_cluster to allow Mongrel to be used with the standard Capistrano cold_deploy task.
41
-
42
- Supporting starting clusters on boot.
32
+ configure_mongrel_cluster: Configure the cluster with variables.
33
+ start_mongrel_cluster: Start Mongrel processes on the app server.
34
+ stop_mongrel_cluster: Stop the Mongrel processes on the app server.
35
+ restart_mongrel_cluster: Restart the Mongrel processes on the app server by starting and stopping mongrel_cluster.
36
+ restart: Calls restart_mongrel_cluster to allow Mongrel to be used with the standard Capistrano deploy task.
37
+ spinner: Calls start_mongrel_cluster to allow Mongrel to be used with the standard Capistrano cold_deploy task.
38
+
39
+ == Capistrano 2.0 Recipes
40
+
41
+ Add to config/deploy.rb:
42
+ require 'mongrel_cluster/recipes_2'
43
+
44
+ Capistrano 2.0 uses namespaced tasks. The new task names are:
45
+ mongrel:cluster:configure Configure the cluster with variables.
46
+ mongrel:cluster:start: Start Mongrel processes on the app server.
47
+ mongrel:cluster:stop: Stop the Mongrel processes on the app server.
48
+ mongrel:cluster:restart: Restart the Mongrel processes on the app server by starting and stopping mongrel_cluster.
49
+ deploy:restart: Calls mongrel:cluster:restart to allow Mongrel to be used with the standard Capistrano deploy task.
50
+ deploy:start: Calls mongrel:cluster:start to allow Mongrel to be used with the standard Capistrano deploy task.
51
+ deploy:stop: Calls mongrel:cluster:stop to allow Mongrel to be used with the standard Capistrano deploy task.
52
+
53
+ == Starting clusters at boot
54
+
43
55
  1. Create mongrel_cluster conf directory (/etc/mongrel_cluster).
44
- 2. Assign ownership to your capistrano user.
56
+ 2. Assign ownership to your Capistrano user.
45
57
  3. Copy the init.d script from this gem's resouces directory /etc/init.d.
46
58
  4. chmod +x /etc/init.d/mongrel_cluster
47
59
  5. Add to init.d startup. On RHEL/CentOS use: /sbin/chkconfig --level 345 mongrel_cluster on
@@ -3,13 +3,14 @@
3
3
 
4
4
  require 'optparse'
5
5
 
6
- def run(command, verbose)
6
+ def run(command, verbose, clean=false)
7
7
  Dir.chdir @options[:conf_path] do
8
8
  confs = Dir.glob("*.yml")
9
9
  confs += Dir.glob("*.conf")
10
10
  confs.each do |conf|
11
11
  cmd = "mongrel_rails cluster::#{command} -C #{conf}"
12
12
  cmd += " -v" if verbose
13
+ cmd += " --clean" if clean
13
14
  puts cmd if verbose || command == "status"
14
15
  output = `#{cmd}`
15
16
  puts output if verbose || command == "status"
@@ -21,12 +22,14 @@ end
21
22
  @options = {}
22
23
  @options[:conf_path] = "/etc/mongrel_cluster"
23
24
  @options[:verbose] = false
25
+ @options[:clean] = false
24
26
 
25
27
  OptionParser.new do |opts|
26
28
  opts.banner = "Usage: #{$0} (start|stop|restart|status) [options]"
27
29
 
28
30
  opts.on("-c", "--conf_path PATH", "Path to mongrel_cluster configuration files") { |value| @options[:conf_path] = value }
29
31
  opts.on('-v', '--verbose', "Print all called commands and output.") { |value| @options[:verbose] = value }
32
+ opts.on('--clean', "Remove pid files if needed beforehand.") { |value| @options[:clean] = value }
30
33
 
31
34
  if ARGV.empty?
32
35
  puts opts
@@ -49,14 +52,14 @@ end
49
52
  case @cmd[0]
50
53
  when "start":
51
54
  puts "Starting all mongrel_clusters..."
52
- run "start", @options[:verbose]
55
+ run "start", @options[:verbose], @options[:clean]
53
56
  when "stop":
54
57
  puts "Stopping all mongrel_clusters..."
55
- run "stop", @options[:verbose]
58
+ run "stop", @options[:verbose], @options[:clean]
56
59
  when "restart":
57
60
  puts "Restarting all mongrel_clusters..."
58
- run "stop", @options[:verbose]
59
- run "start", @options[:verbose]
61
+ run "stop", @options[:verbose], @options[:clean]
62
+ run "start", @options[:verbose], @options[:clean]
60
63
  when "status":
61
64
  puts "Checking all mongrel_clusters..."
62
65
  run "status", @options[:verbose]
@@ -11,7 +11,7 @@ module Cluster
11
11
 
12
12
  def validate
13
13
  valid_exists?(@config_file, "Configuration file does not exist. Run mongrel_rails cluster::configure.")
14
- return @valid
14
+ @valid
15
15
  end
16
16
 
17
17
  def read_options
@@ -62,25 +62,28 @@ module Cluster
62
62
  argv = [ "mongrel_rails" ]
63
63
  argv << "start"
64
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"]
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 << "-o #{@options['timeout']}" if @options['timeout']
69
+ argv << "-t #{@options['throttle']}" if @options['throttle']
70
+ argv << "-m #{@options['mime_map']}" if @options['mime_map']
71
+ argv << "-r #{@options['docroot']}" if @options['docroot']
72
+ argv << "-n #{@options['num_procs']}" if @options['num_procs']
73
+ argv << "-B" if @options['debug']
74
+ argv << "-S #{@options['config_script']}" if @options['config_script']
75
+ argv << "--user #{@options['user']}" if @options['user']
76
+ argv << "--group #{@options['group']}" if @options['group']
77
+ argv << "--prefix #{@options['prefix']}" if @options['prefix']
77
78
  cmd = argv.join " "
78
79
 
79
80
  @ports.each do |port|
80
81
  if @clean && pid_file_exists?(port) && !check_process(port)
81
82
  pid_file = port_pid_file(port)
82
83
  log "missing process: removing #{pid_file}"
83
- File.unlink(pid_file)
84
+ chdir_cwd do
85
+ File.unlink(pid_file)
86
+ end
84
87
  end
85
88
 
86
89
  if pid_file_exists?(port) && check_process(port)
@@ -149,7 +152,7 @@ module Cluster
149
152
  puts ""
150
153
  end
151
154
 
152
- return status
155
+ status
153
156
  end
154
157
 
155
158
  def pid_file_exists?(port)
@@ -169,13 +172,17 @@ module Cluster
169
172
  else
170
173
  pid = find_pid(port)
171
174
  end
172
- return pid
175
+ pid
173
176
  end
174
177
 
175
- def cmd_name
176
- RUBY_PLATFORM =~ /solaris/i ? "args" : "command"
178
+ def cmd_name
179
+ RUBY_PLATFORM =~ /solaris|aix/i ? "args" : "command"
177
180
  end
178
-
181
+
182
+ def cmd_flags
183
+ RUBY_PLATFORM =~ /solaris|aix/i ? "-eo" : "-ewwo"
184
+ end
185
+
179
186
  def chdir_cwd
180
187
  pwd = Dir.pwd
181
188
  Dir.chdir(@options["cwd"]) if @options["cwd"]
@@ -189,21 +196,20 @@ module Cluster
189
196
  chdir_cwd do
190
197
  pid = File.read(pid_file)
191
198
  end
192
- return pid
199
+ pid
193
200
  end
194
201
 
195
202
  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))} /
203
+ ps_cmd = "ps #{cmd_flags} pid,#{cmd_name}"
204
+ ps_output = `#{ps_cmd}`
205
+ ps_output.each do |line|
206
+ if line =~ /-P #{Regexp.escape(port_pid_file(port))} /
200
207
  pid = line.split[0]
201
208
  return pid
202
209
  end
203
210
  end
204
- return nil
205
211
  end
206
-
212
+
207
213
  def log_error(message)
208
214
  log(message)
209
215
  end
@@ -282,7 +288,8 @@ module Cluster
282
288
  ['-l', '--log FILE', "Where to write log messages", :@log_file, "log/mongrel.log"],
283
289
  ['-P', '--pid FILE', "Where to write the PID", :@pid_file, "tmp/pids/mongrel.pid"],
284
290
  ['-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],
291
+ ['-o', '--timeout TIME', "Time to wait (in seconds) before killing a stalled thread", :@timeout, nil],
292
+ ['-t', '--throttle TIME', "Time to pause (in hundredths of a second) between accepting clients", :@throttle, nil],
286
293
  ['-m', '--mime PATH', "A YAML file that lists additional MIME types", :@mime_map, nil],
287
294
  ['-r', '--root PATH', "Set the document root (default 'public')", :@docroot, nil],
288
295
  ['-n', '--num-procs INT', "Number of processor threads to use", :@num_procs, nil],
@@ -302,7 +309,7 @@ module Cluster
302
309
  valid?(@servers > 0, "Must give a valid number of servers")
303
310
  valid_dir? File.dirname(@config_file), "Path to config file not valid: #{@config_file}"
304
311
 
305
- return @valid
312
+ @valid
306
313
  end
307
314
 
308
315
  def run
@@ -315,9 +322,10 @@ module Cluster
315
322
  @options["log_file"] = @log_file if @log_file
316
323
  @options["debug"] = @debug if @debug
317
324
  @options["num_procs"] = @num_procs if @num_procs
318
- @options["docroot"] = @docroot if @docroots
325
+ @options["docroot"] = @docroot if @docroot
319
326
  @options["address"] = @address if @address
320
327
  @options["timeout"] = @timeout if @timeout
328
+ @options["throttle"] = @throttle if @throttle
321
329
  @options["environment"] = @environment if @environment
322
330
  @options["mime_map"] = @mime_map if @mime_map
323
331
  @options["config_script"] = @config_script if @config_script
@@ -0,0 +1,58 @@
1
+
2
+ # Gem::Specification for Mongrel_cluster-1.0.3
3
+ # Originally generated by Echoe
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = %q{mongrel_cluster}
7
+ s.version = "1.0.3"
8
+
9
+ s.specification_version = 2 if s.respond_to? :specification_version=
10
+
11
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
+ s.authors = ["Bradley Taylor"]
13
+ s.date = %q{2007-10-26}
14
+ s.default_executable = %q{mongrel_cluster_ctl}
15
+ s.description = %q{Mongrel plugin that provides commands and Capistrano tasks for managing multiple Mongrel processes.}
16
+ s.email = %q{}
17
+ s.executables = ["mongrel_cluster_ctl"]
18
+ s.files = ["resources/mongrel_cluster", "resources/defaults.yaml", "README", "Manifest", "LICENSE", "lib/mongrel_cluster/recipes.rb", "lib/mongrel_cluster/init.rb", "COPYING", "CHANGELOG", "bin/mongrel_cluster_ctl", "mongrel_cluster.gemspec"]
19
+ s.homepage = %q{}
20
+ s.require_paths = ["lib"]
21
+ s.rubyforge_project = %q{mongrel}
22
+ s.rubygems_version = %q{0.9.4.6}
23
+ s.summary = %q{Mongrel plugin that provides commands and Capistrano tasks for managing multiple Mongrel processes.}
24
+
25
+ s.add_dependency(%q<gem_plugin>, [">= 0.2.3"])
26
+ s.add_dependency(%q<mongrel>, [">= 1.0.2"])
27
+ end
28
+
29
+
30
+ # # Original Rakefile source (requires the Echoe gem):
31
+ #
32
+ #
33
+ # require 'echoe'
34
+ #
35
+ # Echoe.new("mongrel_cluster") do |p|
36
+ # p.summary = "Mongrel plugin that provides commands and Capistrano tasks for managing multiple Mongrel processes."
37
+ # p.project = "mongrel"
38
+ # p.author="Bradley Taylor"
39
+ # p.dependencies = ['gem_plugin >=0.2.3', 'mongrel >=1.0.2']
40
+ # p.has_rdoc = false
41
+ #
42
+ # p.need_tar_gz = false
43
+ # p.need_tgz = true
44
+ # p.require_signed = true
45
+ # end
46
+ #
47
+ # # Is this still used?
48
+ # task :gem_source do
49
+ # mkdir_p "pkg/gems"
50
+ #
51
+ # FileList["**/*.gem"].each { |gem| mv gem, "pkg/gems" }
52
+ # FileList["pkg/*.tgz"].each {|tgz| rm tgz }
53
+ # rm_rf "pkg/#{name}-#{version}"
54
+ #
55
+ # sh %{ generate_yaml_index.rb -d pkg }
56
+ # sh %{ scp -r pkg/* #{ENV['SSH_USER']}@rubyforge.org:/var/www/gforge-projects/mongrel/releases/ }
57
+ # end
58
+ #
metadata CHANGED
@@ -1,52 +1,101 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.9.2
3
- specification_version: 1
2
+ rubygems_version: 0.9.4.6
3
+ specification_version: 2
4
4
  name: mongrel_cluster
5
5
  version: !ruby/object:Gem::Version
6
- version: 1.0.2
7
- date: 2007-07-10 00:00:00 -04:00
6
+ version: 1.0.3
7
+ date: 2007-10-26 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
11
- email:
12
- homepage:
13
- rubyforge_project:
11
+ email: ""
12
+ homepage: ""
13
+ rubyforge_project: mongrel
14
14
  description: Mongrel plugin that provides commands and Capistrano tasks for managing multiple Mongrel processes.
15
15
  autorequire:
16
- default_executable: mongrel_cluster_ctl
16
+ default_executable:
17
17
  bindir: bin
18
18
  has_rdoc: false
19
- required_ruby_version: !ruby/object:Gem::Version::Requirement
19
+ required_ruby_version: !ruby/object:Gem::Requirement
20
20
  requirements:
21
- - - ">"
21
+ - - ">="
22
22
  - !ruby/object:Gem::Version
23
- version: 0.0.0
23
+ version: "0"
24
+ version:
25
+ required_rubygems_version: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: "0"
24
30
  version:
25
31
  platform: ruby
26
32
  signing_key:
27
33
  cert_chain:
34
+ - |
35
+ -----BEGIN CERTIFICATE-----
36
+ MIIDUDCCAjigAwIBAgIBADANBgkqhkiG9w0BAQUFADBOMRwwGgYDVQQDDBNtb25n
37
+ cmVsLWRldmVsb3BtZW50MRkwFwYKCZImiZPyLGQBGRYJcnVieWZvcmdlMRMwEQYK
38
+ CZImiZPyLGQBGRYDb3JnMB4XDTA3MDkxNjEwMzI0OVoXDTA4MDkxNTEwMzI0OVow
39
+ TjEcMBoGA1UEAwwTbW9uZ3JlbC1kZXZlbG9wbWVudDEZMBcGCgmSJomT8ixkARkW
40
+ CXJ1Ynlmb3JnZTETMBEGCgmSJomT8ixkARkWA29yZzCCASIwDQYJKoZIhvcNAQEB
41
+ BQADggEPADCCAQoCggEBAMb9v3B01eOHk3FyypbQgKXzJplUE5P6dXoG+xpPm0Lv
42
+ P7BQmeMncOwqQ7zXpVQU+lTpXtQFTsOE3vL7KnhQFJKGvUAkbh24VFyopu1I0yqF
43
+ mGu4nRqNXGXVj8TvLSj4S1WpSRLAa0acLPNyKhGmoV9+crqQypSjM6XKjBeppifo
44
+ 4eBmWGjiJEYMIJBvJZPJ4rAVDDA8C6CM1m3gMBGNh8ELDhU8HI9AP3dMIkTI2Wx9
45
+ 9xkJwHdroAaS0IFFtYChrwee4FbCF1FHDgoTosMwa47DrLHg4hZ6ojaKwK5QVWEV
46
+ XGb6ju5UqpktnSWF2W+Lvl/K0tI42OH2CAhebT1gEVUCAwEAAaM5MDcwCQYDVR0T
47
+ BAIwADALBgNVHQ8EBAMCBLAwHQYDVR0OBBYEFGHChyMSZ16u9WOzKhgJSQ9lqDc5
48
+ MA0GCSqGSIb3DQEBBQUAA4IBAQA/lfeN2WdB1xN+82tT7vNS4HOjRQw6MUh5yktu
49
+ GQjaGqm0UB+aX0Z9y0B0qpfv9rj7nmIvEGiwBmDepNWYCGuW15JyqpN7QVVnG2xS
50
+ Mrame7VqgjM7A+VGDD5In5LtWbM/CHAATvvFlQ5Ph13YE1EdnVbZ65c+KQv+5sFY
51
+ Q+zEop74d878uaC/SAHHXS46TiXneocaLSYw1CEZs/MAIy+9c4Q5ESbGpgnfg1Ad
52
+ 6lwl7k3hsNHO/+tZzx4HJtOXDI1yAl3+q6T9J0yI3z97EinwvAKhS1eyOI2Y5eeT
53
+ tbQaNYkU127B3l/VNpd8fQm3Jkl/PqCCmDBQjUszFrJEODug
54
+ -----END CERTIFICATE-----
55
+
56
+ - |
57
+ -----BEGIN CERTIFICATE-----
58
+ MIIDPzCCAiegAwIBAgIBADANBgkqhkiG9w0BAQUFADBOMRwwGgYDVQQDDBNtb25n
59
+ cmVsLWRldmVsb3BtZW50MRkwFwYKCZImiZPyLGQBGRYJcnVieWZvcmdlMRMwEQYK
60
+ CZImiZPyLGQBGRYDb3JnMB4XDTA3MDkxNjEwMzMwMFoXDTA4MDkxNTEwMzMwMFow
61
+ PTENMAsGA1UEAwwEZXZhbjEYMBYGCgmSJomT8ixkARkWCGNsb3VkYnVyMRIwEAYK
62
+ CZImiZPyLGQBGRYCc3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDk
63
+ LQijz2fICmev4+9s0WB71WzJFYCUYFQQxqGlenbxWut9dlPSsBbskGjg+UITeOXi
64
+ cTh3MTqAB0i1LJyNOiyvDsAivn7GjKXhVvflp2/npMhBBe83P4HOWqeQBjkk3QJI
65
+ FFNBvqbFLeEXIP+HiqAOiyNHZEVXMepLEJLzGrg3Ly7M7A6L5fK7jDrt8jkm+c+8
66
+ zGquVHV5ohAebGd/vpHMLjpA7lCG5+MBgYZd33rRfNtCxDJMNRgnOu9PsB05+LJn
67
+ MpDKQq3x0SkOf5A+MVOcadNCaAkFflYk3SUcXaXWxu/eCHgqfW1m76RNSp5djpKE
68
+ CgNPK9lGIWpB3CHzDaVNAgMBAAGjOTA3MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSw
69
+ MB0GA1UdDgQWBBT5aonPfFBdJ5rWFG+8dZwgyB54LjANBgkqhkiG9w0BAQUFAAOC
70
+ AQEAiKbzWgMcvZs/TPwJxr8tJ+7mSGz7+zDkWcbBl8FpQq1DtRcATh1oyTkQT7t+
71
+ rFEBYMmb0FxbbUnojQp8hIFgFkUwFpStwWBL/okLSehntzI2iwjuEtfj4ac9Q3Y2
72
+ uSdbmZqsQTuu+lEUc5C4qLK7YKwToaul+cx7vWxyk1YendcVwRlFLIBqA5cPrwo3
73
+ yyGLTHlRYn2c9PSbM1B63Yg+LqSSAa4QSU3Wv9pNdffVpvwHPVEQpO7ZDo5slQFL
74
+ Gf6+gbD/eZAvhpvmn8JlXb+LxKaFVMs2Yvrk1xOuT76SsPjEGWxkr7jZCIpsYfgQ
75
+ ALN3mi/9z0Mf1YroliUgF0v5Yw==
76
+ -----END CERTIFICATE-----
77
+
28
78
  post_install_message:
29
79
  authors:
30
80
  - Bradley Taylor
31
81
  files:
32
- - COPYING
33
- - LICENSE
82
+ - resources/mongrel_cluster
83
+ - resources/defaults.yaml
34
84
  - README
35
- - Rakefile
36
- - bin/mongrel_cluster_ctl
37
- - lib/mongrel_cluster
85
+ - Manifest
86
+ - LICENSE
38
87
  - lib/mongrel_cluster/recipes.rb
39
- - lib/mongrel_cluster/init.rb~
40
88
  - lib/mongrel_cluster/init.rb
41
- - tools/rakehelp.rb
42
- - resources/mongrel_cluster
43
- - resources/defaults.yaml
89
+ - COPYING
90
+ - CHANGELOG
91
+ - bin/mongrel_cluster_ctl
92
+ - mongrel_cluster.gemspec
44
93
  test_files: []
45
94
 
46
95
  rdoc_options: []
47
96
 
48
- extra_rdoc_files:
49
- - README
97
+ extra_rdoc_files: []
98
+
50
99
  executables:
51
100
  - mongrel_cluster_ctl
52
101
  extensions: []
@@ -57,18 +106,18 @@ dependencies:
57
106
  - !ruby/object:Gem::Dependency
58
107
  name: gem_plugin
59
108
  version_requirement:
60
- version_requirements: !ruby/object:Gem::Version::Requirement
109
+ version_requirements: !ruby/object:Gem::Requirement
61
110
  requirements:
62
111
  - - ">="
63
112
  - !ruby/object:Gem::Version
64
- version: 0.2.2
113
+ version: 0.2.3
65
114
  version:
66
115
  - !ruby/object:Gem::Dependency
67
116
  name: mongrel
68
117
  version_requirement:
69
- version_requirements: !ruby/object:Gem::Version::Requirement
118
+ version_requirements: !ruby/object:Gem::Requirement
70
119
  requirements:
71
120
  - - ">="
72
121
  - !ruby/object:Gem::Version
73
- version: 1.0.1
122
+ version: 1.0.2
74
123
  version:
Binary file
data/Rakefile DELETED
@@ -1,54 +0,0 @@
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="1.0.2"
19
- name="mongrel_cluster"
20
-
21
- setup_gem(name, version) do |spec|
22
- spec.summary = "Mongrel plugin that provides commands and Capistrano tasks for managing multiple Mongrel processes."
23
- spec.description = spec.summary
24
- spec.author="Bradley Taylor"
25
- spec.add_dependency('gem_plugin', '>= 0.2.2')
26
- spec.add_dependency('mongrel', '>= 1.0.1')
27
- spec.files += Dir.glob("resources/**/*")
28
- spec.has_rdoc = false
29
- spec.files += Dir.glob("bin/*")
30
- spec.files += Dir.glob("examples/*")
31
- spec.default_executable = "mongrel_cluster_ctl"
32
- spec.executables = ["mongrel_cluster_ctl"]
33
- end
34
-
35
-
36
- task :install => [:test, :package] do
37
- sh %{sudo gem install pkg/#{name}-#{version}.gem}
38
- end
39
-
40
- task :uninstall => [:clean] do
41
- sh %{sudo gem uninstall #{name}}
42
- end
43
-
44
- task :gem_source do
45
- mkdir_p "pkg/gems"
46
-
47
- FileList["**/*.gem"].each { |gem| mv gem, "pkg/gems" }
48
- FileList["pkg/*.tgz"].each {|tgz| rm tgz }
49
- rm_rf "pkg/#{name}-#{version}"
50
-
51
- sh %{ generate_yaml_index.rb -d pkg }
52
- sh %{ scp -r pkg/* #{ENV['SSH_USER']}@rubyforge.org:/var/www/gforge-projects/mongrel/releases/ }
53
- end
54
-
@@ -1,351 +0,0 @@
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
-
@@ -1,105 +0,0 @@
1
-
2
- def make(makedir)
3
- Dir.chdir(makedir) do
4
- sh(PLATFORM =~ /win32/ ? 'nmake' : 'make')
5
- end
6
- end
7
-
8
-
9
- def extconf(dir)
10
- Dir.chdir(dir) do ruby "extconf.rb" end
11
- end
12
-
13
-
14
- def setup_tests
15
- Rake::TestTask.new do |t|
16
- t.libs << "test"
17
- t.test_files = FileList['test/test*.rb']
18
- t.verbose = true
19
- end
20
- end
21
-
22
-
23
- def setup_clean otherfiles
24
- files = ['build/*', '**/*.o', '**/*.so', '**/*.a', 'lib/*-*', '**/*.log'] + otherfiles
25
- CLEAN.include(files)
26
- end
27
-
28
-
29
- def setup_rdoc files
30
- Rake::RDocTask.new do |rdoc|
31
- rdoc.rdoc_dir = 'doc/rdoc'
32
- rdoc.options << '--line-numbers'
33
- rdoc.rdoc_files.add(files)
34
- end
35
- end
36
-
37
-
38
- def setup_extension(dir, extension)
39
- ext = "ext/#{dir}"
40
- ext_so = "#{ext}/#{extension}.#{Config::CONFIG['DLEXT']}"
41
- ext_files = FileList[
42
- "#{ext}/*.c",
43
- "#{ext}/*.h",
44
- "#{ext}/extconf.rb",
45
- "#{ext}/Makefile",
46
- "lib"
47
- ]
48
-
49
- task "lib" do
50
- directory "lib"
51
- end
52
-
53
- desc "Builds just the #{extension} extension"
54
- task extension.to_sym => ["#{ext}/Makefile", ext_so ]
55
-
56
- file "#{ext}/Makefile" => ["#{ext}/extconf.rb"] do
57
- extconf "#{ext}"
58
- end
59
-
60
- file ext_so => ext_files do
61
- make "#{ext}"
62
- cp ext_so, "lib"
63
- end
64
- end
65
-
66
-
67
- def base_gem_spec(pkg_name, pkg_version)
68
- pkg_version = pkg_version
69
- pkg_name = pkg_name
70
- pkg_file_name = "#{pkg_name}-#{pkg_version}"
71
- Gem::Specification.new do |s|
72
- s.name = pkg_name
73
- s.version = pkg_version
74
- s.platform = Gem::Platform::RUBY
75
- s.has_rdoc = true
76
- s.extra_rdoc_files = [ "README" ]
77
-
78
- s.files = %w(COPYING LICENSE README Rakefile) +
79
- Dir.glob("{bin,doc/rdoc,test,lib}/**/*") +
80
- Dir.glob("ext/**/*.{h,c,rb}") +
81
- Dir.glob("examples/**/*.rb") +
82
- Dir.glob("tools/*.rb")
83
-
84
- s.require_path = "lib"
85
- s.extensions = FileList["ext/**/extconf.rb"].to_a
86
- s.bindir = "bin"
87
- end
88
- end
89
-
90
- def setup_gem(pkg_name, pkg_version)
91
- spec = base_gem_spec(pkg_name, pkg_version)
92
- yield spec if block_given?
93
-
94
- Rake::GemPackageTask.new(spec) do |p|
95
- p.gem_spec = spec
96
- p.need_tar = true
97
- end
98
- end
99
-
100
- def setup_win32_gem(pkg_name, pkg_version)
101
- spec = base_gem_spec(pkg_name, pkg_version)
102
- yield spec if block_given?
103
-
104
- Gem::Builder.new(spec).build
105
- end