passenger 4.0.60 → 5.0.0.beta1

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 (1301) hide show
  1. checksums.yaml +8 -8
  2. checksums.yaml.gz.asc +7 -7
  3. data.tar.gz.asc +7 -7
  4. data/.editorconfig +5 -0
  5. data/.travis.yml +3 -2
  6. data/CHANGELOG +31 -53
  7. data/CONTRIBUTING.md +4 -4
  8. data/CONTRIBUTORS +0 -1
  9. data/Gemfile +18 -0
  10. data/Gemfile.lock +41 -0
  11. data/Rakefile +16 -0
  12. data/bin/passenger +2 -2
  13. data/bin/passenger-install-apache2-module +12 -12
  14. data/bin/passenger-install-nginx-module +9 -14
  15. data/bin/passenger-status +125 -87
  16. data/build/agents.rb +112 -140
  17. data/build/apache2.rb +4 -9
  18. data/build/basics.rb +5 -3
  19. data/build/common_library.rb +1 -0
  20. data/build/cxx_tests.rb +69 -47
  21. data/build/debian.rb +4 -2
  22. data/build/documentation.rb +1 -0
  23. data/build/integration_tests.rb +28 -43
  24. data/build/misc.rb +0 -18
  25. data/build/nginx.rb +2 -6
  26. data/build/packaging.rb +33 -22
  27. data/build/preprocessor.rb +2 -4
  28. data/build/ruby_tests.rb +7 -26
  29. data/build/test_basics.rb +24 -25
  30. data/debian.template/control.template +2 -2
  31. data/debian.template/locations.ini.template +2 -3
  32. data/debian.template/passenger.install.template +2 -2
  33. data/debian.template/rules.template +1 -1
  34. data/dev/ci/run_jenkins.sh +0 -1
  35. data/dev/ci/run_rpm_tests.sh +3 -0
  36. data/dev/ci/run_travis.sh +63 -17
  37. data/dev/copy_boost_headers +22 -6
  38. data/dev/ruby_server.rb +244 -0
  39. data/dev/vagrant/provision.sh +3 -1
  40. data/doc/DebuggingAndStressTesting.md +3 -3
  41. data/doc/Design and Architecture.txt +5 -6
  42. data/doc/Packaging.txt.md +35 -6
  43. data/doc/ServerOptimizationGuide.txt.md +339 -0
  44. data/doc/Users guide Apache.idmap.txt +177 -187
  45. data/doc/Users guide Apache.txt +143 -219
  46. data/doc/Users guide Nginx.idmap.txt +166 -166
  47. data/doc/Users guide Nginx.txt +265 -223
  48. data/doc/Users guide Standalone.txt +3 -3
  49. data/doc/templates/markdown.html.erb +37 -6
  50. data/doc/users_guide_snippets/environment_variables.txt +1 -1
  51. data/doc/users_guide_snippets/support_information.txt +1 -1
  52. data/doc/users_guide_snippets/tips.txt +2 -2
  53. data/ext/apache2/Configuration.cpp +23 -81
  54. data/ext/apache2/Configuration.hpp +18 -92
  55. data/ext/apache2/ConfigurationCommands.cpp +64 -15
  56. data/ext/apache2/ConfigurationCommands.cpp.erb +8 -4
  57. data/ext/apache2/ConfigurationFields.hpp +12 -0
  58. data/ext/apache2/ConfigurationSetters.cpp +73 -1
  59. data/ext/apache2/ConfigurationSetters.cpp.erb +3 -2
  60. data/ext/apache2/CreateDirConfig.cpp +6 -0
  61. data/ext/apache2/DirectoryMapper.h +11 -6
  62. data/ext/apache2/Hooks.cpp +291 -408
  63. data/ext/apache2/MergeDirConfig.cpp +42 -0
  64. data/ext/apache2/SetHeaders.cpp +61 -16
  65. data/ext/apache2/SetHeaders.cpp.erb +9 -7
  66. data/ext/boost/container/allocator_traits.hpp +400 -0
  67. data/ext/boost/container/deque.hpp +2012 -0
  68. data/ext/boost/container/detail/adaptive_node_pool_impl.hpp +874 -0
  69. data/ext/boost/container/detail/advanced_insert_int.hpp +369 -0
  70. data/ext/boost/container/detail/algorithms.hpp +84 -0
  71. data/ext/boost/container/detail/allocation_type.hpp +54 -0
  72. data/ext/boost/container/detail/allocator_version_traits.hpp +163 -0
  73. data/ext/boost/container/detail/config_begin.hpp +49 -0
  74. data/ext/boost/container/detail/config_end.hpp +17 -0
  75. data/ext/boost/container/detail/destroyers.hpp +365 -0
  76. data/ext/boost/container/detail/flat_tree.hpp +1055 -0
  77. data/ext/boost/container/detail/function_detector.hpp +88 -0
  78. data/ext/boost/container/detail/iterators.hpp +611 -0
  79. data/ext/boost/container/detail/math_functions.hpp +113 -0
  80. data/ext/boost/container/detail/memory_util.hpp +83 -0
  81. data/ext/boost/container/detail/mpl.hpp +160 -0
  82. data/ext/boost/container/detail/multiallocation_chain.hpp +286 -0
  83. data/ext/boost/container/detail/node_alloc_holder.hpp +386 -0
  84. data/ext/boost/container/detail/node_pool_impl.hpp +365 -0
  85. data/ext/boost/container/detail/pair.hpp +354 -0
  86. data/ext/boost/container/detail/pool_common.hpp +52 -0
  87. data/ext/boost/container/detail/preprocessor.hpp +232 -0
  88. data/ext/boost/container/detail/transform_iterator.hpp +176 -0
  89. data/ext/boost/container/detail/tree.hpp +1134 -0
  90. data/ext/boost/container/detail/type_traits.hpp +210 -0
  91. data/ext/boost/container/detail/utilities.hpp +1141 -0
  92. data/ext/boost/container/detail/value_init.hpp +45 -0
  93. data/ext/boost/container/detail/variadic_templates_tools.hpp +153 -0
  94. data/ext/boost/container/detail/version_type.hpp +92 -0
  95. data/ext/boost/container/detail/workaround.hpp +44 -0
  96. data/ext/boost/container/flat_map.hpp +1674 -0
  97. data/ext/boost/container/flat_set.hpp +1408 -0
  98. data/ext/boost/container/list.hpp +1475 -0
  99. data/ext/boost/container/map.hpp +1508 -0
  100. data/ext/boost/container/scoped_allocator.hpp +1503 -0
  101. data/ext/boost/container/scoped_allocator_fwd.hpp +83 -0
  102. data/ext/boost/container/set.hpp +1280 -0
  103. data/ext/boost/container/slist.hpp +1706 -0
  104. data/ext/boost/container/stable_vector.hpp +1869 -0
  105. data/ext/boost/container/static_vector.hpp +1053 -0
  106. data/ext/boost/container/string.hpp +2856 -0
  107. data/ext/boost/container/throw_exception.hpp +110 -0
  108. data/ext/boost/container/vector.hpp +2671 -0
  109. data/ext/boost/detail/is_xxx.hpp +61 -0
  110. data/ext/boost/intrusive/any_hook.hpp +344 -0
  111. data/ext/boost/intrusive/avl_set.hpp +2528 -0
  112. data/ext/boost/intrusive/avl_set_hook.hpp +297 -0
  113. data/ext/boost/intrusive/avltree.hpp +1786 -0
  114. data/ext/boost/intrusive/avltree_algorithms.hpp +968 -0
  115. data/ext/boost/intrusive/bs_set_hook.hpp +296 -0
  116. data/ext/boost/intrusive/circular_list_algorithms.hpp +413 -0
  117. data/ext/boost/intrusive/circular_slist_algorithms.hpp +404 -0
  118. data/ext/boost/intrusive/derivation_value_traits.hpp +70 -0
  119. data/ext/boost/intrusive/detail/any_node_and_algorithms.hpp +297 -0
  120. data/ext/boost/intrusive/detail/assert.hpp +41 -0
  121. data/ext/boost/intrusive/detail/avltree_node.hpp +197 -0
  122. data/ext/boost/intrusive/detail/clear_on_destructor_base.hpp +36 -0
  123. data/ext/boost/intrusive/detail/common_slist_algorithms.hpp +102 -0
  124. data/ext/boost/intrusive/detail/config_begin.hpp +52 -0
  125. data/ext/boost/intrusive/detail/config_end.hpp +15 -0
  126. data/ext/boost/intrusive/detail/ebo_functor_holder.hpp +95 -0
  127. data/ext/boost/intrusive/detail/function_detector.hpp +88 -0
  128. data/ext/boost/intrusive/detail/generic_hook.hpp +209 -0
  129. data/ext/boost/intrusive/detail/has_member_function_callable_with.hpp +357 -0
  130. data/ext/boost/intrusive/detail/hashtable_node.hpp +249 -0
  131. data/ext/boost/intrusive/detail/is_stateful_value_traits.hpp +77 -0
  132. data/ext/boost/intrusive/detail/list_node.hpp +196 -0
  133. data/ext/boost/intrusive/detail/memory_util.hpp +288 -0
  134. data/ext/boost/intrusive/detail/mpl.hpp +383 -0
  135. data/ext/boost/intrusive/detail/parent_from_member.hpp +97 -0
  136. data/ext/boost/intrusive/detail/preprocessor.hpp +52 -0
  137. data/ext/boost/intrusive/detail/rbtree_node.hpp +201 -0
  138. data/ext/boost/intrusive/detail/slist_node.hpp +166 -0
  139. data/ext/boost/intrusive/detail/transform_iterator.hpp +173 -0
  140. data/ext/boost/intrusive/detail/tree_algorithms.hpp +1742 -0
  141. data/ext/boost/intrusive/detail/tree_node.hpp +199 -0
  142. data/ext/boost/intrusive/detail/utilities.hpp +858 -0
  143. data/ext/boost/intrusive/detail/workaround.hpp +22 -0
  144. data/ext/boost/intrusive/hashtable.hpp +3110 -0
  145. data/ext/boost/intrusive/intrusive_fwd.hpp +542 -0
  146. data/ext/boost/intrusive/linear_slist_algorithms.hpp +327 -0
  147. data/ext/boost/intrusive/link_mode.hpp +46 -0
  148. data/ext/boost/intrusive/list.hpp +1525 -0
  149. data/ext/boost/intrusive/list_hook.hpp +290 -0
  150. data/ext/boost/intrusive/member_value_traits.hpp +70 -0
  151. data/ext/boost/intrusive/options.hpp +810 -0
  152. data/ext/boost/intrusive/parent_from_member.hpp +42 -0
  153. data/ext/boost/intrusive/pointer_plus_bits.hpp +86 -0
  154. data/ext/boost/intrusive/pointer_traits.hpp +265 -0
  155. data/ext/boost/intrusive/priority_compare.hpp +39 -0
  156. data/ext/boost/intrusive/rbtree.hpp +1785 -0
  157. data/ext/boost/intrusive/rbtree_algorithms.hpp +934 -0
  158. data/ext/boost/intrusive/set.hpp +2554 -0
  159. data/ext/boost/intrusive/set_hook.hpp +300 -0
  160. data/ext/boost/intrusive/sg_set.hpp +2601 -0
  161. data/ext/boost/intrusive/sgtree.hpp +2009 -0
  162. data/ext/boost/intrusive/sgtree_algorithms.hpp +807 -0
  163. data/ext/boost/intrusive/slist.hpp +2219 -0
  164. data/ext/boost/intrusive/slist_hook.hpp +294 -0
  165. data/ext/boost/intrusive/splay_set.hpp +2575 -0
  166. data/ext/boost/intrusive/splay_set_hook.hpp +292 -0
  167. data/ext/boost/intrusive/splaytree.hpp +1784 -0
  168. data/ext/boost/intrusive/splaytree_algorithms.hpp +1008 -0
  169. data/ext/boost/intrusive/treap.hpp +1882 -0
  170. data/ext/boost/intrusive/treap_algorithms.hpp +919 -0
  171. data/ext/boost/intrusive/treap_set.hpp +2751 -0
  172. data/ext/boost/intrusive/trivial_value_traits.hpp +46 -0
  173. data/ext/boost/intrusive/unordered_set.hpp +2115 -0
  174. data/ext/boost/intrusive/unordered_set_hook.hpp +434 -0
  175. data/ext/boost/intrusive_ptr.hpp +18 -0
  176. data/ext/boost/math/common_factor_ct.hpp +180 -0
  177. data/ext/boost/math_fwd.hpp +108 -0
  178. data/ext/boost/move/detail/move_helpers.hpp +175 -0
  179. data/ext/boost/parameter.hpp +21 -0
  180. data/ext/boost/parameter/aux_/arg_list.hpp +459 -0
  181. data/ext/boost/parameter/aux_/cast.hpp +143 -0
  182. data/ext/boost/parameter/aux_/default.hpp +69 -0
  183. data/ext/boost/parameter/aux_/is_maybe.hpp +26 -0
  184. data/ext/boost/parameter/aux_/maybe.hpp +120 -0
  185. data/ext/boost/parameter/aux_/overloads.hpp +88 -0
  186. data/ext/boost/parameter/aux_/parameter_requirements.hpp +25 -0
  187. data/ext/boost/parameter/aux_/parenthesized_type.hpp +119 -0
  188. data/ext/boost/parameter/aux_/preprocessor/flatten.hpp +115 -0
  189. data/ext/boost/parameter/aux_/preprocessor/for_each.hpp +103 -0
  190. data/ext/boost/parameter/aux_/python/invoker.hpp +132 -0
  191. data/ext/boost/parameter/aux_/python/invoker_iterate.hpp +93 -0
  192. data/ext/boost/parameter/aux_/result_of0.hpp +36 -0
  193. data/ext/boost/parameter/aux_/set.hpp +67 -0
  194. data/ext/boost/parameter/aux_/tag.hpp +38 -0
  195. data/ext/boost/parameter/aux_/tagged_argument.hpp +188 -0
  196. data/ext/boost/parameter/aux_/template_keyword.hpp +47 -0
  197. data/ext/boost/parameter/aux_/unwrap_cv_reference.hpp +97 -0
  198. data/ext/boost/parameter/aux_/void.hpp +29 -0
  199. data/ext/boost/parameter/aux_/yesno.hpp +26 -0
  200. data/ext/boost/parameter/binding.hpp +106 -0
  201. data/ext/boost/parameter/config.hpp +14 -0
  202. data/ext/boost/parameter/keyword.hpp +152 -0
  203. data/ext/boost/parameter/macros.hpp +99 -0
  204. data/ext/boost/parameter/match.hpp +55 -0
  205. data/ext/boost/parameter/name.hpp +156 -0
  206. data/ext/boost/parameter/parameters.hpp +931 -0
  207. data/ext/boost/parameter/preprocessor.hpp +1178 -0
  208. data/ext/boost/parameter/python.hpp +735 -0
  209. data/ext/boost/parameter/value_type.hpp +108 -0
  210. data/ext/boost/pool/detail/for.m4 +107 -0
  211. data/ext/boost/pool/detail/guard.hpp +69 -0
  212. data/ext/boost/pool/detail/mutex.hpp +42 -0
  213. data/ext/boost/pool/detail/pool_construct.bat +24 -0
  214. data/ext/boost/pool/detail/pool_construct.ipp +852 -0
  215. data/ext/boost/pool/detail/pool_construct.m4 +84 -0
  216. data/ext/boost/pool/detail/pool_construct.sh +12 -0
  217. data/ext/boost/pool/detail/pool_construct_simple.bat +25 -0
  218. data/ext/boost/pool/detail/pool_construct_simple.ipp +43 -0
  219. data/ext/boost/pool/detail/pool_construct_simple.m4 +72 -0
  220. data/ext/boost/pool/detail/pool_construct_simple.sh +12 -0
  221. data/ext/boost/pool/object_pool.hpp +287 -0
  222. data/ext/boost/pool/pool.hpp +1024 -0
  223. data/ext/boost/pool/pool_alloc.hpp +488 -0
  224. data/ext/boost/pool/poolfwd.hpp +82 -0
  225. data/ext/boost/pool/simple_segregated_storage.hpp +377 -0
  226. data/ext/boost/pool/singleton_pool.hpp +251 -0
  227. data/ext/boost/preprocessor/arithmetic.hpp +25 -0
  228. data/ext/boost/preprocessor/arithmetic/detail/div_base.hpp +61 -0
  229. data/ext/boost/preprocessor/arithmetic/div.hpp +39 -0
  230. data/ext/boost/preprocessor/arithmetic/mod.hpp +39 -0
  231. data/ext/boost/preprocessor/arithmetic/mul.hpp +53 -0
  232. data/ext/boost/preprocessor/array.hpp +32 -0
  233. data/ext/boost/preprocessor/array/enum.hpp +33 -0
  234. data/ext/boost/preprocessor/array/insert.hpp +55 -0
  235. data/ext/boost/preprocessor/array/pop_back.hpp +37 -0
  236. data/ext/boost/preprocessor/array/pop_front.hpp +38 -0
  237. data/ext/boost/preprocessor/array/push_back.hpp +33 -0
  238. data/ext/boost/preprocessor/array/push_front.hpp +33 -0
  239. data/ext/boost/preprocessor/array/remove.hpp +54 -0
  240. data/ext/boost/preprocessor/array/replace.hpp +49 -0
  241. data/ext/boost/preprocessor/array/reverse.hpp +29 -0
  242. data/ext/boost/preprocessor/array/to_list.hpp +33 -0
  243. data/ext/boost/preprocessor/array/to_seq.hpp +33 -0
  244. data/ext/boost/preprocessor/array/to_tuple.hpp +22 -0
  245. data/ext/boost/preprocessor/assert_msg.hpp +17 -0
  246. data/ext/boost/preprocessor/comma.hpp +17 -0
  247. data/ext/boost/preprocessor/comparison.hpp +24 -0
  248. data/ext/boost/preprocessor/comparison/equal.hpp +34 -0
  249. data/ext/boost/preprocessor/comparison/greater.hpp +38 -0
  250. data/ext/boost/preprocessor/comparison/greater_equal.hpp +38 -0
  251. data/ext/boost/preprocessor/comparison/less.hpp +46 -0
  252. data/ext/boost/preprocessor/comparison/less_equal.hpp +39 -0
  253. data/ext/boost/preprocessor/comparison/not_equal.hpp +814 -0
  254. data/ext/boost/preprocessor/config/limits.hpp +30 -0
  255. data/ext/boost/preprocessor/control.hpp +22 -0
  256. data/ext/boost/preprocessor/control/deduce_d.hpp +22 -0
  257. data/ext/boost/preprocessor/control/detail/dmc/while.hpp +536 -0
  258. data/ext/boost/preprocessor/control/detail/edg/while.hpp +534 -0
  259. data/ext/boost/preprocessor/control/detail/msvc/while.hpp +277 -0
  260. data/ext/boost/preprocessor/control/expr_if.hpp +30 -0
  261. data/ext/boost/preprocessor/debug.hpp +18 -0
  262. data/ext/boost/preprocessor/debug/assert.hpp +44 -0
  263. data/ext/boost/preprocessor/debug/line.hpp +35 -0
  264. data/ext/boost/preprocessor/detail/dmc/auto_rec.hpp +286 -0
  265. data/ext/boost/preprocessor/detail/is_nullary.hpp +30 -0
  266. data/ext/boost/preprocessor/detail/is_unary.hpp +30 -0
  267. data/ext/boost/preprocessor/detail/null.hpp +17 -0
  268. data/ext/boost/preprocessor/detail/split.hpp +35 -0
  269. data/ext/boost/preprocessor/enum_params_with_defaults.hpp +17 -0
  270. data/ext/boost/preprocessor/enum_shifted.hpp +17 -0
  271. data/ext/boost/preprocessor/expand.hpp +17 -0
  272. data/ext/boost/preprocessor/expr_if.hpp +17 -0
  273. data/ext/boost/preprocessor/facilities.hpp +23 -0
  274. data/ext/boost/preprocessor/facilities/apply.hpp +34 -0
  275. data/ext/boost/preprocessor/facilities/expand.hpp +28 -0
  276. data/ext/boost/preprocessor/facilities/is_1.hpp +23 -0
  277. data/ext/boost/preprocessor/facilities/is_empty.hpp +43 -0
  278. data/ext/boost/preprocessor/facilities/is_empty_or_1.hpp +30 -0
  279. data/ext/boost/preprocessor/for.hpp +17 -0
  280. data/ext/boost/preprocessor/if.hpp +17 -0
  281. data/ext/boost/preprocessor/iteration.hpp +19 -0
  282. data/ext/boost/preprocessor/iteration/detail/bounds/lower3.hpp +99 -0
  283. data/ext/boost/preprocessor/iteration/detail/bounds/lower4.hpp +99 -0
  284. data/ext/boost/preprocessor/iteration/detail/bounds/lower5.hpp +99 -0
  285. data/ext/boost/preprocessor/iteration/detail/bounds/upper3.hpp +99 -0
  286. data/ext/boost/preprocessor/iteration/detail/bounds/upper4.hpp +99 -0
  287. data/ext/boost/preprocessor/iteration/detail/bounds/upper5.hpp +99 -0
  288. data/ext/boost/preprocessor/iteration/detail/finish.hpp +99 -0
  289. data/ext/boost/preprocessor/iteration/detail/iter/forward3.hpp +1338 -0
  290. data/ext/boost/preprocessor/iteration/detail/iter/forward4.hpp +1338 -0
  291. data/ext/boost/preprocessor/iteration/detail/iter/forward5.hpp +1338 -0
  292. data/ext/boost/preprocessor/iteration/detail/iter/reverse2.hpp +1296 -0
  293. data/ext/boost/preprocessor/iteration/detail/iter/reverse3.hpp +1296 -0
  294. data/ext/boost/preprocessor/iteration/detail/iter/reverse4.hpp +1296 -0
  295. data/ext/boost/preprocessor/iteration/detail/iter/reverse5.hpp +1296 -0
  296. data/ext/boost/preprocessor/iteration/detail/local.hpp +812 -0
  297. data/ext/boost/preprocessor/iteration/detail/rlocal.hpp +782 -0
  298. data/ext/boost/preprocessor/iteration/detail/self.hpp +21 -0
  299. data/ext/boost/preprocessor/iteration/detail/start.hpp +99 -0
  300. data/ext/boost/preprocessor/iteration/local.hpp +26 -0
  301. data/ext/boost/preprocessor/iteration/self.hpp +19 -0
  302. data/ext/boost/preprocessor/library.hpp +36 -0
  303. data/ext/boost/preprocessor/limits.hpp +17 -0
  304. data/ext/boost/preprocessor/list.hpp +37 -0
  305. data/ext/boost/preprocessor/list/at.hpp +39 -0
  306. data/ext/boost/preprocessor/list/cat.hpp +42 -0
  307. data/ext/boost/preprocessor/list/detail/dmc/fold_left.hpp +279 -0
  308. data/ext/boost/preprocessor/list/detail/edg/fold_left.hpp +536 -0
  309. data/ext/boost/preprocessor/list/detail/edg/fold_right.hpp +794 -0
  310. data/ext/boost/preprocessor/list/enum.hpp +41 -0
  311. data/ext/boost/preprocessor/list/filter.hpp +54 -0
  312. data/ext/boost/preprocessor/list/first_n.hpp +58 -0
  313. data/ext/boost/preprocessor/list/for_each.hpp +49 -0
  314. data/ext/boost/preprocessor/list/for_each_product.hpp +141 -0
  315. data/ext/boost/preprocessor/list/rest_n.hpp +55 -0
  316. data/ext/boost/preprocessor/list/size.hpp +58 -0
  317. data/ext/boost/preprocessor/list/to_array.hpp +123 -0
  318. data/ext/boost/preprocessor/list/to_seq.hpp +32 -0
  319. data/ext/boost/preprocessor/list/to_tuple.hpp +38 -0
  320. data/ext/boost/preprocessor/logical.hpp +29 -0
  321. data/ext/boost/preprocessor/logical/bitnor.hpp +38 -0
  322. data/ext/boost/preprocessor/logical/bitor.hpp +38 -0
  323. data/ext/boost/preprocessor/logical/bitxor.hpp +38 -0
  324. data/ext/boost/preprocessor/logical/nor.hpp +30 -0
  325. data/ext/boost/preprocessor/logical/not.hpp +30 -0
  326. data/ext/boost/preprocessor/logical/or.hpp +30 -0
  327. data/ext/boost/preprocessor/logical/xor.hpp +30 -0
  328. data/ext/boost/preprocessor/max.hpp +17 -0
  329. data/ext/boost/preprocessor/min.hpp +17 -0
  330. data/ext/boost/preprocessor/punctuation.hpp +20 -0
  331. data/ext/boost/preprocessor/punctuation/paren_if.hpp +38 -0
  332. data/ext/boost/preprocessor/repeat_3rd.hpp +17 -0
  333. data/ext/boost/preprocessor/repeat_from_to.hpp +17 -0
  334. data/ext/boost/preprocessor/repeat_from_to_2nd.hpp +17 -0
  335. data/ext/boost/preprocessor/repeat_from_to_3rd.hpp +17 -0
  336. data/ext/boost/preprocessor/repetition.hpp +32 -0
  337. data/ext/boost/preprocessor/repetition/deduce_r.hpp +22 -0
  338. data/ext/boost/preprocessor/repetition/deduce_z.hpp +22 -0
  339. data/ext/boost/preprocessor/repetition/detail/dmc/for.hpp +536 -0
  340. data/ext/boost/preprocessor/repetition/detail/edg/for.hpp +534 -0
  341. data/ext/boost/preprocessor/repetition/detail/msvc/for.hpp +277 -0
  342. data/ext/boost/preprocessor/repetition/enum_params_with_defaults.hpp +24 -0
  343. data/ext/boost/preprocessor/repetition/enum_shifted.hpp +68 -0
  344. data/ext/boost/preprocessor/repetition/enum_shifted_binary_params.hpp +51 -0
  345. data/ext/boost/preprocessor/repetition/enum_trailing.hpp +63 -0
  346. data/ext/boost/preprocessor/repetition/enum_trailing_binary_params.hpp +53 -0
  347. data/ext/boost/preprocessor/selection.hpp +18 -0
  348. data/ext/boost/preprocessor/selection/max.hpp +39 -0
  349. data/ext/boost/preprocessor/selection/min.hpp +39 -0
  350. data/ext/boost/preprocessor/seq.hpp +43 -0
  351. data/ext/boost/preprocessor/seq/cat.hpp +49 -0
  352. data/ext/boost/preprocessor/seq/detail/binary_transform.hpp +40 -0
  353. data/ext/boost/preprocessor/seq/detail/split.hpp +284 -0
  354. data/ext/boost/preprocessor/seq/filter.hpp +54 -0
  355. data/ext/boost/preprocessor/seq/first_n.hpp +30 -0
  356. data/ext/boost/preprocessor/seq/fold_left.hpp +1070 -0
  357. data/ext/boost/preprocessor/seq/fold_right.hpp +288 -0
  358. data/ext/boost/preprocessor/seq/for_each.hpp +60 -0
  359. data/ext/boost/preprocessor/seq/for_each_product.hpp +126 -0
  360. data/ext/boost/preprocessor/seq/insert.hpp +28 -0
  361. data/ext/boost/preprocessor/seq/pop_back.hpp +29 -0
  362. data/ext/boost/preprocessor/seq/pop_front.hpp +27 -0
  363. data/ext/boost/preprocessor/seq/push_back.hpp +19 -0
  364. data/ext/boost/preprocessor/seq/push_front.hpp +19 -0
  365. data/ext/boost/preprocessor/seq/remove.hpp +29 -0
  366. data/ext/boost/preprocessor/seq/replace.hpp +29 -0
  367. data/ext/boost/preprocessor/seq/rest_n.hpp +30 -0
  368. data/ext/boost/preprocessor/seq/reverse.hpp +39 -0
  369. data/ext/boost/preprocessor/seq/subseq.hpp +28 -0
  370. data/ext/boost/preprocessor/seq/to_array.hpp +28 -0
  371. data/ext/boost/preprocessor/seq/to_list.hpp +29 -0
  372. data/ext/boost/preprocessor/seq/to_tuple.hpp +27 -0
  373. data/ext/boost/preprocessor/seq/transform.hpp +48 -0
  374. data/ext/boost/preprocessor/slot.hpp +17 -0
  375. data/ext/boost/preprocessor/slot/counter.hpp +25 -0
  376. data/ext/boost/preprocessor/slot/detail/counter.hpp +269 -0
  377. data/ext/boost/preprocessor/slot/detail/slot1.hpp +267 -0
  378. data/ext/boost/preprocessor/slot/detail/slot2.hpp +267 -0
  379. data/ext/boost/preprocessor/slot/detail/slot3.hpp +267 -0
  380. data/ext/boost/preprocessor/slot/detail/slot4.hpp +267 -0
  381. data/ext/boost/preprocessor/slot/detail/slot5.hpp +267 -0
  382. data/ext/boost/preprocessor/tuple.hpp +28 -0
  383. data/ext/boost/preprocessor/tuple/enum.hpp +22 -0
  384. data/ext/boost/preprocessor/tuple/reverse.hpp +114 -0
  385. data/ext/boost/preprocessor/tuple/size.hpp +28 -0
  386. data/ext/boost/preprocessor/tuple/to_array.hpp +37 -0
  387. data/ext/boost/preprocessor/tuple/to_seq.hpp +114 -0
  388. data/ext/boost/preprocessor/variadic.hpp +23 -0
  389. data/ext/boost/preprocessor/variadic/to_array.hpp +32 -0
  390. data/ext/boost/preprocessor/variadic/to_list.hpp +25 -0
  391. data/ext/boost/preprocessor/variadic/to_seq.hpp +25 -0
  392. data/ext/boost/preprocessor/variadic/to_tuple.hpp +24 -0
  393. data/ext/boost/preprocessor/while.hpp +17 -0
  394. data/ext/boost/preprocessor/wstringize.hpp +29 -0
  395. data/ext/boost/smart_ptr/intrusive_ptr.hpp +324 -0
  396. data/ext/common/AccountsDatabase.h +3 -4
  397. data/ext/common/AgentsStarter.cpp +12 -15
  398. data/ext/common/AgentsStarter.h +54 -120
  399. data/ext/common/ApplicationPool2/AppTypes.cpp +12 -5
  400. data/ext/common/ApplicationPool2/AppTypes.h +21 -14
  401. data/ext/common/ApplicationPool2/Common.h +36 -19
  402. data/ext/common/ApplicationPool2/DirectSpawner.h +15 -16
  403. data/ext/common/ApplicationPool2/DummySpawner.h +9 -8
  404. data/ext/common/ApplicationPool2/ErrorRenderer.h +1 -1
  405. data/ext/common/ApplicationPool2/Group.h +304 -171
  406. data/ext/common/ApplicationPool2/Implementation.cpp +234 -125
  407. data/ext/common/ApplicationPool2/Options.h +50 -62
  408. data/ext/common/ApplicationPool2/Pool.h +285 -189
  409. data/ext/common/ApplicationPool2/Process.h +126 -115
  410. data/ext/common/ApplicationPool2/Session.h +70 -30
  411. data/ext/common/ApplicationPool2/SmartSpawner.h +19 -18
  412. data/ext/common/ApplicationPool2/Socket.h +57 -43
  413. data/ext/common/ApplicationPool2/SpawnObject.h +83 -0
  414. data/ext/common/ApplicationPool2/Spawner.h +59 -38
  415. data/ext/common/ApplicationPool2/SpawnerFactory.h +8 -14
  416. data/ext/common/ApplicationPool2/SuperGroup.h +69 -40
  417. data/ext/common/BackgroundEventLoop.cpp +48 -1
  418. data/ext/common/BackgroundEventLoop.h +3 -1
  419. data/ext/common/Constants.h +30 -8
  420. data/ext/common/DataStructures/HashedStaticString.h +103 -0
  421. data/ext/common/DataStructures/LString.h +396 -0
  422. data/ext/common/DataStructures/StringKeyTable.h +588 -0
  423. data/ext/common/EventedMessageServer.h +1 -0
  424. data/ext/common/FileDescriptor.h +5 -0
  425. data/ext/common/InstanceDirectory.h +240 -0
  426. data/ext/common/Logging.cpp +38 -13
  427. data/ext/common/Logging.h +53 -22
  428. data/ext/common/MemoryKit/mbuf.cpp +413 -0
  429. data/ext/common/MemoryKit/mbuf.h +266 -0
  430. data/ext/common/MemoryKit/palloc.cpp +337 -0
  431. data/ext/common/MemoryKit/palloc.h +121 -0
  432. data/ext/common/ResourceLocator.h +62 -6
  433. data/ext/common/SafeLibev.h +4 -4
  434. data/ext/common/ServerKit/AcceptLoadBalancer.h +275 -0
  435. data/ext/common/ServerKit/Channel.h +747 -0
  436. data/ext/common/ServerKit/Client.h +166 -0
  437. data/ext/common/ServerKit/ClientRef.h +130 -0
  438. data/ext/common/ServerKit/Context.h +129 -0
  439. data/ext/common/ServerKit/Errors.h +103 -0
  440. data/ext/common/ServerKit/FdSinkChannel.h +206 -0
  441. data/ext/common/ServerKit/FdSourceChannel.h +230 -0
  442. data/ext/common/ServerKit/FileBufferedChannel.h +1399 -0
  443. data/ext/common/ServerKit/FileBufferedFdSinkChannel.h +228 -0
  444. data/ext/common/ServerKit/HeaderTable.h +472 -0
  445. data/ext/common/ServerKit/Hooks.h +79 -0
  446. data/ext/common/ServerKit/HttpChunkedBodyParser.h +289 -0
  447. data/ext/common/ServerKit/HttpChunkedBodyParserState.h +70 -0
  448. data/ext/common/ServerKit/HttpClient.h +94 -0
  449. data/ext/common/ServerKit/HttpHeaderParser.h +477 -0
  450. data/ext/common/ServerKit/HttpHeaderParserState.h +60 -0
  451. data/ext/common/ServerKit/HttpRequest.h +276 -0
  452. data/ext/common/ServerKit/HttpRequestRef.h +130 -0
  453. data/ext/common/ServerKit/HttpServer.h +1152 -0
  454. data/ext/common/ServerKit/Implementation.cpp +47 -0
  455. data/ext/common/ServerKit/Server.h +1040 -0
  456. data/ext/common/ServerKit/http_parser.cpp +2259 -0
  457. data/ext/common/ServerKit/http_parser.h +330 -0
  458. data/ext/common/StaticString.h +8 -0
  459. data/ext/common/Utils.cpp +14 -12
  460. data/ext/common/Utils.h +9 -103
  461. data/ext/common/Utils/BufferedIO.h +1 -0
  462. data/ext/common/Utils/CachedFileStat.hpp +1 -7
  463. data/ext/common/Utils/DateParsing.h +379 -0
  464. data/ext/common/Utils/FileChangeChecker.h +3 -9
  465. data/ext/common/Utils/Hasher.cpp +52 -0
  466. data/ext/common/Utils/Hasher.h +58 -0
  467. data/ext/common/Utils/IOUtils.cpp +62 -62
  468. data/ext/common/Utils/JsonUtils.h +21 -0
  469. data/ext/common/Utils/OptionParsing.h +75 -0
  470. data/ext/common/Utils/StrIntUtils.cpp +112 -19
  471. data/ext/common/Utils/StrIntUtils.h +52 -12
  472. data/ext/common/Utils/StrIntUtilsNoStrictAliasing.cpp +174 -0
  473. data/ext/common/Utils/VariantMap.h +18 -7
  474. data/ext/common/Utils/modp_b64.cpp +290 -0
  475. data/ext/common/Utils/modp_b64.h +241 -0
  476. data/ext/common/Utils/modp_b64_data.h +479 -0
  477. data/ext/common/Utils/sysqueue.h +811 -0
  478. data/ext/common/agents/Base.cpp +71 -98
  479. data/ext/common/agents/Base.h +11 -3
  480. data/ext/common/agents/HelperAgent/AdminServer.h +690 -0
  481. data/ext/common/agents/HelperAgent/Main.cpp +899 -487
  482. data/ext/common/agents/HelperAgent/OptionParser.h +311 -0
  483. data/ext/common/agents/HelperAgent/RequestHandler.h +315 -2548
  484. data/ext/common/agents/HelperAgent/RequestHandler/AppResponse.h +225 -0
  485. data/ext/common/agents/HelperAgent/RequestHandler/BufferBody.cpp +93 -0
  486. data/ext/common/agents/HelperAgent/RequestHandler/CheckoutSession.cpp +346 -0
  487. data/ext/common/agents/HelperAgent/RequestHandler/Client.h +54 -0
  488. data/ext/common/agents/HelperAgent/RequestHandler/ForwardResponse.cpp +846 -0
  489. data/ext/common/agents/HelperAgent/RequestHandler/Hooks.cpp +231 -0
  490. data/ext/common/agents/HelperAgent/RequestHandler/InitRequest.cpp +434 -0
  491. data/ext/common/agents/HelperAgent/RequestHandler/Request.h +149 -0
  492. data/ext/common/agents/HelperAgent/RequestHandler/SendRequest.cpp +887 -0
  493. data/ext/common/agents/HelperAgent/RequestHandler/TurboCaching.h +293 -0
  494. data/ext/common/agents/HelperAgent/RequestHandler/Utils.cpp +301 -0
  495. data/ext/common/agents/HelperAgent/ResponseCache.h +624 -0
  496. data/ext/common/agents/HelperAgent/SystemMetricsTool.cpp +21 -23
  497. data/ext/common/agents/LoggingAgent/AdminServer.h +369 -0
  498. data/ext/common/agents/LoggingAgent/LoggingServer.h +1 -0
  499. data/ext/common/agents/LoggingAgent/Main.cpp +422 -215
  500. data/ext/common/agents/LoggingAgent/OptionParser.h +167 -0
  501. data/ext/common/agents/LoggingAgent/RemoteSender.h +3 -3
  502. data/ext/common/agents/Main.cpp +107 -0
  503. data/ext/common/agents/SpawnPreparer/Main.cpp +207 -0
  504. data/ext/common/agents/TempDirToucher/Main.cpp +429 -0
  505. data/ext/common/agents/Watchdog/AdminServer.h +390 -0
  506. data/ext/common/agents/Watchdog/AgentWatcher.cpp +7 -5
  507. data/ext/common/agents/Watchdog/HelperAgentWatcher.cpp +18 -39
  508. data/ext/common/agents/Watchdog/InstanceDirToucher.cpp +116 -0
  509. data/ext/common/agents/Watchdog/LoggingAgentWatcher.cpp +13 -17
  510. data/ext/common/agents/Watchdog/Main.cpp +743 -202
  511. data/ext/libeio/eio.c +17 -0
  512. data/ext/libeio/eio.h +2 -0
  513. data/ext/nginx/CacheLocationConfig.c +177 -198
  514. data/ext/nginx/CacheLocationConfig.c.erb +35 -22
  515. data/ext/nginx/Configuration.c +402 -236
  516. data/ext/nginx/Configuration.h +12 -5
  517. data/ext/nginx/ConfigurationCommands.c +35 -15
  518. data/ext/nginx/ConfigurationCommands.c.erb +4 -4
  519. data/ext/nginx/ConfigurationFields.h +9 -5
  520. data/ext/nginx/ConfigurationFields.h.erb +3 -1
  521. data/ext/nginx/ContentHandler.c +393 -362
  522. data/ext/nginx/CreateLocationConfig.c +8 -4
  523. data/ext/nginx/CreateLocationConfig.c.erb +8 -3
  524. data/ext/nginx/MergeLocationConfig.c +36 -6
  525. data/ext/nginx/MergeLocationConfig.c.erb +42 -1
  526. data/ext/nginx/ngx_http_passenger_module.c +28 -15
  527. data/ext/oxt/detail/backtrace_disabled.hpp +2 -1
  528. data/ext/oxt/detail/backtrace_enabled.hpp +15 -2
  529. data/ext/oxt/implementation.cpp +92 -20
  530. data/ext/oxt/thread.hpp +5 -0
  531. data/ext/ruby/extconf.rb +3 -6
  532. data/ext/ruby/passenger_native_support.c +13 -40
  533. data/helper-scripts/download_binaries/extconf.rb +4 -4
  534. data/helper-scripts/meteor-loader.rb +12 -112
  535. data/helper-scripts/node-loader.js +3 -91
  536. data/helper-scripts/rack-loader.rb +13 -14
  537. data/helper-scripts/rack-preloader.rb +16 -17
  538. data/helper-scripts/wsgi-loader.py +11 -7
  539. data/lib/phusion_passenger.rb +100 -79
  540. data/lib/phusion_passenger/abstract_installer.rb +28 -3
  541. data/lib/phusion_passenger/admin_tools.rb +3 -3
  542. data/lib/phusion_passenger/admin_tools/instance.rb +207 -0
  543. data/lib/phusion_passenger/admin_tools/instance_registry.rb +98 -0
  544. data/lib/phusion_passenger/apache2/config_options.rb +72 -22
  545. data/lib/phusion_passenger/common_library.rb +79 -14
  546. data/lib/phusion_passenger/config/about_command.rb +17 -23
  547. data/lib/phusion_passenger/config/admin_command_command.rb +175 -0
  548. data/lib/phusion_passenger/config/agent_compiler.rb +170 -0
  549. data/lib/phusion_passenger/config/command.rb +1 -4
  550. data/lib/phusion_passenger/config/compile_agent_command.rb +102 -0
  551. data/lib/phusion_passenger/config/compile_nginx_engine_command.rb +112 -0
  552. data/lib/phusion_passenger/config/detach_process_command.rb +32 -10
  553. data/lib/phusion_passenger/config/download_agent_command.rb +285 -0
  554. data/lib/phusion_passenger/config/download_nginx_engine_command.rb +281 -0
  555. data/lib/phusion_passenger/config/install_agent_command.rb +174 -0
  556. data/lib/phusion_passenger/config/install_standalone_runtime_command.rb +231 -0
  557. data/lib/phusion_passenger/config/installation_utils.rb +241 -0
  558. data/lib/phusion_passenger/config/list_instances_command.rb +13 -25
  559. data/lib/phusion_passenger/config/main.rb +43 -14
  560. data/lib/phusion_passenger/config/nginx_engine_compiler.rb +337 -0
  561. data/lib/phusion_passenger/config/reopen_logs_command.rb +110 -0
  562. data/lib/phusion_passenger/config/restart_app_command.rb +61 -14
  563. data/lib/phusion_passenger/config/system_metrics_command.rb +2 -1
  564. data/lib/phusion_passenger/config/utils.rb +64 -39
  565. data/lib/phusion_passenger/config/validate_install_command.rb +2 -2
  566. data/lib/phusion_passenger/constants.rb +27 -6
  567. data/lib/phusion_passenger/debug_logging.rb +32 -15
  568. data/lib/phusion_passenger/loader_shared_helpers.rb +2 -5
  569. data/lib/phusion_passenger/message_client.rb +21 -22
  570. data/lib/phusion_passenger/native_support.rb +26 -31
  571. data/lib/phusion_passenger/nginx/config_options.rb +32 -19
  572. data/lib/phusion_passenger/packaging.rb +7 -3
  573. data/lib/phusion_passenger/platform_info/cxx_portability.rb +1 -2
  574. data/lib/phusion_passenger/platform_info/depcheck_specs/libs.rb +3 -4
  575. data/lib/phusion_passenger/platform_info/operating_system.rb +6 -6
  576. data/lib/phusion_passenger/preloader_shared_helpers.rb +2 -2
  577. data/lib/phusion_passenger/rack/out_of_band_gc.rb +2 -2
  578. data/lib/phusion_passenger/rack/thread_handler_extension.rb +168 -65
  579. data/lib/phusion_passenger/request_handler.rb +47 -82
  580. data/lib/phusion_passenger/request_handler/thread_handler.rb +46 -10
  581. data/lib/phusion_passenger/ruby_core_enhancements.rb +25 -77
  582. data/lib/phusion_passenger/ruby_core_io_enhancements.rb +108 -0
  583. data/lib/phusion_passenger/standalone/app_finder.rb +39 -59
  584. data/lib/phusion_passenger/standalone/command.rb +27 -275
  585. data/lib/phusion_passenger/standalone/command2.rb +292 -0
  586. data/lib/phusion_passenger/standalone/config_utils.rb +87 -0
  587. data/lib/phusion_passenger/standalone/control_utils.rb +88 -0
  588. data/lib/phusion_passenger/standalone/main.rb +69 -71
  589. data/lib/phusion_passenger/standalone/start2_command.rb +799 -0
  590. data/lib/phusion_passenger/standalone/start_command.rb +406 -467
  591. data/lib/phusion_passenger/standalone/start_command/builtin_engine.rb +167 -0
  592. data/lib/phusion_passenger/standalone/start_command/nginx_engine.rb +165 -0
  593. data/lib/phusion_passenger/standalone/status_command.rb +64 -23
  594. data/lib/phusion_passenger/standalone/stop_command.rb +69 -32
  595. data/lib/phusion_passenger/standalone/version_command.rb +1 -5
  596. data/lib/phusion_passenger/utils.rb +0 -4
  597. data/lib/phusion_passenger/utils/json.rb +70 -4
  598. data/lib/phusion_passenger/utils/progress_bar.rb +56 -0
  599. data/lib/phusion_passenger/utils/tee_input.rb +3 -3
  600. data/lib/phusion_passenger/utils/unseekable_socket.rb +30 -0
  601. data/packaging/rpm/nginx_spec/nginx.spec.template +4 -3
  602. data/packaging/rpm/passenger_spec/passenger.spec.template +6 -10
  603. data/packaging/rpm/setup-system +2 -1
  604. data/resources/oss-binaries.phusionpassenger.com.crt +208 -0
  605. data/resources/templates/config/agent_compiler/confirm_enable_optimizations.txt.erb +5 -0
  606. data/resources/templates/config/installation_utils/cannot_create_user_support_binaries_dir.txt.erb +15 -0
  607. data/resources/templates/config/installation_utils/download_tool_missing.txt.erb +7 -0
  608. data/resources/templates/config/installation_utils/passenger_not_installed_as_root.txt.erb +12 -0
  609. data/resources/templates/config/installation_utils/support_binaries_dir_not_writable_despite_running_as_root.txt.erb +13 -0
  610. data/resources/templates/config/installation_utils/unexpected_filesystem_problem.txt.erb +16 -0
  611. data/{packaging/debian/debian_specs/passenger/patches/series → resources/templates/config/installation_utils/user_support_binaries_dir_not_writable.txt.erb} +0 -0
  612. data/resources/templates/nginx/nginx_module_sources_not_available.txt.erb +2 -2
  613. data/resources/templates/standalone/config.erb +14 -16
  614. data/resources/templates/standalone/possible_solutions_for_download_and_extraction_problems.txt.erb +1 -1
  615. data/test/.rspec +1 -0
  616. data/test/cxx/ApplicationPool2/DirectSpawnerTest.cpp +20 -17
  617. data/test/cxx/ApplicationPool2/OptionsTest.cpp +0 -14
  618. data/test/cxx/ApplicationPool2/PoolTest.cpp +113 -90
  619. data/test/cxx/ApplicationPool2/ProcessTest.cpp +18 -27
  620. data/test/cxx/ApplicationPool2/SmartSpawnerTest.cpp +51 -53
  621. data/test/cxx/ApplicationPool2/SpawnerTestCases.cpp +55 -57
  622. data/test/cxx/BufferedIOTest.cpp +40 -40
  623. data/test/cxx/CxxTestMain.cpp +4 -22
  624. data/test/cxx/DataStructures/LStringTest.cpp +275 -0
  625. data/test/cxx/DataStructures/StringKeyTableTest.cpp +199 -0
  626. data/test/cxx/MemoryKit/MbufTest.cpp +213 -0
  627. data/test/cxx/MessageServerTest.cpp +62 -55
  628. data/test/cxx/RequestHandlerTest.cpp +26 -27
  629. data/test/cxx/ServerKit/ChannelTest.cpp +1467 -0
  630. data/test/cxx/ServerKit/FileBufferedChannelTest.cpp +817 -0
  631. data/test/cxx/ServerKit/HeaderTableTest.cpp +171 -0
  632. data/test/cxx/ServerKit/HttpServerTest.cpp +1503 -0
  633. data/test/cxx/ServerKit/ServerTest.cpp +408 -0
  634. data/test/cxx/TestSupport.cpp +51 -15
  635. data/test/cxx/TestSupport.h +31 -21
  636. data/test/cxx/UnionStationTest.cpp +121 -122
  637. data/test/cxx/UtilsTest.cpp +9 -33
  638. data/test/integration_tests/apache2_tests.rb +65 -27
  639. data/test/integration_tests/downloaded_binaries_tests.rb +30 -6
  640. data/test/integration_tests/native_packaging_spec.rb +32 -17
  641. data/test/integration_tests/nginx_tests.rb +28 -10
  642. data/test/integration_tests/shared/example_webapp_tests.rb +40 -27
  643. data/test/integration_tests/standalone_tests.rb +232 -169
  644. data/test/ruby/debug_logging_spec.rb +44 -40
  645. data/test/ruby/rails3.0/preloader_spec.rb +1 -1
  646. data/test/ruby/rails3.1/preloader_spec.rb +1 -1
  647. data/test/ruby/rails3.2/preloader_spec.rb +1 -1
  648. data/test/ruby/rails4.0/preloader_spec.rb +1 -1
  649. data/test/ruby/rails4.1/preloader_spec.rb +1 -1
  650. data/test/ruby/request_handler_spec.rb +62 -24
  651. data/test/ruby/shared/loader_sharedspec.rb +10 -9
  652. data/test/ruby/shared/rails/union_station_extensions_sharedspec.rb +23 -22
  653. data/test/ruby/spec_helper.rb +2 -11
  654. data/test/ruby/standalone/runtime_installer_spec.rb +15 -13
  655. data/test/ruby/union_station_spec.rb +45 -40
  656. data/test/ruby/utils/tee_input_spec.rb +5 -5
  657. data/test/ruby/utils_spec.rb +3 -39
  658. data/test/stub/apache2/httpd.conf.erb +5 -2
  659. data/test/stub/nginx/nginx.conf.erb +3 -1
  660. data/test/support/apache2_controller.rb +25 -25
  661. data/test/support/nginx_controller.rb +14 -14
  662. data/test/support/test_helper.rb +74 -75
  663. metadata +439 -643
  664. metadata.gz.asc +7 -7
  665. data/ext/common/MultiLibeio.cpp +0 -204
  666. data/ext/common/MultiLibeio.h +0 -67
  667. data/ext/common/ServerInstanceDir.h +0 -402
  668. data/ext/common/Utils/Base64.cpp +0 -143
  669. data/ext/common/Utils/Base64.h +0 -83
  670. data/ext/common/Utils/HttpHeaderBufferer.h +0 -184
  671. data/ext/common/Utils/PriorityQueue.h +0 -54
  672. data/ext/common/Utils/StreamBoyerMooreHorspool.h +0 -512
  673. data/ext/common/Utils/fib.c +0 -699
  674. data/ext/common/Utils/fib.h +0 -101
  675. data/ext/common/Utils/fibpriv.h +0 -67
  676. data/ext/common/agents/EnvPrinter.c +0 -16
  677. data/ext/common/agents/HelperAgent/AgentOptions.h +0 -109
  678. data/ext/common/agents/HelperAgent/FileBackedPipe.h +0 -732
  679. data/ext/common/agents/HelperAgent/RequestHandler.cpp +0 -294
  680. data/ext/common/agents/HelperAgent/ScgiRequestParser.h +0 -457
  681. data/ext/common/agents/LoggingAgent/AdminController.h +0 -96
  682. data/ext/common/agents/SpawnPreparer.cpp +0 -206
  683. data/ext/common/agents/TempDirToucher.c +0 -383
  684. data/ext/common/agents/Watchdog/ServerInstanceDirToucher.cpp +0 -116
  685. data/helper-scripts/classic-rails-loader.rb +0 -166
  686. data/helper-scripts/classic-rails-preloader.rb +0 -193
  687. data/lib/phusion_passenger/admin_tools/server_instance.rb +0 -339
  688. data/lib/phusion_passenger/classic_rails/cgi_fixed.rb +0 -68
  689. data/lib/phusion_passenger/classic_rails/thread_handler_extension.rb +0 -40
  690. data/lib/phusion_passenger/platform_info/openssl.rb +0 -61
  691. data/lib/phusion_passenger/standalone/config_file.rb +0 -119
  692. data/lib/phusion_passenger/standalone/help_command.rb +0 -57
  693. data/lib/phusion_passenger/standalone/runtime_installer.rb +0 -712
  694. data/lib/phusion_passenger/standalone/runtime_locator.rb +0 -170
  695. data/lib/phusion_passenger/standalone/utils.rb +0 -58
  696. data/lib/phusion_passenger/utils/tmpdir.rb +0 -69
  697. data/packaging/debian/LICENSE.md +0 -19
  698. data/packaging/debian/README.md +0 -320
  699. data/packaging/debian/Vagrantfile +0 -25
  700. data/packaging/debian/build +0 -210
  701. data/packaging/debian/debian_specs/nginx/changelog +0 -1989
  702. data/packaging/debian/debian_specs/nginx/compat.erb +0 -5
  703. data/packaging/debian/debian_specs/nginx/conf/fastcgi.conf +0 -25
  704. data/packaging/debian/debian_specs/nginx/conf/fastcgi_params +0 -24
  705. data/packaging/debian/debian_specs/nginx/conf/koi-utf +0 -109
  706. data/packaging/debian/debian_specs/nginx/conf/koi-win +0 -103
  707. data/packaging/debian/debian_specs/nginx/conf/mime.types +0 -89
  708. data/packaging/debian/debian_specs/nginx/conf/nginx.conf.erb +0 -97
  709. data/packaging/debian/debian_specs/nginx/conf/proxy_params +0 -4
  710. data/packaging/debian/debian_specs/nginx/conf/scgi_params +0 -16
  711. data/packaging/debian/debian_specs/nginx/conf/sites-available/default.erb +0 -93
  712. data/packaging/debian/debian_specs/nginx/conf/snippets/fastcgi-php.conf +0 -13
  713. data/packaging/debian/debian_specs/nginx/conf/snippets/snakeoil.conf +0 -5
  714. data/packaging/debian/debian_specs/nginx/conf/uwsgi_params +0 -16
  715. data/packaging/debian/debian_specs/nginx/conf/win-utf +0 -125
  716. data/packaging/debian/debian_specs/nginx/control.erb +0 -226
  717. data/packaging/debian/debian_specs/nginx/copyright +0 -196
  718. data/packaging/debian/debian_specs/nginx/debian-full.lintian-overrides +0 -1
  719. data/packaging/debian/debian_specs/nginx/gbp.conf +0 -2
  720. data/packaging/debian/debian_specs/nginx/help/docs/fcgiwrap +0 -14
  721. data/packaging/debian/debian_specs/nginx/help/docs/php +0 -119
  722. data/packaging/debian/debian_specs/nginx/help/docs/support-irc +0 -28
  723. data/packaging/debian/debian_specs/nginx/help/docs/upstream +0 -51
  724. data/packaging/debian/debian_specs/nginx/help/examples/drupal +0 -114
  725. data/packaging/debian/debian_specs/nginx/help/examples/http +0 -59
  726. data/packaging/debian/debian_specs/nginx/help/examples/mail +0 -30
  727. data/packaging/debian/debian_specs/nginx/help/examples/mailman +0 -59
  728. data/packaging/debian/debian_specs/nginx/help/examples/nginx.conf +0 -34
  729. data/packaging/debian/debian_specs/nginx/help/examples/nginx_modsite +0 -162
  730. data/packaging/debian/debian_specs/nginx/help/examples/virtual_hosts +0 -155
  731. data/packaging/debian/debian_specs/nginx/help/examples/wordpress +0 -74
  732. data/packaging/debian/debian_specs/nginx/helpers.rb +0 -41
  733. data/packaging/debian/debian_specs/nginx/index-debian.html.in +0 -32
  734. data/packaging/debian/debian_specs/nginx/index-ubuntu.html.in +0 -32
  735. data/packaging/debian/debian_specs/nginx/index.html.erb +0 -10
  736. data/packaging/debian/debian_specs/nginx/modules/README.Modules-versions +0 -65
  737. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/README.markdown +0 -510
  738. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/config +0 -5
  739. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/doc/HttpHeadersMoreModule.wiki +0 -395
  740. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ddebug.h +0 -119
  741. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_filter_module.c +0 -348
  742. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_filter_module.h +0 -80
  743. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_headers_in.c +0 -826
  744. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_headers_in.h +0 -26
  745. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_headers_out.c +0 -716
  746. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_headers_out.h +0 -26
  747. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_util.c +0 -380
  748. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_util.h +0 -52
  749. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/util/build.sh +0 -32
  750. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/valgrind.suppress +0 -215
  751. data/packaging/debian/debian_specs/nginx/modules/nginx-auth-pam/ChangeLog +0 -35
  752. data/packaging/debian/debian_specs/nginx/modules/nginx-auth-pam/LICENSE +0 -25
  753. data/packaging/debian/debian_specs/nginx/modules/nginx-auth-pam/README.md +0 -93
  754. data/packaging/debian/debian_specs/nginx/modules/nginx-auth-pam/config +0 -4
  755. data/packaging/debian/debian_specs/nginx/modules/nginx-auth-pam/ngx_http_auth_pam_module.c +0 -462
  756. data/packaging/debian/debian_specs/nginx/modules/nginx-cache-purge/CHANGES +0 -66
  757. data/packaging/debian/debian_specs/nginx/modules/nginx-cache-purge/LICENSE +0 -26
  758. data/packaging/debian/debian_specs/nginx/modules/nginx-cache-purge/README.md +0 -171
  759. data/packaging/debian/debian_specs/nginx/modules/nginx-cache-purge/TODO.md +0 -7
  760. data/packaging/debian/debian_specs/nginx/modules/nginx-cache-purge/config +0 -21
  761. data/packaging/debian/debian_specs/nginx/modules/nginx-cache-purge/ngx_cache_purge_module.c +0 -1803
  762. data/packaging/debian/debian_specs/nginx/modules/nginx-dav-ext-module/README +0 -29
  763. data/packaging/debian/debian_specs/nginx/modules/nginx-dav-ext-module/config +0 -9
  764. data/packaging/debian/debian_specs/nginx/modules/nginx-dav-ext-module/ngx_http_dav_ext_module.c +0 -824
  765. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/README +0 -139
  766. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/README_AUTO_LIB +0 -395
  767. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/TODO +0 -1
  768. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/actions/array +0 -10
  769. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/actions/palloc +0 -8
  770. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/build +0 -597
  771. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/action_replacements +0 -5
  772. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/action_types +0 -12
  773. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/conf_args +0 -22
  774. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/conf_locs +0 -25
  775. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/conf_macros +0 -35
  776. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/contexts +0 -22
  777. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/header_files +0 -3
  778. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/headers +0 -4
  779. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/module_dependencies +0 -5
  780. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/modules_optional +0 -15
  781. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/prefixes +0 -2
  782. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/src/array.h +0 -7
  783. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/src/conf_cmd_basic.h +0 -43
  784. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/src/conf_merge.h +0 -78
  785. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/src/palloc.h +0 -6
  786. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/text/autogen +0 -12
  787. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/config +0 -49
  788. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/docs/core/action_macros +0 -63
  789. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/docs/core/conf_cmds +0 -62
  790. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/docs/modules/set_var +0 -124
  791. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/docs/patches/more_logging_info +0 -48
  792. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/docs/upstream/list +0 -45
  793. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/examples/README +0 -12
  794. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/examples/http/set_var/config +0 -4
  795. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/examples/http/set_var/ngx_http_set_var_examples_module.c +0 -136
  796. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/ngx_auto_lib_core +0 -797
  797. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/notes/CHANGES +0 -17
  798. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/notes/LICENSE +0 -24
  799. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_array.h +0 -113
  800. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_conf_cmd_basic.h +0 -2203
  801. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_conf_cmd_extra.h +0 -5423
  802. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_conf_merge.h +0 -227
  803. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_config.c +0 -72
  804. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_config.h +0 -98
  805. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_includes.h +0 -66
  806. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_palloc.h +0 -112
  807. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/patches/auto_config +0 -16
  808. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/patches/expose_rewrite_functions +0 -291
  809. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/patches/rewrite_phase_handler +0 -19
  810. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/hash/md5.h +0 -117
  811. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/hash/murmurhash2.c +0 -77
  812. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/hash/sha.h +0 -200
  813. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk.c +0 -155
  814. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk.h +0 -58
  815. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_buf.c +0 -43
  816. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_buf.h +0 -5
  817. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_complex_path.c +0 -129
  818. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_complex_path.h +0 -30
  819. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_complex_value.c +0 -192
  820. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_complex_value.h +0 -21
  821. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_conf_file.c +0 -396
  822. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_conf_file.h +0 -44
  823. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_debug.c +0 -72
  824. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_debug.h +0 -171
  825. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_encoding.c +0 -57
  826. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_encoding.h +0 -12
  827. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_hash.c +0 -82
  828. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_hash.h +0 -45
  829. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_http.c +0 -138
  830. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_http.h +0 -3
  831. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_http_headers.h +0 -35
  832. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_log.c +0 -3
  833. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_log.h +0 -165
  834. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_parse.h +0 -67
  835. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_path.c +0 -583
  836. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_path.h +0 -22
  837. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_process.c +0 -20
  838. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_process.h +0 -12
  839. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_regex.c +0 -215
  840. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_regex.h +0 -7
  841. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_rewrite.c +0 -103
  842. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_rewrite.h +0 -26
  843. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_set_var.c +0 -602
  844. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_set_var.h +0 -44
  845. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_string.c +0 -434
  846. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_string.h +0 -37
  847. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_string_util.h +0 -14
  848. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_upstream_list.c +0 -205
  849. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_upstream_list.h +0 -27
  850. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_uri.c +0 -45
  851. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_uri.h +0 -6
  852. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/LICENSE +0 -25
  853. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/README.markdown +0 -1850
  854. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/config +0 -5
  855. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/doc/HttpEchoModule.wiki +0 -1558
  856. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ddebug.h +0 -109
  857. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_echo.c +0 -344
  858. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_echo.h +0 -25
  859. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_filter.c +0 -282
  860. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_filter.h +0 -15
  861. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_foreach.c +0 -183
  862. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_foreach.h +0 -16
  863. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_handler.c +0 -429
  864. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_handler.h +0 -18
  865. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_location.c +0 -178
  866. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_location.h +0 -13
  867. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_module.c +0 -667
  868. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_module.h +0 -137
  869. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_request_info.c +0 -452
  870. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_request_info.h +0 -31
  871. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_sleep.c +0 -208
  872. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_sleep.h +0 -16
  873. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_subrequest.c +0 -788
  874. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_subrequest.h +0 -19
  875. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_timer.c +0 -96
  876. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_timer.h +0 -13
  877. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_util.c +0 -298
  878. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_util.h +0 -58
  879. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_var.c +0 -110
  880. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_var.h +0 -9
  881. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/util/build.sh +0 -45
  882. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/util/releng +0 -8
  883. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/util/wiki2pod.pl +0 -131
  884. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/valgrind.suppress +0 -38
  885. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/LICENCE +0 -24
  886. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/README +0 -206
  887. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/changelog.txt +0 -54
  888. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/config +0 -26
  889. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/protocol.txt +0 -191
  890. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/ngx_http_push_defs.c +0 -59
  891. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/ngx_http_push_defs.h +0 -73
  892. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/ngx_http_push_module.c +0 -783
  893. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/ngx_http_push_module.h +0 -31
  894. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/ngx_http_push_module_setup.c +0 -361
  895. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/ngx_http_push_types.h +0 -120
  896. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/memory/store.c +0 -1180
  897. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/memory/store.h +0 -1
  898. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/ngx_http_push_module_ipc.c +0 -146
  899. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/ngx_http_push_module_ipc.h +0 -5
  900. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/ngx_http_push_store.h +0 -51
  901. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/ngx_rwlock.c +0 -178
  902. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/ngx_rwlock.h +0 -5
  903. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/rbtree_util.c +0 -246
  904. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/rbtree_util.h +0 -9
  905. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/Changes +0 -51
  906. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/README.markdown +0 -6954
  907. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/config +0 -363
  908. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/doc/HttpLuaModule.wiki +0 -5898
  909. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/dtrace/ngx_lua_provider.d +0 -61
  910. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/misc/recv-until-pm/Makefile +0 -3
  911. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/misc/recv-until-pm/lib/RecvUntil.pm +0 -138
  912. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/misc/recv-until-pm/t/sanity.t +0 -140
  913. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/api/ngx_http_lua_api.h +0 -52
  914. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ddebug.h +0 -82
  915. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_accessby.c +0 -377
  916. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_accessby.h +0 -22
  917. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_api.c +0 -77
  918. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_args.c +0 -537
  919. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_args.h +0 -20
  920. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_bodyfilterby.c +0 -632
  921. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_bodyfilterby.h +0 -31
  922. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_cache.c +0 -296
  923. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_cache.h +0 -24
  924. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_capturefilter.c +0 -175
  925. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_capturefilter.h +0 -20
  926. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_clfactory.c +0 -887
  927. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_clfactory.h +0 -22
  928. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_common.h +0 -478
  929. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_config.c +0 -67
  930. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_config.h +0 -19
  931. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_consts.c +0 -148
  932. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_consts.h +0 -20
  933. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_contentby.c +0 -369
  934. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_contentby.h +0 -26
  935. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_control.c +0 -483
  936. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_control.h +0 -20
  937. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_coroutine.c +0 -379
  938. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_coroutine.h +0 -23
  939. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_ctx.c +0 -216
  940. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_ctx.h +0 -23
  941. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_directive.c +0 -1081
  942. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_directive.h +0 -56
  943. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_exception.c +0 -58
  944. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_exception.h +0 -33
  945. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headerfilterby.c +0 -302
  946. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headerfilterby.h +0 -29
  947. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headers.c +0 -1370
  948. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headers.h +0 -22
  949. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headers_in.c +0 -782
  950. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headers_in.h +0 -22
  951. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headers_out.c +0 -625
  952. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headers_out.h +0 -23
  953. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_initby.c +0 -42
  954. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_initby.h +0 -23
  955. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_initworkerby.c +0 -320
  956. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_initworkerby.h +0 -25
  957. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_log.c +0 -300
  958. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_log.h +0 -20
  959. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_logby.c +0 -227
  960. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_logby.h +0 -22
  961. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_misc.c +0 -252
  962. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_misc.h +0 -20
  963. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_module.c +0 -924
  964. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_ndk.c +0 -184
  965. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_ndk.h +0 -21
  966. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_output.c +0 -794
  967. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_output.h +0 -28
  968. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_pcrefix.c +0 -106
  969. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_pcrefix.h +0 -23
  970. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_phase.c +0 -94
  971. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_phase.h +0 -13
  972. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_probe.h +0 -85
  973. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_regex.c +0 -2468
  974. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_regex.h +0 -22
  975. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_req_body.c +0 -1169
  976. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_req_body.h +0 -20
  977. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_req_method.c +0 -252
  978. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_req_method.h +0 -19
  979. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_rewriteby.c +0 -351
  980. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_rewriteby.h +0 -22
  981. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_script.c +0 -538
  982. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_script.h +0 -86
  983. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_setby.c +0 -216
  984. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_setby.h +0 -15
  985. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_shdict.c +0 -1844
  986. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_shdict.h +0 -52
  987. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_sleep.c +0 -191
  988. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_sleep.h +0 -20
  989. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_socket_tcp.c +0 -5314
  990. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_socket_tcp.h +0 -156
  991. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_socket_udp.c +0 -1624
  992. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_socket_udp.h +0 -56
  993. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_string.c +0 -704
  994. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_string.h +0 -20
  995. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_subrequest.c +0 -1741
  996. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_subrequest.h +0 -46
  997. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_time.c +0 -278
  998. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_time.h +0 -21
  999. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_timer.c +0 -661
  1000. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_timer.h +0 -20
  1001. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_uri.c +0 -110
  1002. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_uri.h +0 -20
  1003. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_uthread.c +0 -283
  1004. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_uthread.h +0 -36
  1005. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_util.c +0 -3972
  1006. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_util.h +0 -423
  1007. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_variable.c +0 -499
  1008. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_variable.h +0 -20
  1009. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_worker.c +0 -64
  1010. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_worker.h +0 -17
  1011. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/tapset/ngx_lua.stp +0 -5
  1012. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/build.sh +0 -39
  1013. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/build2.sh +0 -55
  1014. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/fix-comments +0 -27
  1015. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/gdbinit +0 -415
  1016. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/ngx-links +0 -62
  1017. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/reindex +0 -64
  1018. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/releng +0 -8
  1019. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/retab +0 -8
  1020. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/revim +0 -102
  1021. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/run_test.sh +0 -10
  1022. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/update-readme.sh +0 -4
  1023. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/valgrind.suppress +0 -144
  1024. data/packaging/debian/debian_specs/nginx/modules/nginx-upload-progress/CHANGES +0 -107
  1025. data/packaging/debian/debian_specs/nginx/modules/nginx-upload-progress/LICENSE +0 -25
  1026. data/packaging/debian/debian_specs/nginx/modules/nginx-upload-progress/Makefile +0 -8
  1027. data/packaging/debian/debian_specs/nginx/modules/nginx-upload-progress/README +0 -329
  1028. data/packaging/debian/debian_specs/nginx/modules/nginx-upload-progress/config +0 -3
  1029. data/packaging/debian/debian_specs/nginx/modules/nginx-upload-progress/ngx_http_uploadprogress_module.c +0 -1774
  1030. data/packaging/debian/debian_specs/nginx/modules/nginx-upstream-fair/README +0 -53
  1031. data/packaging/debian/debian_specs/nginx/modules/nginx-upstream-fair/config +0 -3
  1032. data/packaging/debian/debian_specs/nginx/modules/nginx-upstream-fair/ngx_http_upstream_fair_module.c +0 -1356
  1033. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/CHANGELOG.md +0 -37
  1034. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/HACKING.md +0 -24
  1035. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/LICENSE +0 -20
  1036. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/README.rst +0 -182
  1037. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/config +0 -8
  1038. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/nginx-0.6-support.patch +0 -23
  1039. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/ngx_http_fancyindex_module.c +0 -1305
  1040. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/template.awk +0 -52
  1041. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/template.h +0 -103
  1042. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/template.html +0 -102
  1043. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/CHANGES +0 -37
  1044. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/README +0 -141
  1045. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/config +0 -3
  1046. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/doc/README.google_code_home_page.wiki +0 -120
  1047. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/doc/README.html +0 -199
  1048. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/doc/README.wiki +0 -123
  1049. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/ngx_http_subs_filter_module.c +0 -1298
  1050. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/README +0 -275
  1051. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/AutoInstall.pm +0 -820
  1052. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install.pm +0 -470
  1053. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/AutoInstall.pm +0 -82
  1054. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Base.pm +0 -83
  1055. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Can.pm +0 -81
  1056. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Fetch.pm +0 -93
  1057. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Include.pm +0 -34
  1058. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Makefile.pm +0 -415
  1059. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Metadata.pm +0 -716
  1060. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/TestBase.pm +0 -29
  1061. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Win32.pm +0 -64
  1062. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/WriteAll.pm +0 -63
  1063. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Spiffy.pm +0 -539
  1064. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Test/Base.pm +0 -682
  1065. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Test/Base/Filter.pm +0 -341
  1066. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Test/Builder.pm +0 -1413
  1067. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Test/Builder/Module.pm +0 -81
  1068. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Test/More.pm +0 -735
  1069. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/lib/Test/Nginx.pm +0 -315
  1070. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/lib/Test/Nginx/LWP.pm +0 -524
  1071. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/lib/Test/Nginx/Socket.pm +0 -1749
  1072. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/lib/Test/Nginx/Util.pm +0 -874
  1073. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/t/subs.t +0 -136
  1074. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/t/subs_capture.t +0 -32
  1075. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/t/subs_fix_string.t +0 -32
  1076. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/t/subs_regex.t +0 -108
  1077. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/t/subs_types.t +0 -59
  1078. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/test.sh +0 -5
  1079. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/util/update-readme.sh +0 -7
  1080. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/util/wiki2google_code_homepage.pl +0 -29
  1081. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/util/wiki2pod.pl +0 -129
  1082. data/packaging/debian/debian_specs/nginx/nginx-common.NEWS +0 -135
  1083. data/packaging/debian/debian_specs/nginx/nginx-common.README.Debian +0 -45
  1084. data/packaging/debian/debian_specs/nginx/nginx-common.dirs.erb +0 -32
  1085. data/packaging/debian/debian_specs/nginx/nginx-common.install +0 -3
  1086. data/packaging/debian/debian_specs/nginx/nginx-common.lintian-overrides +0 -2
  1087. data/packaging/debian/debian_specs/nginx/nginx-common.manpages +0 -1
  1088. data/packaging/debian/debian_specs/nginx/nginx-common.nginx.default +0 -10
  1089. data/packaging/debian/debian_specs/nginx/nginx-common.nginx.init.erb +0 -214
  1090. data/packaging/debian/debian_specs/nginx/nginx-common.nginx.logrotate +0 -18
  1091. data/packaging/debian/debian_specs/nginx/nginx-common.nginx.service.erb +0 -37
  1092. data/packaging/debian/debian_specs/nginx/nginx-common.postinst.erb +0 -66
  1093. data/packaging/debian/debian_specs/nginx/nginx-common.postrm.erb +0 -46
  1094. data/packaging/debian/debian_specs/nginx/nginx-common.preinst +0 -47
  1095. data/packaging/debian/debian_specs/nginx/nginx-common.prerm.erb +0 -28
  1096. data/packaging/debian/debian_specs/nginx/nginx-doc.docs +0 -2
  1097. data/packaging/debian/debian_specs/nginx/nginx-doc.examples +0 -1
  1098. data/packaging/debian/debian_specs/nginx/nginx-extras.install.erb +0 -17
  1099. data/packaging/debian/debian_specs/nginx/nginx-extras.lintian-overrides +0 -1
  1100. data/packaging/debian/debian_specs/nginx/nginx-extras.postinst.erb +0 -44
  1101. data/packaging/debian/debian_specs/nginx/nginx-extras.prerm +0 -22
  1102. data/packaging/debian/debian_specs/nginx/nginx.1 +0 -47
  1103. data/packaging/debian/debian_specs/nginx/patches/perl-use-dpkg-buildflags.patch +0 -23
  1104. data/packaging/debian/debian_specs/nginx/patches/series +0 -1
  1105. data/packaging/debian/debian_specs/nginx/rules.erb +0 -185
  1106. data/packaging/debian/debian_specs/nginx/source/format +0 -1
  1107. data/packaging/debian/debian_specs/nginx/tests/control +0 -4
  1108. data/packaging/debian/debian_specs/nginx/ufw/nginx +0 -14
  1109. data/packaging/debian/debian_specs/nginx/upstream/signing-key.asc +0 -34
  1110. data/packaging/debian/debian_specs/nginx/watch +0 -3
  1111. data/packaging/debian/debian_specs/passenger/README.Debian +0 -12
  1112. data/packaging/debian/debian_specs/passenger/changelog +0 -316
  1113. data/packaging/debian/debian_specs/passenger/compat +0 -1
  1114. data/packaging/debian/debian_specs/passenger/control.erb +0 -123
  1115. data/packaging/debian/debian_specs/passenger/copyright +0 -385
  1116. data/packaging/debian/debian_specs/passenger/helpers.rb +0 -24
  1117. data/packaging/debian/debian_specs/passenger/libapache2-mod-passenger.install +0 -3
  1118. data/packaging/debian/debian_specs/passenger/libapache2-mod-passenger.postinst +0 -36
  1119. data/packaging/debian/debian_specs/passenger/libapache2-mod-passenger.prerm +0 -15
  1120. data/packaging/debian/debian_specs/passenger/locations.ini.erb +0 -14
  1121. data/packaging/debian/debian_specs/passenger/passenger-dev.install.erb +0 -3
  1122. data/packaging/debian/debian_specs/passenger/passenger-doc.install.erb +0 -2
  1123. data/packaging/debian/debian_specs/passenger/passenger.conf +0 -6
  1124. data/packaging/debian/debian_specs/passenger/passenger.docs +0 -4
  1125. data/packaging/debian/debian_specs/passenger/passenger.install.erb +0 -16
  1126. data/packaging/debian/debian_specs/passenger/passenger.load +0 -3
  1127. data/packaging/debian/debian_specs/passenger/passenger.manpages +0 -3
  1128. data/packaging/debian/debian_specs/passenger/passenger_free_ruby.c +0 -29
  1129. data/packaging/debian/debian_specs/passenger/passenger_ruby_utils.c +0 -54
  1130. data/packaging/debian/debian_specs/passenger/passenger_system_ruby.c.erb +0 -37
  1131. data/packaging/debian/debian_specs/passenger/rules.erb +0 -84
  1132. data/packaging/debian/debian_specs/passenger/source/format +0 -1
  1133. data/packaging/debian/debian_specs/passenger_enterprise/README.Debian +0 -12
  1134. data/packaging/debian/debian_specs/passenger_enterprise/changelog +0 -316
  1135. data/packaging/debian/debian_specs/passenger_enterprise/compat +0 -1
  1136. data/packaging/debian/debian_specs/passenger_enterprise/control.erb +0 -123
  1137. data/packaging/debian/debian_specs/passenger_enterprise/copyright +0 -385
  1138. data/packaging/debian/debian_specs/passenger_enterprise/helpers.rb +0 -2
  1139. data/packaging/debian/debian_specs/passenger_enterprise/libapache2-mod-passenger-enterprise.install +0 -3
  1140. data/packaging/debian/debian_specs/passenger_enterprise/libapache2-mod-passenger-enterprise.postinst +0 -36
  1141. data/packaging/debian/debian_specs/passenger_enterprise/libapache2-mod-passenger-enterprise.prerm +0 -15
  1142. data/packaging/debian/debian_specs/passenger_enterprise/locations.ini.erb +0 -14
  1143. data/packaging/debian/debian_specs/passenger_enterprise/passenger-enterprise-dev.install.erb +0 -3
  1144. data/packaging/debian/debian_specs/passenger_enterprise/passenger-enterprise-doc.install.erb +0 -2
  1145. data/packaging/debian/debian_specs/passenger_enterprise/passenger-enterprise.docs +0 -4
  1146. data/packaging/debian/debian_specs/passenger_enterprise/passenger-enterprise.install.erb +0 -14
  1147. data/packaging/debian/debian_specs/passenger_enterprise/passenger-enterprise.manpages +0 -3
  1148. data/packaging/debian/debian_specs/passenger_enterprise/passenger.conf +0 -6
  1149. data/packaging/debian/debian_specs/passenger_enterprise/passenger.load +0 -3
  1150. data/packaging/debian/debian_specs/passenger_enterprise/passenger_free_ruby.c.erb +0 -1
  1151. data/packaging/debian/debian_specs/passenger_enterprise/passenger_ruby_utils.c.erb +0 -1
  1152. data/packaging/debian/debian_specs/passenger_enterprise/passenger_system_ruby.c.erb +0 -1
  1153. data/packaging/debian/debian_specs/passenger_enterprise/patches/series +0 -0
  1154. data/packaging/debian/debian_specs/passenger_enterprise/rules.erb +0 -84
  1155. data/packaging/debian/debian_specs/passenger_enterprise/source/format +0 -1
  1156. data/packaging/debian/docker_images/Makefile +0 -38
  1157. data/packaging/debian/docker_images/buildbox/CONTAINER_VERSION.txt +0 -0
  1158. data/packaging/debian/docker_images/buildbox/Dockerfile +0 -3
  1159. data/packaging/debian/docker_images/buildbox/Gemfile +0 -9
  1160. data/packaging/debian/docker_images/buildbox/Gemfile.lock +0 -42
  1161. data/packaging/debian/docker_images/buildbox/install.sh +0 -85
  1162. data/packaging/debian/docker_images/buildbox/pbuilderrc +0 -4
  1163. data/packaging/debian/docker_images/buildbox/sudoers.conf +0 -6
  1164. data/packaging/debian/docker_images/setup-buildbox-docker-image +0 -7
  1165. data/packaging/debian/docker_images/setup-testbox-docker-image-debian-6 +0 -7
  1166. data/packaging/debian/docker_images/setup-testbox-docker-image-debian-7 +0 -7
  1167. data/packaging/debian/docker_images/setup-testbox-docker-image-debian-8 +0 -7
  1168. data/packaging/debian/docker_images/setup-testbox-docker-image-ubuntu-12.04 +0 -7
  1169. data/packaging/debian/docker_images/setup-testbox-docker-image-ubuntu-14.04 +0 -7
  1170. data/packaging/debian/docker_images/setup-testbox-docker-image-ubuntu-15.04 +0 -7
  1171. data/packaging/debian/docker_images/setup-testbox-docker-image-ubuntu-15.10 +0 -7
  1172. data/packaging/debian/docker_images/testbox-debian-6/Dockerfile +0 -3
  1173. data/packaging/debian/docker_images/testbox-debian-6/Gemfile +0 -2
  1174. data/packaging/debian/docker_images/testbox-debian-6/Gemfile.lock +0 -23
  1175. data/packaging/debian/docker_images/testbox-debian-6/argparse.py +0 -2374
  1176. data/packaging/debian/docker_images/testbox-debian-6/install.sh +0 -78
  1177. data/packaging/debian/docker_images/testbox-debian-7/Dockerfile +0 -3
  1178. data/packaging/debian/docker_images/testbox-debian-7/Gemfile +0 -2
  1179. data/packaging/debian/docker_images/testbox-debian-7/Gemfile.lock +0 -23
  1180. data/packaging/debian/docker_images/testbox-debian-7/install.sh +0 -71
  1181. data/packaging/debian/docker_images/testbox-debian-8/Dockerfile +0 -3
  1182. data/packaging/debian/docker_images/testbox-debian-8/Gemfile +0 -2
  1183. data/packaging/debian/docker_images/testbox-debian-8/Gemfile.lock +0 -23
  1184. data/packaging/debian/docker_images/testbox-debian-8/install.sh +0 -70
  1185. data/packaging/debian/docker_images/testbox-ubuntu-12.04/Dockerfile +0 -3
  1186. data/packaging/debian/docker_images/testbox-ubuntu-12.04/Gemfile +0 -2
  1187. data/packaging/debian/docker_images/testbox-ubuntu-12.04/Gemfile.lock +0 -23
  1188. data/packaging/debian/docker_images/testbox-ubuntu-12.04/install.sh +0 -69
  1189. data/packaging/debian/docker_images/testbox-ubuntu-14.04/Dockerfile +0 -3
  1190. data/packaging/debian/docker_images/testbox-ubuntu-14.04/Gemfile +0 -2
  1191. data/packaging/debian/docker_images/testbox-ubuntu-14.04/Gemfile.lock +0 -23
  1192. data/packaging/debian/docker_images/testbox-ubuntu-14.04/install.sh +0 -69
  1193. data/packaging/debian/docker_images/testbox-ubuntu-15.04/Dockerfile +0 -3
  1194. data/packaging/debian/docker_images/testbox-ubuntu-15.04/Gemfile +0 -2
  1195. data/packaging/debian/docker_images/testbox-ubuntu-15.04/Gemfile.lock +0 -23
  1196. data/packaging/debian/docker_images/testbox-ubuntu-15.04/install.sh +0 -69
  1197. data/packaging/debian/docker_images/testbox-ubuntu-15.10/Dockerfile +0 -3
  1198. data/packaging/debian/docker_images/testbox-ubuntu-15.10/Gemfile +0 -2
  1199. data/packaging/debian/docker_images/testbox-ubuntu-15.10/Gemfile.lock +0 -23
  1200. data/packaging/debian/docker_images/testbox-ubuntu-15.10/install.sh +0 -69
  1201. data/packaging/debian/internal/build/Rakefile +0 -235
  1202. data/packaging/debian/internal/build/build-passenger-orig-tarball.sh +0 -76
  1203. data/packaging/debian/internal/build/build-source-package.rb +0 -121
  1204. data/packaging/debian/internal/build/download-nginx-orig-tarball.sh +0 -17
  1205. data/packaging/debian/internal/build/rakefile_support.rb +0 -96
  1206. data/packaging/debian/internal/build/setup-environment-essentials.sh +0 -15
  1207. data/packaging/debian/internal/build/setup-environment.sh +0 -29
  1208. data/packaging/debian/internal/lib/distro_info.rb +0 -82
  1209. data/packaging/debian/internal/lib/distro_info.sh +0 -303
  1210. data/packaging/debian/internal/lib/distro_info.sh.erb +0 -65
  1211. data/packaging/debian/internal/lib/library.sh +0 -83
  1212. data/packaging/debian/internal/lib/preprocessor.rb +0 -173
  1213. data/packaging/debian/internal/lib/tracking.rb +0 -95
  1214. data/packaging/debian/internal/lib/tracking_category.rb +0 -45
  1215. data/packaging/debian/internal/lib/tracking_database.rb +0 -132
  1216. data/packaging/debian/internal/lib/tracking_task.rb +0 -148
  1217. data/packaging/debian/internal/lib/utils.rb +0 -78
  1218. data/packaging/debian/internal/publish/Rakefile +0 -97
  1219. data/packaging/debian/internal/publish/oss-binaries.phusionpassenger.com-fingerprint.txt +0 -1
  1220. data/packaging/debian/internal/publish/packagecloud_fingerprint.txt +0 -1
  1221. data/packaging/debian/internal/publish/passenger_website_fingerprint.txt +0 -1
  1222. data/packaging/debian/internal/publish/preinit.sh +0 -7
  1223. data/packaging/debian/internal/publish/rakefile_support.rb +0 -183
  1224. data/packaging/debian/internal/scripts/gpg_noninteractive/gpg +0 -11
  1225. data/packaging/debian/internal/scripts/initccache.sh +0 -35
  1226. data/packaging/debian/internal/scripts/inituidgid.sh +0 -19
  1227. data/packaging/debian/internal/scripts/my_init +0 -340
  1228. data/packaging/debian/internal/scripts/pin_certificates +0 -34
  1229. data/packaging/debian/internal/scripts/regen_distro_info_script.sh +0 -3
  1230. data/packaging/debian/internal/scripts/setup-vagrant.sh +0 -12
  1231. data/packaging/debian/internal/scripts/setuser +0 -31
  1232. data/packaging/debian/internal/shell/initpbuilder.sh +0 -3
  1233. data/packaging/debian/internal/shell/preinit.sh +0 -28
  1234. data/packaging/debian/internal/shell/sudoers.conf +0 -1
  1235. data/packaging/debian/internal/test/apache/apache-24.conf +0 -5
  1236. data/packaging/debian/internal/test/apache/apache-pre-24.conf +0 -4
  1237. data/packaging/debian/internal/test/apache/vhost.conf +0 -17
  1238. data/packaging/debian/internal/test/misc/config.json +0 -15
  1239. data/packaging/debian/internal/test/misc/hosts.conf +0 -4
  1240. data/packaging/debian/internal/test/misc/init.sh +0 -25
  1241. data/packaging/debian/internal/test/misc/nodejs_test_app.js +0 -6
  1242. data/packaging/debian/internal/test/misc/python_test_app.py +0 -3
  1243. data/packaging/debian/internal/test/misc/ruby_test_app.rb +0 -5
  1244. data/packaging/debian/internal/test/misc/test_support.rb +0 -61
  1245. data/packaging/debian/internal/test/nginx/vhost.conf +0 -23
  1246. data/packaging/debian/internal/test/system_web_server_test.rb +0 -126
  1247. data/packaging/debian/internal/test/test.sh +0 -141
  1248. data/packaging/debian/jenkins/publish/clear_caches.rb +0 -48
  1249. data/packaging/debian/jenkins/publish/publish.sh +0 -69
  1250. data/packaging/debian/jenkins/test/test.sh +0 -63
  1251. data/packaging/debian/passenger_apt_automation.sublime-project +0 -14
  1252. data/packaging/debian/publish +0 -172
  1253. data/packaging/debian/shell +0 -116
  1254. data/packaging/debian/test +0 -142
  1255. data/packaging/rpm/passenger_spec/rubygem-passenger-4.0.18-gcc47-include-sys_types.patch +0 -45
  1256. data/test/cxx/Base64Test.cpp +0 -50
  1257. data/test/cxx/FileBackedPipeTest.cpp +0 -626
  1258. data/test/cxx/HttpHeaderBuffererTest.cpp +0 -257
  1259. data/test/cxx/ScgiRequestParserTest.cpp +0 -423
  1260. data/test/cxx/ServerInstanceDirTest.cpp +0 -175
  1261. data/test/ruby/admin_tools_spec.rb +0 -360
  1262. data/test/ruby/classic_rails/loader_spec.rb +0 -46
  1263. data/test/ruby/classic_rails/preloader_spec.rb +0 -52
  1264. data/test/ruby/standalone/runtime_locator_spec.rb +0 -214
  1265. data/test/stub/rails2.3/Rakefile +0 -10
  1266. data/test/stub/rails2.3/app/controllers/application_controller.rb +0 -10
  1267. data/test/stub/rails2.3/app/controllers/bar_controller_1.rb +0 -5
  1268. data/test/stub/rails2.3/app/controllers/bar_controller_2.rb +0 -5
  1269. data/test/stub/rails2.3/app/controllers/foo_controller.rb +0 -21
  1270. data/test/stub/rails2.3/app/helpers/application_helper.rb +0 -3
  1271. data/test/stub/rails2.3/app/helpers/bar_helper.rb +0 -2
  1272. data/test/stub/rails2.3/app/helpers/foo_helper.rb +0 -2
  1273. data/test/stub/rails2.3/config/boot.rb +0 -110
  1274. data/test/stub/rails2.3/config/database.yml +0 -19
  1275. data/test/stub/rails2.3/config/environment.rb +0 -62
  1276. data/test/stub/rails2.3/config/environments/development.rb +0 -17
  1277. data/test/stub/rails2.3/config/environments/production.rb +0 -18
  1278. data/test/stub/rails2.3/config/environments/staging.rb +0 -18
  1279. data/test/stub/rails2.3/config/initializers/inflections.rb +0 -10
  1280. data/test/stub/rails2.3/config/initializers/mime_types.rb +0 -5
  1281. data/test/stub/rails2.3/config/routes.rb +0 -35
  1282. data/test/stub/rails2.3/log/.gitignore +0 -1
  1283. data/test/stub/rails2.3/public/.gitignore +0 -1
  1284. data/test/stub/rails2.3/script/about +0 -3
  1285. data/test/stub/rails2.3/script/console +0 -3
  1286. data/test/stub/rails2.3/script/dbconsole +0 -3
  1287. data/test/stub/rails2.3/script/destroy +0 -3
  1288. data/test/stub/rails2.3/script/generate +0 -3
  1289. data/test/stub/rails2.3/script/performance/benchmarker +0 -3
  1290. data/test/stub/rails2.3/script/performance/profiler +0 -3
  1291. data/test/stub/rails2.3/script/performance/request +0 -3
  1292. data/test/stub/rails2.3/script/plugin +0 -3
  1293. data/test/stub/rails2.3/script/process/inspector +0 -3
  1294. data/test/stub/rails2.3/script/process/reaper +0 -3
  1295. data/test/stub/rails2.3/script/process/spawner +0 -3
  1296. data/test/stub/rails2.3/script/runner +0 -3
  1297. data/test/stub/rails2.3/script/server +0 -3
  1298. data/test/stub/rails2.3/tmp/cache/.gitignore +0 -1
  1299. data/test/stub/rails2.3/tmp/pids/.gitignore +0 -1
  1300. data/test/stub/rails2.3/tmp/sessions/.gitignore +0 -1
  1301. data/test/stub/rails2.3/tmp/sockets/.gitignore +0 -1
@@ -292,17 +292,19 @@ public:
292
292
  NULL);
293
293
  _exit(1);
294
294
  } catch (...) {
295
- fprintf(stderr, "Passenger Watchdog: dup2() failed: %s (%d)\n",
295
+ fprintf(stderr, "PassengerWatchdog: dup2() failed: %s (%d)\n",
296
296
  strerror(e), e);
297
297
  fflush(stderr);
298
298
  _exit(1);
299
299
  }
300
300
  }
301
301
 
302
+ resetSignalHandlersAndMask();
302
303
  closeAllFileDescriptors(FEEDBACK_FD);
303
304
 
304
305
  /* Become the process group leader so that the watchdog can kill the
305
- * agent as well as all its descendant processes. */
306
+ * agent as well as all its descendant processes, and so that a Ctrl-C
307
+ * only affects the watchdog but not agents. */
306
308
  setpgid(getpid(), getpid());
307
309
 
308
310
  setOomScore(oldOomScore);
@@ -321,7 +323,7 @@ public:
321
323
  toString(e).c_str(),
322
324
  NULL);
323
325
  } catch (...) {
324
- fprintf(stderr, "Passenger Watchdog: could not execute %s: %s (%d)\n",
326
+ fprintf(stderr, "PassengerWatchdog: could not execute %s: %s (%d)\n",
325
327
  exeFilename.c_str(), strerror(e), e);
326
328
  fflush(stderr);
327
329
  }
@@ -415,8 +417,8 @@ public:
415
417
  throw RuntimeException(string("Unable to start the ") + name() +
416
418
  " because its executable (" + getExeFilename() + ") "
417
419
  "doesn't exist. This probably means that your "
418
- "Phusion Passenger installation is broken or "
419
- "incomplete. Please reinstall Phusion Passenger");
420
+ PROGRAM_NAME " installation is broken or "
421
+ "incomplete. Please reinstall " PROGRAM_NAME);
420
422
  } else {
421
423
  throw SystemException(string("Unable to start the ") + name() +
422
424
  " because exec(\"" + getExeFilename() + "\") failed",
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  * Phusion Passenger - https://www.phusionpassenger.com/
3
- * Copyright (c) 2010-2013 Phusion
3
+ * Copyright (c) 2010-2014 Phusion
4
4
  *
5
5
  * "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.
6
6
  *
@@ -25,71 +25,50 @@
25
25
 
26
26
  class HelperAgentWatcher: public AgentWatcher {
27
27
  protected:
28
- string helperAgentFilename;
29
- VariantMap params, report;
30
- string requestSocketFilename;
31
- string messageSocketFilename;
28
+ string agentFilename;
32
29
 
33
30
  virtual const char *name() const {
34
- return "Phusion Passenger helper agent";
31
+ return PROGRAM_NAME " helper agent";
35
32
  }
36
33
 
37
34
  virtual string getExeFilename() const {
38
- return helperAgentFilename;
35
+ return agentFilename;
39
36
  }
40
37
 
41
38
  virtual void execProgram() const {
42
39
  if (hasEnvOption("PASSENGER_RUN_HELPER_AGENT_IN_VALGRIND", false)) {
43
40
  execlp("valgrind", "valgrind", "--dsymutil=yes",
44
- helperAgentFilename.c_str(), (char *) 0);
41
+ agentFilename.c_str(), AGENT_EXE, "server",
42
+ // Some extra space to allow the child process to change its process title.
43
+ " ", (char *) 0);
45
44
  } else {
46
- execl(helperAgentFilename.c_str(), "PassengerHelperAgent", (char *) 0);
45
+ execl(agentFilename.c_str(), AGENT_EXE, "server",
46
+ // Some extra space to allow the child process to change its process title.
47
+ " ", (char *) 0);
47
48
  }
48
49
  }
49
50
 
50
51
  virtual void sendStartupArguments(pid_t pid, FileDescriptor &fd) {
51
- VariantMap options = agentsOptions;
52
- params.addTo(options);
52
+ VariantMap options = *agentsOptions;
53
+ options.erase("logging_agent_authorizations");
53
54
  options.writeToFd(fd);
54
55
  }
55
56
 
56
57
  virtual bool processStartupInfo(pid_t pid, FileDescriptor &fd, const vector<string> &args) {
57
- if (args[0] == "initialized") {
58
- requestSocketFilename = args[1];
59
- messageSocketFilename = args[2];
60
- return true;
61
- } else {
62
- return false;
63
- }
58
+ return args[0] == "initialized";
64
59
  }
65
60
 
66
61
  public:
67
62
  HelperAgentWatcher(const WorkingObjectsPtr &wo)
68
63
  : AgentWatcher(wo)
69
64
  {
70
- helperAgentFilename = wo->resourceLocator->getAgentsDir() + "/PassengerHelperAgent";
71
-
72
- report
73
- .set("request_socket_filename",
74
- agentsOptions.get("request_socket_filename", false,
75
- wo->generation->getPath() + "/request"))
76
- .set("request_socket_password",
77
- agentsOptions.get("request_socket_password", false,
78
- wo->randomGenerator.generateAsciiString(REQUEST_SOCKET_PASSWORD_SIZE)))
79
- .set("helper_agent_admin_socket_address",
80
- agentsOptions.get("helper_agent_admin_socket_address", false,
81
- "unix:" + wo->generation->getPath() + "/helper_admin"))
82
- .set("helper_agent_exit_password",
83
- agentsOptions.get("helper_agent_exit_password", false,
84
- wo->randomGenerator.generateAsciiString(MESSAGE_SERVER_MAX_PASSWORD_SIZE)));
85
-
86
- params = report;
87
- params
88
- .set("logging_agent_address", wo->loggingAgentAddress)
89
- .set("logging_agent_password", wo->loggingAgentPassword);
65
+ agentFilename = wo->resourceLocator->findSupportBinary(AGENT_EXE);
90
66
  }
91
67
 
92
68
  virtual void reportAgentsInformation(VariantMap &report) {
93
- this->report.addTo(report);
69
+ const VariantMap &options = *agentsOptions;
70
+ vector<string> addresses = options.getStrSet("server_addresses");
71
+ report.set("server_address", addresses.front());
72
+ report.set("server_password", options.get("server_password"));
94
73
  }
95
74
  };
@@ -0,0 +1,116 @@
1
+ /*
2
+ * Phusion Passenger - https://www.phusionpassenger.com/
3
+ * Copyright (c) 2010-2014 Phusion
4
+ *
5
+ * "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.
6
+ *
7
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
8
+ * of this software and associated documentation files (the "Software"), to deal
9
+ * in the Software without restriction, including without limitation the rights
10
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
+ * copies of the Software, and to permit persons to whom the Software is
12
+ * furnished to do so, subject to the following conditions:
13
+ *
14
+ * The above copyright notice and this permission notice shall be included in
15
+ * all copies or substantial portions of the Software.
16
+ *
17
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23
+ * THE SOFTWARE.
24
+ */
25
+
26
+ /**
27
+ * Touch all files in the server instance dir every 6 hours in order to prevent /tmp
28
+ * cleaners from weaking havoc:
29
+ * http://code.google.com/p/phusion-passenger/issues/detail?id=365
30
+ */
31
+ class InstanceDirToucher {
32
+ private:
33
+ WorkingObjectsPtr wo;
34
+ oxt::thread *thr;
35
+
36
+ void
37
+ threadMain() {
38
+ while (!this_thread::interruption_requested()) {
39
+ syscalls::sleep(60 * 60);
40
+
41
+ begin_touch:
42
+
43
+ this_thread::disable_interruption di;
44
+ this_thread::disable_syscall_interruption dsi;
45
+ // Fork a process which touches everything in the server instance dir.
46
+ pid_t pid = syscalls::fork();
47
+ if (pid == 0) {
48
+ // Child
49
+ int prio, ret, e;
50
+
51
+ closeAllFileDescriptors(2);
52
+
53
+ // Make process nicer.
54
+ do {
55
+ prio = getpriority(PRIO_PROCESS, getpid());
56
+ } while (prio == -1 && errno == EINTR);
57
+ if (prio != -1) {
58
+ prio++;
59
+ if (prio > 20) {
60
+ prio = 20;
61
+ }
62
+ do {
63
+ ret = setpriority(PRIO_PROCESS, getpid(), prio);
64
+ } while (ret == -1 && errno == EINTR);
65
+ } else {
66
+ perror("getpriority");
67
+ }
68
+
69
+ do {
70
+ ret = chdir(wo->instanceDir->getPath().c_str());
71
+ } while (ret == -1 && errno == EINTR);
72
+ if (ret == -1) {
73
+ e = errno;
74
+ fprintf(stderr, "chdir(\"%s\") failed: %s (%d)\n",
75
+ wo->instanceDir->getPath().c_str(),
76
+ strerror(e), e);
77
+ fflush(stderr);
78
+ _exit(1);
79
+ }
80
+
81
+ setOomScore(oldOomScore);
82
+
83
+ execlp("/bin/sh", "/bin/sh", "-c", "find . | xargs touch", (char *) 0);
84
+ e = errno;
85
+ fprintf(stderr, "Cannot execute 'find . | xargs touch': %s (%d)\n",
86
+ strerror(e), e);
87
+ fflush(stderr);
88
+ _exit(1);
89
+ } else if (pid == -1) {
90
+ // Error
91
+ P_WARN("Could not touch the server instance directory because "
92
+ "fork() failed. Retrying in 2 minutes...");
93
+ this_thread::restore_interruption si(di);
94
+ this_thread::restore_syscall_interruption rsi(dsi);
95
+ syscalls::sleep(60 * 2);
96
+ goto begin_touch;
97
+ } else {
98
+ syscalls::waitpid(pid, NULL, 0);
99
+ }
100
+ }
101
+ }
102
+
103
+ public:
104
+ InstanceDirToucher(const WorkingObjectsPtr &wo) {
105
+ this->wo = wo;
106
+ thr = new oxt::thread(boost::bind(&InstanceDirToucher::threadMain, this),
107
+ "Server instance dir toucher", 256 * 1024);
108
+ }
109
+
110
+ ~InstanceDirToucher() {
111
+ thr->interrupt_and_join();
112
+ delete thr;
113
+ }
114
+ };
115
+
116
+ typedef boost::shared_ptr<InstanceDirToucher> InstanceDirToucherPtr;
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  * Phusion Passenger - https://www.phusionpassenger.com/
3
- * Copyright (c) 2010-2013 Phusion
3
+ * Copyright (c) 2010-2014 Phusion
4
4
  *
5
5
  * "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.
6
6
  *
@@ -29,7 +29,7 @@ protected:
29
29
  string socketAddress;
30
30
 
31
31
  virtual const char *name() const {
32
- return "Phusion Passenger logging agent";
32
+ return PROGRAM_NAME " logging agent";
33
33
  }
34
34
 
35
35
  virtual string getExeFilename() const {
@@ -37,36 +37,32 @@ protected:
37
37
  }
38
38
 
39
39
  virtual void execProgram() const {
40
- execl(agentFilename.c_str(), "PassengerLoggingAgent", (char *) 0);
40
+ execl(agentFilename.c_str(), AGENT_EXE, "logger",
41
+ // Some extra space to allow the child process to change its process title.
42
+ " ", (char *) 0);
41
43
  }
42
44
 
43
45
  virtual void sendStartupArguments(pid_t pid, FileDescriptor &fd) {
44
- VariantMap options = agentsOptions;
45
- options.set("logging_agent_address", wo->loggingAgentAddress);
46
- options.set("logging_agent_password", wo->loggingAgentPassword);
47
- options.set("logging_agent_admin_address", wo->loggingAgentAdminAddress);
46
+ VariantMap options = *agentsOptions;
47
+ options.erase("server_password");
48
+ options.erase("server_authorizations");
48
49
  options.writeToFd(fd);
49
50
  }
50
51
 
51
52
  virtual bool processStartupInfo(pid_t pid, FileDescriptor &fd, const vector<string> &args) {
52
- if (args[0] == "initialized") {
53
- return true;
54
- } else {
55
- return false;
56
- }
53
+ return args[0] == "initialized";
57
54
  }
58
55
 
59
56
  public:
60
57
  LoggingAgentWatcher(const WorkingObjectsPtr &wo)
61
58
  : AgentWatcher(wo)
62
59
  {
63
- agentFilename = wo->resourceLocator->getAgentsDir() + "/PassengerLoggingAgent";
60
+ agentFilename = wo->resourceLocator->findSupportBinary(AGENT_EXE);
64
61
  }
65
62
 
66
63
  virtual void reportAgentsInformation(VariantMap &report) {
67
- report
68
- .set("logging_socket_address", wo->loggingAgentAddress)
69
- .set("logging_socket_password", wo->loggingAgentPassword)
70
- .set("logging_socket_admin_address", wo->loggingAgentAdminAddress);
64
+ const VariantMap &options = *agentsOptions;
65
+ report.set("logging_agent_address", options.get("logging_agent_address"));
66
+ report.set("logging_agent_password", options.get("logging_agent_password"));
71
67
  }
72
68
  };
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  * Phusion Passenger - https://www.phusionpassenger.com/
3
- * Copyright (c) 2010-2013 Phusion
3
+ * Copyright (c) 2010-2014 Phusion
4
4
  *
5
5
  * "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.
6
6
  *
@@ -32,34 +32,49 @@
32
32
  #include <string>
33
33
  #include <utility>
34
34
  #include <vector>
35
+ #include <algorithm>
36
+
37
+ #if !defined(sun) && !defined(__sun)
38
+ #define HAVE_FLOCK
39
+ #endif
35
40
 
36
41
  #include <sys/select.h>
37
42
  #include <sys/types.h>
38
43
  #include <sys/time.h>
44
+ #ifdef HAVE_FLOCK
45
+ #include <sys/file.h>
46
+ #endif
39
47
  #include <sys/resource.h>
40
48
  #include <unistd.h>
49
+ #include <pwd.h>
50
+ #include <grp.h>
51
+ #include <fcntl.h>
41
52
  #include <cstdio>
42
53
  #include <cstdlib>
43
54
  #include <cstring>
44
55
  #include <cerrno>
45
56
 
46
57
  #include <agents/Base.h>
58
+ #include <agents/HelperAgent/OptionParser.h>
59
+ #include <agents/LoggingAgent/OptionParser.h>
60
+ #include <agents/Watchdog/AdminServer.h>
47
61
  #include <Constants.h>
48
- #include <ServerInstanceDir.h>
62
+ #include <InstanceDirectory.h>
49
63
  #include <FileDescriptor.h>
50
64
  #include <RandomGenerator.h>
65
+ #include <BackgroundEventLoop.h>
51
66
  #include <Logging.h>
52
67
  #include <Exceptions.h>
53
68
  #include <StaticString.h>
54
69
  #include <Hooks.h>
55
70
  #include <ResourceLocator.h>
56
71
  #include <Utils.h>
57
- #include <Utils/Base64.h>
58
72
  #include <Utils/Timer.h>
59
73
  #include <Utils/ScopeGuard.h>
60
74
  #include <Utils/StrIntUtils.h>
61
75
  #include <Utils/IOUtils.h>
62
76
  #include <Utils/MessageIO.h>
77
+ #include <Utils/OptionParsing.h>
63
78
  #include <Utils/VariantMap.h>
64
79
 
65
80
  using namespace std;
@@ -75,70 +90,67 @@ enum OomFileType {
75
90
 
76
91
  #define REQUEST_SOCKET_PASSWORD_SIZE 64
77
92
 
78
- class ServerInstanceDirToucher;
93
+ class InstanceDirToucher;
79
94
  class AgentWatcher;
80
- static bool hasEnvOption(const char *name, bool defaultValue = false);
81
- static void setOomScore(const StaticString &score);
82
-
83
95
 
84
- /***** Agent options *****/
85
-
86
- static VariantMap agentsOptions;
87
- static string tempDir;
88
- static bool userSwitching;
89
- static string defaultUser;
90
- static string defaultGroup;
91
- static uid_t webServerWorkerUid;
92
- static gid_t webServerWorkerGid;
93
96
 
94
97
  /***** Working objects *****/
95
98
 
96
- struct WorkingObjects {
97
- RandomGenerator randomGenerator;
98
- EventFd errorEvent;
99
- ResourceLocatorPtr resourceLocator;
100
- ServerInstanceDirPtr serverInstanceDir;
101
- ServerInstanceDir::GenerationPtr generation;
102
- uid_t defaultUid;
103
- gid_t defaultGid;
104
- vector<string> cleanupPidfiles;
105
- string loggingAgentAddress;
106
- string loggingAgentPassword;
107
- string loggingAgentAdminAddress;
108
- string adminToolStatusPassword;
109
- string adminToolManipulationPassword;
110
- };
99
+ namespace Passenger {
100
+ namespace WatchdogAgent {
101
+ struct WorkingObjects {
102
+ RandomGenerator randomGenerator;
103
+ EventFd errorEvent;
104
+ EventFd exitEvent;
105
+ ResourceLocatorPtr resourceLocator;
106
+ uid_t defaultUid;
107
+ gid_t defaultGid;
108
+ InstanceDirectoryPtr instanceDir;
109
+ int lockFile;
110
+ vector<string> cleanupPidfiles;
111
+ bool pidsCleanedUp;
112
+ bool pidFileCleanedUp;
113
+
114
+ vector<AdminServer::Authorization> adminAuthorizations;
115
+ int adminServerFds[SERVER_KIT_MAX_SERVER_ENDPOINTS];
116
+ BackgroundEventLoop *bgloop;
117
+ ServerKit::Context *serverKitContext;
118
+ AdminServer *adminServer;
119
+
120
+ WorkingObjects()
121
+ : pidsCleanedUp(false),
122
+ pidFileCleanedUp(false),
123
+ bgloop(NULL),
124
+ serverKitContext(NULL),
125
+ adminServer(NULL)
126
+ {
127
+ for (unsigned int i = 0; i < SERVER_KIT_MAX_SERVER_ENDPOINTS; i++) {
128
+ adminServerFds[i] = -1;
129
+ }
130
+ }
131
+ };
132
+
133
+ typedef boost::shared_ptr<WorkingObjects> WorkingObjectsPtr;
134
+ } // namespace WatchdogAgent
135
+ } // namespace Passenger
111
136
 
112
- typedef boost::shared_ptr<WorkingObjects> WorkingObjectsPtr;
137
+ using namespace Passenger::WatchdogAgent;
113
138
 
139
+ static VariantMap *agentsOptions;
140
+ static WorkingObjects *workingObjects;
114
141
  static string oldOomScore;
115
142
 
143
+ static void setOomScore(const StaticString &score);
144
+ static void cleanup(const WorkingObjectsPtr &wo);
145
+
116
146
  #include "AgentWatcher.cpp"
117
- #include "ServerInstanceDirToucher.cpp"
147
+ #include "InstanceDirToucher.cpp"
118
148
  #include "HelperAgentWatcher.cpp"
119
149
  #include "LoggingAgentWatcher.cpp"
120
150
 
121
151
 
122
152
  /***** Functions *****/
123
153
 
124
- static bool
125
- hasEnvOption(const char *name, bool defaultValue) {
126
- const char *value = getenv(name);
127
- if (value != NULL) {
128
- if (*value != '\0') {
129
- return strcmp(value, "yes") == 0
130
- || strcmp(value, "y") == 0
131
- || strcmp(value, "1") == 0
132
- || strcmp(value, "on") == 0
133
- || strcmp(value, "true") == 0;
134
- } else {
135
- return defaultValue;
136
- }
137
- } else {
138
- return defaultValue;
139
- }
140
- }
141
-
142
154
  static FILE *
143
155
  openOomAdjFile(const char *mode, OomFileType &type) {
144
156
  FILE *f = fopen("/proc/self/oom_score_adj", mode);
@@ -223,6 +235,12 @@ setOomScoreNeverKill() {
223
235
  return oldScore;
224
236
  }
225
237
 
238
+ static void
239
+ terminationHandler(int signo) {
240
+ ssize_t ret = write(workingObjects->exitEvent.writerFd(), "x", 1);
241
+ (void) ret; // Don't care about the result.
242
+ }
243
+
226
244
  /**
227
245
  * Wait until the starter process has exited or sent us an exit command,
228
246
  * or until one of the watcher threads encounter an error. If a thread
@@ -234,20 +252,31 @@ setOomScoreNeverKill() {
234
252
  */
235
253
  static bool
236
254
  waitForStarterProcessOrWatchers(const WorkingObjectsPtr &wo, vector<AgentWatcherPtr> &watchers) {
255
+ TRACE_POINT();
237
256
  fd_set fds;
238
- int max, ret;
257
+ int max = -1, ret;
239
258
  char x;
240
259
 
241
- FD_ZERO(&fds);
242
- FD_SET(FEEDBACK_FD, &fds);
243
- FD_SET(wo->errorEvent.fd(), &fds);
260
+ wo->bgloop->start("Main event loop", 0);
244
261
 
245
- if (FEEDBACK_FD > wo->errorEvent.fd()) {
246
- max = FEEDBACK_FD;
247
- } else {
248
- max = wo->errorEvent.fd();
262
+ struct sigaction action;
263
+ action.sa_handler = terminationHandler;
264
+ action.sa_flags = SA_RESTART;
265
+ sigemptyset(&action.sa_mask);
266
+ sigaction(SIGINT, &action, NULL);
267
+ sigaction(SIGTERM, &action, NULL);
268
+
269
+ FD_ZERO(&fds);
270
+ if (feedbackFdAvailable()) {
271
+ FD_SET(FEEDBACK_FD, &fds);
272
+ max = std::max(max, FEEDBACK_FD);
249
273
  }
274
+ FD_SET(wo->errorEvent.fd(), &fds);
275
+ max = std::max(max, wo->errorEvent.fd());
276
+ FD_SET(wo->exitEvent.fd(), &fds);
277
+ max = std::max(max, wo->exitEvent.fd());
250
278
 
279
+ UPDATE_TRACE_POINT();
251
280
  ret = syscalls::select(max + 1, &fds, NULL, NULL, NULL);
252
281
  if (ret == -1) {
253
282
  int e = errno;
@@ -255,7 +284,20 @@ waitForStarterProcessOrWatchers(const WorkingObjectsPtr &wo, vector<AgentWatcher
255
284
  return false;
256
285
  }
257
286
 
287
+ action.sa_handler = SIG_DFL;
288
+ sigaction(SIGINT, &action, NULL);
289
+ sigaction(SIGTERM, &action, NULL);
290
+
291
+ P_DEBUG("Stopping admin server");
292
+ wo->bgloop->stop();
293
+ for (unsigned int i = 0; i < SERVER_KIT_MAX_SERVER_ENDPOINTS; i++) {
294
+ if (wo->adminServerFds[i] != -1) {
295
+ syscalls::close(wo->adminServerFds[i]);
296
+ }
297
+ }
298
+
258
299
  if (FD_ISSET(wo->errorEvent.fd(), &fds)) {
300
+ UPDATE_TRACE_POINT();
259
301
  vector<AgentWatcherPtr>::const_iterator it;
260
302
  string message, backtrace, watcherName;
261
303
 
@@ -272,7 +314,11 @@ waitForStarterProcessOrWatchers(const WorkingObjectsPtr &wo, vector<AgentWatcher
272
314
  message << "\n" << backtrace);
273
315
  }
274
316
  return false;
317
+ } else if (FD_ISSET(wo->exitEvent.fd(), &fds)) {
318
+ return true;
275
319
  } else {
320
+ UPDATE_TRACE_POINT();
321
+ assert(feedbackFdAvailable());
276
322
  ret = syscalls::read(FEEDBACK_FD, &x, 1);
277
323
  return ret == 1 && x == 'c';
278
324
  }
@@ -313,19 +359,28 @@ killCleanupPids(const vector<pid_t> &cleanupPids) {
313
359
 
314
360
  static void
315
361
  killCleanupPids(const WorkingObjectsPtr &wo) {
316
- killCleanupPids(readCleanupPids(wo));
362
+ if (!wo->pidsCleanedUp) {
363
+ killCleanupPids(readCleanupPids(wo));
364
+ wo->pidsCleanedUp = true;
365
+ }
366
+ }
367
+
368
+ static void
369
+ deletePidFile(const WorkingObjectsPtr &wo) {
370
+ string pidFile = agentsOptions->get("pid_file", false);
371
+ if (!pidFile.empty() && !wo->pidFileCleanedUp && agentsOptions->getBool("delete_pid_file")) {
372
+ syscalls::unlink(pidFile.c_str());
373
+ wo->pidFileCleanedUp = true;
374
+ }
317
375
  }
318
376
 
319
377
  static void
320
378
  cleanupAgentsInBackground(const WorkingObjectsPtr &wo, vector<AgentWatcherPtr> &watchers, char *argv[]) {
321
379
  this_thread::disable_interruption di;
322
380
  this_thread::disable_syscall_interruption dsi;
323
- vector<pid_t> cleanupPids;
324
381
  pid_t pid;
325
382
  int e;
326
383
 
327
- cleanupPids = readCleanupPids(wo);
328
-
329
384
  pid = fork();
330
385
  if (pid == 0) {
331
386
  // Child
@@ -341,9 +396,10 @@ cleanupAgentsInBackground(const WorkingObjectsPtr &wo, vector<AgentWatcherPtr> &
341
396
  strcpy(argv[0], "PassengerWatchdog (cleaning up...)");
342
397
  #endif
343
398
 
344
- // Wait until all agent processes have exited. The starter
345
- // process is responsible for telling the individual agents
346
- // to exit.
399
+ P_DEBUG("Sending SIGTERM to all agent processes");
400
+ for (it = watchers.begin(); it != watchers.end(); it++) {
401
+ (*it)->signalShutdown();
402
+ }
347
403
 
348
404
  max = 0;
349
405
  FD_ZERO(&fds);
@@ -354,6 +410,7 @@ cleanupAgentsInBackground(const WorkingObjectsPtr &wo, vector<AgentWatcherPtr> &
354
410
  }
355
411
  }
356
412
 
413
+ P_DEBUG("Waiting until all agent processes have exited...");
357
414
  timer.start();
358
415
  agentProcessesDone = 0;
359
416
  while (agentProcessesDone != -1
@@ -382,29 +439,18 @@ cleanupAgentsInBackground(const WorkingObjectsPtr &wo, vector<AgentWatcherPtr> &
382
439
  if (agentProcessesDone == -1 || timer.elapsed() >= deadline) {
383
440
  // An error occurred or we've waited long enough. Kill all the
384
441
  // processes.
385
- P_WARN("Some Phusion Passenger agent processes did not exit " <<
442
+ P_WARN("Some " PROGRAM_NAME " agent processes did not exit " <<
386
443
  "in time, forcefully shutting down all.");
387
444
  } else {
388
- P_DEBUG("All Phusion Passenger agent processes have exited. Forcing all subprocesses to shut down.");
389
- }
390
- P_DEBUG("Sending SIGTERM");
391
- for (it = watchers.begin(); it != watchers.end(); it++) {
392
- (*it)->signalShutdown();
445
+ P_DEBUG("All " PROGRAM_NAME " agent processes have exited. Forcing all subprocesses to shut down.");
393
446
  }
394
- usleep(1000000);
395
- P_DEBUG("Sending SIGKILL");
447
+ P_DEBUG("Sending SIGKILL to all agent processes");
396
448
  for (it = watchers.begin(); it != watchers.end(); it++) {
397
449
  (*it)->forceShutdown();
398
450
  }
399
451
 
400
- // Now clean up the server instance directory.
401
- wo->generation->destroy();
402
- wo->serverInstanceDir->destroy();
403
-
404
- // Notify given PIDs about our shutdown.
405
- killCleanupPids(cleanupPids);
452
+ cleanup(wo);
406
453
 
407
- strcpy(argv[0], "PassengerWatchdog (cleaning up 6...)");
408
454
  _exit(0);
409
455
  } catch (const std::exception &e) {
410
456
  P_CRITICAL("An exception occurred during cleaning up: " << e.what());
@@ -423,8 +469,7 @@ cleanupAgentsInBackground(const WorkingObjectsPtr &wo, vector<AgentWatcherPtr> &
423
469
  // Parent
424
470
 
425
471
  // Let child process handle cleanup.
426
- wo->serverInstanceDir->detach();
427
- wo->generation->detach();
472
+ wo->instanceDir->detach();
428
473
  }
429
474
  }
430
475
 
@@ -432,14 +477,15 @@ static void
432
477
  forceAllAgentsShutdown(const WorkingObjectsPtr &wo, vector<AgentWatcherPtr> &watchers) {
433
478
  vector<AgentWatcherPtr>::iterator it;
434
479
 
480
+ P_DEBUG("Sending SIGTERM to all agent processes");
435
481
  for (it = watchers.begin(); it != watchers.end(); it++) {
436
482
  (*it)->signalShutdown();
437
483
  }
438
484
  usleep(1000000);
485
+ P_DEBUG("Sending SIGKILL to all agent processes");
439
486
  for (it = watchers.begin(); it != watchers.end(); it++) {
440
487
  (*it)->forceShutdown();
441
488
  }
442
- killCleanupPids(wo);
443
489
  }
444
490
 
445
491
  static string
@@ -459,14 +505,241 @@ runHookScriptAndThrowOnError(const char *name) {
459
505
  HookScriptOptions options;
460
506
 
461
507
  options.name = name;
462
- options.spec = agentsOptions.get(string("hook_") + name, false);
463
- options.agentsOptions = &agentsOptions;
508
+ options.spec = agentsOptions->get(string("hook_") + name, false);
509
+ options.agentsOptions = agentsOptions;
464
510
 
465
511
  if (!runHookScripts(options)) {
466
512
  throw RuntimeException(string("Hook script ") + name + " failed");
467
513
  }
468
514
  }
469
515
 
516
+
517
+ static void
518
+ usage() {
519
+ printf("Usage: " AGENT_EXE " watchdog <OPTIONS...>\n");
520
+ printf("Runs the " PROGRAM_NAME " watchdog.\n\n");
521
+ printf("The watchdog runs and supervises various " PROGRAM_NAME " agent processes,\n");
522
+ printf("namely the HTTP server and logging server. Arguments marked with \"[A]\", e.g.\n");
523
+ printf("--passenger-root and --log-level, are automatically passed to all supervised\n");
524
+ printf("agents, unless you explicitly override them by passing extra arguments to a\n");
525
+ printf("supervised agent specifically. You can pass arguments to a supervised agent by\n");
526
+ printf("wrapping those arguments between --BS/--ES and --BL/--EL.\n");
527
+ printf("\n");
528
+ printf(" Example 1: pass some arguments to the HTTP server.\n\n");
529
+ printf(" " AGENT_EXE " watchdog --passenger-root /opt/passenger \\\n");
530
+ printf(" --BS --listen tcp://127.0.0.1:4000 /webapps/foo\n");
531
+ printf("\n");
532
+ printf(" Example 2: pass some arguments to the HTTP server, and some others to the\n");
533
+ printf(" logging server. The watchdog itself and the HTTP server will use logging\n");
534
+ printf(" level 3, while the logging server will use logging level 1.\n\n");
535
+ printf(" " AGENT_EXE " watchdog --passenger-root /opt/passenger \\\n");
536
+ printf(" --BS --listen tcp://127.0.0.1:4000 /webapps/foo --ES \\\n");
537
+ printf(" --BL --log-level 1 --EL \\\n");
538
+ printf(" --log-level 3\n");
539
+ printf("\n");
540
+ printf("Required options:\n");
541
+ printf(" --passenger-root PATH The location to the " PROGRAM_NAME " source\n");
542
+ printf(" directory [A]\n");
543
+ printf("\n");
544
+ printf("Argument passing options (optional):\n");
545
+ printf(" --BS, --begin-server-args Signals the beginning of arguments to pass to the\n");
546
+ printf(" HTTP server\n");
547
+ printf(" --ES, --end-server-args Signals the end of arguments to pass to the HTTP\n");
548
+ printf(" server\n");
549
+ printf(" --BL, --begin-logger-args Signals the beginning of arguments to pass to the\n");
550
+ printf(" logging server\n");
551
+ printf(" --EL, --end-logger-args Signals the end of arguments to pass to the\n");
552
+ printf(" logging server\n");
553
+ printf("\n");
554
+ printf("Other options (optional):\n");
555
+ printf(" --admin-listen ADDRESS\n");
556
+ printf(" Listen on the given address for admin commands.\n");
557
+ printf(" The address must be formatted as tcp://IP:PORT for\n");
558
+ printf(" TCP sockets, or unix:PATH for Unix domain sockets.\n");
559
+ printf(" You can specify this option multiple times (up to\n");
560
+ printf(" %u times) to listen on multiple addresses.\n",
561
+ SERVER_KIT_MAX_SERVER_ENDPOINTS - 1);
562
+ printf(" --authorize [LEVEL]:USERNAME:PASSWORDFILE\n");
563
+ printf(" Enables authentication on the admin server, through\n");
564
+ printf(" the given admin account. LEVEL indicates the\n");
565
+ printf(" privilege level (see below). PASSWORDFILE must\n");
566
+ printf(" point to a file containing the password\n");
567
+ printf("\n");
568
+ printf(" --instance-registry-dir Directory to register instance into.\n");
569
+ printf(" Default: %s\n", getSystemTempDir());
570
+ printf("\n");
571
+ printf(" --no-user-switching Disables user switching support [A]\n");
572
+ printf(" --default-user NAME Default user to start apps as, when user\n");
573
+ printf(" switching is enabled. Default: " DEFAULT_WEB_APP_USER "\n");
574
+ printf(" --default-group NAME Default group to start apps as, when user\n");
575
+ printf(" switching is disabled. Default: the default\n");
576
+ printf(" user's primary group\n");
577
+ printf("\n");
578
+ printf(" --daemonize Daemonize into the background\n");
579
+ printf(" --user NAME Lower privilege to the given user\n");
580
+ printf(" --pid-file PATH Store the watchdog's PID in the given file. The\n");
581
+ printf(" file is deleted on exit\n");
582
+ printf(" --no-delete-pid-file Do not delete PID file on exit\n");
583
+ printf(" --log-file PATH Log to the given file.\n");
584
+ printf(" --log-level LEVEL Logging level. [A] Default: %d\n", DEFAULT_LOG_LEVEL);
585
+ printf(" --cleanup-pidfile PATH Upon shutdown, kill the process specified by\n");
586
+ printf(" the given PID file\n");
587
+ printf("\n");
588
+ printf(" --ctl NAME=VALUE Set custom internal option\n");
589
+ printf("\n");
590
+ printf(" -h, --help Show this help\n");
591
+ printf("\n");
592
+ printf("[A] = Automatically passed to supervised agents\n");
593
+ printf("\n");
594
+ printf("Admin account privilege levels (ordered from most to least privileges):\n");
595
+ printf(" readonly Read-only access\n");
596
+ printf(" full Full access (default)\n");
597
+ }
598
+
599
+ static void
600
+ parseOptions(int argc, const char *argv[], VariantMap &options) {
601
+ OptionParser p(usage);
602
+ int i = 2;
603
+
604
+ while (i < argc) {
605
+ if (p.isValueFlag(argc, i, argv[i], '\0', "--passenger-root")) {
606
+ options.set("passenger_root", argv[i + 1]);
607
+ i += 2;
608
+ } else if (p.isFlag(argv[i], '\0', "--BS")
609
+ || p.isFlag(argv[i], '\0', "--begin-server-args"))
610
+ {
611
+ i++;
612
+ while (i < argc) {
613
+ if (p.isFlag(argv[i], '\0', "--ES")
614
+ || p.isFlag(argv[i], '\0', "--end-server-args"))
615
+ {
616
+ i++;
617
+ break;
618
+ } else if (p.isFlag(argv[i], '\0', "--BL")
619
+ || p.isFlag(argv[i], '\0', "--begin-logger-args"))
620
+ {
621
+ break;
622
+ } else if (!parseServerOption(argc, argv, i, options)) {
623
+ fprintf(stderr, "ERROR: unrecognized HTTP server argument %s. Please "
624
+ "type '%s server --help' for usage.\n", argv[i], argv[0]);
625
+ exit(1);
626
+ }
627
+ }
628
+ } else if (p.isFlag(argv[i], '\0', "--BL")
629
+ || p.isFlag(argv[i], '\0', "--begin-logger-args"))
630
+ {
631
+ i++;
632
+ while (i < argc) {
633
+ if (p.isFlag(argv[i], '\0', "--EL")
634
+ || p.isFlag(argv[i], '\0', "--end-logger-args"))
635
+ {
636
+ i++;
637
+ break;
638
+ } else if (p.isFlag(argv[i], '\0', "--BS")
639
+ || p.isFlag(argv[i], '\0', "--begin-server-args"))
640
+ {
641
+ break;
642
+ } else if (!parseLoggingAgentOption(argc, argv, i, options)) {
643
+ fprintf(stderr, "ERROR: unrecognized logging agent argument %s. Please "
644
+ "type '%s logger --help' for usage.\n", argv[i], argv[0]);
645
+ exit(1);
646
+ }
647
+ }
648
+ } else if (p.isValueFlag(argc, i, argv[i], '\0', "--admin-listen")) {
649
+ if (getSocketAddressType(argv[i + 1]) != SAT_UNKNOWN) {
650
+ vector<string> addresses = options.getStrSet("watchdog_admin_addresses",
651
+ false);
652
+ if (addresses.size() == SERVER_KIT_MAX_SERVER_ENDPOINTS - 1) {
653
+ fprintf(stderr, "ERROR: you may specify up to %u --admin-listen addresses.\n",
654
+ SERVER_KIT_MAX_SERVER_ENDPOINTS - 1);
655
+ exit(1);
656
+ }
657
+ addresses.push_back(argv[i + 1]);
658
+ options.setStrSet("watchdog_admin_addresses", addresses);
659
+ i += 2;
660
+ } else {
661
+ fprintf(stderr, "ERROR: invalid address format for --admin-listen. The address "
662
+ "must be formatted as tcp://IP:PORT for TCP sockets, or unix:PATH "
663
+ "for Unix domain sockets.\n");
664
+ exit(1);
665
+ }
666
+ } else if (p.isValueFlag(argc, i, argv[i], '\0', "--authorize")) {
667
+ vector<string> args;
668
+ vector<string> authorizations = options.getStrSet("watchdog_authorizations",
669
+ false);
670
+
671
+ split(argv[i + 1], ':', args);
672
+ if (args.size() < 2 || args.size() > 3) {
673
+ fprintf(stderr, "ERROR: invalid format for --authorize. The syntax "
674
+ "is \"[LEVEL:]USERNAME:PASSWORDFILE\".\n");
675
+ exit(1);
676
+ }
677
+
678
+ authorizations.push_back(argv[i + 1]);
679
+ options.setStrSet("watchdog_authorizations", authorizations);
680
+ i += 2;
681
+ } else if (p.isValueFlag(argc, i, argv[i], '\0', "--instance-registry-dir")) {
682
+ options.set("instance_registry_dir", argv[i + 1]);
683
+ i += 2;
684
+ } else if (p.isFlag(argv[i], '\0', "--no-user-switching")) {
685
+ options.setBool("user_switching", false);
686
+ i++;
687
+ } else if (p.isValueFlag(argc, i, argv[i], '\0', "--default-user")) {
688
+ options.set("default_user", argv[i + 1]);
689
+ i += 2;
690
+ } else if (p.isValueFlag(argc, i, argv[i], '\0', "--default-group")) {
691
+ options.set("default_group", argv[i + 1]);
692
+ i += 2;
693
+ } else if (p.isFlag(argv[i], '\0', "--daemonize")) {
694
+ options.setBool("daemonize", true);
695
+ i++;
696
+ } else if (p.isValueFlag(argc, i, argv[i], '\0', "--user")) {
697
+ options.set("user", argv[i + 1]);
698
+ i += 2;
699
+ } else if (p.isValueFlag(argc, i, argv[i], '\0', "--pid-file")) {
700
+ options.set("pid_file", argv[i + 1]);
701
+ i += 2;
702
+ } else if (p.isFlag(argv[i], '\0', "--no-delete-pid-file")) {
703
+ options.setBool("delete_pid_file", false);
704
+ i++;
705
+ } else if (p.isValueFlag(argc, i, argv[i], '\0', "--log-level")) {
706
+ options.setInt("log_level", atoi(argv[i + 1]));
707
+ i += 2;
708
+ } else if (p.isValueFlag(argc, i, argv[i], '\0', "--cleanup-pidfile")) {
709
+ vector<string> pidfiles = options.getStrSet("cleanup_pidfiles", false);
710
+ pidfiles.push_back(argv[i + 1]);
711
+ options.setStrSet("cleanup_pidfiles", pidfiles);
712
+ i += 2;
713
+ } else if (p.isValueFlag(argc, i, argv[i], '\0', "--log-file")) {
714
+ options.set("debug_log_file", argv[i + 1]);
715
+ i += 2;
716
+ } else if (p.isValueFlag(argc, i, argv[i], '\0', "--ctl")) {
717
+ const char *value = strchr(argv[i + 1], '=');
718
+ if (value == NULL) {
719
+ fprintf(stderr, "ERROR: '%s' is not a valid --ctl parameter. "
720
+ "It must be in the form of NAME=VALUE.\n", argv[i + 1]);
721
+ exit(1);
722
+ }
723
+ string name(argv[i + 1], value - argv[i + 1]);
724
+ value++;
725
+ if (*value == '\0') {
726
+ fprintf(stderr, "ERROR: '%s' is not a valid --ctl parameter. "
727
+ "The value must be non-empty.\n", argv[i + 1]);
728
+ exit(1);
729
+ }
730
+ options.set(name, value);
731
+ i += 2;
732
+ } else if (p.isFlag(argv[i], 'h', "--help")) {
733
+ usage();
734
+ exit(0);
735
+ } else {
736
+ fprintf(stderr, "ERROR: unrecognized argument %s. Please type "
737
+ "'%s watchdog --help' for usage.\n", argv[i], argv[0]);
738
+ exit(1);
739
+ }
740
+ }
741
+ }
742
+
470
743
  static void
471
744
  initializeBareEssentials(int argc, char *argv[]) {
472
745
  /*
@@ -475,7 +748,6 @@ initializeBareEssentials(int argc, char *argv[]) {
475
748
  * forcefully redirect stdout to stderr so that everything ends up in the
476
749
  * same place.
477
750
  */
478
- int oldStdout = dup(1);
479
751
  dup2(2, 1);
480
752
 
481
753
  /*
@@ -489,53 +761,39 @@ initializeBareEssentials(int argc, char *argv[]) {
489
761
  */
490
762
  oldOomScore = setOomScoreNeverKill();
491
763
 
492
- agentsOptions = initializeAgent(argc, argv, "PassengerWatchdog");
764
+ agentsOptions = new VariantMap();
765
+ *agentsOptions = initializeAgent(argc, &argv, AGENT_EXE " watchdog",
766
+ parseOptions, NULL, 2);
767
+
768
+ // Start all sub-agents with this environment variable.
769
+ setenv("PASSENGER_USE_FEEDBACK_FD", "true", 1);
770
+ }
493
771
 
494
- if (agentsOptions.get("test_binary", false) == "1") {
495
- int ret;
496
- do {
497
- ret = write(oldStdout, "PASS\n", 5);
498
- } while (ret == -1 && errno == EAGAIN);
499
- exit(0);
772
+ static void
773
+ setAgentsOptionsDefaults() {
774
+ VariantMap &options = *agentsOptions;
775
+
776
+ options.setDefault("instance_registry_dir", getSystemTempDir());
777
+ options.setDefaultBool("user_switching", true);
778
+ options.setDefault("default_user", DEFAULT_WEB_APP_USER);
779
+ if (!options.has("default_group")) {
780
+ options.set("default_group",
781
+ inferDefaultGroup(options.get("default_user")));
500
782
  }
501
- close(oldStdout);
783
+ options.setDefault("server_software", SERVER_TOKEN_NAME "/" PASSENGER_VERSION);
784
+ options.setDefaultStrSet("cleanup_pidfiles", vector<string>());
785
+ options.setDefault("data_buffer_dir", getSystemTempDir());
786
+ options.setDefaultBool("delete_pid_file", true);
502
787
  }
503
788
 
504
789
  static void
505
- initializeOptions() {
506
- TRACE_POINT();
507
- agentsOptions
508
- .setDefaultInt ("log_level", DEFAULT_LOG_LEVEL)
509
- .setDefault ("temp_dir", getSystemTempDir())
510
-
511
- .setDefaultBool("user_switching", true)
512
- .setDefault ("default_user", DEFAULT_WEB_APP_USER)
513
- .setDefaultUid ("web_server_worker_uid", getuid())
514
- .setDefaultGid ("web_server_worker_gid", getgid())
515
- .setDefault ("default_ruby", DEFAULT_RUBY)
516
- .setDefault ("default_python", DEFAULT_PYTHON)
517
- .setDefaultInt ("max_pool_size", DEFAULT_MAX_POOL_SIZE)
518
- .setDefaultInt ("pool_idle_time", DEFAULT_POOL_IDLE_TIME);
519
- agentsOptions.set ("passenger_version", PASSENGER_VERSION);
520
-
521
- // Check for required options
522
- UPDATE_TRACE_POINT();
523
- agentsOptions.get("passenger_root");
524
- agentsOptions.getPid("web_server_pid");
790
+ sanityCheckOptions() {
791
+ VariantMap &options = *agentsOptions;
525
792
 
526
- // Fetch optional options
527
- UPDATE_TRACE_POINT();
528
- tempDir = agentsOptions.get("temp_dir");
529
- userSwitching = agentsOptions.getBool("user_switching");
530
- defaultUser = agentsOptions.get("default_user");
531
- if (!agentsOptions.has("default_group")) {
532
- agentsOptions.set("default_group", inferDefaultGroup(defaultUser));
793
+ if (!options.has("passenger_root")) {
794
+ fprintf(stderr, "ERROR: please set the --passenger-root argument.\n");
795
+ exit(1);
533
796
  }
534
- defaultGroup = agentsOptions.get("default_group");
535
- webServerWorkerUid = agentsOptions.getUid("web_server_worker_uid");
536
- webServerWorkerGid = agentsOptions.getGid("web_server_worker_gid");
537
-
538
- P_INFO("Options: " << agentsOptions.inspect());
539
797
  }
540
798
 
541
799
  static void
@@ -546,15 +804,113 @@ maybeSetsid() {
546
804
  * we can kill all of our subprocesses in a single killpg().
547
805
  *
548
806
  * AgentsStarter.h already calls setsid() before exec()ing
549
- * the Watchdog, but FlyingPassenger does not.
807
+ * the Watchdog, but Flying Passenger does not.
550
808
  */
551
- if (agentsOptions.getBool("setsid", false)) {
809
+ if (agentsOptions->getBool("setsid", false)) {
552
810
  setsid();
553
811
  }
554
812
  }
555
813
 
814
+ static void
815
+ redirectStdinToNull() {
816
+ int fd = open("/dev/null", O_RDONLY);
817
+ if (fd != -1) {
818
+ dup2(fd, 1);
819
+ close(fd);
820
+ }
821
+ }
822
+
823
+ static void
824
+ maybeDaemonize() {
825
+ pid_t pid;
826
+ int e;
827
+
828
+ if (agentsOptions->getBool("daemonize", false)) {
829
+ pid = fork();
830
+ if (pid == 0) {
831
+ setsid();
832
+ if (chdir("/") == -1) {
833
+ e = errno;
834
+ throw SystemException("Cannot change working directory to /", e);
835
+ }
836
+ redirectStdinToNull();
837
+ } else if (pid == -1) {
838
+ e = errno;
839
+ throw SystemException("Cannot fork", e);
840
+ } else {
841
+ _exit(0);
842
+ }
843
+ }
844
+ }
845
+
846
+ static void
847
+ createPidFile() {
848
+ TRACE_POINT();
849
+ string pidFile = agentsOptions->get("pid_file", false);
850
+ if (!pidFile.empty()) {
851
+ char pidStr[32];
852
+
853
+ snprintf(pidStr, sizeof(pidStr), "%lld", (long long) getpid());
854
+
855
+ int fd = syscalls::open(pidFile.c_str(), O_WRONLY | O_CREAT | O_TRUNC, 0644);
856
+ if (fd == -1) {
857
+ int e = errno;
858
+ throw FileSystemException("Cannot create PID file " + pidFile, e, pidFile);
859
+ }
860
+
861
+ UPDATE_TRACE_POINT();
862
+ writeExact(fd, pidStr, strlen(pidStr));
863
+ syscalls::close(fd);
864
+ }
865
+ }
866
+
867
+ static void
868
+ lowerPrivilege() {
869
+ TRACE_POINT();
870
+ const VariantMap &options = *agentsOptions;
871
+ string userName = options.get("user", false);
872
+
873
+ if (geteuid() == 0 && !userName.empty()) {
874
+ struct passwd *pwUser = getpwnam(userName.c_str());
875
+
876
+ if (pwUser == NULL) {
877
+ throw RuntimeException("Cannot lookup user information for user " +
878
+ userName);
879
+ }
880
+
881
+ gid_t gid = pwUser->pw_gid;
882
+ string groupName = getGroupName(pwUser->pw_gid);
883
+
884
+ if (initgroups(userName.c_str(), gid) != 0) {
885
+ int e = errno;
886
+ throw SystemException("Unable to lower " AGENT_EXE " watchdog's privilege "
887
+ "to that of user '" + userName + "' and group '" + groupName +
888
+ "': cannot set supplementary groups", e);
889
+ }
890
+ if (setgid(gid) != 0) {
891
+ int e = errno;
892
+ throw SystemException("Unable to lower " AGENT_EXE " watchdog's privilege "
893
+ "to that of user '" + userName + "' and group '" + groupName +
894
+ "': cannot set group ID to " + toString(gid), e);
895
+ }
896
+ if (setuid(pwUser->pw_uid) != 0) {
897
+ int e = errno;
898
+ throw SystemException("Unable to lower " AGENT_EXE " watchdog's privilege "
899
+ "to that of user '" + userName + "' and group '" + groupName +
900
+ "': cannot set user ID to " + toString(pwUser->pw_uid), e);
901
+ }
902
+
903
+ setenv("USER", pwUser->pw_name, 1);
904
+ setenv("HOME", pwUser->pw_dir, 1);
905
+ setenv("UID", toString(gid).c_str(), 1);
906
+ }
907
+ }
908
+
556
909
  static void
557
910
  lookupDefaultUidGid(uid_t &uid, gid_t &gid) {
911
+ VariantMap &options = *agentsOptions;
912
+ const string &defaultUser = options.get("default_user");
913
+ const string &defaultGroup = options.get("default_group");
558
914
  struct passwd *userEntry;
559
915
 
560
916
  userEntry = getpwnam(defaultUser.c_str());
@@ -572,66 +928,108 @@ lookupDefaultUidGid(uid_t &uid, gid_t &gid) {
572
928
  }
573
929
 
574
930
  static void
575
- initializeWorkingObjects(WorkingObjectsPtr &wo, ServerInstanceDirToucherPtr &serverInstanceDirToucher) {
931
+ initializeWorkingObjects(WorkingObjectsPtr &wo, InstanceDirToucherPtr &instanceDirToucher) {
576
932
  TRACE_POINT();
577
- wo = boost::make_shared<WorkingObjects>();
578
- wo->resourceLocator = boost::make_shared<ResourceLocator>(agentsOptions.get("passenger_root"));
579
-
580
- UPDATE_TRACE_POINT();
581
- // Must not used boost::make_shared() here because Watchdog.cpp
582
- // deletes the raw pointer in cleanupAgentsInBackground().
583
- if (agentsOptions.get("server_instance_dir", false).empty()) {
584
- /* We embed the super structure version in the server instance directory name
585
- * because it's possible to upgrade Phusion Passenger without changing the
586
- * web server's PID. This way each incompatible upgrade will use its own
587
- * server instance directory.
588
- */
589
- string path = tempDir +
590
- "/passenger." +
591
- toString(SERVER_INSTANCE_DIR_STRUCTURE_MAJOR_VERSION) + "." +
592
- toString(SERVER_INSTANCE_DIR_STRUCTURE_MINOR_VERSION) + "." +
593
- toString<unsigned long long>(agentsOptions.getPid("web_server_pid"));
594
- wo->serverInstanceDir.reset(new ServerInstanceDir(path));
595
- } else {
596
- wo->serverInstanceDir.reset(new ServerInstanceDir(agentsOptions.get("server_instance_dir")));
597
- agentsOptions.set("server_instance_dir", wo->serverInstanceDir->getPath());
933
+ VariantMap &options = *agentsOptions;
934
+ vector<string> strset;
935
+
936
+ options.set("instance_registry_dir",
937
+ absolutizePath(options.get("instance_registry_dir")));
938
+ if (options.get("server_software").find(SERVER_TOKEN_NAME) == string::npos
939
+ && options.get("server_software").find(FLYING_PASSENGER_NAME) == string::npos)
940
+ {
941
+ options.set("server_software", options.get("server_software") +
942
+ (" " SERVER_TOKEN_NAME "/" PASSENGER_VERSION));
598
943
  }
599
- wo->generation = wo->serverInstanceDir->newGeneration(userSwitching, defaultUser,
600
- defaultGroup, webServerWorkerUid, webServerWorkerGid);
601
- agentsOptions.set("server_instance_dir", wo->serverInstanceDir->getPath());
602
- agentsOptions.setInt("generation_number", wo->generation->getNumber());
603
- agentsOptions.set("generation_path", wo->generation->getPath());
604
944
 
605
- UPDATE_TRACE_POINT();
606
- serverInstanceDirToucher = boost::make_shared<ServerInstanceDirToucher>(wo);
945
+ wo = boost::make_shared<WorkingObjects>();
946
+ workingObjects = wo.get();
947
+ wo->resourceLocator = boost::make_shared<ResourceLocator>(agentsOptions->get("passenger_root"));
607
948
 
608
949
  UPDATE_TRACE_POINT();
609
950
  lookupDefaultUidGid(wo->defaultUid, wo->defaultGid);
951
+ wo->cleanupPidfiles = options.getStrSet("cleanup_pidfiles", false);
610
952
 
611
953
  UPDATE_TRACE_POINT();
612
- wo->cleanupPidfiles = agentsOptions.getStrSet("cleanup_pidfiles", false);
954
+ InstanceDirectory::CreationOptions instanceOptions;
955
+ instanceOptions.userSwitching = options.getBool("user_switching");
956
+ instanceOptions.defaultUid = wo->defaultUid;
957
+ instanceOptions.defaultGid = wo->defaultGid;
958
+ instanceOptions.properties["name"] = wo->randomGenerator.generateAsciiString(8);
959
+ instanceOptions.properties["server_software"] = options.get("server_software");
960
+ wo->instanceDir = boost::make_shared<InstanceDirectory>(instanceOptions,
961
+ options.get("instance_registry_dir"));
962
+ options.set("instance_dir", wo->instanceDir->getPath());
963
+ instanceDirToucher = boost::make_shared<InstanceDirToucher>(wo);
613
964
 
614
965
  UPDATE_TRACE_POINT();
615
- wo->loggingAgentAddress = "unix:" + wo->generation->getPath() + "/logging";
616
- wo->loggingAgentPassword = wo->randomGenerator.generateAsciiString(64);
617
- wo->loggingAgentAdminAddress = "unix:" + wo->generation->getPath() + "/logging_admin";
966
+ string lockFilePath = wo->instanceDir->getPath() + "/lock";
967
+ wo->lockFile = syscalls::open(lockFilePath.c_str(), O_RDONLY);
968
+ if (wo->lockFile == -1) {
969
+ int e = errno;
970
+ throw FileSystemException("Cannot open " + lockFilePath + " for reading",
971
+ e, lockFilePath);
972
+ }
973
+
974
+ createFile(wo->instanceDir->getPath() + "/watchdog.pid", toString(getpid()));
618
975
 
619
976
  UPDATE_TRACE_POINT();
620
- wo->adminToolStatusPassword = wo->randomGenerator.generateAsciiString(MESSAGE_SERVER_MAX_PASSWORD_SIZE);
621
- wo->adminToolManipulationPassword = wo->randomGenerator.generateAsciiString(MESSAGE_SERVER_MAX_PASSWORD_SIZE);
622
- agentsOptions.set("admin_tool_status_password", wo->adminToolStatusPassword);
623
- agentsOptions.set("admin_tool_manipulation_password", wo->adminToolManipulationPassword);
624
- if (geteuid() == 0 && !userSwitching) {
625
- createFile(wo->generation->getPath() + "/passenger-status-password.txt",
626
- wo->adminToolStatusPassword, S_IRUSR, wo->defaultUid, wo->defaultGid);
627
- createFile(wo->generation->getPath() + "/admin-manipulation-password.txt",
628
- wo->adminToolManipulationPassword, S_IRUSR, wo->defaultUid, wo->defaultGid);
977
+ string readOnlyAdminPassword = wo->randomGenerator.generateAsciiString(24);
978
+ string fullAdminPassword = wo->randomGenerator.generateAsciiString(24);
979
+ if (geteuid() == 0 && !options.getBool("user_switching")) {
980
+ createFile(wo->instanceDir->getPath() + "/read_only_admin_password.txt",
981
+ readOnlyAdminPassword, S_IRUSR, wo->defaultUid, wo->defaultGid);
982
+ createFile(wo->instanceDir->getPath() + "/full_admin_password.txt",
983
+ fullAdminPassword, S_IRUSR, wo->defaultUid, wo->defaultGid);
629
984
  } else {
630
- createFile(wo->generation->getPath() + "/passenger-status-password.txt",
631
- wo->adminToolStatusPassword, S_IRUSR | S_IWUSR);
632
- createFile(wo->generation->getPath() + "/admin-manipulation-password.txt",
633
- wo->adminToolManipulationPassword, S_IRUSR | S_IWUSR);
985
+ createFile(wo->instanceDir->getPath() + "/read_only_admin_password.txt",
986
+ readOnlyAdminPassword, S_IRUSR | S_IWUSR);
987
+ createFile(wo->instanceDir->getPath() + "/full_admin_password.txt",
988
+ fullAdminPassword, S_IRUSR | S_IWUSR);
634
989
  }
990
+ options.setDefault("server_pid_file", wo->instanceDir->getPath() + "/server.pid");
991
+
992
+ UPDATE_TRACE_POINT();
993
+ strset = options.getStrSet("server_addresses", false);
994
+ strset.insert(strset.begin(),
995
+ "unix:" + wo->instanceDir->getPath() + "/agents.s/server");
996
+ options.setStrSet("server_addresses", strset);
997
+ options.setDefault("server_password",
998
+ wo->randomGenerator.generateAsciiString(24));
999
+
1000
+ strset = options.getStrSet("server_admin_addresses", false);
1001
+ strset.insert(strset.begin(),
1002
+ "unix:" + wo->instanceDir->getPath() + "/agents.s/server_admin");
1003
+ options.setStrSet("server_admin_addresses", strset);
1004
+
1005
+ UPDATE_TRACE_POINT();
1006
+ options.setDefault("logging_agent_address",
1007
+ "unix:" + wo->instanceDir->getPath() + "/agents.s/logging");
1008
+ options.setDefault("logging_agent_password",
1009
+ wo->randomGenerator.generateAsciiString(24));
1010
+ strset = options.getStrSet("logging_agent_admin_addresses", false);
1011
+ strset.insert(strset.begin(),
1012
+ "unix:" + wo->instanceDir->getPath() + "/agents.s/logging_admin");
1013
+ options.setStrSet("logging_agent_admin_addresses", strset);
1014
+
1015
+ UPDATE_TRACE_POINT();
1016
+ strset = options.getStrSet("logging_agent_authorizations", false);
1017
+ strset.insert(strset.begin(),
1018
+ "readonly:ro_admin:" + wo->instanceDir->getPath() +
1019
+ "/read_only_admin_password.txt");
1020
+ strset.insert(strset.begin(),
1021
+ "full:admin:" + wo->instanceDir->getPath() +
1022
+ "/full_admin_password.txt");
1023
+ options.setStrSet("logging_agent_authorizations", strset);
1024
+
1025
+ strset = options.getStrSet("server_authorizations", false);
1026
+ strset.insert(strset.begin(),
1027
+ "readonly:ro_admin:" + wo->instanceDir->getPath() +
1028
+ "/read_only_admin_password.txt");
1029
+ strset.insert(strset.begin(),
1030
+ "full:admin:" + wo->instanceDir->getPath() +
1031
+ "/full_admin_password.txt");
1032
+ options.setStrSet("server_authorizations", strset);
635
1033
  }
636
1034
 
637
1035
  static void
@@ -641,18 +1039,112 @@ initializeAgentWatchers(const WorkingObjectsPtr &wo, vector<AgentWatcherPtr> &wa
641
1039
  watchers.push_back(make_shared<LoggingAgentWatcher>(wo));
642
1040
  }
643
1041
 
1042
+ static void
1043
+ makeFileWorldReadableAndWritable(const string &path) {
1044
+ int ret;
1045
+
1046
+ do {
1047
+ ret = chmod(path.c_str(), parseModeString("u=rw,g=rw,o=rw"));
1048
+ } while (ret == -1 && errno == EINTR);
1049
+ }
1050
+
1051
+ static void
1052
+ parseAndAddAdminAuthorization(const WorkingObjectsPtr &wo, const string &description) {
1053
+ TRACE_POINT();
1054
+ AdminServer::Authorization auth;
1055
+ vector<string> args;
1056
+
1057
+ split(description, ':', args);
1058
+
1059
+ if (args.size() == 2) {
1060
+ auth.level = AdminServer::FULL;
1061
+ auth.username = args[0];
1062
+ auth.password = strip(readAll(args[1]));
1063
+ } else if (args.size() == 3) {
1064
+ auth.level = AdminServer::parseLevel(args[0]);
1065
+ auth.username = args[1];
1066
+ auth.password = strip(readAll(args[2]));
1067
+ } else {
1068
+ P_BUG("Too many elements in authorization description");
1069
+ }
1070
+
1071
+ wo->adminAuthorizations.push_back(auth);
1072
+ }
1073
+
1074
+ static void
1075
+ initializeAdminServer(const WorkingObjectsPtr &wo) {
1076
+ TRACE_POINT();
1077
+ VariantMap &options = *agentsOptions;
1078
+ vector<string> authorizations = options.getStrSet("watchdog_authorizations", false);
1079
+ vector<string> adminAddresses = options.getStrSet("watchdog_admin_addresses", false);
1080
+ string description;
1081
+
1082
+ UPDATE_TRACE_POINT();
1083
+ authorizations.insert(authorizations.begin(),
1084
+ "readonly:ro_admin:" + wo->instanceDir->getPath() +
1085
+ "/read_only_admin_password.txt");
1086
+ authorizations.insert(authorizations.begin(),
1087
+ "full:admin:" + wo->instanceDir->getPath() +
1088
+ "/full_admin_password.txt");
1089
+ options.setStrSet("watchdog_authorizations", authorizations);
1090
+
1091
+ foreach (description, authorizations) {
1092
+ parseAndAddAdminAuthorization(wo, description);
1093
+ }
1094
+
1095
+ UPDATE_TRACE_POINT();
1096
+ adminAddresses.insert(adminAddresses.begin(),
1097
+ "unix:" + wo->instanceDir->getPath() + "/agents.s/watchdog");
1098
+ options.setStrSet("watchdog_admin_addresses", adminAddresses);
1099
+
1100
+ UPDATE_TRACE_POINT();
1101
+ for (unsigned int i = 0; i < adminAddresses.size(); i++) {
1102
+ P_DEBUG("Admin server will listen on " << adminAddresses[i]);
1103
+ wo->adminServerFds[i] = createServer(adminAddresses[i]);
1104
+ if (getSocketAddressType(adminAddresses[i]) == SAT_UNIX) {
1105
+ makeFileWorldReadableAndWritable(parseUnixSocketAddress(adminAddresses[i]));
1106
+ }
1107
+ }
1108
+
1109
+ UPDATE_TRACE_POINT();
1110
+ wo->bgloop = new BackgroundEventLoop(true, true);
1111
+ wo->serverKitContext = new ServerKit::Context(wo->bgloop->safe);
1112
+ wo->serverKitContext->defaultFileBufferedChannelConfig.bufferDir =
1113
+ absolutizePath(options.get("data_buffer_dir"));
1114
+
1115
+ UPDATE_TRACE_POINT();
1116
+ wo->adminServer = new AdminServer(wo->serverKitContext);
1117
+ wo->adminServer->exitEvent = &wo->exitEvent;
1118
+ wo->adminServer->authorizations = wo->adminAuthorizations;
1119
+ for (unsigned int i = 0; i < adminAddresses.size(); i++) {
1120
+ wo->adminServer->listen(wo->adminServerFds[i]);
1121
+ }
1122
+ }
1123
+
644
1124
  static void
645
1125
  startAgents(const WorkingObjectsPtr &wo, vector<AgentWatcherPtr> &watchers) {
646
1126
  TRACE_POINT();
647
1127
  foreach (AgentWatcherPtr watcher, watchers) {
1128
+ P_DEBUG("Starting agent: " << watcher->name());
648
1129
  try {
649
1130
  watcher->start();
650
1131
  } catch (const std::exception &e) {
651
- writeArrayMessage(FEEDBACK_FD,
652
- "Watchdog startup error",
653
- e.what(),
654
- NULL);
1132
+ if (feedbackFdAvailable()) {
1133
+ writeArrayMessage(FEEDBACK_FD,
1134
+ "Watchdog startup error",
1135
+ e.what(),
1136
+ NULL);
1137
+ } else {
1138
+ const oxt::tracable_exception *e2 =
1139
+ dynamic_cast<const oxt::tracable_exception *>(&e);
1140
+ if (e2 != NULL) {
1141
+ P_CRITICAL("ERROR: " << e2->what() << "\n" << e2->backtrace());
1142
+ } else {
1143
+ P_CRITICAL("ERROR: " << e.what());
1144
+ }
1145
+ }
655
1146
  forceAllAgentsShutdown(wo, watchers);
1147
+ cleanup(wo);
656
1148
  exit(1);
657
1149
  }
658
1150
  // Allow other exceptions to propagate and crash the watchdog.
@@ -670,6 +1162,7 @@ beginWatchingAgents(const WorkingObjectsPtr &wo, vector<AgentWatcherPtr> &watche
670
1162
  e.what(),
671
1163
  NULL);
672
1164
  forceAllAgentsShutdown(wo, watchers);
1165
+ cleanup(wo);
673
1166
  exit(1);
674
1167
  }
675
1168
  // Allow other exceptions to propagate and crash the watchdog.
@@ -678,43 +1171,86 @@ beginWatchingAgents(const WorkingObjectsPtr &wo, vector<AgentWatcherPtr> &watche
678
1171
 
679
1172
  static void
680
1173
  reportAgentsInformation(const WorkingObjectsPtr &wo, const vector<AgentWatcherPtr> &watchers) {
1174
+ if (feedbackFdAvailable()) {
1175
+ TRACE_POINT();
1176
+ VariantMap report;
1177
+
1178
+ report.set("instance_dir", wo->instanceDir->getPath());
1179
+
1180
+ foreach (AgentWatcherPtr watcher, watchers) {
1181
+ watcher->reportAgentsInformation(report);
1182
+ }
1183
+
1184
+ report.writeToFd(FEEDBACK_FD, "Agents information");
1185
+ }
1186
+ }
1187
+
1188
+ static void
1189
+ finalizeInstanceDir(const WorkingObjectsPtr &wo) {
681
1190
  TRACE_POINT();
682
- VariantMap report;
1191
+ #ifdef HAVE_FLOCK
1192
+ if (flock(wo->lockFile, LOCK_EX) == -1) {
1193
+ int e = errno;
1194
+ throw SystemException("Cannot obtain exclusive lock on the "
1195
+ "instance directory lock file", e);
1196
+ }
1197
+ #endif
1198
+ wo->instanceDir->finalizeCreation();
1199
+ }
683
1200
 
684
- report
685
- .set("server_instance_dir", wo->serverInstanceDir->getPath())
686
- .setInt("generation", wo->generation->getNumber());
1201
+ static void
1202
+ cleanup(const WorkingObjectsPtr &wo) {
1203
+ TRACE_POINT();
687
1204
 
688
- foreach (AgentWatcherPtr watcher, watchers) {
689
- watcher->reportAgentsInformation(report);
1205
+ // We need to call destroy() explicitly because of circular references.
1206
+ if (wo->instanceDir != NULL && wo->instanceDir->isOwner()) {
1207
+ wo->instanceDir->destroy();
1208
+ wo->instanceDir.reset();
690
1209
  }
691
1210
 
692
- report.writeToFd(FEEDBACK_FD, "Agents information");
1211
+ killCleanupPids(wo);
1212
+ deletePidFile(wo);
693
1213
  }
694
1214
 
695
1215
  int
696
- main(int argc, char *argv[]) {
1216
+ watchdogMain(int argc, char *argv[]) {
697
1217
  initializeBareEssentials(argc, argv);
698
- P_DEBUG("Starting Watchdog...");
1218
+ setAgentsOptionsDefaults();
1219
+ sanityCheckOptions();
1220
+ P_NOTICE("Starting " AGENT_EXE " watchdog...");
1221
+ P_DEBUG("Watchdog options: " << agentsOptions->inspect());
699
1222
  WorkingObjectsPtr wo;
700
- ServerInstanceDirToucherPtr serverInstanceDirToucher;
1223
+ InstanceDirToucherPtr instanceDirToucher;
701
1224
  vector<AgentWatcherPtr> watchers;
702
1225
 
703
1226
  try {
704
1227
  TRACE_POINT();
705
- initializeOptions();
706
1228
  maybeSetsid();
707
- initializeWorkingObjects(wo, serverInstanceDirToucher);
1229
+ maybeDaemonize();
1230
+ createPidFile();
1231
+ lowerPrivilege();
1232
+ initializeWorkingObjects(wo, instanceDirToucher);
708
1233
  initializeAgentWatchers(wo, watchers);
1234
+ initializeAdminServer(wo);
709
1235
  UPDATE_TRACE_POINT();
710
1236
  runHookScriptAndThrowOnError("before_watchdog_initialization");
711
1237
  } catch (const std::exception &e) {
712
- writeArrayMessage(FEEDBACK_FD,
713
- "Watchdog startup error",
714
- e.what(),
715
- NULL);
1238
+ if (feedbackFdAvailable()) {
1239
+ writeArrayMessage(FEEDBACK_FD,
1240
+ "Watchdog startup error",
1241
+ e.what(),
1242
+ NULL);
1243
+ } else {
1244
+ const oxt::tracable_exception *e2 =
1245
+ dynamic_cast<const oxt::tracable_exception *>(&e);
1246
+ if (e2 != NULL) {
1247
+ P_CRITICAL("ERROR: " << e2->what() << "\n" << e2->backtrace());
1248
+ } else {
1249
+ P_CRITICAL("ERROR: " << e.what());
1250
+ }
1251
+ }
716
1252
  if (wo != NULL) {
717
- killCleanupPids(wo);
1253
+ cleanup(wo);
718
1254
  }
719
1255
  return 1;
720
1256
  }
@@ -725,15 +1261,16 @@ main(int argc, char *argv[]) {
725
1261
  startAgents(wo, watchers);
726
1262
  beginWatchingAgents(wo, watchers);
727
1263
  reportAgentsInformation(wo, watchers);
728
- P_INFO("All Phusion Passenger agents started!");
1264
+ finalizeInstanceDir(wo);
1265
+ P_INFO("All " PROGRAM_NAME " agents started!");
729
1266
  UPDATE_TRACE_POINT();
730
1267
  runHookScriptAndThrowOnError("after_watchdog_initialization");
731
1268
 
732
1269
  UPDATE_TRACE_POINT();
733
1270
  this_thread::disable_interruption di;
734
1271
  this_thread::disable_syscall_interruption dsi;
735
- bool exitGracefully = waitForStarterProcessOrWatchers(wo, watchers);
736
- if (exitGracefully) {
1272
+ bool shouldExitGracefully = waitForStarterProcessOrWatchers(wo, watchers);
1273
+ if (shouldExitGracefully) {
737
1274
  /* Fork a child process which cleans up all the agent processes in
738
1275
  * the background and exit this watchdog process so that we don't block
739
1276
  * the web server.
@@ -746,18 +1283,22 @@ main(int argc, char *argv[]) {
746
1283
  runHookScriptAndThrowOnError("after_watchdog_shutdown");
747
1284
  UPDATE_TRACE_POINT();
748
1285
  AgentWatcher::stopWatching(watchers);
749
- if (exitGracefully) {
1286
+ if (shouldExitGracefully) {
750
1287
  UPDATE_TRACE_POINT();
751
1288
  cleanupAgentsInBackground(wo, watchers, argv);
1289
+ // Child process will call cleanup()
752
1290
  } else {
753
1291
  UPDATE_TRACE_POINT();
754
1292
  forceAllAgentsShutdown(wo, watchers);
1293
+ cleanup(wo);
755
1294
  }
756
1295
  UPDATE_TRACE_POINT();
757
1296
  runHookScriptAndThrowOnError("after_watchdog_shutdown");
758
- return exitGracefully ? 0 : 1;
1297
+
1298
+ return shouldExitGracefully ? 0 : 1;
759
1299
  } catch (const tracable_exception &e) {
760
- P_ERROR(e.what() << "\n" << e.backtrace());
1300
+ P_CRITICAL("ERROR: " << e.what() << "\n" << e.backtrace());
1301
+ cleanup(wo);
761
1302
  return 1;
762
1303
  }
763
1304
  }