passenger 4.0.41 → 4.0.42

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 (136) hide show
  1. checksums.yaml +8 -8
  2. checksums.yaml.gz.asc +7 -7
  3. data.tar.gz.asc +7 -7
  4. data/.travis.yml +3 -3
  5. data/CHANGELOG +26 -0
  6. data/build/agents.rb +1 -1
  7. data/build/apache2.rb +3 -0
  8. data/build/debian.rb +1 -1
  9. data/build/integration_tests.rb +4 -4
  10. data/build/nginx.rb +3 -0
  11. data/build/packaging.rb +3 -5
  12. data/build/preprocessor.rb +2 -1
  13. data/build/ruby_extension.rb +5 -5
  14. data/build/test_basics.rb +2 -1
  15. data/debian.template/control.template +9 -4
  16. data/debian.template/rules.template +16 -4
  17. data/dev/run_travis.sh +32 -8
  18. data/doc/Users guide Apache.txt +55 -10
  19. data/doc/Users guide Nginx.txt +10 -8
  20. data/doc/Users guide Standalone.txt +5 -2
  21. data/doc/users_guide_snippets/installation.txt +14 -0
  22. data/ext/common/ApplicationPool2/Process.h +8 -0
  23. data/ext/common/ApplicationPool2/Spawner.h +51 -1
  24. data/ext/common/Constants.h +1 -1
  25. data/ext/common/Utils/Curl.h +4 -0
  26. data/ext/common/agents/HelperAgent/RequestHandler.h +14 -2
  27. data/ext/common/agents/LoggingAgent/LoggingServer.h +4 -4
  28. data/ext/common/agents/LoggingAgent/RemoteSender.h +66 -5
  29. data/ext/nginx/StaticContentHandler.c +0 -7
  30. data/lib/phusion_passenger.rb +3 -3
  31. data/lib/phusion_passenger/config/about_command.rb +0 -4
  32. data/lib/phusion_passenger/config/build_native_support_command.rb +78 -0
  33. data/lib/phusion_passenger/config/detach_process_command.rb +0 -4
  34. data/lib/phusion_passenger/config/main.rb +12 -5
  35. data/lib/phusion_passenger/config/restart_app_command.rb +0 -4
  36. data/lib/phusion_passenger/config/validate_install_command.rb +0 -4
  37. data/lib/phusion_passenger/platform_info/compiler.rb +58 -41
  38. data/lib/phusion_passenger/platform_info/cxx_portability.rb +5 -0
  39. data/lib/phusion_passenger/standalone/command.rb +29 -10
  40. data/lib/phusion_passenger/standalone/help_command.rb +2 -2
  41. data/lib/phusion_passenger/standalone/start_command.rb +5 -1
  42. data/lib/phusion_passenger/utils/tee_input.rb +1 -0
  43. data/resources/mime.types +1 -1
  44. data/resources/oss-binaries.phusionpassenger.com.crt +124 -0
  45. data/resources/templates/apache2/deployment_example.txt.erb +2 -0
  46. data/resources/templates/standalone/config.erb +3 -1
  47. data/resources/templates/undisclosed_error.html.template +38 -1
  48. data/resources/union_station_gateway.crt +21 -0
  49. data/test/cxx/ApplicationPool2/SpawnerTestCases.cpp +34 -0
  50. data/test/cxx/RequestHandlerTest.cpp +10 -3
  51. data/test/cxx/TemplateTest.cpp +1 -1
  52. data/test/integration_tests/apache2_tests.rb +90 -106
  53. data/test/integration_tests/nginx_tests.rb +2 -0
  54. data/test/stub/rack/config.ru +7 -14
  55. data/test/stub/rack/library.rb +16 -0
  56. data/test/support/test_helper.rb +0 -3
  57. metadata +4 -80
  58. metadata.gz.asc +7 -7
  59. data/test/stub/rails2.3-mycook/Rakefile +0 -10
  60. data/test/stub/rails2.3-mycook/app/controllers/application_controller.rb +0 -12
  61. data/test/stub/rails2.3-mycook/app/controllers/recipes_controller.rb +0 -5
  62. data/test/stub/rails2.3-mycook/app/controllers/uploads_controller.rb +0 -15
  63. data/test/stub/rails2.3-mycook/app/controllers/welcome_controller.rb +0 -71
  64. data/test/stub/rails2.3-mycook/app/helpers/application_helper.rb +0 -3
  65. data/test/stub/rails2.3-mycook/app/helpers/recipes_helper.rb +0 -2
  66. data/test/stub/rails2.3-mycook/app/helpers/test_helper.rb +0 -2
  67. data/test/stub/rails2.3-mycook/app/helpers/uploads_helper.rb +0 -2
  68. data/test/stub/rails2.3-mycook/app/helpers/welcome_helper.rb +0 -2
  69. data/test/stub/rails2.3-mycook/app/views/layouts/default.rhtml +0 -26
  70. data/test/stub/rails2.3-mycook/app/views/recipes/create.rhtml +0 -13
  71. data/test/stub/rails2.3-mycook/app/views/recipes/index.rhtml +0 -3
  72. data/test/stub/rails2.3-mycook/app/views/recipes/new.rhtml +0 -8
  73. data/test/stub/rails2.3-mycook/app/views/uploads/index.rhtml +0 -1
  74. data/test/stub/rails2.3-mycook/app/views/uploads/new.html.erb +0 -8
  75. data/test/stub/rails2.3-mycook/app/views/welcome/cached.rhtml +0 -1
  76. data/test/stub/rails2.3-mycook/app/views/welcome/index.rhtml +0 -20
  77. data/test/stub/rails2.3-mycook/config/boot.rb +0 -110
  78. data/test/stub/rails2.3-mycook/config/database.yml +0 -19
  79. data/test/stub/rails2.3-mycook/config/environment.rb +0 -61
  80. data/test/stub/rails2.3-mycook/config/environments/development.rb +0 -18
  81. data/test/stub/rails2.3-mycook/config/environments/production.rb +0 -19
  82. data/test/stub/rails2.3-mycook/config/initializers/inflections.rb +0 -10
  83. data/test/stub/rails2.3-mycook/config/initializers/mime_types.rb +0 -5
  84. data/test/stub/rails2.3-mycook/config/routes.rb +0 -38
  85. data/test/stub/rails2.3-mycook/log/useless.txt +0 -1
  86. data/test/stub/rails2.3-mycook/public/.htaccess +0 -42
  87. data/test/stub/rails2.3-mycook/public/404.html +0 -30
  88. data/test/stub/rails2.3-mycook/public/422.html +0 -30
  89. data/test/stub/rails2.3-mycook/public/500.html +0 -30
  90. data/test/stub/rails2.3-mycook/public/dispatch.cgi +0 -10
  91. data/test/stub/rails2.3-mycook/public/dispatch.fcgi +0 -24
  92. data/test/stub/rails2.3-mycook/public/dispatch.rb +0 -10
  93. data/test/stub/rails2.3-mycook/public/favicon.ico +0 -0
  94. data/test/stub/rails2.3-mycook/public/images/angrywizard.gif +0 -0
  95. data/test/stub/rails2.3-mycook/public/images/cookbook.gif +0 -0
  96. data/test/stub/rails2.3-mycook/public/images/header.png +0 -0
  97. data/test/stub/rails2.3-mycook/public/images/rails.png +0 -0
  98. data/test/stub/rails2.3-mycook/public/robots.txt +0 -5
  99. data/test/stub/rails2.3-mycook/public/uploads.html +0 -26
  100. data/test/stub/rails2.3-mycook/public/uploads/.gitignore +0 -0
  101. data/test/stub/rails2.3-mycook/public/welcome/cached.html +0 -26
  102. data/test/stub/rails2.3-mycook/script/about +0 -3
  103. data/test/stub/rails2.3-mycook/script/console +0 -3
  104. data/test/stub/rails2.3-mycook/script/dbconsole +0 -3
  105. data/test/stub/rails2.3-mycook/script/destroy +0 -3
  106. data/test/stub/rails2.3-mycook/script/generate +0 -3
  107. data/test/stub/rails2.3-mycook/script/performance/benchmarker +0 -3
  108. data/test/stub/rails2.3-mycook/script/performance/profiler +0 -3
  109. data/test/stub/rails2.3-mycook/script/performance/request +0 -3
  110. data/test/stub/rails2.3-mycook/script/plugin +0 -3
  111. data/test/stub/rails2.3-mycook/script/process/inspector +0 -3
  112. data/test/stub/rails2.3-mycook/script/process/reaper +0 -3
  113. data/test/stub/rails2.3-mycook/script/process/spawner +0 -3
  114. data/test/stub/rails2.3-mycook/script/runner +0 -3
  115. data/test/stub/rails2.3-mycook/script/server +0 -3
  116. data/test/stub/rails2.3-mycook/sites/some.site/public/uploads.html +0 -26
  117. data/test/stub/rails2.3-mycook/sites/some.site/public/welcome/cached.html +0 -26
  118. data/test/stub/rails2.3-mycook/tmp/cache/useless.txt +0 -1
  119. data/test/stub/rails2.3-mycook/tmp/pids/useless.txt +0 -1
  120. data/test/stub/rails2.3-mycook/tmp/sessions/useless.txt +0 -1
  121. data/test/stub/rails2.3-mycook/tmp/sockets/useless.txt +0 -1
  122. data/test/stub/vendor_rails/minimal/README +0 -1
  123. data/test/stub/vendor_rails/minimal/actionmailer/lib/action_mailer.rb +0 -0
  124. data/test/stub/vendor_rails/minimal/actionpack/lib/action_controller.rb +0 -22
  125. data/test/stub/vendor_rails/minimal/actionpack/lib/action_pack.rb +0 -0
  126. data/test/stub/vendor_rails/minimal/actionpack/lib/action_view.rb +0 -0
  127. data/test/stub/vendor_rails/minimal/activerecord/lib/active_record.rb +0 -7
  128. data/test/stub/vendor_rails/minimal/activeresource/lib/active_resource.rb +0 -0
  129. data/test/stub/vendor_rails/minimal/activesupport/lib/active_support.rb +0 -17
  130. data/test/stub/vendor_rails/minimal/activesupport/lib/active_support/whiny_nil.rb +0 -0
  131. data/test/stub/vendor_rails/minimal/railties/lib/dispatcher.rb +0 -0
  132. data/test/stub/vendor_rails/minimal/railties/lib/initializer.rb +0 -57
  133. data/test/stub/vendor_rails/minimal/railties/lib/ruby_version_check.rb +0 -1
  134. data/test/stub/zsfa/header.png +0 -0
  135. data/test/stub/zsfa/index.html +0 -14
  136. data/test/stub/zsfa/zsfa.png +0 -0
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- ZGE3MWJhOWJjY2ZmMjk0OWMyMzU4YzIxYTY0YTA1NTJhYzIwMjQ0Mg==
4
+ ZTk2YzkwYzQ3MzQwMjFmMTYwMWNlY2NmYmZkYzE2NjU2OWU0OGJhMQ==
5
5
  data.tar.gz: !binary |-
6
- YmI0NjhmZjdjYmIxZGMxODg5Njg2MWI5NWI2ZTkxZGZmOWVjMGVlNw==
6
+ MzJiMDU1ZmM0NDU3YjYwNzlkMDBiNjhmNjA3Y2ZhNDIzNTVjYjRmMQ==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- Mjk4Mjg4ZTdmY2ViYjFkNzZiMTVhYWFiNzgyYjc2NTFlY2UyYTUwZjI3ZTQx
10
- ODg2NDJmMTM0OGMzNTE4NmNmZGNhNTI2MDRhNDgxZjk3NTU5MzU2OTk4NWU4
11
- ODIwYWFiN2U4MTEwNWE4YTRiMjQ2Yjc0ZDgzN2NhNDM0OTk1Nzk=
9
+ MDdlZmY0M2Y3MGJmZTI2OWE1ZWIxNWY3NDIxMjlkNDQxNWQ0NWY3ZWQ5ODRm
10
+ Yjg1ODJlYzcxMDA4ZThlNzM0MjM2OTM0MzI2ZTdjYjlmN2NhOTkyY2MxMTY1
11
+ YjQ0NmRlZDQ0OWI3ODgwMTU2MjM5N2FjNjEwNGE3ODU4ZDRlMTc=
12
12
  data.tar.gz: !binary |-
13
- MTA0Mjk0NGEzMWU1ODFiODY5OThiY2NiZDY1ZmQ5YzZlZGQyYzdmNzEzMDE1
14
- ZjI5OTljM2Y3ZWJmM2I3YjY0N2JmYWYwNzlmNTFkNDhlOWMzY2QwODM3Yzhi
15
- NDY3MmY5M2E3N2UzZDhlNTA2NThiYmNhZjA4YWUyYzNmMjcxYjA=
13
+ ZjAzMzFlN2E2YTE3YTNkOTQ0MTJlNTBlNDgwZmNmOTE4MjE3NDIwM2U2YThl
14
+ YWY4NzMzNDE4Y2MyZmM5NmVjMDE5NGMwNzU0YjI5N2YyYWNlOTkyY2M3MWZi
15
+ ZGM1YWY3ZDI3ZGY4YmZiODA5MWU5YWZlMmU4MGRiNDg5ZjY4MGM=
@@ -2,11 +2,11 @@
2
2
  Version: GnuPG/MacGPG2 v2.0.17 (Darwin)
3
3
  Comment: GPGTools - http://gpgtools.org
4
4
 
5
- iQEcBAABAgAGBQJTRE10AAoJECrHRaUKISqMchsH/3AQD5vGNFS0LjKqLab5L0TA
6
- glHGrm6V1UC0fG5bxUOgKlG4zop8zrADr1kH9H0Z8uFzA5nrxhkaC7AnJgqOyuaq
7
- LxAYiwcJxJ1eM6IyjsAW6Tj3KcZyRWSrlwAIzW1UoZnWgpWeajp0iBwzGfaj65y8
8
- OC3yF5sx486x13BgTdM5c1I5cWpbneoY7lDu+sybCvppgVRBs2Z/A+GVYNRlp7zD
9
- 2hNrluue4tHDvL/EgQaQaF1Bm0sTe3UvMq+ujSc7q0LwyheL04uHUlere92qt6vt
10
- PfZeJQgHV9GwDRW3ZQG0d08OFKErdEF+5S9qNwNS+tPp3i/KifhyEBd/RsYZWz4=
11
- =Sw+V
5
+ iQEcBAABAgAGBQJTagHhAAoJECrHRaUKISqM3JgH/iO5ytwG5HOsJtQIysPKlA1i
6
+ D2rnfAPBxs40pvf1ga8qLFvpcUyxtZayP6JU5xNNM/5Z31fJt9gQGsLoA6K6SuLq
7
+ qvEq7C25Hiub2PWIhz1Ejl+uMQAFBO8bZiAWutkKTSyg3FbBxz8QqUyExvl6KjWm
8
+ Izw60V1sgyBZfKxm2gKC6GC3yCBJXPfyWSFOV+1QgZOHDLMH+ehELCAXzYmKj/Lg
9
+ sA+l+4W1gcDv6aDuf1mKMRytU6F6fe1KXeShiGVvE80R4sXz3YnKNU+RADbTcSLA
10
+ f6eBkPTOjiuXGgYzQQFhcrVy3c4OnxSqBt4pf99pMqCbbExmX4pjKUsyGpMftDY=
11
+ =Qmot
12
12
  -----END PGP SIGNATURE-----
data.tar.gz.asc CHANGED
@@ -2,11 +2,11 @@
2
2
  Version: GnuPG/MacGPG2 v2.0.17 (Darwin)
3
3
  Comment: GPGTools - http://gpgtools.org
4
4
 
5
- iQEcBAABAgAGBQJTRE10AAoJECrHRaUKISqMPNAIAKlQNxJ08NkoCNRZ75YXKxYn
6
- Umo97ZF/jg19B+LBjR7QpsrBAzTVewcz7pQPPrh+61tr97hx0KMGQ6LtXhR1Smnc
7
- 8gOn6cw4sgschV00tVpRoUJNsVtLS0FLXmMilycUQSmrYUYWWNBw/JiH5aCkByGQ
8
- aTF538bF04R95qaHlGVdSbgNXB/jA8+v73Wdec2221DvXEXRRdttScE5vOImCUCf
9
- dQ4ibO+zXvPR3xw/Pxm5jyJgy6jOjFYMniIpbdpu8tMBknY10pnXuW/dGXFM59pC
10
- 4wd9W5Pr2TyHADAZyLeKLbXfl3OlQh+uMS+UiDmWbcePHOK2jQzM7EWK13mCKkk=
11
- =Gwi5
5
+ iQEcBAABAgAGBQJTagHhAAoJECrHRaUKISqM4/gH/jWZegkrdqOsXBTGp5zXL5iY
6
+ Gx2+AkGOsbYEZ1CIeNn7VlUDqNTAHX4vcSulnP6Tefhs3bJHf6okgv6Bx2NGPtU6
7
+ 8H9ju7z/+ZfJDkD2nymwZpApRppUGJKy47VFDjVQX2soHNA1VFdcqnv9bjcWEWSO
8
+ DXFLoUYVNVp/9y3Q9uKmP0Uz5Mr/lqzm2VfkUjZjAJVcpSUkGysWC0+8UwAMfuVd
9
+ SBlEZ0G9RoJ5e6vMhsdBv0L7jFSt9yGRTCCi5gqgLtoRzUSw7GVUZj36e28KYLzg
10
+ H900Ze8sqOczw4VFN8Fw6UXYV778YPpcx+r5Lf0BCLgTs5Tw/K0S9Emk0IiYOBM=
11
+ =7RXc
12
12
  -----END PGP SIGNATURE-----
@@ -5,8 +5,8 @@ env:
5
5
  - TEST_CXX=1 SUDO=1
6
6
  - TEST_RUBY=1 TEST_RUBY_VERSION=1.8.7 TEST_CLASSIC_RAILS=0 TEST_RUBYGEMS_VERSION=1.8.25
7
7
  - TEST_RUBY=1 TEST_RUBY_VERSION=1.9.3 TEST_CLASSIC_RAILS=0
8
- - TEST_NGINX=1 TEST_STANDALONE=1 TEST_RUBYGEMS_VERSION=1.8.25
9
- - TEST_APACHE2=1 TEST_RUBYGEMS_VERSION=1.8.25
10
- - TEST_SOURCE_PACKAGING=1 TEST_DEBIAN_PACKAGING=1 TEST_RUBYGEMS_VERSION=1.8.25
8
+ - TEST_NGINX=1 TEST_STANDALONE=1
9
+ - TEST_APACHE2=1
10
+ - TEST_SOURCE_PACKAGING=1 TEST_DEBIAN_PACKAGING=1
11
11
 
12
12
  script: ./dev/run_travis.sh
data/CHANGELOG CHANGED
@@ -1,3 +1,29 @@
1
+ Release 4.0.42
2
+ --------------
3
+
4
+ * [Nginx] Upgraded the preferred Nginx version to 1.6.0.
5
+ * [Nginx] Fixed compatibility with Nginx 1.7.0.
6
+ * [Standalone] The MIME type for .woff files has been changed to application/font-woff.
7
+ Fixes issue #1071.
8
+ * There are now APT packages for Ubuntu 14.04. At the same time, packages for
9
+ Ubuntu 13.10 have been abandoned.
10
+ * Introduced a new command, `passenger-config build-native-support`, for ensuring
11
+ that the native_support library for the current Ruby interpreter is built. This
12
+ is useful in system provisioning scripts.
13
+ * For security reasons, friendly error pages (those black/purple pages that shows
14
+ the error message, backtrace and environment variable dump when an application
15
+ fails to start) are now disabled by default when the application environment is
16
+ set to 'staging' or 'production'. Fixes issue #1063.
17
+ * Fixed some compilation warnings on Ubuntu 14.04.
18
+ * Fixed some compatibility problems with Rake 10.2.0 and later.
19
+ See [Rake issue 274](https://github.com/jimweirich/rake/issues/274).
20
+ * Improved error handling in [Union Station](https://www.unionstationapp.com) support.
21
+ * Data is now sent to Union Station on a more frequent basis, in order to make new
22
+ data show up more quickly.
23
+ * Information about the code revision is now sent to Union Station, which will be
24
+ used in the upcoming deployment tracking feature in Union Station 2.
25
+
26
+
1
27
  Release 4.0.41
2
28
  --------------
3
29
 
@@ -108,7 +108,7 @@ file AGENT_OUTPUT_DIR + 'PassengerHelperAgent' => dependencies do
108
108
  end
109
109
 
110
110
  logging_agent_libs = COMMON_LIBRARY.only(:base, :logging_agent, 'AgentsBase.o',
111
- 'Utils/Base64.o', 'Utils/MD5.o')
111
+ 'Utils/Base64.o', 'Utils/MD5.o', 'Utils/jsoncpp.o')
112
112
  dependencies = [
113
113
  'ext/common/agents/LoggingAgent/Main.cpp',
114
114
  'ext/common/agents/LoggingAgent/AdminController.h',
@@ -98,6 +98,9 @@ task :apache2 => [
98
98
  NATIVE_SUPPORT_TARGET
99
99
  ].compact
100
100
 
101
+ # Workaround for https://github.com/jimweirich/rake/issues/274
102
+ task :_apache2 => :apache2
103
+
101
104
 
102
105
  # Define rules for the individual Apache 2 module source files.
103
106
  APACHE2_MODULE_INPUT_FILES.each_pair do |target, sources|
@@ -76,7 +76,7 @@ task 'debian:orig_tarball' => Packaging::PREGENERATED_FILES do
76
76
  if File.exist?(local_nginx_tarball)
77
77
  puts "#{local_nginx_tarball} already exists"
78
78
  else
79
- sh "curl -L -o #{local_nginx_tarball} http://nginx.org/download/nginx-#{nginx_version}.tar.gz"
79
+ sh "curl -L --fail -o #{local_nginx_tarball} http://nginx.org/download/nginx-#{nginx_version}.tar.gz"
80
80
  end
81
81
  sh "rm -rf #{PKG_DIR}/#{DEBIAN_NAME}_#{PACKAGE_VERSION}"
82
82
  sh "mkdir -p #{PKG_DIR}/#{DEBIAN_NAME}_#{PACKAGE_VERSION}"
@@ -27,7 +27,7 @@ desc "Run all integration tests"
27
27
  task 'test:integration' => ['test:integration:apache2', 'test:integration:nginx'] do
28
28
  end
29
29
 
30
- dependencies = [:apache2, NATIVE_SUPPORT_TARGET].compact
30
+ dependencies = [:_apache2, NATIVE_SUPPORT_TARGET].compact
31
31
  desc "Run Apache 2 integration tests"
32
32
  task 'test:integration:apache2' => dependencies do
33
33
  if PlatformInfo.rspec.nil?
@@ -45,7 +45,7 @@ task 'test:integration:apache2' => dependencies do
45
45
  end
46
46
  end
47
47
 
48
- dependencies = [:nginx, NATIVE_SUPPORT_TARGET].compact
48
+ dependencies = [:_nginx, NATIVE_SUPPORT_TARGET].compact
49
49
  desc "Run Nginx integration tests"
50
50
  task 'test:integration:nginx' => dependencies do
51
51
  if PlatformInfo.rspec.nil?
@@ -67,7 +67,7 @@ task 'test:integration:nginx' => dependencies do
67
67
  end
68
68
  end
69
69
 
70
- dependencies = [:nginx, NATIVE_SUPPORT_TARGET].compact
70
+ dependencies = [:_nginx, NATIVE_SUPPORT_TARGET].compact
71
71
  desc "Run Passenger Standalone integration tests"
72
72
  task 'test:integration:standalone' => dependencies do
73
73
  if PlatformInfo.rspec.nil?
@@ -124,7 +124,7 @@ task 'test:integration:native_packaging' do
124
124
  sh "cd test && exec #{command}"
125
125
  end
126
126
 
127
- dependencies = [:apache2, NATIVE_SUPPORT_TARGET].compact
127
+ dependencies = [:_apache2, NATIVE_SUPPORT_TARGET].compact
128
128
  desc "Run the 'apache2' integration test infinitely, and abort if/when it fails"
129
129
  task 'test:restart' => dependencies do
130
130
  require 'shellwords'
@@ -35,6 +35,9 @@ task :nginx => [
35
35
  NATIVE_SUPPORT_TARGET
36
36
  ].compact
37
37
 
38
+ # Workaround for https://github.com/jimweirich/rake/issues/274
39
+ task :_nginx => :nginx
40
+
38
41
  task :nginx_without_native_support => [
39
42
  auto_generated_sources,
40
43
  AGENT_OUTPUT_DIR + 'PassengerHelperAgent',
@@ -323,7 +323,7 @@ task 'package:update_homebrew' do
323
323
  formula = File.read("/tmp/homebrew/Library/Formula/passenger.rb")
324
324
  formula.gsub!(/passenger-.+?\.tar\.gz/, "passenger-#{version}.tar.gz") ||
325
325
  abort("Unable to substitute Homebrew formula tarball filename")
326
- formula.gsub!(/sha1 .*/, "sha1 '#{sha1}'") ||
326
+ formula.gsub!(/^ sha1 .*/, " sha1 '#{sha1}'") ||
327
327
  abort("Unable to substitute Homebrew formula SHA-1")
328
328
  necessary_dirs = ORIG_TARBALL_FILES.call.map{ |filename| filename.split("/").first }.uniq
329
329
  necessary_dirs -= Packaging::HOMEBREW_EXCLUDE
@@ -351,14 +351,12 @@ task 'package:initiate_debian_building' do
351
351
  version = VERSION_STRING
352
352
  if is_open_source?
353
353
  command = "cd /srv/passenger_apt_automation && " +
354
- "chpst -l /tmp/passenger_apt_automation.lock " +
355
354
  "/tools/silence-unless-failed " +
356
- "./new_release https://github.com/phusion/passenger.git passenger.repo passenger.apt #{git_tag}"
355
+ "./new_release https://github.com/phusion/passenger.git passenger #{git_tag}"
357
356
  else
358
357
  command = "cd /srv/passenger_apt_automation && " +
359
- "chpst -l /tmp/passenger_apt_automation.lock " +
360
358
  "/tools/silence-unless-failed " +
361
- "./new_release #{enterprise_git_url} passenger-enterprise.repo passenger-enterprise.apt #{git_tag}"
359
+ "./new_release #{enterprise_git_url} passenger-enterprise #{git_tag}"
362
360
  end
363
361
 
364
362
  sh "ssh psg_apt_automation@juvia-helper.phusion.nl at now <<<'#{command}'"
@@ -186,7 +186,8 @@ private
186
186
  }
187
187
  DEBIAN_DISTRIBUTIONS = {
188
188
  "squeeze" => "20110206",
189
- "wheezy" => "20130504"
189
+ "wheezy" => "20130504",
190
+ "jessie" => "20140000"
190
191
  }
191
192
  REDHAT_ENTERPRISE_DISTRIBUTIONS = {
192
193
  "el6" => "el6.0"
@@ -35,21 +35,21 @@ else
35
35
  output_dir = RUBY_EXTENSION_OUTPUT_DIR
36
36
  output_name = "passenger_native_support.#{LIBEXT}"
37
37
  source_dir = "ext/ruby"
38
- NATIVE_SUPPORT_TARGET = "#{output_dir}/#{output_name}"
38
+ NATIVE_SUPPORT_TARGET = File.join(output_dir, output_name)
39
39
 
40
- task :native_support => "#{output_dir}/#{output_name}"
40
+ task :native_support => NATIVE_SUPPORT_TARGET
41
41
  task :clean => 'native_support:clean'
42
42
 
43
43
  dependencies = [
44
- "#{output_dir}/Makefile",
44
+ File.join(output_dir, "Makefile"),
45
45
  "#{source_dir}/passenger_native_support.c"
46
46
  ]
47
- file("#{output_dir}/#{output_name}" => dependencies) do
47
+ file(NATIVE_SUPPORT_TARGET => dependencies) do
48
48
  sh "mkdir -p '#{output_dir}'" if !File.exist?(output_dir)
49
49
  sh "cd '#{output_dir}' && make"
50
50
  end
51
51
 
52
- file "#{output_dir}/Makefile" => "#{source_dir}/extconf.rb" do
52
+ file(File.join(output_dir, "Makefile") => "#{source_dir}/extconf.rb") do
53
53
  sh "mkdir -p '#{output_dir}'" if !File.exist?(output_dir)
54
54
  extconf_rb = File.expand_path("#{source_dir}/extconf.rb")
55
55
  sh "cd '#{output_dir}' && #{PlatformInfo.ruby_command} '#{extconf_rb}'"
@@ -77,6 +77,7 @@ task 'test:install_deps' do
77
77
  end
78
78
  end
79
79
  if boolean_option('NODE_MODULES', default)
80
- sh "npm install mocha should sinon express"
80
+ sh "npm install mocha should sinon"
81
+ sh "npm install express@3.4.8"
81
82
  end
82
83
  end
@@ -4,10 +4,15 @@ Priority: optional
4
4
  Maintainer: John Leach <john@brightbox.co.uk>
5
5
  Uploaders: Phusion <info@phusion.nl>, Hongli Lai <hongli@phusion.nl>
6
6
  Build-Depends: debhelper (>= 7.0.50~), rake,
7
- ruby1.8, ruby1.8-dev, rubygems1.8,
7
+ #if is_distribution?("<= saucy") || is_distribution?("<= wheezy")
8
+ ruby1.8, ruby1.8-dev, rubygems1.8,
9
+ #endif
8
10
  ruby1.9.1, ruby1.9.1-dev,
9
11
  #if is_distribution?('<= lucid')
10
12
  rubygems1.9,
13
+ #endif
14
+ #if is_distribution?(">= trusty") || is_distribution?(">= jessie")
15
+ ruby2.0, ruby2.0-dev,
11
16
  #endif
12
17
  apache2-mpm-worker | apache2-mpm, apache2-threaded-dev,
13
18
  #if is_distribution?('>= precise') || is_distribution?('>= wheezy')
@@ -23,8 +28,8 @@ XS-Ruby-Versions: all
23
28
  Package: passenger
24
29
  Architecture: any
25
30
  Depends: ${shlibs:Depends}, ${misc:Depends},
26
- ruby2.0 | ruby1.9.1 | ruby1.8 | ruby-interpreter,
27
- rubygems2.0 | rubygems1.9.1 | rubygems1.9 | rubygems (>= 1.2),
31
+ ruby2.2 | ruby2.1 | ruby2.0 | ruby1.9.1 | ruby1.8 | ruby-interpreter,
32
+ rubygems1.9.1 | rubygems1.9 | rubygems (>= 1.2),
28
33
  #if is_distribution?('<= lucid') || is_distribution?('<= squeeze')
29
34
  librack-ruby,
30
35
  #else
@@ -47,7 +52,7 @@ Description: Rails and Rack support for Apache2 and Nginx
47
52
  Package: passenger-dev
48
53
  Architecture: any
49
54
  Depends: ${shlibs:Depends}, ${misc:Depends},
50
- ruby2.0 | ruby1.9.1 | ruby1.8 | ruby-interpreter,
55
+ ruby2.2 | ruby2.1 | ruby2.0 | ruby1.9.1 | ruby1.8 | ruby-interpreter,
51
56
  passenger (= ${binary:Version})
52
57
  Suggests: python
53
58
  Replaces: ruby-passenger-dev
@@ -23,10 +23,16 @@ override_dh_auto_configure:
23
23
  # Do nothing
24
24
 
25
25
  override_dh_auto_build:
26
- /usr/bin/ruby1.8 /usr/bin/rake fakeroot
27
- mv pkg/fakeroot pkg/fakeroot1.8
26
+ #if is_distribution?("<= saucy") || is_distribution?("<= wheezy")
27
+ /usr/bin/ruby1.8 /usr/bin/rake fakeroot
28
+ mv pkg/fakeroot pkg/fakeroot1.8
29
+ #endif
28
30
  /usr/bin/ruby1.9.1 /usr/bin/rake fakeroot
29
31
  mv pkg/fakeroot pkg/fakeroot1.9.1
32
+ #if is_distribution?(">= trusty") || is_distribution?(">= jessie")
33
+ /usr/bin/ruby2.0 /usr/bin/rake fakeroot
34
+ mv pkg/fakeroot pkg/fakeroot2.0
35
+ #endif
30
36
  cd nginx-<%= PhusionPassenger::PREFERRED_NGINX_VERSION %> && \
31
37
  ./configure --prefix=/tmp \
32
38
  <%= PhusionPassenger::STANDALONE_NGINX_CONFIGURE_OPTIONS %> \
@@ -36,9 +42,14 @@ override_dh_auto_build:
36
42
 
37
43
  override_dh_auto_install:
38
44
  mkdir debian/tmp/
39
- # Merge Ruby 1.8 and 1.9 files into a single directory.
40
- cp -a pkg/fakeroot1.8/* debian/tmp/
45
+ # Merge Ruby 1.8, 1.9 and 2.0 files into a single directory.
46
+ #if is_distribution?("<= saucy") || is_distribution?("<= wheezy")
47
+ cp -a pkg/fakeroot1.8/* debian/tmp/
48
+ #endif
41
49
  cp -a pkg/fakeroot1.9.1/* debian/tmp/
50
+ #if is_distribution?(">= trusty") || is_distribution?(">= jessie")
51
+ cp -a pkg/fakeroot2.0/* debian/tmp/
52
+ #endif
42
53
  ./dev/install_scripts_bootstrap_code.rb --ruby /usr/lib/ruby/vendor_ruby debian/tmp/usr/bin/* debian/tmp/usr/sbin/*
43
54
  ./dev/install_scripts_bootstrap_code.rb --nginx-module-config /usr/bin debian/tmp/usr/share/<%= PhusionPassenger::GLOBAL_NAMESPACE_DIRNAME %>/ngx_http_passenger_module/config
44
55
  touch debian/tmp/usr/share/<%= PhusionPassenger::GLOBAL_NAMESPACE_DIRNAME %>/release.txt
@@ -47,6 +58,7 @@ override_dh_auto_clean:
47
58
  /usr/bin/rake clean CLEAN_DOCS=false
48
59
  rm -rf pkg/fakeroot1.8
49
60
  rm -rf pkg/fakeroot1.9.1
61
+ rm -rf pkg/fakeroot2.0
50
62
  cd nginx-<%= PhusionPassenger::PREFERRED_NGINX_VERSION %> && if test -f Makefile; then make clean; fi
51
63
  # Hack to prevent HTML files from being renegerated
52
64
  touch doc/*.html
@@ -22,6 +22,30 @@ function run()
22
22
  "$@"
23
23
  }
24
24
 
25
+ function retry_run()
26
+ {
27
+ local reset='\x1B[0m'
28
+ local red='\x1B[31m'
29
+ local yellow='\x1B[33m'
30
+
31
+ local max_tries="$1"
32
+ local number=2
33
+ shift
34
+
35
+ echo "$ $@"
36
+ while true; do
37
+ if "$@"; then
38
+ return 0
39
+ elif [[ $number -le $max_tries ]]; then
40
+ echo -e "${yellow}The command \"$@\" failed. Retrying, $number of $max_tries:${reset}"
41
+ (( number++ ))
42
+ else
43
+ echo -e "${red}The command \"$@\" failed after $max_tries attempts. Giving up.${reset}"
44
+ return 1
45
+ fi
46
+ done
47
+ }
48
+
25
49
  function apt_get_update() {
26
50
  if [[ "$apt_get_updated" = "" ]]; then
27
51
  apt_get_updated=1
@@ -43,7 +67,7 @@ function install_test_deps_with_doctools()
43
67
  {
44
68
  if [[ "$install_test_deps_with_doctools" = "" ]]; then
45
69
  install_test_deps_with_doctools=1
46
- run rake test:install_deps BASE_DEPS=yes DOCTOOLS=yes
70
+ retry_run 3 rake test:install_deps BASE_DEPS=yes DOCTOOLS=yes
47
71
  fi
48
72
  }
49
73
 
@@ -51,7 +75,7 @@ function install_base_test_deps()
51
75
  {
52
76
  if [[ "$install_base_test_deps" = "" ]]; then
53
77
  install_base_test_deps=1
54
- rake test:install_deps BASE_DEPS=yes
78
+ retry_run 3 rake test:install_deps BASE_DEPS=yes
55
79
  fi
56
80
  }
57
81
 
@@ -59,10 +83,10 @@ function install_node_and_modules()
59
83
  {
60
84
  if [[ "$install_node_and_modules" = "" ]]; then
61
85
  install_node_and_modules=1
62
- curl -O http://nodejs.org/dist/v0.10.20/node-v0.10.20-linux-x64.tar.gz
63
- tar xzvf node-v0.10.20-linux-x64.tar.gz
86
+ run curl --fail -O http://nodejs.org/dist/v0.10.20/node-v0.10.20-linux-x64.tar.gz
87
+ run tar xzf node-v0.10.20-linux-x64.tar.gz
64
88
  export PATH=`pwd`/node-v0.10.20-linux-x64/bin:$PATH
65
- run rake test:install_deps NODE_MODULES=yes
89
+ retry_run 3 rake test:install_deps NODE_MODULES=yes
66
90
  fi
67
91
  }
68
92
 
@@ -89,18 +113,18 @@ if [[ "$TEST_RUBY_VERSION" != "" ]]; then
89
113
  fi
90
114
 
91
115
  if [[ "$TEST_RUBYGEMS_VERSION" != "" ]]; then
92
- run rvm install rubygems $TEST_RUBYGEMS_VERSION
116
+ retry_run 3 rvm install rubygems $TEST_RUBYGEMS_VERSION
93
117
  run gem --version
94
118
  fi
95
119
 
96
120
  if [[ "$TEST_CXX" = 1 ]]; then
97
- run rake test:install_deps BASE_DEPS=yes
121
+ install_base_test_deps
98
122
  run rake test:cxx
99
123
  run rake test:oxt
100
124
  fi
101
125
 
102
126
  if [[ "$TEST_RUBY" = 1 ]]; then
103
- run rake test:install_deps BASE_DEPS=yes RAILS_BUNDLES=yes
127
+ retry_run 3 rake test:install_deps BASE_DEPS=yes RAILS_BUNDLES=yes
104
128
  run rake test:ruby
105
129
  fi
106
130
 
@@ -58,6 +58,8 @@ For example:
58
58
  <Directory /webapps/mycook/public>
59
59
  Allow from all
60
60
  Options -MultiViews
61
+ # Uncomment this if you're on Apache >= 2.4:
62
+ #Require all granted
61
63
  </Directory>
62
64
  </VirtualHost>
63
65
  -------------------------------------------
@@ -82,6 +84,9 @@ Suppose that you already have a virtual host:
82
84
  DocumentRoot /websites/phusion
83
85
  <Directory /websites/phusion>
84
86
  Allow from all
87
+ Options -MultiViews
88
+ # Uncomment this if you're on Apache >= 2.4:
89
+ #Require all granted
85
90
  </Directory>
86
91
  </VirtualHost>
87
92
  -------------------------------------------
@@ -96,7 +101,7 @@ To do this, you need to perform the following:
96
101
  3. Inside the Location block, set `PassengerBaseURI /{SUBURI}`.
97
102
  4. Inside the Location block, set `PassengerAppRoot {PATH TO YOUR APPLICATION ROOT}`.
98
103
  5. Create a `<Directory {PATH TO YOUR APPLICATION'S PUBLIC DIRECTORY}>` block.
99
- 6. Inside the Directory block, set `Allow from all`.
104
+ 6. Inside the Directory block, set `Allow from all`, and (if you're on Apache >= 2.4) `Require all granted`.
100
105
  7. Inside the Directory block, disable MultiViews.
101
106
 
102
107
  Here is an example:
@@ -107,6 +112,9 @@ Here is an example:
107
112
  DocumentRoot /websites/phusion
108
113
  <Directory /websites/phusion>
109
114
  Allow from all
115
+ Options -MultiViews
116
+ # Uncomment this if you're on Apache >= 2.4:
117
+ #Require all granted
110
118
  </Directory>
111
119
 
112
120
  # These have been added:
@@ -118,6 +126,8 @@ Here is an example:
118
126
  <Directory /websites/rails/public>
119
127
  Allow from all
120
128
  Options -MultiViews
129
+ # Uncomment this if you're on Apache >= 2.4:
130
+ #Require all granted
121
131
  </Directory>
122
132
  </VirtualHost>
123
133
  -------------------------------------------
@@ -233,6 +243,8 @@ the Apache configuration file:
233
243
  <Directory /webapps/rack_example/public>
234
244
  Allow from all
235
245
  Options -MultiViews
246
+ # Uncomment this if you're on Apache >= 2.4:
247
+ #Require all granted
236
248
  </Directory>
237
249
  </VirtualHost>
238
250
  -------------------------------------------
@@ -258,6 +270,8 @@ For example:
258
270
  <Directory /webapps/rackapp/public>
259
271
  Allow from all
260
272
  Options -MultiViews
273
+ # Uncomment this if you're on Apache >= 2.4:
274
+ #Require all granted
261
275
  </Directory>
262
276
  </VirtualHost>
263
277
  -------------------------------------------
@@ -282,6 +296,9 @@ Suppose that you already have a virtual host:
282
296
  DocumentRoot /websites/phusion
283
297
  <Directory /websites/phusion>
284
298
  Allow from all
299
+ Options -MultiViews
300
+ # Uncomment this if you're on Apache >= 2.4:
301
+ #Require all granted
285
302
  </Directory>
286
303
  </VirtualHost>
287
304
  -------------------------------------------
@@ -296,7 +313,7 @@ To do this, you need to perform the following:
296
313
  3. Inside the Location block, set `PassengerBaseURI /{SUBURI}`.
297
314
  4. Inside the Location block, set `PassengerAppRoot {PATH TO YOUR APPLICATION ROOT}`.
298
315
  5. Create a `<Directory {PATH TO YOUR APPLICATION'S PUBLIC DIRECTORY}>` block.
299
- 6. Inside the Directory block, set `Allow from all`.
316
+ 6. Inside the Directory block, set `Allow from all`, and (if you're on Apache >= 2.4) `Require all granted`.
300
317
  7. Inside the Directory block, disable MultiViews.
301
318
 
302
319
  Here is an example:
@@ -307,6 +324,9 @@ Here is an example:
307
324
  DocumentRoot /websites/phusion
308
325
  <Directory /websites/phusion>
309
326
  Allow from all
327
+ Options -MultiViews
328
+ # Uncomment this if you're on Apache >= 2.4:
329
+ #Require all granted
310
330
  </Directory>
311
331
 
312
332
  # These have been added:
@@ -318,6 +338,8 @@ Here is an example:
318
338
  <Directory /websites/rack/public>
319
339
  Allow from all
320
340
  Options -MultiViews
341
+ # Uncomment this if you're on Apache >= 2.4:
342
+ #Require all granted
321
343
  </Directory>
322
344
  </VirtualHost>
323
345
  -------------------------------------------
@@ -397,6 +419,8 @@ the Apache configuration file:
397
419
  <Directory /webapps/wsgi_example/public>
398
420
  Allow from all
399
421
  Options -MultiViews
422
+ # Uncomment this if you're on Apache >= 2.4:
423
+ #Require all granted
400
424
  </Directory>
401
425
  </VirtualHost>
402
426
  -------------------------------------------
@@ -422,6 +446,8 @@ For example:
422
446
  <Directory /webapps/wsgiapp/public>
423
447
  Allow from all
424
448
  Options -MultiViews
449
+ # Uncomment this if you're on Apache >= 2.4:
450
+ #Require all granted
425
451
  </Directory>
426
452
  </VirtualHost>
427
453
  -------------------------------------------
@@ -446,6 +472,9 @@ Suppose that you already have a virtual host:
446
472
  DocumentRoot /websites/phusion
447
473
  <Directory /websites/phusion>
448
474
  Allow from all
475
+ Options -MultiViews
476
+ # Uncomment this if you're on Apache >= 2.4:
477
+ #Require all granted
449
478
  </Directory>
450
479
  </VirtualHost>
451
480
  -------------------------------------------
@@ -460,7 +489,7 @@ To do this, you need to perform the following:
460
489
  3. Inside the Location block, set `PassengerBaseURI /{SUBURI}`.
461
490
  4. Inside the Location block, set `PassengerAppRoot {PATH TO YOUR APPLICATION ROOT}`.
462
491
  5. Create a `<Directory {PATH TO YOUR APPLICATION'S PUBLIC DIRECTORY}>` block.
463
- 6. Inside the Directory block, set `Allow from all`.
492
+ 6. Inside the Directory block, set `Allow from all`, and (if you're on Apache >= 2.4) `Require all granted`.
464
493
  7. Inside the Directory block, disable MultiViews.
465
494
 
466
495
  Here is an example:
@@ -471,6 +500,9 @@ Here is an example:
471
500
  DocumentRoot /websites/phusion
472
501
  <Directory /websites/phusion>
473
502
  Allow from all
503
+ Options -MultiViews
504
+ # Uncomment this if you're on Apache >= 2.4:
505
+ #Require all granted
474
506
  </Directory>
475
507
 
476
508
  # These have been added:
@@ -482,6 +514,8 @@ Here is an example:
482
514
  <Directory /websites/python/public>
483
515
  Allow from all
484
516
  Options -MultiViews
517
+ # Uncomment this if you're on Apache >= 2.4:
518
+ #Require all granted
485
519
  </Directory>
486
520
  </VirtualHost>
487
521
  -------------------------------------------
@@ -631,6 +665,8 @@ PassengerNodejs /usr/bin/node;
631
665
  <Directory /websites/blog/public>
632
666
  Allow from all
633
667
  Options -MultiViews
668
+ # Uncomment this if you're on Apache >= 2.4:
669
+ #Require all granted
634
670
  </Directory>
635
671
  </VirtualHost>
636
672
 
@@ -979,11 +1015,13 @@ The default value is the primary group of the user specifified by
979
1015
  ==== PassengerFriendlyErrorPages <on|off> ====
980
1016
  Phusion Passenger can display friendly error pages whenever an application fails
981
1017
  to start. This friendly error page presents the startup error message, some
982
- suggestions for solving the problem, and a backtrace. This feature is very useful
983
- during application development and useful for less experienced system administrators,
984
- but the page might reveal potentially sensitive information, depending on the
985
- application. Experienced system administrators who are using Phusion Passenger
986
- on serious production servers should consider turning this feature off.
1018
+ suggestions for solving the problem, a backtrace and a dump of the environment variables.
1019
+ This feature is very useful during application development and useful for less experienced
1020
+ system administrators, but the page might reveal potentially sensitive information,
1021
+ depending on the application. For this reason, friendly error pages are turned off by default when
1022
+ <<PassengerAppEnv,PassengerAppEnv (and its aliases such as RailsEnv and RackEnv)>>
1023
+ is set to 'staging' or 'production', but enabled by default otherwise. You can use
1024
+ this option to explicitly enable or disable this feature.
987
1025
 
988
1026
  This option may occur in the following places:
989
1027
 
@@ -992,7 +1030,7 @@ This option may occur in the following places:
992
1030
  * In a `<Directory>` or `<Location>` block.
993
1031
  * In '.htaccess', if `AllowOverride Options` is on.
994
1032
 
995
- In each place, it may be specified at most once. The default value is 'on'.
1033
+ In each place, it may be specified at most once. The default value depends on <<PassengerAppEnv,PassengerAppEnv (and its aliases such as RailsEnv and RackEnv)>>, as documented above.
996
1034
 
997
1035
 
998
1036
  === Resource control and optimization options ===
@@ -1477,6 +1515,8 @@ Suppose that you have a web application deployed in a sub-URI '/store', like thi
1477
1515
  <Directory /websites/store/public>
1478
1516
  Allow from all
1479
1517
  Options -MultiViews
1518
+ # Uncomment this if you're on Apache >= 2.4:
1519
+ #Require all granted
1480
1520
  </Directory>
1481
1521
  </VirtualHost>
1482
1522
  ---------------------------
@@ -1497,6 +1537,8 @@ like this:
1497
1537
  <Directory /websites/store/public>
1498
1538
  Allow from all
1499
1539
  Options -MultiViews
1540
+ # Uncomment this if you're on Apache >= 2.4:
1541
+ #Require all granted
1500
1542
  </Directory>
1501
1543
  </VirtualHost>
1502
1544
 
@@ -1515,7 +1557,7 @@ PassengerPreStart http://myblog.com/ # <----- WRONG! Missing "/store" part.
1515
1557
  Application processes started with PassengerPreStart are
1516
1558
  also subject to the idle timeout rules as specified by
1517
1559
  <<PassengerPoolIdleTime,PassengerPoolIdleTime>>! That means that by default,
1518
- the pre-started application processes for foo.com are bar.com are shut down
1560
+ the pre-started application processes for foo.com and bar.com are shut down
1519
1561
  after a few minutes of inactivity. If you don't want that to happen, then
1520
1562
  you should combine PassengerPreStart with
1521
1563
  <<PassengerMinInstances,PassengerMinInstances>>, like this:
@@ -2099,6 +2141,9 @@ assets correctly:
2099
2141
  AllowOverride None
2100
2142
  Order allow,deny
2101
2143
  Allow from all
2144
+ Options -MultiViews
2145
+ # Uncomment this if you're on Apache >= 2.4:
2146
+ #Require all granted
2102
2147
  </Directory>
2103
2148
  -----------------------------------------
2104
2149
  +