tylerrick-chef 0.10.8

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 (450) hide show
  1. data/LICENSE +201 -0
  2. data/README.rdoc +171 -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/arch/etc/conf.d/chef-client.conf +5 -0
  9. data/distro/arch/etc/conf.d/chef-expander.conf +8 -0
  10. data/distro/arch/etc/conf.d/chef-server-webui.conf +10 -0
  11. data/distro/arch/etc/conf.d/chef-server.conf +10 -0
  12. data/distro/arch/etc/conf.d/chef-solr.conf +8 -0
  13. data/distro/arch/etc/rc.d/chef-client +76 -0
  14. data/distro/arch/etc/rc.d/chef-expander +78 -0
  15. data/distro/arch/etc/rc.d/chef-server +78 -0
  16. data/distro/arch/etc/rc.d/chef-server-webui +78 -0
  17. data/distro/arch/etc/rc.d/chef-solr +78 -0
  18. data/distro/common/html/chef-client.8.html +146 -0
  19. data/distro/common/html/chef-expander.8.html +164 -0
  20. data/distro/common/html/chef-expanderctl.8.html +146 -0
  21. data/distro/common/html/chef-server-webui.8.html +185 -0
  22. data/distro/common/html/chef-server.8.html +182 -0
  23. data/distro/common/html/chef-solo.8.html +191 -0
  24. data/distro/common/html/chef-solr.8.html +165 -0
  25. data/distro/common/html/knife-bootstrap.1.html +243 -0
  26. data/distro/common/html/knife-client.1.html +219 -0
  27. data/distro/common/html/knife-configure.1.html +170 -0
  28. data/distro/common/html/knife-cookbook-site.1.html +241 -0
  29. data/distro/common/html/knife-cookbook.1.html +384 -0
  30. data/distro/common/html/knife-data-bag.1.html +234 -0
  31. data/distro/common/html/knife-environment.1.html +267 -0
  32. data/distro/common/html/knife-exec.1.html +134 -0
  33. data/distro/common/html/knife-index.1.html +125 -0
  34. data/distro/common/html/knife-node.1.html +250 -0
  35. data/distro/common/html/knife-recipe.1.html +92 -0
  36. data/distro/common/html/knife-role.1.html +200 -0
  37. data/distro/common/html/knife-search.1.html +288 -0
  38. data/distro/common/html/knife-ssh.1.html +157 -0
  39. data/distro/common/html/knife-status.1.html +128 -0
  40. data/distro/common/html/knife-tag.1.html +137 -0
  41. data/distro/common/html/knife.1.html +321 -0
  42. data/distro/common/html/shef.1.html +283 -0
  43. data/distro/common/man/man1/knife-bootstrap.1 +197 -0
  44. data/distro/common/man/man1/knife-client.1 +99 -0
  45. data/distro/common/man/man1/knife-configure.1 +88 -0
  46. data/distro/common/man/man1/knife-cookbook-site.1 +145 -0
  47. data/distro/common/man/man1/knife-cookbook.1 +345 -0
  48. data/distro/common/man/man1/knife-data-bag.1 +130 -0
  49. data/distro/common/man/man1/knife-environment.1 +178 -0
  50. data/distro/common/man/man1/knife-exec.1 +46 -0
  51. data/distro/common/man/man1/knife-index.1 +29 -0
  52. data/distro/common/man/man1/knife-node.1 +134 -0
  53. data/distro/common/man/man1/knife-role.1 +88 -0
  54. data/distro/common/man/man1/knife-search.1 +280 -0
  55. data/distro/common/man/man1/knife-ssh.1 +83 -0
  56. data/distro/common/man/man1/knife-status.1 +29 -0
  57. data/distro/common/man/man1/knife-tag.1 +43 -0
  58. data/distro/common/man/man1/knife.1 +292 -0
  59. data/distro/common/man/man1/shef.1 +256 -0
  60. data/distro/common/man/man8/chef-client.8 +104 -0
  61. data/distro/common/man/man8/chef-expander.8 +97 -0
  62. data/distro/common/man/man8/chef-expanderctl.8 +62 -0
  63. data/distro/common/man/man8/chef-server-webui.8 +155 -0
  64. data/distro/common/man/man8/chef-server.8 +147 -0
  65. data/distro/common/man/man8/chef-solo.8 +158 -0
  66. data/distro/common/man/man8/chef-solr.8 +122 -0
  67. data/distro/common/markdown/README +3 -0
  68. data/distro/common/markdown/man1/knife-bootstrap.mkd +142 -0
  69. data/distro/common/markdown/man1/knife-client.mkd +103 -0
  70. data/distro/common/markdown/man1/knife-configure.mkd +70 -0
  71. data/distro/common/markdown/man1/knife-cookbook-site.mkd +123 -0
  72. data/distro/common/markdown/man1/knife-cookbook.mkd +263 -0
  73. data/distro/common/markdown/man1/knife-data-bag.mkd +117 -0
  74. data/distro/common/markdown/man1/knife-environment.mkd +151 -0
  75. data/distro/common/markdown/man1/knife-exec.mkd +37 -0
  76. data/distro/common/markdown/man1/knife-index.mkd +30 -0
  77. data/distro/common/markdown/man1/knife-node.mkd +130 -0
  78. data/distro/common/markdown/man1/knife-role.mkd +85 -0
  79. data/distro/common/markdown/man1/knife-search.mkd +180 -0
  80. data/distro/common/markdown/man1/knife-ssh.mkd +72 -0
  81. data/distro/common/markdown/man1/knife-status.mkd +36 -0
  82. data/distro/common/markdown/man1/knife-tag.mkd +39 -0
  83. data/distro/common/markdown/man1/knife.mkd +220 -0
  84. data/distro/common/markdown/man1/shef.mkd +189 -0
  85. data/distro/common/markdown/man8/chef-client.mkd +75 -0
  86. data/distro/common/markdown/man8/chef-expander.mkd +82 -0
  87. data/distro/common/markdown/man8/chef-expanderctl.mkd +58 -0
  88. data/distro/common/markdown/man8/chef-server-webui.mkd +121 -0
  89. data/distro/common/markdown/man8/chef-server.mkd +121 -0
  90. data/distro/common/markdown/man8/chef-solo.mkd +107 -0
  91. data/distro/common/markdown/man8/chef-solr.mkd +89 -0
  92. data/distro/debian/etc/default/chef-client +4 -0
  93. data/distro/debian/etc/default/chef-expander +8 -0
  94. data/distro/debian/etc/default/chef-server +9 -0
  95. data/distro/debian/etc/default/chef-server-webui +9 -0
  96. data/distro/debian/etc/default/chef-solr +8 -0
  97. data/distro/debian/etc/init.d/chef-client +185 -0
  98. data/distro/debian/etc/init.d/chef-expander +176 -0
  99. data/distro/debian/etc/init.d/chef-server +122 -0
  100. data/distro/debian/etc/init.d/chef-server-webui +123 -0
  101. data/distro/debian/etc/init.d/chef-solr +176 -0
  102. data/distro/debian/etc/init/chef-client.conf +17 -0
  103. data/distro/debian/etc/init/chef-expander.conf +17 -0
  104. data/distro/debian/etc/init/chef-server-webui.conf +17 -0
  105. data/distro/debian/etc/init/chef-server.conf +17 -0
  106. data/distro/debian/etc/init/chef-solr.conf +17 -0
  107. data/distro/redhat/etc/init.d/chef-client +110 -0
  108. data/distro/redhat/etc/init.d/chef-expander +104 -0
  109. data/distro/redhat/etc/init.d/chef-server +112 -0
  110. data/distro/redhat/etc/init.d/chef-server-webui +112 -0
  111. data/distro/redhat/etc/init.d/chef-solr +104 -0
  112. data/distro/redhat/etc/logrotate.d/chef-client +8 -0
  113. data/distro/redhat/etc/logrotate.d/chef-expander +8 -0
  114. data/distro/redhat/etc/logrotate.d/chef-server +8 -0
  115. data/distro/redhat/etc/logrotate.d/chef-server-webui +8 -0
  116. data/distro/redhat/etc/logrotate.d/chef-solr +8 -0
  117. data/distro/redhat/etc/sysconfig/chef-client +15 -0
  118. data/distro/redhat/etc/sysconfig/chef-expander +7 -0
  119. data/distro/redhat/etc/sysconfig/chef-server +14 -0
  120. data/distro/redhat/etc/sysconfig/chef-server-webui +14 -0
  121. data/distro/redhat/etc/sysconfig/chef-solr +8 -0
  122. data/lib/chef.rb +41 -0
  123. data/lib/chef/api_client.rb +271 -0
  124. data/lib/chef/application.rb +152 -0
  125. data/lib/chef/application/agent.rb +18 -0
  126. data/lib/chef/application/client.rb +285 -0
  127. data/lib/chef/application/knife.rb +188 -0
  128. data/lib/chef/application/solo.rb +218 -0
  129. data/lib/chef/applications.rb +4 -0
  130. data/lib/chef/certificate.rb +194 -0
  131. data/lib/chef/checksum.rb +167 -0
  132. data/lib/chef/checksum/storage.rb +18 -0
  133. data/lib/chef/checksum/storage/filesystem.rb +56 -0
  134. data/lib/chef/checksum_cache.rb +189 -0
  135. data/lib/chef/client.rb +366 -0
  136. data/lib/chef/config.rb +248 -0
  137. data/lib/chef/cookbook/chefignore.rb +66 -0
  138. data/lib/chef/cookbook/cookbook_collection.rb +45 -0
  139. data/lib/chef/cookbook/cookbook_version_loader.rb +173 -0
  140. data/lib/chef/cookbook/file_system_file_vendor.rb +56 -0
  141. data/lib/chef/cookbook/file_vendor.rb +48 -0
  142. data/lib/chef/cookbook/metadata.rb +629 -0
  143. data/lib/chef/cookbook/remote_file_vendor.rb +88 -0
  144. data/lib/chef/cookbook/syntax_check.rb +136 -0
  145. data/lib/chef/cookbook_loader.rb +121 -0
  146. data/lib/chef/cookbook_site_streaming_uploader.rb +244 -0
  147. data/lib/chef/cookbook_uploader.rb +154 -0
  148. data/lib/chef/cookbook_version.rb +1096 -0
  149. data/lib/chef/cookbook_version_selector.rb +168 -0
  150. data/lib/chef/couchdb.rb +246 -0
  151. data/lib/chef/daemon.rb +172 -0
  152. data/lib/chef/data_bag.rb +235 -0
  153. data/lib/chef/data_bag_item.rb +273 -0
  154. data/lib/chef/encrypted_data_bag_item.rb +139 -0
  155. data/lib/chef/environment.rb +455 -0
  156. data/lib/chef/exceptions.rb +154 -0
  157. data/lib/chef/file_access_control.rb +144 -0
  158. data/lib/chef/file_cache.rb +218 -0
  159. data/lib/chef/handler.rb +227 -0
  160. data/lib/chef/handler/error_report.rb +33 -0
  161. data/lib/chef/handler/json_file.rb +58 -0
  162. data/lib/chef/index_queue.rb +29 -0
  163. data/lib/chef/index_queue/amqp_client.rb +116 -0
  164. data/lib/chef/index_queue/consumer.rb +76 -0
  165. data/lib/chef/index_queue/indexable.rb +109 -0
  166. data/lib/chef/json_compat.rb +52 -0
  167. data/lib/chef/knife.rb +520 -0
  168. data/lib/chef/knife/bootstrap.rb +207 -0
  169. data/lib/chef/knife/bootstrap/archlinux-gems.erb +60 -0
  170. data/lib/chef/knife/bootstrap/centos5-gems.erb +56 -0
  171. data/lib/chef/knife/bootstrap/fedora13-gems.erb +43 -0
  172. data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +49 -0
  173. data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +50 -0
  174. data/lib/chef/knife/client_bulk_delete.rb +65 -0
  175. data/lib/chef/knife/client_create.rb +79 -0
  176. data/lib/chef/knife/client_delete.rb +46 -0
  177. data/lib/chef/knife/client_edit.rb +45 -0
  178. data/lib/chef/knife/client_list.rb +42 -0
  179. data/lib/chef/knife/client_reregister.rb +58 -0
  180. data/lib/chef/knife/client_show.rb +52 -0
  181. data/lib/chef/knife/configure.rb +149 -0
  182. data/lib/chef/knife/configure_client.rb +50 -0
  183. data/lib/chef/knife/cookbook_bulk_delete.rb +72 -0
  184. data/lib/chef/knife/cookbook_create.rb +274 -0
  185. data/lib/chef/knife/cookbook_delete.rb +151 -0
  186. data/lib/chef/knife/cookbook_download.rb +137 -0
  187. data/lib/chef/knife/cookbook_list.rb +47 -0
  188. data/lib/chef/knife/cookbook_metadata.rb +107 -0
  189. data/lib/chef/knife/cookbook_metadata_from_file.rb +44 -0
  190. data/lib/chef/knife/cookbook_show.rb +102 -0
  191. data/lib/chef/knife/cookbook_site_download.rb +70 -0
  192. data/lib/chef/knife/cookbook_site_install.rb +148 -0
  193. data/lib/chef/knife/cookbook_site_list.rb +62 -0
  194. data/lib/chef/knife/cookbook_site_search.rb +51 -0
  195. data/lib/chef/knife/cookbook_site_share.rb +114 -0
  196. data/lib/chef/knife/cookbook_site_show.rb +57 -0
  197. data/lib/chef/knife/cookbook_site_unshare.rb +56 -0
  198. data/lib/chef/knife/cookbook_site_vendor.rb +46 -0
  199. data/lib/chef/knife/cookbook_test.rb +93 -0
  200. data/lib/chef/knife/cookbook_upload.rb +240 -0
  201. data/lib/chef/knife/core/bootstrap_context.rb +100 -0
  202. data/lib/chef/knife/core/cookbook_scm_repo.rb +148 -0
  203. data/lib/chef/knife/core/generic_presenter.rb +191 -0
  204. data/lib/chef/knife/core/node_editor.rb +127 -0
  205. data/lib/chef/knife/core/node_presenter.rb +136 -0
  206. data/lib/chef/knife/core/object_loader.rb +75 -0
  207. data/lib/chef/knife/core/subcommand_loader.rb +112 -0
  208. data/lib/chef/knife/core/text_formatter.rb +100 -0
  209. data/lib/chef/knife/core/ui.rb +216 -0
  210. data/lib/chef/knife/data_bag_create.rb +93 -0
  211. data/lib/chef/knife/data_bag_delete.rb +51 -0
  212. data/lib/chef/knife/data_bag_edit.rb +94 -0
  213. data/lib/chef/knife/data_bag_from_file.rb +87 -0
  214. data/lib/chef/knife/data_bag_list.rb +46 -0
  215. data/lib/chef/knife/data_bag_show.rb +81 -0
  216. data/lib/chef/knife/environment_create.rb +53 -0
  217. data/lib/chef/knife/environment_delete.rb +45 -0
  218. data/lib/chef/knife/environment_edit.rb +45 -0
  219. data/lib/chef/knife/environment_from_file.rb +50 -0
  220. data/lib/chef/knife/environment_list.rb +42 -0
  221. data/lib/chef/knife/environment_show.rb +46 -0
  222. data/lib/chef/knife/exec.rb +51 -0
  223. data/lib/chef/knife/help.rb +103 -0
  224. data/lib/chef/knife/help_topics.rb +4 -0
  225. data/lib/chef/knife/index_rebuild.rb +50 -0
  226. data/lib/chef/knife/node_bulk_delete.rb +80 -0
  227. data/lib/chef/knife/node_create.rb +50 -0
  228. data/lib/chef/knife/node_delete.rb +47 -0
  229. data/lib/chef/knife/node_edit.rb +72 -0
  230. data/lib/chef/knife/node_from_file.rb +50 -0
  231. data/lib/chef/knife/node_list.rb +46 -0
  232. data/lib/chef/knife/node_run_list_add.rb +67 -0
  233. data/lib/chef/knife/node_run_list_remove.rb +48 -0
  234. data/lib/chef/knife/node_show.rb +73 -0
  235. data/lib/chef/knife/recipe_list.rb +32 -0
  236. data/lib/chef/knife/role_bulk_delete.rb +70 -0
  237. data/lib/chef/knife/role_create.rb +55 -0
  238. data/lib/chef/knife/role_delete.rb +47 -0
  239. data/lib/chef/knife/role_edit.rb +48 -0
  240. data/lib/chef/knife/role_from_file.rb +56 -0
  241. data/lib/chef/knife/role_list.rb +43 -0
  242. data/lib/chef/knife/role_show.rb +54 -0
  243. data/lib/chef/knife/search.rb +141 -0
  244. data/lib/chef/knife/ssh.rb +367 -0
  245. data/lib/chef/knife/status.rb +104 -0
  246. data/lib/chef/knife/tag_create.rb +52 -0
  247. data/lib/chef/knife/tag_delete.rb +60 -0
  248. data/lib/chef/knife/tag_list.rb +47 -0
  249. data/lib/chef/log.rb +39 -0
  250. data/lib/chef/mash.rb +211 -0
  251. data/lib/chef/mixin/check_helper.rb +31 -0
  252. data/lib/chef/mixin/checksum.rb +32 -0
  253. data/lib/chef/mixin/command.rb +163 -0
  254. data/lib/chef/mixin/command/unix.rb +215 -0
  255. data/lib/chef/mixin/command/windows.rb +76 -0
  256. data/lib/chef/mixin/convert_to_class_name.rb +63 -0
  257. data/lib/chef/mixin/create_path.rb +57 -0
  258. data/lib/chef/mixin/deep_merge.rb +225 -0
  259. data/lib/chef/mixin/deprecation.rb +65 -0
  260. data/lib/chef/mixin/from_file.rb +50 -0
  261. data/lib/chef/mixin/get_source_from_package.rb +42 -0
  262. data/lib/chef/mixin/language.rb +163 -0
  263. data/lib/chef/mixin/language_include_attribute.rb +61 -0
  264. data/lib/chef/mixin/language_include_recipe.rb +52 -0
  265. data/lib/chef/mixin/params_validate.rb +225 -0
  266. data/lib/chef/mixin/recipe_definition_dsl_core.rb +78 -0
  267. data/lib/chef/mixin/shell_out.rb +41 -0
  268. data/lib/chef/mixin/template.rb +95 -0
  269. data/lib/chef/mixin/xml_escape.rb +140 -0
  270. data/lib/chef/mixins.rb +15 -0
  271. data/lib/chef/monkey_patches/dir.rb +36 -0
  272. data/lib/chef/monkey_patches/numeric.rb +15 -0
  273. data/lib/chef/monkey_patches/object.rb +9 -0
  274. data/lib/chef/monkey_patches/regexp.rb +34 -0
  275. data/lib/chef/monkey_patches/string.rb +49 -0
  276. data/lib/chef/monkey_patches/tempfile.rb +64 -0
  277. data/lib/chef/nil_argument.rb +3 -0
  278. data/lib/chef/node.rb +677 -0
  279. data/lib/chef/node/attribute.rb +487 -0
  280. data/lib/chef/openid_registration.rb +187 -0
  281. data/lib/chef/platform.rb +434 -0
  282. data/lib/chef/provider.rb +124 -0
  283. data/lib/chef/provider/breakpoint.rb +36 -0
  284. data/lib/chef/provider/cookbook_file.rb +100 -0
  285. data/lib/chef/provider/cron.rb +186 -0
  286. data/lib/chef/provider/cron/solaris.rb +195 -0
  287. data/lib/chef/provider/deploy.rb +418 -0
  288. data/lib/chef/provider/deploy/revision.rb +80 -0
  289. data/lib/chef/provider/deploy/timestamped.rb +33 -0
  290. data/lib/chef/provider/directory.rb +72 -0
  291. data/lib/chef/provider/env.rb +152 -0
  292. data/lib/chef/provider/env/windows.rb +75 -0
  293. data/lib/chef/provider/erl_call.rb +101 -0
  294. data/lib/chef/provider/execute.rb +65 -0
  295. data/lib/chef/provider/file.rb +226 -0
  296. data/lib/chef/provider/git.rb +243 -0
  297. data/lib/chef/provider/group.rb +133 -0
  298. data/lib/chef/provider/group/aix.rb +70 -0
  299. data/lib/chef/provider/group/dscl.rb +121 -0
  300. data/lib/chef/provider/group/gpasswd.rb +53 -0
  301. data/lib/chef/provider/group/groupadd.rb +91 -0
  302. data/lib/chef/provider/group/pw.rb +84 -0
  303. data/lib/chef/provider/group/suse.rb +53 -0
  304. data/lib/chef/provider/group/usermod.rb +57 -0
  305. data/lib/chef/provider/group/windows.rb +79 -0
  306. data/lib/chef/provider/http_request.rb +122 -0
  307. data/lib/chef/provider/ifconfig.rb +195 -0
  308. data/lib/chef/provider/link.rb +164 -0
  309. data/lib/chef/provider/log.rb +54 -0
  310. data/lib/chef/provider/mdadm.rb +91 -0
  311. data/lib/chef/provider/mount.rb +114 -0
  312. data/lib/chef/provider/mount/mount.rb +240 -0
  313. data/lib/chef/provider/mount/windows.rb +81 -0
  314. data/lib/chef/provider/ohai.rb +42 -0
  315. data/lib/chef/provider/package.rb +200 -0
  316. data/lib/chef/provider/package/apt.rb +145 -0
  317. data/lib/chef/provider/package/dpkg.rb +115 -0
  318. data/lib/chef/provider/package/easy_install.rb +136 -0
  319. data/lib/chef/provider/package/freebsd.rb +125 -0
  320. data/lib/chef/provider/package/macports.rb +105 -0
  321. data/lib/chef/provider/package/pacman.rb +101 -0
  322. data/lib/chef/provider/package/portage.rb +135 -0
  323. data/lib/chef/provider/package/rpm.rb +104 -0
  324. data/lib/chef/provider/package/rubygems.rb +465 -0
  325. data/lib/chef/provider/package/solaris.rb +130 -0
  326. data/lib/chef/provider/package/yum-dump.py +286 -0
  327. data/lib/chef/provider/package/yum.rb +1173 -0
  328. data/lib/chef/provider/package/zypper.rb +144 -0
  329. data/lib/chef/provider/remote_directory.rb +137 -0
  330. data/lib/chef/provider/remote_file.rb +118 -0
  331. data/lib/chef/provider/route.rb +193 -0
  332. data/lib/chef/provider/ruby_block.rb +34 -0
  333. data/lib/chef/provider/script.rb +55 -0
  334. data/lib/chef/provider/service.rb +122 -0
  335. data/lib/chef/provider/service/arch.rb +116 -0
  336. data/lib/chef/provider/service/debian.rb +130 -0
  337. data/lib/chef/provider/service/freebsd.rb +154 -0
  338. data/lib/chef/provider/service/gentoo.rb +53 -0
  339. data/lib/chef/provider/service/init.rb +71 -0
  340. data/lib/chef/provider/service/insserv.rb +52 -0
  341. data/lib/chef/provider/service/invokercd.rb +35 -0
  342. data/lib/chef/provider/service/redhat.rb +60 -0
  343. data/lib/chef/provider/service/simple.rb +120 -0
  344. data/lib/chef/provider/service/solaris.rb +85 -0
  345. data/lib/chef/provider/service/systemd.rb +102 -0
  346. data/lib/chef/provider/service/upstart.rb +198 -0
  347. data/lib/chef/provider/service/windows.rb +155 -0
  348. data/lib/chef/provider/subversion.rb +197 -0
  349. data/lib/chef/provider/template.rb +104 -0
  350. data/lib/chef/provider/user.rb +186 -0
  351. data/lib/chef/provider/user/dscl.rb +280 -0
  352. data/lib/chef/provider/user/pw.rb +113 -0
  353. data/lib/chef/provider/user/useradd.rb +137 -0
  354. data/lib/chef/provider/user/windows.rb +124 -0
  355. data/lib/chef/providers.rb +95 -0
  356. data/lib/chef/recipe.rb +129 -0
  357. data/lib/chef/resource.rb +609 -0
  358. data/lib/chef/resource/apt_package.rb +34 -0
  359. data/lib/chef/resource/bash.rb +33 -0
  360. data/lib/chef/resource/breakpoint.rb +35 -0
  361. data/lib/chef/resource/conditional.rb +90 -0
  362. data/lib/chef/resource/cookbook_file.rb +45 -0
  363. data/lib/chef/resource/cron.rb +188 -0
  364. data/lib/chef/resource/csh.rb +33 -0
  365. data/lib/chef/resource/deploy.rb +389 -0
  366. data/lib/chef/resource/deploy_revision.rb +40 -0
  367. data/lib/chef/resource/directory.rb +76 -0
  368. data/lib/chef/resource/dpkg_package.rb +34 -0
  369. data/lib/chef/resource/easy_install_package.rb +57 -0
  370. data/lib/chef/resource/env.rb +58 -0
  371. data/lib/chef/resource/erl_call.rb +83 -0
  372. data/lib/chef/resource/execute.rb +127 -0
  373. data/lib/chef/resource/file.rb +99 -0
  374. data/lib/chef/resource/freebsd_package.rb +35 -0
  375. data/lib/chef/resource/gem_package.rb +53 -0
  376. data/lib/chef/resource/git.rb +46 -0
  377. data/lib/chef/resource/group.rb +78 -0
  378. data/lib/chef/resource/http_request.rb +61 -0
  379. data/lib/chef/resource/ifconfig.rb +144 -0
  380. data/lib/chef/resource/link.rb +78 -0
  381. data/lib/chef/resource/log.rb +62 -0
  382. data/lib/chef/resource/macports_package.rb +29 -0
  383. data/lib/chef/resource/mdadm.rb +82 -0
  384. data/lib/chef/resource/mount.rb +134 -0
  385. data/lib/chef/resource/ohai.rb +40 -0
  386. data/lib/chef/resource/package.rb +80 -0
  387. data/lib/chef/resource/pacman_package.rb +33 -0
  388. data/lib/chef/resource/perl.rb +33 -0
  389. data/lib/chef/resource/portage_package.rb +33 -0
  390. data/lib/chef/resource/python.rb +33 -0
  391. data/lib/chef/resource/remote_directory.rb +109 -0
  392. data/lib/chef/resource/remote_file.rb +83 -0
  393. data/lib/chef/resource/route.rb +135 -0
  394. data/lib/chef/resource/rpm_package.rb +34 -0
  395. data/lib/chef/resource/ruby.rb +33 -0
  396. data/lib/chef/resource/ruby_block.rb +40 -0
  397. data/lib/chef/resource/scm.rb +147 -0
  398. data/lib/chef/resource/script.rb +60 -0
  399. data/lib/chef/resource/service.rb +151 -0
  400. data/lib/chef/resource/solaris_package.rb +36 -0
  401. data/lib/chef/resource/subversion.rb +36 -0
  402. data/lib/chef/resource/template.rb +69 -0
  403. data/lib/chef/resource/timestamped_deploy.rb +31 -0
  404. data/lib/chef/resource/user.rb +130 -0
  405. data/lib/chef/resource/yum_package.rb +63 -0
  406. data/lib/chef/resource_collection.rb +217 -0
  407. data/lib/chef/resource_collection/stepable_iterator.rb +124 -0
  408. data/lib/chef/resource_definition.rb +67 -0
  409. data/lib/chef/resource_definition_list.rb +38 -0
  410. data/lib/chef/resources.rb +64 -0
  411. data/lib/chef/rest.rb +400 -0
  412. data/lib/chef/rest/auth_credentials.rb +71 -0
  413. data/lib/chef/rest/cookie_jar.rb +31 -0
  414. data/lib/chef/rest/rest_request.rb +213 -0
  415. data/lib/chef/role.rb +343 -0
  416. data/lib/chef/run_context.rb +126 -0
  417. data/lib/chef/run_list.rb +165 -0
  418. data/lib/chef/run_list/run_list_expansion.rb +193 -0
  419. data/lib/chef/run_list/run_list_item.rb +92 -0
  420. data/lib/chef/run_list/versioned_recipe_list.rb +68 -0
  421. data/lib/chef/run_status.rb +121 -0
  422. data/lib/chef/runner.rb +105 -0
  423. data/lib/chef/sandbox.rb +153 -0
  424. data/lib/chef/search/query.rb +65 -0
  425. data/lib/chef/shef.rb +327 -0
  426. data/lib/chef/shef/ext.rb +569 -0
  427. data/lib/chef/shef/model_wrapper.rb +120 -0
  428. data/lib/chef/shef/shef_rest.rb +28 -0
  429. data/lib/chef/shef/shef_session.rb +285 -0
  430. data/lib/chef/shell_out.rb +249 -0
  431. data/lib/chef/shell_out/unix.rb +223 -0
  432. data/lib/chef/shell_out/windows.rb +588 -0
  433. data/lib/chef/solr_query.rb +187 -0
  434. data/lib/chef/solr_query/lucene.treetop +150 -0
  435. data/lib/chef/solr_query/lucene_nodes.rb +285 -0
  436. data/lib/chef/solr_query/query_transform.rb +65 -0
  437. data/lib/chef/solr_query/solr_http_request.rb +132 -0
  438. data/lib/chef/streaming_cookbook_uploader.rb +201 -0
  439. data/lib/chef/tasks/chef_repo.rake +334 -0
  440. data/lib/chef/util/file_edit.rb +122 -0
  441. data/lib/chef/util/windows.rb +56 -0
  442. data/lib/chef/util/windows/net_group.rb +101 -0
  443. data/lib/chef/util/windows/net_use.rb +121 -0
  444. data/lib/chef/util/windows/net_user.rb +198 -0
  445. data/lib/chef/util/windows/volume.rb +59 -0
  446. data/lib/chef/version.rb +23 -0
  447. data/lib/chef/version_class.rb +70 -0
  448. data/lib/chef/version_constraint.rb +116 -0
  449. data/lib/chef/webui_user.rb +231 -0
  450. metadata +764 -0
@@ -0,0 +1,120 @@
1
+ #--
2
+ # Author:: Daniel DeLeo (<dan@opscode.com>)
3
+ # Copyright:: Copyright (c) 2010 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/mixin/convert_to_class_name'
20
+ require 'chef/mixin/language'
21
+
22
+ module Shef
23
+ class ModelWrapper
24
+
25
+ include Chef::Mixin::ConvertToClassName
26
+
27
+ attr_reader :model_symbol
28
+
29
+ def initialize(model_class, symbol=nil)
30
+ @model_class = model_class
31
+ @model_symbol = symbol || convert_to_snake_case(model_class.name, "Chef").to_sym
32
+ end
33
+
34
+ def search(query)
35
+ return all if query.to_s == "all"
36
+ results = []
37
+ Chef::Search::Query.new.search(@model_symbol, format_query(query)) do |obj|
38
+ if block_given?
39
+ results << yield(obj)
40
+ else
41
+ results << obj
42
+ end
43
+ end
44
+ results
45
+ end
46
+
47
+ alias :find :search
48
+
49
+ def all(&block)
50
+ all_objects = list_objects
51
+ block_given? ? all_objects.map(&block) : all_objects
52
+ end
53
+
54
+ alias :list :all
55
+
56
+ def show(obj_id)
57
+ @model_class.load(obj_id)
58
+ end
59
+
60
+ alias :load :show
61
+
62
+ def transform(what_to_transform, &block)
63
+ if what_to_transform == :all
64
+ objects_to_transform = list_objects
65
+ else
66
+ objects_to_transform = search(what_to_transform)
67
+ end
68
+ objects_to_transform.each do |obj|
69
+ if result = yield(obj)
70
+ obj.save
71
+ end
72
+ end
73
+ end
74
+
75
+ alias :bulk_edit :transform
76
+
77
+ private
78
+
79
+ # paper over inconsistencies in the model classes APIs, and return the objects
80
+ # the user wanted instead of the URI=>object stuff
81
+ def list_objects
82
+ objects = @model_class.method(:list).arity == 0? @model_class.list : @model_class.list(true)
83
+ objects.map { |obj| Array(obj).find {|o| o.kind_of?(@model_class)} }
84
+ end
85
+
86
+ def format_query(query)
87
+ if query.respond_to?(:keys)
88
+ query.map { |key, value| "#{key}:#{value}" }.join(" AND ")
89
+ else
90
+ query
91
+ end
92
+ end
93
+ end
94
+
95
+ class NamedDataBagWrapper < ModelWrapper
96
+
97
+ def initialize(databag_name)
98
+ @model_symbol = @databag_name = databag_name
99
+ end
100
+
101
+
102
+ alias :list :all
103
+
104
+ def show(item)
105
+ Chef::DataBagItem.load(@databag_name, item)
106
+ end
107
+
108
+ private
109
+
110
+ def list_objects
111
+ all_items = []
112
+ Chef::Search::Query.new.search(@databag_name) do |item|
113
+ all_items << item
114
+ end
115
+ all_items
116
+ end
117
+
118
+ end
119
+
120
+ end
@@ -0,0 +1,28 @@
1
+ #--
2
+ # Author:: Daniel DeLeo (<dan@opscode.com>)
3
+ # Copyright:: Copyright (c) 2010 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
+ module Shef
20
+ class ShefREST < Chef::REST
21
+
22
+ alias :get :get_rest
23
+ alias :put :put_rest
24
+ alias :post :post_rest
25
+ alias :delete :delete_rest
26
+
27
+ end
28
+ end
@@ -0,0 +1,285 @@
1
+ #--
2
+ # Author:: Daniel DeLeo (<dan@kallistec.com>)
3
+ # Author:: Tim Hinderliter (<tim@opscode.com>)
4
+ # Copyright:: Copyright (c) 2009 Daniel DeLeo
5
+ # Copyright:: Copyright (c) 2011 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/recipe'
22
+ require 'chef/run_context'
23
+ require 'chef/config'
24
+ require 'chef/client'
25
+ require 'chef/cookbook/cookbook_collection'
26
+ require 'chef/cookbook_loader'
27
+ require 'chef/run_list/run_list_expansion'
28
+
29
+ module Shef
30
+ class ShefSession
31
+ include Singleton
32
+
33
+ def self.session_type(type=nil)
34
+ @session_type = type if type
35
+ @session_type
36
+ end
37
+
38
+ attr_accessor :node, :compile, :recipe, :run_context
39
+ attr_reader :node_attributes, :client
40
+ def initialize
41
+ @node_built = false
42
+ end
43
+
44
+ def node_built?
45
+ !!@node_built
46
+ end
47
+
48
+ def reset!
49
+ loading do
50
+ rebuild_node
51
+ @node = client.node
52
+ shorten_node_inspect
53
+ Shef::Extensions.extend_context_node(@node)
54
+ rebuild_context
55
+ node.consume_attributes(node_attributes) if node_attributes
56
+ @recipe = Chef::Recipe.new(nil, nil, run_context)
57
+ Shef::Extensions.extend_context_recipe(@recipe)
58
+ @node_built = true
59
+ end
60
+ end
61
+
62
+ def node_attributes=(attrs)
63
+ @node_attributes = attrs
64
+ @node.consume_attributes(@node_attributes)
65
+ end
66
+
67
+ def resource_collection
68
+ run_context.resource_collection
69
+ end
70
+
71
+ def run_context
72
+ @run_context ||= rebuild_context
73
+ end
74
+
75
+ def definitions
76
+ nil
77
+ end
78
+
79
+ def cookbook_loader
80
+ nil
81
+ end
82
+
83
+ def save_node
84
+ raise "Not Supported! #{self.class.name} doesn't support #save_node, maybe you need to run shef in client mode?"
85
+ end
86
+
87
+ def rebuild_context
88
+ raise "Not Implemented! :rebuild_collection should be implemented by subclasses"
89
+ end
90
+
91
+ private
92
+
93
+ def loading
94
+ show_loading_progress
95
+ begin
96
+ yield
97
+ rescue => e
98
+ loading_complete(false)
99
+ raise e
100
+ else
101
+ loading_complete(true)
102
+ end
103
+ end
104
+
105
+ def show_loading_progress
106
+ print "Loading"
107
+ @loading = true
108
+ @dot_printer = Thread.new do
109
+ while @loading
110
+ print "."
111
+ sleep 0.5
112
+ end
113
+ end
114
+ end
115
+
116
+ def loading_complete(success)
117
+ @loading = false
118
+ @dot_printer.join
119
+ msg = success ? "done.\n\n" : "epic fail!\n\n"
120
+ print msg
121
+ end
122
+
123
+ def shorten_node_inspect
124
+ def @node.inspect
125
+ "<Chef::Node:0x#{self.object_id.to_s(16)} @name=\"#{self.name}\">"
126
+ end
127
+ end
128
+
129
+ def rebuild_node
130
+ raise "Not Implemented! :rebuild_node should be implemented by subclasses"
131
+ end
132
+
133
+ end
134
+
135
+ class StandAloneSession < ShefSession
136
+
137
+ session_type :standalone
138
+
139
+ def rebuild_context
140
+ @run_context = Chef::RunContext.new(@node, {}) # no recipes
141
+ @run_context.load(Chef::RunList::RunListExpansionFromDisk.new("_default", [])) # empty recipe list
142
+ end
143
+
144
+ private
145
+
146
+ def rebuild_node
147
+ Chef::Config[:solo] = true
148
+ @client = Chef::Client.new
149
+ @client.run_ohai
150
+ @client.build_node
151
+ end
152
+
153
+ end
154
+
155
+ class SoloSession < ShefSession
156
+
157
+ session_type :solo
158
+
159
+ def definitions
160
+ @run_context.definitions
161
+ end
162
+
163
+ def rebuild_context
164
+ @run_status = Chef::RunStatus.new(@node)
165
+ Chef::Cookbook::FileVendor.on_create { |manifest| Chef::Cookbook::FileSystemFileVendor.new(manifest, Chef::Config[:cookbook_path]) }
166
+ @run_context = Chef::RunContext.new(@node, Chef::CookbookCollection.new(Chef::CookbookLoader.new(Chef::Config[:cookbook_path])))
167
+ @run_context.load(Chef::RunList::RunListExpansionFromDisk.new("_default", []))
168
+ @run_status.run_context = run_context
169
+ end
170
+
171
+ private
172
+
173
+ def rebuild_node
174
+ # Tell the client we're chef solo so it won't try to contact the server
175
+ Chef::Config[:solo] = true
176
+ @client = Chef::Client.new
177
+ @client.run_ohai
178
+ @client.build_node
179
+ end
180
+
181
+ end
182
+
183
+ class ClientSession < SoloSession
184
+
185
+ session_type :client
186
+
187
+ def save_node
188
+ @client.save_node
189
+ end
190
+
191
+ def rebuild_context
192
+ @run_status = Chef::RunStatus.new(@node)
193
+ Chef::Cookbook::FileVendor.on_create { |manifest| Chef::Cookbook::RemoteFileVendor.new(manifest, Chef::REST.new(Chef::Config[:server_url])) }
194
+ cookbook_hash = @client.sync_cookbooks
195
+ @run_context = Chef::RunContext.new(node, Chef::CookbookCollection.new(cookbook_hash))
196
+ @run_context.load(Chef::RunList::RunListExpansionFromAPI.new("_default", []))
197
+ @run_status.run_context = run_context
198
+ end
199
+
200
+ private
201
+
202
+ def rebuild_node
203
+ # Make sure the client knows this is not chef solo
204
+ Chef::Config[:solo] = false
205
+ @client = Chef::Client.new
206
+ @client.run_ohai
207
+ @client.register
208
+ @client.build_node
209
+ end
210
+
211
+ end
212
+
213
+ class DoppelGangerClient < Chef::Client
214
+
215
+ attr_reader :node_name
216
+
217
+ def initialize(node_name)
218
+ @node_name = node_name
219
+ @ohai = Ohai::System.new
220
+ end
221
+
222
+ # Run the very smallest amount of ohai we can get away with and still
223
+ # hope to have things work. Otherwise we're not very good doppelgangers
224
+ def run_ohai
225
+ @ohai.require_plugin('os')
226
+ end
227
+
228
+ # DoppelGanger implementation of build_node. preserves as many of the node's
229
+ # attributes, and does not save updates to the server
230
+ def build_node
231
+ Chef::Log.debug("Building node object for #{@node_name}")
232
+
233
+ @node = Chef::Node.find_or_create(node_name)
234
+
235
+ ohai_data = @ohai.data.merge(@node.automatic_attrs)
236
+
237
+ @node.consume_external_attrs(ohai_data,nil)
238
+
239
+ @node
240
+ end
241
+
242
+ def register
243
+ @rest = Chef::REST.new(Chef::Config[:chef_server_url], Chef::Config[:node_name], Chef::Config[:client_key])
244
+ end
245
+
246
+ end
247
+
248
+ class DoppelGangerSession < ClientSession
249
+
250
+ session_type "doppelganger client"
251
+
252
+ def save_node
253
+ puts "A doppelganger should think twice before saving the node"
254
+ end
255
+
256
+ def assume_identity(node_name)
257
+ Chef::Config[:doppelganger] = @node_name = node_name
258
+ reset!
259
+ rescue Exception => e
260
+ puts "#{e.class.name}: #{e.message}"
261
+ puts Array(e.backtrace).join("\n")
262
+ puts
263
+ puts "* " * 40
264
+ puts "failed to assume the identity of node '#{node_name}', resetting"
265
+ puts "* " * 40
266
+ puts
267
+ Chef::Config[:doppelganger] = false
268
+ @node_built = false
269
+ Shef.session
270
+ end
271
+
272
+ def rebuild_node
273
+ # Make sure the client knows this is not chef solo
274
+ Chef::Config[:solo] = false
275
+ @client = DoppelGangerClient.new(@node_name)
276
+ @client.run_ohai
277
+ @client.register
278
+ @client.build_node
279
+
280
+ @client.sync_cookbooks
281
+ end
282
+
283
+ end
284
+
285
+ end
@@ -0,0 +1,249 @@
1
+ #--
2
+ # Author:: Daniel DeLeo (<dan@opscode.com>)
3
+ # Copyright:: Copyright (c) 2010 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 'etc'
20
+ require 'tmpdir'
21
+ require 'chef/log'
22
+ require 'fcntl'
23
+ require 'chef/exceptions'
24
+
25
+ class Chef
26
+
27
+ # == Chef::ShellOut
28
+ # Provides a simplified interface to shelling out yet still collecting both
29
+ # standard out and standard error and providing full control over environment,
30
+ # working directory, uid, gid, etc.
31
+ #
32
+ # No means for passing input to the subprocess is provided, nor is there any
33
+ # way to inspect the output of the command as it is being read. If you need
34
+ # to do that, you have to use popen4 (in Chef::Mixin::Command)
35
+ #
36
+ # === Platform Support
37
+ # Chef::ShellOut uses Kernel.fork() and is therefore unsuitable for Windows
38
+ # or jruby.
39
+ class ShellOut
40
+ READ_WAIT_TIME = 0.01
41
+ READ_SIZE = 4096
42
+ DEFAULT_READ_TIMEOUT = 600
43
+ DEFAULT_ENVIRONMENT = {'LC_ALL' => 'C'}
44
+
45
+ if RUBY_PLATFORM =~ /mswin|mingw32|windows/
46
+ require 'chef/shell_out/windows'
47
+ include ShellOut::Windows
48
+ else
49
+ require 'chef/shell_out/unix'
50
+ include ShellOut::Unix
51
+ end
52
+
53
+ attr_accessor :user
54
+ attr_accessor :group
55
+ attr_accessor :cwd
56
+ attr_accessor :valid_exit_codes
57
+ attr_accessor :live_stream
58
+ attr_accessor :command_log_level
59
+ attr_accessor :command_log_prepend
60
+
61
+ attr_reader :command, :umask, :environment
62
+ attr_writer :timeout
63
+ attr_reader :execution_time
64
+
65
+ attr_reader :stdout, :stderr, :status
66
+
67
+ attr_reader :stdin_pipe, :stdout_pipe, :stderr_pipe, :process_status_pipe
68
+
69
+ # === Arguments:
70
+ # Takes a single command, or a list of command fragments. These are used
71
+ # as arguments to Kernel.exec. See the Kernel.exec documentation for more
72
+ # explanation of how arguments are evaluated. The last argument can be an
73
+ # options Hash.
74
+ # === Options:
75
+ # If the last argument is a Hash, it is removed from the list of args passed
76
+ # to exec and used as an options hash. The following options are available:
77
+ # * +user+: the user the commmand should run as. if an integer is given, it is
78
+ # used as a uid. A string is treated as a username and resolved to a uid
79
+ # with Etc.getpwnam
80
+ # * +group+: the group the command should run as. works similarly to +user+
81
+ # * +cwd+: the directory to chdir to before running the command
82
+ # * +umask+: a umask to set before running the command. If given as an Integer,
83
+ # be sure to use two leading zeros so it's parsed as Octal. A string will
84
+ # be treated as an octal integer
85
+ # * +returns+: one or more Integer values to use as valid exit codes for the
86
+ # subprocess. This only has an effect if you call +error!+ after
87
+ # +run_command+.
88
+ # * +environment+: a Hash of environment variables to set before the command
89
+ # is run. By default, the environment will *always* be set to 'LC_ALL' => 'C'
90
+ # to prevent issues with multibyte characters in Ruby 1.8. To avoid this,
91
+ # use :environment => nil for *no* extra environment settings, or
92
+ # :environment => {'LC_ALL'=>nil, ...} to set other environment settings
93
+ # without changing the locale.
94
+ # * +timeout+: a Numeric value for the number of seconds to wait on the
95
+ # child process before raising an Exception. This is calculated as the
96
+ # total amount of time that ShellOut waited on the child process without
97
+ # receiving any output (i.e., IO.select returned nil). Default is 60
98
+ # seconds. Note: the stdlib Timeout library is not used.
99
+ # === Examples:
100
+ # Invoke find(1) to search for .rb files:
101
+ # find = Chef::ShellOut.new("find . -name '*.rb'")
102
+ # find.run_command
103
+ # # If all went well, the results are on +stdout+
104
+ # puts find.stdout
105
+ # # find(1) prints diagnostic info to STDERR:
106
+ # puts "error messages" + find.stderr
107
+ # # Raise an exception if it didn't exit with 0
108
+ # find.error!
109
+ # Run a command as the +www+ user with no extra ENV settings from +/tmp+
110
+ # cmd = Chef::ShellOut.new("apachectl", "start", :user => 'www', :env => nil, :cwd => '/tmp')
111
+ # cmd.run_command # etc.
112
+ def initialize(*command_args)
113
+ @stdout, @stderr = '', ''
114
+ @live_stream = nil
115
+ @command_log_level = :debug
116
+ @command_log_prepend = nil
117
+ @environment = DEFAULT_ENVIRONMENT
118
+ @cwd = nil
119
+ @valid_exit_codes = [0]
120
+
121
+ if command_args.last.is_a?(Hash)
122
+ parse_options(command_args.pop)
123
+ end
124
+
125
+ @command = command_args.size == 1 ? command_args.first : command_args
126
+ end
127
+
128
+ def umask=(new_umask)
129
+ @umask = (new_umask.respond_to?(:oct) ? new_umask.oct : new_umask.to_i) & 007777
130
+ end
131
+
132
+ def uid
133
+ return nil unless user
134
+ user.kind_of?(Integer) ? user : Etc.getpwnam(user.to_s).uid
135
+ end
136
+
137
+ def gid
138
+ return nil unless group
139
+ group.kind_of?(Integer) ? group : Etc.getgrnam(group.to_s).gid
140
+ end
141
+
142
+ def timeout
143
+ @timeout || DEFAULT_READ_TIMEOUT
144
+ end
145
+
146
+ # Creates a String showing the output of the command, including a banner
147
+ # showing the exact command executed. Used by +invalid!+ to show command
148
+ # results when the command exited with an unexpected status.
149
+ def format_for_exception
150
+ msg = ""
151
+ msg << "---- Begin output of #{command} ----\n"
152
+ msg << "STDOUT: #{stdout.strip}\n"
153
+ msg << "STDERR: #{stderr.strip}\n"
154
+ msg << "---- End output of #{command} ----\n"
155
+ msg << "Ran #{command} returned #{status.exitstatus}" if status
156
+ msg
157
+ end
158
+
159
+ def exitstatus
160
+ @status && @status.exitstatus
161
+ end
162
+
163
+ # Run the command, writing the command's standard out and standard error
164
+ # to +stdout+ and +stderr+, and saving its exit status object to +status+
165
+ # === Returns
166
+ # returns +self+; +stdout+, +stderr+, +status+, and +exitstatus+ will be
167
+ # populated with results of the command
168
+ # === Raises
169
+ # * Errno::EACCES when you are not privileged to execute the command
170
+ # * Errno::ENOENT when the command is not available on the system (or not
171
+ # in the current $PATH)
172
+ # * Chef::Exceptions::CommandTimeout when the command does not complete
173
+ # within +timeout+ seconds (default: 60s)
174
+ def run_command
175
+ if command_log_prepend
176
+ Chef::Log.send(command_log_level, "#{command_log_prepend} sh(#{@command})")
177
+ else
178
+ Chef::Log.send(command_log_level, "sh(#{@command})")
179
+ end
180
+ super
181
+ end
182
+
183
+ # Checks the +exitstatus+ against the set of +valid_exit_codes+. If
184
+ # +exitstatus+ is not in the list of +valid_exit_codes+, calls +invalid!+,
185
+ # which raises an Exception.
186
+ # === Returns
187
+ # nil::: always returns nil when it does not raise
188
+ # === Raises
189
+ # Chef::Exceptions::ShellCommandFailed::: via +invalid!+
190
+ def error!
191
+ unless Array(valid_exit_codes).include?(exitstatus)
192
+ invalid!("Expected process to exit with #{valid_exit_codes.inspect}, but received '#{exitstatus}'")
193
+ end
194
+ end
195
+
196
+ # Raises a Chef::Exceptions::ShellCommandFailed exception, appending the
197
+ # command's stdout, stderr, and exitstatus to the exception message.
198
+ # === Arguments
199
+ # +msg+: A String to use as the basis of the exception message. The
200
+ # default explanation is very generic, providing a more informative message
201
+ # is highly encouraged.
202
+ # === Raises
203
+ # Chef::Exceptions::ShellCommandFailed always
204
+ def invalid!(msg=nil)
205
+ msg ||= "Command produced unexpected results"
206
+ raise Chef::Exceptions::ShellCommandFailed, msg + "\n" + format_for_exception
207
+ end
208
+
209
+ def inspect
210
+ "<#{self.class.name}##{object_id}: command: '#@command' process_status: #{@status.inspect} " +
211
+ "stdout: '#{stdout.strip}' stderr: '#{stderr.strip}' child_pid: #{@child_pid.inspect} " +
212
+ "environment: #{@environment.inspect} timeout: #{timeout} user: #@user group: #@group working_dir: #@cwd >"
213
+ end
214
+
215
+ private
216
+
217
+ def parse_options(opts)
218
+ opts.each do |option, setting|
219
+ case option.to_s
220
+ when 'cwd'
221
+ self.cwd = setting
222
+ when 'user'
223
+ self.user = setting
224
+ when 'group'
225
+ self.group = setting
226
+ when 'umask'
227
+ self.umask = setting
228
+ when 'timeout'
229
+ self.timeout = setting
230
+ when 'returns'
231
+ self.valid_exit_codes = Array(setting)
232
+ when 'live_stream'
233
+ self.live_stream = setting
234
+ when 'command_log_level'
235
+ self.command_log_level = setting
236
+ when 'command_log_prepend'
237
+ self.command_log_prepend = setting
238
+ when 'environment', 'env'
239
+ # passing :environment => nil means don't set any new ENV vars
240
+ @environment = setting.nil? ? {} : @environment.dup.merge!(setting)
241
+ else
242
+ raise Chef::Exceptions::InvalidCommandOption, "option '#{option.inspect}' is not a valid option for #{self.class.name}"
243
+ end
244
+ end
245
+ end
246
+
247
+
248
+ end
249
+ end