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.
- data/LICENSE +201 -0
- data/README.rdoc +171 -0
- data/bin/chef-client +26 -0
- data/bin/chef-solo +25 -0
- data/bin/knife +26 -0
- data/bin/shef +34 -0
- data/distro/README +2 -0
- data/distro/arch/etc/conf.d/chef-client.conf +5 -0
- data/distro/arch/etc/conf.d/chef-expander.conf +8 -0
- data/distro/arch/etc/conf.d/chef-server-webui.conf +10 -0
- data/distro/arch/etc/conf.d/chef-server.conf +10 -0
- data/distro/arch/etc/conf.d/chef-solr.conf +8 -0
- data/distro/arch/etc/rc.d/chef-client +76 -0
- data/distro/arch/etc/rc.d/chef-expander +78 -0
- data/distro/arch/etc/rc.d/chef-server +78 -0
- data/distro/arch/etc/rc.d/chef-server-webui +78 -0
- data/distro/arch/etc/rc.d/chef-solr +78 -0
- data/distro/common/html/chef-client.8.html +146 -0
- data/distro/common/html/chef-expander.8.html +164 -0
- data/distro/common/html/chef-expanderctl.8.html +146 -0
- data/distro/common/html/chef-server-webui.8.html +185 -0
- data/distro/common/html/chef-server.8.html +182 -0
- data/distro/common/html/chef-solo.8.html +191 -0
- data/distro/common/html/chef-solr.8.html +165 -0
- data/distro/common/html/knife-bootstrap.1.html +243 -0
- data/distro/common/html/knife-client.1.html +219 -0
- data/distro/common/html/knife-configure.1.html +170 -0
- data/distro/common/html/knife-cookbook-site.1.html +241 -0
- data/distro/common/html/knife-cookbook.1.html +384 -0
- data/distro/common/html/knife-data-bag.1.html +234 -0
- data/distro/common/html/knife-environment.1.html +267 -0
- data/distro/common/html/knife-exec.1.html +134 -0
- data/distro/common/html/knife-index.1.html +125 -0
- data/distro/common/html/knife-node.1.html +250 -0
- data/distro/common/html/knife-recipe.1.html +92 -0
- data/distro/common/html/knife-role.1.html +200 -0
- data/distro/common/html/knife-search.1.html +288 -0
- data/distro/common/html/knife-ssh.1.html +157 -0
- data/distro/common/html/knife-status.1.html +128 -0
- data/distro/common/html/knife-tag.1.html +137 -0
- data/distro/common/html/knife.1.html +321 -0
- data/distro/common/html/shef.1.html +283 -0
- data/distro/common/man/man1/knife-bootstrap.1 +197 -0
- data/distro/common/man/man1/knife-client.1 +99 -0
- data/distro/common/man/man1/knife-configure.1 +88 -0
- data/distro/common/man/man1/knife-cookbook-site.1 +145 -0
- data/distro/common/man/man1/knife-cookbook.1 +345 -0
- data/distro/common/man/man1/knife-data-bag.1 +130 -0
- data/distro/common/man/man1/knife-environment.1 +178 -0
- data/distro/common/man/man1/knife-exec.1 +46 -0
- data/distro/common/man/man1/knife-index.1 +29 -0
- data/distro/common/man/man1/knife-node.1 +134 -0
- data/distro/common/man/man1/knife-role.1 +88 -0
- data/distro/common/man/man1/knife-search.1 +280 -0
- data/distro/common/man/man1/knife-ssh.1 +83 -0
- data/distro/common/man/man1/knife-status.1 +29 -0
- data/distro/common/man/man1/knife-tag.1 +43 -0
- data/distro/common/man/man1/knife.1 +292 -0
- data/distro/common/man/man1/shef.1 +256 -0
- data/distro/common/man/man8/chef-client.8 +104 -0
- data/distro/common/man/man8/chef-expander.8 +97 -0
- data/distro/common/man/man8/chef-expanderctl.8 +62 -0
- data/distro/common/man/man8/chef-server-webui.8 +155 -0
- data/distro/common/man/man8/chef-server.8 +147 -0
- data/distro/common/man/man8/chef-solo.8 +158 -0
- data/distro/common/man/man8/chef-solr.8 +122 -0
- data/distro/common/markdown/README +3 -0
- data/distro/common/markdown/man1/knife-bootstrap.mkd +142 -0
- data/distro/common/markdown/man1/knife-client.mkd +103 -0
- data/distro/common/markdown/man1/knife-configure.mkd +70 -0
- data/distro/common/markdown/man1/knife-cookbook-site.mkd +123 -0
- data/distro/common/markdown/man1/knife-cookbook.mkd +263 -0
- data/distro/common/markdown/man1/knife-data-bag.mkd +117 -0
- data/distro/common/markdown/man1/knife-environment.mkd +151 -0
- data/distro/common/markdown/man1/knife-exec.mkd +37 -0
- data/distro/common/markdown/man1/knife-index.mkd +30 -0
- data/distro/common/markdown/man1/knife-node.mkd +130 -0
- data/distro/common/markdown/man1/knife-role.mkd +85 -0
- data/distro/common/markdown/man1/knife-search.mkd +180 -0
- data/distro/common/markdown/man1/knife-ssh.mkd +72 -0
- data/distro/common/markdown/man1/knife-status.mkd +36 -0
- data/distro/common/markdown/man1/knife-tag.mkd +39 -0
- data/distro/common/markdown/man1/knife.mkd +220 -0
- data/distro/common/markdown/man1/shef.mkd +189 -0
- data/distro/common/markdown/man8/chef-client.mkd +75 -0
- data/distro/common/markdown/man8/chef-expander.mkd +82 -0
- data/distro/common/markdown/man8/chef-expanderctl.mkd +58 -0
- data/distro/common/markdown/man8/chef-server-webui.mkd +121 -0
- data/distro/common/markdown/man8/chef-server.mkd +121 -0
- data/distro/common/markdown/man8/chef-solo.mkd +107 -0
- data/distro/common/markdown/man8/chef-solr.mkd +89 -0
- data/distro/debian/etc/default/chef-client +4 -0
- data/distro/debian/etc/default/chef-expander +8 -0
- data/distro/debian/etc/default/chef-server +9 -0
- data/distro/debian/etc/default/chef-server-webui +9 -0
- data/distro/debian/etc/default/chef-solr +8 -0
- data/distro/debian/etc/init.d/chef-client +185 -0
- data/distro/debian/etc/init.d/chef-expander +176 -0
- data/distro/debian/etc/init.d/chef-server +122 -0
- data/distro/debian/etc/init.d/chef-server-webui +123 -0
- data/distro/debian/etc/init.d/chef-solr +176 -0
- data/distro/debian/etc/init/chef-client.conf +17 -0
- data/distro/debian/etc/init/chef-expander.conf +17 -0
- data/distro/debian/etc/init/chef-server-webui.conf +17 -0
- data/distro/debian/etc/init/chef-server.conf +17 -0
- data/distro/debian/etc/init/chef-solr.conf +17 -0
- data/distro/redhat/etc/init.d/chef-client +110 -0
- data/distro/redhat/etc/init.d/chef-expander +104 -0
- data/distro/redhat/etc/init.d/chef-server +112 -0
- data/distro/redhat/etc/init.d/chef-server-webui +112 -0
- data/distro/redhat/etc/init.d/chef-solr +104 -0
- data/distro/redhat/etc/logrotate.d/chef-client +8 -0
- data/distro/redhat/etc/logrotate.d/chef-expander +8 -0
- data/distro/redhat/etc/logrotate.d/chef-server +8 -0
- data/distro/redhat/etc/logrotate.d/chef-server-webui +8 -0
- data/distro/redhat/etc/logrotate.d/chef-solr +8 -0
- data/distro/redhat/etc/sysconfig/chef-client +15 -0
- data/distro/redhat/etc/sysconfig/chef-expander +7 -0
- data/distro/redhat/etc/sysconfig/chef-server +14 -0
- data/distro/redhat/etc/sysconfig/chef-server-webui +14 -0
- data/distro/redhat/etc/sysconfig/chef-solr +8 -0
- data/lib/chef.rb +41 -0
- data/lib/chef/api_client.rb +271 -0
- data/lib/chef/application.rb +152 -0
- data/lib/chef/application/agent.rb +18 -0
- data/lib/chef/application/client.rb +285 -0
- data/lib/chef/application/knife.rb +188 -0
- data/lib/chef/application/solo.rb +218 -0
- data/lib/chef/applications.rb +4 -0
- data/lib/chef/certificate.rb +194 -0
- data/lib/chef/checksum.rb +167 -0
- data/lib/chef/checksum/storage.rb +18 -0
- data/lib/chef/checksum/storage/filesystem.rb +56 -0
- data/lib/chef/checksum_cache.rb +189 -0
- data/lib/chef/client.rb +366 -0
- data/lib/chef/config.rb +248 -0
- data/lib/chef/cookbook/chefignore.rb +66 -0
- data/lib/chef/cookbook/cookbook_collection.rb +45 -0
- data/lib/chef/cookbook/cookbook_version_loader.rb +173 -0
- data/lib/chef/cookbook/file_system_file_vendor.rb +56 -0
- data/lib/chef/cookbook/file_vendor.rb +48 -0
- data/lib/chef/cookbook/metadata.rb +629 -0
- data/lib/chef/cookbook/remote_file_vendor.rb +88 -0
- data/lib/chef/cookbook/syntax_check.rb +136 -0
- data/lib/chef/cookbook_loader.rb +121 -0
- data/lib/chef/cookbook_site_streaming_uploader.rb +244 -0
- data/lib/chef/cookbook_uploader.rb +154 -0
- data/lib/chef/cookbook_version.rb +1096 -0
- data/lib/chef/cookbook_version_selector.rb +168 -0
- data/lib/chef/couchdb.rb +246 -0
- data/lib/chef/daemon.rb +172 -0
- data/lib/chef/data_bag.rb +235 -0
- data/lib/chef/data_bag_item.rb +273 -0
- data/lib/chef/encrypted_data_bag_item.rb +139 -0
- data/lib/chef/environment.rb +455 -0
- data/lib/chef/exceptions.rb +154 -0
- data/lib/chef/file_access_control.rb +144 -0
- data/lib/chef/file_cache.rb +218 -0
- data/lib/chef/handler.rb +227 -0
- data/lib/chef/handler/error_report.rb +33 -0
- data/lib/chef/handler/json_file.rb +58 -0
- data/lib/chef/index_queue.rb +29 -0
- data/lib/chef/index_queue/amqp_client.rb +116 -0
- data/lib/chef/index_queue/consumer.rb +76 -0
- data/lib/chef/index_queue/indexable.rb +109 -0
- data/lib/chef/json_compat.rb +52 -0
- data/lib/chef/knife.rb +520 -0
- data/lib/chef/knife/bootstrap.rb +207 -0
- data/lib/chef/knife/bootstrap/archlinux-gems.erb +60 -0
- data/lib/chef/knife/bootstrap/centos5-gems.erb +56 -0
- data/lib/chef/knife/bootstrap/fedora13-gems.erb +43 -0
- data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +49 -0
- data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +50 -0
- data/lib/chef/knife/client_bulk_delete.rb +65 -0
- data/lib/chef/knife/client_create.rb +79 -0
- data/lib/chef/knife/client_delete.rb +46 -0
- data/lib/chef/knife/client_edit.rb +45 -0
- data/lib/chef/knife/client_list.rb +42 -0
- data/lib/chef/knife/client_reregister.rb +58 -0
- data/lib/chef/knife/client_show.rb +52 -0
- data/lib/chef/knife/configure.rb +149 -0
- data/lib/chef/knife/configure_client.rb +50 -0
- data/lib/chef/knife/cookbook_bulk_delete.rb +72 -0
- data/lib/chef/knife/cookbook_create.rb +274 -0
- data/lib/chef/knife/cookbook_delete.rb +151 -0
- data/lib/chef/knife/cookbook_download.rb +137 -0
- data/lib/chef/knife/cookbook_list.rb +47 -0
- data/lib/chef/knife/cookbook_metadata.rb +107 -0
- data/lib/chef/knife/cookbook_metadata_from_file.rb +44 -0
- data/lib/chef/knife/cookbook_show.rb +102 -0
- data/lib/chef/knife/cookbook_site_download.rb +70 -0
- data/lib/chef/knife/cookbook_site_install.rb +148 -0
- data/lib/chef/knife/cookbook_site_list.rb +62 -0
- data/lib/chef/knife/cookbook_site_search.rb +51 -0
- data/lib/chef/knife/cookbook_site_share.rb +114 -0
- data/lib/chef/knife/cookbook_site_show.rb +57 -0
- data/lib/chef/knife/cookbook_site_unshare.rb +56 -0
- data/lib/chef/knife/cookbook_site_vendor.rb +46 -0
- data/lib/chef/knife/cookbook_test.rb +93 -0
- data/lib/chef/knife/cookbook_upload.rb +240 -0
- data/lib/chef/knife/core/bootstrap_context.rb +100 -0
- data/lib/chef/knife/core/cookbook_scm_repo.rb +148 -0
- data/lib/chef/knife/core/generic_presenter.rb +191 -0
- data/lib/chef/knife/core/node_editor.rb +127 -0
- data/lib/chef/knife/core/node_presenter.rb +136 -0
- data/lib/chef/knife/core/object_loader.rb +75 -0
- data/lib/chef/knife/core/subcommand_loader.rb +112 -0
- data/lib/chef/knife/core/text_formatter.rb +100 -0
- data/lib/chef/knife/core/ui.rb +216 -0
- data/lib/chef/knife/data_bag_create.rb +93 -0
- data/lib/chef/knife/data_bag_delete.rb +51 -0
- data/lib/chef/knife/data_bag_edit.rb +94 -0
- data/lib/chef/knife/data_bag_from_file.rb +87 -0
- data/lib/chef/knife/data_bag_list.rb +46 -0
- data/lib/chef/knife/data_bag_show.rb +81 -0
- data/lib/chef/knife/environment_create.rb +53 -0
- data/lib/chef/knife/environment_delete.rb +45 -0
- data/lib/chef/knife/environment_edit.rb +45 -0
- data/lib/chef/knife/environment_from_file.rb +50 -0
- data/lib/chef/knife/environment_list.rb +42 -0
- data/lib/chef/knife/environment_show.rb +46 -0
- data/lib/chef/knife/exec.rb +51 -0
- data/lib/chef/knife/help.rb +103 -0
- data/lib/chef/knife/help_topics.rb +4 -0
- data/lib/chef/knife/index_rebuild.rb +50 -0
- data/lib/chef/knife/node_bulk_delete.rb +80 -0
- data/lib/chef/knife/node_create.rb +50 -0
- data/lib/chef/knife/node_delete.rb +47 -0
- data/lib/chef/knife/node_edit.rb +72 -0
- data/lib/chef/knife/node_from_file.rb +50 -0
- data/lib/chef/knife/node_list.rb +46 -0
- data/lib/chef/knife/node_run_list_add.rb +67 -0
- data/lib/chef/knife/node_run_list_remove.rb +48 -0
- data/lib/chef/knife/node_show.rb +73 -0
- data/lib/chef/knife/recipe_list.rb +32 -0
- data/lib/chef/knife/role_bulk_delete.rb +70 -0
- data/lib/chef/knife/role_create.rb +55 -0
- data/lib/chef/knife/role_delete.rb +47 -0
- data/lib/chef/knife/role_edit.rb +48 -0
- data/lib/chef/knife/role_from_file.rb +56 -0
- data/lib/chef/knife/role_list.rb +43 -0
- data/lib/chef/knife/role_show.rb +54 -0
- data/lib/chef/knife/search.rb +141 -0
- data/lib/chef/knife/ssh.rb +367 -0
- data/lib/chef/knife/status.rb +104 -0
- data/lib/chef/knife/tag_create.rb +52 -0
- data/lib/chef/knife/tag_delete.rb +60 -0
- data/lib/chef/knife/tag_list.rb +47 -0
- data/lib/chef/log.rb +39 -0
- data/lib/chef/mash.rb +211 -0
- data/lib/chef/mixin/check_helper.rb +31 -0
- data/lib/chef/mixin/checksum.rb +32 -0
- data/lib/chef/mixin/command.rb +163 -0
- data/lib/chef/mixin/command/unix.rb +215 -0
- data/lib/chef/mixin/command/windows.rb +76 -0
- data/lib/chef/mixin/convert_to_class_name.rb +63 -0
- data/lib/chef/mixin/create_path.rb +57 -0
- data/lib/chef/mixin/deep_merge.rb +225 -0
- data/lib/chef/mixin/deprecation.rb +65 -0
- data/lib/chef/mixin/from_file.rb +50 -0
- data/lib/chef/mixin/get_source_from_package.rb +42 -0
- data/lib/chef/mixin/language.rb +163 -0
- data/lib/chef/mixin/language_include_attribute.rb +61 -0
- data/lib/chef/mixin/language_include_recipe.rb +52 -0
- data/lib/chef/mixin/params_validate.rb +225 -0
- data/lib/chef/mixin/recipe_definition_dsl_core.rb +78 -0
- data/lib/chef/mixin/shell_out.rb +41 -0
- data/lib/chef/mixin/template.rb +95 -0
- data/lib/chef/mixin/xml_escape.rb +140 -0
- data/lib/chef/mixins.rb +15 -0
- data/lib/chef/monkey_patches/dir.rb +36 -0
- data/lib/chef/monkey_patches/numeric.rb +15 -0
- data/lib/chef/monkey_patches/object.rb +9 -0
- data/lib/chef/monkey_patches/regexp.rb +34 -0
- data/lib/chef/monkey_patches/string.rb +49 -0
- data/lib/chef/monkey_patches/tempfile.rb +64 -0
- data/lib/chef/nil_argument.rb +3 -0
- data/lib/chef/node.rb +677 -0
- data/lib/chef/node/attribute.rb +487 -0
- data/lib/chef/openid_registration.rb +187 -0
- data/lib/chef/platform.rb +434 -0
- data/lib/chef/provider.rb +124 -0
- data/lib/chef/provider/breakpoint.rb +36 -0
- data/lib/chef/provider/cookbook_file.rb +100 -0
- data/lib/chef/provider/cron.rb +186 -0
- data/lib/chef/provider/cron/solaris.rb +195 -0
- data/lib/chef/provider/deploy.rb +418 -0
- data/lib/chef/provider/deploy/revision.rb +80 -0
- data/lib/chef/provider/deploy/timestamped.rb +33 -0
- data/lib/chef/provider/directory.rb +72 -0
- data/lib/chef/provider/env.rb +152 -0
- data/lib/chef/provider/env/windows.rb +75 -0
- data/lib/chef/provider/erl_call.rb +101 -0
- data/lib/chef/provider/execute.rb +65 -0
- data/lib/chef/provider/file.rb +226 -0
- data/lib/chef/provider/git.rb +243 -0
- data/lib/chef/provider/group.rb +133 -0
- data/lib/chef/provider/group/aix.rb +70 -0
- data/lib/chef/provider/group/dscl.rb +121 -0
- data/lib/chef/provider/group/gpasswd.rb +53 -0
- data/lib/chef/provider/group/groupadd.rb +91 -0
- data/lib/chef/provider/group/pw.rb +84 -0
- data/lib/chef/provider/group/suse.rb +53 -0
- data/lib/chef/provider/group/usermod.rb +57 -0
- data/lib/chef/provider/group/windows.rb +79 -0
- data/lib/chef/provider/http_request.rb +122 -0
- data/lib/chef/provider/ifconfig.rb +195 -0
- data/lib/chef/provider/link.rb +164 -0
- data/lib/chef/provider/log.rb +54 -0
- data/lib/chef/provider/mdadm.rb +91 -0
- data/lib/chef/provider/mount.rb +114 -0
- data/lib/chef/provider/mount/mount.rb +240 -0
- data/lib/chef/provider/mount/windows.rb +81 -0
- data/lib/chef/provider/ohai.rb +42 -0
- data/lib/chef/provider/package.rb +200 -0
- data/lib/chef/provider/package/apt.rb +145 -0
- data/lib/chef/provider/package/dpkg.rb +115 -0
- data/lib/chef/provider/package/easy_install.rb +136 -0
- data/lib/chef/provider/package/freebsd.rb +125 -0
- data/lib/chef/provider/package/macports.rb +105 -0
- data/lib/chef/provider/package/pacman.rb +101 -0
- data/lib/chef/provider/package/portage.rb +135 -0
- data/lib/chef/provider/package/rpm.rb +104 -0
- data/lib/chef/provider/package/rubygems.rb +465 -0
- data/lib/chef/provider/package/solaris.rb +130 -0
- data/lib/chef/provider/package/yum-dump.py +286 -0
- data/lib/chef/provider/package/yum.rb +1173 -0
- data/lib/chef/provider/package/zypper.rb +144 -0
- data/lib/chef/provider/remote_directory.rb +137 -0
- data/lib/chef/provider/remote_file.rb +118 -0
- data/lib/chef/provider/route.rb +193 -0
- data/lib/chef/provider/ruby_block.rb +34 -0
- data/lib/chef/provider/script.rb +55 -0
- data/lib/chef/provider/service.rb +122 -0
- data/lib/chef/provider/service/arch.rb +116 -0
- data/lib/chef/provider/service/debian.rb +130 -0
- data/lib/chef/provider/service/freebsd.rb +154 -0
- data/lib/chef/provider/service/gentoo.rb +53 -0
- data/lib/chef/provider/service/init.rb +71 -0
- data/lib/chef/provider/service/insserv.rb +52 -0
- data/lib/chef/provider/service/invokercd.rb +35 -0
- data/lib/chef/provider/service/redhat.rb +60 -0
- data/lib/chef/provider/service/simple.rb +120 -0
- data/lib/chef/provider/service/solaris.rb +85 -0
- data/lib/chef/provider/service/systemd.rb +102 -0
- data/lib/chef/provider/service/upstart.rb +198 -0
- data/lib/chef/provider/service/windows.rb +155 -0
- data/lib/chef/provider/subversion.rb +197 -0
- data/lib/chef/provider/template.rb +104 -0
- data/lib/chef/provider/user.rb +186 -0
- data/lib/chef/provider/user/dscl.rb +280 -0
- data/lib/chef/provider/user/pw.rb +113 -0
- data/lib/chef/provider/user/useradd.rb +137 -0
- data/lib/chef/provider/user/windows.rb +124 -0
- data/lib/chef/providers.rb +95 -0
- data/lib/chef/recipe.rb +129 -0
- data/lib/chef/resource.rb +609 -0
- data/lib/chef/resource/apt_package.rb +34 -0
- data/lib/chef/resource/bash.rb +33 -0
- data/lib/chef/resource/breakpoint.rb +35 -0
- data/lib/chef/resource/conditional.rb +90 -0
- data/lib/chef/resource/cookbook_file.rb +45 -0
- data/lib/chef/resource/cron.rb +188 -0
- data/lib/chef/resource/csh.rb +33 -0
- data/lib/chef/resource/deploy.rb +389 -0
- data/lib/chef/resource/deploy_revision.rb +40 -0
- data/lib/chef/resource/directory.rb +76 -0
- data/lib/chef/resource/dpkg_package.rb +34 -0
- data/lib/chef/resource/easy_install_package.rb +57 -0
- data/lib/chef/resource/env.rb +58 -0
- data/lib/chef/resource/erl_call.rb +83 -0
- data/lib/chef/resource/execute.rb +127 -0
- data/lib/chef/resource/file.rb +99 -0
- data/lib/chef/resource/freebsd_package.rb +35 -0
- data/lib/chef/resource/gem_package.rb +53 -0
- data/lib/chef/resource/git.rb +46 -0
- data/lib/chef/resource/group.rb +78 -0
- data/lib/chef/resource/http_request.rb +61 -0
- data/lib/chef/resource/ifconfig.rb +144 -0
- data/lib/chef/resource/link.rb +78 -0
- data/lib/chef/resource/log.rb +62 -0
- data/lib/chef/resource/macports_package.rb +29 -0
- data/lib/chef/resource/mdadm.rb +82 -0
- data/lib/chef/resource/mount.rb +134 -0
- data/lib/chef/resource/ohai.rb +40 -0
- data/lib/chef/resource/package.rb +80 -0
- data/lib/chef/resource/pacman_package.rb +33 -0
- data/lib/chef/resource/perl.rb +33 -0
- data/lib/chef/resource/portage_package.rb +33 -0
- data/lib/chef/resource/python.rb +33 -0
- data/lib/chef/resource/remote_directory.rb +109 -0
- data/lib/chef/resource/remote_file.rb +83 -0
- data/lib/chef/resource/route.rb +135 -0
- data/lib/chef/resource/rpm_package.rb +34 -0
- data/lib/chef/resource/ruby.rb +33 -0
- data/lib/chef/resource/ruby_block.rb +40 -0
- data/lib/chef/resource/scm.rb +147 -0
- data/lib/chef/resource/script.rb +60 -0
- data/lib/chef/resource/service.rb +151 -0
- data/lib/chef/resource/solaris_package.rb +36 -0
- data/lib/chef/resource/subversion.rb +36 -0
- data/lib/chef/resource/template.rb +69 -0
- data/lib/chef/resource/timestamped_deploy.rb +31 -0
- data/lib/chef/resource/user.rb +130 -0
- data/lib/chef/resource/yum_package.rb +63 -0
- data/lib/chef/resource_collection.rb +217 -0
- data/lib/chef/resource_collection/stepable_iterator.rb +124 -0
- data/lib/chef/resource_definition.rb +67 -0
- data/lib/chef/resource_definition_list.rb +38 -0
- data/lib/chef/resources.rb +64 -0
- data/lib/chef/rest.rb +400 -0
- data/lib/chef/rest/auth_credentials.rb +71 -0
- data/lib/chef/rest/cookie_jar.rb +31 -0
- data/lib/chef/rest/rest_request.rb +213 -0
- data/lib/chef/role.rb +343 -0
- data/lib/chef/run_context.rb +126 -0
- data/lib/chef/run_list.rb +165 -0
- data/lib/chef/run_list/run_list_expansion.rb +193 -0
- data/lib/chef/run_list/run_list_item.rb +92 -0
- data/lib/chef/run_list/versioned_recipe_list.rb +68 -0
- data/lib/chef/run_status.rb +121 -0
- data/lib/chef/runner.rb +105 -0
- data/lib/chef/sandbox.rb +153 -0
- data/lib/chef/search/query.rb +65 -0
- data/lib/chef/shef.rb +327 -0
- data/lib/chef/shef/ext.rb +569 -0
- data/lib/chef/shef/model_wrapper.rb +120 -0
- data/lib/chef/shef/shef_rest.rb +28 -0
- data/lib/chef/shef/shef_session.rb +285 -0
- data/lib/chef/shell_out.rb +249 -0
- data/lib/chef/shell_out/unix.rb +223 -0
- data/lib/chef/shell_out/windows.rb +588 -0
- data/lib/chef/solr_query.rb +187 -0
- data/lib/chef/solr_query/lucene.treetop +150 -0
- data/lib/chef/solr_query/lucene_nodes.rb +285 -0
- data/lib/chef/solr_query/query_transform.rb +65 -0
- data/lib/chef/solr_query/solr_http_request.rb +132 -0
- data/lib/chef/streaming_cookbook_uploader.rb +201 -0
- data/lib/chef/tasks/chef_repo.rake +334 -0
- data/lib/chef/util/file_edit.rb +122 -0
- data/lib/chef/util/windows.rb +56 -0
- data/lib/chef/util/windows/net_group.rb +101 -0
- data/lib/chef/util/windows/net_use.rb +121 -0
- data/lib/chef/util/windows/net_user.rb +198 -0
- data/lib/chef/util/windows/volume.rb +59 -0
- data/lib/chef/version.rb +23 -0
- data/lib/chef/version_class.rb +70 -0
- data/lib/chef/version_constraint.rb +116 -0
- data/lib/chef/webui_user.rb +231 -0
- metadata +764 -0
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Tim Hinderliter (<tim@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
|
+
require 'chef/log'
|
|
19
|
+
require 'chef/checksum/storage'
|
|
20
|
+
require 'uuidtools'
|
|
21
|
+
|
|
22
|
+
class Chef
|
|
23
|
+
# == Chef::Checksum
|
|
24
|
+
# Checksum for an individual file; e.g., used for sandbox/cookbook uploading
|
|
25
|
+
# to track which files the system already manages.
|
|
26
|
+
class Checksum
|
|
27
|
+
attr_accessor :checksum, :create_time
|
|
28
|
+
attr_accessor :couchdb_id, :couchdb_rev
|
|
29
|
+
|
|
30
|
+
attr_reader :storage
|
|
31
|
+
|
|
32
|
+
# When a Checksum commits a sandboxed file to its final home in the checksum
|
|
33
|
+
# repo, this attribute will have the original on-disk path where the file
|
|
34
|
+
# was stored; it will be used if the commit is reverted to restore the sandbox
|
|
35
|
+
# to the pre-commit state.
|
|
36
|
+
attr_reader :original_committed_file_location
|
|
37
|
+
|
|
38
|
+
DESIGN_DOCUMENT = {
|
|
39
|
+
"version" => 1,
|
|
40
|
+
"language" => "javascript",
|
|
41
|
+
"views" => {
|
|
42
|
+
"all" => {
|
|
43
|
+
"map" => <<-EOJS
|
|
44
|
+
function(doc) {
|
|
45
|
+
if (doc.chef_type == "checksum") {
|
|
46
|
+
emit(doc.checksum, doc);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
EOJS
|
|
50
|
+
},
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
# Creates a new Chef::Checksum object.
|
|
55
|
+
# === Arguments
|
|
56
|
+
# checksum::: the MD5 content hash of the file
|
|
57
|
+
# couchdb::: An instance of Chef::CouchDB
|
|
58
|
+
#
|
|
59
|
+
# === Returns
|
|
60
|
+
# object<Chef::Checksum>:: Duh. :)
|
|
61
|
+
def initialize(checksum=nil, couchdb=nil)
|
|
62
|
+
@create_time = Time.now.iso8601
|
|
63
|
+
@checksum = checksum
|
|
64
|
+
@original_committed_file_location = nil
|
|
65
|
+
@storage = Storage::Filesystem.new(Chef::Config.checksum_path, checksum)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def to_json(*a)
|
|
69
|
+
result = {
|
|
70
|
+
:checksum => checksum,
|
|
71
|
+
:create_time => create_time,
|
|
72
|
+
:json_class => self.class.name,
|
|
73
|
+
:chef_type => 'checksum',
|
|
74
|
+
|
|
75
|
+
# For Chef::CouchDB (id_to_name, name_to_id)
|
|
76
|
+
:name => checksum
|
|
77
|
+
}
|
|
78
|
+
result.to_json(*a)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def self.json_create(o)
|
|
82
|
+
checksum = new(o['checksum'])
|
|
83
|
+
checksum.create_time = o['create_time']
|
|
84
|
+
|
|
85
|
+
if o.has_key?('_rev')
|
|
86
|
+
checksum.couchdb_rev = o["_rev"]
|
|
87
|
+
o.delete("_rev")
|
|
88
|
+
end
|
|
89
|
+
if o.has_key?("_id")
|
|
90
|
+
checksum.couchdb_id = o["_id"]
|
|
91
|
+
o.delete("_id")
|
|
92
|
+
end
|
|
93
|
+
checksum
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# Moves the given +sandbox_file+ into the checksum repo using the path
|
|
97
|
+
# given by +file_location+ and saves the Checksum to the database
|
|
98
|
+
def commit_sandbox_file(sandbox_file)
|
|
99
|
+
@original_committed_file_location = sandbox_file
|
|
100
|
+
Chef::Log.info("Commiting sandbox file: move #{sandbox_file} to #{@storage}")
|
|
101
|
+
@storage.commit(sandbox_file)
|
|
102
|
+
cdb_save
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
# Moves the checksum file back to its pre-commit location and deletes
|
|
106
|
+
# the checksum object from the database, effectively undoing +commit_sandbox_file+.
|
|
107
|
+
# Raises Chef::Exceptions::IllegalChecksumRevert if the original file location
|
|
108
|
+
# is unknown, which is will be the case if commit_sandbox_file was not
|
|
109
|
+
# previously called
|
|
110
|
+
def revert_sandbox_file_commit
|
|
111
|
+
unless original_committed_file_location
|
|
112
|
+
raise Chef::Exceptions::IllegalChecksumRevert, "Checksum #{self.inspect} cannot be reverted because the original sandbox file location is not known"
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
Chef::Log.warn("Reverting sandbox file commit: moving #{@storage} back to #{original_committed_file_location}")
|
|
116
|
+
@storage.revert(original_committed_file_location)
|
|
117
|
+
cdb_destroy
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# Removes the on-disk file backing this checksum object, then removes it
|
|
121
|
+
# from the database
|
|
122
|
+
def purge
|
|
123
|
+
purge_file
|
|
124
|
+
cdb_destroy
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
##
|
|
128
|
+
# Couchdb
|
|
129
|
+
##
|
|
130
|
+
|
|
131
|
+
def self.create_design_document(couchdb=nil)
|
|
132
|
+
(couchdb || Chef::CouchDB.new).create_design_document("checksums", DESIGN_DOCUMENT)
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
def self.cdb_list(inflate=false, couchdb=nil)
|
|
136
|
+
rs = (couchdb || Chef::CouchDB.new).list("checksums", inflate)
|
|
137
|
+
lookup = (inflate ? "value" : "key")
|
|
138
|
+
rs["rows"].collect { |r| r[lookup] }
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def self.cdb_all_checksums(couchdb = nil)
|
|
142
|
+
rs = (couchdb || Chef::CouchDB.new).list("checksums", true)
|
|
143
|
+
rs["rows"].inject({}) { |hash_result, r| hash_result[r['key']] = 1; hash_result }
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def self.cdb_load(checksum, couchdb=nil)
|
|
147
|
+
# Probably want to look for a view here at some point
|
|
148
|
+
(couchdb || Chef::CouchDB.new).load("checksum", checksum)
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
def cdb_destroy(couchdb=nil)
|
|
152
|
+
(couchdb || Chef::CouchDB.new).delete("checksum", checksum, @couchdb_rev)
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
def cdb_save(couchdb=nil)
|
|
156
|
+
@couchdb_rev = (couchdb || Chef::CouchDB.new).store("checksum", checksum, self)["rev"]
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
private
|
|
161
|
+
|
|
162
|
+
def purge_file
|
|
163
|
+
@storage.purge
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
end
|
|
167
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Andrea Campi (<andrea.campi@zephirworks.com>)
|
|
3
|
+
# Copyright:: Copyright (c) 2011 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
|
+
require 'chef/checksum/storage/filesystem'
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Tim Hinderliter (<tim@opscode.com>)
|
|
3
|
+
# Copyright:: Copyright (c) 2011 Opscode, Inc.
|
|
4
|
+
# License:: Apache License, Version 2.0
|
|
5
|
+
#
|
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
# you may not use this file except in compliance with the License.
|
|
8
|
+
# You may obtain a copy of the License at
|
|
9
|
+
#
|
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
#
|
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
# See the License for the specific language governing permissions and
|
|
16
|
+
# limitations under the License.
|
|
17
|
+
|
|
18
|
+
class Chef
|
|
19
|
+
class Checksum
|
|
20
|
+
class Storage
|
|
21
|
+
class Filesystem
|
|
22
|
+
def initialize(base_dir, checksum)
|
|
23
|
+
@base_dir = base_dir
|
|
24
|
+
@checksum = checksum
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def file_location
|
|
28
|
+
File.join(checksum_repo_directory, @checksum)
|
|
29
|
+
end
|
|
30
|
+
alias :to_s :file_location
|
|
31
|
+
|
|
32
|
+
def checksum_repo_directory
|
|
33
|
+
File.join(Chef::Config.checksum_path, @checksum[0..1])
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def commit(sandbox_file)
|
|
37
|
+
FileUtils.mkdir_p(checksum_repo_directory)
|
|
38
|
+
File.rename(sandbox_file, file_location)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def revert(original_committed_file_location)
|
|
42
|
+
File.rename(file_location, original_committed_file_location)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Deletes the file backing this checksum from the on-disk repo.
|
|
46
|
+
# Purging the checksums is how users can get back to a valid state if
|
|
47
|
+
# they've deleted files, so we silently swallow Errno::ENOENT here.
|
|
48
|
+
def purge
|
|
49
|
+
FileUtils.rm(file_location)
|
|
50
|
+
rescue Errno::ENOENT
|
|
51
|
+
true
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Adam Jacob (<adam@opscode.com>)
|
|
3
|
+
# Author:: Daniel DeLeo (<dan@kallistec.com>)
|
|
4
|
+
# Copyright:: Copyright (c) 2009 Opscode, Inc.
|
|
5
|
+
# Copyright:: Copyright (c) 2009 Daniel DeLeo
|
|
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 'set'
|
|
22
|
+
require 'fileutils'
|
|
23
|
+
require 'chef/log'
|
|
24
|
+
require 'chef/config'
|
|
25
|
+
require 'chef/client'
|
|
26
|
+
require 'chef/mixin/convert_to_class_name'
|
|
27
|
+
require 'singleton'
|
|
28
|
+
require 'moneta'
|
|
29
|
+
|
|
30
|
+
class Chef
|
|
31
|
+
class ChecksumCache
|
|
32
|
+
include Chef::Mixin::ConvertToClassName
|
|
33
|
+
include ::Singleton
|
|
34
|
+
|
|
35
|
+
attr_reader :moneta
|
|
36
|
+
|
|
37
|
+
def initialize(*args)
|
|
38
|
+
self.reset!(*args)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def reset!(backend=nil, options=nil)
|
|
42
|
+
backend ||= Chef::Config[:cache_type]
|
|
43
|
+
options ||= Chef::Config[:cache_options]
|
|
44
|
+
|
|
45
|
+
begin
|
|
46
|
+
require "moneta/#{convert_to_snake_case(backend, 'Moneta')}"
|
|
47
|
+
rescue LoadError => e
|
|
48
|
+
Chef::Log.fatal("Could not load Moneta back end #{backend.inspect}")
|
|
49
|
+
raise e
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
@moneta = Moneta.const_get(backend).new(options)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def self.reset_cache_validity
|
|
56
|
+
@valid_cached_checksums = nil
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
Chef::Client.when_run_starts do |run_status|
|
|
60
|
+
reset_cache_validity
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def self.valid_cached_checksums
|
|
64
|
+
@valid_cached_checksums ||= Set.new
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def self.validate_checksum(checksum_key)
|
|
68
|
+
valid_cached_checksums << checksum_key
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def self.all_cached_checksums
|
|
72
|
+
all_checksums_with_filenames = {}
|
|
73
|
+
|
|
74
|
+
Dir[File.join(Chef::Config[:cache_options][:path], '*')].each do |cksum_file|
|
|
75
|
+
all_checksums_with_filenames[File.basename(cksum_file)] = cksum_file
|
|
76
|
+
end
|
|
77
|
+
all_checksums_with_filenames
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def self.cleanup_checksum_cache
|
|
81
|
+
Chef::Log.debug("Cleaning the checksum cache")
|
|
82
|
+
if (Chef::Config[:cache_type].to_s == "BasicFile")
|
|
83
|
+
all_cached_checksums.each do |cache_key, cksum_cache_file|
|
|
84
|
+
unless valid_cached_checksums.include?(cache_key)
|
|
85
|
+
remove_unused_checksum(cksum_cache_file)
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
Chef::Client.when_run_completes_successfully do |run_status|
|
|
92
|
+
cleanup_checksum_cache
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def self.remove_unused_checksum(checksum_file)
|
|
96
|
+
Chef::Log.debug("Removing unused checksum cache file #{checksum_file}")
|
|
97
|
+
FileUtils.rm(checksum_file)
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def self.checksum_for_file(*args)
|
|
101
|
+
instance.checksum_for_file(*args)
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def validate_checksum(*args)
|
|
105
|
+
self.class.validate_checksum(*args)
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def checksum_for_file(file, key=nil)
|
|
109
|
+
key ||= generate_key(file)
|
|
110
|
+
fstat = File.stat(file)
|
|
111
|
+
lookup_checksum(key, fstat) || generate_checksum(key, file, fstat)
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def lookup_checksum(key, fstat)
|
|
115
|
+
cached = fetch(key)
|
|
116
|
+
if cached && file_unchanged?(cached, fstat)
|
|
117
|
+
validate_checksum(key)
|
|
118
|
+
cached["checksum"]
|
|
119
|
+
else
|
|
120
|
+
nil
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def generate_checksum(key, file, fstat)
|
|
125
|
+
checksum = checksum_file(file, Digest::SHA256.new)
|
|
126
|
+
moneta.store(key, {"mtime" => fstat.mtime.to_f, "checksum" => checksum})
|
|
127
|
+
validate_checksum(key)
|
|
128
|
+
checksum
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def generate_key(file, group="chef")
|
|
132
|
+
"#{group}-file-#{file.gsub(/(#{File::SEPARATOR}|\.)/, '-')}"
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
def self.generate_md5_checksum_for_file(*args)
|
|
136
|
+
instance.generate_md5_checksum_for_file(*args)
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def generate_md5_checksum_for_file(file)
|
|
140
|
+
checksum_file(file, Digest::MD5.new)
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
def generate_md5_checksum(io)
|
|
144
|
+
checksum_io(io, Digest::MD5.new)
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
private
|
|
148
|
+
|
|
149
|
+
def fetch(key)
|
|
150
|
+
@moneta.fetch(key)
|
|
151
|
+
rescue ArgumentError => e
|
|
152
|
+
Log.warn "Error loading cached checksum for key #{key.inspect}"
|
|
153
|
+
Log.warn(e)
|
|
154
|
+
repair_checksum_cache
|
|
155
|
+
nil
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
def repair_checksum_cache
|
|
159
|
+
Chef::Log.info("Removing invalid checksum cache files")
|
|
160
|
+
Dir["#{Chef::Config[:cache_options][:path]}/*"].each do |file_path|
|
|
161
|
+
File.unlink(file_path) unless File.size?(file_path)
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
def file_unchanged?(cached, fstat)
|
|
166
|
+
cached["mtime"].to_f == fstat.mtime.to_f
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
def checksum_file(file, digest)
|
|
170
|
+
File.open(file, 'rb') { |f| checksum_io(f, digest) }
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
def checksum_io(io, digest)
|
|
174
|
+
while chunk = io.read(1024 * 8)
|
|
175
|
+
digest.update(chunk)
|
|
176
|
+
end
|
|
177
|
+
digest.hexdigest
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
end
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
module Moneta
|
|
184
|
+
module Defaults
|
|
185
|
+
def default
|
|
186
|
+
nil
|
|
187
|
+
end
|
|
188
|
+
end
|
|
189
|
+
end
|
data/lib/chef/client.rb
ADDED
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Adam Jacob (<adam@opscode.com>)
|
|
3
|
+
# Author:: Christopher Walters (<cw@opscode.com>)
|
|
4
|
+
# Author:: Christopher Brown (<cb@opscode.com>)
|
|
5
|
+
# Author:: Tim Hinderliter (<tim@opscode.com>)
|
|
6
|
+
# Copyright:: Copyright (c) 2008-2011 Opscode, Inc.
|
|
7
|
+
# License:: Apache License, Version 2.0
|
|
8
|
+
#
|
|
9
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
10
|
+
# you may not use this file except in compliance with the License.
|
|
11
|
+
# You may obtain a copy of the License at
|
|
12
|
+
#
|
|
13
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
14
|
+
#
|
|
15
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
16
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
17
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
18
|
+
# See the License for the specific language governing permissions and
|
|
19
|
+
# limitations under the License.
|
|
20
|
+
|
|
21
|
+
require 'chef/config'
|
|
22
|
+
require 'chef/mixin/params_validate'
|
|
23
|
+
require 'chef/log'
|
|
24
|
+
require 'chef/rest'
|
|
25
|
+
require 'chef/api_client'
|
|
26
|
+
require 'chef/platform'
|
|
27
|
+
require 'chef/node'
|
|
28
|
+
require 'chef/role'
|
|
29
|
+
require 'chef/file_cache'
|
|
30
|
+
require 'chef/run_context'
|
|
31
|
+
require 'chef/runner'
|
|
32
|
+
require 'chef/run_status'
|
|
33
|
+
require 'chef/cookbook/cookbook_collection'
|
|
34
|
+
require 'chef/cookbook/file_vendor'
|
|
35
|
+
require 'chef/cookbook/file_system_file_vendor'
|
|
36
|
+
require 'chef/cookbook/remote_file_vendor'
|
|
37
|
+
require 'chef/version'
|
|
38
|
+
require 'ohai'
|
|
39
|
+
|
|
40
|
+
class Chef
|
|
41
|
+
# == Chef::Client
|
|
42
|
+
# The main object in a Chef run. Preps a Chef::Node and Chef::RunContext,
|
|
43
|
+
# syncs cookbooks if necessary, and triggers convergence.
|
|
44
|
+
class Client
|
|
45
|
+
|
|
46
|
+
SANE_PATHS = %w[/usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin]
|
|
47
|
+
|
|
48
|
+
# Clears all notifications for client run status events.
|
|
49
|
+
# Primarily for testing purposes.
|
|
50
|
+
def self.clear_notifications
|
|
51
|
+
@run_start_notifications = nil
|
|
52
|
+
@run_completed_successfully_notifications = nil
|
|
53
|
+
@run_failed_notifications = nil
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# The list of notifications to be run when the client run starts.
|
|
57
|
+
def self.run_start_notifications
|
|
58
|
+
@run_start_notifications ||= []
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# The list of notifications to be run when the client run completes
|
|
62
|
+
# successfully.
|
|
63
|
+
def self.run_completed_successfully_notifications
|
|
64
|
+
@run_completed_successfully_notifications ||= []
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# The list of notifications to be run when the client run fails.
|
|
68
|
+
def self.run_failed_notifications
|
|
69
|
+
@run_failed_notifications ||= []
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Add a notification for the 'client run started' event. The notification
|
|
73
|
+
# is provided as a block. The current Chef::RunStatus object will be passed
|
|
74
|
+
# to the notification_block when the event is triggered.
|
|
75
|
+
def self.when_run_starts(¬ification_block)
|
|
76
|
+
run_start_notifications << notification_block
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# Add a notification for the 'client run success' event. The notification
|
|
80
|
+
# is provided as a block. The current Chef::RunStatus object will be passed
|
|
81
|
+
# to the notification_block when the event is triggered.
|
|
82
|
+
def self.when_run_completes_successfully(¬ification_block)
|
|
83
|
+
run_completed_successfully_notifications << notification_block
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# Add a notification for the 'client run failed' event. The notification
|
|
87
|
+
# is provided as a block. The current Chef::RunStatus is passed to the
|
|
88
|
+
# notification_block when the event is triggered.
|
|
89
|
+
def self.when_run_fails(¬ification_block)
|
|
90
|
+
run_failed_notifications << notification_block
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
# Callback to fire notifications that the Chef run is starting
|
|
94
|
+
def run_started
|
|
95
|
+
self.class.run_start_notifications.each do |notification|
|
|
96
|
+
notification.call(run_status)
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# Callback to fire notifications that the run completed successfully
|
|
101
|
+
def run_completed_successfully
|
|
102
|
+
self.class.run_completed_successfully_notifications.each do |notification|
|
|
103
|
+
notification.call(run_status)
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# Callback to fire notifications that the Chef run failed
|
|
108
|
+
def run_failed
|
|
109
|
+
self.class.run_failed_notifications.each do |notification|
|
|
110
|
+
notification.call(run_status)
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
attr_accessor :node
|
|
115
|
+
attr_accessor :ohai
|
|
116
|
+
attr_accessor :rest
|
|
117
|
+
attr_accessor :runner
|
|
118
|
+
|
|
119
|
+
#--
|
|
120
|
+
# TODO: timh/cw: 5-19-2010: json_attribs should be moved to RunContext?
|
|
121
|
+
attr_reader :json_attribs
|
|
122
|
+
|
|
123
|
+
attr_reader :run_status
|
|
124
|
+
|
|
125
|
+
# Creates a new Chef::Client.
|
|
126
|
+
def initialize(json_attribs=nil)
|
|
127
|
+
@json_attribs = json_attribs
|
|
128
|
+
@node = nil
|
|
129
|
+
@run_status = nil
|
|
130
|
+
@runner = nil
|
|
131
|
+
@ohai = Ohai::System.new
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
# Do a full run for this Chef::Client. Calls:
|
|
135
|
+
#
|
|
136
|
+
# * run_ohai - Collect information about the system
|
|
137
|
+
# * build_node - Get the last known state, merge with local changes
|
|
138
|
+
# * register - If not in solo mode, make sure the server knows about this client
|
|
139
|
+
# * sync_cookbooks - If not in solo mode, populate the local cache with the node's cookbooks
|
|
140
|
+
# * converge - Bring this system up to date
|
|
141
|
+
#
|
|
142
|
+
# === Returns
|
|
143
|
+
# true:: Always returns true.
|
|
144
|
+
def run
|
|
145
|
+
run_context = nil
|
|
146
|
+
|
|
147
|
+
Chef::Log.info("*** Chef #{Chef::VERSION} ***")
|
|
148
|
+
enforce_path_sanity
|
|
149
|
+
run_ohai
|
|
150
|
+
register unless Chef::Config[:solo]
|
|
151
|
+
build_node
|
|
152
|
+
|
|
153
|
+
begin
|
|
154
|
+
|
|
155
|
+
run_status.start_clock
|
|
156
|
+
Chef::Log.info("Starting Chef Run for #{node.name}")
|
|
157
|
+
run_started
|
|
158
|
+
|
|
159
|
+
run_context = setup_run_context
|
|
160
|
+
converge(run_context)
|
|
161
|
+
save_updated_node
|
|
162
|
+
|
|
163
|
+
run_status.stop_clock
|
|
164
|
+
Chef::Log.info("Chef Run complete in #{run_status.elapsed_time} seconds")
|
|
165
|
+
run_completed_successfully
|
|
166
|
+
true
|
|
167
|
+
rescue Exception => e
|
|
168
|
+
run_status.stop_clock
|
|
169
|
+
run_status.exception = e
|
|
170
|
+
run_failed
|
|
171
|
+
Chef::Log.debug("Re-raising exception: #{e.class} - #{e.message}\n#{e.backtrace.join("\n ")}")
|
|
172
|
+
raise
|
|
173
|
+
ensure
|
|
174
|
+
run_status = nil
|
|
175
|
+
end
|
|
176
|
+
true
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
# Configures the Chef::Cookbook::FileVendor class to fetch file from the
|
|
181
|
+
# server or disk as appropriate, creates the run context for this run, and
|
|
182
|
+
# sanity checks the cookbook collection.
|
|
183
|
+
#===Returns
|
|
184
|
+
# Chef::RunContext:: the run context for this run.
|
|
185
|
+
def setup_run_context
|
|
186
|
+
if Chef::Config[:solo]
|
|
187
|
+
Chef::Cookbook::FileVendor.on_create { |manifest| Chef::Cookbook::FileSystemFileVendor.new(manifest, Chef::Config[:cookbook_path]) }
|
|
188
|
+
run_context = Chef::RunContext.new(node, Chef::CookbookCollection.new(Chef::CookbookLoader.new(Chef::Config[:cookbook_path])))
|
|
189
|
+
else
|
|
190
|
+
Chef::Cookbook::FileVendor.on_create { |manifest| Chef::Cookbook::RemoteFileVendor.new(manifest, rest) }
|
|
191
|
+
cookbook_hash = sync_cookbooks
|
|
192
|
+
run_context = Chef::RunContext.new(node, Chef::CookbookCollection.new(cookbook_hash))
|
|
193
|
+
end
|
|
194
|
+
run_status.run_context = run_context
|
|
195
|
+
run_context.load(@run_list_expansion)
|
|
196
|
+
assert_cookbook_path_not_empty(run_context)
|
|
197
|
+
run_context
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
def save_updated_node
|
|
201
|
+
unless Chef::Config[:solo]
|
|
202
|
+
Chef::Log.debug("Saving the current state of node #{node_name}")
|
|
203
|
+
@node.save
|
|
204
|
+
end
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
def run_ohai
|
|
208
|
+
ohai.all_plugins
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
def node_name
|
|
212
|
+
name = Chef::Config[:node_name] || ohai[:fqdn] || ohai[:hostname]
|
|
213
|
+
Chef::Config[:node_name] = name
|
|
214
|
+
|
|
215
|
+
unless name
|
|
216
|
+
msg = "Unable to determine node name: configure node_name or configure the system's hostname and fqdn"
|
|
217
|
+
raise Chef::Exceptions::CannotDetermineNodeName, msg
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
name
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
# Builds a new node object for this client. Starts with querying for the FQDN of the current
|
|
224
|
+
# host (unless it is supplied), then merges in the facts from Ohai.
|
|
225
|
+
#
|
|
226
|
+
# === Returns
|
|
227
|
+
# node<Chef::Node>:: Returns the created node object, also stored in @node
|
|
228
|
+
def build_node
|
|
229
|
+
Chef::Log.debug("Building node object for #{node_name}")
|
|
230
|
+
|
|
231
|
+
if Chef::Config[:solo]
|
|
232
|
+
@node = Chef::Node.build(node_name)
|
|
233
|
+
else
|
|
234
|
+
@node = Chef::Node.find_or_create(node_name)
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
# Allow user to override the environment of a node by specifying
|
|
238
|
+
# a config parameter.
|
|
239
|
+
if Chef::Config[:environment] && !Chef::Config[:environment].chop.empty?
|
|
240
|
+
@node.chef_environment(Chef::Config[:environment])
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
# consume_external_attrs may add items to the run_list. Save the
|
|
244
|
+
# expanded run_list, which we will pass to the server later to
|
|
245
|
+
# determine which versions of cookbooks to use.
|
|
246
|
+
@node.reset_defaults_and_overrides
|
|
247
|
+
@node.consume_external_attrs(ohai.data, @json_attribs)
|
|
248
|
+
if Chef::Config[:solo]
|
|
249
|
+
@run_list_expansion = @node.expand!('disk')
|
|
250
|
+
else
|
|
251
|
+
@run_list_expansion = @node.expand!('server')
|
|
252
|
+
end
|
|
253
|
+
|
|
254
|
+
# @run_list_expansion is a RunListExpansion.
|
|
255
|
+
#
|
|
256
|
+
# Convert @expanded_run_list, which is an
|
|
257
|
+
# Array of Hashes of the form
|
|
258
|
+
# {:name => NAME, :version_constraint => Chef::VersionConstraint },
|
|
259
|
+
# into @expanded_run_list_with_versions, an
|
|
260
|
+
# Array of Strings of the form
|
|
261
|
+
# "#{NAME}@#{VERSION}"
|
|
262
|
+
@expanded_run_list_with_versions = @run_list_expansion.recipes.with_version_constraints_strings
|
|
263
|
+
|
|
264
|
+
Chef::Log.info("Run List is [#{@node.run_list}]")
|
|
265
|
+
Chef::Log.info("Run List expands to [#{@expanded_run_list_with_versions.join(', ')}]")
|
|
266
|
+
|
|
267
|
+
@run_status = Chef::RunStatus.new(@node)
|
|
268
|
+
|
|
269
|
+
@node
|
|
270
|
+
end
|
|
271
|
+
|
|
272
|
+
#
|
|
273
|
+
# === Returns
|
|
274
|
+
# rest<Chef::REST>:: returns Chef::REST connection object
|
|
275
|
+
def register(client_name=node_name, config=Chef::Config)
|
|
276
|
+
if File.exists?(config[:client_key])
|
|
277
|
+
Chef::Log.debug("Client key #{config[:client_key]} is present - skipping registration")
|
|
278
|
+
else
|
|
279
|
+
Chef::Log.info("Client key #{config[:client_key]} is not present - registering")
|
|
280
|
+
Chef::REST.new(config[:client_url], config[:validation_client_name], config[:validation_key]).register(client_name, config[:client_key])
|
|
281
|
+
end
|
|
282
|
+
# We now have the client key, and should use it from now on.
|
|
283
|
+
self.rest = Chef::REST.new(config[:chef_server_url], client_name, config[:client_key])
|
|
284
|
+
end
|
|
285
|
+
|
|
286
|
+
# Sync_cookbooks eagerly loads all files except files and
|
|
287
|
+
# templates. It returns the cookbook_hash -- the return result
|
|
288
|
+
# from /environments/#{node.chef_environment}/cookbook_versions,
|
|
289
|
+
# which we will use for our run_context.
|
|
290
|
+
#
|
|
291
|
+
# === Returns
|
|
292
|
+
# Hash:: The hash of cookbooks with download URLs as given by the server
|
|
293
|
+
def sync_cookbooks
|
|
294
|
+
Chef::Log.debug("Synchronizing cookbooks")
|
|
295
|
+
cookbook_hash = rest.post_rest("environments/#{@node.chef_environment}/cookbook_versions",
|
|
296
|
+
{:run_list => @expanded_run_list_with_versions})
|
|
297
|
+
Chef::CookbookVersion.sync_cookbooks(cookbook_hash)
|
|
298
|
+
|
|
299
|
+
# register the file cache path in the cookbook path so that CookbookLoader actually picks up the synced cookbooks
|
|
300
|
+
Chef::Config[:cookbook_path] = File.join(Chef::Config[:file_cache_path], "cookbooks")
|
|
301
|
+
|
|
302
|
+
cookbook_hash
|
|
303
|
+
end
|
|
304
|
+
|
|
305
|
+
# Converges the node.
|
|
306
|
+
#
|
|
307
|
+
# === Returns
|
|
308
|
+
# true:: Always returns true
|
|
309
|
+
def converge(run_context)
|
|
310
|
+
Chef::Log.debug("Converging node #{node_name}")
|
|
311
|
+
@runner = Chef::Runner.new(run_context)
|
|
312
|
+
runner.converge
|
|
313
|
+
true
|
|
314
|
+
end
|
|
315
|
+
|
|
316
|
+
def enforce_path_sanity(env=ENV)
|
|
317
|
+
if Chef::Config[:enforce_path_sanity] && RUBY_PLATFORM !~ /mswin|mingw32|windows/
|
|
318
|
+
existing_paths = env["PATH"].split(':')
|
|
319
|
+
SANE_PATHS.each do |sane_path|
|
|
320
|
+
unless existing_paths.include?(sane_path)
|
|
321
|
+
env_path = env["PATH"].dup
|
|
322
|
+
env_path << ':' unless env["PATH"].empty?
|
|
323
|
+
env_path << sane_path
|
|
324
|
+
env["PATH"] = env_path
|
|
325
|
+
end
|
|
326
|
+
end
|
|
327
|
+
end
|
|
328
|
+
end
|
|
329
|
+
|
|
330
|
+
private
|
|
331
|
+
|
|
332
|
+
def directory_not_empty?(path)
|
|
333
|
+
File.exists?(path) && (Dir.entries(path).size > 2)
|
|
334
|
+
end
|
|
335
|
+
|
|
336
|
+
def is_last_element?(index, object)
|
|
337
|
+
object.kind_of?(Array) ? index == object.size - 1 : true
|
|
338
|
+
end
|
|
339
|
+
|
|
340
|
+
def assert_cookbook_path_not_empty(run_context)
|
|
341
|
+
if Chef::Config[:solo]
|
|
342
|
+
# Check for cookbooks in the path given
|
|
343
|
+
# Chef::Config[:cookbook_path] can be a string or an array
|
|
344
|
+
# if it's an array, go through it and check each one, raise error at the last one if no files are found
|
|
345
|
+
Chef::Log.debug "Loading from cookbook_path: #{Array(Chef::Config[:cookbook_path]).map { |path| File.expand_path(path) }.join(', ')}"
|
|
346
|
+
Array(Chef::Config[:cookbook_path]).each_with_index do |cookbook_path, index|
|
|
347
|
+
if directory_not_empty?(cookbook_path)
|
|
348
|
+
break
|
|
349
|
+
else
|
|
350
|
+
msg = "No cookbook found in #{Chef::Config[:cookbook_path].inspect}, make sure cookbook_path is set correctly."
|
|
351
|
+
Chef::Log.fatal(msg)
|
|
352
|
+
raise Chef::Exceptions::CookbookNotFound, msg if is_last_element?(index, Chef::Config[:cookbook_path])
|
|
353
|
+
end
|
|
354
|
+
end
|
|
355
|
+
else
|
|
356
|
+
Chef::Log.warn("Node #{node_name} has an empty run list.") if run_context.node.run_list.empty?
|
|
357
|
+
end
|
|
358
|
+
|
|
359
|
+
end
|
|
360
|
+
end
|
|
361
|
+
end
|
|
362
|
+
|
|
363
|
+
# HACK cannot load this first, but it must be loaded.
|
|
364
|
+
require 'chef/cookbook_loader'
|
|
365
|
+
require 'chef/cookbook_version'
|
|
366
|
+
|