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.

Files changed (218) hide show
  1. checksums.yaml +8 -8
  2. checksums.yaml.gz.asc +7 -7
  3. data.tar.gz.asc +7 -7
  4. data/.editorconfig +11 -5
  5. data/CHANGELOG +38 -0
  6. data/CONTRIBUTING.md +1 -4
  7. data/Gemfile +0 -1
  8. data/Gemfile.lock +0 -2
  9. data/Rakefile +33 -33
  10. data/bin/passenger +1 -1
  11. data/bin/passenger-config +1 -1
  12. data/bin/passenger-install-apache2-module +800 -800
  13. data/bin/passenger-install-nginx-module +592 -592
  14. data/bin/passenger-memory-stats +127 -127
  15. data/bin/passenger-status +216 -216
  16. data/build/agents.rb +127 -127
  17. data/build/apache2.rb +87 -87
  18. data/build/basics.rb +60 -60
  19. data/build/common_library.rb +165 -165
  20. data/build/cplusplus_support.rb +51 -51
  21. data/build/cxx_tests.rb +268 -268
  22. data/build/debian.rb +143 -143
  23. data/build/documentation.rb +58 -58
  24. data/build/integration_tests.rb +81 -81
  25. data/build/misc.rb +132 -132
  26. data/build/nginx.rb +20 -20
  27. data/build/node_tests.rb +7 -7
  28. data/build/oxt_tests.rb +14 -14
  29. data/build/packaging.rb +570 -570
  30. data/build/preprocessor.rb +260 -260
  31. data/build/rake_extensions.rb +71 -71
  32. data/build/ruby_extension.rb +29 -29
  33. data/build/ruby_tests.rb +6 -6
  34. data/build/test_basics.rb +37 -37
  35. data/debian.template/control.template +3 -5
  36. data/dev/copy_boost_headers +134 -134
  37. data/dev/install_scripts_bootstrap_code.rb +25 -25
  38. data/dev/list_tests +20 -20
  39. data/dev/ruby_server.rb +223 -223
  40. data/dev/runner +18 -18
  41. data/doc/ServerOptimizationGuide.txt.md +55 -2
  42. data/doc/Users guide Nginx.txt +0 -26
  43. data/doc/Users guide Standalone.txt +5 -1
  44. data/doc/users_guide_snippets/tips.txt +9 -0
  45. data/ext/common/ApplicationPool2/Group.h +23 -11
  46. data/ext/common/ApplicationPool2/Implementation.cpp +32 -7
  47. data/ext/common/ApplicationPool2/Pool.h +22 -17
  48. data/ext/common/ApplicationPool2/SmartSpawner.h +4 -1
  49. data/ext/common/ApplicationPool2/Spawner.h +1 -1
  50. data/ext/common/Constants.h +1 -1
  51. data/ext/common/agents/Base.cpp +35 -20
  52. data/ext/common/agents/HelperAgent/Main.cpp +8 -1
  53. data/ext/common/agents/HelperAgent/OptionParser.h +18 -4
  54. data/ext/common/agents/HelperAgent/RequestHandler.h +2 -83
  55. data/ext/common/agents/HelperAgent/RequestHandler/ForwardResponse.cpp +54 -1
  56. data/ext/common/agents/HelperAgent/RequestHandler/InitRequest.cpp +7 -4
  57. data/ext/common/agents/Main.cpp +1 -1
  58. data/ext/common/agents/Watchdog/Main.cpp +54 -19
  59. data/ext/nginx/Configuration.c +7 -0
  60. data/ext/nginx/ContentHandler.c +9 -1
  61. data/helper-scripts/backtrace-sanitizer.rb +106 -87
  62. data/helper-scripts/crash-watch.rb +32 -0
  63. data/helper-scripts/download_binaries/extconf.rb +38 -38
  64. data/helper-scripts/meteor-loader.rb +107 -107
  65. data/helper-scripts/prespawn +101 -101
  66. data/helper-scripts/rack-loader.rb +96 -96
  67. data/helper-scripts/rack-preloader.rb +137 -137
  68. data/lib/phusion_passenger.rb +292 -292
  69. data/lib/phusion_passenger/abstract_installer.rb +438 -438
  70. data/lib/phusion_passenger/active_support3_extensions/init.rb +168 -170
  71. data/lib/phusion_passenger/admin_tools.rb +20 -20
  72. data/lib/phusion_passenger/admin_tools/instance.rb +178 -178
  73. data/lib/phusion_passenger/admin_tools/instance_registry.rb +61 -61
  74. data/lib/phusion_passenger/admin_tools/memory_stats.rb +267 -267
  75. data/lib/phusion_passenger/apache2/config_options.rb +182 -182
  76. data/lib/phusion_passenger/common_library.rb +479 -485
  77. data/lib/phusion_passenger/config/about_command.rb +161 -161
  78. data/lib/phusion_passenger/config/admin_command_command.rb +129 -129
  79. data/lib/phusion_passenger/config/agent_compiler.rb +121 -121
  80. data/lib/phusion_passenger/config/build_native_support_command.rb +43 -43
  81. data/lib/phusion_passenger/config/command.rb +25 -25
  82. data/lib/phusion_passenger/config/compile_agent_command.rb +62 -62
  83. data/lib/phusion_passenger/config/compile_nginx_engine_command.rb +88 -73
  84. data/lib/phusion_passenger/config/detach_process_command.rb +72 -72
  85. data/lib/phusion_passenger/config/download_agent_command.rb +246 -227
  86. data/lib/phusion_passenger/config/download_nginx_engine_command.rb +245 -224
  87. data/lib/phusion_passenger/config/install_agent_command.rb +144 -132
  88. data/lib/phusion_passenger/config/install_standalone_runtime_command.rb +205 -185
  89. data/lib/phusion_passenger/config/installation_utils.rb +204 -204
  90. data/lib/phusion_passenger/config/list_instances_command.rb +64 -64
  91. data/lib/phusion_passenger/config/main.rb +152 -152
  92. data/lib/phusion_passenger/config/nginx_engine_compiler.rb +319 -300
  93. data/lib/phusion_passenger/config/reopen_logs_command.rb +67 -67
  94. data/lib/phusion_passenger/config/restart_app_command.rb +155 -155
  95. data/lib/phusion_passenger/config/system_metrics_command.rb +13 -13
  96. data/lib/phusion_passenger/config/utils.rb +95 -95
  97. data/lib/phusion_passenger/config/validate_install_command.rb +198 -198
  98. data/lib/phusion_passenger/console_text_template.rb +25 -25
  99. data/lib/phusion_passenger/constants.rb +90 -90
  100. data/lib/phusion_passenger/debug_logging.rb +106 -106
  101. data/lib/phusion_passenger/loader_shared_helpers.rb +447 -432
  102. data/lib/phusion_passenger/message_channel.rb +312 -312
  103. data/lib/phusion_passenger/message_client.rb +176 -176
  104. data/lib/phusion_passenger/native_support.rb +369 -369
  105. data/lib/phusion_passenger/nginx/config_options.rb +297 -297
  106. data/lib/phusion_passenger/packaging.rb +131 -131
  107. data/lib/phusion_passenger/platform_info.rb +360 -360
  108. data/lib/phusion_passenger/platform_info/apache.rb +767 -767
  109. data/lib/phusion_passenger/platform_info/apache_detector.rb +199 -199
  110. data/lib/phusion_passenger/platform_info/binary_compatibility.rb +107 -107
  111. data/lib/phusion_passenger/platform_info/compiler.rb +570 -570
  112. data/lib/phusion_passenger/platform_info/curl.rb +32 -32
  113. data/lib/phusion_passenger/platform_info/cxx_portability.rb +188 -188
  114. data/lib/phusion_passenger/platform_info/depcheck.rb +372 -372
  115. data/lib/phusion_passenger/platform_info/depcheck_specs/apache2.rb +109 -109
  116. data/lib/phusion_passenger/platform_info/depcheck_specs/compiler_toolchain.rb +4 -4
  117. data/lib/phusion_passenger/platform_info/depcheck_specs/gems.rb +10 -34
  118. data/lib/phusion_passenger/platform_info/depcheck_specs/libs.rb +101 -101
  119. data/lib/phusion_passenger/platform_info/depcheck_specs/ruby.rb +5 -5
  120. data/lib/phusion_passenger/platform_info/depcheck_specs/utilities.rb +13 -13
  121. data/lib/phusion_passenger/platform_info/linux.rb +55 -55
  122. data/lib/phusion_passenger/platform_info/operating_system.rb +149 -149
  123. data/lib/phusion_passenger/platform_info/ruby.rb +468 -448
  124. data/lib/phusion_passenger/platform_info/zlib.rb +9 -9
  125. data/lib/phusion_passenger/plugin.rb +66 -66
  126. data/lib/phusion_passenger/preloader_shared_helpers.rb +126 -126
  127. data/lib/phusion_passenger/public_api.rb +191 -191
  128. data/lib/phusion_passenger/rack/out_of_band_gc.rb +93 -94
  129. data/lib/phusion_passenger/rack/thread_handler_extension.rb +231 -227
  130. data/lib/phusion_passenger/request_handler.rb +567 -577
  131. data/lib/phusion_passenger/request_handler/thread_handler.rb +379 -381
  132. data/lib/phusion_passenger/ruby_core_enhancements.rb +86 -86
  133. data/lib/phusion_passenger/ruby_core_io_enhancements.rb +74 -74
  134. data/lib/phusion_passenger/simple_benchmarking.rb +25 -25
  135. data/lib/phusion_passenger/standalone/app_finder.rb +153 -150
  136. data/lib/phusion_passenger/standalone/command.rb +44 -40
  137. data/lib/phusion_passenger/standalone/config_utils.rb +53 -53
  138. data/lib/phusion_passenger/standalone/control_utils.rb +38 -59
  139. data/lib/phusion_passenger/standalone/main.rb +73 -73
  140. data/lib/phusion_passenger/standalone/start_command.rb +697 -685
  141. data/lib/phusion_passenger/standalone/start_command/builtin_engine.rb +193 -155
  142. data/lib/phusion_passenger/standalone/start_command/nginx_engine.rb +162 -133
  143. data/lib/phusion_passenger/standalone/status_command.rb +64 -64
  144. data/lib/phusion_passenger/standalone/stop_command.rb +72 -72
  145. data/lib/phusion_passenger/standalone/version_command.rb +9 -9
  146. data/lib/phusion_passenger/union_station/connection.rb +32 -32
  147. data/lib/phusion_passenger/union_station/core.rb +251 -251
  148. data/lib/phusion_passenger/union_station/transaction.rb +126 -126
  149. data/lib/phusion_passenger/utils.rb +199 -167
  150. data/lib/phusion_passenger/utils/ansi_colors.rb +128 -128
  151. data/lib/phusion_passenger/utils/download.rb +196 -196
  152. data/lib/phusion_passenger/utils/file_system_watcher.rb +158 -158
  153. data/lib/phusion_passenger/utils/hosts_file_parser.rb +101 -101
  154. data/lib/phusion_passenger/utils/lock.rb +31 -31
  155. data/lib/phusion_passenger/utils/native_support_utils.rb +31 -31
  156. data/lib/phusion_passenger/utils/progress_bar.rb +26 -26
  157. data/lib/phusion_passenger/utils/shellwords.rb +20 -20
  158. data/lib/phusion_passenger/utils/terminal_choice_menu.rb +206 -206
  159. data/lib/phusion_passenger/utils/unseekable_socket.rb +272 -272
  160. data/lib/phusion_passenger/vendor/crash_watch/app.rb +129 -0
  161. data/lib/phusion_passenger/vendor/crash_watch/gdb_controller.rb +341 -0
  162. data/lib/phusion_passenger/vendor/crash_watch/version.rb +24 -0
  163. data/lib/phusion_passenger/vendor/daemon_controller.rb +877 -0
  164. data/lib/phusion_passenger/vendor/daemon_controller/lock_file.rb +127 -0
  165. data/lib/phusion_passenger/vendor/daemon_controller/spawn.rb +26 -0
  166. data/lib/phusion_passenger/vendor/daemon_controller/version.rb +29 -0
  167. data/packaging/rpm/passenger_spec/passenger.spec.template +0 -1
  168. data/passenger.gemspec +0 -1
  169. data/resources/templates/config/nginx_engine_compiler/possible_solutions_for_download_and_extraction_problems.txt.erb +27 -0
  170. data/resources/templates/standalone/config.erb +19 -15
  171. data/test/integration_tests/apache2_tests.rb +566 -566
  172. data/test/integration_tests/downloaded_binaries_tests.rb +126 -125
  173. data/test/integration_tests/native_packaging_spec.rb +296 -296
  174. data/test/integration_tests/nginx_tests.rb +393 -393
  175. data/test/integration_tests/shared/example_webapp_tests.rb +282 -280
  176. data/test/integration_tests/source_packaging_test.rb +138 -138
  177. data/test/integration_tests/spec_helper.rb +5 -5
  178. data/test/integration_tests/standalone_tests.rb +367 -367
  179. data/test/ruby/debug_logging_spec.rb +133 -133
  180. data/test/ruby/message_channel_spec.rb +186 -186
  181. data/test/ruby/rack/loader_spec.rb +28 -28
  182. data/test/ruby/rack/preloader_spec.rb +34 -34
  183. data/test/ruby/rails3.0/loader_spec.rb +12 -12
  184. data/test/ruby/rails3.0/preloader_spec.rb +18 -18
  185. data/test/ruby/rails3.1/loader_spec.rb +12 -12
  186. data/test/ruby/rails3.1/preloader_spec.rb +18 -18
  187. data/test/ruby/rails3.2/loader_spec.rb +12 -12
  188. data/test/ruby/rails3.2/preloader_spec.rb +18 -18
  189. data/test/ruby/rails4.0/loader_spec.rb +12 -12
  190. data/test/ruby/rails4.0/preloader_spec.rb +18 -18
  191. data/test/ruby/rails4.1/loader_spec.rb +12 -12
  192. data/test/ruby/rails4.1/preloader_spec.rb +18 -18
  193. data/test/ruby/request_handler_spec.rb +730 -730
  194. data/test/ruby/shared/loader_sharedspec.rb +224 -224
  195. data/test/ruby/shared/rails/union_station_extensions_sharedspec.rb +327 -327
  196. data/test/ruby/shared/ruby_loader_sharedspec.rb +47 -47
  197. data/test/ruby/spec_helper.rb +65 -65
  198. data/test/ruby/standalone/runtime_installer_spec.rb +384 -384
  199. data/test/ruby/union_station_spec.rb +276 -276
  200. data/test/ruby/utils/file_system_watcher_spec.rb +220 -220
  201. data/test/ruby/utils/hosts_file_parser.rb +248 -248
  202. data/test/ruby/utils/tee_input_spec.rb +215 -215
  203. data/test/ruby/utils/unseekable_socket_spec.rb +57 -57
  204. data/test/ruby/utils_spec.rb +21 -21
  205. data/test/stub/rack/config.ru +87 -87
  206. data/test/stub/rack/library.rb +8 -8
  207. data/test/stub/rack/start.rb +30 -30
  208. data/test/support/apache2_controller.rb +191 -191
  209. data/test/support/nginx_controller.rb +90 -99
  210. data/test/support/placebo-preloader.rb +57 -57
  211. data/test/support/test_helper.rb +435 -435
  212. metadata +11 -21
  213. metadata.gz.asc +7 -7
  214. data/lib/phusion_passenger/standalone/command2.rb +0 -292
  215. data/lib/phusion_passenger/standalone/start2_command.rb +0 -799
  216. data/resources/templates/standalone/download_tool_missing.txt.erb +0 -18
  217. data/resources/templates/standalone/possible_solutions_for_download_and_extraction_problems.txt.erb +0 -17
  218. 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
- 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
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
- extend self # Make methods available as class methods.
29
+ module Utils
30
+ extend self # Make methods available as class methods.
31
31
 
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
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
- 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
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
- 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
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
- 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
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
- 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
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
- 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
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
- 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
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
- def is_enterprise?
128
- return defined?(PhusionPassenger::PASSENGER_IS_ENTERPRISE) && PhusionPassenger::PASSENGER_IS_ENTERPRISE
129
- end
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
- # 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
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