golden_brindle 0.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/VERSION +1 -1
- data/golden_brindle.gemspec +4 -2
- data/lib/golden_brindle/cluster.rb +4 -8
- data/lib/golden_brindle/command.rb +13 -19
- data/lib/golden_brindle/configure.rb +2 -2
- data/lib/golden_brindle/const.rb +1 -1
- data/lib/golden_brindle/hooks.rb +70 -0
- data/lib/golden_brindle/rails_support.rb +80 -0
- data/lib/golden_brindle/restart.rb +1 -1
- data/lib/golden_brindle/start.rb +47 -152
- data/lib/golden_brindle.rb +2 -0
- metadata +4 -2
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2
|
data/golden_brindle.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{golden_brindle}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.2"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Alexander Simonov"]
|
12
|
-
s.date = %q{2011-09-
|
12
|
+
s.date = %q{2011-09-03}
|
13
13
|
s.default_executable = %q{golden_brindle}
|
14
14
|
s.description = %q{Unicorn HTTP server multiple application runner tool}
|
15
15
|
s.email = %q{alex@simonov.me}
|
@@ -34,6 +34,8 @@ Gem::Specification.new do |s|
|
|
34
34
|
"lib/golden_brindle/command.rb",
|
35
35
|
"lib/golden_brindle/configure.rb",
|
36
36
|
"lib/golden_brindle/const.rb",
|
37
|
+
"lib/golden_brindle/hooks.rb",
|
38
|
+
"lib/golden_brindle/rails_support.rb",
|
37
39
|
"lib/golden_brindle/restart.rb",
|
38
40
|
"lib/golden_brindle/start.rb",
|
39
41
|
"lib/golden_brindle/stop.rb",
|
@@ -13,8 +13,8 @@ module Cluster
|
|
13
13
|
|
14
14
|
def validate
|
15
15
|
@cwd = File.expand_path(@cwd)
|
16
|
-
valid_dir? @cwd, "Invalid path to golden_brindle configuration files:
|
17
|
-
|
16
|
+
valid_dir? @cwd, "Invalid path to golden_brindle configuration files: #{@cwd}"
|
17
|
+
@valid
|
18
18
|
end
|
19
19
|
|
20
20
|
def run
|
@@ -22,9 +22,7 @@ module Cluster
|
|
22
22
|
counter = 0
|
23
23
|
errors = 0
|
24
24
|
Dir.chdir @cwd do
|
25
|
-
|
26
|
-
confs += Dir.glob("*.conf")
|
27
|
-
confs.each do |conf|
|
25
|
+
Dir.glob("**/*.{yml,conf}").each do |conf|
|
28
26
|
cmd = "golden_brindle #{command} -C #{conf}"
|
29
27
|
cmd += " -d" if command == "start" #daemonize only when start
|
30
28
|
puts cmd if @verbose
|
@@ -32,8 +30,7 @@ module Cluster
|
|
32
30
|
puts output if @verbose
|
33
31
|
status = $?.success?
|
34
32
|
puts "golden_brindle #{command} returned an error." unless status
|
35
|
-
counter += 1
|
36
|
-
errors += 1 unless status
|
33
|
+
status ? counter += 1 : errors += 1
|
37
34
|
end
|
38
35
|
end
|
39
36
|
puts "Success:#{counter}; Errors: #{errors}"
|
@@ -43,7 +40,6 @@ module Cluster
|
|
43
40
|
|
44
41
|
class Start < GemPlugin::Plugin "/commands"
|
45
42
|
include Cluster::Base
|
46
|
-
|
47
43
|
end
|
48
44
|
|
49
45
|
class Stop < GemPlugin::Plugin "/commands"
|
@@ -7,7 +7,7 @@ module GoldenBrindle
|
|
7
7
|
begin
|
8
8
|
Process.kill(signal, pid)
|
9
9
|
rescue Errno::ESRCH
|
10
|
-
puts "Process does not exist.
|
10
|
+
puts "Process does not exist. Not running."
|
11
11
|
end
|
12
12
|
puts "Done."
|
13
13
|
end
|
@@ -30,8 +30,7 @@ module GoldenBrindle
|
|
30
30
|
end
|
31
31
|
end
|
32
32
|
end
|
33
|
-
|
34
|
-
|
33
|
+
|
35
34
|
# Called by the subclass to setup the command and parse the argv arguments.
|
36
35
|
# The call is destructive on argv since it uses the OptionParser#parse! function.
|
37
36
|
def initialize(options={})
|
@@ -42,9 +41,7 @@ module GoldenBrindle
|
|
42
41
|
# this is retarded, but it has to be done this way because -h and -v exit
|
43
42
|
@done_validating = false
|
44
43
|
@original_args = argv.dup
|
45
|
-
|
46
44
|
configure
|
47
|
-
|
48
45
|
# I need to add my own -h definition to prevent the -h by default from exiting.
|
49
46
|
@opt.on_tail("-h", "--help", "Show this message") do
|
50
47
|
@done_validating = true
|
@@ -58,7 +55,6 @@ module GoldenBrindle
|
|
58
55
|
puts "Version #{GoldenBrindle::Const::VERSION}"
|
59
56
|
end
|
60
57
|
end
|
61
|
-
|
62
58
|
@opt.parse! argv
|
63
59
|
end
|
64
60
|
|
@@ -94,7 +90,7 @@ module GoldenBrindle
|
|
94
90
|
|
95
91
|
# Returns true/false depending on whether the command is configured properly.
|
96
92
|
def validate
|
97
|
-
|
93
|
+
@valid
|
98
94
|
end
|
99
95
|
|
100
96
|
# Returns a help message. Defaults to OptionParser#help which should be good.
|
@@ -108,10 +104,9 @@ module GoldenBrindle
|
|
108
104
|
raise NotImplementedError
|
109
105
|
end
|
110
106
|
|
111
|
-
|
112
107
|
# Validates the given expression is true and prints the message if not, exiting.
|
113
108
|
def valid?(exp, message)
|
114
|
-
if
|
109
|
+
if !@done_validating && !exp
|
115
110
|
failure message
|
116
111
|
@valid = false
|
117
112
|
@done_validating = true
|
@@ -120,22 +115,21 @@ module GoldenBrindle
|
|
120
115
|
|
121
116
|
# Validates that a file exists and if not displays the message
|
122
117
|
def valid_exists?(file, message)
|
123
|
-
valid?(
|
118
|
+
valid?(File.exist?(file), message)
|
124
119
|
end
|
125
120
|
|
126
|
-
|
127
121
|
# Validates that the file is a file and not a directory or something else.
|
128
122
|
def valid_file?(file, message)
|
129
|
-
valid?(
|
123
|
+
valid?(File.file?(file), message)
|
130
124
|
end
|
131
125
|
|
132
126
|
# Validates that the given directory exists
|
133
127
|
def valid_dir?(file, message)
|
134
|
-
valid?(
|
128
|
+
valid?(File.directory?(file), message)
|
135
129
|
end
|
136
130
|
|
137
131
|
def can_change_user?
|
138
|
-
|
132
|
+
valid?(Process.euid.to_i == 0, "if you want to change workers UID/GID you must run script from root")
|
139
133
|
end
|
140
134
|
|
141
135
|
def valid_user?(user)
|
@@ -175,7 +169,7 @@ module GoldenBrindle
|
|
175
169
|
def commands
|
176
170
|
pmgr = GemPlugin::Manager.instance
|
177
171
|
list = pmgr.plugins["/commands"].keys
|
178
|
-
|
172
|
+
list.sort
|
179
173
|
end
|
180
174
|
|
181
175
|
# Prints a list of available commands.
|
@@ -227,16 +221,16 @@ module GoldenBrindle
|
|
227
221
|
# Normally the command is NOT valid right after being created
|
228
222
|
# but sometimes (like with -h or -v) there's no further processing
|
229
223
|
# needed so the command is already valid so we can skip it.
|
230
|
-
if
|
231
|
-
if
|
232
|
-
STDERR.puts "#{cmd_name} reported an error. Use
|
224
|
+
if !command.done_validating
|
225
|
+
if !command.validate
|
226
|
+
STDERR.puts "#{cmd_name} reported an error. Use golden_brindle #{cmd_name} -h to get help."
|
233
227
|
return false
|
234
228
|
else
|
235
229
|
command.run
|
236
230
|
end
|
237
231
|
end
|
238
232
|
|
239
|
-
|
233
|
+
true
|
240
234
|
end
|
241
235
|
end
|
242
236
|
|
@@ -32,7 +32,7 @@ module Brindle
|
|
32
32
|
valid_dir? File.dirname(@config_file), "Path to config file not valid: #{@config_file}"
|
33
33
|
|
34
34
|
if @config_script
|
35
|
-
valid_exists?(@config_script, "Unicorn-specific config file not there:
|
35
|
+
valid_exists?(@config_script, "Unicorn-specific config file not there: #{@config_script}")
|
36
36
|
return false unless @valid
|
37
37
|
end
|
38
38
|
|
@@ -41,7 +41,7 @@ module Brindle
|
|
41
41
|
valid_dir? File.dirname(@pid_file), "Path to pid file not valid: #@pid_file"
|
42
42
|
valid_user? @user if @user
|
43
43
|
valid_group? @group if @group
|
44
|
-
|
44
|
+
@valid
|
45
45
|
end
|
46
46
|
|
47
47
|
def run
|
data/lib/golden_brindle/const.rb
CHANGED
@@ -0,0 +1,70 @@
|
|
1
|
+
module Brindle
|
2
|
+
module Hooks
|
3
|
+
def collect_hooks
|
4
|
+
[:after_fork, :after_reload, :before_fork, :before_exec].inject({}) do |memo, sym|
|
5
|
+
memo[sym] = send(sym)
|
6
|
+
memo
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def after_fork
|
11
|
+
lambda do |server, worker|
|
12
|
+
defined?(ActiveRecord::Base) and
|
13
|
+
ActiveRecord::Base.establish_connection
|
14
|
+
# trying to change user and group
|
15
|
+
begin
|
16
|
+
# check if something not set in config or cli
|
17
|
+
unless @user.nil? || @group.nil?
|
18
|
+
uid, gid = Process.euid, Process.egid
|
19
|
+
user, group = @user, @group
|
20
|
+
target_uid = Etc.getpwnam(user).uid
|
21
|
+
target_gid = Etc.getgrnam(group).gid
|
22
|
+
worker.tmp.chown(target_uid, target_gid)
|
23
|
+
if uid != target_uid || gid != target_gid
|
24
|
+
Process.initgroups(user, target_gid)
|
25
|
+
Process::GID.change_privilege(target_gid)
|
26
|
+
Process::UID.change_privilege(target_uid)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
rescue => e
|
30
|
+
if ENV['RAILS_ENV'] == 'development'
|
31
|
+
STDERR.puts "couldn't change user, oh well"
|
32
|
+
else
|
33
|
+
raise e
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def before_fork
|
40
|
+
lambda do |server, worker|
|
41
|
+
defined?(ActiveRecord::Base) and
|
42
|
+
ActiveRecord::Base.connection.disconnect!
|
43
|
+
# http://rubyenterpriseedition.com/faq.html#adapt_apps_for_cow
|
44
|
+
if GC.respond_to?(:copy_on_write_friendly=)
|
45
|
+
GC.copy_on_write_friendly = true
|
46
|
+
end
|
47
|
+
old_pid = "#{server.config[:pid]}.oldbin"
|
48
|
+
if File.exists?(old_pid) && server.pid != old_pid
|
49
|
+
begin
|
50
|
+
Process.kill("QUIT", File.read(old_pid).to_i)
|
51
|
+
rescue Errno::ENOENT, Errno::ESRCH
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def after_reload
|
58
|
+
lambda do
|
59
|
+
::FileUtils.mkdir_p(%w(cache pids sessions sockets).map! { |d| "tmp/#{d}" })
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def before_exec
|
64
|
+
lambda do |server|
|
65
|
+
ENV["BUNDLE_GEMFILE"] = "#{@cwd}/Gemfile" if @bundler
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
module Brindle
|
2
|
+
class RailsSupport
|
3
|
+
class << self
|
4
|
+
|
5
|
+
def rails3?
|
6
|
+
::Rails::VERSION::MAJOR == 3
|
7
|
+
end
|
8
|
+
|
9
|
+
def rails2?
|
10
|
+
::Rails::VERSION::MAJOR == 2
|
11
|
+
end
|
12
|
+
|
13
|
+
def support_rack?
|
14
|
+
return true if rails3?
|
15
|
+
return true if rails2? && ::Rails::VERSION::MINOR >= 3
|
16
|
+
false
|
17
|
+
end
|
18
|
+
|
19
|
+
def rails3_application
|
20
|
+
return unless rails3? || ::File.exist?('config/application.rb')
|
21
|
+
return Object.const_get($1)::Application if \
|
22
|
+
::File.read('config/application.rb') =~ /^module\s+([\w:]+)\s*$/
|
23
|
+
rescue NameError
|
24
|
+
nil
|
25
|
+
end
|
26
|
+
|
27
|
+
def rails_dispatcher
|
28
|
+
result = rails3_application
|
29
|
+
if result.nil? && defined?(ActionController::Dispatcher)
|
30
|
+
result = ActionController::Dispatcher.new
|
31
|
+
end
|
32
|
+
result || abort("Unable to locate the application dispatcher class")
|
33
|
+
end
|
34
|
+
|
35
|
+
def rails_builder(daemonize)
|
36
|
+
# this lambda won't run until after forking if preload_app is false
|
37
|
+
lambda do
|
38
|
+
# Load Rails
|
39
|
+
begin
|
40
|
+
require ::File.expand_path('config/boot')
|
41
|
+
require ::File.expand_path('config/environment')
|
42
|
+
rescue LoadError => e
|
43
|
+
abort "#{$0} must be run inside RAILS_ROOT: #{e.inspect}"
|
44
|
+
end
|
45
|
+
|
46
|
+
defined?(::Rails::VERSION::STRING) or
|
47
|
+
abort "Rails::VERSION::STRING not defined by config/{boot,environment}"
|
48
|
+
|
49
|
+
old_rails = !support_rack?
|
50
|
+
|
51
|
+
::Rack::Builder.new do
|
52
|
+
map_path = ENV['RAILS_RELATIVE_URL_ROOT'] || '/'
|
53
|
+
if old_rails
|
54
|
+
if map_path != '/'
|
55
|
+
warn "relative URL roots may not work for older Rails"
|
56
|
+
end
|
57
|
+
warn "LogTailer not available for Rails < 2.3" unless daemonize
|
58
|
+
warn "Debugger not available" if $DEBUG
|
59
|
+
require 'unicorn/app/old_rails'
|
60
|
+
map(map_path) do
|
61
|
+
use Unicorn::App::OldRails::Static
|
62
|
+
run Unicorn::App::OldRails.new
|
63
|
+
end
|
64
|
+
else
|
65
|
+
use Rails::Rack::LogTailer unless daemonize
|
66
|
+
use Rails::Rack::Debugger if $DEBUG
|
67
|
+
map(map_path) do
|
68
|
+
unless defined?(ActionDispatch::Static)
|
69
|
+
use Rails::Rack::Static
|
70
|
+
end
|
71
|
+
run Brindle::RailsSupport.rails_dispatcher
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end.to_app
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
data/lib/golden_brindle/start.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
|
-
|
2
1
|
module Brindle
|
3
2
|
|
4
3
|
class Start < GemPlugin::Plugin "/commands"
|
5
4
|
include GoldenBrindle::Command::Base
|
5
|
+
include Hooks
|
6
6
|
|
7
7
|
def configure
|
8
8
|
options [
|
@@ -28,80 +28,7 @@ module Brindle
|
|
28
28
|
]
|
29
29
|
end
|
30
30
|
|
31
|
-
|
32
|
-
#
|
33
|
-
# Rails 3 dispatcher support
|
34
|
-
# Code from unicorn_rails script
|
35
|
-
#
|
36
|
-
def self.rails_dispatcher
|
37
|
-
if ::Rails::VERSION::MAJOR >= 3 && ::File.exist?('config/application.rb')
|
38
|
-
if ::File.read('config/application.rb') =~ /^module\s+([\w:]+)\s*$/
|
39
|
-
app_module = Object.const_get($1)
|
40
|
-
begin
|
41
|
-
result = app_module::Application
|
42
|
-
rescue NameError
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
if result.nil? && defined?(ActionController::Dispatcher)
|
48
|
-
result = ActionController::Dispatcher.new
|
49
|
-
end
|
50
|
-
|
51
|
-
result || abort("Unable to locate the application dispatcher class")
|
52
|
-
end
|
53
|
-
|
54
|
-
def rails_builder(daemonize)
|
55
|
-
# this lambda won't run until after forking if preload_app is false
|
56
|
-
lambda do ||
|
57
|
-
# Load Rails
|
58
|
-
begin
|
59
|
-
require ::File.expand_path('config/boot')
|
60
|
-
require ::File.expand_path('config/environment')
|
61
|
-
rescue LoadError => err
|
62
|
-
abort "#$0 must be run inside RAILS_ROOT: #{err.inspect}"
|
63
|
-
end
|
64
|
-
|
65
|
-
defined?(::Rails::VERSION::STRING) or
|
66
|
-
abort "Rails::VERSION::STRING not defined by config/{boot,environment}"
|
67
|
-
# it seems Rails >=2.2 support Rack, but only >=2.3 requires it
|
68
|
-
old_rails = case ::Rails::VERSION::MAJOR
|
69
|
-
when 0, 1 then true
|
70
|
-
when 2 then Rails::VERSION::MINOR < 3 ? true : false
|
71
|
-
else
|
72
|
-
false
|
73
|
-
end
|
74
|
-
|
75
|
-
Rack::Builder.new do
|
76
|
-
map_path = ENV['RAILS_RELATIVE_URL_ROOT'] || '/'
|
77
|
-
if old_rails
|
78
|
-
if map_path != '/'
|
79
|
-
# patches + tests welcome, but I really cbf to deal with this
|
80
|
-
# since all apps I've ever dealt with just use "/" ...
|
81
|
-
warn "relative URL roots may not work for older Rails"
|
82
|
-
end
|
83
|
-
warn "LogTailer not available for Rails < 2.3" unless daemonize
|
84
|
-
warn "Debugger not available" if $DEBUG
|
85
|
-
require 'unicorn/app/old_rails'
|
86
|
-
map(map_path) do
|
87
|
-
use Unicorn::App::OldRails::Static
|
88
|
-
run Unicorn::App::OldRails.new
|
89
|
-
end
|
90
|
-
else
|
91
|
-
use Rails::Rack::LogTailer unless daemonize
|
92
|
-
use Rails::Rack::Debugger if $DEBUG
|
93
|
-
map(map_path) do
|
94
|
-
unless defined?(ActionDispatch::Static)
|
95
|
-
use Rails::Rack::Static
|
96
|
-
end
|
97
|
-
run Brindle::Start.rails_dispatcher
|
98
|
-
end
|
99
|
-
end
|
100
|
-
end.to_app
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
|
-
def validate
|
31
|
+
def validate
|
105
32
|
if @config_file
|
106
33
|
valid_exists?(@config_file, "Config file not there: #@config_file")
|
107
34
|
return false unless @valid
|
@@ -127,7 +54,44 @@ module Brindle
|
|
127
54
|
valid_dir? File.dirname(File.join(@cwd,@pid_file)), "Path to pid file not valid: #{@pid_file}"
|
128
55
|
valid_user? @user if @user
|
129
56
|
valid_group? @group if @group
|
130
|
-
|
57
|
+
@valid
|
58
|
+
end
|
59
|
+
|
60
|
+
def default_options
|
61
|
+
{
|
62
|
+
:listeners => [],
|
63
|
+
:pid => @pid_file,
|
64
|
+
:config_file => @config_script,
|
65
|
+
:worker_processes => @workers.to_i,
|
66
|
+
:working_directory => @cwd,
|
67
|
+
:timeout => @timeout.to_i
|
68
|
+
}
|
69
|
+
end
|
70
|
+
|
71
|
+
def bundler_cmd
|
72
|
+
cmd = "bundle exec #{@opt.program_name}"
|
73
|
+
@original_args.each_slice(2) do |arg_key,value|
|
74
|
+
cmd << " #{arg_key} #{value}" if arg_key != "-b"
|
75
|
+
end
|
76
|
+
cmd
|
77
|
+
end
|
78
|
+
|
79
|
+
def collect_listeners
|
80
|
+
return if @port.nil?
|
81
|
+
start_port = end_port = nil
|
82
|
+
start_port ||= @port.to_i
|
83
|
+
end_port ||= start_port + @servers.to_i - 1
|
84
|
+
(start_port..end_port).map do |port|
|
85
|
+
"#{@address}:#{port}"
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def parse_listen_option
|
90
|
+
return if @listen.nil? || @listen.empty?
|
91
|
+
@listen.split(',').map do |listen|
|
92
|
+
listen = File.join(@cwd,listen) if listen[0..0] != "/" && !listen.match(/\w+\:\w+/)
|
93
|
+
"#{listen}"
|
94
|
+
end
|
131
95
|
end
|
132
96
|
|
133
97
|
def run
|
@@ -136,93 +100,24 @@ module Brindle
|
|
136
100
|
if @bundler
|
137
101
|
puts "Using Bundler"
|
138
102
|
puts "reexec via bundle exec"
|
139
|
-
|
140
|
-
cmd_for_exec = "bundle exec #{@opt.program_name}"
|
141
|
-
@original_args.each_slice(2) do |arg_key,value|
|
142
|
-
cmd_for_exec << " #{arg_key} #{value}" if arg_key != "-b"
|
143
|
-
end
|
144
|
-
exec(cmd_for_exec)
|
103
|
+
exec(bundler_cmd)
|
145
104
|
end
|
146
|
-
options =
|
147
|
-
:listeners => [],
|
148
|
-
:pid => @pid_file,
|
149
|
-
:config_file => @config_script,
|
150
|
-
:worker_processes => @workers.to_i,
|
151
|
-
:working_directory => @cwd,
|
152
|
-
:timeout => @timeout.to_i
|
153
|
-
}
|
105
|
+
options = default_options
|
154
106
|
# set user via Unicorn options. If we don't set group - then use only user
|
155
107
|
options[:user] = @user unless @user.nil?
|
156
108
|
options[:stderr_path] = options[:stdout_path] = @log_file if @daemon
|
157
|
-
# ensure Rails standard tmp paths exist
|
158
|
-
options[:after_reload] = lambda do
|
159
|
-
FileUtils.mkdir_p(%w(cache pids sessions sockets).map! { |d| "tmp/#{d}" })
|
160
|
-
end
|
161
|
-
|
162
109
|
options[:preload_app] = @preload
|
163
|
-
|
164
|
-
options[:after_fork] = lambda do |server, worker|
|
165
|
-
defined?(ActiveRecord::Base) and
|
166
|
-
ActiveRecord::Base.establish_connection
|
167
|
-
# trying to change user and group
|
168
|
-
begin
|
169
|
-
# check if something not set in config or cli
|
170
|
-
unless @user.nil? || @group.nil?
|
171
|
-
uid, gid = Process.euid, Process.egid
|
172
|
-
user, group = @user, @group
|
173
|
-
target_uid = Etc.getpwnam(user).uid
|
174
|
-
target_gid = Etc.getgrnam(group).gid
|
175
|
-
worker.tmp.chown(target_uid, target_gid)
|
176
|
-
if uid != target_uid || gid != target_gid
|
177
|
-
Process.initgroups(user, target_gid)
|
178
|
-
Process::GID.change_privilege(target_gid)
|
179
|
-
Process::UID.change_privilege(target_uid)
|
180
|
-
end
|
181
|
-
end
|
182
|
-
rescue => e
|
183
|
-
if ENV['RAILS_ENV'] == 'development'
|
184
|
-
STDERR.puts "couldn't change user, oh well"
|
185
|
-
else
|
186
|
-
raise e
|
187
|
-
end
|
188
|
-
end
|
189
|
-
end
|
190
|
-
options[:before_fork] = lambda do |server, worker|
|
191
|
-
defined?(ActiveRecord::Base) and
|
192
|
-
ActiveRecord::Base.connection.disconnect!
|
193
|
-
# http://rubyenterpriseedition.com/faq.html#adapt_apps_for_cow
|
194
|
-
if GC.respond_to?(:copy_on_write_friendly=)
|
195
|
-
GC.copy_on_write_friendly = true
|
196
|
-
end
|
197
|
-
old_pid = "#{server.config[:pid]}.oldbin"
|
198
|
-
if File.exists?(old_pid) && server.pid != old_pid
|
199
|
-
begin
|
200
|
-
Process.kill("QUIT", File.read(old_pid).to_i)
|
201
|
-
rescue Errno::ENOENT, Errno::ESRCH
|
202
|
-
end
|
203
|
-
end
|
204
|
-
end
|
110
|
+
options.merge!(collect_hooks)
|
205
111
|
ENV['RAILS_ENV'] = @environment
|
206
112
|
ENV['RAILS_RELATIVE_URL_ROOT'] = @prefix
|
207
|
-
|
208
|
-
|
209
|
-
start_port ||= @port.to_i
|
210
|
-
end_port ||= start_port + @servers.to_i - 1
|
211
|
-
(start_port..end_port).each do |port|
|
212
|
-
options[:listeners] << "#{@address}:#{port}"
|
213
|
-
end
|
214
|
-
end
|
215
|
-
unless @listen.nil? || @listen.empty?
|
216
|
-
@listen.split(',').each do |listen|
|
217
|
-
listen = File.join(@cwd,listen) if listen[0..0] != "/" && !listen.match(/\w+\:\w+/)
|
218
|
-
options[:listeners] << "#{listen}"
|
219
|
-
end
|
113
|
+
[collect_listeners, parse_listen_option].each do |listeners|
|
114
|
+
options[:listeners] += listeners if listeners
|
220
115
|
end
|
221
|
-
app = rails_builder(@daemon)
|
116
|
+
app = RailsSupport.rails_builder(@daemon)
|
222
117
|
if @daemon
|
223
118
|
Unicorn::Launcher.daemonize!(options)
|
224
119
|
end
|
225
|
-
puts "start Unicorn..."
|
120
|
+
puts "start Unicorn v#{Unicorn::Const::UNICORN_VERSION}..."
|
226
121
|
if Unicorn.respond_to?(:run)
|
227
122
|
Unicorn.run(app, options)
|
228
123
|
else
|
data/lib/golden_brindle.rb
CHANGED
@@ -6,6 +6,8 @@ require 'unicorn/launcher'
|
|
6
6
|
require 'golden_brindle/const'
|
7
7
|
require 'golden_brindle/command'
|
8
8
|
require 'golden_brindle/configure'
|
9
|
+
require 'golden_brindle/rails_support'
|
10
|
+
require 'golden_brindle/hooks'
|
9
11
|
require 'golden_brindle/start'
|
10
12
|
require 'golden_brindle/stop'
|
11
13
|
require 'golden_brindle/restart'
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: golden_brindle
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.
|
5
|
+
version: "0.2"
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Alexander Simonov
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-09-
|
13
|
+
date: 2011-09-03 00:00:00 +03:00
|
14
14
|
default_executable: golden_brindle
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -60,6 +60,8 @@ files:
|
|
60
60
|
- lib/golden_brindle/command.rb
|
61
61
|
- lib/golden_brindle/configure.rb
|
62
62
|
- lib/golden_brindle/const.rb
|
63
|
+
- lib/golden_brindle/hooks.rb
|
64
|
+
- lib/golden_brindle/rails_support.rb
|
63
65
|
- lib/golden_brindle/restart.rb
|
64
66
|
- lib/golden_brindle/start.rb
|
65
67
|
- lib/golden_brindle/stop.rb
|