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
@@ -29,203 +29,203 @@ PhusionPassenger.require_passenger_lib 'utils/ansi_colors'
29
29
  require 'pathname'
30
30
 
31
31
  module PhusionPassenger
32
- module PlatformInfo
33
-
34
- # Detects all possible Apache installations on the system, and presents the
35
- # autodetection information to the user in a friendly way. It turns out too
36
- # many people have multiple Apache installations on their system, but they
37
- # don't know about that, or they don't know how to compile against the
38
- # correct Apache installation. This tool helps them.
39
- #
40
- # If you use this class to log things to the terminal, then be sure to set
41
- # the terminal color to Utils::AnsiColors::DEFAULT_TERMINAL_COLOR.
42
- class ApacheDetector
43
- class Result
44
- # These are required and are never nil.
45
- attr_accessor :apxs2, :httpd, :ctl, :version, :config_file
46
- # These are optional and may be nil.
47
- attr_accessor :a2enmod, :a2dismod
48
- # This may be nil. It depends on how well we can infer information from the config file.
49
- attr_accessor :error_log
50
-
51
- def initialize(detector)
52
- @detector = detector
53
- end
54
-
55
- def report
56
- log " <b>* Found Apache #{version}!</b>"
57
- log " Information:"
58
- log " apxs2 : #{apxs2}"
59
- log " Main executable: #{httpd}"
60
- log " Control command: #{ctl}"
61
- log " Config file : #{config_file}"
62
- log " Error log file : #{error_log || 'unknown'}"
63
- log ""
64
- log " To install #{PROGRAM_NAME} against this specific Apache version:"
65
- log " #{PlatformInfo.ruby_command} #{PhusionPassenger.bin_dir}/passenger-install-apache2-module --apxs2-path='#{apxs2}'"
66
- log ""
67
- log " To start, stop or restart this specific Apache version:"
68
- log " #{ctl} start"
69
- log " #{ctl} stop"
70
- log " #{ctl} restart"
71
- log ""
72
- if error_log
73
- log " To troubleshoot, please read the logs in this file:"
74
- log " #{error_log}"
75
- log ""
76
- end
77
- end
78
-
79
- private
80
- def log(message)
81
- @detector.send(:log, message)
82
- end
83
- end
84
-
85
- attr_reader :results
86
-
87
- def initialize(output)
88
- @output = output
89
- @results = []
90
- PlatformInfo.verbose = true
91
- PlatformInfo.log_implementation = lambda do |message|
92
- if message =~ /: found$/
93
- log("<green> --> #{message}</green>")
94
- else
95
- log(" --> #{message}")
96
- end
97
- end
98
- end
99
-
100
- def finish
101
- PlatformInfo.verbose = false
102
- PlatformInfo.log_implementation = nil
103
- end
104
-
105
- def detect_all
106
- log "<banner>Looking for possible Apache installations...</banner>"
107
- apxses = PlatformInfo.find_all_commands("apxs2") +
108
- PlatformInfo.find_all_commands("apxs")
109
- apxses = remove_symlink_duplications(apxses)
110
- log ""
111
- apxses.each do |apxs2|
112
- detect_one(apxs2)
113
- end
114
- end
115
-
116
- def detect_one(apxs2)
117
- log "<banner>Analyzing #{apxs2}...</banner>"
118
- add_result do |result|
119
- result.apxs2 = apxs2
120
- log "Detecting main Apache executable..."
121
- result.httpd = PlatformInfo.httpd(:apxs2 => apxs2)
122
- if result.httpd
123
- log "Detecting version..."
124
- if result.version = PlatformInfo.httpd_version(:httpd => result.httpd)
125
- log " --> #{result.version}"
126
- else
127
- log "<red> --> Cannot detect version!</red>"
128
- result.httpd = nil
129
- end
130
- end
131
- if result.httpd
132
- log "Detecting control command..."
133
- result.ctl = PlatformInfo.apache2ctl(:apxs2 => apxs2)
134
- result.httpd = nil if !result.ctl
135
- end
136
- if result.httpd
137
- log "Detecting configuration file location..."
138
- result.config_file = PlatformInfo.httpd_default_config_file(:httpd => result.httpd)
139
- if result.config_file
140
- log " --> #{result.config_file}"
141
- else
142
- log "<red> --> Cannot detect default config file location!</red>"
143
- result.httpd = nil
144
- end
145
- end
146
- if result.httpd
147
- log "Detecting error log file..."
148
- result.error_log = PlatformInfo.httpd_actual_error_log(:httpd => result.httpd)
149
- if result.error_log
150
- log " --> #{result.error_log}"
151
- else
152
- log "<red> --> Cannot detect error log file!</red>"
153
- end
154
- end
155
- if result.httpd
156
- log "Detecting a2enmod and a2dismod..."
157
- result.a2enmod = PlatformInfo.a2enmod(:apxs2 => apxs2)
158
- result.a2dismod = PlatformInfo.a2dismod(:apxs2 => apxs2)
159
- end
160
- if result.httpd
161
- log "<green>Found a usable Apache installation using #{apxs2}.</green>"
162
- true
163
- else
164
- log "<yellow>Cannot find a usable Apache installation using #{apxs2}.</yellow>"
165
- false
166
- end
167
- end
168
- log ""
169
- end
170
-
171
- def report
172
- log "<banner>Final autodetection results</banner>"
173
- @results.each do |result|
174
- result.report
175
- end
176
- if @results.empty?
177
- log "<red>Sorry, this program cannot find an Apache installation.</red>"
178
- log ""
179
- log "To install Apache, please run the following. It will tell you how to install Apache."
180
- log ""
181
- log " <b>#{PhusionPassenger.bin_dir}/passenger-install-apache2-module</b>"
182
- log ""
183
- log "If you are sure that you have Apache installed, please read the documentation:"
184
- log "<b>#{APACHE2_DOC_URL}#forcing_location_of_command_line_tools_and_dependencies</b>"
185
- elsif @results.size > 1
186
- log "<yellow>WARNING: You have multiple Apache installations on your system!</yellow>"
187
- log "You are strongly recommended to read this section of the documentation:"
188
- log "<b>#{APACHE2_DOC_URL}#multiple_apache_installs</b>"
189
- end
190
- end
191
-
192
- def result_for(apxs2)
193
- # All the results use realpaths, so the input must too.
194
- apxs2 = Pathname.new(apxs2).realpath
195
- return @results.find { |r| r.apxs2 == apxs2 }
196
- end
197
-
198
- private
199
- def log(message)
200
- if @output.tty?
201
- @output.puts(Utils::AnsiColors.ansi_colorize(message))
202
- else
203
- @output.puts(Utils::AnsiColors.strip_color_tags(message))
204
- end
205
- end
206
-
207
- # On Ubuntu, /usr/bin/apxs2 is a symlink to /usr/bin/apxs.
208
- # On recent Arch Linux releases, /bin, /sbin etc are symlinks to
209
- # /usr/bin and /usr/sbin.
210
- # We're only supposed to detect one Apache in that case so we need to
211
- # resolve symlinks.
212
- def remove_symlink_duplications(filenames)
213
- old_size = filenames.size
214
- filenames = filenames.map do |filename|
215
- Pathname.new(filename).realpath
216
- end
217
- filenames.uniq!
218
- if old_size != filenames.size
219
- log "#{old_size - filenames.size} symlink duplicate(s) detected; ignoring them."
220
- end
221
- return filenames
222
- end
223
-
224
- def add_result
225
- result = Result.new(self)
226
- @results << result if yield(result)
227
- end
228
- end
229
-
230
- end
32
+ module PlatformInfo
33
+
34
+ # Detects all possible Apache installations on the system, and presents the
35
+ # autodetection information to the user in a friendly way. It turns out too
36
+ # many people have multiple Apache installations on their system, but they
37
+ # don't know about that, or they don't know how to compile against the
38
+ # correct Apache installation. This tool helps them.
39
+ #
40
+ # If you use this class to log things to the terminal, then be sure to set
41
+ # the terminal color to Utils::AnsiColors::DEFAULT_TERMINAL_COLOR.
42
+ class ApacheDetector
43
+ class Result
44
+ # These are required and are never nil.
45
+ attr_accessor :apxs2, :httpd, :ctl, :version, :config_file
46
+ # These are optional and may be nil.
47
+ attr_accessor :a2enmod, :a2dismod
48
+ # This may be nil. It depends on how well we can infer information from the config file.
49
+ attr_accessor :error_log
50
+
51
+ def initialize(detector)
52
+ @detector = detector
53
+ end
54
+
55
+ def report
56
+ log " <b>* Found Apache #{version}!</b>"
57
+ log " Information:"
58
+ log " apxs2 : #{apxs2}"
59
+ log " Main executable: #{httpd}"
60
+ log " Control command: #{ctl}"
61
+ log " Config file : #{config_file}"
62
+ log " Error log file : #{error_log || 'unknown'}"
63
+ log ""
64
+ log " To install #{PROGRAM_NAME} against this specific Apache version:"
65
+ log " #{PlatformInfo.ruby_command} #{PhusionPassenger.bin_dir}/passenger-install-apache2-module --apxs2-path='#{apxs2}'"
66
+ log ""
67
+ log " To start, stop or restart this specific Apache version:"
68
+ log " #{ctl} start"
69
+ log " #{ctl} stop"
70
+ log " #{ctl} restart"
71
+ log ""
72
+ if error_log
73
+ log " To troubleshoot, please read the logs in this file:"
74
+ log " #{error_log}"
75
+ log ""
76
+ end
77
+ end
78
+
79
+ private
80
+ def log(message)
81
+ @detector.send(:log, message)
82
+ end
83
+ end
84
+
85
+ attr_reader :results
86
+
87
+ def initialize(output)
88
+ @output = output
89
+ @results = []
90
+ PlatformInfo.verbose = true
91
+ PlatformInfo.log_implementation = lambda do |message|
92
+ if message =~ /: found$/
93
+ log("<green> --> #{message}</green>")
94
+ else
95
+ log(" --> #{message}")
96
+ end
97
+ end
98
+ end
99
+
100
+ def finish
101
+ PlatformInfo.verbose = false
102
+ PlatformInfo.log_implementation = nil
103
+ end
104
+
105
+ def detect_all
106
+ log "<banner>Looking for possible Apache installations...</banner>"
107
+ apxses = PlatformInfo.find_all_commands("apxs2") +
108
+ PlatformInfo.find_all_commands("apxs")
109
+ apxses = remove_symlink_duplications(apxses)
110
+ log ""
111
+ apxses.each do |apxs2|
112
+ detect_one(apxs2)
113
+ end
114
+ end
115
+
116
+ def detect_one(apxs2)
117
+ log "<banner>Analyzing #{apxs2}...</banner>"
118
+ add_result do |result|
119
+ result.apxs2 = apxs2
120
+ log "Detecting main Apache executable..."
121
+ result.httpd = PlatformInfo.httpd(:apxs2 => apxs2)
122
+ if result.httpd
123
+ log "Detecting version..."
124
+ if result.version = PlatformInfo.httpd_version(:httpd => result.httpd)
125
+ log " --> #{result.version}"
126
+ else
127
+ log "<red> --> Cannot detect version!</red>"
128
+ result.httpd = nil
129
+ end
130
+ end
131
+ if result.httpd
132
+ log "Detecting control command..."
133
+ result.ctl = PlatformInfo.apache2ctl(:apxs2 => apxs2)
134
+ result.httpd = nil if !result.ctl
135
+ end
136
+ if result.httpd
137
+ log "Detecting configuration file location..."
138
+ result.config_file = PlatformInfo.httpd_default_config_file(:httpd => result.httpd)
139
+ if result.config_file
140
+ log " --> #{result.config_file}"
141
+ else
142
+ log "<red> --> Cannot detect default config file location!</red>"
143
+ result.httpd = nil
144
+ end
145
+ end
146
+ if result.httpd
147
+ log "Detecting error log file..."
148
+ result.error_log = PlatformInfo.httpd_actual_error_log(:httpd => result.httpd)
149
+ if result.error_log
150
+ log " --> #{result.error_log}"
151
+ else
152
+ log "<red> --> Cannot detect error log file!</red>"
153
+ end
154
+ end
155
+ if result.httpd
156
+ log "Detecting a2enmod and a2dismod..."
157
+ result.a2enmod = PlatformInfo.a2enmod(:apxs2 => apxs2)
158
+ result.a2dismod = PlatformInfo.a2dismod(:apxs2 => apxs2)
159
+ end
160
+ if result.httpd
161
+ log "<green>Found a usable Apache installation using #{apxs2}.</green>"
162
+ true
163
+ else
164
+ log "<yellow>Cannot find a usable Apache installation using #{apxs2}.</yellow>"
165
+ false
166
+ end
167
+ end
168
+ log ""
169
+ end
170
+
171
+ def report
172
+ log "<banner>Final autodetection results</banner>"
173
+ @results.each do |result|
174
+ result.report
175
+ end
176
+ if @results.empty?
177
+ log "<red>Sorry, this program cannot find an Apache installation.</red>"
178
+ log ""
179
+ log "To install Apache, please run the following. It will tell you how to install Apache."
180
+ log ""
181
+ log " <b>#{PhusionPassenger.bin_dir}/passenger-install-apache2-module</b>"
182
+ log ""
183
+ log "If you are sure that you have Apache installed, please read the documentation:"
184
+ log "<b>#{APACHE2_DOC_URL}#forcing_location_of_command_line_tools_and_dependencies</b>"
185
+ elsif @results.size > 1
186
+ log "<yellow>WARNING: You have multiple Apache installations on your system!</yellow>"
187
+ log "You are strongly recommended to read this section of the documentation:"
188
+ log "<b>#{APACHE2_DOC_URL}#multiple_apache_installs</b>"
189
+ end
190
+ end
191
+
192
+ def result_for(apxs2)
193
+ # All the results use realpaths, so the input must too.
194
+ apxs2 = Pathname.new(apxs2).realpath
195
+ return @results.find { |r| r.apxs2 == apxs2 }
196
+ end
197
+
198
+ private
199
+ def log(message)
200
+ if @output.tty?
201
+ @output.puts(Utils::AnsiColors.ansi_colorize(message))
202
+ else
203
+ @output.puts(Utils::AnsiColors.strip_color_tags(message))
204
+ end
205
+ end
206
+
207
+ # On Ubuntu, /usr/bin/apxs2 is a symlink to /usr/bin/apxs.
208
+ # On recent Arch Linux releases, /bin, /sbin etc are symlinks to
209
+ # /usr/bin and /usr/sbin.
210
+ # We're only supposed to detect one Apache in that case so we need to
211
+ # resolve symlinks.
212
+ def remove_symlink_duplications(filenames)
213
+ old_size = filenames.size
214
+ filenames = filenames.map do |filename|
215
+ Pathname.new(filename).realpath
216
+ end
217
+ filenames.uniq!
218
+ if old_size != filenames.size
219
+ log "#{old_size - filenames.size} symlink duplicate(s) detected; ignoring them."
220
+ end
221
+ return filenames
222
+ end
223
+
224
+ def add_result
225
+ result = Result.new(self)
226
+ @results << result if yield(result)
227
+ end
228
+ end
229
+
230
+ end
231
231
  end # module Phusion Passenger
@@ -28,112 +28,112 @@ PhusionPassenger.require_passenger_lib 'platform_info/operating_system'
28
28
 
29
29
  module PhusionPassenger
30
30
 
31
- module PlatformInfo
32
- # Returns a string that describes the current Ruby
33
- # interpreter's extension binary compatibility. A Ruby extension
34
- # compiled for a certain Ruby interpreter can also be loaded on
35
- # a different Ruby interpreter with the same binary compatibility
36
- # identifier.
37
- #
38
- # The result depends on the following factors:
39
- # - Ruby engine name.
40
- # - Ruby extension version.
41
- # This is not the same as the Ruby language version, which
42
- # identifies language-level compatibility. This is rather about
43
- # binary compatibility of extensions.
44
- # MRI seems to break source compatibility between tiny releases,
45
- # though patchlevel releases tend to be source and binary
46
- # compatible.
47
- # - Ruby extension architecture.
48
- # This is not necessarily the same as the operating system
49
- # runtime architecture or the CPU architecture.
50
- # For example, in case of JRuby, the extension architecture is
51
- # just "java" because all extensions target the Java platform;
52
- # the architecture the JVM was compiled for has no effect on
53
- # compatibility.
54
- # On systems with universal binaries support there may be multiple
55
- # architectures. In this case the architecture is "universal"
56
- # because extensions must be able to support all of the Ruby
57
- # executable's architectures.
58
- # - The operating system for which the Ruby interpreter was compiled.
59
- def self.ruby_extension_binary_compatibility_id
60
- ruby_engine = defined?(RUBY_ENGINE) ? RUBY_ENGINE : "ruby"
61
- ruby_ext_version = RUBY_VERSION
62
- if RUBY_PLATFORM =~ /darwin/
63
- if RUBY_PLATFORM =~ /universal/
64
- ruby_arch = "universal"
65
- else
66
- # OS X < 10.8: something like:
67
- # "/opt/ruby-enterprise/bin/ruby: Mach-O 64-bit executable x86_64"
68
- output = `file -L "#{ruby_executable}"`.strip
69
- ruby_arch = output.sub(/.* /, '')
70
- if ruby_arch == "executable"
71
- # OS X >= 10.8: something like:
72
- # "/opt/ruby-enterprise/bin/ruby: Mach-O 64-bit executable"
73
- if output =~ /Mach-O 64-bit/
74
- ruby_arch = "x86_64"
75
- else
76
- raise "Cannot autodetect the Ruby interpreter's architecture"
77
- end
78
- end
79
- end
80
- elsif RUBY_PLATFORM == "java"
81
- ruby_arch = "java"
82
- else
83
- ruby_arch = cpu_architectures[0]
84
- end
85
- return "#{ruby_engine}-#{ruby_ext_version}-#{ruby_arch}-#{os_name}"
86
- end
87
- memoize :ruby_extension_binary_compatibility_id
88
-
89
- # Returns an identifier string that describes the current
90
- # platform's binary compatibility with regard to C/C++
91
- # binaries. Two systems with the same binary compatibility
92
- # identifiers should be able to run the same C/C++ binaries.
93
- #
94
- # The the string depends on the following factors:
95
- # - The operating system name.
96
- # - Operating system runtime identifier.
97
- # This may include the kernel version, libc version, C++ ABI version,
98
- # etc. Everything that is of interest for binary compatibility with
99
- # regard to C/C++ binaries.
100
- # - Operating system default runtime architecture.
101
- # This is not the same as the CPU architecture; some CPUs support
102
- # multiple architectures, e.g. Intel Core 2 Duo supports x86 and
103
- # x86_64. Some operating systems actually support multiple runtime
104
- # architectures: a lot of x86_64 Linux distributions also include
105
- # 32-bit runtimes, and OS X Snow Leopard is x86_64 by default but
106
- # all system libraries also support x86.
107
- # This component identifies the architecture that is used when
108
- # compiling a binary with the system's C++ compiler with its default
109
- # options.
110
- def self.cxx_binary_compatibility_id
111
- if os_name == "macosx"
112
- # RUBY_PLATFORM gives us the kernel version, but we want
113
- # the OS X version.
114
- os_version_string = `sw_vers -productVersion`.strip
115
- # sw_vers returns something like "10.6.2". We're only
116
- # interested in the first two digits (MAJOR.MINOR) since
117
- # tiny releases tend to be binary compatible with each
118
- # other.
119
- components = os_version_string.split(".")
120
- os_version = "#{components[0]}.#{components[1]}"
121
- os_runtime = os_version
122
-
123
- os_arch = cpu_architectures[0]
124
- if os_version >= "10.5" && os_arch =~ /^i.86$/
125
- # On Snow Leopard, 'uname -m' returns i386 but
126
- # we *know* that everything is x86_64 by default.
127
- os_arch = "x86_64"
128
- end
129
- else
130
- os_arch = cpu_architectures[0]
131
- os_runtime = nil
132
- end
133
-
134
- return [os_arch, os_name, os_runtime].compact.join("-")
135
- end
136
- memoize :cxx_binary_compatibility_id
137
- end
31
+ module PlatformInfo
32
+ # Returns a string that describes the current Ruby
33
+ # interpreter's extension binary compatibility. A Ruby extension
34
+ # compiled for a certain Ruby interpreter can also be loaded on
35
+ # a different Ruby interpreter with the same binary compatibility
36
+ # identifier.
37
+ #
38
+ # The result depends on the following factors:
39
+ # - Ruby engine name.
40
+ # - Ruby extension version.
41
+ # This is not the same as the Ruby language version, which
42
+ # identifies language-level compatibility. This is rather about
43
+ # binary compatibility of extensions.
44
+ # MRI seems to break source compatibility between tiny releases,
45
+ # though patchlevel releases tend to be source and binary
46
+ # compatible.
47
+ # - Ruby extension architecture.
48
+ # This is not necessarily the same as the operating system
49
+ # runtime architecture or the CPU architecture.
50
+ # For example, in case of JRuby, the extension architecture is
51
+ # just "java" because all extensions target the Java platform;
52
+ # the architecture the JVM was compiled for has no effect on
53
+ # compatibility.
54
+ # On systems with universal binaries support there may be multiple
55
+ # architectures. In this case the architecture is "universal"
56
+ # because extensions must be able to support all of the Ruby
57
+ # executable's architectures.
58
+ # - The operating system for which the Ruby interpreter was compiled.
59
+ def self.ruby_extension_binary_compatibility_id
60
+ ruby_engine = defined?(RUBY_ENGINE) ? RUBY_ENGINE : "ruby"
61
+ ruby_ext_version = RUBY_VERSION
62
+ if RUBY_PLATFORM =~ /darwin/
63
+ if RUBY_PLATFORM =~ /universal/
64
+ ruby_arch = "universal"
65
+ else
66
+ # OS X < 10.8: something like:
67
+ # "/opt/ruby-enterprise/bin/ruby: Mach-O 64-bit executable x86_64"
68
+ output = `file -L "#{ruby_executable}"`.strip
69
+ ruby_arch = output.sub(/.* /, '')
70
+ if ruby_arch == "executable"
71
+ # OS X >= 10.8: something like:
72
+ # "/opt/ruby-enterprise/bin/ruby: Mach-O 64-bit executable"
73
+ if output =~ /Mach-O 64-bit/
74
+ ruby_arch = "x86_64"
75
+ else
76
+ raise "Cannot autodetect the Ruby interpreter's architecture"
77
+ end
78
+ end
79
+ end
80
+ elsif RUBY_PLATFORM == "java"
81
+ ruby_arch = "java"
82
+ else
83
+ ruby_arch = cpu_architectures[0]
84
+ end
85
+ return "#{ruby_engine}-#{ruby_ext_version}-#{ruby_arch}-#{os_name}"
86
+ end
87
+ memoize :ruby_extension_binary_compatibility_id
88
+
89
+ # Returns an identifier string that describes the current
90
+ # platform's binary compatibility with regard to C/C++
91
+ # binaries. Two systems with the same binary compatibility
92
+ # identifiers should be able to run the same C/C++ binaries.
93
+ #
94
+ # The the string depends on the following factors:
95
+ # - The operating system name.
96
+ # - Operating system runtime identifier.
97
+ # This may include the kernel version, libc version, C++ ABI version,
98
+ # etc. Everything that is of interest for binary compatibility with
99
+ # regard to C/C++ binaries.
100
+ # - Operating system default runtime architecture.
101
+ # This is not the same as the CPU architecture; some CPUs support
102
+ # multiple architectures, e.g. Intel Core 2 Duo supports x86 and
103
+ # x86_64. Some operating systems actually support multiple runtime
104
+ # architectures: a lot of x86_64 Linux distributions also include
105
+ # 32-bit runtimes, and OS X Snow Leopard is x86_64 by default but
106
+ # all system libraries also support x86.
107
+ # This component identifies the architecture that is used when
108
+ # compiling a binary with the system's C++ compiler with its default
109
+ # options.
110
+ def self.cxx_binary_compatibility_id
111
+ if os_name == "macosx"
112
+ # RUBY_PLATFORM gives us the kernel version, but we want
113
+ # the OS X version.
114
+ os_version_string = `sw_vers -productVersion`.strip
115
+ # sw_vers returns something like "10.6.2". We're only
116
+ # interested in the first two digits (MAJOR.MINOR) since
117
+ # tiny releases tend to be binary compatible with each
118
+ # other.
119
+ components = os_version_string.split(".")
120
+ os_version = "#{components[0]}.#{components[1]}"
121
+ os_runtime = os_version
122
+
123
+ os_arch = cpu_architectures[0]
124
+ if os_version >= "10.5" && os_arch =~ /^i.86$/
125
+ # On Snow Leopard, 'uname -m' returns i386 but
126
+ # we *know* that everything is x86_64 by default.
127
+ os_arch = "x86_64"
128
+ end
129
+ else
130
+ os_arch = cpu_architectures[0]
131
+ os_runtime = nil
132
+ end
133
+
134
+ return [os_arch, os_name, os_runtime].compact.join("-")
135
+ end
136
+ memoize :cxx_binary_compatibility_id
137
+ end
138
138
 
139
139
  end # module PhusionPassenger