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
@@ -23,299 +23,299 @@
23
23
  # THE SOFTWARE.
24
24
 
25
25
  module PhusionPassenger
26
- FILE_LOCATION = File.expand_path(__FILE__)
27
-
28
-
29
- ###### Names and version numbers ######
30
-
31
- PACKAGE_NAME = 'passenger'
32
- # Run 'rake ext/common/Constants.h' after changing this number.
33
- VERSION_STRING = '5.0.0.beta3'
34
-
35
- PREFERRED_NGINX_VERSION = '1.6.2'
36
- NGINX_SHA256_CHECKSUM = 'b5608c2959d3e7ad09b20fc8f9e5bd4bc87b3bc8ba5936a513c04ed8f1391a18'
37
-
38
- PREFERRED_PCRE_VERSION = '8.34'
39
- PCRE_SHA256_CHECKSUM = '1dd78994c81e44ac41cf30b2a21d4b4cc6d76ccde7fc6e77713ed51d7bddca47'
40
-
41
- STANDALONE_INTERFACE_VERSION = 1
42
-
43
-
44
- ###### Directories ######
45
-
46
- GLOBAL_NAMESPACE_DIRNAME_ = "passenger"
47
- # Subdirectory under $HOME to use for storing stuff.
48
- USER_NAMESPACE_DIRNAME_ = ".passenger"
49
- # The name for the /etc/apache2/mods-available/*.{load,conf} file.
50
- APACHE2_MODULE_CONF_NAME = "passenger"
51
-
52
- # Directories in which to look for plugins.
53
- PLUGIN_DIRS = [
54
- "/usr/share/#{GLOBAL_NAMESPACE_DIRNAME_}/plugins",
55
- "/usr/local/share/#{GLOBAL_NAMESPACE_DIRNAME_}/plugins",
56
- "~/#{USER_NAMESPACE_DIRNAME_}/plugins"
57
- ]
58
-
59
- REQUIRED_LOCATIONS_INI_FIELDS = [
60
- # User-invoked commands
61
- :bin_dir,
62
- # Support binaries
63
- :support_binaries_dir,
64
- # Library files like libboost_oxt.a and various .o files
65
- :lib_dir,
66
- # Scripts not directly invoked by users
67
- :helper_scripts_dir,
68
- # Various non-executable resources
69
- :resources_dir,
70
- # C header files, necessary for compiling Nginx
71
- :include_dir,
72
- # Documentation
73
- :doc_dir,
74
- # Ruby support libraries
75
- :ruby_libdir,
76
- # Node.js support libraries
77
- :node_libdir,
78
- # Path to the compiled Apache module
79
- :apache2_module_path,
80
- # Directory containing the source code of our Ruby extension
81
- :ruby_extension_source_dir,
82
- # Directory containing the source code of our Nginx module
83
- :nginx_module_source_dir
84
- ].freeze
85
- OPTIONAL_LOCATIONS_INI_FIELDS = [
86
- # Directory which contains the main Phusion Passenger Rakefile. Only
87
- # available when originally packaged,
88
- :build_system_dir,
89
- # Directory in which downloaded Phusion Passenger binaries are cached.
90
- :download_cache_dir
91
- ].freeze
92
-
93
- # Follows the logic of ext/common/ResourceLocator.h, so don't forget to modify that too.
94
- def self.locate_directories(install_spec = nil)
95
- @install_spec = install_spec || infer_install_spec
96
- if @install_spec && File.file?(@install_spec)
97
- filename = @install_spec
98
- options = parse_ini_file(filename)
99
-
100
- @custom_packaged = true
101
- @packaging_method = get_option(filename, options, 'packaging_method')
102
- REQUIRED_LOCATIONS_INI_FIELDS.each do |field|
103
- value = get_option(filename, options, field.to_s)
104
- value.freeze unless value.nil?
105
- instance_variable_set("@#{field}", value)
106
- end
107
- OPTIONAL_LOCATIONS_INI_FIELDS.each do |field|
108
- value = get_option(filename, options, field.to_s, false)
109
- value.freeze unless value.nil?
110
- instance_variable_set("@#{field}", value)
111
- end
112
- else
113
- source_root = File.dirname(File.dirname(FILE_LOCATION))
114
- @install_spec = source_root
115
- @custom_packaged = false
116
- @bin_dir = "#{source_root}/bin".freeze
117
- @support_binaries_dir = "#{source_root}/buildout/support-binaries".freeze
118
- @lib_dir = "#{source_root}/buildout".freeze
119
- @helper_scripts_dir = "#{source_root}/helper-scripts".freeze
120
- @resources_dir = "#{source_root}/resources".freeze
121
- @include_dir = "#{source_root}/ext".freeze
122
- @doc_dir = "#{source_root}/doc".freeze
123
- @ruby_libdir = File.dirname(FILE_LOCATION).freeze
124
- @node_libdir = "#{source_root}/node_lib".freeze
125
- @apache2_module_path = "#{source_root}/buildout/apache2/mod_passenger.so".freeze
126
- @ruby_extension_source_dir = "#{source_root}/ext/ruby".freeze
127
- @nginx_module_source_dir = "#{source_root}/ext/nginx".freeze
128
- @download_cache_dir = "#{source_root}/download_cache".freeze
129
- @build_system_dir = source_root.dup.freeze
130
- REQUIRED_LOCATIONS_INI_FIELDS.each do |field|
131
- if instance_variable_get("@#{field}").nil?
132
- raise "BUG: @#{field} not set"
133
- end
134
- end
135
- end
136
- end
137
-
138
- # Returns whether this Phusion Passenger installation is in the 'originally packaged'
139
- # configuration (as opposed to the 'custom packaged' configuration.
140
- def self.originally_packaged?
141
- return !@custom_packaged
142
- end
143
-
144
- def self.custom_packaged?
145
- return @custom_packaged
146
- end
147
-
148
- # If Phusion Passenger is custom packaged, returns which packaging
149
- # method was used. Can be 'deb', 'rpm', 'homebrew', 'test'
150
- # or 'unknown'.
151
- def self.packaging_method
152
- return @custom_packaging_method
153
- end
154
-
155
- # Whether the current Phusion Passenger installation is installed
156
- # from a release package, e.g. an official gem or official tarball.
157
- # Retruns false if e.g. the gem was built by the user, or if this
158
- # install is from a git repository.
159
- def self.installed_from_release_package?
160
- File.exist?("#{resources_dir}/release.txt")
161
- end
162
-
163
- # The installation specification string, as passed to #locate_directories.
164
- def self.install_spec
165
- return @install_spec
166
- end
167
-
168
- # Generate getters for the directory types in locations.ini.
169
- getters_code = ""
170
- (REQUIRED_LOCATIONS_INI_FIELDS + OPTIONAL_LOCATIONS_INI_FIELDS).each do |field|
171
- getters_code << %Q{
172
- def self.#{field}
173
- return @#{field}
174
- end
175
- }
176
- end
177
- eval(getters_code, binding, __FILE__, __LINE__)
178
-
179
- def self.user_support_binaries_dir
180
- return "#{home_dir}/#{USER_NAMESPACE_DIRNAME_}/support-binaries/#{VERSION_STRING}"
181
- end
182
-
183
- def self.find_support_binary(name)
184
- all_support_binary_dirs = [
185
- support_binaries_dir,
186
- user_support_binaries_dir
187
- ]
188
- all_support_binary_dirs.each do |dir|
189
- result = "#{dir}/#{name}"
190
- if File.exist?(result)
191
- return result
192
- end
193
- end
194
- return nil
195
- end
196
-
197
- def self.index_doc_path
198
- return "#{doc_dir}/#{INDEX_DOC_NAME}"
199
- end
200
-
201
- def self.apache2_doc_path
202
- return "#{doc_dir}/#{APACHE2_DOC_NAME}"
203
- end
204
-
205
- def self.nginx_doc_path
206
- return "#{doc_dir}/#{NGINX_DOC_NAME}"
207
- end
208
-
209
- def self.standalone_doc_path
210
- return "#{doc_dir}/#{STANDALONE_DOC_NAME}"
211
- end
212
-
213
-
214
- ###### Other resource locations ######
215
-
216
- INDEX_DOC_NAME = "Users guide.html".freeze
217
- APACHE2_DOC_NAME = "Users guide Apache.html".freeze
218
- NGINX_DOC_NAME = "Users guide Nginx.html".freeze
219
- STANDALONE_DOC_NAME = "Users guide Standalone.html".freeze
220
-
221
- def self.binaries_sites
222
- return [
223
- { :url => "https://oss-binaries.phusionpassenger.com/binaries/passenger/by_release".freeze,
224
- :cacert => "#{resources_dir}/oss-binaries.phusionpassenger.com.crt".freeze },
225
- { :url => "https://s3.amazonaws.com/phusion-passenger/binaries/passenger/by_release".freeze }
226
- ]
227
- end
228
-
229
-
230
- # Instead of calling `require 'phusion_passenger/foo'`, you should call
231
- # `PhusionPassenger.require_passenger_lib 'foo'`. This is because when Phusion
232
- # Passenger is natively packaged, it may still be run with arbitrary Ruby
233
- # interpreters. Adding ruby_libdir to $LOAD_PATH is then dangerous because ruby_libdir
234
- # may be the distribution's Ruby's vendor_ruby directory, which may be incompatible
235
- # with the active Ruby interpreter. This method looks up the exact filename directly.
236
- #
237
- # Using this method also has two more advantages:
238
- #
239
- # 1. It is immune to Bundler's load path mangling code.
240
- # 2. It is faster than plan require() because it doesn't need to
241
- # scan the entire load path.
242
- def self.require_passenger_lib(name)
243
- require("#{ruby_libdir}/phusion_passenger/#{name}")
244
- end
26
+ FILE_LOCATION = File.expand_path(__FILE__)
27
+
28
+
29
+ ###### Names and version numbers ######
30
+
31
+ PACKAGE_NAME = 'passenger'
32
+ # Run 'rake ext/common/Constants.h' after changing this number.
33
+ VERSION_STRING = '5.0.0.rc1'
34
+
35
+ PREFERRED_NGINX_VERSION = '1.6.2'
36
+ NGINX_SHA256_CHECKSUM = 'b5608c2959d3e7ad09b20fc8f9e5bd4bc87b3bc8ba5936a513c04ed8f1391a18'
37
+
38
+ PREFERRED_PCRE_VERSION = '8.34'
39
+ PCRE_SHA256_CHECKSUM = '1dd78994c81e44ac41cf30b2a21d4b4cc6d76ccde7fc6e77713ed51d7bddca47'
40
+
41
+ STANDALONE_INTERFACE_VERSION = 1
42
+
43
+
44
+ ###### Directories ######
45
+
46
+ GLOBAL_NAMESPACE_DIRNAME_ = "passenger"
47
+ # Subdirectory under $HOME to use for storing stuff.
48
+ USER_NAMESPACE_DIRNAME_ = ".passenger"
49
+ # The name for the /etc/apache2/mods-available/*.{load,conf} file.
50
+ APACHE2_MODULE_CONF_NAME = "passenger"
51
+
52
+ # Directories in which to look for plugins.
53
+ PLUGIN_DIRS = [
54
+ "/usr/share/#{GLOBAL_NAMESPACE_DIRNAME_}/plugins",
55
+ "/usr/local/share/#{GLOBAL_NAMESPACE_DIRNAME_}/plugins",
56
+ "~/#{USER_NAMESPACE_DIRNAME_}/plugins"
57
+ ]
58
+
59
+ REQUIRED_LOCATIONS_INI_FIELDS = [
60
+ # User-invoked commands
61
+ :bin_dir,
62
+ # Support binaries
63
+ :support_binaries_dir,
64
+ # Library files like libboost_oxt.a and various .o files
65
+ :lib_dir,
66
+ # Scripts not directly invoked by users
67
+ :helper_scripts_dir,
68
+ # Various non-executable resources
69
+ :resources_dir,
70
+ # C header files, necessary for compiling Nginx
71
+ :include_dir,
72
+ # Documentation
73
+ :doc_dir,
74
+ # Ruby support libraries
75
+ :ruby_libdir,
76
+ # Node.js support libraries
77
+ :node_libdir,
78
+ # Path to the compiled Apache module
79
+ :apache2_module_path,
80
+ # Directory containing the source code of our Ruby extension
81
+ :ruby_extension_source_dir,
82
+ # Directory containing the source code of our Nginx module
83
+ :nginx_module_source_dir
84
+ ].freeze
85
+ OPTIONAL_LOCATIONS_INI_FIELDS = [
86
+ # Directory which contains the main Phusion Passenger Rakefile. Only
87
+ # available when originally packaged,
88
+ :build_system_dir,
89
+ # Directory in which downloaded Phusion Passenger binaries are cached.
90
+ :download_cache_dir
91
+ ].freeze
92
+
93
+ # Follows the logic of ext/common/ResourceLocator.h, so don't forget to modify that too.
94
+ def self.locate_directories(install_spec = nil)
95
+ @install_spec = install_spec || infer_install_spec
96
+ if @install_spec && File.file?(@install_spec)
97
+ filename = @install_spec
98
+ options = parse_ini_file(filename)
99
+
100
+ @custom_packaged = true
101
+ @packaging_method = get_option(filename, options, 'packaging_method')
102
+ REQUIRED_LOCATIONS_INI_FIELDS.each do |field|
103
+ value = get_option(filename, options, field.to_s)
104
+ value.freeze unless value.nil?
105
+ instance_variable_set("@#{field}", value)
106
+ end
107
+ OPTIONAL_LOCATIONS_INI_FIELDS.each do |field|
108
+ value = get_option(filename, options, field.to_s, false)
109
+ value.freeze unless value.nil?
110
+ instance_variable_set("@#{field}", value)
111
+ end
112
+ else
113
+ source_root = File.dirname(File.dirname(FILE_LOCATION))
114
+ @install_spec = source_root
115
+ @custom_packaged = false
116
+ @bin_dir = "#{source_root}/bin".freeze
117
+ @support_binaries_dir = "#{source_root}/buildout/support-binaries".freeze
118
+ @lib_dir = "#{source_root}/buildout".freeze
119
+ @helper_scripts_dir = "#{source_root}/helper-scripts".freeze
120
+ @resources_dir = "#{source_root}/resources".freeze
121
+ @include_dir = "#{source_root}/ext".freeze
122
+ @doc_dir = "#{source_root}/doc".freeze
123
+ @ruby_libdir = File.dirname(FILE_LOCATION).freeze
124
+ @node_libdir = "#{source_root}/node_lib".freeze
125
+ @apache2_module_path = "#{source_root}/buildout/apache2/mod_passenger.so".freeze
126
+ @ruby_extension_source_dir = "#{source_root}/ext/ruby".freeze
127
+ @nginx_module_source_dir = "#{source_root}/ext/nginx".freeze
128
+ @download_cache_dir = "#{source_root}/download_cache".freeze
129
+ @build_system_dir = source_root.dup.freeze
130
+ REQUIRED_LOCATIONS_INI_FIELDS.each do |field|
131
+ if instance_variable_get("@#{field}").nil?
132
+ raise "BUG: @#{field} not set"
133
+ end
134
+ end
135
+ end
136
+ end
137
+
138
+ # Returns whether this Phusion Passenger installation is in the 'originally packaged'
139
+ # configuration (as opposed to the 'custom packaged' configuration.
140
+ def self.originally_packaged?
141
+ return !@custom_packaged
142
+ end
143
+
144
+ def self.custom_packaged?
145
+ return @custom_packaged
146
+ end
147
+
148
+ # If Phusion Passenger is custom packaged, returns which packaging
149
+ # method was used. Can be 'deb', 'rpm', 'homebrew', 'test'
150
+ # or 'unknown'.
151
+ def self.packaging_method
152
+ return @custom_packaging_method
153
+ end
154
+
155
+ # Whether the current Phusion Passenger installation is installed
156
+ # from a release package, e.g. an official gem or official tarball.
157
+ # Retruns false if e.g. the gem was built by the user, or if this
158
+ # install is from a git repository.
159
+ def self.installed_from_release_package?
160
+ File.exist?("#{resources_dir}/release.txt")
161
+ end
162
+
163
+ # The installation specification string, as passed to #locate_directories.
164
+ def self.install_spec
165
+ return @install_spec
166
+ end
167
+
168
+ # Generate getters for the directory types in locations.ini.
169
+ getters_code = ""
170
+ (REQUIRED_LOCATIONS_INI_FIELDS + OPTIONAL_LOCATIONS_INI_FIELDS).each do |field|
171
+ getters_code << %Q{
172
+ def self.#{field}
173
+ return @#{field}
174
+ end
175
+ }
176
+ end
177
+ eval(getters_code, binding, __FILE__, __LINE__)
178
+
179
+ def self.user_support_binaries_dir
180
+ return "#{home_dir}/#{USER_NAMESPACE_DIRNAME_}/support-binaries/#{VERSION_STRING}"
181
+ end
182
+
183
+ def self.find_support_binary(name)
184
+ all_support_binary_dirs = [
185
+ support_binaries_dir,
186
+ user_support_binaries_dir
187
+ ]
188
+ all_support_binary_dirs.each do |dir|
189
+ result = "#{dir}/#{name}"
190
+ if File.exist?(result)
191
+ return result
192
+ end
193
+ end
194
+ return nil
195
+ end
196
+
197
+ def self.index_doc_path
198
+ return "#{doc_dir}/#{INDEX_DOC_NAME}"
199
+ end
200
+
201
+ def self.apache2_doc_path
202
+ return "#{doc_dir}/#{APACHE2_DOC_NAME}"
203
+ end
204
+
205
+ def self.nginx_doc_path
206
+ return "#{doc_dir}/#{NGINX_DOC_NAME}"
207
+ end
208
+
209
+ def self.standalone_doc_path
210
+ return "#{doc_dir}/#{STANDALONE_DOC_NAME}"
211
+ end
212
+
213
+
214
+ ###### Other resource locations ######
215
+
216
+ INDEX_DOC_NAME = "Users guide.html".freeze
217
+ APACHE2_DOC_NAME = "Users guide Apache.html".freeze
218
+ NGINX_DOC_NAME = "Users guide Nginx.html".freeze
219
+ STANDALONE_DOC_NAME = "Users guide Standalone.html".freeze
220
+
221
+ def self.binaries_sites
222
+ return [
223
+ { :url => "https://oss-binaries.phusionpassenger.com/binaries/passenger/by_release".freeze,
224
+ :cacert => "#{resources_dir}/oss-binaries.phusionpassenger.com.crt".freeze },
225
+ { :url => "https://s3.amazonaws.com/phusion-passenger/binaries/passenger/by_release".freeze }
226
+ ]
227
+ end
228
+
229
+
230
+ # Instead of calling `require 'phusion_passenger/foo'`, you should call
231
+ # `PhusionPassenger.require_passenger_lib 'foo'`. This is because when Phusion
232
+ # Passenger is natively packaged, it may still be run with arbitrary Ruby
233
+ # interpreters. Adding ruby_libdir to $LOAD_PATH is then dangerous because ruby_libdir
234
+ # may be the distribution's Ruby's vendor_ruby directory, which may be incompatible
235
+ # with the active Ruby interpreter. This method looks up the exact filename directly.
236
+ #
237
+ # Using this method also has two more advantages:
238
+ #
239
+ # 1. It is immune to Bundler's load path mangling code.
240
+ # 2. It is faster than plan require() because it doesn't need to
241
+ # scan the entire load path.
242
+ def self.require_passenger_lib(name)
243
+ require("#{ruby_libdir}/phusion_passenger/#{name}")
244
+ end
245
245
 
246
246
 
247
247
  private
248
- def self.infer_install_spec
249
- filename = ENV['PASSENGER_LOCATION_CONFIGURATION_FILE']
250
- return filename if filename && !filename.empty?
251
-
252
- filename = File.dirname(FILE_LOCATION) + "/phusion_passenger/locations.ini"
253
- return filename if filename && File.exist?(filename)
254
-
255
- require 'etc' if !defined?(Etc)
256
- begin
257
- home_dir = Etc.getpwuid(Process.uid).dir
258
- rescue ArgumentError
259
- # Unknown user.
260
- home_dir = ENV['HOME']
261
- end
262
- if home_dir && !home_dir.empty?
263
- filename = "#{home_dir}/#{USER_NAMESPACE_DIRNAME_}/locations.ini"
264
- return filename if File.exist?(filename)
265
- end
266
-
267
- filename = "/etc/#{GLOBAL_NAMESPACE_DIRNAME_}/locations.ini"
268
- return filename if File.exist?(filename)
269
-
270
- return nil
271
- end
272
-
273
- def self.parse_ini_file(filename)
274
- options = {}
275
- in_locations_section = false
276
- File.open(filename, 'r') do |f|
277
- while !f.eof?
278
- line = f.readline
279
- line.strip!
280
- next if line.empty?
281
- if line =~ /\A\[(.+)\]\Z/
282
- in_locations_section = $1 == 'locations'
283
- elsif in_locations_section && line =~ /=/
284
- key, value = line.split(/ *= */, 2)
285
- options[key.freeze] = value.freeze
286
- end
287
- end
288
- end
289
- return options
290
- end
291
-
292
- def self.get_option(filename, options, key, required = true)
293
- value = options[key]
294
- if value
295
- return value
296
- elsif required
297
- raise "Option '#{key}' missing in file '#{filename}'"
298
- else
299
- return nil
300
- end
301
- end
302
-
303
- def self.get_bool_option(filename, options, key)
304
- value = get_option(filename, options, key)
305
- return value == 'yes' || value == 'true' || value == 'on' || value == '1'
306
- end
307
-
308
- # The HOME environment variable is often unreliable, because for
309
- # example `sudo` preserves it. That's why we don't respect it by
310
- # default.
311
- def self.home_dir(respect_home_env = false)
312
- if respect_home_env
313
- home = ENV['HOME'].to_s
314
- end
315
- if home.nil? || home.empty?
316
- require 'etc' if !defined?(Etc)
317
- home = Etc.getpwuid(Process.uid).dir
318
- end
319
- return home
320
- end
248
+ def self.infer_install_spec
249
+ filename = ENV['PASSENGER_LOCATION_CONFIGURATION_FILE']
250
+ return filename if filename && !filename.empty?
251
+
252
+ filename = File.dirname(FILE_LOCATION) + "/phusion_passenger/locations.ini"
253
+ return filename if filename && File.exist?(filename)
254
+
255
+ require 'etc' if !defined?(Etc)
256
+ begin
257
+ home_dir = Etc.getpwuid(Process.uid).dir
258
+ rescue ArgumentError
259
+ # Unknown user.
260
+ home_dir = ENV['HOME']
261
+ end
262
+ if home_dir && !home_dir.empty?
263
+ filename = "#{home_dir}/#{USER_NAMESPACE_DIRNAME_}/locations.ini"
264
+ return filename if File.exist?(filename)
265
+ end
266
+
267
+ filename = "/etc/#{GLOBAL_NAMESPACE_DIRNAME_}/locations.ini"
268
+ return filename if File.exist?(filename)
269
+
270
+ return nil
271
+ end
272
+
273
+ def self.parse_ini_file(filename)
274
+ options = {}
275
+ in_locations_section = false
276
+ File.open(filename, 'r') do |f|
277
+ while !f.eof?
278
+ line = f.readline
279
+ line.strip!
280
+ next if line.empty?
281
+ if line =~ /\A\[(.+)\]\Z/
282
+ in_locations_section = $1 == 'locations'
283
+ elsif in_locations_section && line =~ /=/
284
+ key, value = line.split(/ *= */, 2)
285
+ options[key.freeze] = value.freeze
286
+ end
287
+ end
288
+ end
289
+ return options
290
+ end
291
+
292
+ def self.get_option(filename, options, key, required = true)
293
+ value = options[key]
294
+ if value
295
+ return value
296
+ elsif required
297
+ raise "Option '#{key}' missing in file '#{filename}'"
298
+ else
299
+ return nil
300
+ end
301
+ end
302
+
303
+ def self.get_bool_option(filename, options, key)
304
+ value = get_option(filename, options, key)
305
+ return value == 'yes' || value == 'true' || value == 'on' || value == '1'
306
+ end
307
+
308
+ # The HOME environment variable is often unreliable, because for
309
+ # example `sudo` preserves it. That's why we don't respect it by
310
+ # default.
311
+ def self.home_dir(respect_home_env = false)
312
+ if respect_home_env
313
+ home = ENV['HOME'].to_s
314
+ end
315
+ if home.nil? || home.empty?
316
+ require 'etc' if !defined?(Etc)
317
+ home = Etc.getpwuid(Process.uid).dir
318
+ end
319
+ return home
320
+ end
321
321
  end if !defined?(PhusionPassenger::VERSION_STRING)