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
@@ -34,208 +34,208 @@ PhusionPassenger.require_passenger_lib 'platform_info/depcheck'
34
34
  PhusionPassenger.require_passenger_lib 'utils/ansi_colors'
35
35
 
36
36
  module PhusionPassenger
37
- module Config
38
-
39
- module InstallationUtils
40
- extend self # Make methods available as class methods.
41
-
42
- def self.included(klass)
43
- # When included into another class, make sure that Utils
44
- # methods are made private.
45
- public_instance_methods(false).each do |method_name|
46
- klass.send(:private, method_name)
47
- end
48
- end
49
-
50
- def find_or_create_writable_support_binaries_dir!
51
- if File.exist?(PhusionPassenger.support_binaries_dir)
52
- result = directory_writable?(PhusionPassenger.support_binaries_dir)
53
- if result == true # return value can be a SystemCallError
54
- return PhusionPassenger.support_binaries_dir
55
- end
56
-
57
- if Process.euid == 0
58
- if result == false
59
- print_installation_error_header
60
- render_template 'installation_utils/support_binaries_dir_not_writable_despite_running_as_root',
61
- :dir => PhusionPassenger.support_binaries_dir,
62
- :myself => myself
63
- else
64
- render_template 'installation_utils/unexpected_filesystem_problem',
65
- :dir => PhusionPassenger.support_binaries_dir,
66
- :exception => result
67
- end
68
- abort
69
- else
70
- return find_or_create_writable_user_support_binaries_dir!
71
- end
72
- else
73
- if Process.euid == 0
74
- mkdir_p_preserve_parent_owner(PhusionPassenger.support_binaries_dir)
75
- return PhusionPassenger.support_binaries_dir
76
- else
77
- return find_or_create_writable_user_support_binaries_dir!
78
- end
79
- end
80
- end
81
-
82
- def check_for_download_tool!
83
- PlatformInfo::Depcheck.load('depcheck_specs/utilities')
84
- result = PlatformInfo::Depcheck.find('download-tool').check
85
- # Don't output anything if there is a download tool.
86
- # We want to be as quiet as possible.
87
- return if result && result[:found]
88
-
89
- colors = @colors || Utils::AnsiColors.new
90
- puts colors.ansi_colorize("<banner>Checking for basic prerequities...</banner>")
91
- puts
92
-
93
- runner = PlatformInfo::Depcheck::ConsoleRunner.new
94
- runner.add('download-tool')
95
-
96
- result = runner.check_all
97
- puts
98
- if !result
99
- puts "---------------------------------------"
100
- puts
101
- render_template 'installation_utils/download_tool_missing',
102
- :runner => runner
103
- abort
104
- end
105
- end
106
-
107
- # Override this method to print a different header
108
- def print_installation_error_header
109
- if @colors
110
- red = @colors.red
111
- reset = @colors.reset
112
- else
113
- red = nil
114
- reset = nil
115
- end
116
- @logger.warn "------------------------------------------" if @logger
117
- puts "#{red}Cannot proceed with installation#{reset}"
118
- puts
119
- end
120
-
121
- def rake
122
- return "env NOEXEC_DISABLE=1 #{PlatformInfo.rake_command}"
123
- end
124
-
125
- def run_rake_task!(target)
126
- total_lines = `#{rake} #{target} --dry-run STDERR_TO_STDOUT=1`.split("\n").size - 1
127
- backlog = ""
128
-
129
- command = "#{rake} #{target} --trace STDERR_TO_STDOUT=1"
130
- IO.popen(command, "rb") do |io|
131
- progress = 1
132
- while !io.eof?
133
- line = io.readline
134
- yield(progress, total_lines)
135
- if line =~ /^\*\* /
136
- backlog.replace("")
137
- progress += 1
138
- else
139
- backlog << line
140
- end
141
- end
142
- end
143
- if $?.exitstatus != 0
144
- stderr = @stderr || STDERR
145
- stderr.puts
146
- stderr.puts "*** ERROR: the following command failed:"
147
- stderr.puts(backlog)
148
- exit 1
149
- end
150
- end
151
-
152
- private
153
- # We can't use File.writable() and friends here because they
154
- # don't always work right with ACLs. Instead of we use 'real'
155
- # checks.
156
- def directory_writable?(path)
157
- filename = "#{path}/.__test_#{object_id}__.txt"
158
- @logger.debug "Checking whether we can write to #{path}..." if @logger
159
- begin
160
- File.new(filename, "w").close
161
- @logger.debug "Yes" if @logger
162
- return true
163
- rescue Errno::EACCES
164
- @logger.debug "No" if @logger
165
- return false
166
- rescue SystemCallError => e
167
- @logger.warn "Unable to check whether we can write to #{path}: #{e}" if @logger
168
- return e
169
- ensure
170
- File.unlink(filename) rescue nil
171
- end
172
- end
173
-
174
- def find_or_create_writable_user_support_binaries_dir!
175
- if !File.exist?(PhusionPassenger.user_support_binaries_dir)
176
- create_user_support_binaries_dir!
177
- end
178
- result = directory_writable?(PhusionPassenger.user_support_binaries_dir)
179
- case result
180
- when true
181
- return PhusionPassenger.user_support_binaries_dir
182
- when false
183
- print_installation_error_header
184
- render_template 'installation_utils/user_support_binaries_dir_not_writable'
185
- abort
186
- else
187
- print_installation_error_header
188
- render_template 'installation_utils/unexpected_filesystem_problem',
189
- :dir => PhusionPassenger.support_binaries_dir,
190
- :exception => result
191
- abort
192
- end
193
- end
194
-
195
- def create_user_support_binaries_dir!
196
- dir = PhusionPassenger.user_support_binaries_dir
197
- begin
198
- mkdir_p_preserve_parent_owner(dir)
199
- rescue Errno::EACCES
200
- print_installation_error_header
201
- render_template 'installation_utils/cannot_create_user_support_binaries_dir',
202
- :dir => dir,
203
- :myself => myself
204
- abort
205
- rescue SystemCallError
206
- print_installation_error_header
207
- render_template 'installation_utils/unexpected_filesystem_problem',
208
- :dir => dir,
209
- :exception => result
210
- abort
211
- end
212
- end
213
-
214
- # When creating PhusionPassenger.support_binaries_dir, preserve the
215
- # parent directory's UID and GID. This way, running `passenger-config compile-agent`
216
- # with sudo privileged, even though Phusion Passenger isn't installed as root,
217
- # won't mess up permissions.
218
- def mkdir_p_preserve_parent_owner(path)
219
- Pathname.new(path).descend do |subpath|
220
- if !subpath.exist?
221
- stat = subpath.parent.stat
222
- Dir.mkdir(subpath.to_s)
223
- if Process.euid == 0
224
- File.chown(stat.uid, stat.gid, subpath.to_s)
225
- end
226
- end
227
- end
228
- end
229
-
230
- def myself
231
- return `whoami`.strip
232
- end
233
-
234
- def render_template(name, options = {})
235
- options.merge!(:colors => @colors || PhusionPassenger::Utils::AnsiColors.new)
236
- puts ConsoleTextTemplate.new({ :file => "config/#{name}" }, options).result
237
- end
238
- end
239
-
240
- end # module Config
37
+ module Config
38
+
39
+ module InstallationUtils
40
+ extend self # Make methods available as class methods.
41
+
42
+ def self.included(klass)
43
+ # When included into another class, make sure that Utils
44
+ # methods are made private.
45
+ public_instance_methods(false).each do |method_name|
46
+ klass.send(:private, method_name)
47
+ end
48
+ end
49
+
50
+ def find_or_create_writable_support_binaries_dir!
51
+ if File.exist?(PhusionPassenger.support_binaries_dir)
52
+ result = directory_writable?(PhusionPassenger.support_binaries_dir)
53
+ if result == true # return value can be a SystemCallError
54
+ return PhusionPassenger.support_binaries_dir
55
+ end
56
+
57
+ if Process.euid == 0
58
+ if result == false
59
+ print_installation_error_header
60
+ render_template 'installation_utils/support_binaries_dir_not_writable_despite_running_as_root',
61
+ :dir => PhusionPassenger.support_binaries_dir,
62
+ :myself => myself
63
+ else
64
+ render_template 'installation_utils/unexpected_filesystem_problem',
65
+ :dir => PhusionPassenger.support_binaries_dir,
66
+ :exception => result
67
+ end
68
+ abort
69
+ else
70
+ return find_or_create_writable_user_support_binaries_dir!
71
+ end
72
+ else
73
+ if Process.euid == 0
74
+ mkdir_p_preserve_parent_owner(PhusionPassenger.support_binaries_dir)
75
+ return PhusionPassenger.support_binaries_dir
76
+ else
77
+ return find_or_create_writable_user_support_binaries_dir!
78
+ end
79
+ end
80
+ end
81
+
82
+ def check_for_download_tool!
83
+ PlatformInfo::Depcheck.load('depcheck_specs/utilities')
84
+ result = PlatformInfo::Depcheck.find('download-tool').check
85
+ # Don't output anything if there is a download tool.
86
+ # We want to be as quiet as possible.
87
+ return if result && result[:found]
88
+
89
+ colors = @colors || Utils::AnsiColors.new
90
+ puts colors.ansi_colorize("<banner>Checking for basic prerequities...</banner>")
91
+ puts
92
+
93
+ runner = PlatformInfo::Depcheck::ConsoleRunner.new
94
+ runner.add('download-tool')
95
+
96
+ result = runner.check_all
97
+ puts
98
+ if !result
99
+ puts "---------------------------------------"
100
+ puts
101
+ render_template 'installation_utils/download_tool_missing',
102
+ :runner => runner
103
+ abort
104
+ end
105
+ end
106
+
107
+ # Override this method to print a different header
108
+ def print_installation_error_header
109
+ if @colors
110
+ red = @colors.red
111
+ reset = @colors.reset
112
+ else
113
+ red = nil
114
+ reset = nil
115
+ end
116
+ @logger.warn "------------------------------------------" if @logger
117
+ puts "#{red}Cannot proceed with installation#{reset}"
118
+ puts
119
+ end
120
+
121
+ def rake
122
+ return "env NOEXEC_DISABLE=1 #{PlatformInfo.rake_command}"
123
+ end
124
+
125
+ def run_rake_task!(target)
126
+ total_lines = `#{rake} #{target} --dry-run STDERR_TO_STDOUT=1`.split("\n").size - 1
127
+ backlog = ""
128
+
129
+ command = "#{rake} #{target} --trace STDERR_TO_STDOUT=1"
130
+ IO.popen(command, "rb") do |io|
131
+ progress = 1
132
+ while !io.eof?
133
+ line = io.readline
134
+ yield(progress, total_lines)
135
+ if line =~ /^\*\* /
136
+ backlog.replace("")
137
+ progress += 1
138
+ else
139
+ backlog << line
140
+ end
141
+ end
142
+ end
143
+ if $?.exitstatus != 0
144
+ stderr = @stderr || STDERR
145
+ stderr.puts
146
+ stderr.puts "*** ERROR: the following command failed:"
147
+ stderr.puts(backlog)
148
+ exit 1
149
+ end
150
+ end
151
+
152
+ private
153
+ # We can't use File.writable() and friends here because they
154
+ # don't always work right with ACLs. Instead of we use 'real'
155
+ # checks.
156
+ def directory_writable?(path)
157
+ filename = "#{path}/.__test_#{object_id}__.txt"
158
+ @logger.debug "Checking whether we can write to #{path}..." if @logger
159
+ begin
160
+ File.new(filename, "w").close
161
+ @logger.debug "Yes" if @logger
162
+ return true
163
+ rescue Errno::EACCES
164
+ @logger.debug "No" if @logger
165
+ return false
166
+ rescue SystemCallError => e
167
+ @logger.warn "Unable to check whether we can write to #{path}: #{e}" if @logger
168
+ return e
169
+ ensure
170
+ File.unlink(filename) rescue nil
171
+ end
172
+ end
173
+
174
+ def find_or_create_writable_user_support_binaries_dir!
175
+ if !File.exist?(PhusionPassenger.user_support_binaries_dir)
176
+ create_user_support_binaries_dir!
177
+ end
178
+ result = directory_writable?(PhusionPassenger.user_support_binaries_dir)
179
+ case result
180
+ when true
181
+ return PhusionPassenger.user_support_binaries_dir
182
+ when false
183
+ print_installation_error_header
184
+ render_template 'installation_utils/user_support_binaries_dir_not_writable'
185
+ abort
186
+ else
187
+ print_installation_error_header
188
+ render_template 'installation_utils/unexpected_filesystem_problem',
189
+ :dir => PhusionPassenger.support_binaries_dir,
190
+ :exception => result
191
+ abort
192
+ end
193
+ end
194
+
195
+ def create_user_support_binaries_dir!
196
+ dir = PhusionPassenger.user_support_binaries_dir
197
+ begin
198
+ mkdir_p_preserve_parent_owner(dir)
199
+ rescue Errno::EACCES
200
+ print_installation_error_header
201
+ render_template 'installation_utils/cannot_create_user_support_binaries_dir',
202
+ :dir => dir,
203
+ :myself => myself
204
+ abort
205
+ rescue SystemCallError
206
+ print_installation_error_header
207
+ render_template 'installation_utils/unexpected_filesystem_problem',
208
+ :dir => dir,
209
+ :exception => result
210
+ abort
211
+ end
212
+ end
213
+
214
+ # When creating PhusionPassenger.support_binaries_dir, preserve the
215
+ # parent directory's UID and GID. This way, running `passenger-config compile-agent`
216
+ # with sudo privileged, even though Phusion Passenger isn't installed as root,
217
+ # won't mess up permissions.
218
+ def mkdir_p_preserve_parent_owner(path)
219
+ Pathname.new(path).descend do |subpath|
220
+ if !subpath.exist?
221
+ stat = subpath.parent.stat
222
+ Dir.mkdir(subpath.to_s)
223
+ if Process.euid == 0
224
+ File.chown(stat.uid, stat.gid, subpath.to_s)
225
+ end
226
+ end
227
+ end
228
+ end
229
+
230
+ def myself
231
+ return `whoami`.strip
232
+ end
233
+
234
+ def render_template(name, options = {})
235
+ options.merge!(:colors => @colors || PhusionPassenger::Utils::AnsiColors.new)
236
+ puts ConsoleTextTemplate.new({ :file => "config/#{name}" }, options).result
237
+ end
238
+ end
239
+
240
+ end # module Config
241
241
  end # module PhusionPassenger
@@ -29,78 +29,78 @@ PhusionPassenger.require_passenger_lib 'config/utils'
29
29
  PhusionPassenger.require_passenger_lib 'utils/json'
30
30
 
31
31
  module PhusionPassenger
32
- module Config
32
+ module Config
33
33
 
34
- class ListInstancesCommand < Command
35
- include PhusionPassenger::Config::Utils
34
+ class ListInstancesCommand < Command
35
+ include PhusionPassenger::Config::Utils
36
36
 
37
- def run
38
- parse_options
39
- instances = AdminTools::InstanceRegistry.new.list
40
- if @options[:json]
41
- print_json(instances)
42
- elsif instances.empty?
43
- print_no_instances_running
44
- else
45
- print_instances(instances)
46
- end
47
- end
37
+ def run
38
+ parse_options
39
+ instances = AdminTools::InstanceRegistry.new.list
40
+ if @options[:json]
41
+ print_json(instances)
42
+ elsif instances.empty?
43
+ print_no_instances_running
44
+ else
45
+ print_instances(instances)
46
+ end
47
+ end
48
48
 
49
- private
50
- def self.create_option_parser(options)
51
- OptionParser.new do |opts|
52
- nl = "\n" + ' ' * 37
53
- opts.banner = "Usage: passenger-config list-instances [OPTIONS] <PID>\n"
54
- opts.separator ""
55
- opts.separator " List all running #{PROGRAM_NAME} instances."
56
- opts.separator ""
49
+ private
50
+ def self.create_option_parser(options)
51
+ OptionParser.new do |opts|
52
+ nl = "\n" + ' ' * 37
53
+ opts.banner = "Usage: passenger-config list-instances [OPTIONS] <PID>\n"
54
+ opts.separator ""
55
+ opts.separator " List all running #{PROGRAM_NAME} instances."
56
+ opts.separator ""
57
57
 
58
- opts.on("--json", "Print output in JSON format") do
59
- options[:json] = true
60
- end
61
- opts.on("-q", "--quiet", "Don't print anything if there are no #{PROGRAM_NAME} instances running") do
62
- options[:quiet] = true
63
- end
64
- opts.on("-h", "--help", "Show this help") do
65
- options[:help] = true
66
- end
67
- end
68
- end
58
+ opts.on("--json", "Print output in JSON format") do
59
+ options[:json] = true
60
+ end
61
+ opts.on("-q", "--quiet", "Don't print anything if there are no #{PROGRAM_NAME} instances running") do
62
+ options[:quiet] = true
63
+ end
64
+ opts.on("-h", "--help", "Show this help") do
65
+ options[:help] = true
66
+ end
67
+ end
68
+ end
69
69
 
70
- def help
71
- puts @parser
72
- end
70
+ def help
71
+ puts @parser
72
+ end
73
73
 
74
- def parse_options
75
- super
76
- if !@argv.empty?
77
- help
78
- abort
79
- end
80
- end
74
+ def parse_options
75
+ super
76
+ if !@argv.empty?
77
+ help
78
+ abort
79
+ end
80
+ end
81
81
 
82
- def print_no_instances_running
83
- if !@options[:quiet]
84
- puts "There are no #{PROGRAM_NAME} instances running."
85
- end
86
- end
82
+ def print_no_instances_running
83
+ if !@options[:quiet]
84
+ puts "There are no #{PROGRAM_NAME} instances running."
85
+ end
86
+ end
87
87
 
88
- def print_json(instances)
89
- result = []
90
- instances.each do |instance|
91
- result << instance.properties
92
- end
93
- puts PhusionPassenger::Utils::JSON.generate(result)
94
- end
88
+ def print_json(instances)
89
+ result = []
90
+ instances.each do |instance|
91
+ result << instance.properties
92
+ end
93
+ puts PhusionPassenger::Utils::JSON.generate(result)
94
+ end
95
95
 
96
- def print_instances(instances)
97
- printf "%-25s %s\n", "Name", "Description"
98
- puts "------------------------------------------------------------------"
99
- instances.each do |instance|
100
- printf "%-25s %s\n", instance.name, instance.server_software
101
- end
102
- end
103
- end
96
+ def print_instances(instances)
97
+ printf "%-25s %s\n", "Name", "Description"
98
+ puts "------------------------------------------------------------------"
99
+ instances.each do |instance|
100
+ printf "%-25s %s\n", instance.name, instance.server_software
101
+ end
102
+ end
103
+ end
104
104
 
105
- end # module Config
105
+ end # module Config
106
106
  end # module PhusionPassenger