rails 2.2.2 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of rails might be problematic. Click here for more details.
- data/bin/rails +8 -18
- metadata +118 -452
- data/CHANGELOG +0 -2071
- data/MIT-LICENSE +0 -20
- data/README +0 -256
- data/Rakefile +0 -411
- data/bin/about +0 -4
- data/bin/console +0 -3
- data/bin/dbconsole +0 -3
- data/bin/destroy +0 -3
- data/bin/generate +0 -3
- data/bin/performance/benchmarker +0 -3
- data/bin/performance/profiler +0 -3
- data/bin/performance/request +0 -3
- data/bin/plugin +0 -3
- data/bin/process/inspector +0 -3
- data/bin/process/reaper +0 -3
- data/bin/process/spawner +0 -3
- data/bin/runner +0 -3
- data/bin/server +0 -3
- data/builtin/rails_info/rails/info.rb +0 -125
- data/builtin/rails_info/rails/info_controller.rb +0 -9
- data/builtin/rails_info/rails/info_helper.rb +0 -2
- data/builtin/rails_info/rails_info_controller.rb +0 -2
- data/config.ru +0 -17
- data/configs/apache.conf +0 -40
- data/configs/databases/frontbase.yml +0 -28
- data/configs/databases/ibm_db.yml +0 -62
- data/configs/databases/mysql.yml +0 -57
- data/configs/databases/oracle.yml +0 -39
- data/configs/databases/postgresql.yml +0 -51
- data/configs/databases/sqlite2.yml +0 -19
- data/configs/databases/sqlite3.yml +0 -22
- data/configs/empty.log +0 -0
- data/configs/initializers/inflections.rb +0 -10
- data/configs/initializers/mime_types.rb +0 -5
- data/configs/initializers/new_rails_defaults.rb +0 -17
- data/configs/lighttpd.conf +0 -54
- data/configs/locales/en.yml +0 -5
- data/configs/routes.rb +0 -43
- data/dispatches/dispatch.fcgi +0 -24
- data/dispatches/dispatch.rb +0 -10
- data/dispatches/gateway.cgi +0 -97
- data/doc/README_FOR_APP +0 -5
- data/doc/guides/html/2_2_release_notes.html +0 -1185
- data/doc/guides/html/actioncontroller_basics.html +0 -1270
- data/doc/guides/html/activerecord_validations_callbacks.html +0 -749
- data/doc/guides/html/association_basics.html +0 -2585
- data/doc/guides/html/authors.html +0 -240
- data/doc/guides/html/benchmarking_and_profiling.html +0 -1018
- data/doc/guides/html/caching_with_rails.html +0 -583
- data/doc/guides/html/command_line.html +0 -434
- data/doc/guides/html/configuring.html +0 -438
- data/doc/guides/html/creating_plugins.html +0 -1594
- data/doc/guides/html/debugging_rails_applications.html +0 -1175
- data/doc/guides/html/finders.html +0 -1090
- data/doc/guides/html/form_helpers.html +0 -638
- data/doc/guides/html/getting_started_with_rails.html +0 -2066
- data/doc/guides/html/index.html +0 -349
- data/doc/guides/html/layouts_and_rendering.html +0 -1406
- data/doc/guides/html/migrations.html +0 -921
- data/doc/guides/html/routing_outside_in.html +0 -2213
- data/doc/guides/html/security.html +0 -1346
- data/doc/guides/html/testing_rails_applications.html +0 -1859
- data/doc/guides/source/2_2_release_notes.txt +0 -435
- data/doc/guides/source/actioncontroller_basics/changelog.txt +0 -5
- data/doc/guides/source/actioncontroller_basics/cookies.txt +0 -34
- data/doc/guides/source/actioncontroller_basics/csrf.txt +0 -32
- data/doc/guides/source/actioncontroller_basics/filters.txt +0 -119
- data/doc/guides/source/actioncontroller_basics/http_auth.txt +0 -24
- data/doc/guides/source/actioncontroller_basics/index.txt +0 -40
- data/doc/guides/source/actioncontroller_basics/introduction.txt +0 -9
- data/doc/guides/source/actioncontroller_basics/methods.txt +0 -39
- data/doc/guides/source/actioncontroller_basics/parameter_filtering.txt +0 -14
- data/doc/guides/source/actioncontroller_basics/params.txt +0 -93
- data/doc/guides/source/actioncontroller_basics/request_response_objects.txt +0 -43
- data/doc/guides/source/actioncontroller_basics/rescue.txt +0 -67
- data/doc/guides/source/actioncontroller_basics/session.txt +0 -187
- data/doc/guides/source/actioncontroller_basics/streaming.txt +0 -91
- data/doc/guides/source/actioncontroller_basics/verification.txt +0 -40
- data/doc/guides/source/active_record_basics.txt +0 -181
- data/doc/guides/source/activerecord_validations_callbacks.txt +0 -404
- data/doc/guides/source/association_basics.txt +0 -1840
- data/doc/guides/source/authors.txt +0 -39
- data/doc/guides/source/benchmarking_and_profiling/appendix.txt +0 -95
- data/doc/guides/source/benchmarking_and_profiling/digging_deeper.txt +0 -105
- data/doc/guides/source/benchmarking_and_profiling/edge_rails_features.txt +0 -185
- data/doc/guides/source/benchmarking_and_profiling/gameplan.txt +0 -27
- data/doc/guides/source/benchmarking_and_profiling/index.txt +0 -242
- data/doc/guides/source/benchmarking_and_profiling/rubyprof.txt +0 -179
- data/doc/guides/source/benchmarking_and_profiling/statistics.txt +0 -57
- data/doc/guides/source/caching_with_rails.txt +0 -367
- data/doc/guides/source/command_line.txt +0 -147
- data/doc/guides/source/configuring.txt +0 -225
- data/doc/guides/source/creating_plugins/acts_as_yaffle.txt +0 -191
- data/doc/guides/source/creating_plugins/appendix.txt +0 -46
- data/doc/guides/source/creating_plugins/controllers.txt +0 -59
- data/doc/guides/source/creating_plugins/core_ext.txt +0 -123
- data/doc/guides/source/creating_plugins/custom_route.txt +0 -69
- data/doc/guides/source/creating_plugins/gem.txt +0 -1
- data/doc/guides/source/creating_plugins/generator_method.txt +0 -89
- data/doc/guides/source/creating_plugins/helpers.txt +0 -51
- data/doc/guides/source/creating_plugins/index.txt +0 -52
- data/doc/guides/source/creating_plugins/migration_generator.txt +0 -156
- data/doc/guides/source/creating_plugins/models.txt +0 -76
- data/doc/guides/source/creating_plugins/odds_and_ends.txt +0 -69
- data/doc/guides/source/creating_plugins/test_setup.txt +0 -230
- data/doc/guides/source/debugging_rails_applications.txt +0 -733
- data/doc/guides/source/finders.txt +0 -668
- data/doc/guides/source/form_helpers.txt +0 -345
- data/doc/guides/source/getting_started_with_rails.txt +0 -1256
- data/doc/guides/source/images/belongs_to.png +0 -0
- data/doc/guides/source/images/bullet.gif +0 -0
- data/doc/guides/source/images/csrf.png +0 -0
- data/doc/guides/source/images/habtm.png +0 -0
- data/doc/guides/source/images/has_many.png +0 -0
- data/doc/guides/source/images/has_many_through.png +0 -0
- data/doc/guides/source/images/has_one.png +0 -0
- data/doc/guides/source/images/has_one_through.png +0 -0
- data/doc/guides/source/images/header_backdrop.png +0 -0
- data/doc/guides/source/images/icons/README +0 -5
- data/doc/guides/source/images/icons/callouts/1.png +0 -0
- data/doc/guides/source/images/icons/callouts/10.png +0 -0
- data/doc/guides/source/images/icons/callouts/11.png +0 -0
- data/doc/guides/source/images/icons/callouts/12.png +0 -0
- data/doc/guides/source/images/icons/callouts/13.png +0 -0
- data/doc/guides/source/images/icons/callouts/14.png +0 -0
- data/doc/guides/source/images/icons/callouts/15.png +0 -0
- data/doc/guides/source/images/icons/callouts/2.png +0 -0
- data/doc/guides/source/images/icons/callouts/3.png +0 -0
- data/doc/guides/source/images/icons/callouts/4.png +0 -0
- data/doc/guides/source/images/icons/callouts/5.png +0 -0
- data/doc/guides/source/images/icons/callouts/6.png +0 -0
- data/doc/guides/source/images/icons/callouts/7.png +0 -0
- data/doc/guides/source/images/icons/callouts/8.png +0 -0
- data/doc/guides/source/images/icons/callouts/9.png +0 -0
- data/doc/guides/source/images/icons/caution.png +0 -0
- data/doc/guides/source/images/icons/example.png +0 -0
- data/doc/guides/source/images/icons/home.png +0 -0
- data/doc/guides/source/images/icons/important.png +0 -0
- data/doc/guides/source/images/icons/next.png +0 -0
- data/doc/guides/source/images/icons/note.png +0 -0
- data/doc/guides/source/images/icons/prev.png +0 -0
- data/doc/guides/source/images/icons/tip.png +0 -0
- data/doc/guides/source/images/icons/up.png +0 -0
- data/doc/guides/source/images/icons/warning.png +0 -0
- data/doc/guides/source/images/polymorphic.png +0 -0
- data/doc/guides/source/images/rails_logo_remix.gif +0 -0
- data/doc/guides/source/images/ruby_on_rails_by_mike_rundle2.gif +0 -0
- data/doc/guides/source/images/session_fixation.png +0 -0
- data/doc/guides/source/index.txt +0 -118
- data/doc/guides/source/layouts_and_rendering.txt +0 -982
- data/doc/guides/source/migrations/anatomy_of_a_migration.txt +0 -85
- data/doc/guides/source/migrations/changelog.txt +0 -5
- data/doc/guides/source/migrations/creating_a_migration.txt +0 -109
- data/doc/guides/source/migrations/foreign_keys.txt +0 -8
- data/doc/guides/source/migrations/index.txt +0 -22
- data/doc/guides/source/migrations/rakeing_around.txt +0 -111
- data/doc/guides/source/migrations/scheming.txt +0 -47
- data/doc/guides/source/migrations/using_models_in_migrations.txt +0 -46
- data/doc/guides/source/migrations/writing_a_migration.txt +0 -159
- data/doc/guides/source/routing_outside_in.txt +0 -986
- data/doc/guides/source/security.txt +0 -984
- data/doc/guides/source/stylesheets/base.css +0 -358
- data/doc/guides/source/stylesheets/forms.css +0 -35
- data/doc/guides/source/stylesheets/more.css +0 -82
- data/doc/guides/source/templates/guides.html.erb +0 -97
- data/doc/guides/source/templates/inline.css +0 -165
- data/doc/guides/source/testing_rails_applications.txt +0 -995
- data/environments/boot.rb +0 -109
- data/environments/development.rb +0 -17
- data/environments/environment.rb +0 -75
- data/environments/production.rb +0 -24
- data/environments/test.rb +0 -22
- data/fresh_rakefile +0 -10
- data/helpers/application.rb +0 -15
- data/helpers/application_helper.rb +0 -3
- data/helpers/performance_test.rb +0 -9
- data/helpers/test_helper.rb +0 -38
- data/html/404.html +0 -30
- data/html/422.html +0 -30
- data/html/500.html +0 -33
- data/html/favicon.ico +0 -0
- data/html/images/rails.png +0 -0
- data/html/index.html +0 -274
- data/html/javascripts/application.js +0 -2
- data/html/javascripts/controls.js +0 -963
- data/html/javascripts/dragdrop.js +0 -973
- data/html/javascripts/effects.js +0 -1128
- data/html/javascripts/prototype.js +0 -4320
- data/html/robots.txt +0 -5
- data/lib/code_statistics.rb +0 -107
- data/lib/commands.rb +0 -17
- data/lib/commands/about.rb +0 -3
- data/lib/commands/console.rb +0 -45
- data/lib/commands/dbconsole.rb +0 -67
- data/lib/commands/destroy.rb +0 -6
- data/lib/commands/generate.rb +0 -6
- data/lib/commands/ncgi/listener +0 -86
- data/lib/commands/ncgi/tracker +0 -69
- data/lib/commands/performance/benchmarker.rb +0 -24
- data/lib/commands/performance/profiler.rb +0 -50
- data/lib/commands/performance/request.rb +0 -6
- data/lib/commands/plugin.rb +0 -967
- data/lib/commands/process/inspector.rb +0 -68
- data/lib/commands/process/reaper.rb +0 -149
- data/lib/commands/process/spawner.rb +0 -219
- data/lib/commands/process/spinner.rb +0 -57
- data/lib/commands/runner.rb +0 -48
- data/lib/commands/server.rb +0 -49
- data/lib/commands/servers/base.rb +0 -31
- data/lib/commands/servers/lighttpd.rb +0 -94
- data/lib/commands/servers/mongrel.rb +0 -69
- data/lib/commands/servers/new_mongrel.rb +0 -16
- data/lib/commands/servers/thin.rb +0 -25
- data/lib/commands/servers/webrick.rb +0 -66
- data/lib/commands/update.rb +0 -4
- data/lib/console_app.rb +0 -30
- data/lib/console_sandbox.rb +0 -6
- data/lib/console_with_helpers.rb +0 -26
- data/lib/dispatcher.rb +0 -24
- data/lib/fcgi_handler.rb +0 -237
- data/lib/initializer.rb +0 -1038
- data/lib/performance_test_help.rb +0 -5
- data/lib/rails/gem_builder.rb +0 -21
- data/lib/rails/gem_dependency.rb +0 -251
- data/lib/rails/mongrel_server/commands.rb +0 -342
- data/lib/rails/mongrel_server/handler.rb +0 -55
- data/lib/rails/plugin.rb +0 -124
- data/lib/rails/plugin/loader.rb +0 -152
- data/lib/rails/plugin/locator.rb +0 -100
- data/lib/rails/rack.rb +0 -6
- data/lib/rails/rack/logger.rb +0 -28
- data/lib/rails/rack/static.rb +0 -35
- data/lib/rails/vendor_gem_source_index.rb +0 -140
- data/lib/rails/version.rb +0 -9
- data/lib/rails_generator.rb +0 -43
- data/lib/rails_generator/base.rb +0 -263
- data/lib/rails_generator/commands.rb +0 -616
- data/lib/rails_generator/generated_attribute.rb +0 -46
- data/lib/rails_generator/generators/applications/app/USAGE +0 -9
- data/lib/rails_generator/generators/applications/app/app_generator.rb +0 -184
- data/lib/rails_generator/generators/components/controller/USAGE +0 -29
- data/lib/rails_generator/generators/components/controller/controller_generator.rb +0 -37
- data/lib/rails_generator/generators/components/controller/templates/controller.rb +0 -7
- data/lib/rails_generator/generators/components/controller/templates/functional_test.rb +0 -8
- data/lib/rails_generator/generators/components/controller/templates/helper.rb +0 -2
- data/lib/rails_generator/generators/components/controller/templates/view.html.erb +0 -2
- data/lib/rails_generator/generators/components/integration_test/USAGE +0 -8
- data/lib/rails_generator/generators/components/integration_test/integration_test_generator.rb +0 -16
- data/lib/rails_generator/generators/components/integration_test/templates/integration_test.rb +0 -10
- data/lib/rails_generator/generators/components/mailer/USAGE +0 -16
- data/lib/rails_generator/generators/components/mailer/mailer_generator.rb +0 -30
- data/lib/rails_generator/generators/components/mailer/templates/fixture.erb +0 -3
- data/lib/rails_generator/generators/components/mailer/templates/fixture.rhtml +0 -0
- data/lib/rails_generator/generators/components/mailer/templates/mailer.rb +0 -15
- data/lib/rails_generator/generators/components/mailer/templates/unit_test.rb +0 -20
- data/lib/rails_generator/generators/components/mailer/templates/view.erb +0 -3
- data/lib/rails_generator/generators/components/mailer/templates/view.rhtml +0 -0
- data/lib/rails_generator/generators/components/migration/USAGE +0 -29
- data/lib/rails_generator/generators/components/migration/migration_generator.rb +0 -20
- data/lib/rails_generator/generators/components/migration/templates/migration.rb +0 -11
- data/lib/rails_generator/generators/components/model/USAGE +0 -27
- data/lib/rails_generator/generators/components/model/model_generator.rb +0 -45
- data/lib/rails_generator/generators/components/model/templates/fixtures.yml +0 -19
- data/lib/rails_generator/generators/components/model/templates/migration.rb +0 -16
- data/lib/rails_generator/generators/components/model/templates/model.rb +0 -5
- data/lib/rails_generator/generators/components/model/templates/unit_test.rb +0 -8
- data/lib/rails_generator/generators/components/observer/USAGE +0 -13
- data/lib/rails_generator/generators/components/observer/observer_generator.rb +0 -16
- data/lib/rails_generator/generators/components/observer/templates/observer.rb +0 -2
- data/lib/rails_generator/generators/components/observer/templates/unit_test.rb +0 -8
- data/lib/rails_generator/generators/components/performance_test/USAGE +0 -8
- data/lib/rails_generator/generators/components/performance_test/performance_test_generator.rb +0 -16
- data/lib/rails_generator/generators/components/performance_test/templates/performance_test.rb +0 -9
- data/lib/rails_generator/generators/components/plugin/USAGE +0 -25
- data/lib/rails_generator/generators/components/plugin/plugin_generator.rb +0 -39
- data/lib/rails_generator/generators/components/plugin/templates/MIT-LICENSE +0 -20
- data/lib/rails_generator/generators/components/plugin/templates/README +0 -13
- data/lib/rails_generator/generators/components/plugin/templates/Rakefile +0 -23
- data/lib/rails_generator/generators/components/plugin/templates/USAGE +0 -8
- data/lib/rails_generator/generators/components/plugin/templates/generator.rb +0 -8
- data/lib/rails_generator/generators/components/plugin/templates/init.rb +0 -1
- data/lib/rails_generator/generators/components/plugin/templates/install.rb +0 -1
- data/lib/rails_generator/generators/components/plugin/templates/plugin.rb +0 -1
- data/lib/rails_generator/generators/components/plugin/templates/tasks.rake +0 -4
- data/lib/rails_generator/generators/components/plugin/templates/test_helper.rb +0 -3
- data/lib/rails_generator/generators/components/plugin/templates/uninstall.rb +0 -1
- data/lib/rails_generator/generators/components/plugin/templates/unit_test.rb +0 -8
- data/lib/rails_generator/generators/components/resource/USAGE +0 -23
- data/lib/rails_generator/generators/components/resource/resource_generator.rb +0 -74
- data/lib/rails_generator/generators/components/resource/templates/controller.rb +0 -2
- data/lib/rails_generator/generators/components/resource/templates/functional_test.rb +0 -8
- data/lib/rails_generator/generators/components/resource/templates/helper.rb +0 -2
- data/lib/rails_generator/generators/components/scaffold/USAGE +0 -29
- data/lib/rails_generator/generators/components/scaffold/scaffold_generator.rb +0 -100
- data/lib/rails_generator/generators/components/scaffold/templates/controller.rb +0 -85
- data/lib/rails_generator/generators/components/scaffold/templates/functional_test.rb +0 -45
- data/lib/rails_generator/generators/components/scaffold/templates/helper.rb +0 -2
- data/lib/rails_generator/generators/components/scaffold/templates/layout.html.erb +0 -17
- data/lib/rails_generator/generators/components/scaffold/templates/style.css +0 -54
- data/lib/rails_generator/generators/components/scaffold/templates/view_edit.html.erb +0 -18
- data/lib/rails_generator/generators/components/scaffold/templates/view_index.html.erb +0 -24
- data/lib/rails_generator/generators/components/scaffold/templates/view_new.html.erb +0 -17
- data/lib/rails_generator/generators/components/scaffold/templates/view_show.html.erb +0 -10
- data/lib/rails_generator/generators/components/session_migration/USAGE +0 -10
- data/lib/rails_generator/generators/components/session_migration/session_migration_generator.rb +0 -18
- data/lib/rails_generator/generators/components/session_migration/templates/migration.rb +0 -16
- data/lib/rails_generator/lookup.rb +0 -249
- data/lib/rails_generator/manifest.rb +0 -53
- data/lib/rails_generator/options.rb +0 -150
- data/lib/rails_generator/scripts.rb +0 -89
- data/lib/rails_generator/scripts/destroy.rb +0 -29
- data/lib/rails_generator/scripts/generate.rb +0 -7
- data/lib/rails_generator/scripts/update.rb +0 -12
- data/lib/rails_generator/secret_key_generator.rb +0 -22
- data/lib/rails_generator/simple_logger.rb +0 -46
- data/lib/rails_generator/spec.rb +0 -44
- data/lib/railties_path.rb +0 -1
- data/lib/ruby_version_check.rb +0 -17
- data/lib/rubyprof_ext.rb +0 -35
- data/lib/source_annotation_extractor.rb +0 -102
- data/lib/tasks/annotations.rake +0 -20
- data/lib/tasks/databases.rake +0 -416
- data/lib/tasks/documentation.rake +0 -95
- data/lib/tasks/framework.rake +0 -118
- data/lib/tasks/gems.rake +0 -80
- data/lib/tasks/log.rake +0 -9
- data/lib/tasks/misc.rake +0 -56
- data/lib/tasks/rails.rb +0 -8
- data/lib/tasks/routes.rake +0 -17
- data/lib/tasks/statistics.rake +0 -18
- data/lib/tasks/testing.rake +0 -139
- data/lib/tasks/tmp.rake +0 -37
- data/lib/test_help.rb +0 -27
- data/lib/webrick_server.rb +0 -156
@@ -1,68 +0,0 @@
|
|
1
|
-
require 'optparse'
|
2
|
-
|
3
|
-
if RUBY_PLATFORM =~ /(:?mswin|mingw)/ then abort("Inspector is only for Unix") end
|
4
|
-
|
5
|
-
OPTIONS = {
|
6
|
-
:pid_path => File.expand_path(RAILS_ROOT + '/tmp/pids'),
|
7
|
-
:pattern => "dispatch.*.pid",
|
8
|
-
:ps => "ps -o pid,state,user,start,time,pcpu,vsz,majflt,command -p %s"
|
9
|
-
}
|
10
|
-
|
11
|
-
class Inspector
|
12
|
-
def self.inspect(pid_path, pattern)
|
13
|
-
new(pid_path, pattern).inspect
|
14
|
-
end
|
15
|
-
|
16
|
-
def initialize(pid_path, pattern)
|
17
|
-
@pid_path, @pattern = pid_path, pattern
|
18
|
-
end
|
19
|
-
|
20
|
-
def inspect
|
21
|
-
header = `#{OPTIONS[:ps] % 1}`.split("\n")[0] + "\n"
|
22
|
-
lines = pids.collect { |pid| `#{OPTIONS[:ps] % pid}`.split("\n")[1] }
|
23
|
-
|
24
|
-
puts(header + lines.join("\n"))
|
25
|
-
end
|
26
|
-
|
27
|
-
private
|
28
|
-
def pids
|
29
|
-
pid_files.collect do |pid_file|
|
30
|
-
File.read(pid_file).to_i
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
def pid_files
|
35
|
-
Dir.glob(@pid_path + "/" + @pattern)
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
|
40
|
-
ARGV.options do |opts|
|
41
|
-
opts.banner = "Usage: inspector [options]"
|
42
|
-
|
43
|
-
opts.separator ""
|
44
|
-
|
45
|
-
opts.on <<-EOF
|
46
|
-
Description:
|
47
|
-
Displays system information about Rails dispatchers (or other processes that use pid files) through
|
48
|
-
the ps command.
|
49
|
-
|
50
|
-
Examples:
|
51
|
-
inspector # default ps on all tmp/pids/dispatch.*.pid files
|
52
|
-
inspector -s 'ps -o user,start,majflt,pcpu,vsz -p %s' # custom ps, %s is where the pid is interleaved
|
53
|
-
EOF
|
54
|
-
|
55
|
-
opts.on(" Options:")
|
56
|
-
|
57
|
-
opts.on("-s", "--ps=command", "default: #{OPTIONS[:ps]}", String) { |v| OPTIONS[:ps] = v }
|
58
|
-
opts.on("-p", "--pidpath=path", "default: #{OPTIONS[:pid_path]}", String) { |v| OPTIONS[:pid_path] = v }
|
59
|
-
opts.on("-r", "--pattern=pattern", "default: #{OPTIONS[:pattern]}", String) { |v| OPTIONS[:pattern] = v }
|
60
|
-
|
61
|
-
opts.separator ""
|
62
|
-
|
63
|
-
opts.on("-h", "--help", "Show this help message.") { puts opts; exit }
|
64
|
-
|
65
|
-
opts.parse!
|
66
|
-
end
|
67
|
-
|
68
|
-
Inspector.inspect(OPTIONS[:pid_path], OPTIONS[:pattern])
|
@@ -1,149 +0,0 @@
|
|
1
|
-
require 'optparse'
|
2
|
-
require 'net/http'
|
3
|
-
require 'uri'
|
4
|
-
|
5
|
-
if RUBY_PLATFORM =~ /(:?mswin|mingw)/ then abort("Reaper is only for Unix") end
|
6
|
-
|
7
|
-
class Killer
|
8
|
-
class << self
|
9
|
-
# Searches for all processes matching the given keywords, and then invokes
|
10
|
-
# a specific action on each of them. This is useful for (e.g.) reloading a
|
11
|
-
# set of processes:
|
12
|
-
#
|
13
|
-
# Killer.process(:reload, "/tmp/pids", "dispatcher.*.pid")
|
14
|
-
def process(action, pid_path, pattern, keyword)
|
15
|
-
new(pid_path, pattern, keyword).process(action)
|
16
|
-
end
|
17
|
-
|
18
|
-
# Forces the (rails) application to reload by sending a +HUP+ signal to the
|
19
|
-
# process.
|
20
|
-
def reload(pid)
|
21
|
-
`kill -s HUP #{pid}`
|
22
|
-
end
|
23
|
-
|
24
|
-
# Force the (rails) application to restart by sending a +USR2+ signal to the
|
25
|
-
# process.
|
26
|
-
def restart(pid)
|
27
|
-
`kill -s USR2 #{pid}`
|
28
|
-
end
|
29
|
-
|
30
|
-
# Forces the (rails) application to gracefully terminate by sending a
|
31
|
-
# +TERM+ signal to the process.
|
32
|
-
def graceful(pid)
|
33
|
-
`kill -s TERM #{pid}`
|
34
|
-
end
|
35
|
-
|
36
|
-
# Forces the (rails) application to terminate immediately by sending a -9
|
37
|
-
# signal to the process.
|
38
|
-
def kill(pid)
|
39
|
-
`kill -9 #{pid}`
|
40
|
-
end
|
41
|
-
|
42
|
-
# Send a +USR1+ signal to the process.
|
43
|
-
def usr1(pid)
|
44
|
-
`kill -s USR1 #{pid}`
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
def initialize(pid_path, pattern, keyword=nil)
|
49
|
-
@pid_path, @pattern, @keyword = pid_path, pattern, keyword
|
50
|
-
end
|
51
|
-
|
52
|
-
def process(action)
|
53
|
-
pids = find_processes
|
54
|
-
|
55
|
-
if pids.empty?
|
56
|
-
warn "Couldn't find any pid file in '#{@pid_path}' matching '#{@pattern}'"
|
57
|
-
warn "(also looked for processes matching #{@keyword.inspect})" if @keyword
|
58
|
-
else
|
59
|
-
pids.each do |pid|
|
60
|
-
puts "#{action.capitalize}ing #{pid}"
|
61
|
-
self.class.send(action, pid)
|
62
|
-
end
|
63
|
-
|
64
|
-
delete_pid_files if terminating?(action)
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
private
|
69
|
-
def terminating?(action)
|
70
|
-
[ "kill", "graceful" ].include?(action)
|
71
|
-
end
|
72
|
-
|
73
|
-
def find_processes
|
74
|
-
files = pid_files
|
75
|
-
if files.empty?
|
76
|
-
find_processes_via_grep
|
77
|
-
else
|
78
|
-
files.collect { |pid_file| File.read(pid_file).to_i }
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
def find_processes_via_grep
|
83
|
-
lines = `ps axww -o 'pid command' | grep #{@keyword}`.split(/\n/).
|
84
|
-
reject { |line| line =~ /inq|ps axww|grep|spawn-fcgi|spawner|reaper/ }
|
85
|
-
lines.map { |line| line[/^\s*(\d+)/, 1].to_i }
|
86
|
-
end
|
87
|
-
|
88
|
-
def delete_pid_files
|
89
|
-
pid_files.each { |pid_file| File.delete(pid_file) }
|
90
|
-
end
|
91
|
-
|
92
|
-
def pid_files
|
93
|
-
Dir.glob(@pid_path + "/" + @pattern)
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
|
98
|
-
OPTIONS = {
|
99
|
-
:action => "restart",
|
100
|
-
:pid_path => File.expand_path(RAILS_ROOT + '/tmp/pids'),
|
101
|
-
:pattern => "dispatch.[0-9]*.pid",
|
102
|
-
:dispatcher => File.expand_path("#{RAILS_ROOT}/public/dispatch.fcgi")
|
103
|
-
}
|
104
|
-
|
105
|
-
ARGV.options do |opts|
|
106
|
-
opts.banner = "Usage: reaper [options]"
|
107
|
-
|
108
|
-
opts.separator ""
|
109
|
-
|
110
|
-
opts.on <<-EOF
|
111
|
-
Description:
|
112
|
-
The reaper is used to restart, reload, gracefully exit, and forcefully exit processes
|
113
|
-
running a Rails Dispatcher (or any other process responding to the same signals). This
|
114
|
-
is commonly done when a new version of the application is available, so the existing
|
115
|
-
processes can be updated to use the latest code.
|
116
|
-
|
117
|
-
It uses pid files to work on the processes and by default assume them to be located
|
118
|
-
in RAILS_ROOT/tmp/pids.
|
119
|
-
|
120
|
-
The reaper actions are:
|
121
|
-
|
122
|
-
* restart : Restarts the application by reloading both application and framework code
|
123
|
-
* reload : Only reloads the application, but not the framework (like the development environment)
|
124
|
-
* graceful: Marks all of the processes for exit after the next request
|
125
|
-
* kill : Forcefully exists all processes regardless of whether they're currently serving a request
|
126
|
-
|
127
|
-
Restart is the most common and default action.
|
128
|
-
|
129
|
-
Examples:
|
130
|
-
reaper # restarts the default dispatchers
|
131
|
-
reaper -a reload # reload the default dispatchers
|
132
|
-
reaper -a kill -r *.pid # kill all processes that keep pids in tmp/pids
|
133
|
-
EOF
|
134
|
-
|
135
|
-
opts.on(" Options:")
|
136
|
-
|
137
|
-
opts.on("-a", "--action=name", "reload|graceful|kill (default: #{OPTIONS[:action]})", String) { |v| OPTIONS[:action] = v }
|
138
|
-
opts.on("-p", "--pidpath=path", "default: #{OPTIONS[:pid_path]}", String) { |v| OPTIONS[:pid_path] = v }
|
139
|
-
opts.on("-r", "--pattern=pattern", "default: #{OPTIONS[:pattern]}", String) { |v| OPTIONS[:pattern] = v }
|
140
|
-
opts.on("-d", "--dispatcher=path", "DEPRECATED. default: #{OPTIONS[:dispatcher]}", String) { |v| OPTIONS[:dispatcher] = v }
|
141
|
-
|
142
|
-
opts.separator ""
|
143
|
-
|
144
|
-
opts.on("-h", "--help", "Show this help message.") { puts opts; exit }
|
145
|
-
|
146
|
-
opts.parse!
|
147
|
-
end
|
148
|
-
|
149
|
-
Killer.process(OPTIONS[:action], OPTIONS[:pid_path], OPTIONS[:pattern], OPTIONS[:dispatcher])
|
@@ -1,219 +0,0 @@
|
|
1
|
-
require 'active_support'
|
2
|
-
require 'optparse'
|
3
|
-
require 'socket'
|
4
|
-
require 'fileutils'
|
5
|
-
|
6
|
-
def daemonize #:nodoc:
|
7
|
-
exit if fork # Parent exits, child continues.
|
8
|
-
Process.setsid # Become session leader.
|
9
|
-
exit if fork # Zap session leader. See [1].
|
10
|
-
Dir.chdir "/" # Release old working directory.
|
11
|
-
File.umask 0000 # Ensure sensible umask. Adjust as needed.
|
12
|
-
STDIN.reopen "/dev/null" # Free file descriptors and
|
13
|
-
STDOUT.reopen "/dev/null", "a" # point them somewhere sensible.
|
14
|
-
STDERR.reopen STDOUT # STDOUT/ERR should better go to a logfile.
|
15
|
-
end
|
16
|
-
|
17
|
-
class Spawner
|
18
|
-
def self.record_pid(name = "#{OPTIONS[:process]}.spawner", id = Process.pid)
|
19
|
-
FileUtils.mkdir_p(OPTIONS[:pids])
|
20
|
-
File.open(File.expand_path(OPTIONS[:pids] + "/#{name}.pid"), "w+") { |f| f.write(id) }
|
21
|
-
end
|
22
|
-
|
23
|
-
def self.spawn_all
|
24
|
-
OPTIONS[:instances].times do |i|
|
25
|
-
port = OPTIONS[:port] + i
|
26
|
-
print "Checking if something is already running on #{OPTIONS[:address]}:#{port}..."
|
27
|
-
|
28
|
-
begin
|
29
|
-
srv = TCPServer.new(OPTIONS[:address], port)
|
30
|
-
srv.close
|
31
|
-
srv = nil
|
32
|
-
|
33
|
-
puts "NO"
|
34
|
-
puts "Starting dispatcher on port: #{OPTIONS[:address]}:#{port}"
|
35
|
-
|
36
|
-
FileUtils.mkdir_p(OPTIONS[:pids])
|
37
|
-
spawn(port)
|
38
|
-
rescue
|
39
|
-
puts "YES"
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
class FcgiSpawner < Spawner
|
46
|
-
def self.spawn(port)
|
47
|
-
cmd = "#{OPTIONS[:spawner]} -f #{OPTIONS[:dispatcher]} -p #{port} -P #{OPTIONS[:pids]}/#{OPTIONS[:process]}.#{port}.pid"
|
48
|
-
cmd << " -a #{OPTIONS[:address]}" if can_bind_to_custom_address?
|
49
|
-
system(cmd)
|
50
|
-
end
|
51
|
-
|
52
|
-
def self.can_bind_to_custom_address?
|
53
|
-
@@can_bind_to_custom_address ||= /^\s-a\s/.match `#{OPTIONS[:spawner]} -h`
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
class MongrelSpawner < Spawner
|
58
|
-
def self.spawn(port)
|
59
|
-
cmd =
|
60
|
-
"mongrel_rails start -d " +
|
61
|
-
"-a #{OPTIONS[:address]} " +
|
62
|
-
"-p #{port} " +
|
63
|
-
"-P #{OPTIONS[:pids]}/#{OPTIONS[:process]}.#{port}.pid " +
|
64
|
-
"-e #{OPTIONS[:environment]} " +
|
65
|
-
"-c #{OPTIONS[:rails_root]} " +
|
66
|
-
"-l #{OPTIONS[:rails_root]}/log/mongrel.log"
|
67
|
-
|
68
|
-
# Add prefix functionality to spawner's call to mongrel_rails
|
69
|
-
# Digging through mongrel's project subversion server, the earliest
|
70
|
-
# Tag that has prefix implemented in the bin/mongrel_rails file
|
71
|
-
# is 0.3.15 which also happens to be the earliest tag listed.
|
72
|
-
# References: http://mongrel.rubyforge.org/svn/tags
|
73
|
-
if Mongrel::Const::MONGREL_VERSION.to_f >=0.3 && !OPTIONS[:prefix].nil?
|
74
|
-
cmd = cmd + " --prefix #{OPTIONS[:prefix]}"
|
75
|
-
end
|
76
|
-
system(cmd)
|
77
|
-
end
|
78
|
-
|
79
|
-
def self.can_bind_to_custom_address?
|
80
|
-
true
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
|
85
|
-
begin
|
86
|
-
require_library_or_gem 'fcgi'
|
87
|
-
rescue Exception
|
88
|
-
# FCGI not available
|
89
|
-
end
|
90
|
-
|
91
|
-
begin
|
92
|
-
require_library_or_gem 'mongrel'
|
93
|
-
rescue Exception
|
94
|
-
# Mongrel not available
|
95
|
-
end
|
96
|
-
|
97
|
-
server = case ARGV.first
|
98
|
-
when "fcgi", "mongrel"
|
99
|
-
ARGV.shift
|
100
|
-
else
|
101
|
-
if defined?(Mongrel)
|
102
|
-
"mongrel"
|
103
|
-
elsif RUBY_PLATFORM !~ /(:?mswin|mingw)/ && !silence_stderr { `spawn-fcgi -version` }.blank? && defined?(FCGI)
|
104
|
-
"fcgi"
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
case server
|
109
|
-
when "fcgi"
|
110
|
-
puts "=> Starting FCGI dispatchers"
|
111
|
-
spawner_class = FcgiSpawner
|
112
|
-
when "mongrel"
|
113
|
-
puts "=> Starting mongrel dispatchers"
|
114
|
-
spawner_class = MongrelSpawner
|
115
|
-
else
|
116
|
-
puts "Neither FCGI (spawn-fcgi) nor Mongrel was installed and available!"
|
117
|
-
exit(0)
|
118
|
-
end
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
OPTIONS = {
|
123
|
-
:environment => "production",
|
124
|
-
:spawner => '/usr/bin/env spawn-fcgi',
|
125
|
-
:dispatcher => File.expand_path(RELATIVE_RAILS_ROOT + '/public/dispatch.fcgi'),
|
126
|
-
:pids => File.expand_path(RELATIVE_RAILS_ROOT + "/tmp/pids"),
|
127
|
-
:rails_root => File.expand_path(RELATIVE_RAILS_ROOT),
|
128
|
-
:process => "dispatch",
|
129
|
-
:port => 8000,
|
130
|
-
:address => '0.0.0.0',
|
131
|
-
:instances => 3,
|
132
|
-
:repeat => nil,
|
133
|
-
:prefix => nil
|
134
|
-
}
|
135
|
-
|
136
|
-
ARGV.options do |opts|
|
137
|
-
opts.banner = "Usage: spawner [platform] [options]"
|
138
|
-
|
139
|
-
opts.separator ""
|
140
|
-
|
141
|
-
opts.on <<-EOF
|
142
|
-
Description:
|
143
|
-
The spawner is a wrapper for spawn-fcgi and mongrel that makes it
|
144
|
-
easier to start multiple processes running the Rails dispatcher. The
|
145
|
-
spawn-fcgi command is included with the lighttpd web server, but can
|
146
|
-
be used with both Apache and lighttpd (and any other web server
|
147
|
-
supporting externally managed FCGI processes). Mongrel automatically
|
148
|
-
ships with with mongrel_rails for starting dispatchers.
|
149
|
-
|
150
|
-
The first choice you need to make is whether to spawn the Rails
|
151
|
-
dispatchers as FCGI or Mongrel. By default, this spawner will prefer
|
152
|
-
Mongrel, so if that's installed, and no platform choice is made,
|
153
|
-
Mongrel is used.
|
154
|
-
|
155
|
-
Then decide a starting port (default is 8000) and the number of FCGI
|
156
|
-
process instances you'd like to run. So if you pick 9100 and 3
|
157
|
-
instances, you'll start processes on 9100, 9101, and 9102.
|
158
|
-
|
159
|
-
By setting the repeat option, you get a protection loop, which will
|
160
|
-
attempt to restart any FCGI processes that might have been exited or
|
161
|
-
outright crashed.
|
162
|
-
|
163
|
-
You can select bind address for started processes. By default these
|
164
|
-
listen on every interface. For single machine installations you would
|
165
|
-
probably want to use 127.0.0.1, hiding them form the outside world.
|
166
|
-
|
167
|
-
Examples:
|
168
|
-
spawner # starts instances on 8000, 8001, and 8002
|
169
|
-
# using Mongrel if available.
|
170
|
-
spawner fcgi # starts instances on 8000, 8001, and 8002
|
171
|
-
# using FCGI.
|
172
|
-
spawner mongrel -i 5 # starts instances on 8000, 8001, 8002,
|
173
|
-
# 8003, and 8004 using Mongrel.
|
174
|
-
spawner -p 9100 -i 10 # starts 10 instances counting from 9100 to
|
175
|
-
# 9109 using Mongrel if available.
|
176
|
-
spawner -p 9100 -r 5 # starts 3 instances counting from 9100 to
|
177
|
-
# 9102 and attempts start them every 5
|
178
|
-
# seconds.
|
179
|
-
spawner -a 127.0.0.1 # starts 3 instances binding to localhost
|
180
|
-
EOF
|
181
|
-
|
182
|
-
opts.on(" Options:")
|
183
|
-
|
184
|
-
opts.on("-p", "--port=number", Integer, "Starting port number (default: #{OPTIONS[:port]})") { |v| OPTIONS[:port] = v }
|
185
|
-
|
186
|
-
if spawner_class.can_bind_to_custom_address?
|
187
|
-
opts.on("-a", "--address=ip", String, "Bind to IP address (default: #{OPTIONS[:address]})") { |v| OPTIONS[:address] = v }
|
188
|
-
end
|
189
|
-
|
190
|
-
opts.on("-p", "--port=number", Integer, "Starting port number (default: #{OPTIONS[:port]})") { |v| OPTIONS[:port] = v }
|
191
|
-
opts.on("-i", "--instances=number", Integer, "Number of instances (default: #{OPTIONS[:instances]})") { |v| OPTIONS[:instances] = v }
|
192
|
-
opts.on("-r", "--repeat=seconds", Integer, "Repeat spawn attempts every n seconds (default: off)") { |v| OPTIONS[:repeat] = v }
|
193
|
-
opts.on("-e", "--environment=name", String, "test|development|production (default: #{OPTIONS[:environment]})") { |v| OPTIONS[:environment] = v }
|
194
|
-
opts.on("-P", "--prefix=path", String, "URL prefix for Rails app. [Used only with Mongrel > v0.3.15]: (default: #{OPTIONS[:prefix]})") { |v| OPTIONS[:prefix] = v }
|
195
|
-
opts.on("-n", "--process=name", String, "default: #{OPTIONS[:process]}") { |v| OPTIONS[:process] = v }
|
196
|
-
opts.on("-s", "--spawner=path", String, "default: #{OPTIONS[:spawner]}") { |v| OPTIONS[:spawner] = v }
|
197
|
-
opts.on("-d", "--dispatcher=path", String, "default: #{OPTIONS[:dispatcher]}") { |dispatcher| OPTIONS[:dispatcher] = File.expand_path(dispatcher) }
|
198
|
-
|
199
|
-
opts.separator ""
|
200
|
-
|
201
|
-
opts.on("-h", "--help", "Show this help message.") { puts opts; exit }
|
202
|
-
|
203
|
-
opts.parse!
|
204
|
-
end
|
205
|
-
|
206
|
-
ENV["RAILS_ENV"] = OPTIONS[:environment]
|
207
|
-
|
208
|
-
if OPTIONS[:repeat]
|
209
|
-
daemonize
|
210
|
-
trap("TERM") { exit }
|
211
|
-
spawner_class.record_pid
|
212
|
-
|
213
|
-
loop do
|
214
|
-
spawner_class.spawn_all
|
215
|
-
sleep(OPTIONS[:repeat])
|
216
|
-
end
|
217
|
-
else
|
218
|
-
spawner_class.spawn_all
|
219
|
-
end
|
@@ -1,57 +0,0 @@
|
|
1
|
-
require 'optparse'
|
2
|
-
|
3
|
-
def daemonize #:nodoc:
|
4
|
-
exit if fork # Parent exits, child continues.
|
5
|
-
Process.setsid # Become session leader.
|
6
|
-
exit if fork # Zap session leader. See [1].
|
7
|
-
Dir.chdir "/" # Release old working directory.
|
8
|
-
File.umask 0000 # Ensure sensible umask. Adjust as needed.
|
9
|
-
STDIN.reopen "/dev/null" # Free file descriptors and
|
10
|
-
STDOUT.reopen "/dev/null", "a" # point them somewhere sensible.
|
11
|
-
STDERR.reopen STDOUT # STDOUT/ERR should better go to a logfile.
|
12
|
-
end
|
13
|
-
|
14
|
-
OPTIONS = {
|
15
|
-
:interval => 5.0,
|
16
|
-
:command => File.expand_path(RAILS_ROOT + '/script/process/spawner'),
|
17
|
-
:daemon => false
|
18
|
-
}
|
19
|
-
|
20
|
-
ARGV.options do |opts|
|
21
|
-
opts.banner = "Usage: spinner [options]"
|
22
|
-
|
23
|
-
opts.separator ""
|
24
|
-
|
25
|
-
opts.on <<-EOF
|
26
|
-
Description:
|
27
|
-
The spinner is a protection loop for the spawner, which will attempt to restart any FCGI processes
|
28
|
-
that might have been exited or outright crashed. It's a brute-force attempt that'll just try
|
29
|
-
to run the spawner every X number of seconds, so it does pose a light load on the server.
|
30
|
-
|
31
|
-
Examples:
|
32
|
-
spinner # attempts to run the spawner with default settings every second with output on the terminal
|
33
|
-
spinner -i 3 -d # only run the spawner every 3 seconds and detach from the terminal to become a daemon
|
34
|
-
spinner -c '/path/to/app/script/process/spawner -p 9000 -i 10' -d # using custom spawner
|
35
|
-
EOF
|
36
|
-
|
37
|
-
opts.on(" Options:")
|
38
|
-
|
39
|
-
opts.on("-c", "--command=path", String) { |v| OPTIONS[:command] = v }
|
40
|
-
opts.on("-i", "--interval=seconds", Float) { |v| OPTIONS[:interval] = v }
|
41
|
-
opts.on("-d", "--daemon") { |v| OPTIONS[:daemon] = v }
|
42
|
-
|
43
|
-
opts.separator ""
|
44
|
-
|
45
|
-
opts.on("-h", "--help", "Show this help message.") { puts opts; exit }
|
46
|
-
|
47
|
-
opts.parse!
|
48
|
-
end
|
49
|
-
|
50
|
-
daemonize if OPTIONS[:daemon]
|
51
|
-
|
52
|
-
trap(OPTIONS[:daemon] ? "TERM" : "INT") { exit }
|
53
|
-
|
54
|
-
loop do
|
55
|
-
system(OPTIONS[:command])
|
56
|
-
sleep(OPTIONS[:interval])
|
57
|
-
end
|