passenger 5.0.0.beta3 → 5.0.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of passenger might be problematic. Click here for more details.
- checksums.yaml +8 -8
- checksums.yaml.gz.asc +7 -7
- data.tar.gz.asc +7 -7
- data/.editorconfig +11 -5
- data/CHANGELOG +38 -0
- data/CONTRIBUTING.md +1 -4
- data/Gemfile +0 -1
- data/Gemfile.lock +0 -2
- data/Rakefile +33 -33
- data/bin/passenger +1 -1
- data/bin/passenger-config +1 -1
- data/bin/passenger-install-apache2-module +800 -800
- data/bin/passenger-install-nginx-module +592 -592
- data/bin/passenger-memory-stats +127 -127
- data/bin/passenger-status +216 -216
- data/build/agents.rb +127 -127
- data/build/apache2.rb +87 -87
- data/build/basics.rb +60 -60
- data/build/common_library.rb +165 -165
- data/build/cplusplus_support.rb +51 -51
- data/build/cxx_tests.rb +268 -268
- data/build/debian.rb +143 -143
- data/build/documentation.rb +58 -58
- data/build/integration_tests.rb +81 -81
- data/build/misc.rb +132 -132
- data/build/nginx.rb +20 -20
- data/build/node_tests.rb +7 -7
- data/build/oxt_tests.rb +14 -14
- data/build/packaging.rb +570 -570
- data/build/preprocessor.rb +260 -260
- data/build/rake_extensions.rb +71 -71
- data/build/ruby_extension.rb +29 -29
- data/build/ruby_tests.rb +6 -6
- data/build/test_basics.rb +37 -37
- data/debian.template/control.template +3 -5
- data/dev/copy_boost_headers +134 -134
- data/dev/install_scripts_bootstrap_code.rb +25 -25
- data/dev/list_tests +20 -20
- data/dev/ruby_server.rb +223 -223
- data/dev/runner +18 -18
- data/doc/ServerOptimizationGuide.txt.md +55 -2
- data/doc/Users guide Nginx.txt +0 -26
- data/doc/Users guide Standalone.txt +5 -1
- data/doc/users_guide_snippets/tips.txt +9 -0
- data/ext/common/ApplicationPool2/Group.h +23 -11
- data/ext/common/ApplicationPool2/Implementation.cpp +32 -7
- data/ext/common/ApplicationPool2/Pool.h +22 -17
- data/ext/common/ApplicationPool2/SmartSpawner.h +4 -1
- data/ext/common/ApplicationPool2/Spawner.h +1 -1
- data/ext/common/Constants.h +1 -1
- data/ext/common/agents/Base.cpp +35 -20
- data/ext/common/agents/HelperAgent/Main.cpp +8 -1
- data/ext/common/agents/HelperAgent/OptionParser.h +18 -4
- data/ext/common/agents/HelperAgent/RequestHandler.h +2 -83
- data/ext/common/agents/HelperAgent/RequestHandler/ForwardResponse.cpp +54 -1
- data/ext/common/agents/HelperAgent/RequestHandler/InitRequest.cpp +7 -4
- data/ext/common/agents/Main.cpp +1 -1
- data/ext/common/agents/Watchdog/Main.cpp +54 -19
- data/ext/nginx/Configuration.c +7 -0
- data/ext/nginx/ContentHandler.c +9 -1
- data/helper-scripts/backtrace-sanitizer.rb +106 -87
- data/helper-scripts/crash-watch.rb +32 -0
- data/helper-scripts/download_binaries/extconf.rb +38 -38
- data/helper-scripts/meteor-loader.rb +107 -107
- data/helper-scripts/prespawn +101 -101
- data/helper-scripts/rack-loader.rb +96 -96
- data/helper-scripts/rack-preloader.rb +137 -137
- data/lib/phusion_passenger.rb +292 -292
- data/lib/phusion_passenger/abstract_installer.rb +438 -438
- data/lib/phusion_passenger/active_support3_extensions/init.rb +168 -170
- data/lib/phusion_passenger/admin_tools.rb +20 -20
- data/lib/phusion_passenger/admin_tools/instance.rb +178 -178
- data/lib/phusion_passenger/admin_tools/instance_registry.rb +61 -61
- data/lib/phusion_passenger/admin_tools/memory_stats.rb +267 -267
- data/lib/phusion_passenger/apache2/config_options.rb +182 -182
- data/lib/phusion_passenger/common_library.rb +479 -485
- data/lib/phusion_passenger/config/about_command.rb +161 -161
- data/lib/phusion_passenger/config/admin_command_command.rb +129 -129
- data/lib/phusion_passenger/config/agent_compiler.rb +121 -121
- data/lib/phusion_passenger/config/build_native_support_command.rb +43 -43
- data/lib/phusion_passenger/config/command.rb +25 -25
- data/lib/phusion_passenger/config/compile_agent_command.rb +62 -62
- data/lib/phusion_passenger/config/compile_nginx_engine_command.rb +88 -73
- data/lib/phusion_passenger/config/detach_process_command.rb +72 -72
- data/lib/phusion_passenger/config/download_agent_command.rb +246 -227
- data/lib/phusion_passenger/config/download_nginx_engine_command.rb +245 -224
- data/lib/phusion_passenger/config/install_agent_command.rb +144 -132
- data/lib/phusion_passenger/config/install_standalone_runtime_command.rb +205 -185
- data/lib/phusion_passenger/config/installation_utils.rb +204 -204
- data/lib/phusion_passenger/config/list_instances_command.rb +64 -64
- data/lib/phusion_passenger/config/main.rb +152 -152
- data/lib/phusion_passenger/config/nginx_engine_compiler.rb +319 -300
- data/lib/phusion_passenger/config/reopen_logs_command.rb +67 -67
- data/lib/phusion_passenger/config/restart_app_command.rb +155 -155
- data/lib/phusion_passenger/config/system_metrics_command.rb +13 -13
- data/lib/phusion_passenger/config/utils.rb +95 -95
- data/lib/phusion_passenger/config/validate_install_command.rb +198 -198
- data/lib/phusion_passenger/console_text_template.rb +25 -25
- data/lib/phusion_passenger/constants.rb +90 -90
- data/lib/phusion_passenger/debug_logging.rb +106 -106
- data/lib/phusion_passenger/loader_shared_helpers.rb +447 -432
- data/lib/phusion_passenger/message_channel.rb +312 -312
- data/lib/phusion_passenger/message_client.rb +176 -176
- data/lib/phusion_passenger/native_support.rb +369 -369
- data/lib/phusion_passenger/nginx/config_options.rb +297 -297
- data/lib/phusion_passenger/packaging.rb +131 -131
- data/lib/phusion_passenger/platform_info.rb +360 -360
- data/lib/phusion_passenger/platform_info/apache.rb +767 -767
- data/lib/phusion_passenger/platform_info/apache_detector.rb +199 -199
- data/lib/phusion_passenger/platform_info/binary_compatibility.rb +107 -107
- data/lib/phusion_passenger/platform_info/compiler.rb +570 -570
- data/lib/phusion_passenger/platform_info/curl.rb +32 -32
- data/lib/phusion_passenger/platform_info/cxx_portability.rb +188 -188
- data/lib/phusion_passenger/platform_info/depcheck.rb +372 -372
- data/lib/phusion_passenger/platform_info/depcheck_specs/apache2.rb +109 -109
- data/lib/phusion_passenger/platform_info/depcheck_specs/compiler_toolchain.rb +4 -4
- data/lib/phusion_passenger/platform_info/depcheck_specs/gems.rb +10 -34
- data/lib/phusion_passenger/platform_info/depcheck_specs/libs.rb +101 -101
- data/lib/phusion_passenger/platform_info/depcheck_specs/ruby.rb +5 -5
- data/lib/phusion_passenger/platform_info/depcheck_specs/utilities.rb +13 -13
- data/lib/phusion_passenger/platform_info/linux.rb +55 -55
- data/lib/phusion_passenger/platform_info/operating_system.rb +149 -149
- data/lib/phusion_passenger/platform_info/ruby.rb +468 -448
- data/lib/phusion_passenger/platform_info/zlib.rb +9 -9
- data/lib/phusion_passenger/plugin.rb +66 -66
- data/lib/phusion_passenger/preloader_shared_helpers.rb +126 -126
- data/lib/phusion_passenger/public_api.rb +191 -191
- data/lib/phusion_passenger/rack/out_of_band_gc.rb +93 -94
- data/lib/phusion_passenger/rack/thread_handler_extension.rb +231 -227
- data/lib/phusion_passenger/request_handler.rb +567 -577
- data/lib/phusion_passenger/request_handler/thread_handler.rb +379 -381
- data/lib/phusion_passenger/ruby_core_enhancements.rb +86 -86
- data/lib/phusion_passenger/ruby_core_io_enhancements.rb +74 -74
- data/lib/phusion_passenger/simple_benchmarking.rb +25 -25
- data/lib/phusion_passenger/standalone/app_finder.rb +153 -150
- data/lib/phusion_passenger/standalone/command.rb +44 -40
- data/lib/phusion_passenger/standalone/config_utils.rb +53 -53
- data/lib/phusion_passenger/standalone/control_utils.rb +38 -59
- data/lib/phusion_passenger/standalone/main.rb +73 -73
- data/lib/phusion_passenger/standalone/start_command.rb +697 -685
- data/lib/phusion_passenger/standalone/start_command/builtin_engine.rb +193 -155
- data/lib/phusion_passenger/standalone/start_command/nginx_engine.rb +162 -133
- data/lib/phusion_passenger/standalone/status_command.rb +64 -64
- data/lib/phusion_passenger/standalone/stop_command.rb +72 -72
- data/lib/phusion_passenger/standalone/version_command.rb +9 -9
- data/lib/phusion_passenger/union_station/connection.rb +32 -32
- data/lib/phusion_passenger/union_station/core.rb +251 -251
- data/lib/phusion_passenger/union_station/transaction.rb +126 -126
- data/lib/phusion_passenger/utils.rb +199 -167
- data/lib/phusion_passenger/utils/ansi_colors.rb +128 -128
- data/lib/phusion_passenger/utils/download.rb +196 -196
- data/lib/phusion_passenger/utils/file_system_watcher.rb +158 -158
- data/lib/phusion_passenger/utils/hosts_file_parser.rb +101 -101
- data/lib/phusion_passenger/utils/lock.rb +31 -31
- data/lib/phusion_passenger/utils/native_support_utils.rb +31 -31
- data/lib/phusion_passenger/utils/progress_bar.rb +26 -26
- data/lib/phusion_passenger/utils/shellwords.rb +20 -20
- data/lib/phusion_passenger/utils/terminal_choice_menu.rb +206 -206
- data/lib/phusion_passenger/utils/unseekable_socket.rb +272 -272
- data/lib/phusion_passenger/vendor/crash_watch/app.rb +129 -0
- data/lib/phusion_passenger/vendor/crash_watch/gdb_controller.rb +341 -0
- data/lib/phusion_passenger/vendor/crash_watch/version.rb +24 -0
- data/lib/phusion_passenger/vendor/daemon_controller.rb +877 -0
- data/lib/phusion_passenger/vendor/daemon_controller/lock_file.rb +127 -0
- data/lib/phusion_passenger/vendor/daemon_controller/spawn.rb +26 -0
- data/lib/phusion_passenger/vendor/daemon_controller/version.rb +29 -0
- data/packaging/rpm/passenger_spec/passenger.spec.template +0 -1
- data/passenger.gemspec +0 -1
- data/resources/templates/config/nginx_engine_compiler/possible_solutions_for_download_and_extraction_problems.txt.erb +27 -0
- data/resources/templates/standalone/config.erb +19 -15
- data/test/integration_tests/apache2_tests.rb +566 -566
- data/test/integration_tests/downloaded_binaries_tests.rb +126 -125
- data/test/integration_tests/native_packaging_spec.rb +296 -296
- data/test/integration_tests/nginx_tests.rb +393 -393
- data/test/integration_tests/shared/example_webapp_tests.rb +282 -280
- data/test/integration_tests/source_packaging_test.rb +138 -138
- data/test/integration_tests/spec_helper.rb +5 -5
- data/test/integration_tests/standalone_tests.rb +367 -367
- data/test/ruby/debug_logging_spec.rb +133 -133
- data/test/ruby/message_channel_spec.rb +186 -186
- data/test/ruby/rack/loader_spec.rb +28 -28
- data/test/ruby/rack/preloader_spec.rb +34 -34
- data/test/ruby/rails3.0/loader_spec.rb +12 -12
- data/test/ruby/rails3.0/preloader_spec.rb +18 -18
- data/test/ruby/rails3.1/loader_spec.rb +12 -12
- data/test/ruby/rails3.1/preloader_spec.rb +18 -18
- data/test/ruby/rails3.2/loader_spec.rb +12 -12
- data/test/ruby/rails3.2/preloader_spec.rb +18 -18
- data/test/ruby/rails4.0/loader_spec.rb +12 -12
- data/test/ruby/rails4.0/preloader_spec.rb +18 -18
- data/test/ruby/rails4.1/loader_spec.rb +12 -12
- data/test/ruby/rails4.1/preloader_spec.rb +18 -18
- data/test/ruby/request_handler_spec.rb +730 -730
- data/test/ruby/shared/loader_sharedspec.rb +224 -224
- data/test/ruby/shared/rails/union_station_extensions_sharedspec.rb +327 -327
- data/test/ruby/shared/ruby_loader_sharedspec.rb +47 -47
- data/test/ruby/spec_helper.rb +65 -65
- data/test/ruby/standalone/runtime_installer_spec.rb +384 -384
- data/test/ruby/union_station_spec.rb +276 -276
- data/test/ruby/utils/file_system_watcher_spec.rb +220 -220
- data/test/ruby/utils/hosts_file_parser.rb +248 -248
- data/test/ruby/utils/tee_input_spec.rb +215 -215
- data/test/ruby/utils/unseekable_socket_spec.rb +57 -57
- data/test/ruby/utils_spec.rb +21 -21
- data/test/stub/rack/config.ru +87 -87
- data/test/stub/rack/library.rb +8 -8
- data/test/stub/rack/start.rb +30 -30
- data/test/support/apache2_controller.rb +191 -191
- data/test/support/nginx_controller.rb +90 -99
- data/test/support/placebo-preloader.rb +57 -57
- data/test/support/test_helper.rb +435 -435
- metadata +11 -21
- metadata.gz.asc +7 -7
- data/lib/phusion_passenger/standalone/command2.rb +0 -292
- data/lib/phusion_passenger/standalone/start2_command.rb +0 -799
- data/resources/templates/standalone/download_tool_missing.txt.erb +0 -18
- data/resources/templates/standalone/possible_solutions_for_download_and_extraction_problems.txt.erb +0 -17
- data/resources/templates/standalone/run_installer_as_root.txt.erb +0 -8
@@ -31,80 +31,80 @@ PhusionPassenger.require_passenger_lib 'config/utils'
|
|
31
31
|
PhusionPassenger.require_passenger_lib 'utils/json'
|
32
32
|
|
33
33
|
module PhusionPassenger
|
34
|
-
module Config
|
34
|
+
module Config
|
35
35
|
|
36
|
-
class ReopenLogsCommand < Command
|
37
|
-
|
36
|
+
class ReopenLogsCommand < Command
|
37
|
+
include PhusionPassenger::Config::Utils
|
38
38
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
39
|
+
def run
|
40
|
+
parse_options
|
41
|
+
select_passenger_instance
|
42
|
+
perform_reopen_logs
|
43
|
+
end
|
44
44
|
|
45
|
-
private
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
45
|
+
private
|
46
|
+
def self.create_option_parser(options)
|
47
|
+
OptionParser.new do |opts|
|
48
|
+
nl = "\n" + ' ' * 37
|
49
|
+
opts.banner = "Usage: passenger-config reopen-logs [OPTIONS]\n"
|
50
|
+
opts.separator ""
|
51
|
+
opts.separator " Instruct #{PROGRAM_NAME} agent processes to reopen their log files. This"
|
52
|
+
opts.separator " should be involved after you've rotated logs. This command returns after"
|
53
|
+
opts.separator " the log files have been reopened."
|
54
|
+
opts.separator ""
|
55
55
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
56
|
+
opts.separator "Options:"
|
57
|
+
opts.on("--ignore-logs-not-available", "Exit successfully if #{PROGRAM_NAME}#{nl}" +
|
58
|
+
"was not configured with a log file") do
|
59
|
+
options[:ignore_logs_not_available] = true
|
60
|
+
end
|
61
|
+
opts.on("--instance NAME", String, "The #{PROGRAM_NAME} instance to select") do |value|
|
62
|
+
options[:instance] = value
|
63
|
+
end
|
64
|
+
opts.on("-h", "--help", "Show this help") do
|
65
|
+
options[:help] = true
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
69
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
70
|
+
def perform_reopen_logs
|
71
|
+
password = obtain_full_admin_password(@instance)
|
72
|
+
perform_reopen_logs_on("watchdog", "watchdog", password)
|
73
|
+
perform_reopen_logs_on("server", "server_admin", password)
|
74
|
+
perform_reopen_logs_on("logger", "logging_admin", password)
|
75
|
+
puts "All done"
|
76
|
+
end
|
77
77
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
78
|
+
def perform_reopen_logs_on(name, socket_name, password)
|
79
|
+
puts "Reopening logs for #{AGENT_EXE} #{name}"
|
80
|
+
request = Net::HTTP::Post.new("/reopen_logs.json")
|
81
|
+
request.basic_auth("admin", password)
|
82
|
+
request.content_type = "application/json"
|
83
|
+
response = @instance.http_request("agents.s/#{socket_name}", request)
|
84
|
+
if response["content-type"] == "application/json"
|
85
|
+
if response.code.to_i / 100 != 2
|
86
|
+
handle_error(name, response)
|
87
|
+
end
|
88
|
+
else
|
89
|
+
STDERR.puts "*** An error occured while communicating with the #{AGENT_EXE} #{name} (code #{response.code}):"
|
90
|
+
STDERR.puts response.body
|
91
|
+
abort
|
92
|
+
end
|
93
|
+
end
|
94
94
|
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
95
|
+
def handle_error(name, response)
|
96
|
+
json = PhusionPassenger::Utils::JSON.parse(response.body)
|
97
|
+
if !should_ignore_error?(json)
|
98
|
+
STDERR.puts "*** An error occured while communicating with the #{AGENT_EXE} #{name} (code #{response.code}):"
|
99
|
+
STDERR.puts json['message']
|
100
|
+
abort
|
101
|
+
end
|
102
|
+
end
|
103
103
|
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
end
|
104
|
+
def should_ignore_error?(json)
|
105
|
+
return @options[:ignore_logs_not_available] && json["code"] == "NO_LOG_FILE"
|
106
|
+
end
|
107
|
+
end
|
108
108
|
|
109
|
-
end # module Config
|
109
|
+
end # module Config
|
110
110
|
end # module PhusionPassenger
|
@@ -32,172 +32,172 @@ PhusionPassenger.require_passenger_lib 'config/utils'
|
|
32
32
|
PhusionPassenger.require_passenger_lib 'utils/json'
|
33
33
|
|
34
34
|
module PhusionPassenger
|
35
|
-
module Config
|
35
|
+
module Config
|
36
36
|
|
37
|
-
class RestartAppCommand < Command
|
38
|
-
|
37
|
+
class RestartAppCommand < Command
|
38
|
+
include PhusionPassenger::Config::Utils
|
39
39
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
40
|
+
def run
|
41
|
+
parse_options
|
42
|
+
select_passenger_instance
|
43
|
+
select_app_group_name
|
44
|
+
perform_restart
|
45
|
+
end
|
46
46
|
|
47
|
-
private
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
47
|
+
private
|
48
|
+
def self.create_option_parser(options)
|
49
|
+
OptionParser.new do |opts|
|
50
|
+
nl = "\n" + ' ' * 37
|
51
|
+
opts.banner =
|
52
|
+
"Usage 1: passenger-config restart-app <APP PATH PREFIX> [OPTIONS]\n" +
|
53
|
+
"Usage 2: passenger-config restart-app --name <APP GROUP NAME> [OPTIONS]"
|
54
|
+
opts.separator ""
|
55
|
+
opts.separator " Restart an application. The syntax determines how the application that is to"
|
56
|
+
opts.separator " be restarted, will be selected."
|
57
|
+
opts.separator ""
|
58
|
+
opts.separator " 1. Selects all applications whose paths begin with the given prefix."
|
59
|
+
opts.separator ""
|
60
|
+
opts.separator " Example: passenger-config restart-app /webapps"
|
61
|
+
opts.separator " Restarts all apps whose path begin with /webapps, such as /webapps/foo,"
|
62
|
+
opts.separator " /webapps/bar and /webapps123."
|
63
|
+
opts.separator ""
|
64
|
+
opts.separator " 2. Selects a specific application based on an exact match of its app group"
|
65
|
+
opts.separator " name."
|
66
|
+
opts.separator ""
|
67
|
+
opts.separator " Example: passenger-config restart-app --name /webapps/foo"
|
68
|
+
opts.separator " Restarts only /webapps/foo, but not for example /webapps/foo/bar or"
|
69
|
+
opts.separator " /webapps/foo123."
|
70
|
+
opts.separator ""
|
71
71
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
72
|
+
opts.separator "Options:"
|
73
|
+
opts.on("--name APP_GROUP_NAME", String, "The app group name to select") do |value|
|
74
|
+
options[:app_group_name] = value
|
75
|
+
end
|
76
|
+
opts.on("--rolling-restart", "Perform a rolling restart instead of a#{nl}" +
|
77
|
+
"regular restart (Enterprise only). The#{nl}" +
|
78
|
+
"default is a blocking restart") do |value|
|
79
|
+
if Config::Utils.is_enterprise?
|
80
|
+
options[:rolling_restart] = true
|
81
|
+
else
|
82
|
+
abort "--rolling-restart is only available in #{PROGRAM_NAME} Enterprise: #{ENTERPRISE_URL}"
|
83
|
+
end
|
84
|
+
end
|
85
|
+
opts.on("--ignore-app-not-running", "Exit successfully if the specified#{nl}" +
|
86
|
+
"application is not currently running. The#{nl}" +
|
87
|
+
"default is to exit with an error") do
|
88
|
+
options[:ignore_app_not_running] = true
|
89
|
+
end
|
90
|
+
opts.on("--instance NAME", String, "The #{PROGRAM_NAME} instance to select") do |value|
|
91
|
+
options[:instance] = value
|
92
|
+
end
|
93
|
+
opts.on("-h", "--help", "Show this help") do
|
94
|
+
options[:help] = true
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
98
|
|
99
|
-
|
100
|
-
|
101
|
-
|
99
|
+
def help
|
100
|
+
puts @parser
|
101
|
+
end
|
102
102
|
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
103
|
+
def parse_options
|
104
|
+
super
|
105
|
+
case @argv.size
|
106
|
+
when 0
|
107
|
+
if !@options[:app_group_name]
|
108
|
+
abort "Please pass either an app path prefix or an app group name. " +
|
109
|
+
"See --help for more information."
|
110
|
+
end
|
111
|
+
when 1
|
112
|
+
if @options[:app_group_name]
|
113
|
+
abort "You've passed an app path prefix, but you cannot also pass an " +
|
114
|
+
"app group name. Please use only either one of them. See --help " +
|
115
|
+
"for more information."
|
116
|
+
end
|
117
|
+
else
|
118
|
+
help
|
119
|
+
abort
|
120
|
+
end
|
121
|
+
end
|
122
122
|
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
123
|
+
def select_app_group_name
|
124
|
+
@groups = []
|
125
|
+
if app_group_name = @options[:app_group_name]
|
126
|
+
select_app_group_name_exact(app_group_name)
|
127
|
+
else
|
128
|
+
select_app_group_name_by_app_root_regex(@argv.first)
|
129
|
+
end
|
130
|
+
end
|
131
131
|
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
132
|
+
def select_app_group_name_exact(name)
|
133
|
+
query_pool_xml.elements.each("info/supergroups/supergroup/group") do |group|
|
134
|
+
if group.elements["name"].text == name
|
135
|
+
@groups << group
|
136
|
+
end
|
137
|
+
end
|
138
|
+
if @groups.empty?
|
139
|
+
abort_app_not_found "There is no #{PROGRAM_NAME}-served application running " +
|
140
|
+
"with the app group name '#{name}'."
|
141
|
+
end
|
142
|
+
end
|
143
143
|
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
144
|
+
def select_app_group_name_by_app_root_regex(app_root)
|
145
|
+
regex = /^#{Regexp.escape(app_root)}/
|
146
|
+
query_pool_xml.elements.each("info/supergroups/supergroup/group") do |group|
|
147
|
+
if group.elements["app_root"].text =~ regex
|
148
|
+
@groups << group
|
149
|
+
end
|
150
|
+
end
|
151
|
+
if @groups.empty?
|
152
|
+
abort_app_not_found "There are no #{PROGRAM_NAME}-served applications running " +
|
153
|
+
"whose paths begin with '#{app_root}'."
|
154
|
+
end
|
155
|
+
end
|
156
156
|
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
157
|
+
def perform_restart
|
158
|
+
restart_method = @options[:rolling_restart] ? "rolling" : "blocking"
|
159
|
+
@groups.each do |group|
|
160
|
+
group_name = group.elements["name"].text
|
161
|
+
puts "Restarting #{group_name}"
|
162
|
+
request = Net::HTTP::Post.new("/pool/restart_app_group.json")
|
163
|
+
request.basic_auth("admin", obtain_full_admin_password(@instance))
|
164
|
+
request.content_type = "application/json"
|
165
|
+
request.body = PhusionPassenger::Utils::JSON.generate(
|
166
|
+
:name => group_name,
|
167
|
+
:method => restart_method)
|
168
|
+
response = @instance.http_request("agents.s/server_admin", request)
|
169
|
+
if response.code.to_i / 100 == 2
|
170
|
+
return REXML::Document.new(response.body)
|
171
|
+
else
|
172
|
+
STDERR.puts "*** An error occured while communicating with the #{PROGRAM_NAME} server:"
|
173
|
+
STDERR.puts response.body
|
174
|
+
abort
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|
178
178
|
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
179
|
+
def abort_app_not_found(message)
|
180
|
+
if @options[:ignore_app_not_running]
|
181
|
+
STDERR.puts(message)
|
182
|
+
exit
|
183
|
+
else
|
184
|
+
abort(message)
|
185
|
+
end
|
186
|
+
end
|
187
187
|
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
end
|
188
|
+
def query_pool_xml
|
189
|
+
request = Net::HTTP::Get.new("/pool.xml")
|
190
|
+
request.basic_auth("ro_admin", obtain_read_only_admin_password(@instance))
|
191
|
+
response = @instance.http_request("agents.s/server_admin", request)
|
192
|
+
if response.code.to_i / 100 == 2
|
193
|
+
return REXML::Document.new(response.body)
|
194
|
+
else
|
195
|
+
STDERR.puts "*** An error occured while querying the #{PROGRAM_NAME} server:"
|
196
|
+
STDERR.puts response.body
|
197
|
+
abort
|
198
|
+
end
|
199
|
+
end
|
200
|
+
end
|
201
201
|
|
202
|
-
end # module Config
|
202
|
+
end # module Config
|
203
203
|
end # module PhusionPassenger
|