passenger 5.0.0.beta3 → 5.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of passenger might be problematic. Click here for more details.

Files changed (218) hide show
  1. checksums.yaml +8 -8
  2. checksums.yaml.gz.asc +7 -7
  3. data.tar.gz.asc +7 -7
  4. data/.editorconfig +11 -5
  5. data/CHANGELOG +38 -0
  6. data/CONTRIBUTING.md +1 -4
  7. data/Gemfile +0 -1
  8. data/Gemfile.lock +0 -2
  9. data/Rakefile +33 -33
  10. data/bin/passenger +1 -1
  11. data/bin/passenger-config +1 -1
  12. data/bin/passenger-install-apache2-module +800 -800
  13. data/bin/passenger-install-nginx-module +592 -592
  14. data/bin/passenger-memory-stats +127 -127
  15. data/bin/passenger-status +216 -216
  16. data/build/agents.rb +127 -127
  17. data/build/apache2.rb +87 -87
  18. data/build/basics.rb +60 -60
  19. data/build/common_library.rb +165 -165
  20. data/build/cplusplus_support.rb +51 -51
  21. data/build/cxx_tests.rb +268 -268
  22. data/build/debian.rb +143 -143
  23. data/build/documentation.rb +58 -58
  24. data/build/integration_tests.rb +81 -81
  25. data/build/misc.rb +132 -132
  26. data/build/nginx.rb +20 -20
  27. data/build/node_tests.rb +7 -7
  28. data/build/oxt_tests.rb +14 -14
  29. data/build/packaging.rb +570 -570
  30. data/build/preprocessor.rb +260 -260
  31. data/build/rake_extensions.rb +71 -71
  32. data/build/ruby_extension.rb +29 -29
  33. data/build/ruby_tests.rb +6 -6
  34. data/build/test_basics.rb +37 -37
  35. data/debian.template/control.template +3 -5
  36. data/dev/copy_boost_headers +134 -134
  37. data/dev/install_scripts_bootstrap_code.rb +25 -25
  38. data/dev/list_tests +20 -20
  39. data/dev/ruby_server.rb +223 -223
  40. data/dev/runner +18 -18
  41. data/doc/ServerOptimizationGuide.txt.md +55 -2
  42. data/doc/Users guide Nginx.txt +0 -26
  43. data/doc/Users guide Standalone.txt +5 -1
  44. data/doc/users_guide_snippets/tips.txt +9 -0
  45. data/ext/common/ApplicationPool2/Group.h +23 -11
  46. data/ext/common/ApplicationPool2/Implementation.cpp +32 -7
  47. data/ext/common/ApplicationPool2/Pool.h +22 -17
  48. data/ext/common/ApplicationPool2/SmartSpawner.h +4 -1
  49. data/ext/common/ApplicationPool2/Spawner.h +1 -1
  50. data/ext/common/Constants.h +1 -1
  51. data/ext/common/agents/Base.cpp +35 -20
  52. data/ext/common/agents/HelperAgent/Main.cpp +8 -1
  53. data/ext/common/agents/HelperAgent/OptionParser.h +18 -4
  54. data/ext/common/agents/HelperAgent/RequestHandler.h +2 -83
  55. data/ext/common/agents/HelperAgent/RequestHandler/ForwardResponse.cpp +54 -1
  56. data/ext/common/agents/HelperAgent/RequestHandler/InitRequest.cpp +7 -4
  57. data/ext/common/agents/Main.cpp +1 -1
  58. data/ext/common/agents/Watchdog/Main.cpp +54 -19
  59. data/ext/nginx/Configuration.c +7 -0
  60. data/ext/nginx/ContentHandler.c +9 -1
  61. data/helper-scripts/backtrace-sanitizer.rb +106 -87
  62. data/helper-scripts/crash-watch.rb +32 -0
  63. data/helper-scripts/download_binaries/extconf.rb +38 -38
  64. data/helper-scripts/meteor-loader.rb +107 -107
  65. data/helper-scripts/prespawn +101 -101
  66. data/helper-scripts/rack-loader.rb +96 -96
  67. data/helper-scripts/rack-preloader.rb +137 -137
  68. data/lib/phusion_passenger.rb +292 -292
  69. data/lib/phusion_passenger/abstract_installer.rb +438 -438
  70. data/lib/phusion_passenger/active_support3_extensions/init.rb +168 -170
  71. data/lib/phusion_passenger/admin_tools.rb +20 -20
  72. data/lib/phusion_passenger/admin_tools/instance.rb +178 -178
  73. data/lib/phusion_passenger/admin_tools/instance_registry.rb +61 -61
  74. data/lib/phusion_passenger/admin_tools/memory_stats.rb +267 -267
  75. data/lib/phusion_passenger/apache2/config_options.rb +182 -182
  76. data/lib/phusion_passenger/common_library.rb +479 -485
  77. data/lib/phusion_passenger/config/about_command.rb +161 -161
  78. data/lib/phusion_passenger/config/admin_command_command.rb +129 -129
  79. data/lib/phusion_passenger/config/agent_compiler.rb +121 -121
  80. data/lib/phusion_passenger/config/build_native_support_command.rb +43 -43
  81. data/lib/phusion_passenger/config/command.rb +25 -25
  82. data/lib/phusion_passenger/config/compile_agent_command.rb +62 -62
  83. data/lib/phusion_passenger/config/compile_nginx_engine_command.rb +88 -73
  84. data/lib/phusion_passenger/config/detach_process_command.rb +72 -72
  85. data/lib/phusion_passenger/config/download_agent_command.rb +246 -227
  86. data/lib/phusion_passenger/config/download_nginx_engine_command.rb +245 -224
  87. data/lib/phusion_passenger/config/install_agent_command.rb +144 -132
  88. data/lib/phusion_passenger/config/install_standalone_runtime_command.rb +205 -185
  89. data/lib/phusion_passenger/config/installation_utils.rb +204 -204
  90. data/lib/phusion_passenger/config/list_instances_command.rb +64 -64
  91. data/lib/phusion_passenger/config/main.rb +152 -152
  92. data/lib/phusion_passenger/config/nginx_engine_compiler.rb +319 -300
  93. data/lib/phusion_passenger/config/reopen_logs_command.rb +67 -67
  94. data/lib/phusion_passenger/config/restart_app_command.rb +155 -155
  95. data/lib/phusion_passenger/config/system_metrics_command.rb +13 -13
  96. data/lib/phusion_passenger/config/utils.rb +95 -95
  97. data/lib/phusion_passenger/config/validate_install_command.rb +198 -198
  98. data/lib/phusion_passenger/console_text_template.rb +25 -25
  99. data/lib/phusion_passenger/constants.rb +90 -90
  100. data/lib/phusion_passenger/debug_logging.rb +106 -106
  101. data/lib/phusion_passenger/loader_shared_helpers.rb +447 -432
  102. data/lib/phusion_passenger/message_channel.rb +312 -312
  103. data/lib/phusion_passenger/message_client.rb +176 -176
  104. data/lib/phusion_passenger/native_support.rb +369 -369
  105. data/lib/phusion_passenger/nginx/config_options.rb +297 -297
  106. data/lib/phusion_passenger/packaging.rb +131 -131
  107. data/lib/phusion_passenger/platform_info.rb +360 -360
  108. data/lib/phusion_passenger/platform_info/apache.rb +767 -767
  109. data/lib/phusion_passenger/platform_info/apache_detector.rb +199 -199
  110. data/lib/phusion_passenger/platform_info/binary_compatibility.rb +107 -107
  111. data/lib/phusion_passenger/platform_info/compiler.rb +570 -570
  112. data/lib/phusion_passenger/platform_info/curl.rb +32 -32
  113. data/lib/phusion_passenger/platform_info/cxx_portability.rb +188 -188
  114. data/lib/phusion_passenger/platform_info/depcheck.rb +372 -372
  115. data/lib/phusion_passenger/platform_info/depcheck_specs/apache2.rb +109 -109
  116. data/lib/phusion_passenger/platform_info/depcheck_specs/compiler_toolchain.rb +4 -4
  117. data/lib/phusion_passenger/platform_info/depcheck_specs/gems.rb +10 -34
  118. data/lib/phusion_passenger/platform_info/depcheck_specs/libs.rb +101 -101
  119. data/lib/phusion_passenger/platform_info/depcheck_specs/ruby.rb +5 -5
  120. data/lib/phusion_passenger/platform_info/depcheck_specs/utilities.rb +13 -13
  121. data/lib/phusion_passenger/platform_info/linux.rb +55 -55
  122. data/lib/phusion_passenger/platform_info/operating_system.rb +149 -149
  123. data/lib/phusion_passenger/platform_info/ruby.rb +468 -448
  124. data/lib/phusion_passenger/platform_info/zlib.rb +9 -9
  125. data/lib/phusion_passenger/plugin.rb +66 -66
  126. data/lib/phusion_passenger/preloader_shared_helpers.rb +126 -126
  127. data/lib/phusion_passenger/public_api.rb +191 -191
  128. data/lib/phusion_passenger/rack/out_of_band_gc.rb +93 -94
  129. data/lib/phusion_passenger/rack/thread_handler_extension.rb +231 -227
  130. data/lib/phusion_passenger/request_handler.rb +567 -577
  131. data/lib/phusion_passenger/request_handler/thread_handler.rb +379 -381
  132. data/lib/phusion_passenger/ruby_core_enhancements.rb +86 -86
  133. data/lib/phusion_passenger/ruby_core_io_enhancements.rb +74 -74
  134. data/lib/phusion_passenger/simple_benchmarking.rb +25 -25
  135. data/lib/phusion_passenger/standalone/app_finder.rb +153 -150
  136. data/lib/phusion_passenger/standalone/command.rb +44 -40
  137. data/lib/phusion_passenger/standalone/config_utils.rb +53 -53
  138. data/lib/phusion_passenger/standalone/control_utils.rb +38 -59
  139. data/lib/phusion_passenger/standalone/main.rb +73 -73
  140. data/lib/phusion_passenger/standalone/start_command.rb +697 -685
  141. data/lib/phusion_passenger/standalone/start_command/builtin_engine.rb +193 -155
  142. data/lib/phusion_passenger/standalone/start_command/nginx_engine.rb +162 -133
  143. data/lib/phusion_passenger/standalone/status_command.rb +64 -64
  144. data/lib/phusion_passenger/standalone/stop_command.rb +72 -72
  145. data/lib/phusion_passenger/standalone/version_command.rb +9 -9
  146. data/lib/phusion_passenger/union_station/connection.rb +32 -32
  147. data/lib/phusion_passenger/union_station/core.rb +251 -251
  148. data/lib/phusion_passenger/union_station/transaction.rb +126 -126
  149. data/lib/phusion_passenger/utils.rb +199 -167
  150. data/lib/phusion_passenger/utils/ansi_colors.rb +128 -128
  151. data/lib/phusion_passenger/utils/download.rb +196 -196
  152. data/lib/phusion_passenger/utils/file_system_watcher.rb +158 -158
  153. data/lib/phusion_passenger/utils/hosts_file_parser.rb +101 -101
  154. data/lib/phusion_passenger/utils/lock.rb +31 -31
  155. data/lib/phusion_passenger/utils/native_support_utils.rb +31 -31
  156. data/lib/phusion_passenger/utils/progress_bar.rb +26 -26
  157. data/lib/phusion_passenger/utils/shellwords.rb +20 -20
  158. data/lib/phusion_passenger/utils/terminal_choice_menu.rb +206 -206
  159. data/lib/phusion_passenger/utils/unseekable_socket.rb +272 -272
  160. data/lib/phusion_passenger/vendor/crash_watch/app.rb +129 -0
  161. data/lib/phusion_passenger/vendor/crash_watch/gdb_controller.rb +341 -0
  162. data/lib/phusion_passenger/vendor/crash_watch/version.rb +24 -0
  163. data/lib/phusion_passenger/vendor/daemon_controller.rb +877 -0
  164. data/lib/phusion_passenger/vendor/daemon_controller/lock_file.rb +127 -0
  165. data/lib/phusion_passenger/vendor/daemon_controller/spawn.rb +26 -0
  166. data/lib/phusion_passenger/vendor/daemon_controller/version.rb +29 -0
  167. data/packaging/rpm/passenger_spec/passenger.spec.template +0 -1
  168. data/passenger.gemspec +0 -1
  169. data/resources/templates/config/nginx_engine_compiler/possible_solutions_for_download_and_extraction_problems.txt.erb +27 -0
  170. data/resources/templates/standalone/config.erb +19 -15
  171. data/test/integration_tests/apache2_tests.rb +566 -566
  172. data/test/integration_tests/downloaded_binaries_tests.rb +126 -125
  173. data/test/integration_tests/native_packaging_spec.rb +296 -296
  174. data/test/integration_tests/nginx_tests.rb +393 -393
  175. data/test/integration_tests/shared/example_webapp_tests.rb +282 -280
  176. data/test/integration_tests/source_packaging_test.rb +138 -138
  177. data/test/integration_tests/spec_helper.rb +5 -5
  178. data/test/integration_tests/standalone_tests.rb +367 -367
  179. data/test/ruby/debug_logging_spec.rb +133 -133
  180. data/test/ruby/message_channel_spec.rb +186 -186
  181. data/test/ruby/rack/loader_spec.rb +28 -28
  182. data/test/ruby/rack/preloader_spec.rb +34 -34
  183. data/test/ruby/rails3.0/loader_spec.rb +12 -12
  184. data/test/ruby/rails3.0/preloader_spec.rb +18 -18
  185. data/test/ruby/rails3.1/loader_spec.rb +12 -12
  186. data/test/ruby/rails3.1/preloader_spec.rb +18 -18
  187. data/test/ruby/rails3.2/loader_spec.rb +12 -12
  188. data/test/ruby/rails3.2/preloader_spec.rb +18 -18
  189. data/test/ruby/rails4.0/loader_spec.rb +12 -12
  190. data/test/ruby/rails4.0/preloader_spec.rb +18 -18
  191. data/test/ruby/rails4.1/loader_spec.rb +12 -12
  192. data/test/ruby/rails4.1/preloader_spec.rb +18 -18
  193. data/test/ruby/request_handler_spec.rb +730 -730
  194. data/test/ruby/shared/loader_sharedspec.rb +224 -224
  195. data/test/ruby/shared/rails/union_station_extensions_sharedspec.rb +327 -327
  196. data/test/ruby/shared/ruby_loader_sharedspec.rb +47 -47
  197. data/test/ruby/spec_helper.rb +65 -65
  198. data/test/ruby/standalone/runtime_installer_spec.rb +384 -384
  199. data/test/ruby/union_station_spec.rb +276 -276
  200. data/test/ruby/utils/file_system_watcher_spec.rb +220 -220
  201. data/test/ruby/utils/hosts_file_parser.rb +248 -248
  202. data/test/ruby/utils/tee_input_spec.rb +215 -215
  203. data/test/ruby/utils/unseekable_socket_spec.rb +57 -57
  204. data/test/ruby/utils_spec.rb +21 -21
  205. data/test/stub/rack/config.ru +87 -87
  206. data/test/stub/rack/library.rb +8 -8
  207. data/test/stub/rack/start.rb +30 -30
  208. data/test/support/apache2_controller.rb +191 -191
  209. data/test/support/nginx_controller.rb +90 -99
  210. data/test/support/placebo-preloader.rb +57 -57
  211. data/test/support/test_helper.rb +435 -435
  212. metadata +11 -21
  213. metadata.gz.asc +7 -7
  214. data/lib/phusion_passenger/standalone/command2.rb +0 -292
  215. data/lib/phusion_passenger/standalone/start2_command.rb +0 -799
  216. data/resources/templates/standalone/download_tool_missing.txt.erb +0 -18
  217. data/resources/templates/standalone/possible_solutions_for_download_and_extraction_problems.txt.erb +0 -17
  218. data/resources/templates/standalone/run_installer_as_root.txt.erb +0 -8
@@ -55,287 +55,287 @@
55
55
  # * Text inside #if/#elif/#else are automatically unindented.
56
56
  # * ERB compatible.
57
57
  class Preprocessor
58
- def initialize
59
- require 'erb' if !defined?(ERB)
60
- @indentation_size = 4
61
- @debug = boolean_option('DEBUG')
62
- end
58
+ def initialize
59
+ require 'erb' if !defined?(ERB)
60
+ @indentation_size = 4
61
+ @debug = boolean_option('DEBUG')
62
+ end
63
63
 
64
- def start(filename, output_filename, variables = {})
65
- if output_filename
66
- temp_output_filename = "#{output_filename}._new"
67
- output = File.open(temp_output_filename, 'w')
68
- else
69
- output = STDOUT
70
- end
71
- the_binding = create_binding(variables)
72
- context = []
73
- @filename = filename
74
- @lineno = 1
75
- @indentation = 0
64
+ def start(filename, output_filename, variables = {})
65
+ if output_filename
66
+ temp_output_filename = "#{output_filename}._new"
67
+ output = File.open(temp_output_filename, 'w')
68
+ else
69
+ output = STDOUT
70
+ end
71
+ the_binding = create_binding(variables)
72
+ context = []
73
+ @filename = filename
74
+ @lineno = 1
75
+ @indentation = 0
76
76
 
77
- each_line(filename, the_binding) do |line|
78
- debug("context=#{context.inspect}, line=#{line.inspect}")
77
+ each_line(filename, the_binding) do |line|
78
+ debug("context=#{context.inspect}, line=#{line.inspect}")
79
79
 
80
- name, args_string, cmd_indentation = recognize_command(line)
81
- case name
82
- when "if"
83
- case context.last
84
- when nil, :if_true, :else_true
85
- check_indentation(cmd_indentation)
86
- result = the_binding.eval(args_string, filename, @lineno)
87
- context.push(result ? :if_true : :if_false)
88
- inc_indentation
89
- when :if_false, :else_false, :if_ignore
90
- check_indentation(cmd_indentation)
91
- inc_indentation
92
- context.push(:if_ignore)
93
- else
94
- terminate "#if is not allowed in this context"
95
- end
96
- when "elif"
97
- case context.last
98
- when :if_true
99
- dec_indentation
100
- check_indentation(cmd_indentation)
101
- inc_indentation
102
- context[-1] = :if_false
103
- when :if_false
104
- dec_indentation
105
- check_indentation(cmd_indentation)
106
- inc_indentation
107
- result = the_binding.eval(args_string, filename, @lineno)
108
- context[-1] = result ? :if_true : :if_false
109
- when :else_true, :else_false
110
- terminate "#elif is not allowed after #else"
111
- when :if_ignore
112
- dec_indentation
113
- check_indentation(cmd_indentation)
114
- inc_indentation
115
- else
116
- terminate "#elif is not allowed outside #if block"
117
- end
118
- when "else"
119
- case context.last
120
- when :if_true
121
- dec_indentation
122
- check_indentation(cmd_indentation)
123
- inc_indentation
124
- context[-1] = :else_false
125
- when :if_false
126
- dec_indentation
127
- check_indentation(cmd_indentation)
128
- inc_indentation
129
- context[-1] = :else_true
130
- when :else_true, :else_false
131
- terminate "it is not allowed to have multiple #else clauses in one #if block"
132
- when :if_ignore
133
- dec_indentation
134
- check_indentation(cmd_indentation)
135
- inc_indentation
136
- else
137
- terminate "#else is not allowed outside #if block"
138
- end
139
- when "endif"
140
- case context.last
141
- when :if_true, :if_false, :else_true, :else_false, :if_ignore
142
- dec_indentation
143
- check_indentation(cmd_indentation)
144
- context.pop
145
- else
146
- terminate "#endif is not allowed outside #if block"
147
- end
148
- when "DEBHELPER"
149
- output.puts(line)
150
- when "", nil
151
- # Either a comment or not a preprocessor command.
152
- case context.last
153
- when nil, :if_true, :else_true
154
- output.puts(unindent(line))
155
- else
156
- # Check indentation but do not output.
157
- unindent(line)
158
- end
159
- else
160
- terminate "Unrecognized preprocessor command ##{name.inspect}"
161
- end
80
+ name, args_string, cmd_indentation = recognize_command(line)
81
+ case name
82
+ when "if"
83
+ case context.last
84
+ when nil, :if_true, :else_true
85
+ check_indentation(cmd_indentation)
86
+ result = the_binding.eval(args_string, filename, @lineno)
87
+ context.push(result ? :if_true : :if_false)
88
+ inc_indentation
89
+ when :if_false, :else_false, :if_ignore
90
+ check_indentation(cmd_indentation)
91
+ inc_indentation
92
+ context.push(:if_ignore)
93
+ else
94
+ terminate "#if is not allowed in this context"
95
+ end
96
+ when "elif"
97
+ case context.last
98
+ when :if_true
99
+ dec_indentation
100
+ check_indentation(cmd_indentation)
101
+ inc_indentation
102
+ context[-1] = :if_false
103
+ when :if_false
104
+ dec_indentation
105
+ check_indentation(cmd_indentation)
106
+ inc_indentation
107
+ result = the_binding.eval(args_string, filename, @lineno)
108
+ context[-1] = result ? :if_true : :if_false
109
+ when :else_true, :else_false
110
+ terminate "#elif is not allowed after #else"
111
+ when :if_ignore
112
+ dec_indentation
113
+ check_indentation(cmd_indentation)
114
+ inc_indentation
115
+ else
116
+ terminate "#elif is not allowed outside #if block"
117
+ end
118
+ when "else"
119
+ case context.last
120
+ when :if_true
121
+ dec_indentation
122
+ check_indentation(cmd_indentation)
123
+ inc_indentation
124
+ context[-1] = :else_false
125
+ when :if_false
126
+ dec_indentation
127
+ check_indentation(cmd_indentation)
128
+ inc_indentation
129
+ context[-1] = :else_true
130
+ when :else_true, :else_false
131
+ terminate "it is not allowed to have multiple #else clauses in one #if block"
132
+ when :if_ignore
133
+ dec_indentation
134
+ check_indentation(cmd_indentation)
135
+ inc_indentation
136
+ else
137
+ terminate "#else is not allowed outside #if block"
138
+ end
139
+ when "endif"
140
+ case context.last
141
+ when :if_true, :if_false, :else_true, :else_false, :if_ignore
142
+ dec_indentation
143
+ check_indentation(cmd_indentation)
144
+ context.pop
145
+ else
146
+ terminate "#endif is not allowed outside #if block"
147
+ end
148
+ when "DEBHELPER"
149
+ output.puts(line)
150
+ when "", nil
151
+ # Either a comment or not a preprocessor command.
152
+ case context.last
153
+ when nil, :if_true, :else_true
154
+ output.puts(unindent(line))
155
+ else
156
+ # Check indentation but do not output.
157
+ unindent(line)
158
+ end
159
+ else
160
+ terminate "Unrecognized preprocessor command ##{name.inspect}"
161
+ end
162
162
 
163
- @lineno += 1
164
- end
165
- ensure
166
- if output_filename && output
167
- output.close
168
- stat = File.stat(filename)
169
- File.chmod(stat.mode, temp_output_filename)
170
- File.chown(stat.uid, stat.gid, temp_output_filename) rescue nil
171
- File.rename(temp_output_filename, output_filename)
172
- end
173
- end
163
+ @lineno += 1
164
+ end
165
+ ensure
166
+ if output_filename && output
167
+ output.close
168
+ stat = File.stat(filename)
169
+ File.chmod(stat.mode, temp_output_filename)
170
+ File.chown(stat.uid, stat.gid, temp_output_filename) rescue nil
171
+ File.rename(temp_output_filename, output_filename)
172
+ end
173
+ end
174
174
 
175
175
  private
176
- UBUNTU_DISTRIBUTIONS = {
177
- "lucid" => "10.04",
178
- "maverick" => "10.10",
179
- "natty" => "11.04",
180
- "oneiric" => "11.10",
181
- "precise" => "12.04",
182
- "quantal" => "12.10",
183
- "raring" => "13.04",
184
- "saucy" => "13.10",
185
- "trusty" => "14.04",
186
- "utopic" => "14.10",
187
- "vivid" => "15.05"
188
- }
189
- DEBIAN_DISTRIBUTIONS = {
190
- "squeeze" => "20110206",
191
- "wheezy" => "20130504",
192
- "jessie" => "20140000"
193
- }
194
- REDHAT_ENTERPRISE_DISTRIBUTIONS = {
195
- "el6" => "el6.0"
196
- }
197
- AMAZON_DISTRIBUTIONS = {
198
- "amazon" => "amazon"
199
- }
176
+ UBUNTU_DISTRIBUTIONS = {
177
+ "lucid" => "10.04",
178
+ "maverick" => "10.10",
179
+ "natty" => "11.04",
180
+ "oneiric" => "11.10",
181
+ "precise" => "12.04",
182
+ "quantal" => "12.10",
183
+ "raring" => "13.04",
184
+ "saucy" => "13.10",
185
+ "trusty" => "14.04",
186
+ "utopic" => "14.10",
187
+ "vivid" => "15.05"
188
+ }
189
+ DEBIAN_DISTRIBUTIONS = {
190
+ "squeeze" => "20110206",
191
+ "wheezy" => "20130504",
192
+ "jessie" => "20140000"
193
+ }
194
+ REDHAT_ENTERPRISE_DISTRIBUTIONS = {
195
+ "el6" => "el6.0"
196
+ }
197
+ AMAZON_DISTRIBUTIONS = {
198
+ "amazon" => "amazon"
199
+ }
200
200
 
201
- # Provides the DSL that's accessible within.
202
- class Evaluator
203
- def _infer_distro_table(name)
204
- if UBUNTU_DISTRIBUTIONS.has_key?(name)
205
- return UBUNTU_DISTRIBUTIONS
206
- elsif DEBIAN_DISTRIBUTIONS.has_key?(name)
207
- return DEBIAN_DISTRIBUTIONS
208
- elsif REDHAT_ENTERPRISE_DISTRIBUTIONS.has_key?(name)
209
- return REDHAT_ENTERPRISE_DISTRIBUTIONS
210
- elsif AMAZON_DISTRIBUTIONS.has_key?(name)
211
- return AMAZON_DISTRIBUTIONS
212
- end
213
- end
201
+ # Provides the DSL that's accessible within.
202
+ class Evaluator
203
+ def _infer_distro_table(name)
204
+ if UBUNTU_DISTRIBUTIONS.has_key?(name)
205
+ return UBUNTU_DISTRIBUTIONS
206
+ elsif DEBIAN_DISTRIBUTIONS.has_key?(name)
207
+ return DEBIAN_DISTRIBUTIONS
208
+ elsif REDHAT_ENTERPRISE_DISTRIBUTIONS.has_key?(name)
209
+ return REDHAT_ENTERPRISE_DISTRIBUTIONS
210
+ elsif AMAZON_DISTRIBUTIONS.has_key?(name)
211
+ return AMAZON_DISTRIBUTIONS
212
+ end
213
+ end
214
214
 
215
- def is_distribution?(expr)
216
- if @distribution.nil?
217
- raise "The :distribution variable must be set"
218
- else
219
- if expr =~ /^(>=|>|<=|<|==|\!=)[\s]*(.+)/
220
- comparator = $1
221
- name = $2
222
- else
223
- raise "Invalid expression #{expr.inspect}"
224
- end
215
+ def is_distribution?(expr)
216
+ if @distribution.nil?
217
+ raise "The :distribution variable must be set"
218
+ else
219
+ if expr =~ /^(>=|>|<=|<|==|\!=)[\s]*(.+)/
220
+ comparator = $1
221
+ name = $2
222
+ else
223
+ raise "Invalid expression #{expr.inspect}"
224
+ end
225
225
 
226
- table1 = _infer_distro_table(@distribution)
227
- table2 = _infer_distro_table(name)
228
- raise "Distribution name #{@distribution.inspect} not recognized" if !table1
229
- raise "Distribution name #{name.inspect} not recognized" if !table2
230
- return false if table1 != table2
231
- v1 = table1[@distribution]
232
- v2 = table2[name]
226
+ table1 = _infer_distro_table(@distribution)
227
+ table2 = _infer_distro_table(name)
228
+ raise "Distribution name #{@distribution.inspect} not recognized" if !table1
229
+ raise "Distribution name #{name.inspect} not recognized" if !table2
230
+ return false if table1 != table2
231
+ v1 = table1[@distribution]
232
+ v2 = table2[name]
233
233
 
234
- case comparator
235
- when ">"
236
- return v1 > v2
237
- when ">="
238
- return v1 >= v2
239
- when "<"
240
- return v1 < v2
241
- when "<="
242
- return v1 <= v2
243
- when "=="
244
- return v1 == v2
245
- when "!="
246
- return v1 != v2
247
- else
248
- raise "BUG"
249
- end
250
- end
251
- end
252
- end
234
+ case comparator
235
+ when ">"
236
+ return v1 > v2
237
+ when ">="
238
+ return v1 >= v2
239
+ when "<"
240
+ return v1 < v2
241
+ when "<="
242
+ return v1 <= v2
243
+ when "=="
244
+ return v1 == v2
245
+ when "!="
246
+ return v1 != v2
247
+ else
248
+ raise "BUG"
249
+ end
250
+ end
251
+ end
252
+ end
253
253
 
254
- def each_line(filename, the_binding)
255
- data = File.open(filename, 'r') do |f|
256
- erb = ERB.new(f.read, nil, "-")
257
- erb.filename = filename
258
- erb.result(the_binding)
259
- end
260
- data.each_line do |line|
261
- yield line.chomp
262
- end
263
- end
254
+ def each_line(filename, the_binding)
255
+ data = File.open(filename, 'r') do |f|
256
+ erb = ERB.new(f.read, nil, "-")
257
+ erb.filename = filename
258
+ erb.result(the_binding)
259
+ end
260
+ data.each_line do |line|
261
+ yield line.chomp
262
+ end
263
+ end
264
264
 
265
- def recognize_command(line)
266
- if line =~ /^([\s\t]*)#(.+)/
267
- indentation_str = $1
268
- command = $2
265
+ def recognize_command(line)
266
+ if line =~ /^([\s\t]*)#(.+)/
267
+ indentation_str = $1
268
+ command = $2
269
269
 
270
- # Declare tabs as equivalent to 4 spaces. This is necessary for
271
- # Makefiles in which the use of tabs is required.
272
- indentation_str.gsub!("\t", " ")
270
+ # Declare tabs as equivalent to 4 spaces. This is necessary for
271
+ # Makefiles in which the use of tabs is required.
272
+ indentation_str.gsub!("\t", " ")
273
273
 
274
- name = command.scan(/^\w+/).first
275
- # Ignore shebangs and comments.
276
- return if name.nil?
274
+ name = command.scan(/^\w+/).first
275
+ # Ignore shebangs and comments.
276
+ return if name.nil?
277
277
 
278
- args_string = command.sub(/^#{Regexp.escape(name)}[\s\t]*/, '')
279
- return [name, args_string, indentation_str.to_s.size]
280
- else
281
- return nil
282
- end
283
- end
278
+ args_string = command.sub(/^#{Regexp.escape(name)}[\s\t]*/, '')
279
+ return [name, args_string, indentation_str.to_s.size]
280
+ else
281
+ return nil
282
+ end
283
+ end
284
284
 
285
- def create_binding(variables)
286
- object = Evaluator.new
287
- variables.each_pair do |key, val|
288
- object.send(:instance_variable_set, "@#{key}", val)
289
- end
290
- return object.instance_eval do
291
- binding
292
- end
293
- end
285
+ def create_binding(variables)
286
+ object = Evaluator.new
287
+ variables.each_pair do |key, val|
288
+ object.send(:instance_variable_set, "@#{key}", val)
289
+ end
290
+ return object.instance_eval do
291
+ binding
292
+ end
293
+ end
294
294
 
295
- def inc_indentation
296
- @indentation += @indentation_size
297
- end
295
+ def inc_indentation
296
+ @indentation += @indentation_size
297
+ end
298
298
 
299
- def dec_indentation
300
- @indentation -= @indentation_size
301
- end
299
+ def dec_indentation
300
+ @indentation -= @indentation_size
301
+ end
302
302
 
303
- def check_indentation(expected)
304
- if expected != @indentation
305
- terminate "wrong indentation: found #{expected} characters, should be #{@indentation}"
306
- end
307
- end
303
+ def check_indentation(expected)
304
+ if expected != @indentation
305
+ terminate "wrong indentation: found #{expected} characters, should be #{@indentation}"
306
+ end
307
+ end
308
308
 
309
- def unindent(line)
310
- line =~ /^([\s\t]*)/
311
- # Declare tabs as equivalent to 4 spaces. This is necessary for
312
- # Makefiles in which the use of tabs is required.
313
- found = $1.to_s.gsub("\t", " ").size
309
+ def unindent(line)
310
+ line =~ /^([\s\t]*)/
311
+ # Declare tabs as equivalent to 4 spaces. This is necessary for
312
+ # Makefiles in which the use of tabs is required.
313
+ found = $1.to_s.gsub("\t", " ").size
314
314
 
315
- if found >= @indentation
316
- # Tab-friendly way to remove indentation.
317
- remaining = @indentation
318
- line = line.dup
319
- while remaining > 0
320
- if line[0..0] == " "
321
- remaining -= 1
322
- else
323
- # This is a tab.
324
- remaining -= 4
325
- end
326
- line.slice!(0, 1)
327
- end
328
- return line
329
- else
330
- terminate "wrong indentation: found #{found} characters, should be at least #{@indentation}"
331
- end
332
- end
315
+ if found >= @indentation
316
+ # Tab-friendly way to remove indentation.
317
+ remaining = @indentation
318
+ line = line.dup
319
+ while remaining > 0
320
+ if line[0..0] == " "
321
+ remaining -= 1
322
+ else
323
+ # This is a tab.
324
+ remaining -= 4
325
+ end
326
+ line.slice!(0, 1)
327
+ end
328
+ return line
329
+ else
330
+ terminate "wrong indentation: found #{found} characters, should be at least #{@indentation}"
331
+ end
332
+ end
333
333
 
334
- def debug(message)
335
- puts "DEBUG:#{@lineno}: #{message}" if @debug
336
- end
334
+ def debug(message)
335
+ puts "DEBUG:#{@lineno}: #{message}" if @debug
336
+ end
337
337
 
338
- def terminate(message)
339
- abort "*** ERROR: #{@filename} line #{@lineno}: #{message}"
340
- end
338
+ def terminate(message)
339
+ abort "*** ERROR: #{@filename} line #{@lineno}: #{message}"
340
+ end
341
341
  end