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
@@ -1,5 +1,5 @@
1
1
  # Phusion Passenger - https://www.phusionpassenger.com/
2
- # Copyright (c) 2014 Phusion
2
+ # Copyright (c) 2014-2015 Phusion
3
3
  #
4
4
  # "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.
5
5
  #
@@ -28,85 +28,100 @@ PhusionPassenger.require_passenger_lib 'config/nginx_engine_compiler'
28
28
  PhusionPassenger.require_passenger_lib 'utils/ansi_colors'
29
29
 
30
30
  module PhusionPassenger
31
- module Config
31
+ module Config
32
32
 
33
- class CompileNginxEngineCommand < Command
34
- include InstallationUtils
33
+ class CompileNginxEngineCommand < Command
34
+ include InstallationUtils
35
35
 
36
- def run
37
- @options = { :colorize => :auto, :force_tip => true }
38
- parse_options
39
- initialize_objects
40
- sanity_check
41
- if !NginxEngineCompiler.new(@options).run
42
- abort
43
- end
44
- end
36
+ def run
37
+ @options = {
38
+ :colorize => :auto,
39
+ :force_tip => true,
40
+ :connect_timeout => 30,
41
+ :idle_timeout => 30
42
+ }
43
+ parse_options
44
+ initialize_objects
45
+ sanity_check
46
+ if !NginxEngineCompiler.new(@options).run
47
+ abort
48
+ end
49
+ end
45
50
 
46
- private
47
- def self.create_option_parser(options)
48
- OptionParser.new do |opts|
49
- nl = "\n" + ' ' * 37
50
- opts.banner = "Usage: passenger-config compile-nginx-engine [OPTIONS]\n"
51
- opts.separator ""
52
- opts.separator " Compile an Nginx engine, for use in #{PROGRAM_NAME} Standalone."
53
- opts.separator ""
51
+ private
52
+ def self.create_option_parser(options)
53
+ OptionParser.new do |opts|
54
+ nl = "\n" + ' ' * 37
55
+ opts.banner = "Usage: passenger-config compile-nginx-engine [OPTIONS]\n"
56
+ opts.separator ""
57
+ opts.separator " Compile an Nginx engine, for use in #{PROGRAM_NAME} Standalone."
58
+ opts.separator ""
54
59
 
55
- opts.separator "Options:"
56
- opts.on("--working-dir PATH", String, "Store temporary files in the given#{nl}" +
57
- "directory, instead of creating one") do |val|
58
- options[:working_dir] = val
59
- end
60
- opts.on("--nginx-version VERSION", String, "Nginx version to compile. " +
61
- "Default: #{PREFERRED_NGINX_VERSION}") do |val|
62
- options[:nginx_version] = val
63
- end
64
- opts.on("--nginx-tarball PATH", String, "Use the given Nginx tarball instead of#{nl}" +
65
- "downloading it. You MUST also specify the#{nl}" +
66
- "Nginx version with --nginx-version") do |val|
67
- options[:nginx_tarball] = val
68
- end
69
- opts.on("-f", "--force", "Skip sanity checks") do
70
- options[:force] = true
71
- end
72
- opts.on("--no-force-tip", "Do not print any tips regarding the --force parameter") do
73
- options[:force_tip] = false
74
- end
75
- opts.on("-h", "--help", "Show this help") do
76
- options[:help] = true
77
- end
78
- end
79
- end
60
+ opts.separator "Options:"
61
+ opts.on("--working-dir PATH", String, "Store temporary files in the given#{nl}" +
62
+ "directory, instead of creating one") do |val|
63
+ options[:working_dir] = val
64
+ end
65
+ opts.on("--nginx-version VERSION", String, "Nginx version to compile. " +
66
+ "Default: #{PREFERRED_NGINX_VERSION}") do |val|
67
+ options[:nginx_version] = val
68
+ end
69
+ opts.on("--nginx-tarball PATH", String, "Use the given Nginx tarball instead of#{nl}" +
70
+ "downloading it. You MUST also specify the#{nl}" +
71
+ "Nginx version with --nginx-version") do |val|
72
+ options[:nginx_tarball] = val
73
+ end
74
+ opts.on("-f", "--force", "Skip sanity checks") do
75
+ options[:force] = true
76
+ end
77
+ opts.on("--no-force-tip", "Do not print any tips regarding the --force#{nl}" +
78
+ "parameter") do
79
+ options[:force_tip] = false
80
+ end
81
+ opts.on("--connect-timeout SECONDS", Integer,
82
+ "The maximum amount of time to spend on DNS#{nl}" +
83
+ "lookup and establishing the TCP connection.#{nl}" +
84
+ "Default: 30") do |val|
85
+ options[:connect_timeout] = val
86
+ end
87
+ opts.on("--idle-timeout SECONDS", Integer, "The maximum idle read time. Default: 30") do |val|
88
+ options[:idle_timeout] = val
89
+ end
90
+ opts.on("-h", "--help", "Show this help") do
91
+ options[:help] = true
92
+ end
93
+ end
94
+ end
80
95
 
81
- def help
82
- puts @parser
83
- end
96
+ def help
97
+ puts @parser
98
+ end
84
99
 
85
- def initialize_objects
86
- @colors = Utils::AnsiColors.new(@options[:colorize])
87
- if !@options[:nginx_version]
88
- if @options[:nginx_tarball]
89
- abort "#{@colors.red}Error: if you specify --nginx-tarball, " +
90
- "you must also specify --nginx-version.#{@colors.reset}"
91
- else
92
- @options[:nginx_version] = PREFERRED_NGINX_VERSION
93
- end
94
- end
95
- end
100
+ def initialize_objects
101
+ @colors = Utils::AnsiColors.new(@options[:colorize])
102
+ if !@options[:nginx_version]
103
+ if @options[:nginx_tarball]
104
+ abort "#{@colors.red}Error: if you specify --nginx-tarball, " +
105
+ "you must also specify --nginx-version.#{@colors.reset}"
106
+ else
107
+ @options[:nginx_version] = PREFERRED_NGINX_VERSION
108
+ end
109
+ end
110
+ end
96
111
 
97
- def sanity_check
98
- return if @options[:force]
112
+ def sanity_check
113
+ return if @options[:force]
99
114
 
100
- if PhusionPassenger.find_support_binary("nginx-#{@options[:nginx_version]}")
101
- puts "#{@colors.green}The Nginx engine (version #{@options[:nginx_version]}) " +
102
- "is already installed.#{@colors.reset}"
103
- if @options[:force_tip]
104
- puts "If you want to recompile it, re-run this program with the --force parameter."
105
- end
106
- exit
107
- end
108
- end
109
- end
115
+ if PhusionPassenger.find_support_binary("nginx-#{@options[:nginx_version]}")
116
+ puts "#{@colors.green}The Nginx engine (version #{@options[:nginx_version]}) " +
117
+ "is already installed.#{@colors.reset}"
118
+ if @options[:force_tip]
119
+ puts "If you want to recompile it, re-run this program with the --force parameter."
120
+ end
121
+ exit
122
+ end
123
+ end
124
+ end
110
125
 
111
- end # module Config
126
+ end # module Config
112
127
  end # module PhusionPassenger
@@ -31,84 +31,84 @@ PhusionPassenger.require_passenger_lib 'config/utils'
31
31
  PhusionPassenger.require_passenger_lib 'utils/json'
32
32
 
33
33
  module PhusionPassenger
34
- module Config
34
+ module Config
35
35
 
36
- class DetachProcessCommand < Command
37
- include PhusionPassenger::Config::Utils
36
+ class DetachProcessCommand < Command
37
+ include PhusionPassenger::Config::Utils
38
38
 
39
- def run
40
- parse_options
41
- select_passenger_instance
42
- perform_detach
43
- end
39
+ def run
40
+ parse_options
41
+ select_passenger_instance
42
+ perform_detach
43
+ end
44
44
 
45
- private
46
- def self.create_option_parser(options)
47
- OptionParser.new do |opts|
48
- nl = "\n" + ' ' * 37
49
- opts.banner = "Usage: passenger-config detach-process [OPTIONS] <PID>\n"
50
- opts.separator ""
51
- opts.separator " Remove an application process from the #{PROGRAM_NAME} process pool, and"
52
- opts.separator " shut it down. Has a similar effect to killing the application process"
53
- opts.separator " directly with `kill <PID>`. But `kill` aborts any active requests, while"
54
- opts.separator " this command shuts down the process after active requests are finished."
55
- opts.separator ""
56
- opts.separator " If you want to force abort a process and its active requests, just use `kill`."
57
- opts.separator ""
45
+ private
46
+ def self.create_option_parser(options)
47
+ OptionParser.new do |opts|
48
+ nl = "\n" + ' ' * 37
49
+ opts.banner = "Usage: passenger-config detach-process [OPTIONS] <PID>\n"
50
+ opts.separator ""
51
+ opts.separator " Remove an application process from the #{PROGRAM_NAME} process pool, and"
52
+ opts.separator " shut it down. Has a similar effect to killing the application process"
53
+ opts.separator " directly with `kill <PID>`. But `kill` aborts any active requests, while"
54
+ opts.separator " this command shuts down the process after active requests are finished."
55
+ opts.separator ""
56
+ opts.separator " If you want to force abort a process and its active requests, just use `kill`."
57
+ opts.separator ""
58
58
 
59
- opts.separator "Options:"
60
- opts.on("--instance NAME", String, "The #{PROGRAM_NAME} instance to select") do |value|
61
- options[:instance] = value
62
- end
63
- opts.on("--ignore-nonexistant-pid", "Exit successfully even if the specified#{nl}" +
64
- "PID is not in the process pool.") do
65
- options[:ignore_nonexistant_pid] = true
66
- end
67
- opts.on("-h", "--help", "Show this help") do
68
- options[:help] = true
69
- end
70
- end
71
- end
59
+ opts.separator "Options:"
60
+ opts.on("--instance NAME", String, "The #{PROGRAM_NAME} instance to select") do |value|
61
+ options[:instance] = value
62
+ end
63
+ opts.on("--ignore-nonexistant-pid", "Exit successfully even if the specified#{nl}" +
64
+ "PID is not in the process pool.") do
65
+ options[:ignore_nonexistant_pid] = true
66
+ end
67
+ opts.on("-h", "--help", "Show this help") do
68
+ options[:help] = true
69
+ end
70
+ end
71
+ end
72
72
 
73
- def help
74
- puts @parser
75
- end
73
+ def help
74
+ puts @parser
75
+ end
76
76
 
77
- def parse_options
78
- super
79
- if @argv.empty?
80
- abort "Please pass a PID. " +
81
- "See --help for more information."
82
- elsif @argv.size == 1
83
- @pid = @argv[0].to_i
84
- elsif @argv.size > 1
85
- help
86
- abort
87
- end
88
- end
77
+ def parse_options
78
+ super
79
+ if @argv.empty?
80
+ abort "Please pass a PID. " +
81
+ "See --help for more information."
82
+ elsif @argv.size == 1
83
+ @pid = @argv[0].to_i
84
+ elsif @argv.size > 1
85
+ help
86
+ abort
87
+ end
88
+ end
89
89
 
90
- def perform_detach
91
- request = Net::HTTP::Post.new("/pool/detach_process.json")
92
- request.basic_auth("admin", obtain_full_admin_password(@instance))
93
- request.content_type = "application/json"
94
- request.body = PhusionPassenger::Utils::JSON.generate(:pid => @pid)
95
- response = @instance.http_request("agents.s/server_admin", request)
96
- if response.code.to_i / 100 == 2
97
- body = PhusionPassenger::Utils::JSON.parse(response.body)
98
- if body['detached']
99
- puts "Process #{@pid} detached."
100
- elsif @options[:ignore_nonexistant_pid]
101
- puts "Could not detach process #{@pid}."
102
- else
103
- abort "Could not detach process #{@pid}."
104
- end
105
- else
106
- STDERR.puts "*** An error occured while communicating with the #{PROGRAM_NAME} server:"
107
- STDERR.puts response.body
108
- abort
109
- end
110
- end
111
- end
90
+ def perform_detach
91
+ request = Net::HTTP::Post.new("/pool/detach_process.json")
92
+ request.basic_auth("admin", obtain_full_admin_password(@instance))
93
+ request.content_type = "application/json"
94
+ request.body = PhusionPassenger::Utils::JSON.generate(:pid => @pid)
95
+ response = @instance.http_request("agents.s/server_admin", request)
96
+ if response.code.to_i / 100 == 2
97
+ body = PhusionPassenger::Utils::JSON.parse(response.body)
98
+ if body['detached']
99
+ puts "Process #{@pid} detached."
100
+ elsif @options[:ignore_nonexistant_pid]
101
+ puts "Could not detach process #{@pid}."
102
+ else
103
+ abort "Could not detach process #{@pid}."
104
+ end
105
+ else
106
+ STDERR.puts "*** An error occured while communicating with the #{PROGRAM_NAME} server:"
107
+ STDERR.puts response.body
108
+ abort
109
+ end
110
+ end
111
+ end
112
112
 
113
- end # module Config
113
+ end # module Config
114
114
  end # module PhusionPassenger
@@ -1,5 +1,5 @@
1
1
  # Phusion Passenger - https://www.phusionpassenger.com/
2
- # Copyright (c) 2014 Phusion
2
+ # Copyright (c) 2014-2015 Phusion
3
3
  #
4
4
  # "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.
5
5
  #
@@ -34,252 +34,271 @@ PhusionPassenger.require_passenger_lib 'utils/shellwords'
34
34
  PhusionPassenger.require_passenger_lib 'utils/tmpio'
35
35
 
36
36
  module PhusionPassenger
37
- module Config
37
+ module Config
38
38
 
39
- class DownloadAgentCommand < Command
40
- include InstallationUtils
39
+ class DownloadAgentCommand < Command
40
+ include InstallationUtils
41
41
 
42
- BINARY_NOT_USABLE_EXIT_CODE = 3
42
+ BINARY_NOT_USABLE_EXIT_CODE = 3
43
43
 
44
- def run
45
- @options = {
46
- :log_level => Logger::INFO,
47
- :colors => :auto,
48
- :error_colors => true,
49
- :show_download_progress => STDOUT.tty?,
50
- :compilation_tip => true,
51
- :force_tip => true,
52
- :use_cache => true
53
- }
54
- parse_options
55
- initialize_objects
56
- sanity_check
57
- download_and_extract
58
- end
44
+ def run
45
+ @options = {
46
+ :log_level => Logger::INFO,
47
+ :colors => :auto,
48
+ :error_colors => true,
49
+ :show_download_progress => STDOUT.tty?,
50
+ :compilation_tip => true,
51
+ :force_tip => true,
52
+ :use_cache => true,
53
+ :connect_timeout => 30,
54
+ :idle_timeout => 30
55
+ }
56
+ parse_options
57
+ initialize_objects
58
+ sanity_check
59
+ download_and_extract
60
+ end
59
61
 
60
- private
61
- def self.create_option_parser(options)
62
- OptionParser.new do |opts|
63
- nl = "\n" + ' ' * 37
64
- opts.banner = "Usage: passenger-config download-agent [OPTIONS]\n"
65
- opts.separator ""
66
- opts.separator " Download a precompiled #{PROGRAM_NAME} agent binary from the"
67
- opts.separator " #{PROGRAM_NAME} website. The agent binary is required for #{PROGRAM_NAME}"
68
- opts.separator " to function properly. Precompiled binaries are only available for Linux and"
69
- opts.separator " OS X."
70
- opts.separator ""
62
+ private
63
+ def self.create_option_parser(options)
64
+ OptionParser.new do |opts|
65
+ nl = "\n" + ' ' * 37
66
+ opts.banner = "Usage: passenger-config download-agent [OPTIONS]\n"
67
+ opts.separator ""
68
+ opts.separator " Download a precompiled #{PROGRAM_NAME} agent binary from the"
69
+ opts.separator " #{PROGRAM_NAME} website. The agent binary is required for #{PROGRAM_NAME}"
70
+ opts.separator " to function properly. Precompiled binaries are only available for Linux and"
71
+ opts.separator " OS X."
72
+ opts.separator ""
71
73
 
72
- opts.separator "Options:"
73
- opts.on("--url-root URL", String, "Download the binary from a custom URL") do |value|
74
- options[:url_root] = value
75
- end
76
- opts.on("--log-prefix PREFIX", String, "Prefix all logs with the given string") do |value|
77
- options[:log_prefix] = value
78
- end
79
- opts.on("--log-level LEVEL", String, "Set log level (fatal,error,warn,info,#{nl}" +
80
- "debug). Default: info") do |value|
81
- case value
82
- when "fatal"
83
- options[:log_level] = Logger::FATAL
84
- when "error"
85
- options[:log_level] = Logger::ERROR
86
- when "warn"
87
- options[:log_level] = Logger::WARN
88
- when "info"
89
- options[:log_level] = Logger::INFO
90
- when "debug"
91
- options[:log_level] = Logger::DEBUG
92
- else
93
- abort "Invalid log level #{value.inspect}"
94
- end
95
- end
96
- opts.on("-f", "--force", "Skip sanity checks") do
97
- options[:force] = true
98
- end
99
- opts.on("--no-colors", "Never output colors") do
100
- options[:colors] = false
101
- end
102
- opts.on("--no-error-colors", "Do not colorized error messages") do
103
- options[:error_colors] = false
104
- end
105
- opts.on("--no-download-progress", "Never show download progress") do
106
- options[:show_download_progress] = false
107
- end
108
- opts.on("--no-compilation-tip", "Do not present compilation as an#{nl}" +
109
- "alternative way to install the agent") do
110
- options[:compilation_tip] = false
111
- end
112
- opts.on("--no-force-tip", "Do not print any tips regarding the --force parameter") do
113
- options[:force_tip] = false
114
- end
115
- opts.on("--skip-cache", "Do not copy the agent binary from cache") do
116
- options[:use_cache] = false
117
- end
118
- opts.on("--suppress-binary-unusable-message",
119
- "Do not print anything if the downloaded#{nl}" +
120
- "binary turns out to be unusable") do
121
- options[:suppress_binary_unusable_message] = true
122
- end
123
- opts.on("--dry-run", "Do everything except actually installing#{nl}" +
124
- "the binary") do
125
- options[:dry_run] = true
126
- end
127
- opts.on("-h", "--help", "Show this help") do
128
- options[:help] = true
129
- end
130
- end
131
- end
74
+ opts.separator "Options:"
75
+ opts.on("--url-root URL", String, "Download the binary from a custom URL") do |value|
76
+ options[:url_root] = value
77
+ end
78
+ opts.on("--log-prefix PREFIX", String, "Prefix all logs with the given string") do |value|
79
+ options[:log_prefix] = value
80
+ end
81
+ opts.on("--log-level LEVEL", String, "Set log level (fatal,error,warn,info,#{nl}" +
82
+ "debug). Default: info") do |value|
83
+ case value
84
+ when "fatal"
85
+ options[:log_level] = Logger::FATAL
86
+ when "error"
87
+ options[:log_level] = Logger::ERROR
88
+ when "warn"
89
+ options[:log_level] = Logger::WARN
90
+ when "info"
91
+ options[:log_level] = Logger::INFO
92
+ when "debug"
93
+ options[:log_level] = Logger::DEBUG
94
+ else
95
+ abort "Invalid log level #{value.inspect}"
96
+ end
97
+ end
98
+ opts.on("-f", "--force", "Skip sanity checks") do
99
+ options[:force] = true
100
+ end
101
+ opts.on("--no-colors", "Never output colors") do
102
+ options[:colors] = false
103
+ end
104
+ opts.on("--no-error-colors", "Do not colorized error messages") do
105
+ options[:error_colors] = false
106
+ end
107
+ opts.on("--no-download-progress", "Never show download progress") do
108
+ options[:show_download_progress] = false
109
+ end
110
+ opts.on("--no-compilation-tip", "Do not present compilation as an#{nl}" +
111
+ "alternative way to install the agent") do
112
+ options[:compilation_tip] = false
113
+ end
114
+ opts.on("--no-force-tip", "Do not print any tips regarding the#{nl}" +
115
+ "--force parameter") do
116
+ options[:force_tip] = false
117
+ end
118
+ opts.on("--skip-cache", "Do not copy the agent binary from cache") do
119
+ options[:use_cache] = false
120
+ end
121
+ opts.on("--suppress-binary-unusable-message",
122
+ "Do not print anything if the downloaded#{nl}" +
123
+ "binary turns out to be unusable") do
124
+ options[:suppress_binary_unusable_message] = true
125
+ end
126
+ opts.on("--dry-run", "Do everything except actually installing#{nl}" +
127
+ "the binary") do
128
+ options[:dry_run] = true
129
+ end
130
+ opts.on("--connect-timeout SECONDS", Integer,
131
+ "The maximum amount of time to spend on DNS#{nl}" +
132
+ "lookup and establishing the TCP connection.#{nl}" +
133
+ "Default: 30") do |val|
134
+ options[:connect_timeout] = val
135
+ end
136
+ opts.on("--idle-timeout SECONDS", Integer, "The maximum idle read time. Default: 30") do |val|
137
+ options[:idle_timeout] = val
138
+ end
139
+ opts.on("-h", "--help", "Show this help") do
140
+ options[:help] = true
141
+ end
142
+ end
143
+ end
132
144
 
133
- def help
134
- puts @parser
135
- end
145
+ def help
146
+ puts @parser
147
+ end
136
148
 
137
- def initialize_objects
138
- if @options[:url_root]
139
- @sites = [{ :url => @options[:url_root] }]
140
- else
141
- @sites = PhusionPassenger.binaries_sites
142
- end
143
- @colors = Utils::AnsiColors.new(@options[:colors])
144
- @logger = Logger.new(STDOUT)
145
- @logger.level = @options[:log_level]
146
- @logger.formatter = proc do |severity, datetime, progname, msg|
147
- if @options[:error_colors] && (severity == "FATAL" || severity == "ERROR")
148
- color = @colors.red
149
- else
150
- color = nil
151
- end
152
- result = ""
153
- msg.split("\n", -1).map do |line|
154
- result << "#{color}#{@options[:log_prefix]}#{line}#{@colors.reset}\n"
155
- end
156
- result
157
- end
158
- end
149
+ def initialize_objects
150
+ if @options[:url_root]
151
+ @sites = [{ :url => @options[:url_root] }]
152
+ else
153
+ @sites = PhusionPassenger.binaries_sites
154
+ end
155
+ @colors = Utils::AnsiColors.new(@options[:colors])
156
+ @logger = Logger.new(STDOUT)
157
+ @logger.level = @options[:log_level]
158
+ @logger.formatter = proc do |severity, datetime, progname, msg|
159
+ if @options[:error_colors] && (severity == "FATAL" || severity == "ERROR")
160
+ color = @colors.red
161
+ else
162
+ color = nil
163
+ end
164
+ result = ""
165
+ msg.split("\n", -1).map do |line|
166
+ result << "#{color}#{@options[:log_prefix]}#{line}#{@colors.reset}\n"
167
+ end
168
+ result
169
+ end
170
+ end
159
171
 
160
- def sanity_check
161
- return if @options[:force]
172
+ def sanity_check
173
+ return if @options[:force]
162
174
 
163
- if PhusionPassenger.find_support_binary(AGENT_EXE)
164
- @logger.warn "#{@colors.green}The #{PROGRAM_NAME} agent is already installed."
165
- if @options[:force_tip]
166
- @logger.warn "If you want to redownload it, re-run this program with the --force parameter."
167
- end
168
- exit
169
- end
175
+ if PhusionPassenger.find_support_binary(AGENT_EXE)
176
+ @logger.warn "#{@colors.green}The #{PROGRAM_NAME} agent is already installed."
177
+ if @options[:force_tip]
178
+ @logger.warn "If you want to redownload it, re-run this program with the --force parameter."
179
+ end
180
+ exit
181
+ end
170
182
 
171
- if !PhusionPassenger.installed_from_release_package?
172
- @logger.fatal("#{PROGRAM_NAME} was not installed from an official release " +
173
- "package, so you cannot download our precompiled agent binary." +
174
- compile_tip_message)
175
- if @options[:force_tip]
176
- @logger.warn "If you want to download it anyway, re-run this program with the --force parameter."
177
- end
178
- abort
179
- end
183
+ if !PhusionPassenger.installed_from_release_package?
184
+ @logger.fatal("#{PROGRAM_NAME} was not installed from an official release " +
185
+ "package, so you cannot download our precompiled agent binary." +
186
+ compile_tip_message)
187
+ if @options[:force_tip]
188
+ @logger.warn "If you want to download it anyway, re-run this program with the --force parameter."
189
+ end
190
+ abort
191
+ end
180
192
 
181
- check_for_download_tool!
182
- end
193
+ check_for_download_tool!
194
+ end
183
195
 
184
- def download_and_extract
185
- destdir = find_or_create_writable_support_binaries_dir!
186
- exit if @options[:dry_run]
196
+ def download_and_extract
197
+ destdir = find_or_create_writable_support_binaries_dir!
198
+ exit if @options[:dry_run]
187
199
 
188
- PhusionPassenger::Utils.mktmpdir("passenger-install.", PlatformInfo.tmpexedir) do |tmpdir|
189
- basename = "agent-#{PlatformInfo.cxx_binary_compatibility_id}.tar.gz"
190
- tarball = "#{tmpdir}/#{basename}"
191
- if !download_support_file(basename, tarball)
192
- @logger.error "#{@colors.reset}------------------------------------------"
193
- @logger.fatal("Sorry, no precompiled agent binary is available for " +
194
- "your platform." + compile_tip_message)
195
- abort
196
- end
200
+ PhusionPassenger::Utils.mktmpdir("passenger-install.", PlatformInfo.tmpexedir) do |tmpdir|
201
+ basename = "agent-#{PlatformInfo.cxx_binary_compatibility_id}.tar.gz"
202
+ tarball = "#{tmpdir}/#{basename}"
203
+ if !download_support_file(basename, tarball)
204
+ @logger.error "#{@colors.reset}------------------------------------------"
205
+ @logger.fatal("Sorry, no precompiled agent binary is available for " +
206
+ "your platform." + compile_tip_message)
207
+ abort
208
+ end
197
209
 
198
- @logger.info "Extracting precompiled agent binary to #{destdir}..."
199
- e_tmpdir = Shellwords.escape(tmpdir)
200
- e_tarball = Shellwords.escape(tarball)
201
- if !system("cd #{e_tmpdir} && tar xzf #{e_tarball}")
202
- @logger.fatal "The downloaded archive file could not be extracted."
203
- abort
204
- end
205
- if !File.exist?("#{tmpdir}/#{AGENT_EXE}")
206
- @logger.fatal "The downloaded archive file does not seem to " +
207
- "contain an agent binary. This is probably a problem in " +
208
- "the #{PROGRAM_NAME} website. Please report this problem to " +
209
- "the #{PROGRAM_NAME} authors."
210
- abort
211
- end
210
+ @logger.info "Extracting precompiled agent binary to #{destdir}..."
211
+ e_tmpdir = Shellwords.escape(tmpdir)
212
+ e_tarball = Shellwords.escape(tarball)
213
+ if !system("cd #{e_tmpdir} && tar xzf #{e_tarball}")
214
+ @logger.fatal "The downloaded archive file could not be extracted."
215
+ abort
216
+ end
217
+ if !File.exist?("#{tmpdir}/#{AGENT_EXE}")
218
+ @logger.fatal "The downloaded archive file does not seem to " +
219
+ "contain an agent binary. This is probably a problem in " +
220
+ "the #{PROGRAM_NAME} website. Please report this problem to " +
221
+ "the #{PROGRAM_NAME} authors."
222
+ abort
223
+ end
212
224
 
213
- @logger.info "Checking whether the downloaded binary is usable..."
214
- if test_binary("#{tmpdir}/#{AGENT_EXE}")
215
- @logger.info "The downloaded binary is usable."
216
- else
217
- if !@options[:suppress_binary_unusable_message]
218
- @logger.fatal "Sorry, the precompiled agent binary can not be run " +
219
- "your system.#{compile_tip_message}"
220
- end
221
- exit(BINARY_NOT_USABLE_EXIT_CODE)
222
- end
225
+ @logger.info "Checking whether the downloaded binary is usable..."
226
+ if test_binary("#{tmpdir}/#{AGENT_EXE}")
227
+ @logger.info "The downloaded binary is usable."
228
+ else
229
+ if !@options[:suppress_binary_unusable_message]
230
+ @logger.fatal "Sorry, the precompiled agent binary can not be run " +
231
+ "your system.#{compile_tip_message}"
232
+ end
233
+ exit(BINARY_NOT_USABLE_EXIT_CODE)
234
+ end
223
235
 
224
- FileUtils.mv("#{tmpdir}/#{AGENT_EXE}", "#{destdir}/#{AGENT_EXE}")
225
- @logger.info "#{@colors.green}Agent binary successfully download and installed."
226
- end
227
- end
236
+ FileUtils.mv("#{tmpdir}/#{AGENT_EXE}", "#{destdir}/#{AGENT_EXE}")
237
+ @logger.info "#{@colors.green}Agent binary successfully download and installed."
238
+ end
239
+ end
228
240
 
229
- def download_support_file(name, output)
230
- @sites.each_with_index do |site, i|
231
- if real_download_support_file(site, name, output)
232
- if i > 0
233
- @logger.warn "#{@colors.green}Download OK!"
234
- else
235
- @logger.info "#{@colors.green}Download OK!"
236
- end
237
- return true
238
- elsif i != @sites.size - 1
239
- @logger.warn "Trying next mirror..."
240
- end
241
- end
242
- return false
243
- end
241
+ def download_support_file(name, output)
242
+ @sites.each_with_index do |site, i|
243
+ if real_download_support_file(site, name, output)
244
+ if i > 0
245
+ @logger.warn "#{@colors.green}Download OK!"
246
+ else
247
+ @logger.info "#{@colors.green}Download OK!"
248
+ end
249
+ return true
250
+ elsif i != @sites.size - 1
251
+ @logger.warn "Trying next mirror..."
252
+ end
253
+ end
254
+ return false
255
+ end
244
256
 
245
- def real_download_support_file(site, name, output)
246
- url = "#{site[:url]}/#{VERSION_STRING}/#{name}"
247
- return PhusionPassenger::Utils::Download.download(url, output,
248
- :cacert => site[:cacert],
249
- :logger => @logger,
250
- :use_cache => @options[:use_cache],
251
- :show_progress => @options[:show_download_progress],
252
- :connect_timeout => 30,
253
- :idle_timeout => 30)
254
- end
257
+ def real_download_support_file(site, name, output)
258
+ url = "#{site[:url]}/#{VERSION_STRING}/#{name}"
259
+ options = {
260
+ :cacert => site[:cacert],
261
+ :logger => @logger,
262
+ :use_cache => @options[:use_cache]
263
+ }
264
+ # connect_timeout and idle_timeout may be nil or 0, which means
265
+ # that the default Utils::Download timeouts should be used.
266
+ if @options[:connect_timeout] && @options[:connect_timeout] != 0
267
+ options[:connect_timeout] = @options[:connect_timeout]
268
+ end
269
+ if @options[:idle_timeout] && @options[:idle_timeout] != 0
270
+ options[:idle_timeout] = @options[:idle_timeout]
271
+ end
272
+ return PhusionPassenger::Utils::Download.download(url, output, options)
273
+ end
255
274
 
256
- def test_binary(filename)
257
- output = `env LD_BIND_NOW=1 DYLD_BIND_AT_LAUNCH=1 #{Shellwords.escape(filename)} test-binary`
258
- return $? && $?.exitstatus == 0 && output == "PASS\n"
259
- end
275
+ def test_binary(filename)
276
+ output = `env LD_BIND_NOW=1 DYLD_BIND_AT_LAUNCH=1 #{Shellwords.escape(filename)} test-binary`
277
+ return $? && $?.exitstatus == 0 && output == "PASS\n"
278
+ end
260
279
 
261
- def compile_tip_message
262
- return "" if !@options[:compilation_tip]
263
- if PhusionPassenger.build_system_dir
264
- result = " Please compile the agent from source instead, by running:\n\n"
265
- result << " passenger-config compile-agent"
266
- else
267
- result = " Furthermore, this #{PROGRAM_NAME} installation does not "
268
- result << "come with any source code, so the agent binary cannot "
269
- result << "be compiled either. Please contact the person or "
270
- result << "organization who packaged #{PROGRAM_NAME} for help on this "
271
- result << "problem."
272
- end
273
- return result
274
- end
280
+ def compile_tip_message
281
+ return "" if !@options[:compilation_tip]
282
+ if PhusionPassenger.build_system_dir
283
+ result = " Please compile the agent from source instead, by running:\n\n"
284
+ result << " passenger-config compile-agent"
285
+ else
286
+ result = " Furthermore, this #{PROGRAM_NAME} installation does not "
287
+ result << "come with any source code, so the agent binary cannot "
288
+ result << "be compiled either. Please contact the person or "
289
+ result << "organization who packaged #{PROGRAM_NAME} for help on this "
290
+ result << "problem."
291
+ end
292
+ return result
293
+ end
275
294
 
276
- # Override InstallationUtils
277
- def print_installation_error_header
278
- @logger.warn "------------------------------------------"
279
- @logger.fatal "Cannot store agent binary"
280
- @logger.fatal ""
281
- end
282
- end
295
+ # Override InstallationUtils
296
+ def print_installation_error_header
297
+ @logger.warn "------------------------------------------"
298
+ @logger.fatal "Cannot store agent binary"
299
+ @logger.fatal ""
300
+ end
301
+ end
283
302
 
284
- end # module Config
303
+ end # module Config
285
304
  end # module PhusionPassenger