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
@@ -29,76 +29,76 @@ PhusionPassenger.require_passenger_lib 'standalone/control_utils'
29
29
  PhusionPassenger.require_passenger_lib 'ruby_core_enhancements'
30
30
 
31
31
  module PhusionPassenger
32
- module Standalone
32
+ module Standalone
33
33
 
34
- class StatusCommand < Command
35
- def run
36
- @options = { :port => 3000 }
37
- parse_options
38
- find_pid_file
39
- create_controller
40
- begin
41
- running = @controller.running?
42
- pid = @controller.pid
43
- rescue SystemCallError, IOError
44
- running = false
45
- end
46
- if running
47
- puts "#{PROGRAM_NAME} Standalone is running on PID #{pid}, according to PID file #{@options[:pid_file]}"
48
- else
49
- puts "#{PROGRAM_NAME} Standalone is not running, according to PID file #{@options[:pid_file]}"
50
- end
51
- end
34
+ class StatusCommand < Command
35
+ def run
36
+ @options = { :port => 3000 }
37
+ parse_options
38
+ find_pid_file
39
+ create_controller
40
+ begin
41
+ running = @controller.running?
42
+ pid = @controller.pid
43
+ rescue SystemCallError, IOError
44
+ running = false
45
+ end
46
+ if running
47
+ puts "#{PROGRAM_NAME} Standalone is running on PID #{pid}, according to PID file #{@options[:pid_file]}"
48
+ else
49
+ puts "#{PROGRAM_NAME} Standalone is not running, according to PID file #{@options[:pid_file]}"
50
+ end
51
+ end
52
52
 
53
- private
54
- def self.create_option_parser(options)
55
- OptionParser.new do |opts|
56
- nl = "\n" + ' ' * 37
57
- opts.banner = "Usage: passenger status [OPTIONS]\n"
58
- opts.separator "Shows the status of a running #{PROGRAM_NAME} Standalone instance."
59
- opts.separator ""
53
+ private
54
+ def self.create_option_parser(options)
55
+ OptionParser.new do |opts|
56
+ nl = "\n" + ' ' * 37
57
+ opts.banner = "Usage: passenger status [OPTIONS]\n"
58
+ opts.separator "Shows the status of a running #{PROGRAM_NAME} Standalone instance."
59
+ opts.separator ""
60
60
 
61
- opts.separator "Options:"
62
- opts.on("-p", "--port NUMBER", Integer,
63
- "The port number of the #{PROGRAM_NAME}#{nl}" +
64
- "instance. Default: 3000") do |value|
65
- options[:port] = value
66
- end
67
- opts.on("--pid-file FILE", String,
68
- "PID file of the running #{PROGRAM_NAME}#{nl}" +
69
- "Standalone instance") do |value|
70
- options[:pid_file] = value
71
- end
72
- end
73
- end
61
+ opts.separator "Options:"
62
+ opts.on("-p", "--port NUMBER", Integer,
63
+ "The port number of the #{PROGRAM_NAME}#{nl}" +
64
+ "instance. Default: 3000") do |value|
65
+ options[:port] = value
66
+ end
67
+ opts.on("--pid-file FILE", String,
68
+ "PID file of the running #{PROGRAM_NAME}#{nl}" +
69
+ "Standalone instance") do |value|
70
+ options[:pid_file] = value
71
+ end
72
+ end
73
+ end
74
74
 
75
- def find_pid_file
76
- return if @options[:pid_file]
75
+ def find_pid_file
76
+ return if @options[:pid_file]
77
77
 
78
- ["tmp/pids", "."].each do |dir|
79
- path = File.absolute_path_no_resolve("#{dir}/passenger.#{@options[:port]}.pid")
80
- if File.exist?(path)
81
- @options[:pid_file] = path
82
- return
83
- end
84
- end
78
+ ["tmp/pids", "."].each do |dir|
79
+ path = File.absolute_path_no_resolve("#{dir}/passenger.#{@options[:port]}.pid")
80
+ if File.exist?(path)
81
+ @options[:pid_file] = path
82
+ return
83
+ end
84
+ end
85
85
 
86
- Standalone::ControlUtils.warn_pid_file_not_found(@options)
87
- exit 1
88
- end
86
+ Standalone::ControlUtils.warn_pid_file_not_found(@options)
87
+ exit 1
88
+ end
89
89
 
90
- def create_controller
91
- Standalone::ControlUtils.require_daemon_controller
92
- @controller = DaemonController.new(
93
- :identifier => "#{PROGRAM_NAME} Standalone engine",
94
- :start_command => "true", # Doesn't matter
95
- :ping_command => "true", # Doesn't matter
96
- :pid_file => @options[:pid_file],
97
- :log_file => "/dev/null",
98
- :timeout => 25
99
- )
100
- end
101
- end
90
+ def create_controller
91
+ Standalone::ControlUtils.require_daemon_controller
92
+ @controller = DaemonController.new(
93
+ :identifier => "#{PROGRAM_NAME} Standalone engine",
94
+ :start_command => "true", # Doesn't matter
95
+ :ping_command => "true", # Doesn't matter
96
+ :pid_file => @options[:pid_file],
97
+ :log_file => "/dev/null",
98
+ :timeout => 25
99
+ )
100
+ end
101
+ end
102
102
 
103
- end
103
+ end
104
104
  end
@@ -29,84 +29,84 @@ PhusionPassenger.require_passenger_lib 'standalone/control_utils'
29
29
  PhusionPassenger.require_passenger_lib 'ruby_core_enhancements'
30
30
 
31
31
  module PhusionPassenger
32
- module Standalone
32
+ module Standalone
33
33
 
34
- class StopCommand < Command
35
- def run
36
- @options = { :port => 3000 }
37
- parse_options
38
- find_pid_file
39
- create_controller
40
- begin
41
- running = @controller.running?
42
- rescue SystemCallError, IOError
43
- running = false
44
- end
45
- if running
46
- @controller.stop
47
- else
48
- Standalone::ControlUtils.warn_pid_file_not_found(@options)
49
- exit 1
50
- end
51
- end
34
+ class StopCommand < Command
35
+ def run
36
+ @options = { :port => 3000 }
37
+ parse_options
38
+ find_pid_file
39
+ create_controller
40
+ begin
41
+ running = @controller.running?
42
+ rescue SystemCallError, IOError
43
+ running = false
44
+ end
45
+ if running
46
+ @controller.stop
47
+ else
48
+ Standalone::ControlUtils.warn_pid_file_not_found(@options)
49
+ exit 1
50
+ end
51
+ end
52
52
 
53
- private
54
- def self.create_option_parser(options)
55
- OptionParser.new do |opts|
56
- nl = "\n" + ' ' * 37
57
- opts.banner = "Usage: passenger stop [OPTIONS]\n"
58
- opts.separator "Stops a running #{PROGRAM_NAME} Standalone instance."
59
- opts.separator ""
53
+ private
54
+ def self.create_option_parser(options)
55
+ OptionParser.new do |opts|
56
+ nl = "\n" + ' ' * 37
57
+ opts.banner = "Usage: passenger stop [OPTIONS]\n"
58
+ opts.separator "Stops a running #{PROGRAM_NAME} Standalone instance."
59
+ opts.separator ""
60
60
 
61
- opts.separator "Options:"
62
- opts.on("-p", "--port NUMBER", Integer,
63
- "The port number of the #{PROGRAM_NAME}#{nl}" +
64
- "instance. Default: 3000") do |value|
65
- options[:port] = value
66
- end
67
- opts.on("--pid-file FILE", String,
68
- "PID file of the running #{PROGRAM_NAME}#{nl}" +
69
- "Standalone instance") do |value|
70
- options[:pid_file] = value
71
- end
72
- opts.on("--ignore-pid-not-found", "-i",
73
- "Don't abort with an error if PID file cannot be found") do
74
- options[:ignore_pid_not_found] = true
75
- end
76
- end
77
- end
61
+ opts.separator "Options:"
62
+ opts.on("-p", "--port NUMBER", Integer,
63
+ "The port number of the #{PROGRAM_NAME}#{nl}" +
64
+ "instance. Default: 3000") do |value|
65
+ options[:port] = value
66
+ end
67
+ opts.on("--pid-file FILE", String,
68
+ "PID file of the running #{PROGRAM_NAME}#{nl}" +
69
+ "Standalone instance") do |value|
70
+ options[:pid_file] = value
71
+ end
72
+ opts.on("--ignore-pid-not-found", "-i",
73
+ "Don't abort with an error if PID file cannot be found") do
74
+ options[:ignore_pid_not_found] = true
75
+ end
76
+ end
77
+ end
78
78
 
79
- def find_pid_file
80
- return if @options[:pid_file]
79
+ def find_pid_file
80
+ return if @options[:pid_file]
81
81
 
82
- ["tmp/pids", "."].each do |dir|
83
- path = File.absolute_path_no_resolve("#{dir}/passenger.#{@options[:port]}.pid")
84
- if File.exist?(path)
85
- @options[:pid_file] = path
86
- return
87
- end
88
- end
82
+ ["tmp/pids", "."].each do |dir|
83
+ path = File.absolute_path_no_resolve("#{dir}/passenger.#{@options[:port]}.pid")
84
+ if File.exist?(path)
85
+ @options[:pid_file] = path
86
+ return
87
+ end
88
+ end
89
89
 
90
- if @options[:ignore_pid_not_found]
91
- exit
92
- else
93
- Standalone::ControlUtils.warn_pid_file_not_found(@options)
94
- exit 1
95
- end
96
- end
90
+ if @options[:ignore_pid_not_found]
91
+ exit
92
+ else
93
+ Standalone::ControlUtils.warn_pid_file_not_found(@options)
94
+ exit 1
95
+ end
96
+ end
97
97
 
98
- def create_controller
99
- Standalone::ControlUtils.require_daemon_controller
100
- @controller = DaemonController.new(
101
- :identifier => "#{PROGRAM_NAME} Standalone engine",
102
- :start_command => "true", # Doesn't matter
103
- :ping_command => "true", # Doesn't matter
104
- :pid_file => @options[:pid_file],
105
- :log_file => "/dev/null",
106
- :timeout => 25
107
- )
108
- end
109
- end
98
+ def create_controller
99
+ Standalone::ControlUtils.require_daemon_controller
100
+ @controller = DaemonController.new(
101
+ :identifier => "#{PROGRAM_NAME} Standalone engine",
102
+ :start_command => "true", # Doesn't matter
103
+ :ping_command => "true", # Doesn't matter
104
+ :pid_file => @options[:pid_file],
105
+ :log_file => "/dev/null",
106
+ :timeout => 25
107
+ )
108
+ end
109
+ end
110
110
 
111
- end
111
+ end
112
112
  end
@@ -23,15 +23,15 @@
23
23
  PhusionPassenger.require_passenger_lib 'standalone/command'
24
24
 
25
25
  module PhusionPassenger
26
- module Standalone
26
+ module Standalone
27
27
 
28
- class VersionCommand < Command
29
- def run
30
- puts "Phusion Passenger version #{VERSION_STRING}"
31
- puts
32
- puts '"Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.'
33
- end
34
- end
28
+ class VersionCommand < Command
29
+ def run
30
+ puts "Phusion Passenger version #{VERSION_STRING}"
31
+ puts
32
+ puts '"Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.'
33
+ end
34
+ end
35
35
 
36
- end
36
+ end
37
37
  end
@@ -24,44 +24,44 @@
24
24
  PhusionPassenger.require_passenger_lib 'message_channel'
25
25
 
26
26
  module PhusionPassenger
27
- module UnionStation
27
+ module UnionStation
28
28
 
29
- class Connection
30
- attr_reader :mutex
31
- attr_accessor :channel
29
+ class Connection
30
+ attr_reader :mutex
31
+ attr_accessor :channel
32
32
 
33
- def initialize(io)
34
- @mutex = Mutex.new
35
- @refcount = 1
36
- @channel = MessageChannel.new(io) if io
37
- end
33
+ def initialize(io)
34
+ @mutex = Mutex.new
35
+ @refcount = 1
36
+ @channel = MessageChannel.new(io) if io
37
+ end
38
38
 
39
- def connected?
40
- return !!@channel
41
- end
39
+ def connected?
40
+ return !!@channel
41
+ end
42
42
 
43
- def disconnect
44
- @channel.close if @channel
45
- @channel = nil
46
- end
43
+ def disconnect
44
+ @channel.close if @channel
45
+ @channel = nil
46
+ end
47
47
 
48
- def ref
49
- @refcount += 1
50
- end
48
+ def ref
49
+ @refcount += 1
50
+ end
51
51
 
52
- def unref
53
- @refcount -= 1
54
- if @refcount == 0
55
- disconnect
56
- end
57
- end
52
+ def unref
53
+ @refcount -= 1
54
+ if @refcount == 0
55
+ disconnect
56
+ end
57
+ end
58
58
 
59
- def synchronize
60
- @mutex.synchronize do
61
- yield
62
- end
63
- end
64
- end
59
+ def synchronize
60
+ @mutex.synchronize do
61
+ yield
62
+ end
63
+ end
64
+ end
65
65
 
66
- end # module UnionStation
66
+ end # module UnionStation
67
67
  end # module PhusionPassenger
@@ -29,255 +29,255 @@ PhusionPassenger.require_passenger_lib 'utils/lock'
29
29
  PhusionPassenger.require_passenger_lib 'debug_logging'
30
30
 
31
31
  module PhusionPassenger
32
- module UnionStation
33
-
34
- class Core
35
- RETRY_SLEEP = 0.2
36
- NETWORK_ERRORS = [Errno::EPIPE, Errno::ECONNREFUSED, Errno::ECONNRESET,
37
- Errno::EHOSTUNREACH, Errno::ENETDOWN, Errno::ENETUNREACH, Errno::ETIMEDOUT]
38
-
39
- include Utils
40
- include DebugLogging
41
-
42
- def self.new_from_options(options)
43
- if options["analytics"] && options["logging_agent_address"]
44
- return new(options["logging_agent_address"],
45
- options["logging_agent_username"],
46
- options["logging_agent_password"],
47
- options["node_name"])
48
- else
49
- return nil
50
- end
51
- end
52
-
53
- attr_accessor :max_connect_tries
54
- attr_accessor :reconnect_timeout
55
-
56
- def initialize(logging_agent_address, username, password, node_name)
57
- @server_address = logging_agent_address
58
- @username = username
59
- @password = password
60
- if node_name && !node_name.empty?
61
- @node_name = node_name
62
- else
63
- @node_name = `hostname`.strip
64
- end
65
- @random_dev = File.open("/dev/urandom")
66
-
67
- # This mutex protects the following instance variables, but
68
- # not the contents of @connection.
69
- @mutex = Mutex.new
70
-
71
- @connection = Connection.new(nil)
72
- if @server_address && local_socket_address?(@server_address)
73
- @max_connect_tries = 10
74
- else
75
- @max_connect_tries = 1
76
- end
77
- @reconnect_timeout = 1
78
- @next_reconnect_time = Time.utc(1980, 1, 1)
79
- end
80
-
81
- def clear_connection
82
- @mutex.synchronize do
83
- @connection.synchronize do
84
- @random_dev = File.open("/dev/urandom") if @random_dev.closed?
85
- @connection.unref
86
- @connection = Connection.new(nil)
87
- end
88
- end
89
- end
90
-
91
- def close
92
- @mutex.synchronize do
93
- @connection.synchronize do
94
- @random_dev.close
95
- @connection.unref
96
- @connection = nil
97
- end
98
- end
99
- end
100
-
101
- def new_transaction(group_name, category = :requests, union_station_key = "-")
102
- if !@server_address
103
- return Transaction.new
104
- elsif !group_name || group_name.empty?
105
- raise ArgumentError, "Group name may not be empty"
106
- end
107
-
108
- txn_id = (Core.current_time.to_i / 60).to_s(36)
109
- txn_id << "-#{random_token(11)}"
110
-
111
- Utils::Lock.new(@mutex).synchronize do |lock|
112
- if current_time < @next_reconnect_time
113
- return Transaction.new
114
- end
115
-
116
- Utils::Lock.new(@connection.mutex).synchronize do |connection_lock|
117
- if !@connection.connected?
118
- begin
119
- connect
120
- connection_lock.reset(@connection.mutex)
121
- rescue SystemCallError, IOError
122
- @connection.disconnect
123
- warn("Cannot connect to the logging agent at #{@server_address}; " +
124
- "retrying in #{@reconnect_timeout} second(s).")
125
- @next_reconnect_time = current_time + @reconnect_timeout
126
- return Transaction.new
127
- rescue Exception => e
128
- @connection.disconnect
129
- raise e
130
- end
131
- end
132
-
133
- begin
134
- @connection.channel.write("openTransaction",
135
- txn_id, group_name, "", category,
136
- Core.timestamp_string,
137
- union_station_key,
138
- true,
139
- true)
140
- result = @connection.channel.read
141
- if result != ["ok"]
142
- raise "Expected logging server to respond with 'ok', but got #{result.inspect} instead"
143
- end
144
- return Transaction.new(@connection, txn_id)
145
- rescue SystemCallError, IOError
146
- @connection.disconnect
147
- warn("The logging agent at #{@server_address}" <<
148
- " closed the connection; will reconnect in " <<
149
- "#{@reconnect_timeout} second(s).")
150
- @next_reconnect_time = current_time + @reconnect_timeout
151
- return Transaction.new
152
- rescue Exception => e
153
- @connection.disconnect
154
- raise e
155
- end
156
- end
157
- end
158
- end
159
-
160
- def continue_transaction(txn_id, group_name, category = :requests, union_station_key = "-")
161
- if !@server_address
162
- return Transaction.new
163
- elsif !txn_id || txn_id.empty?
164
- raise ArgumentError, "Transaction ID may not be empty"
165
- end
166
-
167
- Utils::Lock.new(@mutex).synchronize do |lock|
168
- if current_time < @next_reconnect_time
169
- return Transaction.new
170
- end
171
-
172
- Utils::Lock.new(@connection.mutex).synchronize do |connection_lock|
173
- if !@connection.connected?
174
- begin
175
- connect
176
- connection_lock.reset(@connection.mutex)
177
- rescue SystemCallError, IOError
178
- @connection.disconnect
179
- warn("Cannot connect to the logging agent at #{@server_address}; " +
180
- "retrying in #{@reconnect_timeout} second(s).")
181
- @next_reconnect_time = current_time + @reconnect_timeout
182
- return Transaction.new
183
- rescue Exception => e
184
- @connection.disconnect
185
- raise e
186
- end
187
- end
188
-
189
- begin
190
- @connection.channel.write("openTransaction",
191
- txn_id, group_name, "", category,
192
- Core.timestamp_string,
193
- union_station_key,
194
- true)
195
- return Transaction.new(@connection, txn_id)
196
- rescue SystemCallError, IOError
197
- @connection.disconnect
198
- warn("The logging agent at #{@server_address}" <<
199
- " closed the connection; will reconnect in " <<
200
- "#{@reconnect_timeout} second(s).")
201
- @next_reconnect_time = current_time + @reconnect_timeout
202
- return Transaction.new
203
- rescue Exception => e
204
- @connection.disconnect
205
- raise e
206
- end
207
- end
208
- end
209
- end
210
-
211
- private
212
- RANDOM_CHARS = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
213
- 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
214
- 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
215
- 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
216
- '0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
217
-
218
- def connect
219
- socket = connect_to_server(@server_address)
220
- channel = MessageChannel.new(socket)
221
-
222
- result = channel.read
223
- if result.nil?
224
- raise EOFError
225
- elsif result.size != 2 || result[0] != "version"
226
- raise IOError, "The logging agent didn't sent a valid version identifier"
227
- elsif result[1] != "1"
228
- raise IOError, "Unsupported logging agent protocol version #{result[1]}"
229
- end
230
-
231
- channel.write_scalar(@username)
232
- channel.write_scalar(@password)
233
-
234
- result = channel.read
235
- if result.nil?
236
- raise EOFError
237
- elsif result[0] != "ok"
238
- raise SecurityError, result[0]
239
- end
240
-
241
- channel.write("init", @node_name)
242
- args = channel.read
243
- if !args
244
- raise Errno::ECONNREFUSED, "Cannot connect to logging agent"
245
- elsif args.size != 1
246
- raise IOError, "Logging agent returned an invalid reply for the 'init' command"
247
- elsif args[0] == "server shutting down"
248
- raise Errno::ECONNREFUSED, "Cannot connect to logging agent"
249
- elsif args[0] != "ok"
250
- raise IOError, "Logging agent returned an invalid reply for the 'init' command"
251
- end
252
-
253
- @connection.unref
254
- @connection = Connection.new(socket)
255
- rescue Exception => e
256
- socket.close if socket && !socket.closed?
257
- raise e
258
- end
259
-
260
- def random_token(length)
261
- token = ""
262
- @random_dev.read(length).each_byte do |c|
263
- token << RANDOM_CHARS[c % RANDOM_CHARS.size]
264
- end
265
- return token
266
- end
267
-
268
- def current_time
269
- return self.class.current_time
270
- end
271
-
272
- def self.current_time
273
- return Time.now
274
- end
275
-
276
- def self.timestamp_string(time = current_time)
277
- timestamp = time.to_i * 1_000_000 + time.usec
278
- return timestamp.to_s(36)
279
- end
280
- end
281
-
282
- end # module UnionStation
32
+ module UnionStation
33
+
34
+ class Core
35
+ RETRY_SLEEP = 0.2
36
+ NETWORK_ERRORS = [Errno::EPIPE, Errno::ECONNREFUSED, Errno::ECONNRESET,
37
+ Errno::EHOSTUNREACH, Errno::ENETDOWN, Errno::ENETUNREACH, Errno::ETIMEDOUT]
38
+
39
+ include Utils
40
+ include DebugLogging
41
+
42
+ def self.new_from_options(options)
43
+ if options["analytics"] && options["logging_agent_address"]
44
+ return new(options["logging_agent_address"],
45
+ options["logging_agent_username"],
46
+ options["logging_agent_password"],
47
+ options["node_name"])
48
+ else
49
+ return nil
50
+ end
51
+ end
52
+
53
+ attr_accessor :max_connect_tries
54
+ attr_accessor :reconnect_timeout
55
+
56
+ def initialize(logging_agent_address, username, password, node_name)
57
+ @server_address = logging_agent_address
58
+ @username = username
59
+ @password = password
60
+ if node_name && !node_name.empty?
61
+ @node_name = node_name
62
+ else
63
+ @node_name = `hostname`.strip
64
+ end
65
+ @random_dev = File.open("/dev/urandom")
66
+
67
+ # This mutex protects the following instance variables, but
68
+ # not the contents of @connection.
69
+ @mutex = Mutex.new
70
+
71
+ @connection = Connection.new(nil)
72
+ if @server_address && local_socket_address?(@server_address)
73
+ @max_connect_tries = 10
74
+ else
75
+ @max_connect_tries = 1
76
+ end
77
+ @reconnect_timeout = 1
78
+ @next_reconnect_time = Time.utc(1980, 1, 1)
79
+ end
80
+
81
+ def clear_connection
82
+ @mutex.synchronize do
83
+ @connection.synchronize do
84
+ @random_dev = File.open("/dev/urandom") if @random_dev.closed?
85
+ @connection.unref
86
+ @connection = Connection.new(nil)
87
+ end
88
+ end
89
+ end
90
+
91
+ def close
92
+ @mutex.synchronize do
93
+ @connection.synchronize do
94
+ @random_dev.close
95
+ @connection.unref
96
+ @connection = nil
97
+ end
98
+ end
99
+ end
100
+
101
+ def new_transaction(group_name, category = :requests, union_station_key = "-")
102
+ if !@server_address
103
+ return Transaction.new
104
+ elsif !group_name || group_name.empty?
105
+ raise ArgumentError, "Group name may not be empty"
106
+ end
107
+
108
+ txn_id = (Core.current_time.to_i / 60).to_s(36)
109
+ txn_id << "-#{random_token(11)}"
110
+
111
+ Utils::Lock.new(@mutex).synchronize do |lock|
112
+ if current_time < @next_reconnect_time
113
+ return Transaction.new
114
+ end
115
+
116
+ Utils::Lock.new(@connection.mutex).synchronize do |connection_lock|
117
+ if !@connection.connected?
118
+ begin
119
+ connect
120
+ connection_lock.reset(@connection.mutex)
121
+ rescue SystemCallError, IOError
122
+ @connection.disconnect
123
+ warn("Cannot connect to the logging agent at #{@server_address}; " +
124
+ "retrying in #{@reconnect_timeout} second(s).")
125
+ @next_reconnect_time = current_time + @reconnect_timeout
126
+ return Transaction.new
127
+ rescue Exception => e
128
+ @connection.disconnect
129
+ raise e
130
+ end
131
+ end
132
+
133
+ begin
134
+ @connection.channel.write("openTransaction",
135
+ txn_id, group_name, "", category,
136
+ Core.timestamp_string,
137
+ union_station_key,
138
+ true,
139
+ true)
140
+ result = @connection.channel.read
141
+ if result != ["ok"]
142
+ raise "Expected logging server to respond with 'ok', but got #{result.inspect} instead"
143
+ end
144
+ return Transaction.new(@connection, txn_id)
145
+ rescue SystemCallError, IOError
146
+ @connection.disconnect
147
+ warn("The logging agent at #{@server_address}" <<
148
+ " closed the connection; will reconnect in " <<
149
+ "#{@reconnect_timeout} second(s).")
150
+ @next_reconnect_time = current_time + @reconnect_timeout
151
+ return Transaction.new
152
+ rescue Exception => e
153
+ @connection.disconnect
154
+ raise e
155
+ end
156
+ end
157
+ end
158
+ end
159
+
160
+ def continue_transaction(txn_id, group_name, category = :requests, union_station_key = "-")
161
+ if !@server_address
162
+ return Transaction.new
163
+ elsif !txn_id || txn_id.empty?
164
+ raise ArgumentError, "Transaction ID may not be empty"
165
+ end
166
+
167
+ Utils::Lock.new(@mutex).synchronize do |lock|
168
+ if current_time < @next_reconnect_time
169
+ return Transaction.new
170
+ end
171
+
172
+ Utils::Lock.new(@connection.mutex).synchronize do |connection_lock|
173
+ if !@connection.connected?
174
+ begin
175
+ connect
176
+ connection_lock.reset(@connection.mutex)
177
+ rescue SystemCallError, IOError
178
+ @connection.disconnect
179
+ warn("Cannot connect to the logging agent at #{@server_address}; " +
180
+ "retrying in #{@reconnect_timeout} second(s).")
181
+ @next_reconnect_time = current_time + @reconnect_timeout
182
+ return Transaction.new
183
+ rescue Exception => e
184
+ @connection.disconnect
185
+ raise e
186
+ end
187
+ end
188
+
189
+ begin
190
+ @connection.channel.write("openTransaction",
191
+ txn_id, group_name, "", category,
192
+ Core.timestamp_string,
193
+ union_station_key,
194
+ true)
195
+ return Transaction.new(@connection, txn_id)
196
+ rescue SystemCallError, IOError
197
+ @connection.disconnect
198
+ warn("The logging agent at #{@server_address}" <<
199
+ " closed the connection; will reconnect in " <<
200
+ "#{@reconnect_timeout} second(s).")
201
+ @next_reconnect_time = current_time + @reconnect_timeout
202
+ return Transaction.new
203
+ rescue Exception => e
204
+ @connection.disconnect
205
+ raise e
206
+ end
207
+ end
208
+ end
209
+ end
210
+
211
+ private
212
+ RANDOM_CHARS = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
213
+ 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
214
+ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
215
+ 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
216
+ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
217
+
218
+ def connect
219
+ socket = connect_to_server(@server_address)
220
+ channel = MessageChannel.new(socket)
221
+
222
+ result = channel.read
223
+ if result.nil?
224
+ raise EOFError
225
+ elsif result.size != 2 || result[0] != "version"
226
+ raise IOError, "The logging agent didn't sent a valid version identifier"
227
+ elsif result[1] != "1"
228
+ raise IOError, "Unsupported logging agent protocol version #{result[1]}"
229
+ end
230
+
231
+ channel.write_scalar(@username)
232
+ channel.write_scalar(@password)
233
+
234
+ result = channel.read
235
+ if result.nil?
236
+ raise EOFError
237
+ elsif result[0] != "ok"
238
+ raise SecurityError, result[0]
239
+ end
240
+
241
+ channel.write("init", @node_name)
242
+ args = channel.read
243
+ if !args
244
+ raise Errno::ECONNREFUSED, "Cannot connect to logging agent"
245
+ elsif args.size != 1
246
+ raise IOError, "Logging agent returned an invalid reply for the 'init' command"
247
+ elsif args[0] == "server shutting down"
248
+ raise Errno::ECONNREFUSED, "Cannot connect to logging agent"
249
+ elsif args[0] != "ok"
250
+ raise IOError, "Logging agent returned an invalid reply for the 'init' command"
251
+ end
252
+
253
+ @connection.unref
254
+ @connection = Connection.new(socket)
255
+ rescue Exception => e
256
+ socket.close if socket && !socket.closed?
257
+ raise e
258
+ end
259
+
260
+ def random_token(length)
261
+ token = ""
262
+ @random_dev.read(length).each_byte do |c|
263
+ token << RANDOM_CHARS[c % RANDOM_CHARS.size]
264
+ end
265
+ return token
266
+ end
267
+
268
+ def current_time
269
+ return self.class.current_time
270
+ end
271
+
272
+ def self.current_time
273
+ return Time.now
274
+ end
275
+
276
+ def self.timestamp_string(time = current_time)
277
+ timestamp = time.to_i * 1_000_000 + time.usec
278
+ return timestamp.to_s(36)
279
+ end
280
+ end
281
+
282
+ end # module UnionStation
283
283
  end # module PhusionPassenger