mbailey-chef 0.9.12.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 (345) hide show
  1. data/LICENSE +201 -0
  2. data/README.rdoc +172 -0
  3. data/bin/chef-client +26 -0
  4. data/bin/chef-solo +25 -0
  5. data/bin/knife +26 -0
  6. data/bin/shef +34 -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-webui.1 +106 -0
  10. data/distro/common/man/man1/chef-server.1 +107 -0
  11. data/distro/common/man/man1/chef-solr-indexer.1 +55 -0
  12. data/distro/common/man/man1/chef-solr.1 +55 -0
  13. data/distro/common/man/man8/chef-client.8 +63 -0
  14. data/distro/common/man/man8/chef-solo.8 +57 -0
  15. data/distro/common/man/man8/chef-solr-rebuild.8 +37 -0
  16. data/distro/common/man/man8/knife.8 +1349 -0
  17. data/distro/common/man/man8/shef.8 +45 -0
  18. data/distro/common/markdown/README +3 -0
  19. data/distro/common/markdown/knife.mkd +832 -0
  20. data/distro/debian/etc/default/chef-client +4 -0
  21. data/distro/debian/etc/default/chef-server +9 -0
  22. data/distro/debian/etc/default/chef-server-webui +9 -0
  23. data/distro/debian/etc/default/chef-solr +7 -0
  24. data/distro/debian/etc/default/chef-solr-indexer +7 -0
  25. data/distro/debian/etc/init/chef-client.conf +17 -0
  26. data/distro/debian/etc/init/chef-server-webui.conf +17 -0
  27. data/distro/debian/etc/init/chef-server.conf +17 -0
  28. data/distro/debian/etc/init/chef-solr-indexer.conf +17 -0
  29. data/distro/debian/etc/init/chef-solr.conf +17 -0
  30. data/distro/debian/etc/init.d/chef-client +175 -0
  31. data/distro/debian/etc/init.d/chef-server +122 -0
  32. data/distro/debian/etc/init.d/chef-server-webui +123 -0
  33. data/distro/debian/etc/init.d/chef-solr +177 -0
  34. data/distro/debian/etc/init.d/chef-solr-indexer +176 -0
  35. data/distro/redhat/etc/init.d/chef-client +106 -0
  36. data/distro/redhat/etc/init.d/chef-server +112 -0
  37. data/distro/redhat/etc/init.d/chef-server-webui +112 -0
  38. data/distro/redhat/etc/init.d/chef-solr +104 -0
  39. data/distro/redhat/etc/init.d/chef-solr-indexer +104 -0
  40. data/distro/redhat/etc/logrotate.d/chef-client +8 -0
  41. data/distro/redhat/etc/logrotate.d/chef-server +8 -0
  42. data/distro/redhat/etc/logrotate.d/chef-server-webui +8 -0
  43. data/distro/redhat/etc/logrotate.d/chef-solr +8 -0
  44. data/distro/redhat/etc/logrotate.d/chef-solr-indexer +8 -0
  45. data/distro/redhat/etc/sysconfig/chef-client +15 -0
  46. data/distro/redhat/etc/sysconfig/chef-server +14 -0
  47. data/distro/redhat/etc/sysconfig/chef-server-webui +14 -0
  48. data/distro/redhat/etc/sysconfig/chef-solr +8 -0
  49. data/distro/redhat/etc/sysconfig/chef-solr-indexer +7 -0
  50. data/lib/chef/api_client.rb +264 -0
  51. data/lib/chef/application/agent.rb +18 -0
  52. data/lib/chef/application/client.rb +246 -0
  53. data/lib/chef/application/knife.rb +171 -0
  54. data/lib/chef/application/solo.rb +215 -0
  55. data/lib/chef/application.rb +127 -0
  56. data/lib/chef/applications.rb +4 -0
  57. data/lib/chef/certificate.rb +194 -0
  58. data/lib/chef/checksum.rb +182 -0
  59. data/lib/chef/checksum_cache.rb +173 -0
  60. data/lib/chef/client.rb +304 -0
  61. data/lib/chef/config.rb +240 -0
  62. data/lib/chef/cookbook/cookbook_collection.rb +44 -0
  63. data/lib/chef/cookbook/file_system_file_vendor.rb +54 -0
  64. data/lib/chef/cookbook/file_vendor.rb +48 -0
  65. data/lib/chef/cookbook/metadata/version.rb +87 -0
  66. data/lib/chef/cookbook/metadata.rb +500 -0
  67. data/lib/chef/cookbook/remote_file_vendor.rb +87 -0
  68. data/lib/chef/cookbook/syntax_check.rb +136 -0
  69. data/lib/chef/cookbook_loader.rb +227 -0
  70. data/lib/chef/cookbook_site_streaming_uploader.rb +244 -0
  71. data/lib/chef/cookbook_uploader.rb +103 -0
  72. data/lib/chef/cookbook_version.rb +930 -0
  73. data/lib/chef/couchdb.rb +239 -0
  74. data/lib/chef/daemon.rb +172 -0
  75. data/lib/chef/data_bag.rb +215 -0
  76. data/lib/chef/data_bag_item.rb +228 -0
  77. data/lib/chef/exceptions.rb +66 -0
  78. data/lib/chef/file_access_control.rb +140 -0
  79. data/lib/chef/file_cache.rb +218 -0
  80. data/lib/chef/handler/json_file.rb +58 -0
  81. data/lib/chef/handler.rb +206 -0
  82. data/lib/chef/index_queue/amqp_client.rb +113 -0
  83. data/lib/chef/index_queue/consumer.rb +76 -0
  84. data/lib/chef/index_queue/indexable.rb +76 -0
  85. data/lib/chef/index_queue.rb +29 -0
  86. data/lib/chef/knife/bootstrap/archlinux-gems.erb +44 -0
  87. data/lib/chef/knife/bootstrap/centos5-gems.erb +41 -0
  88. data/lib/chef/knife/bootstrap/client-install.vbs +80 -0
  89. data/lib/chef/knife/bootstrap/fedora13-gems.erb +38 -0
  90. data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +32 -0
  91. data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +43 -0
  92. data/lib/chef/knife/bootstrap/windows-gems.erb +34 -0
  93. data/lib/chef/knife/bootstrap.rb +181 -0
  94. data/lib/chef/knife/client_bulk_delete.rb +40 -0
  95. data/lib/chef/knife/client_create.rb +70 -0
  96. data/lib/chef/knife/client_delete.rb +45 -0
  97. data/lib/chef/knife/client_edit.rb +45 -0
  98. data/lib/chef/knife/client_list.rb +40 -0
  99. data/lib/chef/knife/client_reregister.rb +56 -0
  100. data/lib/chef/knife/client_show.rb +50 -0
  101. data/lib/chef/knife/configure.rb +140 -0
  102. data/lib/chef/knife/configure_client.rb +52 -0
  103. data/lib/chef/knife/cookbook_bulk_delete.rb +58 -0
  104. data/lib/chef/knife/cookbook_create.rb +209 -0
  105. data/lib/chef/knife/cookbook_delete.rb +143 -0
  106. data/lib/chef/knife/cookbook_download.rb +130 -0
  107. data/lib/chef/knife/cookbook_list.rb +41 -0
  108. data/lib/chef/knife/cookbook_metadata.rb +82 -0
  109. data/lib/chef/knife/cookbook_metadata_from_file.rb +40 -0
  110. data/lib/chef/knife/cookbook_show.rb +98 -0
  111. data/lib/chef/knife/cookbook_site_download.rb +58 -0
  112. data/lib/chef/knife/cookbook_site_list.rb +56 -0
  113. data/lib/chef/knife/cookbook_site_search.rb +51 -0
  114. data/lib/chef/knife/cookbook_site_share.rb +109 -0
  115. data/lib/chef/knife/cookbook_site_show.rb +57 -0
  116. data/lib/chef/knife/cookbook_site_unshare.rb +52 -0
  117. data/lib/chef/knife/cookbook_site_vendor.rb +133 -0
  118. data/lib/chef/knife/cookbook_test.rb +82 -0
  119. data/lib/chef/knife/cookbook_upload.rb +95 -0
  120. data/lib/chef/knife/data_bag_create.rb +59 -0
  121. data/lib/chef/knife/data_bag_delete.rb +48 -0
  122. data/lib/chef/knife/data_bag_edit.rb +50 -0
  123. data/lib/chef/knife/data_bag_from_file.rb +44 -0
  124. data/lib/chef/knife/data_bag_list.rb +43 -0
  125. data/lib/chef/knife/data_bag_show.rb +41 -0
  126. data/lib/chef/knife/ec2_instance_data.rb +46 -0
  127. data/lib/chef/knife/ec2_server_create.rb +216 -0
  128. data/lib/chef/knife/ec2_server_delete.rb +90 -0
  129. data/lib/chef/knife/ec2_server_list.rb +88 -0
  130. data/lib/chef/knife/exec.rb +52 -0
  131. data/lib/chef/knife/index_rebuild.rb +51 -0
  132. data/lib/chef/knife/node_bulk_delete.rb +43 -0
  133. data/lib/chef/knife/node_create.rb +47 -0
  134. data/lib/chef/knife/node_delete.rb +44 -0
  135. data/lib/chef/knife/node_edit.rb +44 -0
  136. data/lib/chef/knife/node_from_file.rb +42 -0
  137. data/lib/chef/knife/node_list.rb +41 -0
  138. data/lib/chef/knife/node_run_list_add.rb +64 -0
  139. data/lib/chef/knife/node_run_list_remove.rb +45 -0
  140. data/lib/chef/knife/node_show.rb +54 -0
  141. data/lib/chef/knife/rackspace_server_create.rb +156 -0
  142. data/lib/chef/knife/rackspace_server_delete.rb +57 -0
  143. data/lib/chef/knife/rackspace_server_list.rb +59 -0
  144. data/lib/chef/knife/recipe_list.rb +32 -0
  145. data/lib/chef/knife/role_bulk_delete.rb +44 -0
  146. data/lib/chef/knife/role_create.rb +52 -0
  147. data/lib/chef/knife/role_delete.rb +44 -0
  148. data/lib/chef/knife/role_edit.rb +45 -0
  149. data/lib/chef/knife/role_from_file.rb +46 -0
  150. data/lib/chef/knife/role_list.rb +40 -0
  151. data/lib/chef/knife/role_show.rb +51 -0
  152. data/lib/chef/knife/search.rb +94 -0
  153. data/lib/chef/knife/slicehost_images_list.rb +53 -0
  154. data/lib/chef/knife/slicehost_server_create.rb +103 -0
  155. data/lib/chef/knife/slicehost_server_delete.rb +61 -0
  156. data/lib/chef/knife/slicehost_server_list.rb +64 -0
  157. data/lib/chef/knife/ssh.rb +328 -0
  158. data/lib/chef/knife/status.rb +87 -0
  159. data/lib/chef/knife/terremark_server_create.rb +152 -0
  160. data/lib/chef/knife/terremark_server_delete.rb +87 -0
  161. data/lib/chef/knife/terremark_server_list.rb +77 -0
  162. data/lib/chef/knife/windows_bootstrap.rb +154 -0
  163. data/lib/chef/knife.rb +522 -0
  164. data/lib/chef/log.rb +61 -0
  165. data/lib/chef/mixin/check_helper.rb +31 -0
  166. data/lib/chef/mixin/checksum.rb +32 -0
  167. data/lib/chef/mixin/command/unix.rb +215 -0
  168. data/lib/chef/mixin/command/windows.rb +72 -0
  169. data/lib/chef/mixin/command.rb +220 -0
  170. data/lib/chef/mixin/convert_to_class_name.rb +63 -0
  171. data/lib/chef/mixin/create_path.rb +56 -0
  172. data/lib/chef/mixin/deep_merge.rb +225 -0
  173. data/lib/chef/mixin/deprecation.rb +65 -0
  174. data/lib/chef/mixin/find_preferred_file.rb +92 -0
  175. data/lib/chef/mixin/from_file.rb +50 -0
  176. data/lib/chef/mixin/language.rb +156 -0
  177. data/lib/chef/mixin/language_include_attribute.rb +61 -0
  178. data/lib/chef/mixin/language_include_recipe.rb +52 -0
  179. data/lib/chef/mixin/params_validate.rb +225 -0
  180. data/lib/chef/mixin/recipe_definition_dsl_core.rb +81 -0
  181. data/lib/chef/mixin/shell_out.rb +38 -0
  182. data/lib/chef/mixin/template.rb +95 -0
  183. data/lib/chef/mixin/xml_escape.rb +140 -0
  184. data/lib/chef/mixins.rb +16 -0
  185. data/lib/chef/monkey_patches/dir.rb +36 -0
  186. data/lib/chef/monkey_patches/string.rb +28 -0
  187. data/lib/chef/monkey_patches/tempfile.rb +64 -0
  188. data/lib/chef/node/attribute.rb +465 -0
  189. data/lib/chef/node.rb +601 -0
  190. data/lib/chef/openid_registration.rb +187 -0
  191. data/lib/chef/platform.rb +371 -0
  192. data/lib/chef/provider/breakpoint.rb +36 -0
  193. data/lib/chef/provider/cookbook_file.rb +100 -0
  194. data/lib/chef/provider/cron/solaris.rb +195 -0
  195. data/lib/chef/provider/cron.rb +186 -0
  196. data/lib/chef/provider/deploy/revision.rb +73 -0
  197. data/lib/chef/provider/deploy/timestamped.rb +33 -0
  198. data/lib/chef/provider/deploy.rb +319 -0
  199. data/lib/chef/provider/directory.rb +72 -0
  200. data/lib/chef/provider/env/windows.rb +75 -0
  201. data/lib/chef/provider/env.rb +152 -0
  202. data/lib/chef/provider/erl_call.rb +72 -0
  203. data/lib/chef/provider/execute.rb +58 -0
  204. data/lib/chef/provider/file.rb +213 -0
  205. data/lib/chef/provider/git.rb +211 -0
  206. data/lib/chef/provider/group/dscl.rb +121 -0
  207. data/lib/chef/provider/group/gpasswd.rb +53 -0
  208. data/lib/chef/provider/group/groupadd.rb +78 -0
  209. data/lib/chef/provider/group/pw.rb +84 -0
  210. data/lib/chef/provider/group/usermod.rb +57 -0
  211. data/lib/chef/provider/group/windows.rb +79 -0
  212. data/lib/chef/provider/group.rb +133 -0
  213. data/lib/chef/provider/http_request.rb +122 -0
  214. data/lib/chef/provider/ifconfig.rb +132 -0
  215. data/lib/chef/provider/link.rb +161 -0
  216. data/lib/chef/provider/log.rb +54 -0
  217. data/lib/chef/provider/mdadm.rb +91 -0
  218. data/lib/chef/provider/mount/mount.rb +232 -0
  219. data/lib/chef/provider/mount/windows.rb +80 -0
  220. data/lib/chef/provider/mount.rb +117 -0
  221. data/lib/chef/provider/ohai.rb +41 -0
  222. data/lib/chef/provider/package/apt.rb +110 -0
  223. data/lib/chef/provider/package/dpkg.rb +112 -0
  224. data/lib/chef/provider/package/easy_install.rb +114 -0
  225. data/lib/chef/provider/package/freebsd.rb +123 -0
  226. data/lib/chef/provider/package/macports.rb +105 -0
  227. data/lib/chef/provider/package/pacman.rb +101 -0
  228. data/lib/chef/provider/package/portage.rb +124 -0
  229. data/lib/chef/provider/package/rpm.rb +101 -0
  230. data/lib/chef/provider/package/rubygems.rb +462 -0
  231. data/lib/chef/provider/package/solaris.rb +127 -0
  232. data/lib/chef/provider/package/yum-dump.py +128 -0
  233. data/lib/chef/provider/package/yum.rb +222 -0
  234. data/lib/chef/provider/package/zypper.rb +133 -0
  235. data/lib/chef/provider/package.rb +160 -0
  236. data/lib/chef/provider/remote_directory.rb +140 -0
  237. data/lib/chef/provider/remote_file.rb +120 -0
  238. data/lib/chef/provider/route.rb +195 -0
  239. data/lib/chef/provider/ruby_block.rb +33 -0
  240. data/lib/chef/provider/script.rb +55 -0
  241. data/lib/chef/provider/service/arch.rb +109 -0
  242. data/lib/chef/provider/service/debian.rb +105 -0
  243. data/lib/chef/provider/service/freebsd.rb +156 -0
  244. data/lib/chef/provider/service/gentoo.rb +54 -0
  245. data/lib/chef/provider/service/init.rb +71 -0
  246. data/lib/chef/provider/service/redhat.rb +60 -0
  247. data/lib/chef/provider/service/simple.rb +118 -0
  248. data/lib/chef/provider/service/solaris.rb +85 -0
  249. data/lib/chef/provider/service/upstart.rb +192 -0
  250. data/lib/chef/provider/service/windows.rb +129 -0
  251. data/lib/chef/provider/service.rb +128 -0
  252. data/lib/chef/provider/subversion.rb +159 -0
  253. data/lib/chef/provider/template.rb +105 -0
  254. data/lib/chef/provider/user/dscl.rb +280 -0
  255. data/lib/chef/provider/user/pw.rb +113 -0
  256. data/lib/chef/provider/user/useradd.rb +137 -0
  257. data/lib/chef/provider/user/windows.rb +124 -0
  258. data/lib/chef/provider/user.rb +187 -0
  259. data/lib/chef/provider.rb +124 -0
  260. data/lib/chef/providers.rb +91 -0
  261. data/lib/chef/recipe.rb +130 -0
  262. data/lib/chef/resource/apt_package.rb +34 -0
  263. data/lib/chef/resource/bash.rb +33 -0
  264. data/lib/chef/resource/breakpoint.rb +35 -0
  265. data/lib/chef/resource/cookbook_file.rb +45 -0
  266. data/lib/chef/resource/cron.rb +188 -0
  267. data/lib/chef/resource/csh.rb +33 -0
  268. data/lib/chef/resource/deploy.rb +371 -0
  269. data/lib/chef/resource/deploy_revision.rb +35 -0
  270. data/lib/chef/resource/directory.rb +76 -0
  271. data/lib/chef/resource/dpkg_package.rb +34 -0
  272. data/lib/chef/resource/easy_install_package.rb +41 -0
  273. data/lib/chef/resource/env.rb +58 -0
  274. data/lib/chef/resource/erl_call.rb +83 -0
  275. data/lib/chef/resource/execute.rb +127 -0
  276. data/lib/chef/resource/file.rb +92 -0
  277. data/lib/chef/resource/freebsd_package.rb +35 -0
  278. data/lib/chef/resource/gem_package.rb +49 -0
  279. data/lib/chef/resource/git.rb +36 -0
  280. data/lib/chef/resource/group.rb +70 -0
  281. data/lib/chef/resource/http_request.rb +61 -0
  282. data/lib/chef/resource/ifconfig.rb +134 -0
  283. data/lib/chef/resource/link.rb +78 -0
  284. data/lib/chef/resource/log.rb +62 -0
  285. data/lib/chef/resource/macports_package.rb +29 -0
  286. data/lib/chef/resource/mdadm.rb +82 -0
  287. data/lib/chef/resource/mount.rb +135 -0
  288. data/lib/chef/resource/ohai.rb +40 -0
  289. data/lib/chef/resource/package.rb +80 -0
  290. data/lib/chef/resource/pacman_package.rb +33 -0
  291. data/lib/chef/resource/perl.rb +33 -0
  292. data/lib/chef/resource/portage_package.rb +33 -0
  293. data/lib/chef/resource/python.rb +33 -0
  294. data/lib/chef/resource/remote_directory.rb +109 -0
  295. data/lib/chef/resource/remote_file.rb +83 -0
  296. data/lib/chef/resource/route.rb +135 -0
  297. data/lib/chef/resource/rpm_package.rb +34 -0
  298. data/lib/chef/resource/ruby.rb +33 -0
  299. data/lib/chef/resource/ruby_block.rb +40 -0
  300. data/lib/chef/resource/scm.rb +146 -0
  301. data/lib/chef/resource/script.rb +60 -0
  302. data/lib/chef/resource/service.rb +160 -0
  303. data/lib/chef/resource/solaris_package.rb +36 -0
  304. data/lib/chef/resource/subversion.rb +36 -0
  305. data/lib/chef/resource/template.rb +69 -0
  306. data/lib/chef/resource/timestamped_deploy.rb +31 -0
  307. data/lib/chef/resource/user.rb +130 -0
  308. data/lib/chef/resource/yum_package.rb +43 -0
  309. data/lib/chef/resource.rb +523 -0
  310. data/lib/chef/resource_collection/stepable_iterator.rb +124 -0
  311. data/lib/chef/resource_collection.rb +217 -0
  312. data/lib/chef/resource_definition.rb +67 -0
  313. data/lib/chef/resource_definition_list.rb +38 -0
  314. data/lib/chef/resources.rb +64 -0
  315. data/lib/chef/rest/auth_credentials.rb +78 -0
  316. data/lib/chef/rest/cookie_jar.rb +31 -0
  317. data/lib/chef/rest/rest_request.rb +188 -0
  318. data/lib/chef/rest.rb +394 -0
  319. data/lib/chef/role.rb +287 -0
  320. data/lib/chef/run_context.rb +110 -0
  321. data/lib/chef/run_list/run_list_expansion.rb +172 -0
  322. data/lib/chef/run_list/run_list_item.rb +78 -0
  323. data/lib/chef/run_list.rb +150 -0
  324. data/lib/chef/run_status.rb +121 -0
  325. data/lib/chef/runner.rb +107 -0
  326. data/lib/chef/sandbox.rb +153 -0
  327. data/lib/chef/search/query.rb +60 -0
  328. data/lib/chef/shef/ext.rb +568 -0
  329. data/lib/chef/shef/model_wrapper.rb +120 -0
  330. data/lib/chef/shef/shef_rest.rb +28 -0
  331. data/lib/chef/shef/shef_session.rb +271 -0
  332. data/lib/chef/shef.rb +325 -0
  333. data/lib/chef/shell_out.rb +413 -0
  334. data/lib/chef/streaming_cookbook_uploader.rb +201 -0
  335. data/lib/chef/tasks/chef_repo.rake +256 -0
  336. data/lib/chef/util/file_edit.rb +122 -0
  337. data/lib/chef/util/windows/net_group.rb +101 -0
  338. data/lib/chef/util/windows/net_use.rb +121 -0
  339. data/lib/chef/util/windows/net_user.rb +198 -0
  340. data/lib/chef/util/windows/volume.rb +59 -0
  341. data/lib/chef/util/windows.rb +56 -0
  342. data/lib/chef/version.rb +21 -0
  343. data/lib/chef/webui_user.rb +231 -0
  344. data/lib/chef.rb +39 -0
  345. metadata +533 -0
@@ -0,0 +1,239 @@
1
+ #
2
+ # Author:: Adam Jacob (<adam@opscode.com>)
3
+ # Author:: Christopher Brown (<cb@opscode.com>)
4
+ # Copyright:: Copyright (c) 2008 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
+ require 'chef/mixin/params_validate'
20
+ require 'chef/config'
21
+ require 'chef/rest'
22
+ require 'chef/log'
23
+ require 'digest/sha2'
24
+ require 'json'
25
+
26
+ # We want to fail on create if uuidtools isn't installed
27
+ begin
28
+ require 'uuidtools'
29
+ rescue LoadError
30
+ end
31
+
32
+ class Chef
33
+ class CouchDB
34
+ include Chef::Mixin::ParamsValidate
35
+
36
+ def initialize(url=nil, db=Chef::Config[:couchdb_database])
37
+ url ||= Chef::Config[:couchdb_url]
38
+ @db = db
39
+ @rest = Chef::REST.new(url, nil, nil)
40
+ end
41
+
42
+ def couchdb_database(args=nil)
43
+ @db = args || @db
44
+ end
45
+
46
+ def create_id_map
47
+ create_design_document(
48
+ "id_map",
49
+ {
50
+ "version" => 1,
51
+ "language" => "javascript",
52
+ "views" => {
53
+ "name_to_id" => {
54
+ "map" => <<-EOJS
55
+ function(doc) {
56
+ emit([ doc.chef_type, doc.name], doc._id);
57
+ }
58
+ EOJS
59
+ },
60
+ "id_to_name" => {
61
+ "map" => <<-EOJS
62
+ function(doc) {
63
+ emit(doc._id, [ doc.chef_type, doc.name ]);
64
+ }
65
+ EOJS
66
+ }
67
+ }
68
+ }
69
+ )
70
+ end
71
+
72
+ def create_db
73
+ @database_list = @rest.get_rest("_all_dbs")
74
+ unless @database_list.detect { |db| db == couchdb_database }
75
+ response = @rest.put_rest(couchdb_database, Hash.new)
76
+ end
77
+ couchdb_database
78
+ end
79
+
80
+ def create_design_document(name, data)
81
+ create_db
82
+ to_update = true
83
+ begin
84
+ old_doc = @rest.get_rest("#{couchdb_database}/_design/#{name}")
85
+ if data["version"] != old_doc["version"]
86
+ data["_rev"] = old_doc["_rev"]
87
+ Chef::Log.debug("Updating #{name} views")
88
+ else
89
+ to_update = false
90
+ end
91
+ rescue
92
+ Chef::Log.debug("Creating #{name} views for the first time because: #{$!}")
93
+ end
94
+ if to_update
95
+ @rest.put_rest("#{couchdb_database}/_design%2F#{name}", data)
96
+ end
97
+ true
98
+ end
99
+
100
+ # Save the object to Couch. Add to index if the object supports it.
101
+ def store(obj_type, name, object)
102
+ validate(
103
+ {
104
+ :obj_type => obj_type,
105
+ :name => name,
106
+ :object => object,
107
+ },
108
+ {
109
+ :object => { :respond_to => :to_json },
110
+ }
111
+ )
112
+ rows = get_view("id_map", "name_to_id", :key => [ obj_type, name ])["rows"]
113
+ uuid = rows.empty? ? UUIDTools::UUID.random_create.to_s : rows.first.fetch("id")
114
+
115
+ db_put_response = @rest.put_rest("#{couchdb_database}/#{uuid}", object)
116
+
117
+ if object.respond_to?(:add_to_index)
118
+ Chef::Log.info("Sending #{obj_type}(#{uuid}) to the index queue for addition.")
119
+ object.add_to_index(:database => couchdb_database, :id => uuid, :type => obj_type)
120
+ end
121
+
122
+ db_put_response
123
+ end
124
+
125
+ def load(obj_type, name)
126
+ validate(
127
+ {
128
+ :obj_type => obj_type,
129
+ :name => name,
130
+ },
131
+ {
132
+ :obj_type => { :kind_of => String },
133
+ :name => { :kind_of => String },
134
+ }
135
+ )
136
+ doc = find_by_name(obj_type, name)
137
+ doc.couchdb = self if doc.respond_to?(:couchdb)
138
+ doc
139
+ end
140
+
141
+ def delete(obj_type, name, rev=nil)
142
+ validate(
143
+ {
144
+ :obj_type => obj_type,
145
+ :name => name,
146
+ },
147
+ {
148
+ :obj_type => { :kind_of => String },
149
+ :name => { :kind_of => String },
150
+ }
151
+ )
152
+ del_id = nil
153
+ object, uuid = find_by_name(obj_type, name, true)
154
+ unless rev
155
+ if object.respond_to?(:couchdb_rev)
156
+ rev = object.couchdb_rev
157
+ else
158
+ rev = object['_rev']
159
+ end
160
+ end
161
+ response = @rest.delete_rest("#{couchdb_database}/#{uuid}?rev=#{rev}")
162
+ response.couchdb = self if response.respond_to?(:couchdb=)
163
+
164
+ if object.respond_to?(:delete_from_index)
165
+ Chef::Log.info("Sending #{obj_type}(#{uuid}) to the index queue for deletion..")
166
+ object.delete_from_index(:database => couchdb_database, :id => uuid, :type => obj_type)
167
+ end
168
+
169
+ response
170
+ end
171
+
172
+ def list(view, inflate=false)
173
+ validate(
174
+ {
175
+ :view => view,
176
+ },
177
+ {
178
+ :view => { :kind_of => String }
179
+ }
180
+ )
181
+ if inflate
182
+ r = @rest.get_rest(view_uri(view, "all"))
183
+ r["rows"].each { |i| i["value"].couchdb = self if i["value"].respond_to?(:couchdb=) }
184
+ r
185
+ else
186
+ r = @rest.get_rest(view_uri(view, "all_id"))
187
+ end
188
+ r
189
+ end
190
+
191
+ def has_key?(obj_type, name)
192
+ validate(
193
+ {
194
+ :obj_type => obj_type,
195
+ :name => name,
196
+ },
197
+ {
198
+ :obj_type => { :kind_of => String },
199
+ :name => { :kind_of => String },
200
+ }
201
+ )
202
+ begin
203
+ find_by_name(obj_type, name)
204
+ true
205
+ rescue
206
+ false
207
+ end
208
+ end
209
+
210
+ def find_by_name(obj_type, name, with_id=false)
211
+ r = get_view("id_map", "name_to_id", :key => [ obj_type, name ], :include_docs => true)
212
+ if r["rows"].length == 0
213
+ raise Chef::Exceptions::CouchDBNotFound, "Cannot find #{obj_type} #{name} in CouchDB!"
214
+ end
215
+ if with_id
216
+ [ r["rows"][0]["doc"], r["rows"][0]["id"] ]
217
+ else
218
+ r["rows"][0]["doc"]
219
+ end
220
+ end
221
+
222
+ def get_view(design, view, options={})
223
+ view_string = view_uri(design, view)
224
+ view_string << "?" if options.length != 0
225
+ view_string << options.map { |k,v| "#{k}=#{URI.escape(v.to_json)}"}.join('&')
226
+ @rest.get_rest(view_string)
227
+ end
228
+
229
+ def bulk_get(*to_fetch)
230
+ response = @rest.post_rest("#{couchdb_database}/_all_docs?include_docs=true", { "keys" => to_fetch.flatten })
231
+ response["rows"].collect { |r| r["doc"] }
232
+ end
233
+
234
+ def view_uri(design, view)
235
+ "#{couchdb_database}/_design/#{design}/_view/#{view}"
236
+ end
237
+
238
+ end
239
+ end
@@ -0,0 +1,172 @@
1
+ #
2
+ # Author:: AJ Christensen (<aj@junglist.gen.nz>)
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
+ # I love you Merb (lib/merb-core/server.rb)
19
+
20
+ require 'chef/config'
21
+ require 'etc'
22
+
23
+ class Chef
24
+ class Daemon
25
+ class << self
26
+ attr_accessor :name
27
+
28
+ # Daemonize the current process, managing pidfiles and process uid/gid
29
+ #
30
+ # === Parameters
31
+ # name<String>:: The name to be used for the pid file
32
+ #
33
+ def daemonize(name)
34
+ @name = name
35
+ pid = pid_from_file
36
+ unless running?
37
+ remove_pid_file()
38
+ Chef::Log.info("Daemonizing..")
39
+ begin
40
+ exit if fork
41
+ Process.setsid
42
+ exit if fork
43
+ Chef::Log.info("Forked, in #{Process.pid}. Priveleges: #{Process.euid} #{Process.egid}")
44
+ File.umask Chef::Config[:umask]
45
+ $stdin.reopen("/dev/null")
46
+ $stdout.reopen("/dev/null", "a")
47
+ $stderr.reopen($stdout)
48
+ save_pid_file
49
+ at_exit { remove_pid_file }
50
+ rescue NotImplementedError => e
51
+ Chef::Application.fatal!("There is no fork: #{e.message}")
52
+ end
53
+ else
54
+ Chef::Application.fatal!("Chef is already running pid #{pid}")
55
+ end
56
+ end
57
+
58
+ # Check if Chef is running based on the pid_file
59
+ # ==== Returns
60
+ # Boolean::
61
+ # True if Chef is running
62
+ # False if Chef is not running
63
+ #
64
+ def running?
65
+ if pid_from_file.nil?
66
+ false
67
+ else
68
+ Process.kill(0, pid_from_file)
69
+ true
70
+ end
71
+ rescue Errno::ESRCH, Errno::ENOENT
72
+ false
73
+ rescue Errno::EACCES => e
74
+ Chef::Application.fatal!("You don't have access to the PID file at #{pid_file}: #{e.message}")
75
+ end
76
+
77
+ # Gets the pid file for @name
78
+ # ==== Returns
79
+ # String::
80
+ # Location of the pid file for @name
81
+ def pid_file
82
+ Chef::Config[:pid_file] or "/tmp/#{@name}.pid"
83
+ end
84
+
85
+ # Suck the pid out of pid_file
86
+ # ==== Returns
87
+ # Integer::
88
+ # The PID from pid_file
89
+ # nil::
90
+ # Returned if the pid_file does not exist.
91
+ #
92
+ def pid_from_file
93
+ File.read(pid_file).chomp.to_i
94
+ rescue Errno::ENOENT, Errno::EACCES
95
+ nil
96
+ end
97
+
98
+ # Store the PID on the filesystem
99
+ # This uses the Chef::Config[:pid_file] option, or "/tmp/name.pid" otherwise
100
+ #
101
+ def save_pid_file
102
+ file = pid_file
103
+ begin
104
+ FileUtils.mkdir_p(File.dirname(file))
105
+ rescue Errno::EACCES => e
106
+ Chef::Application.fatal!("Failed store pid in #{File.dirname(file)}, permission denied: #{e.message}")
107
+ end
108
+
109
+ begin
110
+ File.open(file, "w") { |f| f.write(Process.pid.to_s) }
111
+ rescue Errno::EACCES => e
112
+ Chef::Application.fatal!("Couldn't write to pidfile #{file}, permission denied: #{e.message}")
113
+ end
114
+ end
115
+
116
+ # Delete the PID from the filesystem
117
+ def remove_pid_file
118
+ FileUtils.rm(pid_file) if File.exists?(pid_file)
119
+ end
120
+
121
+ # Change process user/group to those specified in Chef::Config
122
+ #
123
+ def change_privilege
124
+ Dir.chdir("/")
125
+
126
+ if Chef::Config[:user] and Chef::Config[:group]
127
+ Chef::Log.info("About to change privilege to #{Chef::Config[:user]}:#{Chef::Config[:group]}")
128
+ _change_privilege(Chef::Config[:user], Chef::Config[:group])
129
+ elsif Chef::Config[:user]
130
+ Chef::Log.info("About to change privilege to #{Chef::Config[:user]}")
131
+ _change_privilege(Chef::Config[:user])
132
+ end
133
+ end
134
+
135
+ # Change privileges of the process to be the specified user and group
136
+ #
137
+ # ==== Parameters
138
+ # user<String>:: The user to change the process to.
139
+ # group<String>:: The group to change the process to.
140
+ #
141
+ # ==== Alternatives
142
+ # If group is left out, the user will be used (changing to user:user)
143
+ #
144
+ def _change_privilege(user, group=user)
145
+ uid, gid = Process.euid, Process.egid
146
+
147
+ begin
148
+ target_uid = Etc.getpwnam(user).uid
149
+ rescue ArgumentError => e
150
+ Chef::Application.fatal!("Failed to get UID for user #{user}, does it exist? #{e.message}")
151
+ return false
152
+ end
153
+
154
+ begin
155
+ target_gid = Etc.getgrnam(group).gid
156
+ rescue ArgumentError => e
157
+ Chef::Application.fatal!("Failed to get GID for group #{group}, does it exist? #{e.message}")
158
+ return false
159
+ end
160
+
161
+ if (uid != target_uid) or (gid != target_gid)
162
+ Process.initgroups(user, target_gid)
163
+ Process::GID.change_privilege(target_gid)
164
+ Process::UID.change_privilege(target_uid)
165
+ end
166
+ true
167
+ rescue Errno::EPERM => e
168
+ Chef::Application.fatal!("Permission denied when trying to change #{uid}:#{gid} to #{target_uid}:#{target_gid}. #{e.message}")
169
+ end
170
+ end
171
+ end
172
+ end
@@ -0,0 +1,215 @@
1
+ #
2
+ # Author:: Adam Jacob (<adam@opscode.com>)
3
+ # Author:: Nuo Yan (<nuo@opscode.com>)
4
+ # Author:: Christopher Brown (<cb@opscode.com>)
5
+ # Copyright:: Copyright (c) 2009 Opscode, Inc.
6
+ # License:: Apache License, Version 2.0
7
+ #
8
+ # Licensed under the Apache License, Version 2.0 (the "License");
9
+ # you may not use this file except in compliance with the License.
10
+ # You may obtain a copy of the License at
11
+ #
12
+ # http://www.apache.org/licenses/LICENSE-2.0
13
+ #
14
+ # Unless required by applicable law or agreed to in writing, software
15
+ # distributed under the License is distributed on an "AS IS" BASIS,
16
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17
+ # See the License for the specific language governing permissions and
18
+ # limitations under the License.
19
+ #
20
+
21
+ require 'chef/config'
22
+ require 'chef/mixin/params_validate'
23
+ require 'chef/mixin/from_file'
24
+ require 'chef/couchdb'
25
+ require 'chef/data_bag_item'
26
+ require 'chef/index_queue'
27
+ require 'extlib'
28
+ require 'json'
29
+
30
+ class Chef
31
+ class DataBag
32
+
33
+ include Chef::Mixin::FromFile
34
+ include Chef::Mixin::ParamsValidate
35
+ include Chef::IndexQueue::Indexable
36
+
37
+ DESIGN_DOCUMENT = {
38
+ "version" => 2,
39
+ "language" => "javascript",
40
+ "views" => {
41
+ "all" => {
42
+ "map" => <<-EOJS
43
+ function(doc) {
44
+ if (doc.chef_type == "data_bag") {
45
+ emit(doc.name, doc);
46
+ }
47
+ }
48
+ EOJS
49
+ },
50
+ "all_id" => {
51
+ "map" => <<-EOJS
52
+ function(doc) {
53
+ if (doc.chef_type == "data_bag") {
54
+ emit(doc.name, doc.name);
55
+ }
56
+ }
57
+ EOJS
58
+ },
59
+ "entries" => {
60
+ "map" => <<-EOJS
61
+ function(doc) {
62
+ if (doc.chef_type == "data_bag_item") {
63
+ emit(doc.data_bag, doc.raw_data.id);
64
+ }
65
+ }
66
+ EOJS
67
+ }
68
+ }
69
+ }
70
+
71
+ attr_accessor :couchdb_rev, :couchdb_id, :couchdb
72
+
73
+ # Create a new Chef::DataBag
74
+ def initialize(couchdb=nil)
75
+ @name = ''
76
+ @couchdb_rev = nil
77
+ @couchdb_id = nil
78
+ @couchdb = (couchdb || Chef::CouchDB.new)
79
+ end
80
+
81
+ def name(arg=nil)
82
+ set_or_return(
83
+ :name,
84
+ arg,
85
+ :regex => /^[\-[:alnum:]_]+$/
86
+ )
87
+ end
88
+
89
+ def to_hash
90
+ result = {
91
+ "name" => @name,
92
+ 'json_class' => self.class.name,
93
+ "chef_type" => "data_bag",
94
+ }
95
+ result["_rev"] = @couchdb_rev if @couchdb_rev
96
+ result
97
+ end
98
+
99
+ # Serialize this object as a hash
100
+ def to_json(*a)
101
+ to_hash.to_json(*a)
102
+ end
103
+
104
+ def chef_server_rest
105
+ Chef::REST.new(Chef::Config[:chef_server_url])
106
+ end
107
+
108
+ def self.chef_server_rest
109
+ Chef::REST.new(Chef::Config[:chef_server_url])
110
+ end
111
+
112
+ # Create a Chef::Role from JSON
113
+ def self.json_create(o)
114
+ bag = new
115
+ bag.name(o["name"])
116
+ bag.couchdb_rev = o["_rev"] if o.has_key?("_rev")
117
+ bag.couchdb_id = o["_id"] if o.has_key?("_id")
118
+ bag.index_id = bag.couchdb_id
119
+ bag
120
+ end
121
+
122
+ # List all the Chef::DataBag objects in the CouchDB. If inflate is set to true, you will get
123
+ # the full list of all Roles, fully inflated.
124
+ def self.cdb_list(inflate=false, couchdb=nil)
125
+ rs = (couchdb || Chef::CouchDB.new).list("data_bags", inflate)
126
+ lookup = (inflate ? "value" : "key")
127
+ rs["rows"].collect { |r| r[lookup] }
128
+ end
129
+
130
+ def self.list(inflate=false)
131
+ if inflate
132
+ # Can't search for all data bags like other objects, fall back to N+1 :(
133
+ list(false).inject({}) do |response, bag_and_uri|
134
+ response[bag_and_uri.first] = load(bag_and_uri.first)
135
+ response
136
+ end
137
+ else
138
+ Chef::REST.new(Chef::Config[:chef_server_url]).get_rest("data")
139
+ end
140
+ end
141
+
142
+ # Load a Data Bag by name from CouchDB
143
+ def self.cdb_load(name, couchdb=nil)
144
+ (couchdb || Chef::CouchDB.new).load("data_bag", name)
145
+ end
146
+
147
+ # Load a Data Bag by name via the RESTful API
148
+ def self.load(name)
149
+ Chef::REST.new(Chef::Config[:chef_server_url]).get_rest("data/#{name}")
150
+ end
151
+
152
+ # Remove this Data Bag from CouchDB
153
+ def cdb_destroy
154
+ removed = @couchdb.delete("data_bag", @name, @couchdb_rev)
155
+ rs = @couchdb.get_view("data_bags", "entries", :include_docs => true, :startkey => @name, :endkey => @name)
156
+ rs["rows"].each do |row|
157
+ row["doc"].couchdb = couchdb
158
+ row["doc"].cdb_destroy
159
+ end
160
+ removed
161
+ end
162
+
163
+ def destroy
164
+ chef_server_rest.delete_rest("data/#{@name}")
165
+ end
166
+
167
+ # Save this Data Bag to the CouchDB
168
+ def cdb_save
169
+ results = @couchdb.store("data_bag", @name, self)
170
+ @couchdb_rev = results["rev"]
171
+ end
172
+
173
+ # Save the Data Bag via RESTful API
174
+ def save
175
+ begin
176
+ chef_server_rest.put_rest("data/#{@name}", self)
177
+ rescue Net::HTTPServerException => e
178
+ raise e unless e.response.code == "404"
179
+ chef_server_rest.post_rest("data", self)
180
+ end
181
+ self
182
+ end
183
+
184
+ #create a data bag via RESTful API
185
+ def create
186
+ chef_server_rest.post_rest("data", self)
187
+ self
188
+ end
189
+
190
+ # List all the items in this Bag from CouchDB
191
+ # The self.load method does this through the REST API
192
+ def list(inflate=false)
193
+ rs = nil
194
+ if inflate
195
+ rs = @couchdb.get_view("data_bags", "entries", :include_docs => true, :startkey => @name, :endkey => @name)
196
+ rs["rows"].collect { |r| r["doc"] }
197
+ else
198
+ rs = @couchdb.get_view("data_bags", "entries", :startkey => @name, :endkey => @name)
199
+ rs["rows"].collect { |r| r["value"] }
200
+ end
201
+ end
202
+
203
+ # Set up our CouchDB design document
204
+ def self.create_design_document(couchdb=nil)
205
+ (couchdb || Chef::CouchDB.new).create_design_document("data_bags", DESIGN_DOCUMENT)
206
+ end
207
+
208
+ # As a string
209
+ def to_s
210
+ "data_bag[#{@name}]"
211
+ end
212
+
213
+ end
214
+ end
215
+