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,136 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Daniel DeLeo (<dan@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
|
+
|
|
19
|
+
require 'chef/knife/core/text_formatter'
|
|
20
|
+
require 'chef/knife/core/generic_presenter'
|
|
21
|
+
|
|
22
|
+
class Chef
|
|
23
|
+
class Knife
|
|
24
|
+
module Core
|
|
25
|
+
|
|
26
|
+
# This module may be included into a knife subcommand class to automatically
|
|
27
|
+
# add configuration options used by the NodePresenter
|
|
28
|
+
module NodeFormattingOptions
|
|
29
|
+
# :nodoc:
|
|
30
|
+
# Would prefer to do this in a rational way, but can't be done b/c of
|
|
31
|
+
# Mixlib::CLI's design :(
|
|
32
|
+
def self.included(includer)
|
|
33
|
+
includer.class_eval do
|
|
34
|
+
option :medium_output,
|
|
35
|
+
:short => '-m',
|
|
36
|
+
:long => '--medium',
|
|
37
|
+
:boolean => true,
|
|
38
|
+
:default => false,
|
|
39
|
+
:description => 'Include normal attributes in the output'
|
|
40
|
+
|
|
41
|
+
option :long_output,
|
|
42
|
+
:short => '-l',
|
|
43
|
+
:long => '--long',
|
|
44
|
+
:boolean => true,
|
|
45
|
+
:default => false,
|
|
46
|
+
:description => 'Include all attributes in the output'
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
#==Chef::Knife::Core::NodePresenter
|
|
52
|
+
# A customized presenter for Chef::Node objects. Supports variable-length
|
|
53
|
+
# output formats for displaying node data
|
|
54
|
+
class NodePresenter < GenericPresenter
|
|
55
|
+
|
|
56
|
+
def format(data)
|
|
57
|
+
if parse_format_option == :json
|
|
58
|
+
summarize_json(data)
|
|
59
|
+
else
|
|
60
|
+
super
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def summarize_json(data)
|
|
65
|
+
if data.kind_of?(Chef::Node)
|
|
66
|
+
node = data
|
|
67
|
+
result = {}
|
|
68
|
+
|
|
69
|
+
result["name"] = node.name
|
|
70
|
+
result["chef_environment"] = node.chef_environment
|
|
71
|
+
result["run_list"] = node.run_list
|
|
72
|
+
result["normal"] = node.normal_attrs
|
|
73
|
+
|
|
74
|
+
if config[:long_output]
|
|
75
|
+
result["default"] = node.default_attrs
|
|
76
|
+
result["override"] = node.override_attrs
|
|
77
|
+
result["automatic"] = node.automatic_attrs
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
Chef::JSONCompat.to_json_pretty(result)
|
|
81
|
+
else
|
|
82
|
+
Chef::JSONCompat.to_json_pretty(data)
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# Converts a Chef::Node object to a string suitable for output to a
|
|
87
|
+
# terminal. If config[:medium_output] or config[:long_output] are set
|
|
88
|
+
# the volume of output is adjusted accordingly. Uses colors if enabled
|
|
89
|
+
# in the the ui object.
|
|
90
|
+
def summarize(data)
|
|
91
|
+
if data.kind_of?(Chef::Node)
|
|
92
|
+
node = data
|
|
93
|
+
# special case ec2 with their split horizon whatsis.
|
|
94
|
+
ip = (node[:ec2] && node[:ec2][:public_ipv4]) || node[:ipaddress]
|
|
95
|
+
|
|
96
|
+
summarized=<<-SUMMARY
|
|
97
|
+
#{ui.color('Node Name:', :bold)} #{ui.color(node.name, :bold)}
|
|
98
|
+
#{key('Environment:')} #{node.chef_environment}
|
|
99
|
+
#{key('FQDN:')} #{node[:fqdn]}
|
|
100
|
+
#{key('IP:')} #{ip}
|
|
101
|
+
#{key('Run List:')} #{node.run_list}
|
|
102
|
+
#{key('Roles:')} #{Array(node[:roles]).join(', ')}
|
|
103
|
+
#{key('Recipes:')} #{Array(node[:recipes]).join(', ')}
|
|
104
|
+
#{key('Platform:')} #{node[:platform]} #{node[:platform_version]}
|
|
105
|
+
SUMMARY
|
|
106
|
+
if config[:medium_output] || config[:long_output]
|
|
107
|
+
summarized +=<<-MORE
|
|
108
|
+
#{key('Attributes:')}
|
|
109
|
+
#{text_format(node.normal_attrs)}
|
|
110
|
+
MORE
|
|
111
|
+
end
|
|
112
|
+
if config[:long_output]
|
|
113
|
+
summarized +=<<-MOST
|
|
114
|
+
#{key('Default Attributes:')}
|
|
115
|
+
#{text_format(node.default_attrs)}
|
|
116
|
+
#{key('Override Attributes:')}
|
|
117
|
+
#{text_format(node.override_attrs)}
|
|
118
|
+
#{key('Automatic Attributes (Ohai Data):')}
|
|
119
|
+
#{text_format(node.automatic_attrs)}
|
|
120
|
+
MOST
|
|
121
|
+
end
|
|
122
|
+
summarized
|
|
123
|
+
else
|
|
124
|
+
super
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def key(key_text)
|
|
129
|
+
ui.color(key_text, :cyan)
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Daniel DeLeo (<dan@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
|
+
|
|
19
|
+
class Chef
|
|
20
|
+
class Knife
|
|
21
|
+
module Core
|
|
22
|
+
class ObjectLoader
|
|
23
|
+
|
|
24
|
+
attr_reader :ui
|
|
25
|
+
attr_reader :klass
|
|
26
|
+
|
|
27
|
+
def initialize(klass, ui)
|
|
28
|
+
@klass = klass
|
|
29
|
+
@ui = ui
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def load_from(repo_location, *components)
|
|
33
|
+
unless object_file = find_file(repo_location, *components)
|
|
34
|
+
ui.error "Could not find or open file for #{components.join(' ')}"
|
|
35
|
+
exit 1
|
|
36
|
+
end
|
|
37
|
+
object_from_file(object_file)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def find_file(repo_location, *components)
|
|
41
|
+
if file_exists_and_is_readable?(File.expand_path( components.last ))
|
|
42
|
+
File.expand_path( components.last )
|
|
43
|
+
else
|
|
44
|
+
relative_path = File.join(Dir.pwd, repo_location, *components)
|
|
45
|
+
if file_exists_and_is_readable?(relative_path)
|
|
46
|
+
relative_path
|
|
47
|
+
else
|
|
48
|
+
nil
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def object_from_file(filename)
|
|
54
|
+
case filename
|
|
55
|
+
when /\.(js|json)$/
|
|
56
|
+
Chef::JSONCompat.from_json(IO.read(filename))
|
|
57
|
+
when /\.rb$/
|
|
58
|
+
r = klass.new
|
|
59
|
+
r.from_file(filename)
|
|
60
|
+
r
|
|
61
|
+
else
|
|
62
|
+
ui.fatal("File must end in .js, .json, or .rb")
|
|
63
|
+
exit 30
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def file_exists_and_is_readable?(file)
|
|
68
|
+
File.exists?(file) && File.readable?(file)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# Author:: Christopher Brown (<cb@opscode.com>)
|
|
2
|
+
# Author:: Daniel DeLeo (<dan@opscode.com>)
|
|
3
|
+
# Copyright:: Copyright (c) 2009, 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
|
+
|
|
19
|
+
require 'chef/version'
|
|
20
|
+
class Chef
|
|
21
|
+
class Knife
|
|
22
|
+
class SubcommandLoader
|
|
23
|
+
|
|
24
|
+
CHEF_FILE_IN_GEM = /chef-[\d]+\.[\d]+\.[\d]+/
|
|
25
|
+
CURRENT_CHEF_GEM = /chef-#{Regexp.escape(Chef::VERSION)}/
|
|
26
|
+
|
|
27
|
+
attr_reader :chef_config_dir
|
|
28
|
+
attr_reader :env
|
|
29
|
+
|
|
30
|
+
def initialize(chef_config_dir, env=ENV)
|
|
31
|
+
@chef_config_dir, @env = chef_config_dir, env
|
|
32
|
+
@forced_activate = {}
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Load all the sub-commands
|
|
36
|
+
def load_commands
|
|
37
|
+
subcommand_files.each { |subcommand| Kernel.load subcommand }
|
|
38
|
+
true
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Returns an Array of paths to knife commands located in chef_config_dir/plugins/knife/
|
|
42
|
+
# and ~/.chef/plugins/knife/
|
|
43
|
+
def site_subcommands
|
|
44
|
+
user_specific_files = []
|
|
45
|
+
|
|
46
|
+
if chef_config_dir
|
|
47
|
+
user_specific_files.concat Dir.glob(File.expand_path("plugins/knife/*.rb", chef_config_dir))
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# finally search ~/.chef/plugins/knife/*.rb
|
|
51
|
+
user_specific_files.concat Dir.glob(File.join(env['HOME'], '.chef', 'plugins', 'knife', '*.rb'))
|
|
52
|
+
|
|
53
|
+
user_specific_files
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# Returns a Hash of paths to knife commands built-in to chef, or installed via gem.
|
|
57
|
+
# If rubygems is not installed, falls back to globbing the knife directory.
|
|
58
|
+
# The Hash is of the form {"relative/path" => "/absolute/path"}
|
|
59
|
+
#--
|
|
60
|
+
# Note: the "right" way to load the plugins is to require the relative path, i.e.,
|
|
61
|
+
# require 'chef/knife/command'
|
|
62
|
+
# but we're getting frustrated by bugs at every turn, and it's slow besides. So
|
|
63
|
+
# subcommand loader has been modified to load the plugins by using Kernel.load
|
|
64
|
+
# with the absolute path.
|
|
65
|
+
def gem_and_builtin_subcommands
|
|
66
|
+
# search all gems for chef/knife/*.rb
|
|
67
|
+
require 'rubygems'
|
|
68
|
+
find_subcommands_via_rubygems
|
|
69
|
+
rescue LoadError
|
|
70
|
+
find_subcommands_via_dirglob
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def subcommand_files
|
|
74
|
+
@subcommand_files ||= (gem_and_builtin_subcommands.values + site_subcommands).flatten.uniq
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def find_subcommands_via_dirglob
|
|
78
|
+
# The "require paths" of the core knife subcommands bundled with chef
|
|
79
|
+
files = Dir[File.expand_path('../../../knife/*.rb', __FILE__)]
|
|
80
|
+
subcommand_files = {}
|
|
81
|
+
files.each do |knife_file|
|
|
82
|
+
rel_path = knife_file[/#{CHEF_ROOT}#{Regexp.escape(File::SEPARATOR)}(.*)\.rb/,1]
|
|
83
|
+
subcommand_files[rel_path] = knife_file
|
|
84
|
+
end
|
|
85
|
+
subcommand_files
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def find_subcommands_via_rubygems
|
|
89
|
+
files = Gem.find_files 'chef/knife/*.rb'
|
|
90
|
+
files.reject! {|f| from_old_gem?(f) }
|
|
91
|
+
subcommand_files = {}
|
|
92
|
+
files.each do |file|
|
|
93
|
+
rel_path = file[/(#{Regexp.escape File.join('chef', 'knife', '')}.*)\.rb/, 1]
|
|
94
|
+
subcommand_files[rel_path] = file
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
subcommand_files.merge(find_subcommands_via_dirglob)
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
private
|
|
101
|
+
|
|
102
|
+
# wow, this is a sad hack :(
|
|
103
|
+
# Gem.find_files finds files in all versions of a gem, which
|
|
104
|
+
# means that if chef 0.10 and 0.9.x are installed, we'll try to
|
|
105
|
+
# require, e.g., chef/knife/ec2_server_create, which will cause
|
|
106
|
+
# a gem activation error. So remove files from older chef gems.
|
|
107
|
+
def from_old_gem?(path)
|
|
108
|
+
path =~ CHEF_FILE_IN_GEM && path !~ CURRENT_CHEF_GEM
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
end
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Daniel DeLeo (<dan@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
|
+
|
|
19
|
+
class Chef
|
|
20
|
+
class Knife
|
|
21
|
+
module Core
|
|
22
|
+
class TextFormatter
|
|
23
|
+
|
|
24
|
+
attr_reader :data
|
|
25
|
+
attr_reader :ui
|
|
26
|
+
|
|
27
|
+
def initialize(data, ui)
|
|
28
|
+
@ui = ui
|
|
29
|
+
@data = if data.respond_to?(:display_hash)
|
|
30
|
+
data.display_hash
|
|
31
|
+
elsif data.kind_of?(Array)
|
|
32
|
+
data
|
|
33
|
+
elsif data.respond_to?(:to_hash)
|
|
34
|
+
data.to_hash
|
|
35
|
+
else
|
|
36
|
+
data
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def formatted_data
|
|
41
|
+
@formatted_data ||= text_format(data)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def text_format(data, indent=0)
|
|
45
|
+
buffer = ''
|
|
46
|
+
|
|
47
|
+
if data.respond_to?(:keys)
|
|
48
|
+
justify_width = data.keys.map {|k| k.to_s.size }.max.to_i + 2
|
|
49
|
+
data.sort.each do |key, value|
|
|
50
|
+
justified_key = ui.color("#{key}:".ljust(justify_width), :cyan)
|
|
51
|
+
if should_enumerate?(value)
|
|
52
|
+
buffer << indent_line(justified_key, indent)
|
|
53
|
+
buffer << text_format(value, indent + 1)
|
|
54
|
+
else
|
|
55
|
+
buffer << indent_key_value(justified_key, value, justify_width, indent)
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
elsif data.kind_of?(Array)
|
|
59
|
+
data.each do |item|
|
|
60
|
+
if should_enumerate?(data)
|
|
61
|
+
buffer << text_format(item, indent + 1)
|
|
62
|
+
else
|
|
63
|
+
buffer << indent_line(item, indent)
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
else
|
|
67
|
+
buffer << indent_line(stringify_value(data), indent)
|
|
68
|
+
end
|
|
69
|
+
buffer
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Ruby 1.8 Strings include enumberable, which is not what we want. So
|
|
73
|
+
# we have this heuristic to detect hashes and arrays instead.
|
|
74
|
+
def should_enumerate?(value)
|
|
75
|
+
((value.respond_to?(:keys) && !value.empty? ) || ( value.kind_of?(Array) && (value.size > 1 || should_enumerate?(value.first) )))
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def indent_line(string, indent)
|
|
79
|
+
(" " * indent) << "#{string}\n"
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def indent_key_value(key, value, justify_width, indent)
|
|
83
|
+
lines = value.to_s.split("\n")
|
|
84
|
+
if lines.size > 1
|
|
85
|
+
total_indent = (2 * indent) + justify_width + 1
|
|
86
|
+
indent_line("#{key} #{lines.shift}", indent) << lines.map {|l| (" " * total_indent) + l << "\n" }.join("")
|
|
87
|
+
else
|
|
88
|
+
indent_line("#{key} #{stringify_value(value)}", indent)
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def stringify_value(data)
|
|
93
|
+
data.kind_of?(String) ? data : data.to_s
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Adam Jacob (<adam@opscode.com>)
|
|
3
|
+
# Author:: Christopher Brown (<cb@opscode.com>)
|
|
4
|
+
# Author:: Daniel DeLeo (<dan@opscode.com>)
|
|
5
|
+
# Copyright:: Copyright (c) 2009, 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 'forwardable'
|
|
22
|
+
require 'chef/knife/core/generic_presenter'
|
|
23
|
+
|
|
24
|
+
class Chef
|
|
25
|
+
class Knife
|
|
26
|
+
|
|
27
|
+
#==Chef::Knife::UI
|
|
28
|
+
# The User Interaction class used by knife.
|
|
29
|
+
class UI
|
|
30
|
+
|
|
31
|
+
extend Forwardable
|
|
32
|
+
|
|
33
|
+
attr_reader :stdout
|
|
34
|
+
attr_reader :stderr
|
|
35
|
+
attr_reader :stdin
|
|
36
|
+
attr_reader :config
|
|
37
|
+
|
|
38
|
+
def_delegator :@presenter, :format_list_for_display
|
|
39
|
+
def_delegator :@presenter, :format_for_display
|
|
40
|
+
def_delegator :@presenter, :format_cookbook_list_for_display
|
|
41
|
+
|
|
42
|
+
def initialize(stdout, stderr, stdin, config)
|
|
43
|
+
@stdout, @stderr, @stdin, @config = stdout, stderr, stdin, config
|
|
44
|
+
@presenter = Chef::Knife::Core::GenericPresenter.new(self, config)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Creates a new +presenter_class+ object and uses it to format structured
|
|
48
|
+
# data for display. By default, a Chef::Knife::Core::GenericPresenter
|
|
49
|
+
# object is used.
|
|
50
|
+
def use_presenter(presenter_class)
|
|
51
|
+
@presenter = presenter_class.new(self, config)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def highline
|
|
55
|
+
@highline ||= begin
|
|
56
|
+
require 'highline'
|
|
57
|
+
HighLine.new
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# Prints a message to stdout. Aliased as +info+ for compatibility with
|
|
62
|
+
# the logger API.
|
|
63
|
+
def msg(message)
|
|
64
|
+
stdout.puts message
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
alias :info :msg
|
|
68
|
+
|
|
69
|
+
# Prints a msg to stderr. Used for warn, error, and fatal.
|
|
70
|
+
def err(message)
|
|
71
|
+
stderr.puts message
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# Print a warning message
|
|
75
|
+
def warn(message)
|
|
76
|
+
err("#{color('WARNING:', :yellow, :bold)} #{message}")
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# Print an error message
|
|
80
|
+
def error(message)
|
|
81
|
+
err("#{color('ERROR:', :red, :bold)} #{message}")
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# Print a message describing a fatal error.
|
|
85
|
+
def fatal(message)
|
|
86
|
+
err("#{color('FATAL:', :red, :bold)} #{message}")
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def color(string, *colors)
|
|
90
|
+
if color?
|
|
91
|
+
highline.color(string, *colors)
|
|
92
|
+
else
|
|
93
|
+
string
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# Should colored output be used? For output to a terminal, this is
|
|
98
|
+
# determined by the value of `config[:color]`. When output is not to a
|
|
99
|
+
# terminal, colored output is never used
|
|
100
|
+
def color?
|
|
101
|
+
Chef::Config[:color] && stdout.tty? && (RUBY_PLATFORM !~ /mswin|mingw32|windows/)
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def ask(*args, &block)
|
|
105
|
+
highline.ask(*args, &block)
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def list(*args)
|
|
109
|
+
highline.list(*args)
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# Formats +data+ using the configured presenter and outputs the result
|
|
113
|
+
# via +msg+. Formatting can be customized by configuring a different
|
|
114
|
+
# presenter. See +use_presenter+
|
|
115
|
+
def output(data)
|
|
116
|
+
msg @presenter.format(data)
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
# Determines if the output format is a data interchange format, i.e.,
|
|
120
|
+
# JSON or YAML
|
|
121
|
+
def interchange?
|
|
122
|
+
@presenter.interchange?
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def ask_question(question, opts={})
|
|
126
|
+
question = question + "[#{opts[:default]}] " if opts[:default]
|
|
127
|
+
|
|
128
|
+
if opts[:default] and config[:defaults]
|
|
129
|
+
opts[:default]
|
|
130
|
+
else
|
|
131
|
+
stdout.print question
|
|
132
|
+
a = stdin.readline.strip
|
|
133
|
+
|
|
134
|
+
if opts[:default]
|
|
135
|
+
a.empty? ? opts[:default] : a
|
|
136
|
+
else
|
|
137
|
+
a
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def pretty_print(data)
|
|
143
|
+
stdout.puts data
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def edit_data(data, parse_output=true)
|
|
147
|
+
output = Chef::JSONCompat.to_json_pretty(data)
|
|
148
|
+
|
|
149
|
+
if (!config[:no_editor])
|
|
150
|
+
filename = "knife-edit-"
|
|
151
|
+
0.upto(20) { filename += rand(9).to_s }
|
|
152
|
+
filename << ".js"
|
|
153
|
+
filename = File.join(Dir.tmpdir, filename)
|
|
154
|
+
tf = File.open(filename, "w")
|
|
155
|
+
tf.sync = true
|
|
156
|
+
tf.puts output
|
|
157
|
+
tf.close
|
|
158
|
+
raise "Please set EDITOR environment variable" unless system("#{config[:editor]} #{tf.path}")
|
|
159
|
+
tf = File.open(filename, "r")
|
|
160
|
+
output = tf.gets(nil)
|
|
161
|
+
tf.close
|
|
162
|
+
File.unlink(filename)
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
parse_output ? Chef::JSONCompat.from_json(output) : output
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
def edit_object(klass, name)
|
|
169
|
+
object = klass.load(name)
|
|
170
|
+
|
|
171
|
+
output = edit_data(object)
|
|
172
|
+
|
|
173
|
+
# Only make the save if the user changed the object.
|
|
174
|
+
#
|
|
175
|
+
# Output JSON for the original (object) and edited (output), then parse
|
|
176
|
+
# them without reconstituting the objects into real classes
|
|
177
|
+
# (create_additions=false). Then, compare the resulting simple objects,
|
|
178
|
+
# which will be Array/Hash/String/etc.
|
|
179
|
+
#
|
|
180
|
+
# We wouldn't have to do these shenanigans if all the editable objects
|
|
181
|
+
# implemented to_hash, or if to_json against a hash returned a string
|
|
182
|
+
# with stable key order.
|
|
183
|
+
object_parsed_again = Chef::JSONCompat.from_json(Chef::JSONCompat.to_json(object), :create_additions => false)
|
|
184
|
+
output_parsed_again = Chef::JSONCompat.from_json(Chef::JSONCompat.to_json(output), :create_additions => false)
|
|
185
|
+
if object_parsed_again != output_parsed_again
|
|
186
|
+
output.save
|
|
187
|
+
self.msg("Saved #{output}")
|
|
188
|
+
else
|
|
189
|
+
self.msg("Object unchanged, not saving")
|
|
190
|
+
end
|
|
191
|
+
output(format_for_display(object)) if config[:print_after]
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
def confirm(question, append_instructions=true)
|
|
195
|
+
return true if config[:yes]
|
|
196
|
+
|
|
197
|
+
stdout.print question
|
|
198
|
+
stdout.print "? (Y/N) " if append_instructions
|
|
199
|
+
answer = stdin.readline
|
|
200
|
+
answer.chomp!
|
|
201
|
+
case answer
|
|
202
|
+
when "Y", "y"
|
|
203
|
+
true
|
|
204
|
+
when "N", "n"
|
|
205
|
+
self.msg("You said no, so I'm done here.")
|
|
206
|
+
exit 3
|
|
207
|
+
else
|
|
208
|
+
self.msg("I have no idea what to do with #{answer}")
|
|
209
|
+
self.msg("Just say Y or N, please.")
|
|
210
|
+
confirm(question)
|
|
211
|
+
end
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
end
|
|
215
|
+
end
|
|
216
|
+
end
|