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,57 @@
1
+ #
2
+ # Author:: Adam Jacob (<adam@opscode.com>)
3
+ # Copyright:: Copyright (c) 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/knife'
20
+
21
+ class Chef
22
+ class Knife
23
+ class CookbookDownload < Knife
24
+
25
+ banner "Sub-Command: cookbook download COOKBOOK (options)"
26
+
27
+ option :file,
28
+ :short => "-f FILE",
29
+ :long => "--file FILE",
30
+ :description => "The filename to write to"
31
+
32
+ def run
33
+ cookbook = rest.get_rest("cookbooks/#{@name_args[0]}")
34
+ version = cookbook["metadata"]["version"]
35
+ Chef::Log.info("Downloading #{@name_args[0]} cookbook version #{version}")
36
+ rest.sign_on_redirect = false
37
+ tf = rest.get_rest("cookbooks/#{@name_args[0]}/_content", true)
38
+ rest.sign_on_redirect = true
39
+ unless config[:file]
40
+ if version
41
+ config[:file] = File.join(Dir.pwd, "#{@name_args[0]}-#{version}.tar.gz")
42
+ else
43
+ config[:file] = File.join(Dir.pwd, "#{@name_args[0]}.tar.gz")
44
+ end
45
+ end
46
+ FileUtils.cp(tf.path, config[:file])
47
+ Chef::Log.info("Cookbook saved: #{config[:file]}")
48
+ end
49
+
50
+ end
51
+ end
52
+ end
53
+
54
+
55
+
56
+
57
+
@@ -0,0 +1,41 @@
1
+ #
2
+ # Author:: Adam Jacob (<adam@opscode.com>)
3
+ # Copyright:: Copyright (c) 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/knife'
20
+ require 'json'
21
+
22
+ class Chef
23
+ class Knife
24
+ class CookbookList < Knife
25
+
26
+ banner "Sub-Command: cookbook list (options)"
27
+
28
+ option :with_uri,
29
+ :short => "-w",
30
+ :long => "--with-uri",
31
+ :description => "Show corresponding URIs"
32
+
33
+ def run
34
+ json_pretty_print(format_list_for_display(rest.get_rest('cookbooks')))
35
+ end
36
+ end
37
+ end
38
+ end
39
+
40
+
41
+
@@ -0,0 +1,87 @@
1
+ #
2
+ #
3
+ # Author:: Adam Jacob (<adam@opscode.com>)
4
+ # Copyright:: Copyright (c) 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/knife'
21
+
22
+ class Chef
23
+ class Knife
24
+ class CookbookMetadata < Knife
25
+
26
+ banner "Sub-Command: cookbook metadata COOKBOOK (options)"
27
+
28
+ option :cookbook_path,
29
+ :short => "-o PATH:PATH",
30
+ :long => "--cookbook-path PATH:PATH",
31
+ :description => "A colon-separated path to look for cookbooks in",
32
+ :proc => lambda { |o| o.split(":") }
33
+
34
+ option :all,
35
+ :short => "-a",
36
+ :long => "--all",
37
+ :description => "Generate metadata for all cookbooks, rather than just a single cookbook"
38
+
39
+ def run
40
+ if config[:cookbook_path]
41
+ Chef::Config[:cookbook_path] = config[:cookbook_path]
42
+ else
43
+ config[:cookbook_path] = Chef::Config[:cookbook_path]
44
+ end
45
+
46
+ if config[:all]
47
+ cl = Chef::CookbookLoader.new
48
+ cl.each do |cookbook|
49
+ generate_metadata(cookbook.name.to_s)
50
+ end
51
+ else
52
+ generate_metadata(@name_args[0])
53
+ end
54
+ end
55
+
56
+ def generate_metadata(cookbook)
57
+ Chef::Log.info("Generating metadata for #{cookbook}")
58
+ config[:cookbook_path].reverse.each do |path|
59
+ file = File.join(path, cookbook, 'metadata.rb')
60
+ if File.exists?(file)
61
+ Chef::Log.info("Generating from #{file}")
62
+ md = Chef::Cookbook::Metadata.new
63
+ md.name(cookbook)
64
+ md.from_file(file)
65
+ json_file = File.join(File.dirname(file), 'metadata.json')
66
+ File.open(json_file, "w") do |f|
67
+ f.write(JSON.pretty_generate(md))
68
+ end
69
+ generated = true
70
+ Chef::Log.info("Generated #{json_file}")
71
+ else
72
+ Chef::Log.debug("No #{file} found; skipping!")
73
+ end
74
+ end
75
+ end
76
+
77
+ end
78
+ end
79
+ end
80
+
81
+
82
+
83
+
84
+
85
+
86
+
87
+
@@ -0,0 +1,75 @@
1
+ #
2
+ # Author:: Adam Jacob (<adam@opscode.com>)
3
+ # Copyright:: Copyright (c) 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/knife'
20
+ require 'json'
21
+ require 'uri'
22
+
23
+ class Chef
24
+ class Knife
25
+ class CookbookShow < Knife
26
+
27
+ banner "Sub-Command: cookbook show COOKBOOK [PART] [FILENAME] (options)"
28
+
29
+ option :fqdn,
30
+ :short => "-f FQDN",
31
+ :long => "--fqdn FQDN",
32
+ :description => "The FQDN of the host to see the file for"
33
+
34
+ option :platform,
35
+ :short => "-p PLATFORM",
36
+ :long => "--platform PLATFORM",
37
+ :description => "The platform to see the file for"
38
+
39
+ option :platform_version,
40
+ :short => "-V VERSION",
41
+ :long => "--platform-version VERSION",
42
+ :description => "The platform version to see the file for"
43
+
44
+ def run
45
+ case @name_args.length
46
+ when 3 # We are showing a specific file
47
+ arguments = { :id => @name_args[2] }
48
+ arguments[:fqdn] = config[:fqdn] if config.has_key?(:fqdn)
49
+ arguments[:platform] = config[:platform] if config.has_key?(:platform)
50
+ arguments[:version] = config[:platform_version] if config.has_key?(:platform_version)
51
+ result = rest.get_rest("cookbooks/#{@name_args[0]}/#{@name_args[1]}?#{make_query_params(arguments)}")
52
+ pretty_print(result)
53
+ when 2 # We are showing a specific part of the cookbook
54
+ result = rest.get_rest("cookbooks/#{@name_args[0]}")
55
+ json_pretty_print(result[@name_args[1]])
56
+ when 1 # We are showing the whole cookbook data
57
+ json_pretty_print(rest.get_rest("cookbooks/#{@name_args[0]}"))
58
+ end
59
+ end
60
+
61
+ def make_query_params(req_opts)
62
+ query_part = Array.new
63
+ req_opts.keys.sort { |a,b| a.to_s <=> b.to_s }.each do |key|
64
+ query_part << "#{key}=#{URI.escape(req_opts[key])}"
65
+ end
66
+ query_part.join("&")
67
+ end
68
+
69
+ end
70
+ end
71
+ end
72
+
73
+
74
+
75
+
@@ -0,0 +1,173 @@
1
+ #
2
+ #
3
+ # Author:: Adam Jacob (<adam@opscode.com>)
4
+ # Copyright:: Copyright (c) 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/knife'
21
+ require 'chef/streaming_cookbook_uploader'
22
+ require 'chef/cache/checksum'
23
+
24
+ class Chef
25
+ class Knife
26
+ class CookbookUpload < Knife
27
+
28
+ banner "Sub-Command: cookbook upload COOKBOOK (options)"
29
+
30
+ option :cookbook_path,
31
+ :short => "-o PATH:PATH",
32
+ :long => "--cookbook-path PATH:PATH",
33
+ :description => "A colon-separated path to look for cookbooks in",
34
+ :proc => lambda { |o| o.split(":") }
35
+
36
+ option :all,
37
+ :short => "-a",
38
+ :long => "--all",
39
+ :description => "Upload all cookbooks, rather than just a single cookbook"
40
+
41
+ def run
42
+ if config[:cookbook_path]
43
+ Chef::Config[:cookbook_path] = config[:cookbook_path]
44
+ else
45
+ config[:cookbook_path] = Chef::Config[:cookbook_path]
46
+ end
47
+
48
+ if config[:all]
49
+ cl = Chef::CookbookLoader.new
50
+ cl.each do |cookbook|
51
+ Chef::Log.info("** #{cookbook.name.to_s} **")
52
+ upload_cookbook(cookbook.name.to_s)
53
+ end
54
+ else
55
+ upload_cookbook(@name_args[0])
56
+ end
57
+ end
58
+
59
+ def test_ruby(cookbook_dir)
60
+ Dir[File.join(cookbook_dir, '**', '*.rb')].each do |ruby_file|
61
+ Chef::Log.info("Testing #{ruby_file} for syntax errors...")
62
+ Chef::Mixin::Command.run_command(:command => "ruby -c #{ruby_file}")
63
+ end
64
+ end
65
+
66
+ def test_templates(cookbook_dir)
67
+ Dir[File.join(cookbook_dir, '**', '*.erb')].each do |erb_file|
68
+ Chef::Log.info("Testing template #{erb_file} for syntax errors...")
69
+ Chef::Mixin::Command.run_command(:command => "sh -c 'erubis -x #{erb_file} | ruby -c'")
70
+ end
71
+ end
72
+
73
+ def upload_cookbook(cookbook_name)
74
+
75
+ if cookbook_name =~ /^#{File::SEPARATOR}/
76
+ child_folders = cookbook_name
77
+ cookbook_name = File.basename(cookbook_name)
78
+ else
79
+ child_folders = config[:cookbook_path].inject([]) do |r, e|
80
+ r << File.join(e, cookbook_name)
81
+ r
82
+ end
83
+ end
84
+
85
+ tmp_cookbook_tarball = Tempfile.new("chef-#{cookbook_name}")
86
+ tmp_cookbook_tarball.close
87
+ tarball_name = "#{tmp_cookbook_tarball.path}.tar.gz"
88
+ File.unlink(tmp_cookbook_tarball.path)
89
+
90
+ tmp_cookbook_path = Tempfile.new("chef-#{cookbook_name}-build")
91
+ tmp_cookbook_path.close
92
+ tmp_cookbook_dir = tmp_cookbook_path.path
93
+ File.unlink(tmp_cookbook_dir)
94
+ FileUtils.mkdir_p(tmp_cookbook_dir)
95
+
96
+ Chef::Log.debug("Staging at #{tmp_cookbook_dir}")
97
+
98
+ found_cookbook = false
99
+
100
+ child_folders.each do |file_path|
101
+ if File.directory?(file_path)
102
+ found_cookbook = true
103
+ Chef::Log.info("Copying from #{file_path} to #{tmp_cookbook_dir}")
104
+ FileUtils.cp_r(file_path, tmp_cookbook_dir, :remove_destination => true)
105
+ else
106
+ Chef::Log.info("Nothing to copy from #{file_path}")
107
+ end
108
+ end
109
+
110
+ unless found_cookbook
111
+ Chef::Log.fatal("Could not find cookbook #{cookbook_name}!")
112
+ exit 17
113
+ end
114
+
115
+ test_ruby(tmp_cookbook_dir)
116
+ test_templates(tmp_cookbook_dir)
117
+
118
+ # First, generate metadata
119
+ kcm = Chef::Knife::CookbookMetadata.new
120
+ kcm.config[:cookbook_path] = [ tmp_cookbook_dir ]
121
+ kcm.name_args = [ cookbook_name ]
122
+ kcm.run
123
+
124
+ Chef::Log.info("Creating tarball at #{tarball_name}")
125
+ Chef::Mixin::Command.run_command(
126
+ :command => "tar -C #{tmp_cookbook_dir} -cvzf #{tarball_name} ./#{cookbook_name}"
127
+ )
128
+
129
+ begin
130
+ cb = rest.get_rest("cookbooks/#{cookbook_name}")
131
+ cookbook_uploaded = true
132
+ rescue Net::HTTPServerException
133
+ cookbook_uploaded = false
134
+ end
135
+ Chef::Log.info("Uploading #{cookbook_name} (#{cookbook_uploaded ? 'new version' : 'first time'})")
136
+ if cookbook_uploaded
137
+ Chef::StreamingCookbookUploader.put(
138
+ "#{Chef::Config[:chef_server_url]}/cookbooks/#{cookbook_name}/_content",
139
+ Chef::Config[:node_name],
140
+ Chef::Config[:client_key],
141
+ {
142
+ :file => File.new(tarball_name),
143
+ :name => cookbook_name
144
+ }
145
+ )
146
+ else
147
+ Chef::StreamingCookbookUploader.post(
148
+ "#{Chef::Config[:chef_server_url]}/cookbooks",
149
+ Chef::Config[:node_name],
150
+ Chef::Config[:client_key],
151
+ {
152
+ :file => File.new(tarball_name),
153
+ :name => cookbook_name
154
+ }
155
+ )
156
+ end
157
+ Chef::Log.info("Upload complete!")
158
+ Chef::Log.debug("Removing local tarball at #{tarball_name}")
159
+ FileUtils.rm_rf tarball_name
160
+ Chef::Log.debug("Removing local staging directory at #{tmp_cookbook_dir}")
161
+ FileUtils.rm_rf tmp_cookbook_dir
162
+ end
163
+
164
+ end
165
+ end
166
+ end
167
+
168
+
169
+
170
+
171
+
172
+
173
+
@@ -0,0 +1,43 @@
1
+ #
2
+ # Author:: Adam Jacob (<adam@opscode.com>)
3
+ # Copyright:: Copyright (c) 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/knife'
20
+ require 'chef/data_bag'
21
+
22
+ class Chef
23
+ class Knife
24
+ class DataBagCreate < Knife
25
+
26
+ banner "Sub-Command: data bag create BAG [ITEM] (options)"
27
+
28
+ def run
29
+ if @name_args.length == 2
30
+ create_object({ "id" => @name_args[1] }, "data_bag_item[#{@name_args[1]}]") do |output|
31
+ rest.put_rest("data/#{@name_args[0]}/#{@name_args[1]}", output)
32
+ end
33
+ else
34
+ rest.post_rest("data", { "name" => @name_args[0] })
35
+ Chef::Log.info("Created data_bag[#{@name_args[0]}]")
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+
42
+
43
+