thin 1.3.1 → 1.4.0
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/CHANGELOG +8 -0
- data/README.md +83 -0
- data/Rakefile +9 -32
- data/example/vlad.rake +1 -1
- data/lib/rack/adapter/loader.rb +0 -16
- data/lib/thin.rb +22 -24
- data/lib/thin/backends/base.rb +3 -1
- data/lib/thin/connection.rb +9 -8
- data/lib/thin/daemonizing.rb +3 -1
- data/lib/thin/logging.rb +1 -1
- data/lib/thin/runner.rb +36 -36
- data/lib/thin/server.rb +13 -0
- data/lib/thin/version.rb +3 -3
- metadata +5 -91
- data/README +0 -69
- data/benchmark/abc +0 -51
- data/benchmark/benchmarker.rb +0 -80
- data/benchmark/runner +0 -82
- data/spec/backends/swiftiply_client_spec.rb +0 -66
- data/spec/backends/tcp_server_spec.rb +0 -33
- data/spec/backends/unix_server_spec.rb +0 -37
- data/spec/command_spec.rb +0 -25
- data/spec/configs/cluster.yml +0 -9
- data/spec/configs/single.yml +0 -9
- data/spec/connection_spec.rb +0 -107
- data/spec/controllers/cluster_spec.rb +0 -267
- data/spec/controllers/controller_spec.rb +0 -129
- data/spec/controllers/service_spec.rb +0 -50
- data/spec/daemonizing_spec.rb +0 -200
- data/spec/headers_spec.rb +0 -40
- data/spec/logging_spec.rb +0 -52
- data/spec/perf/request_perf_spec.rb +0 -50
- data/spec/perf/response_perf_spec.rb +0 -19
- data/spec/perf/server_perf_spec.rb +0 -39
- data/spec/rack/loader_spec.rb +0 -42
- data/spec/rack/rails_adapter_spec.rb +0 -173
- data/spec/rails_app/app/controllers/application.rb +0 -10
- data/spec/rails_app/app/controllers/simple_controller.rb +0 -19
- data/spec/rails_app/app/helpers/application_helper.rb +0 -3
- data/spec/rails_app/app/views/simple/index.html.erb +0 -15
- data/spec/rails_app/config/boot.rb +0 -109
- data/spec/rails_app/config/environment.rb +0 -64
- data/spec/rails_app/config/environments/development.rb +0 -18
- data/spec/rails_app/config/environments/production.rb +0 -19
- data/spec/rails_app/config/environments/test.rb +0 -22
- data/spec/rails_app/config/initializers/inflections.rb +0 -10
- data/spec/rails_app/config/initializers/mime_types.rb +0 -5
- data/spec/rails_app/config/routes.rb +0 -35
- data/spec/rails_app/public/404.html +0 -30
- data/spec/rails_app/public/422.html +0 -30
- data/spec/rails_app/public/500.html +0 -30
- data/spec/rails_app/public/dispatch.cgi +0 -10
- data/spec/rails_app/public/dispatch.fcgi +0 -24
- data/spec/rails_app/public/dispatch.rb +0 -10
- data/spec/rails_app/public/favicon.ico +0 -0
- data/spec/rails_app/public/images/rails.png +0 -0
- data/spec/rails_app/public/index.html +0 -277
- data/spec/rails_app/public/javascripts/application.js +0 -2
- data/spec/rails_app/public/javascripts/controls.js +0 -963
- data/spec/rails_app/public/javascripts/dragdrop.js +0 -972
- data/spec/rails_app/public/javascripts/effects.js +0 -1120
- data/spec/rails_app/public/javascripts/prototype.js +0 -4225
- data/spec/rails_app/public/robots.txt +0 -5
- data/spec/rails_app/script/about +0 -3
- data/spec/rails_app/script/console +0 -3
- data/spec/rails_app/script/destroy +0 -3
- data/spec/rails_app/script/generate +0 -3
- data/spec/rails_app/script/performance/benchmarker +0 -3
- data/spec/rails_app/script/performance/profiler +0 -3
- data/spec/rails_app/script/performance/request +0 -3
- data/spec/rails_app/script/plugin +0 -3
- data/spec/rails_app/script/process/inspector +0 -3
- data/spec/rails_app/script/process/reaper +0 -3
- data/spec/rails_app/script/process/spawner +0 -3
- data/spec/rails_app/script/runner +0 -3
- data/spec/rails_app/script/server +0 -3
- data/spec/request/mongrel_spec.rb +0 -39
- data/spec/request/parser_spec.rb +0 -254
- data/spec/request/persistent_spec.rb +0 -35
- data/spec/request/processing_spec.rb +0 -50
- data/spec/response_spec.rb +0 -102
- data/spec/runner_spec.rb +0 -168
- data/spec/server/builder_spec.rb +0 -44
- data/spec/server/pipelining_spec.rb +0 -110
- data/spec/server/robustness_spec.rb +0 -34
- data/spec/server/stopping_spec.rb +0 -55
- data/spec/server/swiftiply.yml +0 -6
- data/spec/server/swiftiply_spec.rb +0 -32
- data/spec/server/tcp_spec.rb +0 -47
- data/spec/server/threaded_spec.rb +0 -27
- data/spec/server/unix_socket_spec.rb +0 -26
- data/spec/server_spec.rb +0 -100
- data/spec/spec_helper.rb +0 -234
- data/tasks/announce.rake +0 -22
- data/tasks/deploy.rake +0 -13
- data/tasks/email.erb +0 -27
- data/tasks/gem.rake +0 -65
- data/tasks/rdoc.rake +0 -25
- data/tasks/site.rake +0 -15
- data/tasks/spec.rake +0 -43
- data/tasks/stats.rake +0 -28
data/CHANGELOG
CHANGED
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
== 1.4.0 Chromeo
|
|
2
|
+
* kill -USR1 $PID for log rotation [catwell].
|
|
3
|
+
* Fix HUP signal being reseted after deamonization [atotic].
|
|
4
|
+
* Fix error with nil addresses in Connection#socket_address.
|
|
5
|
+
|
|
6
|
+
== 1.3.2 Low-bar Squat
|
|
7
|
+
* Remove mack and halcyon Rack adapters from automatic detection.
|
|
8
|
+
|
|
1
9
|
== 1.3.1 Triple Espresso
|
|
2
10
|
* Fix service not working pre 1.9.
|
|
3
11
|
|
data/README.md
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
Thin
|
|
2
|
+
====
|
|
3
|
+
|
|
4
|
+
Tiny, fast & funny HTTP server
|
|
5
|
+
|
|
6
|
+
Thin is a Ruby web server that glues together 3 of the best Ruby libraries in web history:
|
|
7
|
+
|
|
8
|
+
* The Mongrel parser: the root of Mongrel speed and security
|
|
9
|
+
* Event Machine: a network I/O library with extremely high scalability, performance and stability
|
|
10
|
+
* Rack: a minimal interface between webservers and Ruby frameworks
|
|
11
|
+
|
|
12
|
+
Which makes it, with all humility, the most secure, stable, fast and extensible Ruby web server
|
|
13
|
+
bundled in an easy to use gem for your own pleasure.
|
|
14
|
+
|
|
15
|
+
Site: http://code.macournoyer.com/thin/
|
|
16
|
+
Group: http://groups.google.com/group/thin-ruby/topics
|
|
17
|
+
Bugs: http://github.com/macournoyer/thin/issues
|
|
18
|
+
Code: http://github.com/macournoyer/thin
|
|
19
|
+
IRC: #thin on freenode
|
|
20
|
+
|
|
21
|
+
Installation
|
|
22
|
+
============
|
|
23
|
+
For the latest stable version:
|
|
24
|
+
|
|
25
|
+
`gem install thin`
|
|
26
|
+
|
|
27
|
+
Or from source:
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
git clone git://github.com/macournoyer/thin.git
|
|
31
|
+
cd thin
|
|
32
|
+
rake install
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
Usage
|
|
37
|
+
=====
|
|
38
|
+
A +thin+ script offers an easy way to start your Rack application:
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
cd to/your/app
|
|
42
|
+
thin start
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
But Thin is also usable with a Rack config file.
|
|
46
|
+
You need to setup a config.ru file and pass it to the thin script:
|
|
47
|
+
|
|
48
|
+
```ruby
|
|
49
|
+
#cat config.ru
|
|
50
|
+
app = proc do |env|
|
|
51
|
+
[
|
|
52
|
+
200,
|
|
53
|
+
{
|
|
54
|
+
'Content-Type' => 'text/html',
|
|
55
|
+
'Content-Length' => '2'
|
|
56
|
+
},
|
|
57
|
+
['hi']
|
|
58
|
+
]
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
run app
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
` thin start -R config.ru `
|
|
65
|
+
|
|
66
|
+
See example directory for more samples and run 'thin -h' for usage.
|
|
67
|
+
|
|
68
|
+
License
|
|
69
|
+
=======
|
|
70
|
+
Ruby License, http://www.ruby-lang.org/en/LICENSE.txt.
|
|
71
|
+
|
|
72
|
+
Credits
|
|
73
|
+
=======
|
|
74
|
+
The parser was stolen from Mongrel http://mongrel.rubyforge.org by Zed Shaw.
|
|
75
|
+
Mongrel Web Server (Mongrel) is copyrighted free software by Zed A. Shaw
|
|
76
|
+
<zedshaw at zedshaw dot com> You can redistribute it and/or modify it under
|
|
77
|
+
either the terms of the GPL.
|
|
78
|
+
|
|
79
|
+
Thin is copyright Marc-Andre Cournoyer <macournoyer@gmail.com>
|
|
80
|
+
|
|
81
|
+
Get help at http://groups.google.com/group/thin-ruby/
|
|
82
|
+
Report bugs at https://github.com/macournoyer/thin/issues
|
|
83
|
+
and major security issues directly to me macournoyer@gmail.com.
|
data/Rakefile
CHANGED
|
@@ -1,44 +1,21 @@
|
|
|
1
|
-
RUBY_1_9 = RUBY_VERSION =~ /^1\.9/
|
|
2
|
-
WIN = (RUBY_PLATFORM =~ /mswin|cygwin/)
|
|
3
|
-
SUDO = (WIN ? "" : "sudo")
|
|
4
|
-
|
|
5
1
|
require 'rake'
|
|
6
2
|
require 'rake/clean'
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
$: << File.join(File.dirname(__FILE__), 'lib')
|
|
10
|
-
require 'thin/version'
|
|
3
|
+
load 'thin.gemspec'
|
|
11
4
|
|
|
12
5
|
# Load tasks in tasks/
|
|
13
6
|
Dir['tasks/**/*.rake'].each { |rake| load rake }
|
|
14
7
|
|
|
15
8
|
task :default => :spec
|
|
16
9
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
# forces the Windows platform instead of the default one
|
|
22
|
-
# configure options only for cross compile
|
|
23
|
-
ext.cross_platform = %w( i386-mswin32 x86-mingw32 )
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
CLEAN.include %w(**/*.{o,bundle,jar,so,obj,pdb,lib,def,exp,log} ext/*/Makefile ext/*/conftest.dSYM lib/1.{8,9}})
|
|
27
|
-
|
|
28
|
-
desc "Compile the Ragel state machines"
|
|
29
|
-
task :ragel do
|
|
30
|
-
Dir.chdir 'ext/thin_parser' do
|
|
31
|
-
target = "parser.c"
|
|
32
|
-
File.unlink target if File.exist? target
|
|
33
|
-
sh "ragel parser.rl -G2 -o #{target}"
|
|
34
|
-
raise "Failed to compile Ragel state machine" unless File.exist? target
|
|
35
|
-
end
|
|
10
|
+
desc "Build gem packages"
|
|
11
|
+
task :build do
|
|
12
|
+
sh "gem build thin.gemspec"
|
|
36
13
|
end
|
|
37
14
|
|
|
38
|
-
desc "
|
|
39
|
-
task :
|
|
40
|
-
sh "
|
|
15
|
+
desc "Push gem packages"
|
|
16
|
+
task :push => :build do
|
|
17
|
+
sh "gem push thin-*.gem"
|
|
41
18
|
end
|
|
42
19
|
|
|
43
|
-
desc "Release version #{Thin::VERSION::STRING}
|
|
44
|
-
task :release => [:tag,
|
|
20
|
+
desc "Release version #{Thin::VERSION::STRING}"
|
|
21
|
+
task :release => [:tag, :push]
|
data/example/vlad.rake
CHANGED
|
@@ -53,7 +53,7 @@ configuration is set via the thin_* variables.".cleanup
|
|
|
53
53
|
desc "Restart the app servers"
|
|
54
54
|
|
|
55
55
|
remote_task :start_app, :roles => :app do
|
|
56
|
-
run thin("restart -s #{thin_servers}")
|
|
56
|
+
run thin("restart -O -s #{thin_servers}")
|
|
57
57
|
end
|
|
58
58
|
|
|
59
59
|
desc "Stop the app servers"
|
data/lib/rack/adapter/loader.rb
CHANGED
|
@@ -11,10 +11,7 @@ module Rack
|
|
|
11
11
|
[:rack, 'config.ru'],
|
|
12
12
|
[:rails, 'config/environment.rb'],
|
|
13
13
|
[:ramaze, 'start.rb'],
|
|
14
|
-
[:halcyon, 'runner.ru'],
|
|
15
14
|
[:merb, 'config/init.rb'],
|
|
16
|
-
[:mack, 'config/app_config/default.yml'],
|
|
17
|
-
[:mack, 'config/configatron/default.rb'],
|
|
18
15
|
[:file, nil]
|
|
19
16
|
]
|
|
20
17
|
|
|
@@ -66,19 +63,6 @@ module Rack
|
|
|
66
63
|
|
|
67
64
|
return Merb::Rack::Application.new
|
|
68
65
|
|
|
69
|
-
when :halcyon
|
|
70
|
-
require 'halcyon'
|
|
71
|
-
|
|
72
|
-
$:.unshift(Halcyon.root/'lib')
|
|
73
|
-
|
|
74
|
-
return Halcyon::Runner.new
|
|
75
|
-
|
|
76
|
-
when :mack
|
|
77
|
-
ENV["MACK_ENV"] = options[:environment]
|
|
78
|
-
load(::File.join(options[:chdir], "Rakefile"))
|
|
79
|
-
require 'mack'
|
|
80
|
-
return Mack::Utils::Server.build_app
|
|
81
|
-
|
|
82
66
|
when :file
|
|
83
67
|
return Rack::File.new(options[:chdir])
|
|
84
68
|
|
data/lib/thin.rb
CHANGED
|
@@ -8,40 +8,38 @@ require 'eventmachine'
|
|
|
8
8
|
require 'rack'
|
|
9
9
|
|
|
10
10
|
module Thin
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
autoload :
|
|
14
|
-
autoload :
|
|
15
|
-
autoload :
|
|
16
|
-
autoload :
|
|
17
|
-
autoload :
|
|
18
|
-
autoload :
|
|
19
|
-
autoload :
|
|
20
|
-
autoload :
|
|
21
|
-
autoload :Server, "#{ROOT}/thin/server"
|
|
22
|
-
autoload :Stats, "#{ROOT}/thin/stats"
|
|
11
|
+
autoload :Command, "thin/command"
|
|
12
|
+
autoload :Connection, "thin/connection"
|
|
13
|
+
autoload :Daemonizable, "thin/daemonizing"
|
|
14
|
+
autoload :Logging, "thin/logging"
|
|
15
|
+
autoload :Headers, "thin/headers"
|
|
16
|
+
autoload :Request, "thin/request"
|
|
17
|
+
autoload :Response, "thin/response"
|
|
18
|
+
autoload :Runner, "thin/runner"
|
|
19
|
+
autoload :Server, "thin/server"
|
|
20
|
+
autoload :Stats, "thin/stats"
|
|
23
21
|
|
|
24
22
|
module Backends
|
|
25
|
-
autoload :Base, "
|
|
26
|
-
autoload :SwiftiplyClient, "
|
|
27
|
-
autoload :TcpServer, "
|
|
28
|
-
autoload :UnixServer, "
|
|
23
|
+
autoload :Base, "thin/backends/base"
|
|
24
|
+
autoload :SwiftiplyClient, "thin/backends/swiftiply_client"
|
|
25
|
+
autoload :TcpServer, "thin/backends/tcp_server"
|
|
26
|
+
autoload :UnixServer, "thin/backends/unix_server"
|
|
29
27
|
end
|
|
30
28
|
|
|
31
29
|
module Controllers
|
|
32
|
-
autoload :Cluster, "
|
|
33
|
-
autoload :Controller, "
|
|
34
|
-
autoload :Service, "
|
|
30
|
+
autoload :Cluster, "thin/controllers/cluster"
|
|
31
|
+
autoload :Controller, "thin/controllers/controller"
|
|
32
|
+
autoload :Service, "thin/controllers/service"
|
|
35
33
|
end
|
|
36
34
|
end
|
|
37
35
|
|
|
38
|
-
require "
|
|
39
|
-
require "
|
|
40
|
-
require "
|
|
41
|
-
require "
|
|
36
|
+
require "thin/version"
|
|
37
|
+
require "thin/statuses"
|
|
38
|
+
require "rack/adapter/loader"
|
|
39
|
+
require "thin_parser"
|
|
42
40
|
|
|
43
41
|
module Rack
|
|
44
42
|
module Adapter
|
|
45
|
-
autoload :Rails, "
|
|
43
|
+
autoload :Rails, "rack/adapter/rails"
|
|
46
44
|
end
|
|
47
45
|
end
|
data/lib/thin/backends/base.rb
CHANGED
|
@@ -44,6 +44,8 @@ module Thin
|
|
|
44
44
|
@maximum_connections = Server::DEFAULT_MAXIMUM_CONNECTIONS
|
|
45
45
|
@maximum_persistent_connections = Server::DEFAULT_MAXIMUM_PERSISTENT_CONNECTIONS
|
|
46
46
|
@no_epoll = false
|
|
47
|
+
@ssl = nil
|
|
48
|
+
@threaded = nil
|
|
47
49
|
end
|
|
48
50
|
|
|
49
51
|
# Start the backend and connect it.
|
|
@@ -146,4 +148,4 @@ module Thin
|
|
|
146
148
|
|
|
147
149
|
end
|
|
148
150
|
end
|
|
149
|
-
end
|
|
151
|
+
end
|
data/lib/thin/connection.rb
CHANGED
|
@@ -6,10 +6,10 @@ module Thin
|
|
|
6
6
|
# that is opened.
|
|
7
7
|
class Connection < EventMachine::Connection
|
|
8
8
|
include Logging
|
|
9
|
-
|
|
9
|
+
|
|
10
10
|
# This is a template async response. N.B. Can't use string for body on 1.9
|
|
11
11
|
AsyncResponse = [-1, {}, []].freeze
|
|
12
|
-
|
|
12
|
+
|
|
13
13
|
# Rack application (adapter) served by this connection.
|
|
14
14
|
attr_accessor :app
|
|
15
15
|
|
|
@@ -25,7 +25,7 @@ module Thin
|
|
|
25
25
|
# Calling the application in a threaded allowing
|
|
26
26
|
# concurrent processing of requests.
|
|
27
27
|
attr_writer :threaded
|
|
28
|
-
|
|
28
|
+
|
|
29
29
|
# Get the connection ready to process a request.
|
|
30
30
|
def post_init
|
|
31
31
|
@request = Request.new
|
|
@@ -59,13 +59,13 @@ module Thin
|
|
|
59
59
|
@request.remote_address = remote_address
|
|
60
60
|
|
|
61
61
|
# Connection may be closed unless the App#call response was a [-1, ...]
|
|
62
|
-
# It should be noted that connection objects will linger until this
|
|
62
|
+
# It should be noted that connection objects will linger until this
|
|
63
63
|
# callback is no longer referenced, so be tidy!
|
|
64
64
|
@request.async_callback = method(:post_process)
|
|
65
|
-
|
|
65
|
+
|
|
66
66
|
if @backend.ssl?
|
|
67
67
|
@request.env["rack.url_scheme"] = "https"
|
|
68
|
-
|
|
68
|
+
|
|
69
69
|
if cert = get_peer_cert
|
|
70
70
|
@request.env['rack.peer_cert'] = cert
|
|
71
71
|
end
|
|
@@ -89,7 +89,7 @@ module Thin
|
|
|
89
89
|
def post_process(result)
|
|
90
90
|
return unless result
|
|
91
91
|
result = result.to_a
|
|
92
|
-
|
|
92
|
+
|
|
93
93
|
# Status code -1 indicates that we're going to respond later (async).
|
|
94
94
|
return if result.first == AsyncResponse.first
|
|
95
95
|
|
|
@@ -190,7 +190,8 @@ module Thin
|
|
|
190
190
|
protected
|
|
191
191
|
# Returns IP address of peer as a string.
|
|
192
192
|
def socket_address
|
|
193
|
-
|
|
193
|
+
peer = get_peername
|
|
194
|
+
Socket.unpack_sockaddr_in(peer)[1] if peer
|
|
194
195
|
end
|
|
195
196
|
end
|
|
196
197
|
end
|
data/lib/thin/daemonizing.rb
CHANGED
|
@@ -21,7 +21,7 @@ module Thin
|
|
|
21
21
|
# Handle stuff like:
|
|
22
22
|
# * storing the PID in a file
|
|
23
23
|
# * redirecting output to the log file
|
|
24
|
-
# * changing
|
|
24
|
+
# * changing process privileges
|
|
25
25
|
# * killing the process gracefully
|
|
26
26
|
module Daemonizable
|
|
27
27
|
attr_accessor :pid_file, :log_file
|
|
@@ -53,6 +53,8 @@ module Thin
|
|
|
53
53
|
Dir.chdir(pwd)
|
|
54
54
|
|
|
55
55
|
write_pid_file
|
|
56
|
+
|
|
57
|
+
self.after_daemonize if self.respond_to? :after_daemonize
|
|
56
58
|
|
|
57
59
|
at_exit do
|
|
58
60
|
log ">> Exiting!"
|
data/lib/thin/logging.rb
CHANGED
|
@@ -46,7 +46,7 @@ module Thin
|
|
|
46
46
|
|
|
47
47
|
# Log an error backtrace if debugging is activated
|
|
48
48
|
def log_error(e=$!)
|
|
49
|
-
STDERR.print("#{e}\n\t" + e.backtrace.join("\n\t")) if Logging.debug?
|
|
49
|
+
STDERR.print("#{e}\n\t" + e.backtrace.join("\n\t") + "\n") if Logging.debug?
|
|
50
50
|
end
|
|
51
51
|
module_function :log_error
|
|
52
52
|
public :log_error
|
data/lib/thin/runner.rb
CHANGED
|
@@ -1,39 +1,39 @@
|
|
|
1
1
|
require 'optparse'
|
|
2
2
|
require 'yaml'
|
|
3
3
|
|
|
4
|
-
module Thin
|
|
4
|
+
module Thin
|
|
5
5
|
# CLI runner.
|
|
6
6
|
# Parse options and send command to the correct Controller.
|
|
7
7
|
class Runner
|
|
8
8
|
COMMANDS = %w(start stop restart config)
|
|
9
9
|
LINUX_ONLY_COMMANDS = %w(install)
|
|
10
|
-
|
|
10
|
+
|
|
11
11
|
# Commands that wont load options from the config file
|
|
12
12
|
CONFIGLESS_COMMANDS = %w(config install)
|
|
13
|
-
|
|
13
|
+
|
|
14
14
|
# Parsed options
|
|
15
15
|
attr_accessor :options
|
|
16
|
-
|
|
16
|
+
|
|
17
17
|
# Name of the command to be runned.
|
|
18
18
|
attr_accessor :command
|
|
19
|
-
|
|
19
|
+
|
|
20
20
|
# Arguments to be passed to the command.
|
|
21
21
|
attr_accessor :arguments
|
|
22
|
-
|
|
22
|
+
|
|
23
23
|
# Return all available commands
|
|
24
24
|
def self.commands
|
|
25
25
|
commands = COMMANDS
|
|
26
26
|
commands += LINUX_ONLY_COMMANDS if Thin.linux?
|
|
27
27
|
commands
|
|
28
28
|
end
|
|
29
|
-
|
|
29
|
+
|
|
30
30
|
def initialize(argv)
|
|
31
31
|
@argv = argv
|
|
32
|
-
|
|
32
|
+
|
|
33
33
|
# Default options values
|
|
34
34
|
@options = {
|
|
35
35
|
:chdir => Dir.pwd,
|
|
36
|
-
:environment => 'development',
|
|
36
|
+
:environment => ENV['RACK_ENV'] || 'development',
|
|
37
37
|
:address => '0.0.0.0',
|
|
38
38
|
:port => Server::DEFAULT_PORT,
|
|
39
39
|
:timeout => Server::DEFAULT_TIMEOUT,
|
|
@@ -44,10 +44,10 @@ module Thin
|
|
|
44
44
|
:require => [],
|
|
45
45
|
:wait => Controllers::Cluster::DEFAULT_WAIT_TIME
|
|
46
46
|
}
|
|
47
|
-
|
|
47
|
+
|
|
48
48
|
parse!
|
|
49
49
|
end
|
|
50
|
-
|
|
50
|
+
|
|
51
51
|
def parser
|
|
52
52
|
# NOTE: If you add an option here make sure the key in the +options+ hash is the
|
|
53
53
|
# same as the name of the command line option.
|
|
@@ -81,26 +81,26 @@ module Thin
|
|
|
81
81
|
|
|
82
82
|
opts.separator ""
|
|
83
83
|
opts.separator "Adapter options:"
|
|
84
|
-
opts.on("-e", "--environment ENV", "Framework environment " +
|
|
84
|
+
opts.on("-e", "--environment ENV", "Framework environment " +
|
|
85
85
|
"(default: #{@options[:environment]})") { |env| @options[:environment] = env }
|
|
86
86
|
opts.on( "--prefix PATH", "Mount the app under PATH (start with /)") { |path| @options[:prefix] = path }
|
|
87
|
-
|
|
87
|
+
|
|
88
88
|
unless Thin.win? # Daemonizing not supported on Windows
|
|
89
89
|
opts.separator ""
|
|
90
90
|
opts.separator "Daemon options:"
|
|
91
|
-
|
|
91
|
+
|
|
92
92
|
opts.on("-d", "--daemonize", "Run daemonized in the background") { @options[:daemonize] = true }
|
|
93
|
-
opts.on("-l", "--log FILE", "File to redirect output " +
|
|
93
|
+
opts.on("-l", "--log FILE", "File to redirect output " +
|
|
94
94
|
"(default: #{@options[:log]})") { |file| @options[:log] = file }
|
|
95
|
-
opts.on("-P", "--pid FILE", "File to store PID " +
|
|
95
|
+
opts.on("-P", "--pid FILE", "File to store PID " +
|
|
96
96
|
"(default: #{@options[:pid]})") { |file| @options[:pid] = file }
|
|
97
97
|
opts.on("-u", "--user NAME", "User to run daemon as (use with -g)") { |user| @options[:user] = user }
|
|
98
98
|
opts.on("-g", "--group NAME", "Group to run daemon as (use with -u)") { |group| @options[:group] = group }
|
|
99
99
|
opts.on( "--tag NAME", "Additional text to display in process listing") { |tag| @options[:tag] = tag }
|
|
100
|
-
|
|
100
|
+
|
|
101
101
|
opts.separator ""
|
|
102
|
-
opts.separator "Cluster options:"
|
|
103
|
-
|
|
102
|
+
opts.separator "Cluster options:"
|
|
103
|
+
|
|
104
104
|
opts.on("-s", "--servers NUM", "Number of servers to start") { |num| @options[:servers] = num.to_i }
|
|
105
105
|
opts.on("-o", "--only NUM", "Send command to only one server of the cluster") { |only| @options[:only] = only.to_i }
|
|
106
106
|
opts.on("-C", "--config FILE", "Load options from config file") { |file| @options[:config] = file }
|
|
@@ -108,12 +108,12 @@ module Thin
|
|
|
108
108
|
opts.on("-O", "--onebyone", "Restart the cluster one by one (only works with restart command)") { @options[:onebyone] = true }
|
|
109
109
|
opts.on("-w", "--wait NUM", "Maximum wait time for server to be started in seconds (use with -O)") { |time| @options[:wait] = time.to_i }
|
|
110
110
|
end
|
|
111
|
-
|
|
111
|
+
|
|
112
112
|
opts.separator ""
|
|
113
113
|
opts.separator "Tuning options:"
|
|
114
|
-
|
|
114
|
+
|
|
115
115
|
opts.on("-b", "--backend CLASS", "Backend to use, full classname") { |name| @options[:backend] = name }
|
|
116
|
-
opts.on("-t", "--timeout SEC", "Request or command timeout in sec " +
|
|
116
|
+
opts.on("-t", "--timeout SEC", "Request or command timeout in sec " +
|
|
117
117
|
"(default: #{@options[:timeout]})") { |sec| @options[:timeout] = sec.to_i }
|
|
118
118
|
opts.on("-f", "--force", "Force the execution of the command") { @options[:force] = true }
|
|
119
119
|
opts.on( "--max-conns NUM", "Maximum number of open file descriptors " +
|
|
@@ -125,7 +125,7 @@ module Thin
|
|
|
125
125
|
opts.on( "--threaded", "Call the Rack application in threads " +
|
|
126
126
|
"[experimental]") { @options[:threaded] = true }
|
|
127
127
|
opts.on( "--no-epoll", "Disable the use of epoll") { @options[:no_epoll] = true } if Thin.linux?
|
|
128
|
-
|
|
128
|
+
|
|
129
129
|
opts.separator ""
|
|
130
130
|
opts.separator "Common options:"
|
|
131
131
|
|
|
@@ -136,14 +136,14 @@ module Thin
|
|
|
136
136
|
opts.on_tail('-v', '--version', "Show version") { puts Thin::SERVER; exit }
|
|
137
137
|
end
|
|
138
138
|
end
|
|
139
|
-
|
|
139
|
+
|
|
140
140
|
# Parse the options.
|
|
141
141
|
def parse!
|
|
142
142
|
parser.parse! @argv
|
|
143
143
|
@command = @argv.shift
|
|
144
144
|
@arguments = @argv
|
|
145
145
|
end
|
|
146
|
-
|
|
146
|
+
|
|
147
147
|
# Parse the current shell arguments and run the command.
|
|
148
148
|
# Exits on error.
|
|
149
149
|
def run!
|
|
@@ -152,34 +152,34 @@ module Thin
|
|
|
152
152
|
elsif @command.nil?
|
|
153
153
|
puts "Command required"
|
|
154
154
|
puts @parser
|
|
155
|
-
exit 1
|
|
155
|
+
exit 1
|
|
156
156
|
else
|
|
157
157
|
abort "Unknown command: #{@command}. Use one of #{self.class.commands.join(', ')}"
|
|
158
158
|
end
|
|
159
159
|
end
|
|
160
|
-
|
|
160
|
+
|
|
161
161
|
# Send the command to the controller: single instance or cluster.
|
|
162
162
|
def run_command
|
|
163
163
|
load_options_from_config_file! unless CONFIGLESS_COMMANDS.include?(@command)
|
|
164
|
-
|
|
164
|
+
|
|
165
165
|
# PROGRAM_NAME is relative to the current directory, so make sure
|
|
166
166
|
# we store and expand it before changing directory.
|
|
167
167
|
Command.script = File.expand_path($PROGRAM_NAME)
|
|
168
|
-
|
|
168
|
+
|
|
169
169
|
# Change the current directory ASAP so that all relative paths are
|
|
170
170
|
# relative to this one.
|
|
171
171
|
Dir.chdir(@options[:chdir]) unless CONFIGLESS_COMMANDS.include?(@command)
|
|
172
|
-
|
|
172
|
+
|
|
173
173
|
@options[:require].each { |r| ruby_require r }
|
|
174
174
|
Logging.debug = @options[:debug]
|
|
175
175
|
Logging.trace = @options[:trace]
|
|
176
|
-
|
|
176
|
+
|
|
177
177
|
controller = case
|
|
178
178
|
when cluster? then Controllers::Cluster.new(@options)
|
|
179
179
|
when service? then Controllers::Service.new(@options)
|
|
180
180
|
else Controllers::Controller.new(@options)
|
|
181
181
|
end
|
|
182
|
-
|
|
182
|
+
|
|
183
183
|
if controller.respond_to?(@command)
|
|
184
184
|
begin
|
|
185
185
|
controller.send(@command, *@arguments)
|
|
@@ -190,24 +190,24 @@ module Thin
|
|
|
190
190
|
abort "Invalid options for command: #{@command}"
|
|
191
191
|
end
|
|
192
192
|
end
|
|
193
|
-
|
|
193
|
+
|
|
194
194
|
# +true+ if we're controlling a cluster.
|
|
195
195
|
def cluster?
|
|
196
196
|
@options[:only] || @options[:servers] || @options[:config]
|
|
197
197
|
end
|
|
198
|
-
|
|
198
|
+
|
|
199
199
|
# +true+ if we're acting a as system service.
|
|
200
200
|
def service?
|
|
201
201
|
@options.has_key?(:all) || @command == 'install'
|
|
202
202
|
end
|
|
203
|
-
|
|
203
|
+
|
|
204
204
|
private
|
|
205
205
|
def load_options_from_config_file!
|
|
206
206
|
if file = @options.delete(:config)
|
|
207
207
|
YAML.load_file(file).each { |key, value| @options[key.to_sym] = value }
|
|
208
208
|
end
|
|
209
209
|
end
|
|
210
|
-
|
|
210
|
+
|
|
211
211
|
def ruby_require(file)
|
|
212
212
|
if File.extname(file) == '.ru'
|
|
213
213
|
warn 'WARNING: Use the -R option to load a Rack config file'
|