runa-chef 0.8.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (216) hide show
  1. data/LICENSE +201 -0
  2. data/README.rdoc +136 -0
  3. data/bin/chef-client +26 -0
  4. data/bin/chef-solo +26 -0
  5. data/bin/knife +27 -0
  6. data/bin/shef +45 -0
  7. data/distro/README +2 -0
  8. data/distro/common/man/man1/chef-indexer.1 +42 -0
  9. data/distro/common/man/man1/chef-server.1 +108 -0
  10. data/distro/common/man/man8/chef-client.8 +61 -0
  11. data/distro/common/man/man8/chef-solo.8 +58 -0
  12. data/distro/common/man/man8/knife.8 +359 -0
  13. data/distro/debian/etc/init.d/chef-client +175 -0
  14. data/distro/debian/etc/init.d/chef-indexer +175 -0
  15. data/distro/debian/etc/init.d/chef-server +120 -0
  16. data/distro/redhat/etc/init.d/chef-client +78 -0
  17. data/distro/redhat/etc/init.d/chef-indexer +76 -0
  18. data/distro/redhat/etc/init.d/chef-server +78 -0
  19. data/distro/redhat/etc/sysconfig/chef-client +10 -0
  20. data/distro/redhat/etc/sysconfig/chef-indexer +8 -0
  21. data/distro/redhat/etc/sysconfig/chef-server +10 -0
  22. data/distro/suse/etc/init.d/chef-client +121 -0
  23. data/lib/chef.rb +49 -0
  24. data/lib/chef/api_client.rb +269 -0
  25. data/lib/chef/application.rb +98 -0
  26. data/lib/chef/application/agent.rb +18 -0
  27. data/lib/chef/application/client.rb +214 -0
  28. data/lib/chef/application/knife.rb +138 -0
  29. data/lib/chef/application/server.rb +19 -0
  30. data/lib/chef/application/solo.rb +214 -0
  31. data/lib/chef/cache.rb +61 -0
  32. data/lib/chef/cache/checksum.rb +70 -0
  33. data/lib/chef/certificate.rb +154 -0
  34. data/lib/chef/client.rb +323 -0
  35. data/lib/chef/compile.rb +158 -0
  36. data/lib/chef/config.rb +195 -0
  37. data/lib/chef/cookbook.rb +198 -0
  38. data/lib/chef/cookbook/metadata.rb +487 -0
  39. data/lib/chef/cookbook/metadata/version.rb +87 -0
  40. data/lib/chef/cookbook_loader.rb +180 -0
  41. data/lib/chef/couchdb.rb +273 -0
  42. data/lib/chef/daemon.rb +170 -0
  43. data/lib/chef/data_bag.rb +216 -0
  44. data/lib/chef/data_bag_item.rb +227 -0
  45. data/lib/chef/exceptions.rb +39 -0
  46. data/lib/chef/file_cache.rb +205 -0
  47. data/lib/chef/knife.rb +300 -0
  48. data/lib/chef/knife/client_bulk_delete.rb +41 -0
  49. data/lib/chef/knife/client_create.rb +55 -0
  50. data/lib/chef/knife/client_delete.rb +37 -0
  51. data/lib/chef/knife/client_edit.rb +37 -0
  52. data/lib/chef/knife/client_list.rb +40 -0
  53. data/lib/chef/knife/client_reregister.rb +48 -0
  54. data/lib/chef/knife/client_show.rb +42 -0
  55. data/lib/chef/knife/configure.rb +84 -0
  56. data/lib/chef/knife/cookbook_bulk_delete.rb +47 -0
  57. data/lib/chef/knife/cookbook_delete.rb +41 -0
  58. data/lib/chef/knife/cookbook_download.rb +57 -0
  59. data/lib/chef/knife/cookbook_list.rb +41 -0
  60. data/lib/chef/knife/cookbook_metadata.rb +87 -0
  61. data/lib/chef/knife/cookbook_show.rb +75 -0
  62. data/lib/chef/knife/cookbook_upload.rb +173 -0
  63. data/lib/chef/knife/data_bag_create.rb +43 -0
  64. data/lib/chef/knife/data_bag_delete.rb +43 -0
  65. data/lib/chef/knife/data_bag_edit.rb +49 -0
  66. data/lib/chef/knife/data_bag_list.rb +42 -0
  67. data/lib/chef/knife/data_bag_show.rb +40 -0
  68. data/lib/chef/knife/ec2_instance_data.rb +46 -0
  69. data/lib/chef/knife/node_bulk_delete.rb +44 -0
  70. data/lib/chef/knife/node_create.rb +39 -0
  71. data/lib/chef/knife/node_delete.rb +36 -0
  72. data/lib/chef/knife/node_edit.rb +36 -0
  73. data/lib/chef/knife/node_from_file.rb +42 -0
  74. data/lib/chef/knife/node_list.rb +41 -0
  75. data/lib/chef/knife/node_run_list_add.rb +64 -0
  76. data/lib/chef/knife/node_run_list_remove.rb +45 -0
  77. data/lib/chef/knife/node_show.rb +46 -0
  78. data/lib/chef/knife/role_bulk_delete.rb +45 -0
  79. data/lib/chef/knife/role_create.rb +44 -0
  80. data/lib/chef/knife/role_delete.rb +36 -0
  81. data/lib/chef/knife/role_edit.rb +37 -0
  82. data/lib/chef/knife/role_from_file.rb +46 -0
  83. data/lib/chef/knife/role_list.rb +40 -0
  84. data/lib/chef/knife/role_show.rb +43 -0
  85. data/lib/chef/knife/search.rb +94 -0
  86. data/lib/chef/log.rb +39 -0
  87. data/lib/chef/mixin/check_helper.rb +31 -0
  88. data/lib/chef/mixin/checksum.rb +32 -0
  89. data/lib/chef/mixin/command.rb +390 -0
  90. data/lib/chef/mixin/convert_to_class_name.rb +57 -0
  91. data/lib/chef/mixin/create_path.rb +56 -0
  92. data/lib/chef/mixin/deep_merge.rb +33 -0
  93. data/lib/chef/mixin/find_preferred_file.rb +92 -0
  94. data/lib/chef/mixin/from_file.rb +50 -0
  95. data/lib/chef/mixin/generate_url.rb +58 -0
  96. data/lib/chef/mixin/language.rb +107 -0
  97. data/lib/chef/mixin/language_include_attribute.rb +56 -0
  98. data/lib/chef/mixin/language_include_recipe.rb +53 -0
  99. data/lib/chef/mixin/params_validate.rb +197 -0
  100. data/lib/chef/mixin/recipe_definition_dsl_core.rb +79 -0
  101. data/lib/chef/mixin/template.rb +94 -0
  102. data/lib/chef/nanite.rb +100 -0
  103. data/lib/chef/node.rb +463 -0
  104. data/lib/chef/node/attribute.rb +412 -0
  105. data/lib/chef/openid_registration.rb +181 -0
  106. data/lib/chef/platform.rb +268 -0
  107. data/lib/chef/provider.rb +101 -0
  108. data/lib/chef/provider/breakpoint.rb +36 -0
  109. data/lib/chef/provider/cron.rb +184 -0
  110. data/lib/chef/provider/deploy.rb +314 -0
  111. data/lib/chef/provider/deploy/revision.rb +70 -0
  112. data/lib/chef/provider/deploy/timestamped.rb +33 -0
  113. data/lib/chef/provider/directory.rb +72 -0
  114. data/lib/chef/provider/erl_call.rb +72 -0
  115. data/lib/chef/provider/execute.rb +58 -0
  116. data/lib/chef/provider/file.rb +195 -0
  117. data/lib/chef/provider/git.rb +203 -0
  118. data/lib/chef/provider/group.rb +120 -0
  119. data/lib/chef/provider/group/dscl.rb +128 -0
  120. data/lib/chef/provider/group/gpasswd.rb +50 -0
  121. data/lib/chef/provider/group/groupadd.rb +78 -0
  122. data/lib/chef/provider/group/pw.rb +88 -0
  123. data/lib/chef/provider/group/usermod.rb +57 -0
  124. data/lib/chef/provider/http_request.rb +106 -0
  125. data/lib/chef/provider/ifconfig.rb +131 -0
  126. data/lib/chef/provider/link.rb +157 -0
  127. data/lib/chef/provider/mdadm.rb +88 -0
  128. data/lib/chef/provider/mount.rb +117 -0
  129. data/lib/chef/provider/mount/mount.rb +208 -0
  130. data/lib/chef/provider/package.rb +160 -0
  131. data/lib/chef/provider/package/apt.rb +110 -0
  132. data/lib/chef/provider/package/dpkg.rb +109 -0
  133. data/lib/chef/provider/package/easy_install.rb +106 -0
  134. data/lib/chef/provider/package/freebsd.rb +153 -0
  135. data/lib/chef/provider/package/macports.rb +105 -0
  136. data/lib/chef/provider/package/portage.rb +124 -0
  137. data/lib/chef/provider/package/rpm.rb +99 -0
  138. data/lib/chef/provider/package/rubygems.rb +136 -0
  139. data/lib/chef/provider/package/yum-dump.py +125 -0
  140. data/lib/chef/provider/package/yum.rb +175 -0
  141. data/lib/chef/provider/package/zypper.rb +132 -0
  142. data/lib/chef/provider/remote_directory.rb +126 -0
  143. data/lib/chef/provider/remote_file.rb +141 -0
  144. data/lib/chef/provider/route.rb +118 -0
  145. data/lib/chef/provider/ruby_block.rb +33 -0
  146. data/lib/chef/provider/script.rb +42 -0
  147. data/lib/chef/provider/service.rb +135 -0
  148. data/lib/chef/provider/service/debian.rb +64 -0
  149. data/lib/chef/provider/service/freebsd.rb +156 -0
  150. data/lib/chef/provider/service/gentoo.rb +54 -0
  151. data/lib/chef/provider/service/init.rb +71 -0
  152. data/lib/chef/provider/service/redhat.rb +62 -0
  153. data/lib/chef/provider/service/simple.rb +114 -0
  154. data/lib/chef/provider/subversion.rb +156 -0
  155. data/lib/chef/provider/template.rb +175 -0
  156. data/lib/chef/provider/user.rb +170 -0
  157. data/lib/chef/provider/user/dscl.rb +280 -0
  158. data/lib/chef/provider/user/pw.rb +113 -0
  159. data/lib/chef/provider/user/useradd.rb +108 -0
  160. data/lib/chef/recipe.rb +105 -0
  161. data/lib/chef/resource.rb +380 -0
  162. data/lib/chef/resource/apt_package.rb +34 -0
  163. data/lib/chef/resource/bash.rb +33 -0
  164. data/lib/chef/resource/breakpoint.rb +35 -0
  165. data/lib/chef/resource/cron.rb +179 -0
  166. data/lib/chef/resource/csh.rb +33 -0
  167. data/lib/chef/resource/deploy.rb +359 -0
  168. data/lib/chef/resource/deploy_revision.rb +35 -0
  169. data/lib/chef/resource/directory.rb +76 -0
  170. data/lib/chef/resource/dpkg_package.rb +34 -0
  171. data/lib/chef/resource/easy_install_package.rb +41 -0
  172. data/lib/chef/resource/erl_call.rb +83 -0
  173. data/lib/chef/resource/execute.rb +127 -0
  174. data/lib/chef/resource/file.rb +84 -0
  175. data/lib/chef/resource/gem_package.rb +41 -0
  176. data/lib/chef/resource/git.rb +36 -0
  177. data/lib/chef/resource/group.rb +70 -0
  178. data/lib/chef/resource/http_request.rb +52 -0
  179. data/lib/chef/resource/ifconfig.rb +134 -0
  180. data/lib/chef/resource/link.rb +78 -0
  181. data/lib/chef/resource/macports_package.rb +29 -0
  182. data/lib/chef/resource/mdadm.rb +82 -0
  183. data/lib/chef/resource/mount.rb +135 -0
  184. data/lib/chef/resource/package.rb +80 -0
  185. data/lib/chef/resource/perl.rb +33 -0
  186. data/lib/chef/resource/portage_package.rb +33 -0
  187. data/lib/chef/resource/python.rb +33 -0
  188. data/lib/chef/resource/remote_directory.rb +91 -0
  189. data/lib/chef/resource/remote_file.rb +60 -0
  190. data/lib/chef/resource/route.rb +135 -0
  191. data/lib/chef/resource/ruby.rb +33 -0
  192. data/lib/chef/resource/ruby_block.rb +39 -0
  193. data/lib/chef/resource/scm.rb +137 -0
  194. data/lib/chef/resource/script.rb +51 -0
  195. data/lib/chef/resource/service.rb +134 -0
  196. data/lib/chef/resource/subversion.rb +34 -0
  197. data/lib/chef/resource/template.rb +60 -0
  198. data/lib/chef/resource/timestamped_deploy.rb +31 -0
  199. data/lib/chef/resource/user.rb +101 -0
  200. data/lib/chef/resource_collection.rb +212 -0
  201. data/lib/chef/resource_collection/stepable_iterator.rb +124 -0
  202. data/lib/chef/resource_definition.rb +67 -0
  203. data/lib/chef/rest.rb +298 -0
  204. data/lib/chef/role.rb +301 -0
  205. data/lib/chef/run_list.rb +164 -0
  206. data/lib/chef/runner.rb +130 -0
  207. data/lib/chef/search/query.rb +71 -0
  208. data/lib/chef/shef.rb +220 -0
  209. data/lib/chef/shef/ext.rb +297 -0
  210. data/lib/chef/shef/shef_session.rb +175 -0
  211. data/lib/chef/streaming_cookbook_uploader.rb +185 -0
  212. data/lib/chef/tasks/chef_repo.rake +245 -0
  213. data/lib/chef/util/file_edit.rb +125 -0
  214. data/lib/chef/util/fileedit.rb +121 -0
  215. data/lib/chef/webui_user.rb +231 -0
  216. metadata +398 -0
@@ -0,0 +1,56 @@
1
+ #
2
+ # Author:: Adam Jacob (<adam@opscode.com>)
3
+ # Copyright:: Copyright (c) 2008, 2009 Opscode, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ require 'chef/log'
20
+
21
+ class Chef
22
+ module Mixin
23
+ module LanguageIncludeAttribute
24
+
25
+ def include_attribute(*args)
26
+ if self.kind_of?(Chef::Node)
27
+ node = self
28
+ else
29
+ node = @node
30
+ end
31
+
32
+ args.flatten.each do |attrib|
33
+ if node.run_state[:seen_attributes].has_key?(attrib)
34
+ Chef::Log.debug("I am not loading attribute file #{attrib}, because I have already seen it.")
35
+ next
36
+ end
37
+
38
+ Chef::Log.debug("Loading Attribute #{attrib}")
39
+ node.run_state[:seen_attributes][attrib] = true
40
+
41
+ if amatch = attrib.match(/(.+?)::(.+)/)
42
+ cookbook = @cookbook_loader[amatch[1].to_sym]
43
+ cookbook.load_attribute(amatch[2], node)
44
+ else
45
+ cookbook = @cookbook_loader[amatch[1].to_sym]
46
+ cookbook.load_attribute("default", node)
47
+ end
48
+ end
49
+ true
50
+ end
51
+
52
+ end
53
+ end
54
+ end
55
+
56
+
@@ -0,0 +1,53 @@
1
+ #
2
+ # Author:: Adam Jacob (<adam@opscode.com>)
3
+ # Copyright:: Copyright (c) 2008, 2009 Opscode, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ require 'chef/log'
20
+
21
+ class Chef
22
+ module Mixin
23
+ module LanguageIncludeRecipe
24
+
25
+ def include_recipe(*args)
26
+ args.flatten.each do |recipe|
27
+ if @node.run_state[:seen_recipes].has_key?(recipe)
28
+ Chef::Log.debug("I am not loading #{recipe}, because I have already seen it.")
29
+ next
30
+ end
31
+
32
+ Chef::Log.debug("Loading Recipe #{recipe} via include_recipe")
33
+ @node.run_state[:seen_recipes][recipe] = true
34
+
35
+ rmatch = recipe.match(/(.+?)::(.+)/)
36
+ if rmatch
37
+ cookbook = @cookbook_loader[rmatch[1]]
38
+ cookbook.load_recipe(rmatch[2], @node, @collection, @definitions, @cookbook_loader)
39
+ else
40
+ cookbook = @cookbook_loader[recipe]
41
+ cookbook.load_recipe("default", @node, @collection, @definitions, @cookbook_loader)
42
+ end
43
+ end
44
+ end
45
+
46
+ def require_recipe(*args)
47
+ include_recipe(*args)
48
+ end
49
+
50
+ end
51
+ end
52
+ end
53
+
@@ -0,0 +1,197 @@
1
+ #
2
+ # Author:: Adam Jacob (<adam@opscode.com>)
3
+ # Copyright:: Copyright (c) 2008 Opscode, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+
18
+ class Chef
19
+ module Mixin
20
+ module ParamsValidate
21
+
22
+ # Takes a hash of options, along with a map to validate them. Returns the original
23
+ # options hash, plus any changes that might have been made (through things like setting
24
+ # default values in the validation map)
25
+ #
26
+ # For example:
27
+ #
28
+ # validate({ :one => "neat" }, { :one => { :kind_of => String }})
29
+ #
30
+ # Would raise an exception if the value of :one above is not a kind_of? string. Valid
31
+ # map options are:
32
+ #
33
+ # :default:: Sets the default value for this parameter.
34
+ # :callbacks:: Takes a hash of Procs, which should return true if the argument is valid.
35
+ # The key will be inserted into the error message if the Proc does not return true:
36
+ # "Option #{key}'s value #{value} #{message}!"
37
+ # :kind_of:: Ensure that the value is a kind_of?(Whatever). If passed an array, it will ensure
38
+ # that the value is one of those types.
39
+ # :respond_to:: Ensure that the value has a given method. Takes one method name or an array of
40
+ # method names.
41
+ # :required:: Raise an exception if this parameter is missing. Valid values are true or false,
42
+ # by default, options are not required.
43
+ # :regex:: Match the value of the paramater against a regular expression.
44
+ # :equal_to:: Match the value of the paramater with ==. An array means it can be equal to any
45
+ # of the values.
46
+ def validate(opts, map)
47
+ #--
48
+ # validate works by taking the keys in the validation map, assuming it's a hash, and
49
+ # looking for _pv_:symbol as methods. Assuming it find them, it calls the right
50
+ # one.
51
+ #++
52
+ raise ArgumentError, "Options must be a hash" unless opts.kind_of?(Hash)
53
+ raise ArgumentError, "Validation Map must be a hash" unless map.kind_of?(Hash)
54
+
55
+ map.each do |key, validation|
56
+ unless key.kind_of?(Symbol) || key.kind_of?(String)
57
+ raise ArgumentError, "Validation map keys must be symbols or strings!"
58
+ end
59
+ case validation
60
+ when true
61
+ _pv_required(opts, key)
62
+ when false
63
+ true
64
+ when Hash
65
+ validation.each do |check, carg|
66
+ check_method = "_pv_#{check.to_s}"
67
+ if self.respond_to?(check_method, true)
68
+ self.send(check_method, opts, key, carg)
69
+ else
70
+ raise ArgumentError, "Validation map has unknown check: #{check}"
71
+ end
72
+ end
73
+ end
74
+ end
75
+ opts
76
+ end
77
+
78
+ def set_or_return(symbol, arg, validation)
79
+ iv_symbol = "@#{symbol.to_s}".to_sym
80
+ map = {
81
+ symbol => validation
82
+ }
83
+ if arg == nil
84
+ self.instance_variable_get(iv_symbol)
85
+ else
86
+ validate({ symbol => arg }, { symbol => validation })
87
+ self.instance_variable_set(iv_symbol, arg)
88
+ end
89
+ end
90
+
91
+ private
92
+
93
+ # Return the value of a parameter, or nil if it doesn't exist.
94
+ def _pv_opts_lookup(opts, key)
95
+ if opts.has_key?(key.to_s)
96
+ opts[key.to_s]
97
+ elsif opts.has_key?(key.to_sym)
98
+ opts[key.to_sym]
99
+ else
100
+ nil
101
+ end
102
+ end
103
+
104
+ # Raise an exception if the parameter is not found.
105
+ def _pv_required(opts, key, is_required=true)
106
+ if is_required
107
+ if opts.has_key?(key.to_s) || opts.has_key?(key.to_sym)
108
+ true
109
+ else
110
+ raise ArgumentError, "Required argument #{key} is missing!"
111
+ end
112
+ end
113
+ end
114
+
115
+ def _pv_equal_to(opts, key, to_be)
116
+ value = _pv_opts_lookup(opts, key)
117
+ if value != nil
118
+ passes = false
119
+ [ to_be ].flatten.each do |tb|
120
+ if value == tb
121
+ passes = true
122
+ end
123
+ end
124
+ unless passes
125
+ raise ArgumentError, "Option #{key} must be equal to one of: #{to_be.join(", ")}! You passed #{value.inspect}."
126
+ end
127
+ end
128
+ end
129
+
130
+ # Raise an exception if the parameter is not a kind_of?(to_be)
131
+ def _pv_kind_of(opts, key, to_be)
132
+ value = _pv_opts_lookup(opts, key)
133
+ if value != nil
134
+ passes = false
135
+ [ to_be ].flatten.each do |tb|
136
+ if value.kind_of?(tb)
137
+ passes = true
138
+ end
139
+ end
140
+ unless passes
141
+ raise ArgumentError, "Option #{key} must be a kind of #{to_be}! You passed #{value.inspect}."
142
+ end
143
+ end
144
+ end
145
+
146
+ # Raise an exception if the parameter does not respond to a given set of methods.
147
+ def _pv_respond_to(opts, key, method_name_list)
148
+ value = _pv_opts_lookup(opts, key)
149
+ if value != nil
150
+ [ method_name_list ].flatten.each do |method_name|
151
+ unless value.respond_to?(method_name)
152
+ raise ArgumentError, "Option #{key} must have a #{method_name} method!"
153
+ end
154
+ end
155
+ end
156
+ end
157
+
158
+ # Assign a default value to a parameter.
159
+ def _pv_default(opts, key, default_value)
160
+ value = _pv_opts_lookup(opts, key)
161
+ if value == nil
162
+ opts[key] = default_value
163
+ end
164
+ end
165
+
166
+ # Check a parameter against a regular expression.
167
+ def _pv_regex(opts, key, regex)
168
+ value = _pv_opts_lookup(opts, key)
169
+ passes = false
170
+ [ regex ].flatten.each do |r|
171
+ if value != nil
172
+ if r.match(value.to_s)
173
+ passes = true
174
+ end
175
+ end
176
+ end
177
+ unless passes
178
+ raise ArgumentError, "Option #{key}'s value #{value} does not match regular expression #{regex.to_s}"
179
+ end
180
+ end
181
+
182
+ # Check a parameter against a hash of proc's.
183
+ def _pv_callbacks(opts, key, callbacks)
184
+ raise ArgumentError, "Callback list must be a hash!" unless callbacks.kind_of?(Hash)
185
+ value = _pv_opts_lookup(opts, key)
186
+ if value != nil
187
+ callbacks.each do |message, zeproc|
188
+ if zeproc.call(value) != true
189
+ raise ArgumentError, "Option #{key}'s value #{value} #{message}!"
190
+ end
191
+ end
192
+ end
193
+ end
194
+ end
195
+ end
196
+ end
197
+
@@ -0,0 +1,79 @@
1
+ #
2
+ # Author:: Adam Jacob (<adam@opscode.com>)
3
+ # Author:: Christopher Walters (<cw@opscode.com>)
4
+ # Copyright:: Copyright (c) 2008, 2009 Opscode, Inc.
5
+ # License:: Apache License, Version 2.0
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+
20
+ require 'chef/recipe'
21
+ require 'chef/resource'
22
+ require 'chef/mixin/convert_to_class_name'
23
+ require 'chef/mixin/language'
24
+
25
+ class Chef
26
+ module Mixin
27
+ module RecipeDefinitionDSLCore
28
+
29
+ include Chef::Mixin::ConvertToClassName
30
+ include Chef::Mixin::Language
31
+
32
+ def method_missing(method_symbol, *args, &block)
33
+ # If we have a definition that matches, we want to use that instead. This should
34
+ # let you do some really crazy over-riding of "native" types, if you really want
35
+ # to.
36
+ if @definitions.has_key?(method_symbol)
37
+ # This dupes the high level object, but we still need to dup the params
38
+ new_def = @definitions[method_symbol].dup
39
+ new_def.params = new_def.params.dup
40
+ new_def.node = @node
41
+ # This sets up the parameter overrides
42
+ new_def.instance_eval(&block) if block
43
+ new_recipe = Chef::Recipe.new(@cookbook_name, @recipe_name, @node, @collection, @definitions, @cookbook_loader)
44
+ new_recipe.params = new_def.params
45
+ new_recipe.params[:name] = args[0]
46
+ new_recipe.instance_eval(&new_def.recipe)
47
+ else
48
+ # Otherwise, we're rocking the regular resource call route.
49
+ method_name = method_symbol.to_s
50
+ rname = convert_to_class_name(method_name)
51
+
52
+ # If we have a resource like this one, we want to steal its state
53
+ resource = begin
54
+ args << @collection
55
+ args << @node
56
+ Chef::Resource.const_get(rname).new(*args)
57
+ rescue NameError => e
58
+ if e.to_s =~ /Chef::Resource/
59
+ raise NameError, "Cannot find #{rname} for #{method_name}\nOriginal exception: #{e.class}: #{e.message}"
60
+ else
61
+ raise e
62
+ end
63
+ end
64
+ resource.load_prior_resource
65
+ resource.cookbook_name = @cookbook_name
66
+ resource.recipe_name = @recipe_name
67
+ resource.params = @params
68
+ # Determine whether this resource is being created in the context of an enclosing Provider
69
+ resource.enclosing_provider = self.is_a?(Chef::Provider) ? self : nil
70
+ resource.instance_eval(&block) if block
71
+
72
+ @collection.insert(resource)
73
+ resource
74
+ end
75
+ end
76
+
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,94 @@
1
+ #
2
+ # Author:: Adam Jacob (<adam@opscode.com>)
3
+ # Copyright:: Copyright (c) 2008 Opscode, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ require 'tempfile'
20
+ require 'erubis'
21
+
22
+ class Chef
23
+ module Mixin
24
+ module Template
25
+
26
+ module ChefContext
27
+ def node
28
+ return @node if @node
29
+ raise "Could not find a value for node. If you are explicitly setting variables in a template, " +
30
+ "include a node variable if you plan to use it."
31
+ end
32
+ end
33
+
34
+ ::Erubis::Context.send(:include, ChefContext)
35
+
36
+ # Render a template with Erubis. Takes a template as a string, and a
37
+ # context hash.
38
+ def render_template(template, context)
39
+ begin
40
+ eruby = Erubis::Eruby.new(template)
41
+ output = eruby.evaluate(context)
42
+ rescue Object => e
43
+ raise TemplateError.new(e, template, context)
44
+ end
45
+ final_tempfile = Tempfile.new("chef-rendered-template")
46
+ final_tempfile.print(output)
47
+ final_tempfile.close
48
+ final_tempfile
49
+ end
50
+
51
+ class TemplateError < RuntimeError
52
+ attr_reader :original_exception, :context
53
+ SOURCE_CONTEXT_WINDOW = 2 unless defined? SOURCE_CONTEXT_WINDOW
54
+
55
+ def initialize(original_exception, template, context)
56
+ @original_exception, @template, @context = original_exception, template, context
57
+ end
58
+
59
+ def message
60
+ @original_exception.message
61
+ end
62
+
63
+ def line_number
64
+ @line_number ||= $1.to_i if original_exception.backtrace.find {|line| line =~ /\(erubis\):(\d+)/ }
65
+ end
66
+
67
+ def source_location
68
+ "on line ##{line_number}"
69
+ end
70
+
71
+ def source_listing
72
+ @source_listing ||= begin
73
+ line_index = line_number - 1
74
+ beginning_line = line_index <= SOURCE_CONTEXT_WINDOW ? 0 : line_index - SOURCE_CONTEXT_WINDOW
75
+ source_size = SOURCE_CONTEXT_WINDOW * 2 + 1
76
+ lines = @template.split(/\n/)
77
+ contextual_lines = lines[beginning_line, source_size]
78
+ output = []
79
+ contextual_lines.each_with_index do |line, index|
80
+ line_number = (index+beginning_line+1).to_s.rjust(3)
81
+ output << "#{line_number}: #{line}"
82
+ end
83
+ output.join("\n")
84
+ end
85
+ end
86
+
87
+ def to_s
88
+ "\n\n#{self.class} (#{message}) #{source_location}:\n\n" +
89
+ "#{source_listing}\n\n #{original_exception.backtrace.join("\n ")}\n\n"
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end