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
@@ -31,80 +31,80 @@ 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 ReopenLogsCommand < Command
37
- include PhusionPassenger::Config::Utils
36
+ class ReopenLogsCommand < Command
37
+ include PhusionPassenger::Config::Utils
38
38
 
39
- def run
40
- parse_options
41
- select_passenger_instance
42
- perform_reopen_logs
43
- end
39
+ def run
40
+ parse_options
41
+ select_passenger_instance
42
+ perform_reopen_logs
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 reopen-logs [OPTIONS]\n"
50
- opts.separator ""
51
- opts.separator " Instruct #{PROGRAM_NAME} agent processes to reopen their log files. This"
52
- opts.separator " should be involved after you've rotated logs. This command returns after"
53
- opts.separator " the log files have been reopened."
54
- 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 reopen-logs [OPTIONS]\n"
50
+ opts.separator ""
51
+ opts.separator " Instruct #{PROGRAM_NAME} agent processes to reopen their log files. This"
52
+ opts.separator " should be involved after you've rotated logs. This command returns after"
53
+ opts.separator " the log files have been reopened."
54
+ opts.separator ""
55
55
 
56
- opts.separator "Options:"
57
- opts.on("--ignore-logs-not-available", "Exit successfully if #{PROGRAM_NAME}#{nl}" +
58
- "was not configured with a log file") do
59
- options[:ignore_logs_not_available] = true
60
- end
61
- opts.on("--instance NAME", String, "The #{PROGRAM_NAME} instance to select") do |value|
62
- options[:instance] = value
63
- end
64
- opts.on("-h", "--help", "Show this help") do
65
- options[:help] = true
66
- end
67
- end
68
- end
56
+ opts.separator "Options:"
57
+ opts.on("--ignore-logs-not-available", "Exit successfully if #{PROGRAM_NAME}#{nl}" +
58
+ "was not configured with a log file") do
59
+ options[:ignore_logs_not_available] = true
60
+ end
61
+ opts.on("--instance NAME", String, "The #{PROGRAM_NAME} instance to select") do |value|
62
+ options[:instance] = value
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 perform_reopen_logs
71
- password = obtain_full_admin_password(@instance)
72
- perform_reopen_logs_on("watchdog", "watchdog", password)
73
- perform_reopen_logs_on("server", "server_admin", password)
74
- perform_reopen_logs_on("logger", "logging_admin", password)
75
- puts "All done"
76
- end
70
+ def perform_reopen_logs
71
+ password = obtain_full_admin_password(@instance)
72
+ perform_reopen_logs_on("watchdog", "watchdog", password)
73
+ perform_reopen_logs_on("server", "server_admin", password)
74
+ perform_reopen_logs_on("logger", "logging_admin", password)
75
+ puts "All done"
76
+ end
77
77
 
78
- def perform_reopen_logs_on(name, socket_name, password)
79
- puts "Reopening logs for #{AGENT_EXE} #{name}"
80
- request = Net::HTTP::Post.new("/reopen_logs.json")
81
- request.basic_auth("admin", password)
82
- request.content_type = "application/json"
83
- response = @instance.http_request("agents.s/#{socket_name}", request)
84
- if response["content-type"] == "application/json"
85
- if response.code.to_i / 100 != 2
86
- handle_error(name, response)
87
- end
88
- else
89
- STDERR.puts "*** An error occured while communicating with the #{AGENT_EXE} #{name} (code #{response.code}):"
90
- STDERR.puts response.body
91
- abort
92
- end
93
- end
78
+ def perform_reopen_logs_on(name, socket_name, password)
79
+ puts "Reopening logs for #{AGENT_EXE} #{name}"
80
+ request = Net::HTTP::Post.new("/reopen_logs.json")
81
+ request.basic_auth("admin", password)
82
+ request.content_type = "application/json"
83
+ response = @instance.http_request("agents.s/#{socket_name}", request)
84
+ if response["content-type"] == "application/json"
85
+ if response.code.to_i / 100 != 2
86
+ handle_error(name, response)
87
+ end
88
+ else
89
+ STDERR.puts "*** An error occured while communicating with the #{AGENT_EXE} #{name} (code #{response.code}):"
90
+ STDERR.puts response.body
91
+ abort
92
+ end
93
+ end
94
94
 
95
- def handle_error(name, response)
96
- json = PhusionPassenger::Utils::JSON.parse(response.body)
97
- if !should_ignore_error?(json)
98
- STDERR.puts "*** An error occured while communicating with the #{AGENT_EXE} #{name} (code #{response.code}):"
99
- STDERR.puts json['message']
100
- abort
101
- end
102
- end
95
+ def handle_error(name, response)
96
+ json = PhusionPassenger::Utils::JSON.parse(response.body)
97
+ if !should_ignore_error?(json)
98
+ STDERR.puts "*** An error occured while communicating with the #{AGENT_EXE} #{name} (code #{response.code}):"
99
+ STDERR.puts json['message']
100
+ abort
101
+ end
102
+ end
103
103
 
104
- def should_ignore_error?(json)
105
- return @options[:ignore_logs_not_available] && json["code"] == "NO_LOG_FILE"
106
- end
107
- end
104
+ def should_ignore_error?(json)
105
+ return @options[:ignore_logs_not_available] && json["code"] == "NO_LOG_FILE"
106
+ end
107
+ end
108
108
 
109
- end # module Config
109
+ end # module Config
110
110
  end # module PhusionPassenger
@@ -32,172 +32,172 @@ PhusionPassenger.require_passenger_lib 'config/utils'
32
32
  PhusionPassenger.require_passenger_lib 'utils/json'
33
33
 
34
34
  module PhusionPassenger
35
- module Config
35
+ module Config
36
36
 
37
- class RestartAppCommand < Command
38
- include PhusionPassenger::Config::Utils
37
+ class RestartAppCommand < Command
38
+ include PhusionPassenger::Config::Utils
39
39
 
40
- def run
41
- parse_options
42
- select_passenger_instance
43
- select_app_group_name
44
- perform_restart
45
- end
40
+ def run
41
+ parse_options
42
+ select_passenger_instance
43
+ select_app_group_name
44
+ perform_restart
45
+ end
46
46
 
47
- private
48
- def self.create_option_parser(options)
49
- OptionParser.new do |opts|
50
- nl = "\n" + ' ' * 37
51
- opts.banner =
52
- "Usage 1: passenger-config restart-app <APP PATH PREFIX> [OPTIONS]\n" +
53
- "Usage 2: passenger-config restart-app --name <APP GROUP NAME> [OPTIONS]"
54
- opts.separator ""
55
- opts.separator " Restart an application. The syntax determines how the application that is to"
56
- opts.separator " be restarted, will be selected."
57
- opts.separator ""
58
- opts.separator " 1. Selects all applications whose paths begin with the given prefix."
59
- opts.separator ""
60
- opts.separator " Example: passenger-config restart-app /webapps"
61
- opts.separator " Restarts all apps whose path begin with /webapps, such as /webapps/foo,"
62
- opts.separator " /webapps/bar and /webapps123."
63
- opts.separator ""
64
- opts.separator " 2. Selects a specific application based on an exact match of its app group"
65
- opts.separator " name."
66
- opts.separator ""
67
- opts.separator " Example: passenger-config restart-app --name /webapps/foo"
68
- opts.separator " Restarts only /webapps/foo, but not for example /webapps/foo/bar or"
69
- opts.separator " /webapps/foo123."
70
- opts.separator ""
47
+ private
48
+ def self.create_option_parser(options)
49
+ OptionParser.new do |opts|
50
+ nl = "\n" + ' ' * 37
51
+ opts.banner =
52
+ "Usage 1: passenger-config restart-app <APP PATH PREFIX> [OPTIONS]\n" +
53
+ "Usage 2: passenger-config restart-app --name <APP GROUP NAME> [OPTIONS]"
54
+ opts.separator ""
55
+ opts.separator " Restart an application. The syntax determines how the application that is to"
56
+ opts.separator " be restarted, will be selected."
57
+ opts.separator ""
58
+ opts.separator " 1. Selects all applications whose paths begin with the given prefix."
59
+ opts.separator ""
60
+ opts.separator " Example: passenger-config restart-app /webapps"
61
+ opts.separator " Restarts all apps whose path begin with /webapps, such as /webapps/foo,"
62
+ opts.separator " /webapps/bar and /webapps123."
63
+ opts.separator ""
64
+ opts.separator " 2. Selects a specific application based on an exact match of its app group"
65
+ opts.separator " name."
66
+ opts.separator ""
67
+ opts.separator " Example: passenger-config restart-app --name /webapps/foo"
68
+ opts.separator " Restarts only /webapps/foo, but not for example /webapps/foo/bar or"
69
+ opts.separator " /webapps/foo123."
70
+ opts.separator ""
71
71
 
72
- opts.separator "Options:"
73
- opts.on("--name APP_GROUP_NAME", String, "The app group name to select") do |value|
74
- options[:app_group_name] = value
75
- end
76
- opts.on("--rolling-restart", "Perform a rolling restart instead of a#{nl}" +
77
- "regular restart (Enterprise only). The#{nl}" +
78
- "default is a blocking restart") do |value|
79
- if Config::Utils.is_enterprise?
80
- options[:rolling_restart] = true
81
- else
82
- abort "--rolling-restart is only available in #{PROGRAM_NAME} Enterprise: #{ENTERPRISE_URL}"
83
- end
84
- end
85
- opts.on("--ignore-app-not-running", "Exit successfully if the specified#{nl}" +
86
- "application is not currently running. The#{nl}" +
87
- "default is to exit with an error") do
88
- options[:ignore_app_not_running] = true
89
- end
90
- opts.on("--instance NAME", String, "The #{PROGRAM_NAME} instance to select") do |value|
91
- options[:instance] = value
92
- end
93
- opts.on("-h", "--help", "Show this help") do
94
- options[:help] = true
95
- end
96
- end
97
- end
72
+ opts.separator "Options:"
73
+ opts.on("--name APP_GROUP_NAME", String, "The app group name to select") do |value|
74
+ options[:app_group_name] = value
75
+ end
76
+ opts.on("--rolling-restart", "Perform a rolling restart instead of a#{nl}" +
77
+ "regular restart (Enterprise only). The#{nl}" +
78
+ "default is a blocking restart") do |value|
79
+ if Config::Utils.is_enterprise?
80
+ options[:rolling_restart] = true
81
+ else
82
+ abort "--rolling-restart is only available in #{PROGRAM_NAME} Enterprise: #{ENTERPRISE_URL}"
83
+ end
84
+ end
85
+ opts.on("--ignore-app-not-running", "Exit successfully if the specified#{nl}" +
86
+ "application is not currently running. The#{nl}" +
87
+ "default is to exit with an error") do
88
+ options[:ignore_app_not_running] = true
89
+ end
90
+ opts.on("--instance NAME", String, "The #{PROGRAM_NAME} instance to select") do |value|
91
+ options[:instance] = value
92
+ end
93
+ opts.on("-h", "--help", "Show this help") do
94
+ options[:help] = true
95
+ end
96
+ end
97
+ end
98
98
 
99
- def help
100
- puts @parser
101
- end
99
+ def help
100
+ puts @parser
101
+ end
102
102
 
103
- def parse_options
104
- super
105
- case @argv.size
106
- when 0
107
- if !@options[:app_group_name]
108
- abort "Please pass either an app path prefix or an app group name. " +
109
- "See --help for more information."
110
- end
111
- when 1
112
- if @options[:app_group_name]
113
- abort "You've passed an app path prefix, but you cannot also pass an " +
114
- "app group name. Please use only either one of them. See --help " +
115
- "for more information."
116
- end
117
- else
118
- help
119
- abort
120
- end
121
- end
103
+ def parse_options
104
+ super
105
+ case @argv.size
106
+ when 0
107
+ if !@options[:app_group_name]
108
+ abort "Please pass either an app path prefix or an app group name. " +
109
+ "See --help for more information."
110
+ end
111
+ when 1
112
+ if @options[:app_group_name]
113
+ abort "You've passed an app path prefix, but you cannot also pass an " +
114
+ "app group name. Please use only either one of them. See --help " +
115
+ "for more information."
116
+ end
117
+ else
118
+ help
119
+ abort
120
+ end
121
+ end
122
122
 
123
- def select_app_group_name
124
- @groups = []
125
- if app_group_name = @options[:app_group_name]
126
- select_app_group_name_exact(app_group_name)
127
- else
128
- select_app_group_name_by_app_root_regex(@argv.first)
129
- end
130
- end
123
+ def select_app_group_name
124
+ @groups = []
125
+ if app_group_name = @options[:app_group_name]
126
+ select_app_group_name_exact(app_group_name)
127
+ else
128
+ select_app_group_name_by_app_root_regex(@argv.first)
129
+ end
130
+ end
131
131
 
132
- def select_app_group_name_exact(name)
133
- query_pool_xml.elements.each("info/supergroups/supergroup/group") do |group|
134
- if group.elements["name"].text == name
135
- @groups << group
136
- end
137
- end
138
- if @groups.empty?
139
- abort_app_not_found "There is no #{PROGRAM_NAME}-served application running " +
140
- "with the app group name '#{name}'."
141
- end
142
- end
132
+ def select_app_group_name_exact(name)
133
+ query_pool_xml.elements.each("info/supergroups/supergroup/group") do |group|
134
+ if group.elements["name"].text == name
135
+ @groups << group
136
+ end
137
+ end
138
+ if @groups.empty?
139
+ abort_app_not_found "There is no #{PROGRAM_NAME}-served application running " +
140
+ "with the app group name '#{name}'."
141
+ end
142
+ end
143
143
 
144
- def select_app_group_name_by_app_root_regex(app_root)
145
- regex = /^#{Regexp.escape(app_root)}/
146
- query_pool_xml.elements.each("info/supergroups/supergroup/group") do |group|
147
- if group.elements["app_root"].text =~ regex
148
- @groups << group
149
- end
150
- end
151
- if @groups.empty?
152
- abort_app_not_found "There are no #{PROGRAM_NAME}-served applications running " +
153
- "whose paths begin with '#{app_root}'."
154
- end
155
- end
144
+ def select_app_group_name_by_app_root_regex(app_root)
145
+ regex = /^#{Regexp.escape(app_root)}/
146
+ query_pool_xml.elements.each("info/supergroups/supergroup/group") do |group|
147
+ if group.elements["app_root"].text =~ regex
148
+ @groups << group
149
+ end
150
+ end
151
+ if @groups.empty?
152
+ abort_app_not_found "There are no #{PROGRAM_NAME}-served applications running " +
153
+ "whose paths begin with '#{app_root}'."
154
+ end
155
+ end
156
156
 
157
- def perform_restart
158
- restart_method = @options[:rolling_restart] ? "rolling" : "blocking"
159
- @groups.each do |group|
160
- group_name = group.elements["name"].text
161
- puts "Restarting #{group_name}"
162
- request = Net::HTTP::Post.new("/pool/restart_app_group.json")
163
- request.basic_auth("admin", obtain_full_admin_password(@instance))
164
- request.content_type = "application/json"
165
- request.body = PhusionPassenger::Utils::JSON.generate(
166
- :name => group_name,
167
- :method => restart_method)
168
- response = @instance.http_request("agents.s/server_admin", request)
169
- if response.code.to_i / 100 == 2
170
- return REXML::Document.new(response.body)
171
- else
172
- STDERR.puts "*** An error occured while communicating with the #{PROGRAM_NAME} server:"
173
- STDERR.puts response.body
174
- abort
175
- end
176
- end
177
- end
157
+ def perform_restart
158
+ restart_method = @options[:rolling_restart] ? "rolling" : "blocking"
159
+ @groups.each do |group|
160
+ group_name = group.elements["name"].text
161
+ puts "Restarting #{group_name}"
162
+ request = Net::HTTP::Post.new("/pool/restart_app_group.json")
163
+ request.basic_auth("admin", obtain_full_admin_password(@instance))
164
+ request.content_type = "application/json"
165
+ request.body = PhusionPassenger::Utils::JSON.generate(
166
+ :name => group_name,
167
+ :method => restart_method)
168
+ response = @instance.http_request("agents.s/server_admin", request)
169
+ if response.code.to_i / 100 == 2
170
+ return REXML::Document.new(response.body)
171
+ else
172
+ STDERR.puts "*** An error occured while communicating with the #{PROGRAM_NAME} server:"
173
+ STDERR.puts response.body
174
+ abort
175
+ end
176
+ end
177
+ end
178
178
 
179
- def abort_app_not_found(message)
180
- if @options[:ignore_app_not_running]
181
- STDERR.puts(message)
182
- exit
183
- else
184
- abort(message)
185
- end
186
- end
179
+ def abort_app_not_found(message)
180
+ if @options[:ignore_app_not_running]
181
+ STDERR.puts(message)
182
+ exit
183
+ else
184
+ abort(message)
185
+ end
186
+ end
187
187
 
188
- def query_pool_xml
189
- request = Net::HTTP::Get.new("/pool.xml")
190
- request.basic_auth("ro_admin", obtain_read_only_admin_password(@instance))
191
- response = @instance.http_request("agents.s/server_admin", request)
192
- if response.code.to_i / 100 == 2
193
- return REXML::Document.new(response.body)
194
- else
195
- STDERR.puts "*** An error occured while querying the #{PROGRAM_NAME} server:"
196
- STDERR.puts response.body
197
- abort
198
- end
199
- end
200
- end
188
+ def query_pool_xml
189
+ request = Net::HTTP::Get.new("/pool.xml")
190
+ request.basic_auth("ro_admin", obtain_read_only_admin_password(@instance))
191
+ response = @instance.http_request("agents.s/server_admin", request)
192
+ if response.code.to_i / 100 == 2
193
+ return REXML::Document.new(response.body)
194
+ else
195
+ STDERR.puts "*** An error occured while querying the #{PROGRAM_NAME} server:"
196
+ STDERR.puts response.body
197
+ abort
198
+ end
199
+ end
200
+ end
201
201
 
202
- end # module Config
202
+ end # module Config
203
203
  end # module PhusionPassenger