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
@@ -25,19 +25,19 @@ PhusionPassenger.require_passenger_lib 'constants'
|
|
25
25
|
PhusionPassenger.require_passenger_lib 'config/command'
|
26
26
|
|
27
27
|
module PhusionPassenger
|
28
|
-
module Config
|
28
|
+
module Config
|
29
29
|
|
30
|
-
class SystemMetricsCommand < Command
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
end
|
30
|
+
class SystemMetricsCommand < Command
|
31
|
+
def run
|
32
|
+
agent_exe = PhusionPassenger.find_support_binary(AGENT_EXE)
|
33
|
+
if agent_exe
|
34
|
+
exec(agent_exe, "system-metrics", *@argv)
|
35
|
+
else
|
36
|
+
abort "This command requires the #{PROGRAM_NAME} agent to be installed. " +
|
37
|
+
"Please install it by running `passenger-config install-agent`."
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
41
|
|
42
|
-
end # module Config
|
42
|
+
end # module Config
|
43
43
|
end # module PhusionPassenger
|
@@ -24,110 +24,110 @@
|
|
24
24
|
PhusionPassenger.require_passenger_lib 'constants'
|
25
25
|
|
26
26
|
module PhusionPassenger
|
27
|
-
module Config
|
27
|
+
module Config
|
28
28
|
|
29
|
-
module Utils
|
30
|
-
|
29
|
+
module Utils
|
30
|
+
extend self # Make methods available as class methods.
|
31
31
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
32
|
+
def self.included(klass)
|
33
|
+
# When included into another class, make sure that Utils
|
34
|
+
# methods are made private.
|
35
|
+
public_instance_methods(false).each do |method_name|
|
36
|
+
klass.send(:private, method_name)
|
37
|
+
end
|
38
|
+
end
|
39
39
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
40
|
+
def select_passenger_instance
|
41
|
+
if name = @options[:instance]
|
42
|
+
@instance = AdminTools::InstanceRegistry.new.find_by_name_prefix(name)
|
43
|
+
if !@instance
|
44
|
+
STDERR.puts "*** ERROR: there doesn't seem to be a #{PROGRAM_NAME} instance running with the name '#{name}'."
|
45
|
+
list_all_passenger_instances(AdminTools::InstanceRegistry.new.list)
|
46
|
+
STDERR.puts
|
47
|
+
STDERR.puts "Please pass `--instance <NAME>` to select a specific #{PROGRAM_NAME} instance."
|
48
|
+
abort
|
49
|
+
elsif @instance == :ambigious
|
50
|
+
abort "*** ERROR: there are multiple instances whose name start with '#{name}'. Please specify the full name."
|
51
|
+
end
|
52
|
+
else
|
53
|
+
instances = AdminTools::InstanceRegistry.new.list
|
54
|
+
if instances.empty?
|
55
|
+
STDERR.puts "*** ERROR: #{PROGRAM_NAME} doesn't seem to be running. If you are sure that it"
|
56
|
+
STDERR.puts "is running, then the causes of this problem could be one of:"
|
57
|
+
STDERR.puts
|
58
|
+
STDERR.puts " 1. You customized the instance registry directory using Apache's"
|
59
|
+
STDERR.puts " PassengerInstanceRegistryDir option, Nginx's"
|
60
|
+
STDERR.puts " passenger_instance_registry_dir option, or #{PROGRAM_NAME} Standalone's"
|
61
|
+
STDERR.puts " --instance-registry-dir command line argument. If so, please set the"
|
62
|
+
STDERR.puts " environment variable PASSENGER_INSTANCE_REGISTRY_DIR to that directory"
|
63
|
+
STDERR.puts " and run this command again."
|
64
|
+
STDERR.puts " 2. The instance directory has been removed by an operating system background"
|
65
|
+
STDERR.puts " service. Please set a different instance registry directory using Apache's"
|
66
|
+
STDERR.puts " PassengerInstanceRegistryDir option, Nginx's passenger_instance_registry_dir"
|
67
|
+
STDERR.puts " option, or #{PROGRAM_NAME} Standalone's --instance-registry-dir command"
|
68
|
+
STDERR.puts " line argument."
|
69
|
+
abort
|
70
|
+
elsif instances.size == 1
|
71
|
+
@instance = instances.first
|
72
|
+
else
|
73
|
+
complain_that_multiple_passenger_instances_are_running(instances)
|
74
|
+
abort
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
78
|
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
79
|
+
def complain_that_multiple_passenger_instances_are_running(instances)
|
80
|
+
puts "It appears that multiple #{PROGRAM_NAME} instances are running. Please select"
|
81
|
+
puts "a specific one by passing:"
|
82
|
+
puts
|
83
|
+
puts " --instance <NAME>"
|
84
|
+
puts
|
85
|
+
list_all_passenger_instances(instances)
|
86
|
+
abort
|
87
|
+
end
|
88
88
|
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
89
|
+
def list_all_passenger_instances(instances)
|
90
|
+
puts "The following #{PROGRAM_NAME} instances are running:"
|
91
|
+
puts
|
92
|
+
instances.each do |instance|
|
93
|
+
printf "%-25s %s\n", "Name", "Description"
|
94
|
+
puts "------------------------------------------------------------------"
|
95
|
+
instances.each do |instance|
|
96
|
+
printf "%-25s %s\n", instance.name, instance.server_software
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
100
|
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
101
|
+
def obtain_read_only_admin_password(instance)
|
102
|
+
begin
|
103
|
+
return instance.read_only_admin_password
|
104
|
+
rescue Errno::EACCES
|
105
|
+
print_instance_querying_permission_error
|
106
|
+
abort
|
107
|
+
end
|
108
|
+
end
|
109
109
|
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
110
|
+
def obtain_full_admin_password(instance)
|
111
|
+
begin
|
112
|
+
return instance.full_admin_password
|
113
|
+
rescue Errno::EACCES
|
114
|
+
print_instance_querying_permission_error
|
115
|
+
abort
|
116
|
+
end
|
117
|
+
end
|
118
118
|
|
119
119
|
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
120
|
+
def print_instance_querying_permission_error
|
121
|
+
PhusionPassenger.require_passenger_lib 'platform_info/ruby'
|
122
|
+
STDERR.puts "*** ERROR: You are not authorized to query the status for this "
|
123
|
+
"#{PROGRAM_NAME} instance. Please try again with " +
|
124
|
+
"'#{PhusionPassenger::PlatformInfo.ruby_sudo_command}'."
|
125
|
+
end
|
126
126
|
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
end
|
127
|
+
def is_enterprise?
|
128
|
+
return defined?(PhusionPassenger::PASSENGER_IS_ENTERPRISE) && PhusionPassenger::PASSENGER_IS_ENTERPRISE
|
129
|
+
end
|
130
|
+
end
|
131
131
|
|
132
|
-
end # module Config
|
132
|
+
end # module Config
|
133
133
|
end # module PhusionPassenger
|
@@ -26,202 +26,202 @@ PhusionPassenger.require_passenger_lib 'constants'
|
|
26
26
|
PhusionPassenger.require_passenger_lib 'config/command'
|
27
27
|
|
28
28
|
module PhusionPassenger
|
29
|
-
module Config
|
30
|
-
|
31
|
-
class ValidateInstallCommand < Command
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
private
|
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
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
end
|
225
|
-
|
226
|
-
end # module Config
|
29
|
+
module Config
|
30
|
+
|
31
|
+
class ValidateInstallCommand < Command
|
32
|
+
# Signifies that there is at least 1 error.
|
33
|
+
FAIL_EXIT_CODE = 1
|
34
|
+
# Signifies that there are no error, but at least 1 warning.
|
35
|
+
WARN_EXIT_CODE = 2
|
36
|
+
|
37
|
+
def self.help
|
38
|
+
puts "Usage: passenger-config validate-install"
|
39
|
+
puts "Validate this #{PROGRAM_NAME} installation."
|
40
|
+
puts
|
41
|
+
puts "Exit codes:"
|
42
|
+
puts " 0 - All checks passed. No errors, no warnings."
|
43
|
+
puts " #{FAIL_EXIT_CODE} - There are some errors."
|
44
|
+
puts " #{WARN_EXIT_CODE} - There are no errors, but there are some warnings."
|
45
|
+
end
|
46
|
+
|
47
|
+
def run
|
48
|
+
if @argv[0] == '--help'
|
49
|
+
self.class.help
|
50
|
+
exit
|
51
|
+
elsif @argv.size > 0
|
52
|
+
self.class.help
|
53
|
+
exit 1
|
54
|
+
end
|
55
|
+
|
56
|
+
begin
|
57
|
+
require 'rubygems'
|
58
|
+
rescue LoadError
|
59
|
+
end
|
60
|
+
PhusionPassenger.require_passenger_lib 'utils/ansi_colors'
|
61
|
+
PhusionPassenger.require_passenger_lib 'platform_info'
|
62
|
+
|
63
|
+
@error_count = 0
|
64
|
+
@warning_count = 0
|
65
|
+
|
66
|
+
prepare_terminal
|
67
|
+
begin
|
68
|
+
check_tools_in_path
|
69
|
+
check_no_other_installs_in_path
|
70
|
+
|
71
|
+
exit(FAIL_EXIT_CODE) if @error_count > 0
|
72
|
+
exit(WARN_EXIT_CODE) if @warning_count > 0
|
73
|
+
ensure
|
74
|
+
reset_terminal
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
private
|
79
|
+
def prepare_terminal
|
80
|
+
STDOUT.write(Utils::AnsiColors::DEFAULT_TERMINAL_COLOR)
|
81
|
+
STDOUT.flush
|
82
|
+
end
|
83
|
+
|
84
|
+
def reset_terminal
|
85
|
+
STDOUT.write(Utils::AnsiColors::RESET)
|
86
|
+
STDOUT.flush
|
87
|
+
end
|
88
|
+
|
89
|
+
def check_tools_in_path
|
90
|
+
checking "whether this #{PROGRAM_NAME} install is in PATH"
|
91
|
+
paths = ENV['PATH'].to_s.split(':')
|
92
|
+
if paths.include?(gem_bindir) ||
|
93
|
+
paths.include?(homebrew_bindir) ||
|
94
|
+
paths.include?(PhusionPassenger.bin_dir)
|
95
|
+
check_ok
|
96
|
+
else
|
97
|
+
check_warning
|
98
|
+
suggest %Q{
|
99
|
+
Please add #{PhusionPassenger.bin_dir} to PATH.
|
100
|
+
Otherwise you will get "command not found" errors upon running
|
101
|
+
passenger-status and other tools.
|
102
|
+
|
103
|
+
Learn more at about PATH at:
|
104
|
+
|
105
|
+
#{NGINX_DOC_URL}#_the_path_environment_variable
|
106
|
+
}
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def check_no_other_installs_in_path
|
111
|
+
logn " * Checking whether there are no other #{PROGRAM_NAME} installations... "
|
112
|
+
|
113
|
+
paths = ENV['PATH'].to_s.split(':')
|
114
|
+
if Process.uid == 0 &&
|
115
|
+
(sudo_user = ENV['SUDO_USER']) &&
|
116
|
+
(bash = PlatformInfo.find_command("bash")) &&
|
117
|
+
PlatformInfo.find_command("sudo")
|
118
|
+
# If we were invoked through sudo then we need to check the original user's PATH too.
|
119
|
+
output = `sudo -u #{sudo_user} #{bash} -lc 'echo; echo PATH FOLLOWS; echo "$PATH"' 2>&1`
|
120
|
+
output.sub!(/.*\nPATH FOLLOWS\n/m, '')
|
121
|
+
output.strip!
|
122
|
+
paths.concat(output.split(':'))
|
123
|
+
end
|
124
|
+
|
125
|
+
# These may not be in PATH if the user did not run this command through sudo.
|
126
|
+
paths << "/usr/bin"
|
127
|
+
paths << "/usr/sbin"
|
128
|
+
paths.delete(gem_bindir)
|
129
|
+
paths.delete(homebrew_bindir)
|
130
|
+
paths.delete(PhusionPassenger.bin_dir)
|
131
|
+
paths.uniq!
|
132
|
+
|
133
|
+
other_installs = []
|
134
|
+
paths.each do |path|
|
135
|
+
filename = "#{path}/passenger-config"
|
136
|
+
if File.exist?(filename)
|
137
|
+
other_installs << filename
|
138
|
+
end
|
139
|
+
end
|
140
|
+
if other_installs.empty?
|
141
|
+
check_ok
|
142
|
+
else
|
143
|
+
check_warning
|
144
|
+
suggest %Q{
|
145
|
+
Besides this #{PROGRAM_NAME} installation, the following other
|
146
|
+
#{PROGRAM_NAME} installations have been detected:
|
147
|
+
|
148
|
+
#{other_installs.join("\n\t\t\t\t ")}
|
149
|
+
|
150
|
+
Please uninstall them to avoid confusion or conflicts.
|
151
|
+
}
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
# Returns the RubyGems bin dir, if Phusion Passenger is installed through RubyGems.
|
156
|
+
def gem_bindir
|
157
|
+
if defined?(Gem) &&
|
158
|
+
PhusionPassenger.originally_packaged? &&
|
159
|
+
PhusionPassenger.build_system_dir =~ /^#{Regexp.escape Gem.dir}\// &&
|
160
|
+
File.exist?("#{Gem.bindir}/passenger-config")
|
161
|
+
return Gem.bindir
|
162
|
+
else
|
163
|
+
return nil
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
# Returns the Homebrew bin dir, if Phusion Passenger is installed through Homebrew.
|
168
|
+
def homebrew_bindir
|
169
|
+
if PhusionPassenger.packaging_method == "homebrew"
|
170
|
+
return "/usr/local/bin"
|
171
|
+
else
|
172
|
+
return nil
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
def logn(message)
|
177
|
+
if STDOUT.tty?
|
178
|
+
STDOUT.write(Utils::AnsiColors.ansi_colorize(message))
|
179
|
+
else
|
180
|
+
STDOUT.write(Utils::AnsiColors.strip_color_tags(message))
|
181
|
+
end
|
182
|
+
STDOUT.flush
|
183
|
+
end
|
184
|
+
|
185
|
+
def log(message)
|
186
|
+
if STDOUT.tty?
|
187
|
+
STDOUT.puts(Utils::AnsiColors.ansi_colorize(message))
|
188
|
+
else
|
189
|
+
STDOUT.puts(Utils::AnsiColors.strip_color_tags(message))
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
def checking(message)
|
194
|
+
logn " * Checking #{message}... "
|
195
|
+
end
|
196
|
+
|
197
|
+
def check_ok(message = "✓")
|
198
|
+
log "<green>#{message}</green>"
|
199
|
+
end
|
200
|
+
|
201
|
+
def check_error(message = "✗")
|
202
|
+
log "<red>#{message}</red>"
|
203
|
+
@error_count += 1
|
204
|
+
end
|
205
|
+
|
206
|
+
def check_warning(message = "(!)")
|
207
|
+
log "<yellow>#{message}</yellow>"
|
208
|
+
@warning_count += 1
|
209
|
+
end
|
210
|
+
|
211
|
+
def suggest(message)
|
212
|
+
puts
|
213
|
+
log reindent(unindent(message), 3)
|
214
|
+
puts
|
215
|
+
end
|
216
|
+
|
217
|
+
def unindent(text)
|
218
|
+
return PlatformInfo.send(:unindent, text)
|
219
|
+
end
|
220
|
+
|
221
|
+
def reindent(text, level)
|
222
|
+
return PlatformInfo.send(:reindent, text, level)
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
226
|
+
end # module Config
|
227
227
|
end # module PhusionPassenger
|