passenger 5.0.0.beta3 → 5.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of passenger might be problematic. Click here for more details.

Files changed (218) hide show
  1. checksums.yaml +8 -8
  2. checksums.yaml.gz.asc +7 -7
  3. data.tar.gz.asc +7 -7
  4. data/.editorconfig +11 -5
  5. data/CHANGELOG +38 -0
  6. data/CONTRIBUTING.md +1 -4
  7. data/Gemfile +0 -1
  8. data/Gemfile.lock +0 -2
  9. data/Rakefile +33 -33
  10. data/bin/passenger +1 -1
  11. data/bin/passenger-config +1 -1
  12. data/bin/passenger-install-apache2-module +800 -800
  13. data/bin/passenger-install-nginx-module +592 -592
  14. data/bin/passenger-memory-stats +127 -127
  15. data/bin/passenger-status +216 -216
  16. data/build/agents.rb +127 -127
  17. data/build/apache2.rb +87 -87
  18. data/build/basics.rb +60 -60
  19. data/build/common_library.rb +165 -165
  20. data/build/cplusplus_support.rb +51 -51
  21. data/build/cxx_tests.rb +268 -268
  22. data/build/debian.rb +143 -143
  23. data/build/documentation.rb +58 -58
  24. data/build/integration_tests.rb +81 -81
  25. data/build/misc.rb +132 -132
  26. data/build/nginx.rb +20 -20
  27. data/build/node_tests.rb +7 -7
  28. data/build/oxt_tests.rb +14 -14
  29. data/build/packaging.rb +570 -570
  30. data/build/preprocessor.rb +260 -260
  31. data/build/rake_extensions.rb +71 -71
  32. data/build/ruby_extension.rb +29 -29
  33. data/build/ruby_tests.rb +6 -6
  34. data/build/test_basics.rb +37 -37
  35. data/debian.template/control.template +3 -5
  36. data/dev/copy_boost_headers +134 -134
  37. data/dev/install_scripts_bootstrap_code.rb +25 -25
  38. data/dev/list_tests +20 -20
  39. data/dev/ruby_server.rb +223 -223
  40. data/dev/runner +18 -18
  41. data/doc/ServerOptimizationGuide.txt.md +55 -2
  42. data/doc/Users guide Nginx.txt +0 -26
  43. data/doc/Users guide Standalone.txt +5 -1
  44. data/doc/users_guide_snippets/tips.txt +9 -0
  45. data/ext/common/ApplicationPool2/Group.h +23 -11
  46. data/ext/common/ApplicationPool2/Implementation.cpp +32 -7
  47. data/ext/common/ApplicationPool2/Pool.h +22 -17
  48. data/ext/common/ApplicationPool2/SmartSpawner.h +4 -1
  49. data/ext/common/ApplicationPool2/Spawner.h +1 -1
  50. data/ext/common/Constants.h +1 -1
  51. data/ext/common/agents/Base.cpp +35 -20
  52. data/ext/common/agents/HelperAgent/Main.cpp +8 -1
  53. data/ext/common/agents/HelperAgent/OptionParser.h +18 -4
  54. data/ext/common/agents/HelperAgent/RequestHandler.h +2 -83
  55. data/ext/common/agents/HelperAgent/RequestHandler/ForwardResponse.cpp +54 -1
  56. data/ext/common/agents/HelperAgent/RequestHandler/InitRequest.cpp +7 -4
  57. data/ext/common/agents/Main.cpp +1 -1
  58. data/ext/common/agents/Watchdog/Main.cpp +54 -19
  59. data/ext/nginx/Configuration.c +7 -0
  60. data/ext/nginx/ContentHandler.c +9 -1
  61. data/helper-scripts/backtrace-sanitizer.rb +106 -87
  62. data/helper-scripts/crash-watch.rb +32 -0
  63. data/helper-scripts/download_binaries/extconf.rb +38 -38
  64. data/helper-scripts/meteor-loader.rb +107 -107
  65. data/helper-scripts/prespawn +101 -101
  66. data/helper-scripts/rack-loader.rb +96 -96
  67. data/helper-scripts/rack-preloader.rb +137 -137
  68. data/lib/phusion_passenger.rb +292 -292
  69. data/lib/phusion_passenger/abstract_installer.rb +438 -438
  70. data/lib/phusion_passenger/active_support3_extensions/init.rb +168 -170
  71. data/lib/phusion_passenger/admin_tools.rb +20 -20
  72. data/lib/phusion_passenger/admin_tools/instance.rb +178 -178
  73. data/lib/phusion_passenger/admin_tools/instance_registry.rb +61 -61
  74. data/lib/phusion_passenger/admin_tools/memory_stats.rb +267 -267
  75. data/lib/phusion_passenger/apache2/config_options.rb +182 -182
  76. data/lib/phusion_passenger/common_library.rb +479 -485
  77. data/lib/phusion_passenger/config/about_command.rb +161 -161
  78. data/lib/phusion_passenger/config/admin_command_command.rb +129 -129
  79. data/lib/phusion_passenger/config/agent_compiler.rb +121 -121
  80. data/lib/phusion_passenger/config/build_native_support_command.rb +43 -43
  81. data/lib/phusion_passenger/config/command.rb +25 -25
  82. data/lib/phusion_passenger/config/compile_agent_command.rb +62 -62
  83. data/lib/phusion_passenger/config/compile_nginx_engine_command.rb +88 -73
  84. data/lib/phusion_passenger/config/detach_process_command.rb +72 -72
  85. data/lib/phusion_passenger/config/download_agent_command.rb +246 -227
  86. data/lib/phusion_passenger/config/download_nginx_engine_command.rb +245 -224
  87. data/lib/phusion_passenger/config/install_agent_command.rb +144 -132
  88. data/lib/phusion_passenger/config/install_standalone_runtime_command.rb +205 -185
  89. data/lib/phusion_passenger/config/installation_utils.rb +204 -204
  90. data/lib/phusion_passenger/config/list_instances_command.rb +64 -64
  91. data/lib/phusion_passenger/config/main.rb +152 -152
  92. data/lib/phusion_passenger/config/nginx_engine_compiler.rb +319 -300
  93. data/lib/phusion_passenger/config/reopen_logs_command.rb +67 -67
  94. data/lib/phusion_passenger/config/restart_app_command.rb +155 -155
  95. data/lib/phusion_passenger/config/system_metrics_command.rb +13 -13
  96. data/lib/phusion_passenger/config/utils.rb +95 -95
  97. data/lib/phusion_passenger/config/validate_install_command.rb +198 -198
  98. data/lib/phusion_passenger/console_text_template.rb +25 -25
  99. data/lib/phusion_passenger/constants.rb +90 -90
  100. data/lib/phusion_passenger/debug_logging.rb +106 -106
  101. data/lib/phusion_passenger/loader_shared_helpers.rb +447 -432
  102. data/lib/phusion_passenger/message_channel.rb +312 -312
  103. data/lib/phusion_passenger/message_client.rb +176 -176
  104. data/lib/phusion_passenger/native_support.rb +369 -369
  105. data/lib/phusion_passenger/nginx/config_options.rb +297 -297
  106. data/lib/phusion_passenger/packaging.rb +131 -131
  107. data/lib/phusion_passenger/platform_info.rb +360 -360
  108. data/lib/phusion_passenger/platform_info/apache.rb +767 -767
  109. data/lib/phusion_passenger/platform_info/apache_detector.rb +199 -199
  110. data/lib/phusion_passenger/platform_info/binary_compatibility.rb +107 -107
  111. data/lib/phusion_passenger/platform_info/compiler.rb +570 -570
  112. data/lib/phusion_passenger/platform_info/curl.rb +32 -32
  113. data/lib/phusion_passenger/platform_info/cxx_portability.rb +188 -188
  114. data/lib/phusion_passenger/platform_info/depcheck.rb +372 -372
  115. data/lib/phusion_passenger/platform_info/depcheck_specs/apache2.rb +109 -109
  116. data/lib/phusion_passenger/platform_info/depcheck_specs/compiler_toolchain.rb +4 -4
  117. data/lib/phusion_passenger/platform_info/depcheck_specs/gems.rb +10 -34
  118. data/lib/phusion_passenger/platform_info/depcheck_specs/libs.rb +101 -101
  119. data/lib/phusion_passenger/platform_info/depcheck_specs/ruby.rb +5 -5
  120. data/lib/phusion_passenger/platform_info/depcheck_specs/utilities.rb +13 -13
  121. data/lib/phusion_passenger/platform_info/linux.rb +55 -55
  122. data/lib/phusion_passenger/platform_info/operating_system.rb +149 -149
  123. data/lib/phusion_passenger/platform_info/ruby.rb +468 -448
  124. data/lib/phusion_passenger/platform_info/zlib.rb +9 -9
  125. data/lib/phusion_passenger/plugin.rb +66 -66
  126. data/lib/phusion_passenger/preloader_shared_helpers.rb +126 -126
  127. data/lib/phusion_passenger/public_api.rb +191 -191
  128. data/lib/phusion_passenger/rack/out_of_band_gc.rb +93 -94
  129. data/lib/phusion_passenger/rack/thread_handler_extension.rb +231 -227
  130. data/lib/phusion_passenger/request_handler.rb +567 -577
  131. data/lib/phusion_passenger/request_handler/thread_handler.rb +379 -381
  132. data/lib/phusion_passenger/ruby_core_enhancements.rb +86 -86
  133. data/lib/phusion_passenger/ruby_core_io_enhancements.rb +74 -74
  134. data/lib/phusion_passenger/simple_benchmarking.rb +25 -25
  135. data/lib/phusion_passenger/standalone/app_finder.rb +153 -150
  136. data/lib/phusion_passenger/standalone/command.rb +44 -40
  137. data/lib/phusion_passenger/standalone/config_utils.rb +53 -53
  138. data/lib/phusion_passenger/standalone/control_utils.rb +38 -59
  139. data/lib/phusion_passenger/standalone/main.rb +73 -73
  140. data/lib/phusion_passenger/standalone/start_command.rb +697 -685
  141. data/lib/phusion_passenger/standalone/start_command/builtin_engine.rb +193 -155
  142. data/lib/phusion_passenger/standalone/start_command/nginx_engine.rb +162 -133
  143. data/lib/phusion_passenger/standalone/status_command.rb +64 -64
  144. data/lib/phusion_passenger/standalone/stop_command.rb +72 -72
  145. data/lib/phusion_passenger/standalone/version_command.rb +9 -9
  146. data/lib/phusion_passenger/union_station/connection.rb +32 -32
  147. data/lib/phusion_passenger/union_station/core.rb +251 -251
  148. data/lib/phusion_passenger/union_station/transaction.rb +126 -126
  149. data/lib/phusion_passenger/utils.rb +199 -167
  150. data/lib/phusion_passenger/utils/ansi_colors.rb +128 -128
  151. data/lib/phusion_passenger/utils/download.rb +196 -196
  152. data/lib/phusion_passenger/utils/file_system_watcher.rb +158 -158
  153. data/lib/phusion_passenger/utils/hosts_file_parser.rb +101 -101
  154. data/lib/phusion_passenger/utils/lock.rb +31 -31
  155. data/lib/phusion_passenger/utils/native_support_utils.rb +31 -31
  156. data/lib/phusion_passenger/utils/progress_bar.rb +26 -26
  157. data/lib/phusion_passenger/utils/shellwords.rb +20 -20
  158. data/lib/phusion_passenger/utils/terminal_choice_menu.rb +206 -206
  159. data/lib/phusion_passenger/utils/unseekable_socket.rb +272 -272
  160. data/lib/phusion_passenger/vendor/crash_watch/app.rb +129 -0
  161. data/lib/phusion_passenger/vendor/crash_watch/gdb_controller.rb +341 -0
  162. data/lib/phusion_passenger/vendor/crash_watch/version.rb +24 -0
  163. data/lib/phusion_passenger/vendor/daemon_controller.rb +877 -0
  164. data/lib/phusion_passenger/vendor/daemon_controller/lock_file.rb +127 -0
  165. data/lib/phusion_passenger/vendor/daemon_controller/spawn.rb +26 -0
  166. data/lib/phusion_passenger/vendor/daemon_controller/version.rb +29 -0
  167. data/packaging/rpm/passenger_spec/passenger.spec.template +0 -1
  168. data/passenger.gemspec +0 -1
  169. data/resources/templates/config/nginx_engine_compiler/possible_solutions_for_download_and_extraction_problems.txt.erb +27 -0
  170. data/resources/templates/standalone/config.erb +19 -15
  171. data/test/integration_tests/apache2_tests.rb +566 -566
  172. data/test/integration_tests/downloaded_binaries_tests.rb +126 -125
  173. data/test/integration_tests/native_packaging_spec.rb +296 -296
  174. data/test/integration_tests/nginx_tests.rb +393 -393
  175. data/test/integration_tests/shared/example_webapp_tests.rb +282 -280
  176. data/test/integration_tests/source_packaging_test.rb +138 -138
  177. data/test/integration_tests/spec_helper.rb +5 -5
  178. data/test/integration_tests/standalone_tests.rb +367 -367
  179. data/test/ruby/debug_logging_spec.rb +133 -133
  180. data/test/ruby/message_channel_spec.rb +186 -186
  181. data/test/ruby/rack/loader_spec.rb +28 -28
  182. data/test/ruby/rack/preloader_spec.rb +34 -34
  183. data/test/ruby/rails3.0/loader_spec.rb +12 -12
  184. data/test/ruby/rails3.0/preloader_spec.rb +18 -18
  185. data/test/ruby/rails3.1/loader_spec.rb +12 -12
  186. data/test/ruby/rails3.1/preloader_spec.rb +18 -18
  187. data/test/ruby/rails3.2/loader_spec.rb +12 -12
  188. data/test/ruby/rails3.2/preloader_spec.rb +18 -18
  189. data/test/ruby/rails4.0/loader_spec.rb +12 -12
  190. data/test/ruby/rails4.0/preloader_spec.rb +18 -18
  191. data/test/ruby/rails4.1/loader_spec.rb +12 -12
  192. data/test/ruby/rails4.1/preloader_spec.rb +18 -18
  193. data/test/ruby/request_handler_spec.rb +730 -730
  194. data/test/ruby/shared/loader_sharedspec.rb +224 -224
  195. data/test/ruby/shared/rails/union_station_extensions_sharedspec.rb +327 -327
  196. data/test/ruby/shared/ruby_loader_sharedspec.rb +47 -47
  197. data/test/ruby/spec_helper.rb +65 -65
  198. data/test/ruby/standalone/runtime_installer_spec.rb +384 -384
  199. data/test/ruby/union_station_spec.rb +276 -276
  200. data/test/ruby/utils/file_system_watcher_spec.rb +220 -220
  201. data/test/ruby/utils/hosts_file_parser.rb +248 -248
  202. data/test/ruby/utils/tee_input_spec.rb +215 -215
  203. data/test/ruby/utils/unseekable_socket_spec.rb +57 -57
  204. data/test/ruby/utils_spec.rb +21 -21
  205. data/test/stub/rack/config.ru +87 -87
  206. data/test/stub/rack/library.rb +8 -8
  207. data/test/stub/rack/start.rb +30 -30
  208. data/test/support/apache2_controller.rb +191 -191
  209. data/test/support/nginx_controller.rb +90 -99
  210. data/test/support/placebo-preloader.rb +57 -57
  211. data/test/support/test_helper.rb +435 -435
  212. metadata +11 -21
  213. metadata.gz.asc +7 -7
  214. data/lib/phusion_passenger/standalone/command2.rb +0 -292
  215. data/lib/phusion_passenger/standalone/start2_command.rb +0 -799
  216. data/resources/templates/standalone/download_tool_missing.txt.erb +0 -18
  217. data/resources/templates/standalone/possible_solutions_for_download_and_extraction_problems.txt.erb +0 -17
  218. data/resources/templates/standalone/run_installer_as_root.txt.erb +0 -8
@@ -25,157 +25,157 @@ PhusionPassenger.require_passenger_lib 'constants'
25
25
 
26
26
  module PhusionPassenger
27
27
 
28
- # Core of the `passenger-config` command. Dispatches a subcommand to a specific class.
29
- module Config
30
- KNOWN_COMMANDS = [
31
- ["detach-process", "DetachProcessCommand"],
32
- ["restart-app", "RestartAppCommand"],
33
- ["list-instances", "ListInstancesCommand"],
34
- ["reopen-logs", "ReopenLogsCommand"],
35
- ["admin-command", "AdminCommandCommand"],
36
- ["validate-install", "ValidateInstallCommand"],
37
- ["build-native-support", "BuildNativeSupportCommand"],
38
-
39
- ["install-agent", "InstallAgentCommand"],
40
- ["install-standalone-runtime", "InstallStandaloneRuntimeCommand"],
41
- ["download-agent", "DownloadAgentCommand"],
42
- ["download-nginx-engine", "DownloadNginxEngineCommand"],
43
- ["compile-agent", "CompileAgentCommand"],
44
- ["compile-nginx-engine", "CompileNginxEngineCommand"],
45
-
46
- ["system-metrics", "SystemMetricsCommand"],
47
- ["about", "AboutCommand"]
48
- ]
49
-
50
- ABOUT_OPTIONS = [
51
- "root",
52
- "includedir",
53
- "nginx-addon-dir",
54
- "nginx-libs",
55
- "compiled",
56
- "custom-packaged",
57
- "installed-from-release-package",
58
- "make-locations-ini",
59
- "detect-apache2",
60
- "ruby-command",
61
- "ruby-libdir",
62
- "rubyext-compat-id",
63
- "cxx-compat-id",
64
- "version"
65
- ]
66
-
67
- def self.run!(argv)
68
- command_class, new_argv = lookup_command_class_by_argv(argv)
69
- if help_requested?(argv)
70
- help
71
- elsif help_all_requested?(argv)
72
- help(true)
73
- elsif command_class
74
- command = command_class.new(new_argv)
75
- command.run
76
- else
77
- help
78
- abort
79
- end
80
- end
81
-
82
- def self.help(all = false)
83
- puts "Usage: passenger-config <COMMAND> [OPTIONS...]"
84
- puts
85
- puts " Tool for managing, controlling and configuring a #{PROGRAM_NAME} instance"
86
- puts " or installation."
87
- puts
88
- puts "Management commands:"
89
- puts " detach-process Detach an application process from the process pool"
90
- puts " restart-app Restart an application"
91
- puts " reopen-logs Instruct #{PROGRAM_NAME} agents to reopen their log"
92
- puts " files"
93
- if all
94
- puts " admin-command Invoke an internal #{PROGRAM_NAME} admin command."
95
- end
96
- puts
97
- puts "Informational commands:"
98
- puts " list-instances List running #{PROGRAM_NAME} instances"
99
- puts " about Show information about #{PROGRAM_NAME}"
100
- puts
101
- puts "#{PROGRAM_NAME} installation management:"
102
- puts " validate-install Validate this #{PROGRAM_NAME} installation"
103
- puts " build-native-support Ensure that the native_support library for the current"
104
- puts " Ruby interpreter is built"
105
- puts " install-agent Install the #{PROGRAM_NAME} agent binary"
106
- puts " install-standalone-runtime"
107
- puts " Install the #{PROGRAM_NAME} Standalone"
108
- puts " runtime"
109
- if all
110
- puts " download-agent Download the #{PROGRAM_NAME} agent binary"
111
- puts " download-nginx-engine Download the Nginx engine for use with"
112
- puts " #{PROGRAM_NAME} Standalone"
113
- puts " compile-agent Compile the #{PROGRAM_NAME} agent binary"
114
- puts " compile-nginx-engine Compile an Nginx engine for use with #{PROGRAM_NAME}"
115
- puts " Standalone"
116
- end
117
- puts
118
- puts "Miscellaneous commands:"
119
- puts " system-metrics Display system metrics"
120
- puts
121
- puts "Run 'passenger-config <COMMAND> --help' for more information about each"
122
- puts "command."
123
- if !all
124
- puts
125
- puts "There are also some advanced commands not shown in this help message. Run"
126
- puts "'passenger-config --help-all' to learn more about them."
127
- end
128
- end
129
-
130
- private
131
- def self.help_requested?(argv)
132
- return argv.size == 1 && (argv[0] == "--help" || argv[0] == "-h" || argv[0] == "help")
133
- end
134
-
135
- def self.help_all_requested?(argv)
136
- return argv.size == 1 && (argv[0] == "--help-all" || argv[0] == "help-all")
137
- end
138
-
139
- def self.lookup_command_class_by_argv(argv)
140
- return nil if argv.empty?
141
-
142
- # Compatibility with version <= 4.0.29: try to pass all
143
- # --switch invocations to AboutCommand.
144
- if argv[0] =~ /^--/
145
- name = argv[0].sub(/^--/, '')
146
- if ABOUT_OPTIONS.include?(name)
147
- command_class = lookup_command_class_by_class_name("AboutCommand")
148
- return [command_class, argv]
149
- else
150
- return nil
151
- end
152
- end
153
-
154
- # Convert "passenger-config help <COMMAND>" to "passenger-config <COMMAND> --help".
155
- if argv.size == 2 && argv[0] == "help"
156
- argv = [argv[1], "--help"]
157
- end
158
-
159
- KNOWN_COMMANDS.each do |props|
160
- if argv[0] == props[0]
161
- command_class = lookup_command_class_by_class_name(props[1])
162
- new_argv = argv[1 .. -1]
163
- return [command_class, new_argv]
164
- end
165
- end
166
-
167
- return nil
168
- end
169
-
170
- def self.lookup_command_class_by_class_name(class_name)
171
- base_name = class_name.gsub(/[A-Z]/) do |match|
172
- "_" + match[0..0].downcase
173
- end
174
- base_name.sub!(/^_/, '')
175
- base_name << ".rb"
176
- PhusionPassenger.require_passenger_lib("config/#{base_name}")
177
- return PhusionPassenger::Config.const_get(class_name)
178
- end
179
- end
28
+ # Core of the `passenger-config` command. Dispatches a subcommand to a specific class.
29
+ module Config
30
+ KNOWN_COMMANDS = [
31
+ ["detach-process", "DetachProcessCommand"],
32
+ ["restart-app", "RestartAppCommand"],
33
+ ["list-instances", "ListInstancesCommand"],
34
+ ["reopen-logs", "ReopenLogsCommand"],
35
+ ["admin-command", "AdminCommandCommand"],
36
+ ["validate-install", "ValidateInstallCommand"],
37
+ ["build-native-support", "BuildNativeSupportCommand"],
38
+
39
+ ["install-agent", "InstallAgentCommand"],
40
+ ["install-standalone-runtime", "InstallStandaloneRuntimeCommand"],
41
+ ["download-agent", "DownloadAgentCommand"],
42
+ ["download-nginx-engine", "DownloadNginxEngineCommand"],
43
+ ["compile-agent", "CompileAgentCommand"],
44
+ ["compile-nginx-engine", "CompileNginxEngineCommand"],
45
+
46
+ ["system-metrics", "SystemMetricsCommand"],
47
+ ["about", "AboutCommand"]
48
+ ]
49
+
50
+ ABOUT_OPTIONS = [
51
+ "root",
52
+ "includedir",
53
+ "nginx-addon-dir",
54
+ "nginx-libs",
55
+ "compiled",
56
+ "custom-packaged",
57
+ "installed-from-release-package",
58
+ "make-locations-ini",
59
+ "detect-apache2",
60
+ "ruby-command",
61
+ "ruby-libdir",
62
+ "rubyext-compat-id",
63
+ "cxx-compat-id",
64
+ "version"
65
+ ]
66
+
67
+ def self.run!(argv)
68
+ command_class, new_argv = lookup_command_class_by_argv(argv)
69
+ if help_requested?(argv)
70
+ help
71
+ elsif help_all_requested?(argv)
72
+ help(true)
73
+ elsif command_class
74
+ command = command_class.new(new_argv)
75
+ command.run
76
+ else
77
+ help
78
+ abort
79
+ end
80
+ end
81
+
82
+ def self.help(all = false)
83
+ puts "Usage: passenger-config <COMMAND> [OPTIONS...]"
84
+ puts
85
+ puts " Tool for managing, controlling and configuring a #{PROGRAM_NAME} instance"
86
+ puts " or installation."
87
+ puts
88
+ puts "Management commands:"
89
+ puts " detach-process Detach an application process from the process pool"
90
+ puts " restart-app Restart an application"
91
+ puts " reopen-logs Instruct #{PROGRAM_NAME} agents to reopen their log"
92
+ puts " files"
93
+ if all
94
+ puts " admin-command Invoke an internal #{PROGRAM_NAME} admin command."
95
+ end
96
+ puts
97
+ puts "Informational commands:"
98
+ puts " list-instances List running #{PROGRAM_NAME} instances"
99
+ puts " about Show information about #{PROGRAM_NAME}"
100
+ puts
101
+ puts "#{PROGRAM_NAME} installation management:"
102
+ puts " validate-install Validate this #{PROGRAM_NAME} installation"
103
+ puts " build-native-support Ensure that the native_support library for the current"
104
+ puts " Ruby interpreter is built"
105
+ puts " install-agent Install the #{PROGRAM_NAME} agent binary"
106
+ puts " install-standalone-runtime"
107
+ puts " Install the #{PROGRAM_NAME} Standalone"
108
+ puts " runtime"
109
+ if all
110
+ puts " download-agent Download the #{PROGRAM_NAME} agent binary"
111
+ puts " download-nginx-engine Download the Nginx engine for use with"
112
+ puts " #{PROGRAM_NAME} Standalone"
113
+ puts " compile-agent Compile the #{PROGRAM_NAME} agent binary"
114
+ puts " compile-nginx-engine Compile an Nginx engine for use with #{PROGRAM_NAME}"
115
+ puts " Standalone"
116
+ end
117
+ puts
118
+ puts "Miscellaneous commands:"
119
+ puts " system-metrics Display system metrics"
120
+ puts
121
+ puts "Run 'passenger-config <COMMAND> --help' for more information about each"
122
+ puts "command."
123
+ if !all
124
+ puts
125
+ puts "There are also some advanced commands not shown in this help message. Run"
126
+ puts "'passenger-config --help-all' to learn more about them."
127
+ end
128
+ end
129
+
130
+ private
131
+ def self.help_requested?(argv)
132
+ return argv.size == 1 && (argv[0] == "--help" || argv[0] == "-h" || argv[0] == "help")
133
+ end
134
+
135
+ def self.help_all_requested?(argv)
136
+ return argv.size == 1 && (argv[0] == "--help-all" || argv[0] == "help-all")
137
+ end
138
+
139
+ def self.lookup_command_class_by_argv(argv)
140
+ return nil if argv.empty?
141
+
142
+ # Compatibility with version <= 4.0.29: try to pass all
143
+ # --switch invocations to AboutCommand.
144
+ if argv[0] =~ /^--/
145
+ name = argv[0].sub(/^--/, '')
146
+ if ABOUT_OPTIONS.include?(name)
147
+ command_class = lookup_command_class_by_class_name("AboutCommand")
148
+ return [command_class, argv]
149
+ else
150
+ return nil
151
+ end
152
+ end
153
+
154
+ # Convert "passenger-config help <COMMAND>" to "passenger-config <COMMAND> --help".
155
+ if argv.size == 2 && argv[0] == "help"
156
+ argv = [argv[1], "--help"]
157
+ end
158
+
159
+ KNOWN_COMMANDS.each do |props|
160
+ if argv[0] == props[0]
161
+ command_class = lookup_command_class_by_class_name(props[1])
162
+ new_argv = argv[1 .. -1]
163
+ return [command_class, new_argv]
164
+ end
165
+ end
166
+
167
+ return nil
168
+ end
169
+
170
+ def self.lookup_command_class_by_class_name(class_name)
171
+ base_name = class_name.gsub(/[A-Z]/) do |match|
172
+ "_" + match[0..0].downcase
173
+ end
174
+ base_name.sub!(/^_/, '')
175
+ base_name << ".rb"
176
+ PhusionPassenger.require_passenger_lib("config/#{base_name}")
177
+ return PhusionPassenger::Config.const_get(class_name)
178
+ end
179
+ end
180
180
 
181
181
  end # module PhusionPassenger
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
  #
3
3
  # Phusion Passenger - https://www.phusionpassenger.com/
4
- # Copyright (c) 2010-2014 Phusion
4
+ # Copyright (c) 2010-2015 Phusion
5
5
  #
6
6
  # "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.
7
7
  #
@@ -29,309 +29,328 @@ PhusionPassenger.require_passenger_lib 'abstract_installer'
29
29
  PhusionPassenger.require_passenger_lib 'common_library'
30
30
  PhusionPassenger.require_passenger_lib 'config/installation_utils'
31
31
  PhusionPassenger.require_passenger_lib 'platform_info'
32
+ PhusionPassenger.require_passenger_lib 'platform_info/ruby'
32
33
  PhusionPassenger.require_passenger_lib 'platform_info/compiler'
33
34
  PhusionPassenger.require_passenger_lib 'utils/shellwords'
34
35
  PhusionPassenger.require_passenger_lib 'utils/progress_bar'
35
36
  PhusionPassenger.require_passenger_lib 'utils/tmpio'
36
37
 
37
38
  module PhusionPassenger
38
- module Config
39
-
40
- class NginxEngineCompiler < AbstractInstaller
41
- include InstallationUtils
42
-
43
- protected
44
- def dependencies
45
- specs = [
46
- 'depcheck_specs/compiler_toolchain',
47
- 'depcheck_specs/ruby',
48
- 'depcheck_specs/libs',
49
- 'depcheck_specs/utilities'
50
- ]
51
- ids = [
52
- 'cc',
53
- 'c++',
54
- 'gmake',
55
- 'rake',
56
- 'openssl-dev',
57
- 'zlib-dev',
58
- 'pcre-dev'
59
- ].compact
60
- return [specs, ids]
61
- end
62
-
63
- def users_guide_path
64
- return PhusionPassenger.standalone_doc_path
65
- end
66
-
67
- def users_guide_url
68
- return STANDALONE_DOC_URL
69
- end
70
-
71
- def run_steps
72
- check_source_code_available!
73
- check_precompiled_support_libs_available!
74
- if !@force
75
- check_whether_os_is_broken
76
- check_whether_system_has_enough_ram
77
- check_for_download_tool!
78
- end
79
- check_dependencies(false) || abort
80
- puts
81
-
82
- @destdir = find_or_create_writable_support_binaries_dir!
83
- puts "<banner>Installing...</banner>"
84
- download_and_extract_nginx_sources
85
- determine_support_libraries
86
- compile_support_libraries
87
- configure_and_compile_nginx
88
- end
89
-
90
- def before_install
91
- super
92
- if !@working_dir
93
- @working_dir = PhusionPassenger::Utils.mktmpdir("passenger-install.", PlatformInfo.tmpexedir)
94
- @owns_working_dir = true
95
- end
96
- @nginx_version ||= PREFERRED_NGINX_VERSION
97
- end
98
-
99
- def after_install
100
- super
101
- FileUtils.remove_entry_secure(@working_dir) if @owns_working_dir
102
- end
103
-
104
- private
105
- def check_source_code_available!
106
- return if File.exist?(PhusionPassenger.nginx_module_source_dir)
107
-
108
- if PhusionPassenger.originally_packaged?
109
- puts "<red>Broken #{PROGRAM_NAME} installation detected</red>"
110
- puts
111
- puts "This program requires the #{PROGRAM_NAME} Nginx module sources " +
112
- "before it can compile an Nginx engine. However, the #{PROGRAM_NAME} " +
113
- "Nginx module sources are not installed, even though they should have been. " +
114
- "This probably means that your #{PROGRAM_NAME} installation has somehow " +
115
- "become corrupted. Please re-install #{PROGRAM_NAME}."
116
- abort
117
- else
118
- case PhusionPassenger.packaging_method
119
- when "deb"
120
- command = "sudo sh -c 'apt-get update && apt-get install #{DEB_DEV_PACKAGE}'"
121
- when "rpm"
122
- command = "sudo yum install #{RPM_DEV_PACKAGE}-#{VERSION_STRING}"
123
- end
124
-
125
- if command
126
- if STDIN.tty?
127
- puts " --> Installing #{PROGRAM_NAME} Nginx module sources"
128
- puts " Running: #{command}"
129
- if !system(command)
130
- puts " <red>*** Command failed: #{command}</red>"
131
- abort
132
- end
133
- else
134
- puts " --> #{PROGRAM_NAME} Nginx module sources not installed"
135
- puts " Please install them first: #{command}"
136
- abort
137
- end
138
- else
139
- puts " --> #{PROGRAM_NAME} Nginx module sources not installed"
140
- puts " <red>Please ask your #{PROGRAM_NAME} packager or operating " +
141
- "system vendor how to install these.</red>"
142
- abort
143
- end
144
- end
145
- end
146
-
147
- def check_precompiled_support_libs_available!
148
- return if PhusionPassenger.build_system_dir ||
149
- File.exist?("#{PhusionPassenger.lib_dir}/common/libboost_oxt.a")
150
-
151
- if PhusionPassenger.originally_packaged?
152
- puts "<red>Broken #{PROGRAM_NAME} installation detected</red>"
153
- puts
154
- puts "This program requires the #{PROGRAM_NAME} support libraries " +
155
- "before it can compile an Nginx engine. However, the #{PROGRAM_NAME} " +
156
- "support libraries are not installed, even though they should have been. " +
157
- "This probably means that your #{PROGRAM_NAME} installation has somehow " +
158
- "become corrupted. Please re-install #{PROGRAM_NAME}."
159
- abort
160
- else
161
- case PhusionPassenger.packaging_method
162
- when "deb"
163
- command = "sudo sh -c 'apt-get update && apt-get install #{DEB_DEV_PACKAGE}'"
164
- when "rpm"
165
- command = "sudo yum install #{RPM_DEV_PACKAGE}-#{VERSION_STRING}"
166
- end
167
-
168
- if command
169
- if STDIN.tty?
170
- puts " --> Installing #{PROGRAM_NAME} support libraries"
171
- puts " Running: #{command}"
172
- if !system(command)
173
- puts " <red>*** Command failed: #{command}</red>"
174
- abort
175
- end
176
- else
177
- puts " --> #{PROGRAM_NAME} support libraries not installed"
178
- puts " Please install them first: #{command}"
179
- abort
180
- end
181
- else
182
- puts " --> #{PROGRAM_NAME} support libraries not installed"
183
- puts " <red>Please ask your #{PROGRAM_NAME} packager or operating " +
184
- "system vendor how to install these.</red>"
185
- abort
186
- end
187
- end
188
- end
189
-
190
- def download_and_extract_nginx_sources
191
- if @nginx_tarball
192
- tarball = @nginx_tarball
193
- else
194
- puts "Downloading Nginx #{@nginx_version} source code..."
195
- basename = "nginx-#{@nginx_version}.tar.gz"
196
- tarball = "#{@working_dir}/#{basename}"
197
- result = download("http://nginx.org/download/#{basename}",
198
- tarball, :show_progress => @stdout.tty?)
199
- if !result
200
- puts
201
- show_possible_solutions_for_download_and_extraction_problems
202
- abort
203
- end
204
- end
205
- nginx_sources_name = "nginx-#{@nginx_version}"
206
-
207
- puts "Extracting tarball..."
208
- e_working_dir = Shellwords.escape(@working_dir)
209
- e_tarball = Shellwords.escape(tarball)
210
- system("cd #{e_working_dir} && tar xzf #{e_tarball}")
211
- end
212
-
213
- def determine_support_libraries
214
- lib_dir = "#{@working_dir}/common/libpassenger_common"
215
- @support_libs = COMMON_LIBRARY.only(*NGINX_LIBS_SELECTOR).
216
- set_output_dir(lib_dir).
217
- link_objects
218
- @support_libs << "#{@working_dir}/common/libboost_oxt.a"
219
- @support_libs_string = @support_libs.join(" ")
220
- end
221
-
222
- def compile_support_libraries
223
- puts "Compiling support libraries (step 1 of 2)..."
224
- progress_bar = ProgressBar.new
225
- e_working_dir = Shellwords.escape(@working_dir)
226
- args = "#{@support_libs_string} CACHING=false OUTPUT_DIR=#{e_working_dir}"
227
- begin
228
- progress_bar.set(0.05)
229
- Dir.chdir(PhusionPassenger.build_system_dir) do
230
- run_rake_task!(args) do |progress, total|
231
- progress_bar.set(0.05 + (progress / total.to_f) * 0.95)
232
- end
233
- end
234
- progress_bar.set(1)
235
- ensure
236
- progress_bar.finish
237
- end
238
- end
239
-
240
- def configure_and_compile_nginx
241
- puts "Compiling Nginx engine (step 2 of 2)..."
242
- progress_bar = ProgressBar.new
243
- progress_bar.set(0)
244
- begin
245
- configure_nginx do
246
- progress_bar.set(0.25)
247
- end
248
- compile_nginx do |progress|
249
- progress_bar.set(0.25 + progress * 0.75)
250
- end
251
- progress_bar.set(1)
252
- ensure
253
- progress_bar.finish
254
- end
255
-
256
- FileUtils.cp("#{@working_dir}/nginx-#{@nginx_version}/objs/nginx",
257
- "#{@destdir}/nginx-#{@nginx_version}")
258
- puts "<green>Compilation finished!</green>"
259
- end
260
-
261
- def configure_nginx
262
- shell = PlatformInfo.find_command('bash') || "sh"
263
- e_nginx_source_dir = Shellwords.escape("#{@working_dir}/nginx-#{@nginx_version}")
264
-
265
- command = "cd #{e_nginx_source_dir} && "
266
- command << "env PASSENGER_INCLUDEDIR=#{Shellwords.escape PhusionPassenger.include_dir} " <<
267
- "PASSENGER_LIBS=#{Shellwords.escape(@support_libs_string)} "
268
- # RPM thinks it's being smart by scanning binaries for
269
- # paths and refusing to create package if it detects any
270
- # hardcoded thats that point to /usr or other important
271
- # locations. For Phusion Passenger Standalone we do not
272
- # care at all what the Nginx configured prefix is because
273
- # we pass it its resource locations during runtime, so
274
- # work around the problem by configure Nginx with prefix
275
- # /tmp.
276
- command << "#{shell} ./configure --prefix=/tmp " +
277
- "#{STANDALONE_NGINX_CONFIGURE_OPTIONS} " +
278
- "--add-module=#{Shellwords.escape PhusionPassenger.nginx_module_source_dir}"
279
- run_command_yield_activity(command) do |throbber|
280
- yield
281
- end
282
- end
283
-
284
- def compile_nginx
285
- backlog = ""
286
- e_nginx_source_dir = Shellwords.escape("#{@working_dir}/nginx-#{@nginx_version}")
287
-
288
- # Capture and index the `make --dry-run` output for
289
- # progress determination.
290
- total_lines = 0
291
- dry_run_output = {}
292
- `cd #{e_nginx_source_dir} && #{PlatformInfo.gnu_make} --dry-run`.split("\n").each do |line|
293
- total_lines += 1
294
- dry_run_output[line] = true
295
- end
296
-
297
- IO.popen("cd #{e_nginx_source_dir} && #{PlatformInfo.gnu_make} 2>&1", "r") do |io|
298
- progress = 1
299
- while !io.eof?
300
- line = io.readline
301
- backlog << line
302
- # If the output is part of what we saw when dry-running,
303
- # then increase progress bar. Otherwise it could be compiler
304
- # warnings or something, so ignore those.
305
- if dry_run_output[line.chomp]
306
- yield(progress / total_lines.to_f)
307
- progress += 1
308
- end
309
- end
310
- end
311
- if $?.exitstatus != 0
312
- @stderr.puts
313
- @stderr.puts "*** ERROR: unable to compile web helper."
314
- @stderr.puts backlog
315
- exit 1
316
- end
317
- end
318
-
319
- def run_command_yield_activity(command)
320
- backlog = ""
321
- IO.popen("#{command} 2>&1", "rb") do |io|
322
- while !io.eof?
323
- backlog << io.readline
324
- yield
325
- end
326
- end
327
- if $?.exitstatus != 0
328
- @stderr.puts
329
- @stderr.puts backlog
330
- @stderr.puts "*** ERROR: command failed: #{command}"
331
- exit 1
332
- end
333
- end
334
- end
335
-
336
- end # module Standalone
39
+ module Config
40
+
41
+ class NginxEngineCompiler < AbstractInstaller
42
+ include InstallationUtils
43
+
44
+ protected
45
+ def dependencies
46
+ specs = [
47
+ 'depcheck_specs/compiler_toolchain',
48
+ 'depcheck_specs/ruby',
49
+ 'depcheck_specs/libs',
50
+ 'depcheck_specs/utilities'
51
+ ]
52
+ ids = [
53
+ 'cc',
54
+ 'c++',
55
+ 'gmake',
56
+ 'rake',
57
+ 'openssl-dev',
58
+ 'zlib-dev',
59
+ 'pcre-dev'
60
+ ].compact
61
+ return [specs, ids]
62
+ end
63
+
64
+ def users_guide_path
65
+ return PhusionPassenger.standalone_doc_path
66
+ end
67
+
68
+ def users_guide_url
69
+ return STANDALONE_DOC_URL
70
+ end
71
+
72
+ def run_steps
73
+ check_source_code_available!
74
+ check_precompiled_support_libs_available!
75
+ if !@force
76
+ check_whether_os_is_broken
77
+ check_whether_system_has_enough_ram
78
+ check_for_download_tool!
79
+ end
80
+ check_dependencies(false) || abort
81
+ puts
82
+
83
+ @destdir = find_or_create_writable_support_binaries_dir!
84
+ puts "<banner>Installing...</banner>"
85
+ download_and_extract_nginx_sources
86
+ determine_support_libraries
87
+ compile_support_libraries
88
+ configure_and_compile_nginx
89
+ end
90
+
91
+ def before_install
92
+ super
93
+ if !@working_dir
94
+ @working_dir = PhusionPassenger::Utils.mktmpdir("passenger-install.", PlatformInfo.tmpexedir)
95
+ @owns_working_dir = true
96
+ end
97
+ @nginx_version ||= PREFERRED_NGINX_VERSION
98
+ end
99
+
100
+ def after_install
101
+ super
102
+ FileUtils.remove_entry_secure(@working_dir) if @owns_working_dir
103
+ end
104
+
105
+ private
106
+ def check_source_code_available!
107
+ return if File.exist?(PhusionPassenger.nginx_module_source_dir)
108
+
109
+ if PhusionPassenger.originally_packaged?
110
+ puts "<red>Broken #{PROGRAM_NAME} installation detected</red>"
111
+ puts
112
+ puts "This program requires the #{PROGRAM_NAME} Nginx module sources " +
113
+ "before it can compile an Nginx engine. However, the #{PROGRAM_NAME} " +
114
+ "Nginx module sources are not installed, even though they should have been. " +
115
+ "This probably means that your #{PROGRAM_NAME} installation has somehow " +
116
+ "become corrupted. Please re-install #{PROGRAM_NAME}."
117
+ abort
118
+ else
119
+ case PhusionPassenger.packaging_method
120
+ when "deb"
121
+ command = "sudo sh -c 'apt-get update && apt-get install #{DEB_DEV_PACKAGE}'"
122
+ when "rpm"
123
+ command = "sudo yum install #{RPM_DEV_PACKAGE}-#{VERSION_STRING}"
124
+ end
125
+
126
+ if command
127
+ if STDIN.tty?
128
+ puts " --> Installing #{PROGRAM_NAME} Nginx module sources"
129
+ puts " Running: #{command}"
130
+ if !system(command)
131
+ puts " <red>*** Command failed: #{command}</red>"
132
+ abort
133
+ end
134
+ else
135
+ puts " --> #{PROGRAM_NAME} Nginx module sources not installed"
136
+ puts " Please install them first: #{command}"
137
+ abort
138
+ end
139
+ else
140
+ puts " --> #{PROGRAM_NAME} Nginx module sources not installed"
141
+ puts " <red>Please ask your #{PROGRAM_NAME} packager or operating " +
142
+ "system vendor how to install these.</red>"
143
+ abort
144
+ end
145
+ end
146
+ end
147
+
148
+ def check_precompiled_support_libs_available!
149
+ return if PhusionPassenger.build_system_dir ||
150
+ File.exist?("#{PhusionPassenger.lib_dir}/common/libboost_oxt.a")
151
+
152
+ if PhusionPassenger.originally_packaged?
153
+ puts "<red>Broken #{PROGRAM_NAME} installation detected</red>"
154
+ puts
155
+ puts "This program requires the #{PROGRAM_NAME} support libraries " +
156
+ "before it can compile an Nginx engine. However, the #{PROGRAM_NAME} " +
157
+ "support libraries are not installed, even though they should have been. " +
158
+ "This probably means that your #{PROGRAM_NAME} installation has somehow " +
159
+ "become corrupted. Please re-install #{PROGRAM_NAME}."
160
+ abort
161
+ else
162
+ case PhusionPassenger.packaging_method
163
+ when "deb"
164
+ command = "sudo sh -c 'apt-get update && apt-get install #{DEB_DEV_PACKAGE}'"
165
+ when "rpm"
166
+ command = "sudo yum install #{RPM_DEV_PACKAGE}-#{VERSION_STRING}"
167
+ end
168
+
169
+ if command
170
+ if STDIN.tty?
171
+ puts " --> Installing #{PROGRAM_NAME} support libraries"
172
+ puts " Running: #{command}"
173
+ if !system(command)
174
+ puts " <red>*** Command failed: #{command}</red>"
175
+ abort
176
+ end
177
+ else
178
+ puts " --> #{PROGRAM_NAME} support libraries not installed"
179
+ puts " Please install them first: #{command}"
180
+ abort
181
+ end
182
+ else
183
+ puts " --> #{PROGRAM_NAME} support libraries not installed"
184
+ puts " <red>Please ask your #{PROGRAM_NAME} packager or operating " +
185
+ "system vendor how to install these.</red>"
186
+ abort
187
+ end
188
+ end
189
+ end
190
+
191
+ def download_and_extract_nginx_sources
192
+ if @nginx_tarball
193
+ tarball = @nginx_tarball
194
+ else
195
+ puts "Downloading Nginx #{@nginx_version} source code..."
196
+ basename = "nginx-#{@nginx_version}.tar.gz"
197
+ tarball = "#{@working_dir}/#{basename}"
198
+
199
+ options = {
200
+ :show_progress => @stdout.tty?
201
+ }
202
+ if @connect_timeout && @connect_timeout != 0
203
+ options[:connect_timeout] = @connect_timeout
204
+ end
205
+ if @idle_timeout && @idle_timeout != 0
206
+ options[:idle_timeout] = @idle_timeout
207
+ end
208
+
209
+ result = download("http://nginx.org/download/#{basename}",
210
+ tarball, options)
211
+
212
+ if !result
213
+ puts
214
+ show_possible_solutions_for_download_and_extraction_problems
215
+ abort
216
+ end
217
+ end
218
+ nginx_sources_name = "nginx-#{@nginx_version}"
219
+
220
+ puts "Extracting tarball..."
221
+ e_working_dir = Shellwords.escape(@working_dir)
222
+ e_tarball = Shellwords.escape(tarball)
223
+ system("cd #{e_working_dir} && tar xzf #{e_tarball}")
224
+ end
225
+
226
+ def show_possible_solutions_for_download_and_extraction_problems
227
+ new_screen
228
+ render_template "nginx_engine_compiler/possible_solutions_for_download_and_extraction_problems"
229
+ puts
230
+ end
231
+
232
+ def determine_support_libraries
233
+ lib_dir = "#{@working_dir}/common/libpassenger_common"
234
+ @support_libs = COMMON_LIBRARY.only(*NGINX_LIBS_SELECTOR).
235
+ set_output_dir(lib_dir).
236
+ link_objects
237
+ @support_libs << "#{@working_dir}/common/libboost_oxt.a"
238
+ @support_libs_string = @support_libs.join(" ")
239
+ end
240
+
241
+ def compile_support_libraries
242
+ puts "Compiling support libraries (step 1 of 2)..."
243
+ progress_bar = ProgressBar.new
244
+ e_working_dir = Shellwords.escape(@working_dir)
245
+ args = "#{@support_libs_string} CACHING=false OUTPUT_DIR=#{e_working_dir}"
246
+ begin
247
+ progress_bar.set(0.05)
248
+ Dir.chdir(PhusionPassenger.build_system_dir) do
249
+ run_rake_task!(args) do |progress, total|
250
+ progress_bar.set(0.05 + (progress / total.to_f) * 0.95)
251
+ end
252
+ end
253
+ progress_bar.set(1)
254
+ ensure
255
+ progress_bar.finish
256
+ end
257
+ end
258
+
259
+ def configure_and_compile_nginx
260
+ puts "Compiling Nginx engine (step 2 of 2)..."
261
+ progress_bar = ProgressBar.new
262
+ progress_bar.set(0)
263
+ begin
264
+ configure_nginx do
265
+ progress_bar.set(0.25)
266
+ end
267
+ compile_nginx do |progress|
268
+ progress_bar.set(0.25 + progress * 0.75)
269
+ end
270
+ progress_bar.set(1)
271
+ ensure
272
+ progress_bar.finish
273
+ end
274
+
275
+ FileUtils.cp("#{@working_dir}/nginx-#{@nginx_version}/objs/nginx",
276
+ "#{@destdir}/nginx-#{@nginx_version}")
277
+ puts "<green>Compilation finished!</green>"
278
+ end
279
+
280
+ def configure_nginx
281
+ shell = PlatformInfo.find_command('bash') || "sh"
282
+ e_nginx_source_dir = Shellwords.escape("#{@working_dir}/nginx-#{@nginx_version}")
283
+
284
+ command = "cd #{e_nginx_source_dir} && "
285
+ command << "env PASSENGER_INCLUDEDIR=#{Shellwords.escape PhusionPassenger.include_dir} " <<
286
+ "PASSENGER_LIBS=#{Shellwords.escape(@support_libs_string)} "
287
+ # RPM thinks it's being smart by scanning binaries for
288
+ # paths and refusing to create package if it detects any
289
+ # hardcoded thats that point to /usr or other important
290
+ # locations. For Phusion Passenger Standalone we do not
291
+ # care at all what the Nginx configured prefix is because
292
+ # we pass it its resource locations during runtime, so
293
+ # work around the problem by configure Nginx with prefix
294
+ # /tmp.
295
+ command << "#{shell} ./configure --prefix=/tmp " +
296
+ "#{STANDALONE_NGINX_CONFIGURE_OPTIONS} " +
297
+ "--add-module=#{Shellwords.escape PhusionPassenger.nginx_module_source_dir}"
298
+ run_command_yield_activity(command) do |throbber|
299
+ yield
300
+ end
301
+ end
302
+
303
+ def compile_nginx
304
+ backlog = ""
305
+ e_nginx_source_dir = Shellwords.escape("#{@working_dir}/nginx-#{@nginx_version}")
306
+
307
+ # Capture and index the `make --dry-run` output for
308
+ # progress determination.
309
+ total_lines = 0
310
+ dry_run_output = {}
311
+ `cd #{e_nginx_source_dir} && #{PlatformInfo.gnu_make} --dry-run`.split("\n").each do |line|
312
+ total_lines += 1
313
+ dry_run_output[line] = true
314
+ end
315
+
316
+ IO.popen("cd #{e_nginx_source_dir} && #{PlatformInfo.gnu_make} 2>&1", "r") do |io|
317
+ progress = 1
318
+ while !io.eof?
319
+ line = io.readline
320
+ backlog << line
321
+ # If the output is part of what we saw when dry-running,
322
+ # then increase progress bar. Otherwise it could be compiler
323
+ # warnings or something, so ignore those.
324
+ if dry_run_output[line.chomp]
325
+ yield(progress / total_lines.to_f)
326
+ progress += 1
327
+ end
328
+ end
329
+ end
330
+ if $?.exitstatus != 0
331
+ @stderr.puts
332
+ @stderr.puts "*** ERROR: unable to compile web helper."
333
+ @stderr.puts backlog
334
+ exit 1
335
+ end
336
+ end
337
+
338
+ def run_command_yield_activity(command)
339
+ backlog = ""
340
+ IO.popen("#{command} 2>&1", "rb") do |io|
341
+ while !io.eof?
342
+ backlog << io.readline
343
+ yield
344
+ end
345
+ end
346
+ if $?.exitstatus != 0
347
+ @stderr.puts
348
+ @stderr.puts backlog
349
+ @stderr.puts "*** ERROR: command failed: #{command}"
350
+ exit 1
351
+ end
352
+ end
353
+ end
354
+
355
+ end # module Standalone
337
356
  end # module PhusionPassenger