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
@@ -1,5 +1,5 @@
|
|
1
1
|
# Phusion Passenger - https://www.phusionpassenger.com/
|
2
|
-
# Copyright (c) 2014 Phusion
|
2
|
+
# Copyright (c) 2014-2015 Phusion
|
3
3
|
#
|
4
4
|
# "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.
|
5
5
|
#
|
@@ -28,85 +28,100 @@ PhusionPassenger.require_passenger_lib 'config/nginx_engine_compiler'
|
|
28
28
|
PhusionPassenger.require_passenger_lib 'utils/ansi_colors'
|
29
29
|
|
30
30
|
module PhusionPassenger
|
31
|
-
module Config
|
31
|
+
module Config
|
32
32
|
|
33
|
-
class CompileNginxEngineCommand < Command
|
34
|
-
|
33
|
+
class CompileNginxEngineCommand < Command
|
34
|
+
include InstallationUtils
|
35
35
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
36
|
+
def run
|
37
|
+
@options = {
|
38
|
+
:colorize => :auto,
|
39
|
+
:force_tip => true,
|
40
|
+
:connect_timeout => 30,
|
41
|
+
:idle_timeout => 30
|
42
|
+
}
|
43
|
+
parse_options
|
44
|
+
initialize_objects
|
45
|
+
sanity_check
|
46
|
+
if !NginxEngineCompiler.new(@options).run
|
47
|
+
abort
|
48
|
+
end
|
49
|
+
end
|
45
50
|
|
46
|
-
private
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
51
|
+
private
|
52
|
+
def self.create_option_parser(options)
|
53
|
+
OptionParser.new do |opts|
|
54
|
+
nl = "\n" + ' ' * 37
|
55
|
+
opts.banner = "Usage: passenger-config compile-nginx-engine [OPTIONS]\n"
|
56
|
+
opts.separator ""
|
57
|
+
opts.separator " Compile an Nginx engine, for use in #{PROGRAM_NAME} Standalone."
|
58
|
+
opts.separator ""
|
54
59
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
60
|
+
opts.separator "Options:"
|
61
|
+
opts.on("--working-dir PATH", String, "Store temporary files in the given#{nl}" +
|
62
|
+
"directory, instead of creating one") do |val|
|
63
|
+
options[:working_dir] = val
|
64
|
+
end
|
65
|
+
opts.on("--nginx-version VERSION", String, "Nginx version to compile. " +
|
66
|
+
"Default: #{PREFERRED_NGINX_VERSION}") do |val|
|
67
|
+
options[:nginx_version] = val
|
68
|
+
end
|
69
|
+
opts.on("--nginx-tarball PATH", String, "Use the given Nginx tarball instead of#{nl}" +
|
70
|
+
"downloading it. You MUST also specify the#{nl}" +
|
71
|
+
"Nginx version with --nginx-version") do |val|
|
72
|
+
options[:nginx_tarball] = val
|
73
|
+
end
|
74
|
+
opts.on("-f", "--force", "Skip sanity checks") do
|
75
|
+
options[:force] = true
|
76
|
+
end
|
77
|
+
opts.on("--no-force-tip", "Do not print any tips regarding the --force#{nl}" +
|
78
|
+
"parameter") do
|
79
|
+
options[:force_tip] = false
|
80
|
+
end
|
81
|
+
opts.on("--connect-timeout SECONDS", Integer,
|
82
|
+
"The maximum amount of time to spend on DNS#{nl}" +
|
83
|
+
"lookup and establishing the TCP connection.#{nl}" +
|
84
|
+
"Default: 30") do |val|
|
85
|
+
options[:connect_timeout] = val
|
86
|
+
end
|
87
|
+
opts.on("--idle-timeout SECONDS", Integer, "The maximum idle read time. Default: 30") do |val|
|
88
|
+
options[:idle_timeout] = val
|
89
|
+
end
|
90
|
+
opts.on("-h", "--help", "Show this help") do
|
91
|
+
options[:help] = true
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
80
95
|
|
81
|
-
|
82
|
-
|
83
|
-
|
96
|
+
def help
|
97
|
+
puts @parser
|
98
|
+
end
|
84
99
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
100
|
+
def initialize_objects
|
101
|
+
@colors = Utils::AnsiColors.new(@options[:colorize])
|
102
|
+
if !@options[:nginx_version]
|
103
|
+
if @options[:nginx_tarball]
|
104
|
+
abort "#{@colors.red}Error: if you specify --nginx-tarball, " +
|
105
|
+
"you must also specify --nginx-version.#{@colors.reset}"
|
106
|
+
else
|
107
|
+
@options[:nginx_version] = PREFERRED_NGINX_VERSION
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
96
111
|
|
97
|
-
|
98
|
-
|
112
|
+
def sanity_check
|
113
|
+
return if @options[:force]
|
99
114
|
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
end
|
115
|
+
if PhusionPassenger.find_support_binary("nginx-#{@options[:nginx_version]}")
|
116
|
+
puts "#{@colors.green}The Nginx engine (version #{@options[:nginx_version]}) " +
|
117
|
+
"is already installed.#{@colors.reset}"
|
118
|
+
if @options[:force_tip]
|
119
|
+
puts "If you want to recompile it, re-run this program with the --force parameter."
|
120
|
+
end
|
121
|
+
exit
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
110
125
|
|
111
|
-
end # module Config
|
126
|
+
end # module Config
|
112
127
|
end # module PhusionPassenger
|
@@ -31,84 +31,84 @@ 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 DetachProcessCommand < Command
|
37
|
-
|
36
|
+
class DetachProcessCommand < 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_detach
|
43
|
+
end
|
44
44
|
|
45
|
-
private
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
45
|
+
private
|
46
|
+
def self.create_option_parser(options)
|
47
|
+
OptionParser.new do |opts|
|
48
|
+
nl = "\n" + ' ' * 37
|
49
|
+
opts.banner = "Usage: passenger-config detach-process [OPTIONS] <PID>\n"
|
50
|
+
opts.separator ""
|
51
|
+
opts.separator " Remove an application process from the #{PROGRAM_NAME} process pool, and"
|
52
|
+
opts.separator " shut it down. Has a similar effect to killing the application process"
|
53
|
+
opts.separator " directly with `kill <PID>`. But `kill` aborts any active requests, while"
|
54
|
+
opts.separator " this command shuts down the process after active requests are finished."
|
55
|
+
opts.separator ""
|
56
|
+
opts.separator " If you want to force abort a process and its active requests, just use `kill`."
|
57
|
+
opts.separator ""
|
58
58
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
59
|
+
opts.separator "Options:"
|
60
|
+
opts.on("--instance NAME", String, "The #{PROGRAM_NAME} instance to select") do |value|
|
61
|
+
options[:instance] = value
|
62
|
+
end
|
63
|
+
opts.on("--ignore-nonexistant-pid", "Exit successfully even if the specified#{nl}" +
|
64
|
+
"PID is not in the process pool.") do
|
65
|
+
options[:ignore_nonexistant_pid] = true
|
66
|
+
end
|
67
|
+
opts.on("-h", "--help", "Show this help") do
|
68
|
+
options[:help] = true
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
72
|
|
73
|
-
|
74
|
-
|
75
|
-
|
73
|
+
def help
|
74
|
+
puts @parser
|
75
|
+
end
|
76
76
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
77
|
+
def parse_options
|
78
|
+
super
|
79
|
+
if @argv.empty?
|
80
|
+
abort "Please pass a PID. " +
|
81
|
+
"See --help for more information."
|
82
|
+
elsif @argv.size == 1
|
83
|
+
@pid = @argv[0].to_i
|
84
|
+
elsif @argv.size > 1
|
85
|
+
help
|
86
|
+
abort
|
87
|
+
end
|
88
|
+
end
|
89
89
|
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
end
|
90
|
+
def perform_detach
|
91
|
+
request = Net::HTTP::Post.new("/pool/detach_process.json")
|
92
|
+
request.basic_auth("admin", obtain_full_admin_password(@instance))
|
93
|
+
request.content_type = "application/json"
|
94
|
+
request.body = PhusionPassenger::Utils::JSON.generate(:pid => @pid)
|
95
|
+
response = @instance.http_request("agents.s/server_admin", request)
|
96
|
+
if response.code.to_i / 100 == 2
|
97
|
+
body = PhusionPassenger::Utils::JSON.parse(response.body)
|
98
|
+
if body['detached']
|
99
|
+
puts "Process #{@pid} detached."
|
100
|
+
elsif @options[:ignore_nonexistant_pid]
|
101
|
+
puts "Could not detach process #{@pid}."
|
102
|
+
else
|
103
|
+
abort "Could not detach process #{@pid}."
|
104
|
+
end
|
105
|
+
else
|
106
|
+
STDERR.puts "*** An error occured while communicating with the #{PROGRAM_NAME} server:"
|
107
|
+
STDERR.puts response.body
|
108
|
+
abort
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
112
|
|
113
|
-
end # module Config
|
113
|
+
end # module Config
|
114
114
|
end # module PhusionPassenger
|
@@ -1,5 +1,5 @@
|
|
1
1
|
# Phusion Passenger - https://www.phusionpassenger.com/
|
2
|
-
# Copyright (c) 2014 Phusion
|
2
|
+
# Copyright (c) 2014-2015 Phusion
|
3
3
|
#
|
4
4
|
# "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.
|
5
5
|
#
|
@@ -34,252 +34,271 @@ PhusionPassenger.require_passenger_lib 'utils/shellwords'
|
|
34
34
|
PhusionPassenger.require_passenger_lib 'utils/tmpio'
|
35
35
|
|
36
36
|
module PhusionPassenger
|
37
|
-
module Config
|
37
|
+
module Config
|
38
38
|
|
39
|
-
class DownloadAgentCommand < Command
|
40
|
-
|
39
|
+
class DownloadAgentCommand < Command
|
40
|
+
include InstallationUtils
|
41
41
|
|
42
|
-
|
42
|
+
BINARY_NOT_USABLE_EXIT_CODE = 3
|
43
43
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
44
|
+
def run
|
45
|
+
@options = {
|
46
|
+
:log_level => Logger::INFO,
|
47
|
+
:colors => :auto,
|
48
|
+
:error_colors => true,
|
49
|
+
:show_download_progress => STDOUT.tty?,
|
50
|
+
:compilation_tip => true,
|
51
|
+
:force_tip => true,
|
52
|
+
:use_cache => true,
|
53
|
+
:connect_timeout => 30,
|
54
|
+
:idle_timeout => 30
|
55
|
+
}
|
56
|
+
parse_options
|
57
|
+
initialize_objects
|
58
|
+
sanity_check
|
59
|
+
download_and_extract
|
60
|
+
end
|
59
61
|
|
60
|
-
private
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
62
|
+
private
|
63
|
+
def self.create_option_parser(options)
|
64
|
+
OptionParser.new do |opts|
|
65
|
+
nl = "\n" + ' ' * 37
|
66
|
+
opts.banner = "Usage: passenger-config download-agent [OPTIONS]\n"
|
67
|
+
opts.separator ""
|
68
|
+
opts.separator " Download a precompiled #{PROGRAM_NAME} agent binary from the"
|
69
|
+
opts.separator " #{PROGRAM_NAME} website. The agent binary is required for #{PROGRAM_NAME}"
|
70
|
+
opts.separator " to function properly. Precompiled binaries are only available for Linux and"
|
71
|
+
opts.separator " OS X."
|
72
|
+
opts.separator ""
|
71
73
|
|
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
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
74
|
+
opts.separator "Options:"
|
75
|
+
opts.on("--url-root URL", String, "Download the binary from a custom URL") do |value|
|
76
|
+
options[:url_root] = value
|
77
|
+
end
|
78
|
+
opts.on("--log-prefix PREFIX", String, "Prefix all logs with the given string") do |value|
|
79
|
+
options[:log_prefix] = value
|
80
|
+
end
|
81
|
+
opts.on("--log-level LEVEL", String, "Set log level (fatal,error,warn,info,#{nl}" +
|
82
|
+
"debug). Default: info") do |value|
|
83
|
+
case value
|
84
|
+
when "fatal"
|
85
|
+
options[:log_level] = Logger::FATAL
|
86
|
+
when "error"
|
87
|
+
options[:log_level] = Logger::ERROR
|
88
|
+
when "warn"
|
89
|
+
options[:log_level] = Logger::WARN
|
90
|
+
when "info"
|
91
|
+
options[:log_level] = Logger::INFO
|
92
|
+
when "debug"
|
93
|
+
options[:log_level] = Logger::DEBUG
|
94
|
+
else
|
95
|
+
abort "Invalid log level #{value.inspect}"
|
96
|
+
end
|
97
|
+
end
|
98
|
+
opts.on("-f", "--force", "Skip sanity checks") do
|
99
|
+
options[:force] = true
|
100
|
+
end
|
101
|
+
opts.on("--no-colors", "Never output colors") do
|
102
|
+
options[:colors] = false
|
103
|
+
end
|
104
|
+
opts.on("--no-error-colors", "Do not colorized error messages") do
|
105
|
+
options[:error_colors] = false
|
106
|
+
end
|
107
|
+
opts.on("--no-download-progress", "Never show download progress") do
|
108
|
+
options[:show_download_progress] = false
|
109
|
+
end
|
110
|
+
opts.on("--no-compilation-tip", "Do not present compilation as an#{nl}" +
|
111
|
+
"alternative way to install the agent") do
|
112
|
+
options[:compilation_tip] = false
|
113
|
+
end
|
114
|
+
opts.on("--no-force-tip", "Do not print any tips regarding the#{nl}" +
|
115
|
+
"--force parameter") do
|
116
|
+
options[:force_tip] = false
|
117
|
+
end
|
118
|
+
opts.on("--skip-cache", "Do not copy the agent binary from cache") do
|
119
|
+
options[:use_cache] = false
|
120
|
+
end
|
121
|
+
opts.on("--suppress-binary-unusable-message",
|
122
|
+
"Do not print anything if the downloaded#{nl}" +
|
123
|
+
"binary turns out to be unusable") do
|
124
|
+
options[:suppress_binary_unusable_message] = true
|
125
|
+
end
|
126
|
+
opts.on("--dry-run", "Do everything except actually installing#{nl}" +
|
127
|
+
"the binary") do
|
128
|
+
options[:dry_run] = true
|
129
|
+
end
|
130
|
+
opts.on("--connect-timeout SECONDS", Integer,
|
131
|
+
"The maximum amount of time to spend on DNS#{nl}" +
|
132
|
+
"lookup and establishing the TCP connection.#{nl}" +
|
133
|
+
"Default: 30") do |val|
|
134
|
+
options[:connect_timeout] = val
|
135
|
+
end
|
136
|
+
opts.on("--idle-timeout SECONDS", Integer, "The maximum idle read time. Default: 30") do |val|
|
137
|
+
options[:idle_timeout] = val
|
138
|
+
end
|
139
|
+
opts.on("-h", "--help", "Show this help") do
|
140
|
+
options[:help] = true
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
132
144
|
|
133
|
-
|
134
|
-
|
135
|
-
|
145
|
+
def help
|
146
|
+
puts @parser
|
147
|
+
end
|
136
148
|
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
149
|
+
def initialize_objects
|
150
|
+
if @options[:url_root]
|
151
|
+
@sites = [{ :url => @options[:url_root] }]
|
152
|
+
else
|
153
|
+
@sites = PhusionPassenger.binaries_sites
|
154
|
+
end
|
155
|
+
@colors = Utils::AnsiColors.new(@options[:colors])
|
156
|
+
@logger = Logger.new(STDOUT)
|
157
|
+
@logger.level = @options[:log_level]
|
158
|
+
@logger.formatter = proc do |severity, datetime, progname, msg|
|
159
|
+
if @options[:error_colors] && (severity == "FATAL" || severity == "ERROR")
|
160
|
+
color = @colors.red
|
161
|
+
else
|
162
|
+
color = nil
|
163
|
+
end
|
164
|
+
result = ""
|
165
|
+
msg.split("\n", -1).map do |line|
|
166
|
+
result << "#{color}#{@options[:log_prefix]}#{line}#{@colors.reset}\n"
|
167
|
+
end
|
168
|
+
result
|
169
|
+
end
|
170
|
+
end
|
159
171
|
|
160
|
-
|
161
|
-
|
172
|
+
def sanity_check
|
173
|
+
return if @options[:force]
|
162
174
|
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
175
|
+
if PhusionPassenger.find_support_binary(AGENT_EXE)
|
176
|
+
@logger.warn "#{@colors.green}The #{PROGRAM_NAME} agent is already installed."
|
177
|
+
if @options[:force_tip]
|
178
|
+
@logger.warn "If you want to redownload it, re-run this program with the --force parameter."
|
179
|
+
end
|
180
|
+
exit
|
181
|
+
end
|
170
182
|
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
183
|
+
if !PhusionPassenger.installed_from_release_package?
|
184
|
+
@logger.fatal("#{PROGRAM_NAME} was not installed from an official release " +
|
185
|
+
"package, so you cannot download our precompiled agent binary." +
|
186
|
+
compile_tip_message)
|
187
|
+
if @options[:force_tip]
|
188
|
+
@logger.warn "If you want to download it anyway, re-run this program with the --force parameter."
|
189
|
+
end
|
190
|
+
abort
|
191
|
+
end
|
180
192
|
|
181
|
-
|
182
|
-
|
193
|
+
check_for_download_tool!
|
194
|
+
end
|
183
195
|
|
184
|
-
|
185
|
-
|
186
|
-
|
196
|
+
def download_and_extract
|
197
|
+
destdir = find_or_create_writable_support_binaries_dir!
|
198
|
+
exit if @options[:dry_run]
|
187
199
|
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
200
|
+
PhusionPassenger::Utils.mktmpdir("passenger-install.", PlatformInfo.tmpexedir) do |tmpdir|
|
201
|
+
basename = "agent-#{PlatformInfo.cxx_binary_compatibility_id}.tar.gz"
|
202
|
+
tarball = "#{tmpdir}/#{basename}"
|
203
|
+
if !download_support_file(basename, tarball)
|
204
|
+
@logger.error "#{@colors.reset}------------------------------------------"
|
205
|
+
@logger.fatal("Sorry, no precompiled agent binary is available for " +
|
206
|
+
"your platform." + compile_tip_message)
|
207
|
+
abort
|
208
|
+
end
|
197
209
|
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
210
|
+
@logger.info "Extracting precompiled agent binary to #{destdir}..."
|
211
|
+
e_tmpdir = Shellwords.escape(tmpdir)
|
212
|
+
e_tarball = Shellwords.escape(tarball)
|
213
|
+
if !system("cd #{e_tmpdir} && tar xzf #{e_tarball}")
|
214
|
+
@logger.fatal "The downloaded archive file could not be extracted."
|
215
|
+
abort
|
216
|
+
end
|
217
|
+
if !File.exist?("#{tmpdir}/#{AGENT_EXE}")
|
218
|
+
@logger.fatal "The downloaded archive file does not seem to " +
|
219
|
+
"contain an agent binary. This is probably a problem in " +
|
220
|
+
"the #{PROGRAM_NAME} website. Please report this problem to " +
|
221
|
+
"the #{PROGRAM_NAME} authors."
|
222
|
+
abort
|
223
|
+
end
|
212
224
|
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
225
|
+
@logger.info "Checking whether the downloaded binary is usable..."
|
226
|
+
if test_binary("#{tmpdir}/#{AGENT_EXE}")
|
227
|
+
@logger.info "The downloaded binary is usable."
|
228
|
+
else
|
229
|
+
if !@options[:suppress_binary_unusable_message]
|
230
|
+
@logger.fatal "Sorry, the precompiled agent binary can not be run " +
|
231
|
+
"your system.#{compile_tip_message}"
|
232
|
+
end
|
233
|
+
exit(BINARY_NOT_USABLE_EXIT_CODE)
|
234
|
+
end
|
223
235
|
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
236
|
+
FileUtils.mv("#{tmpdir}/#{AGENT_EXE}", "#{destdir}/#{AGENT_EXE}")
|
237
|
+
@logger.info "#{@colors.green}Agent binary successfully download and installed."
|
238
|
+
end
|
239
|
+
end
|
228
240
|
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
241
|
+
def download_support_file(name, output)
|
242
|
+
@sites.each_with_index do |site, i|
|
243
|
+
if real_download_support_file(site, name, output)
|
244
|
+
if i > 0
|
245
|
+
@logger.warn "#{@colors.green}Download OK!"
|
246
|
+
else
|
247
|
+
@logger.info "#{@colors.green}Download OK!"
|
248
|
+
end
|
249
|
+
return true
|
250
|
+
elsif i != @sites.size - 1
|
251
|
+
@logger.warn "Trying next mirror..."
|
252
|
+
end
|
253
|
+
end
|
254
|
+
return false
|
255
|
+
end
|
244
256
|
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
257
|
+
def real_download_support_file(site, name, output)
|
258
|
+
url = "#{site[:url]}/#{VERSION_STRING}/#{name}"
|
259
|
+
options = {
|
260
|
+
:cacert => site[:cacert],
|
261
|
+
:logger => @logger,
|
262
|
+
:use_cache => @options[:use_cache]
|
263
|
+
}
|
264
|
+
# connect_timeout and idle_timeout may be nil or 0, which means
|
265
|
+
# that the default Utils::Download timeouts should be used.
|
266
|
+
if @options[:connect_timeout] && @options[:connect_timeout] != 0
|
267
|
+
options[:connect_timeout] = @options[:connect_timeout]
|
268
|
+
end
|
269
|
+
if @options[:idle_timeout] && @options[:idle_timeout] != 0
|
270
|
+
options[:idle_timeout] = @options[:idle_timeout]
|
271
|
+
end
|
272
|
+
return PhusionPassenger::Utils::Download.download(url, output, options)
|
273
|
+
end
|
255
274
|
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
275
|
+
def test_binary(filename)
|
276
|
+
output = `env LD_BIND_NOW=1 DYLD_BIND_AT_LAUNCH=1 #{Shellwords.escape(filename)} test-binary`
|
277
|
+
return $? && $?.exitstatus == 0 && output == "PASS\n"
|
278
|
+
end
|
260
279
|
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
280
|
+
def compile_tip_message
|
281
|
+
return "" if !@options[:compilation_tip]
|
282
|
+
if PhusionPassenger.build_system_dir
|
283
|
+
result = " Please compile the agent from source instead, by running:\n\n"
|
284
|
+
result << " passenger-config compile-agent"
|
285
|
+
else
|
286
|
+
result = " Furthermore, this #{PROGRAM_NAME} installation does not "
|
287
|
+
result << "come with any source code, so the agent binary cannot "
|
288
|
+
result << "be compiled either. Please contact the person or "
|
289
|
+
result << "organization who packaged #{PROGRAM_NAME} for help on this "
|
290
|
+
result << "problem."
|
291
|
+
end
|
292
|
+
return result
|
293
|
+
end
|
275
294
|
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
end
|
295
|
+
# Override InstallationUtils
|
296
|
+
def print_installation_error_header
|
297
|
+
@logger.warn "------------------------------------------"
|
298
|
+
@logger.fatal "Cannot store agent binary"
|
299
|
+
@logger.fatal ""
|
300
|
+
end
|
301
|
+
end
|
283
302
|
|
284
|
-
end # module Config
|
303
|
+
end # module Config
|
285
304
|
end # module PhusionPassenger
|