chef 11.4.4 → 11.6.0.hotfix.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +1 -1
- data/Rakefile +18 -1
- data/bin/chef-service-manager +37 -0
- data/distro/common/html/chef-client.8.html +4 -4
- data/distro/common/html/chef-expander.8.html +4 -4
- data/distro/common/html/chef-expanderctl.8.html +4 -4
- data/distro/common/html/chef-server-webui.8.html +4 -4
- data/distro/common/html/chef-server.8.html +4 -4
- data/distro/common/html/chef-shell.1.html +4 -4
- data/distro/common/html/chef-solo.8.html +12 -18
- data/distro/common/html/chef-solr.8.html +4 -4
- data/distro/common/html/knife-bootstrap.1.html +4 -4
- data/distro/common/html/knife-client.1.html +4 -4
- data/distro/common/html/knife-configure.1.html +4 -4
- data/distro/common/html/knife-cookbook-site.1.html +4 -4
- data/distro/common/html/knife-cookbook.1.html +7 -10
- data/distro/common/html/knife-data-bag.1.html +7 -10
- data/distro/common/html/knife-environment.1.html +6 -8
- data/distro/common/html/knife-exec.1.html +4 -4
- data/distro/common/html/knife-index.1.html +4 -4
- data/distro/common/html/knife-node.1.html +4 -4
- data/distro/common/html/knife-role.1.html +4 -4
- data/distro/common/html/knife-search.1.html +4 -4
- data/distro/common/html/knife-ssh.1.html +4 -4
- data/distro/common/html/knife-status.1.html +4 -4
- data/distro/common/html/knife-tag.1.html +4 -4
- data/distro/common/html/knife.1.html +4 -4
- data/distro/common/man/man1/chef-shell.1 +1 -1
- data/distro/common/man/man1/knife-bootstrap.1 +1 -1
- data/distro/common/man/man1/knife-client.1 +1 -1
- data/distro/common/man/man1/knife-configure.1 +1 -1
- data/distro/common/man/man1/knife-cookbook-site.1 +1 -1
- data/distro/common/man/man1/knife-cookbook.1 +2 -15
- data/distro/common/man/man1/knife-data-bag.1 +2 -15
- data/distro/common/man/man1/knife-environment.1 +2 -12
- data/distro/common/man/man1/knife-exec.1 +1 -1
- data/distro/common/man/man1/knife-index.1 +1 -1
- data/distro/common/man/man1/knife-node.1 +1 -1
- data/distro/common/man/man1/knife-role.1 +1 -1
- data/distro/common/man/man1/knife-search.1 +1 -1
- data/distro/common/man/man1/knife-ssh.1 +1 -1
- data/distro/common/man/man1/knife-status.1 +1 -1
- data/distro/common/man/man1/knife-tag.1 +1 -1
- data/distro/common/man/man1/knife.1 +1 -1
- data/distro/common/man/man8/chef-client.8 +1 -1
- data/distro/common/man/man8/chef-expander.8 +1 -1
- data/distro/common/man/man8/chef-expanderctl.8 +1 -1
- data/distro/common/man/man8/chef-server-webui.8 +1 -1
- data/distro/common/man/man8/chef-server.8 +1 -1
- data/distro/common/man/man8/chef-solo.8 +4 -36
- data/distro/common/man/man8/chef-solr.8 +1 -1
- data/distro/debian/etc/init.d/chef-client +4 -2
- data/distro/windows/service_manager.rb +2 -146
- data/lib/chef.rb +1 -1
- data/lib/chef/application.rb +5 -12
- data/lib/chef/application/apply.rb +2 -0
- data/lib/chef/application/client.rb +12 -12
- data/lib/chef/application/knife.rb +2 -2
- data/lib/chef/application/solo.rb +4 -5
- data/lib/chef/application/windows_service.rb +113 -56
- data/lib/chef/application/windows_service_manager.rb +179 -0
- data/lib/chef/chef_fs.rb +2 -4
- data/lib/chef/chef_fs/chef_fs_data_store.rb +371 -0
- data/lib/chef/chef_fs/command_line.rb +145 -93
- data/lib/chef/chef_fs/config.rb +205 -0
- data/lib/chef/chef_fs/data_handler/acl_data_handler.rb +26 -0
- data/lib/chef/chef_fs/data_handler/client_data_handler.rb +38 -0
- data/lib/chef/chef_fs/data_handler/container_data_handler.rb +29 -0
- data/lib/chef/chef_fs/data_handler/cookbook_data_handler.rb +38 -0
- data/lib/chef/chef_fs/data_handler/data_bag_item_data_handler.rb +56 -0
- data/lib/chef/chef_fs/data_handler/data_handler_base.rb +128 -0
- data/lib/chef/chef_fs/data_handler/environment_data_handler.rb +40 -0
- data/lib/chef/chef_fs/data_handler/group_data_handler.rb +51 -0
- data/lib/chef/chef_fs/data_handler/node_data_handler.rb +36 -0
- data/lib/chef/chef_fs/data_handler/role_data_handler.rb +40 -0
- data/lib/chef/chef_fs/data_handler/user_data_handler.rb +27 -0
- data/lib/chef/chef_fs/file_system.rb +195 -127
- data/lib/chef/chef_fs/file_system/acl_dir.rb +64 -0
- data/lib/chef/chef_fs/file_system/acl_entry.rb +58 -0
- data/lib/chef/chef_fs/file_system/acls_dir.rb +68 -0
- data/lib/chef/chef_fs/file_system/already_exists_error.rb +31 -0
- data/lib/chef/chef_fs/file_system/base_fs_object.rb +98 -39
- data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbook_dir.rb +85 -0
- data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbook_entry.rb +71 -0
- data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbooks_dir.rb +55 -0
- data/lib/chef/chef_fs/file_system/chef_repository_file_system_data_bags_dir.rb +36 -0
- data/lib/chef/chef_fs/file_system/chef_repository_file_system_entry.rb +14 -63
- data/lib/chef/chef_fs/file_system/chef_repository_file_system_root_dir.rb +93 -3
- data/lib/chef/chef_fs/file_system/chef_server_root_dir.rb +35 -9
- data/lib/chef/chef_fs/file_system/cookbook_dir.rb +67 -32
- data/lib/chef/chef_fs/file_system/cookbook_file.rb +13 -6
- data/lib/chef/chef_fs/file_system/cookbook_frozen_error.rb +31 -0
- data/lib/chef/chef_fs/file_system/cookbooks_acl_dir.rb +41 -0
- data/lib/chef/chef_fs/file_system/cookbooks_dir.rb +102 -21
- data/lib/chef/chef_fs/file_system/data_bag_dir.rb +12 -21
- data/lib/chef/chef_fs/file_system/data_bags_dir.rb +14 -8
- data/lib/chef/chef_fs/file_system/default_environment_cannot_be_modified_error.rb +36 -0
- data/lib/chef/chef_fs/file_system/environments_dir.rb +60 -0
- data/lib/chef/chef_fs/file_system/file_system_entry.rb +8 -8
- data/lib/chef/chef_fs/file_system/file_system_error.rb +3 -1
- data/lib/chef/chef_fs/file_system/memory_dir.rb +52 -0
- data/lib/chef/chef_fs/file_system/memory_file.rb +17 -0
- data/lib/chef/chef_fs/file_system/memory_root.rb +21 -0
- data/lib/chef/chef_fs/file_system/multiplexed_dir.rb +48 -0
- data/lib/chef/chef_fs/file_system/must_delete_recursively_error.rb +2 -2
- data/lib/chef/chef_fs/file_system/nodes_dir.rb +17 -9
- data/lib/chef/chef_fs/file_system/nonexistent_fs_object.rb +0 -4
- data/lib/chef/chef_fs/file_system/not_found_error.rb +2 -2
- data/lib/chef/chef_fs/file_system/operation_failed_error.rb +34 -0
- data/lib/chef/chef_fs/file_system/operation_not_allowed_error.rb +48 -0
- data/lib/chef/chef_fs/file_system/rest_list_dir.rb +42 -13
- data/lib/chef/chef_fs/file_system/rest_list_entry.rb +81 -27
- data/lib/chef/chef_fs/knife.rb +68 -29
- data/lib/chef/chef_fs/parallelizer.rb +129 -0
- data/lib/chef/chef_fs/path_utils.rb +29 -3
- data/lib/chef/chef_fs/raw_request.rb +79 -0
- data/lib/chef/client.rb +46 -20
- data/lib/chef/config.rb +59 -61
- data/lib/chef/cookbook/chefignore.rb +2 -1
- data/lib/chef/cookbook/synchronizer.rb +8 -6
- data/lib/chef/cookbook/syntax_check.rb +17 -2
- data/lib/chef/cookbook_uploader.rb +10 -1
- data/lib/chef/cookbook_version.rb +0 -109
- data/lib/chef/data_bag.rb +15 -6
- data/lib/chef/deprecation/mixin/template.rb +49 -0
- data/lib/chef/deprecation/provider/cookbook_file.rb +55 -0
- data/lib/chef/deprecation/provider/file.rb +197 -0
- data/lib/chef/deprecation/provider/remote_file.rb +86 -0
- data/lib/chef/deprecation/provider/template.rb +63 -0
- data/lib/chef/deprecation/warnings.rb +38 -0
- data/lib/chef/encrypted_data_bag_item.rb +153 -61
- data/lib/chef/environment.rb +34 -3
- data/lib/chef/event_dispatch/base.rb +3 -0
- data/lib/chef/exceptions.rb +27 -2
- data/lib/chef/file_access_control/unix.rb +64 -7
- data/lib/chef/file_access_control/windows.rb +22 -11
- data/lib/chef/file_content_management/content_base.rb +56 -0
- data/lib/chef/file_content_management/deploy.rb +38 -0
- data/lib/chef/file_content_management/deploy/cp.rb +48 -0
- data/lib/chef/file_content_management/deploy/mv_unix.rb +77 -0
- data/lib/chef/file_content_management/deploy/mv_windows.rb +95 -0
- data/lib/chef/file_content_management/tempfile.rb +61 -0
- data/lib/chef/formatters/doc.rb +1 -1
- data/lib/chef/formatters/error_descriptor.rb +5 -4
- data/lib/chef/formatters/error_inspectors/cookbook_resolve_error_inspector.rb +23 -3
- data/lib/chef/formatters/error_inspectors/registration_error_inspector.rb +4 -0
- data/lib/chef/json_compat.rb +3 -0
- data/lib/chef/knife.rb +12 -3
- data/lib/chef/knife/bootstrap.rb +46 -2
- data/lib/chef/knife/bootstrap/archlinux-gems.erb +3 -3
- data/lib/chef/knife/bootstrap/centos5-gems.erb +3 -3
- data/lib/chef/knife/bootstrap/chef-full.erb +4 -4
- data/lib/chef/knife/bootstrap/fedora13-gems.erb +3 -3
- data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +3 -3
- data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +3 -3
- data/lib/chef/knife/bootstrap/ubuntu12.04-gems.erb +3 -3
- data/lib/chef/knife/client_show.rb +2 -5
- data/lib/chef/knife/configure.rb +3 -3
- data/lib/chef/knife/cookbook_create.rb +6 -5
- data/lib/chef/knife/cookbook_download.rb +13 -5
- data/lib/chef/knife/cookbook_site_share.rb +1 -0
- data/lib/chef/knife/cookbook_test.rb +1 -0
- data/lib/chef/knife/cookbook_upload.rb +4 -9
- data/lib/chef/knife/core/bootstrap_context.rb +10 -4
- data/lib/chef/knife/core/generic_presenter.rb +16 -0
- data/lib/chef/knife/core/node_editor.rb +1 -1
- data/lib/chef/knife/core/subcommand_loader.rb +43 -12
- data/lib/chef/knife/core/ui.rb +19 -4
- data/lib/chef/knife/delete.rb +76 -9
- data/lib/chef/knife/deps.rb +139 -0
- data/lib/chef/knife/diff.rb +22 -5
- data/lib/chef/knife/download.rb +16 -3
- data/lib/chef/knife/edit.rb +76 -0
- data/lib/chef/knife/environment_show.rb +2 -7
- data/lib/chef/knife/list.rb +91 -47
- data/lib/chef/knife/node_run_list_set.rb +66 -0
- data/lib/chef/knife/node_show.rb +1 -7
- data/lib/chef/knife/raw.rb +20 -64
- data/lib/chef/knife/role_show.rb +2 -4
- data/lib/chef/knife/search.rb +5 -6
- data/lib/chef/knife/show.rb +34 -11
- data/lib/chef/knife/ssh.rb +8 -0
- data/lib/chef/knife/upload.rb +23 -4
- data/lib/chef/knife/user_show.rb +2 -5
- data/lib/chef/knife/xargs.rb +265 -0
- data/lib/chef/log.rb +2 -2
- data/lib/chef/mixin/file_class.rb +0 -9
- data/lib/chef/mixin/language_include_recipe.rb +1 -1
- data/lib/chef/mixin/params_validate.rb +19 -9
- data/lib/chef/mixin/template.rb +126 -36
- data/lib/chef/mixin/windows_architecture_helper.rb +91 -0
- data/lib/chef/monkey_patches/file.rb +26 -0
- data/lib/chef/monkey_patches/net-ssh-multi.rb +140 -0
- data/lib/chef/monkey_patches/securerandom.rb +44 -0
- data/lib/chef/monologger.rb +93 -0
- data/lib/chef/node.rb +4 -0
- data/lib/chef/platform.rb +4 -490
- data/lib/chef/platform/provider_mapping.rb +529 -0
- data/lib/chef/{monkey_patches/dir.rb → platform/query_helpers.rb} +25 -19
- data/lib/chef/provider.rb +12 -9
- data/lib/chef/provider/batch.rb +35 -0
- data/lib/chef/provider/cookbook_file.rb +9 -78
- data/lib/chef/provider/cookbook_file/content.rb +49 -0
- data/lib/chef/provider/deploy.rb +24 -20
- data/lib/chef/provider/deploy/revision.rb +27 -0
- data/lib/chef/provider/directory.rb +19 -22
- data/lib/chef/provider/execute.rb +22 -5
- data/lib/chef/provider/file.rb +299 -217
- data/lib/chef/provider/file/content.rb +39 -0
- data/lib/chef/provider/git.rb +76 -43
- data/lib/chef/provider/group/usermod.rb +2 -2
- data/lib/chef/provider/ifconfig.rb +25 -35
- data/lib/chef/provider/ifconfig/debian.rb +71 -0
- data/lib/chef/provider/ifconfig/redhat.rb +47 -0
- data/lib/chef/provider/link.rb +10 -3
- data/lib/chef/provider/mount.rb +1 -1
- data/lib/chef/provider/mount/mount.rb +8 -3
- data/lib/chef/provider/mount/windows.rb +4 -1
- data/lib/chef/provider/package/portage.rb +9 -4
- data/lib/chef/provider/package/rubygems.rb +45 -10
- data/lib/chef/provider/package/smartos.rb +47 -36
- data/lib/chef/provider/package/yum.rb +19 -12
- data/lib/chef/provider/package/zypper.rb +45 -55
- data/lib/chef/provider/powershell_script.rb +77 -0
- data/lib/chef/provider/remote_directory.rb +5 -6
- data/lib/chef/provider/remote_file.rb +12 -108
- data/lib/chef/provider/remote_file/cache_control_data.rb +165 -0
- data/lib/chef/provider/remote_file/content.rb +75 -0
- data/lib/chef/provider/remote_file/fetcher.rb +43 -0
- data/lib/chef/provider/remote_file/ftp.rb +183 -0
- data/lib/chef/provider/remote_file/http.rb +124 -0
- data/lib/chef/provider/remote_file/local_file.rb +47 -0
- data/lib/chef/provider/route.rb +6 -2
- data/lib/chef/provider/script.rb +14 -2
- data/lib/chef/provider/service/macosx.rb +16 -10
- data/lib/chef/provider/service/solaris.rb +6 -5
- data/lib/chef/provider/template.rb +16 -78
- data/lib/chef/provider/template/content.rb +61 -0
- data/lib/chef/provider/user/solaris.rb +90 -0
- data/lib/chef/provider/user/useradd.rb +76 -63
- data/lib/chef/provider/windows_script.rb +73 -0
- data/lib/chef/providers.rb +16 -0
- data/lib/chef/resource.rb +23 -2
- data/lib/chef/resource/batch.rb +31 -0
- data/lib/chef/resource/conditional.rb +4 -0
- data/lib/chef/resource/conditional_action_not_nothing.rb +48 -0
- data/lib/chef/resource/file.rb +31 -3
- data/lib/chef/resource/link.rb +17 -0
- data/lib/chef/resource/lwrp_base.rb +1 -1
- data/lib/chef/resource/mount.rb +29 -2
- data/lib/chef/resource/powershell_script.rb +31 -0
- data/lib/chef/resource/remote_file.rb +47 -1
- data/lib/chef/resource/route.rb +1 -1
- data/lib/chef/resource/template.rb +145 -0
- data/lib/chef/resource/windows_script.rb +62 -0
- data/lib/chef/resource_collection.rb +45 -11
- data/lib/chef/resource_reporter.rb +81 -52
- data/lib/chef/resources.rb +2 -0
- data/lib/chef/rest.rb +13 -4
- data/lib/chef/rest/rest_request.rb +5 -1
- data/lib/chef/run_context/cookbook_compiler.rb +3 -3
- data/lib/chef/run_list/run_list_expansion.rb +1 -1
- data/lib/chef/run_lock.rb +7 -1
- data/lib/chef/runner.rb +0 -1
- data/lib/chef/scan_access_control.rb +6 -1
- data/lib/chef/search/query.rb +2 -2
- data/lib/chef/shell/shell_session.rb +2 -2
- data/lib/chef/util/backup.rb +84 -0
- data/lib/chef/util/diff.rb +145 -0
- data/lib/chef/util/file_edit.rb +1 -1
- data/lib/chef/util/selinux.rb +100 -0
- data/lib/chef/util/windows/net_user.rb +14 -1
- data/lib/chef/util/windows/volume.rb +2 -2
- data/lib/chef/version.rb +1 -1
- data/lib/chef/version/platform.rb +42 -0
- data/lib/chef/version_class.rb +1 -1
- data/lib/chef/version_constraint.rb +6 -5
- data/lib/chef/version_constraint/platform.rb +26 -0
- data/lib/chef/win32/api/file.rb +8 -2
- data/lib/chef/win32/version.rb +25 -8
- data/spec/data/apt/chef-integration-test-1.0/debian/changelog +5 -0
- data/spec/data/apt/chef-integration-test-1.0/debian/compat +1 -0
- data/spec/data/apt/chef-integration-test-1.0/debian/control +13 -0
- data/spec/data/apt/chef-integration-test-1.0/debian/copyright +34 -0
- data/spec/data/apt/chef-integration-test-1.0/debian/files +1 -0
- data/spec/data/apt/chef-integration-test-1.0/debian/rules +13 -0
- data/spec/data/apt/chef-integration-test-1.0/debian/source/format +1 -0
- data/spec/data/apt/chef-integration-test-1.1/debian/changelog +11 -0
- data/spec/data/apt/chef-integration-test-1.1/debian/compat +1 -0
- data/spec/data/apt/chef-integration-test-1.1/debian/control +13 -0
- data/spec/data/apt/chef-integration-test-1.1/debian/copyright +34 -0
- data/spec/data/apt/chef-integration-test-1.1/debian/files +1 -0
- data/spec/data/apt/chef-integration-test-1.1/debian/rules +13 -0
- data/spec/data/apt/chef-integration-test-1.1/debian/source/format +1 -0
- data/spec/data/apt/chef-integration-test_1.0-1_amd64.changes +22 -0
- data/spec/data/apt/chef-integration-test_1.0-1_amd64.deb +0 -0
- data/spec/data/apt/chef-integration-test_1.0.orig.tar.gz +0 -0
- data/spec/data/apt/chef-integration-test_1.1-1_amd64.changes +22 -0
- data/spec/data/apt/chef-integration-test_1.1-1_amd64.deb +0 -0
- data/spec/data/apt/chef-integration-test_1.1.orig.tar.gz +0 -0
- data/spec/data/apt/var/www/apt/conf/distributions +7 -0
- data/spec/data/apt/var/www/apt/conf/incoming +4 -0
- data/spec/data/apt/var/www/apt/conf/pulls +3 -0
- data/spec/data/apt/var/www/apt/db/checksums.db +0 -0
- data/spec/data/apt/var/www/apt/db/contents.cache.db +0 -0
- data/spec/data/apt/var/www/apt/db/packages.db +0 -0
- data/spec/data/apt/var/www/apt/db/references.db +0 -0
- data/spec/data/apt/var/www/apt/db/release.caches.db +0 -0
- data/spec/data/apt/var/www/apt/db/version +4 -0
- data/spec/data/apt/var/www/apt/dists/sid/Release +19 -0
- data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Packages +16 -0
- data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Packages.gz +0 -0
- data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Release +5 -0
- data/spec/data/apt/var/www/apt/dists/sid/main/binary-i386/Packages +0 -0
- data/spec/data/apt/var/www/apt/pool/main/c/chef-integration-test/chef-integration-test_1.0-1_amd64.deb +0 -0
- data/spec/data/apt/var/www/apt/pool/main/c/chef-integration-test/chef-integration-test_1.1-1_amd64.deb +0 -0
- data/spec/data/bootstrap/encrypted_data_bag_secret +1 -0
- data/spec/data/bootstrap/secret.erb +9 -0
- data/spec/data/cookbooks/ignorken/recipes/default.rb +1 -0
- data/spec/data/cookbooks/ignorken/recipes/ignoreme.rb +2 -0
- data/spec/data/cookbooks/openldap/files/default/.dotfile +1 -0
- data/spec/data/cookbooks/openldap/files/default/.ssh/id_rsa +1 -0
- data/spec/data/cookbooks/openldap/files/default/remotedir/.a_dotdir/.a_dotfile_in_a_dotdir +1 -0
- data/spec/data/cookbooks/openldap/files/default/remotedir/remotesubdir/.a_dotfile +1 -0
- data/spec/data/cookbooks/openldap/templates/default/all_windows_line_endings.erb +4 -0
- data/spec/data/cookbooks/openldap/templates/default/helper_test.erb +1 -0
- data/spec/data/cookbooks/openldap/templates/default/helpers_via_partial_test.erb +1 -0
- data/spec/data/cookbooks/openldap/templates/default/no_windows_line_endings.erb +4 -0
- data/spec/data/cookbooks/openldap/templates/default/some_windows_line_endings.erb +4 -0
- data/spec/data/cookbooks/preseed/files/default/preseed-file.seed +1 -0
- data/spec/data/cookbooks/preseed/templates/default/preseed-template.seed +1 -0
- data/spec/data/file-providers-method-snapshot-chef-11-4.json +127 -0
- data/spec/data/git_bundles/example-repo.gitbundle +0 -0
- data/spec/data/knife-home/.chef/plugins/knife/example_home_subcommand.rb +0 -0
- data/spec/data/knife_subcommand/test_yourself.rb +8 -0
- data/spec/data/null_config.rb +1 -0
- data/spec/data/partial_one.erb +1 -1
- data/spec/data/remote_file/nyan_cat.png.gz +0 -0
- data/spec/functional/file_content_management/deploy_strategies_spec.rb +238 -0
- data/spec/functional/knife/exec_spec.rb +2 -2
- data/spec/functional/provider/remote_file/cache_control_data_spec.rb +101 -0
- data/spec/functional/resource/batch_spec.rb +64 -0
- data/spec/functional/resource/cookbook_file_spec.rb +2 -3
- data/spec/functional/resource/deploy_revision_spec.rb +180 -0
- data/spec/functional/resource/directory_spec.rb +2 -2
- data/spec/functional/resource/file_spec.rb +17 -1
- data/spec/functional/resource/git_spec.rb +259 -0
- data/spec/functional/resource/link_spec.rb +422 -388
- data/spec/functional/resource/package_spec.rb +297 -0
- data/spec/functional/resource/powershell_spec.rb +188 -0
- data/spec/functional/resource/registry_spec.rb +8 -4
- data/spec/functional/resource/remote_directory_spec.rb +2 -2
- data/spec/functional/resource/remote_file_spec.rb +97 -29
- data/spec/functional/resource/template_spec.rb +173 -17
- data/spec/functional/resource/user_spec.rb +547 -0
- data/spec/functional/run_lock_spec.rb +5 -0
- data/spec/functional/shell_spec.rb +2 -1
- data/spec/functional/win32/service_manager_spec.rb +269 -0
- data/spec/functional/win32/versions_spec.rb +78 -0
- data/spec/integration/knife/chef_repo_path_spec.rb +805 -0
- data/spec/integration/knife/chef_repository_file_system_spec.rb +276 -0
- data/spec/integration/knife/chefignore_spec.rb +271 -0
- data/spec/integration/knife/delete_spec.rb +944 -0
- data/spec/integration/knife/deps_spec.rb +648 -0
- data/spec/integration/knife/diff_spec.rb +536 -0
- data/spec/integration/knife/download_spec.rb +962 -0
- data/spec/integration/knife/list_spec.rb +633 -0
- data/spec/integration/knife/raw_spec.rb +166 -0
- data/spec/integration/knife/redirection_spec.rb +57 -0
- data/spec/integration/knife/show_spec.rb +158 -0
- data/spec/integration/knife/upload_spec.rb +1060 -0
- data/spec/integration/solo/solo_spec.rb +41 -0
- data/spec/spec_helper.rb +55 -1
- data/spec/support/chef_helpers.rb +32 -0
- data/spec/support/platform_helpers.rb +40 -0
- data/spec/support/platforms/win32/spec_service.rb +59 -0
- data/spec/support/shared/functional/directory_resource.rb +43 -16
- data/spec/support/shared/functional/file_resource.rb +661 -20
- data/spec/support/shared/functional/securable_resource.rb +109 -8
- data/spec/support/shared/functional/securable_resource_with_reporting.rb +39 -31
- data/spec/support/shared/integration/integration_helper.rb +166 -0
- data/spec/support/shared/integration/knife_support.rb +171 -0
- data/spec/support/shared/unit/execute_resource.rb +125 -0
- data/spec/support/shared/unit/file_system_support.rb +8 -48
- data/spec/support/shared/unit/provider/file.rb +609 -0
- data/spec/support/shared/unit/provider/useradd_based_user_provider.rb +407 -0
- data/spec/support/shared/unit/script_resource.rb +52 -0
- data/spec/support/shared/unit/windows_script_resource.rb +48 -0
- data/spec/tiny_server.rb +13 -11
- data/spec/unit/application/client_spec.rb +39 -1
- data/spec/unit/application/knife_spec.rb +12 -0
- data/spec/unit/application/solo_spec.rb +1 -1
- data/spec/unit/application_spec.rb +57 -2
- data/spec/unit/chef_fs/diff_spec.rb +30 -31
- data/spec/unit/chef_fs/file_pattern_spec.rb +2 -2
- data/spec/unit/chef_fs/file_system_spec.rb +2 -3
- data/spec/unit/client_spec.rb +20 -1
- data/spec/unit/config_spec.rb +70 -52
- data/spec/unit/cookbook/synchronizer_spec.rb +49 -1
- data/spec/unit/cookbook/syntax_check_spec.rb +28 -3
- data/spec/unit/cookbook_loader_spec.rb +3 -2
- data/spec/unit/daemon_spec.rb +7 -7
- data/spec/unit/data_bag_spec.rb +7 -0
- data/spec/unit/deprecation_spec.rb +86 -0
- data/spec/unit/encrypted_data_bag_item_spec.rb +183 -88
- data/spec/unit/environment_spec.rb +98 -0
- data/spec/unit/exceptions_spec.rb +6 -1
- data/spec/unit/file_access_control_spec.rb +21 -1
- data/spec/unit/file_content_management/deploy/cp_spec.rb +46 -0
- data/spec/unit/file_content_management/deploy/mv_unix_spec.rb +103 -0
- data/spec/unit/file_content_management/deploy/mv_windows_spec.rb +179 -0
- data/spec/unit/formatters/error_inspectors/cookbook_resolve_error_inspector_spec.rb +38 -2
- data/spec/unit/formatters/error_inspectors/resource_failure_inspector_spec.rb +3 -2
- data/spec/unit/knife/bootstrap_spec.rb +128 -29
- data/spec/unit/knife/configure_spec.rb +42 -26
- data/spec/unit/knife/cookbook_download_spec.rb +24 -3
- data/spec/unit/knife/cookbook_upload_spec.rb +8 -4
- data/spec/unit/knife/core/bootstrap_context_spec.rb +78 -61
- data/spec/unit/knife/core/subcommand_loader_spec.rb +20 -0
- data/spec/unit/knife/core/ui_spec.rb +41 -0
- data/spec/unit/knife/node_run_list_set_spec.rb +140 -0
- data/spec/unit/knife_spec.rb +21 -0
- data/spec/unit/mixin/enforce_ownership_and_permissions_spec.rb +1 -0
- data/spec/unit/mixin/params_validate_spec.rb +35 -0
- data/spec/unit/mixin/template_spec.rb +69 -57
- data/spec/unit/mixin/windows_architecture_helper_spec.rb +83 -0
- data/spec/unit/node_spec.rb +7 -0
- data/spec/unit/platform_spec.rb +15 -1
- data/spec/unit/provider/cookbook_file/content_spec.rb +40 -0
- data/spec/unit/provider/cookbook_file_spec.rb +26 -183
- data/spec/unit/provider/cron/solaris_spec.rb +1 -1
- data/spec/unit/provider/deploy/revision_spec.rb +19 -11
- data/spec/unit/provider/deploy_spec.rb +2 -2
- data/spec/unit/provider/directory_spec.rb +23 -23
- data/spec/unit/provider/execute_spec.rb +27 -1
- data/spec/unit/provider/file/content_spec.rb +101 -0
- data/spec/unit/provider/file_spec.rb +25 -484
- data/spec/unit/provider/git_spec.rb +224 -28
- data/spec/unit/provider/group/usermod_spec.rb +3 -1
- data/spec/unit/provider/ifconfig/debian_spec.rb +89 -0
- data/spec/unit/provider/ifconfig/redhat_spec.rb +71 -0
- data/spec/unit/provider/ifconfig_spec.rb +0 -33
- data/spec/unit/provider/mount/mount_spec.rb +33 -2
- data/spec/unit/provider/mount/windows_spec.rb +4 -1
- data/spec/unit/provider/mount_spec.rb +16 -6
- data/spec/unit/provider/package/portage_spec.rb +44 -0
- data/spec/unit/provider/package/rubygems_spec.rb +44 -1
- data/spec/unit/provider/package/smartos_spec.rb +3 -2
- data/spec/unit/provider/package/yum_spec.rb +36 -39
- data/spec/unit/provider/package/zypper_spec.rb +84 -22
- data/spec/unit/provider/package_spec.rb +0 -4
- data/spec/unit/provider/powershell_spec.rb +38 -0
- data/spec/unit/provider/remote_directory_spec.rb +0 -4
- data/spec/unit/provider/remote_file/cache_control_data_spec.rb +211 -0
- data/spec/unit/provider/remote_file/content_spec.rb +230 -0
- data/spec/unit/provider/remote_file/fetcher_spec.rb +75 -0
- data/spec/unit/provider/remote_file/ftp_spec.rb +224 -0
- data/spec/unit/provider/remote_file/http_spec.rb +319 -0
- data/spec/unit/provider/remote_file/local_file_spec.rb +60 -0
- data/spec/unit/provider/remote_file_spec.rb +33 -295
- data/spec/unit/provider/route_spec.rb +25 -9
- data/spec/unit/provider/service/macosx_spec.rb +176 -152
- data/spec/unit/provider/service/solaris_smf_service_spec.rb +21 -18
- data/spec/unit/provider/service/systemd_service_spec.rb +2 -2
- data/spec/unit/provider/service/upstart_service_spec.rb +2 -2
- data/spec/unit/provider/service_spec.rb +3 -3
- data/spec/unit/provider/template/content_spec.rb +78 -0
- data/spec/unit/provider/template_spec.rb +52 -184
- data/spec/unit/provider/user/solaris_spec.rb +80 -0
- data/spec/unit/provider/user/useradd_spec.rb +12 -358
- data/spec/unit/resource/batch_spec.rb +48 -0
- data/spec/unit/resource/conditional_action_not_nothing_spec.rb +45 -0
- data/spec/unit/resource/execute_spec.rb +3 -101
- data/spec/unit/resource/file_spec.rb +0 -5
- data/spec/unit/resource/group_spec.rb +9 -0
- data/spec/unit/resource/ifconfig_spec.rb +60 -1
- data/spec/unit/resource/link_spec.rb +1 -0
- data/spec/unit/resource/mount_spec.rb +37 -0
- data/spec/unit/resource/powershell_spec.rb +48 -0
- data/spec/unit/resource/remote_file_spec.rb +44 -4
- data/spec/unit/resource/route_spec.rb +1 -1
- data/spec/unit/resource/script_spec.rb +13 -36
- data/spec/unit/resource/template_spec.rb +111 -8
- data/spec/unit/resource/user_spec.rb +7 -0
- data/spec/unit/resource_collection_spec.rb +61 -32
- data/spec/unit/resource_reporter_spec.rb +115 -102
- data/spec/unit/resource_spec.rb +170 -1
- data/spec/unit/rest/auth_credentials_spec.rb +2 -2
- data/spec/unit/rest_spec.rb +6 -2
- data/spec/unit/run_context/cookbook_compiler_spec.rb +9 -0
- data/spec/unit/runner_spec.rb +1 -1
- data/spec/unit/scan_access_control_spec.rb +4 -2
- data/spec/unit/shell/shell_session_spec.rb +15 -2
- data/spec/unit/util/backup_spec.rb +149 -0
- data/spec/unit/util/diff_spec.rb +596 -0
- data/spec/unit/util/selinux_spec.rb +172 -0
- data/spec/unit/version/platform_spec.rb +61 -0
- data/spec/unit/version_constraint/platform_spec.rb +46 -0
- data/spec/unit/version_constraint_spec.rb +5 -0
- metadata +233 -10
- data/lib/chef/chef_fs/file_system/data_bag_item.rb +0 -59
- data/spec/unit/chef_fs/file_system/chef_server_root_dir_spec.rb +0 -237
- data/spec/unit/chef_fs/file_system/cookbooks_dir_spec.rb +0 -568
- data/spec/unit/chef_fs/file_system/data_bags_dir_spec.rb +0 -220
|
@@ -43,7 +43,8 @@ class Chef
|
|
|
43
43
|
|
|
44
44
|
def parse_ignore_file
|
|
45
45
|
ignore_globs = []
|
|
46
|
-
if File.exist?(@ignore_file) && File.readable?(@ignore_file)
|
|
46
|
+
if File.exist?(@ignore_file) && File.readable?(@ignore_file) &&
|
|
47
|
+
(File.file?(@ignore_file) || File.symlink?(@ignore_file))
|
|
47
48
|
File.foreach(@ignore_file) do |line|
|
|
48
49
|
ignore_globs << line.strip unless line =~ COMMENTS_AND_WHITESPACE
|
|
49
50
|
end
|
|
@@ -56,12 +56,14 @@ class Chef
|
|
|
56
56
|
# Synchronizes the locally cached copies of cookbooks with the files on the
|
|
57
57
|
# server.
|
|
58
58
|
class CookbookSynchronizer
|
|
59
|
-
EAGER_SEGMENTS = Chef::CookbookVersion::COOKBOOK_SEGMENTS.dup
|
|
60
|
-
EAGER_SEGMENTS.delete(:files)
|
|
61
|
-
EAGER_SEGMENTS.delete(:templates)
|
|
62
|
-
EAGER_SEGMENTS.freeze
|
|
63
|
-
|
|
64
59
|
def initialize(cookbooks_by_name, events)
|
|
60
|
+
@eager_segments = Chef::CookbookVersion::COOKBOOK_SEGMENTS.dup
|
|
61
|
+
unless Chef::Config[:no_lazy_load]
|
|
62
|
+
@eager_segments.delete(:files)
|
|
63
|
+
@eager_segments.delete(:templates)
|
|
64
|
+
end
|
|
65
|
+
@eager_segments.freeze
|
|
66
|
+
|
|
65
67
|
@cookbooks_by_name, @events = cookbooks_by_name, events
|
|
66
68
|
end
|
|
67
69
|
|
|
@@ -138,7 +140,7 @@ class Chef
|
|
|
138
140
|
|
|
139
141
|
# files and templates are lazily loaded, and will be done later.
|
|
140
142
|
|
|
141
|
-
|
|
143
|
+
@eager_segments.each do |segment|
|
|
142
144
|
segment_filenames = Array.new
|
|
143
145
|
cookbook.manifest[segment].each do |manifest_record|
|
|
144
146
|
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
# limitations under the License.
|
|
17
17
|
#
|
|
18
18
|
|
|
19
|
+
require 'pathname'
|
|
19
20
|
require 'chef/mixin/shell_out'
|
|
20
21
|
require 'chef/mixin/checksum'
|
|
21
22
|
|
|
@@ -102,8 +103,22 @@ class Chef
|
|
|
102
103
|
@validated_files = PersistentSet.new
|
|
103
104
|
end
|
|
104
105
|
|
|
106
|
+
def chefignore
|
|
107
|
+
@chefignore ||= Chefignore.new(File.dirname(cookbook_path))
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def remove_ignored_files(file_list)
|
|
111
|
+
return file_list unless chefignore.ignores.length > 0
|
|
112
|
+
file_list.reject do |full_path|
|
|
113
|
+
cookbook_pn = Pathname.new cookbook_path
|
|
114
|
+
full_pn = Pathname.new full_path
|
|
115
|
+
relative_pn = full_pn.relative_path_from cookbook_pn
|
|
116
|
+
chefignore.ignored? relative_pn.to_s
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
105
120
|
def ruby_files
|
|
106
|
-
Dir[File.join(cookbook_path, '**', '*.rb')]
|
|
121
|
+
remove_ignored_files Dir[File.join(cookbook_path, '**', '*.rb')]
|
|
107
122
|
end
|
|
108
123
|
|
|
109
124
|
def untested_ruby_files
|
|
@@ -118,7 +133,7 @@ class Chef
|
|
|
118
133
|
end
|
|
119
134
|
|
|
120
135
|
def template_files
|
|
121
|
-
Dir[File.join(cookbook_path, '**', '*.erb')]
|
|
136
|
+
remove_ignored_files Dir[File.join(cookbook_path, '**', '*.erb')]
|
|
122
137
|
end
|
|
123
138
|
|
|
124
139
|
def untested_template_files
|
|
@@ -110,7 +110,16 @@ class Chef
|
|
|
110
110
|
# files are uploaded, so save the manifest
|
|
111
111
|
cookbooks.each do |cb|
|
|
112
112
|
save_url = opts[:force] ? cb.force_save_url : cb.save_url
|
|
113
|
-
|
|
113
|
+
begin
|
|
114
|
+
rest.put_rest(save_url, cb)
|
|
115
|
+
rescue Net::HTTPServerException => e
|
|
116
|
+
case e.response.code
|
|
117
|
+
when "409"
|
|
118
|
+
raise Chef::Exceptions::CookbookFrozen, "Version #{cb.version} of cookbook #{cb.name} is frozen. Use --force to override."
|
|
119
|
+
else
|
|
120
|
+
raise
|
|
121
|
+
end
|
|
122
|
+
end
|
|
114
123
|
end
|
|
115
124
|
|
|
116
125
|
Chef::Log.info("Upload complete!")
|
|
@@ -79,115 +79,6 @@ class Chef
|
|
|
79
79
|
Chef::FileCache
|
|
80
80
|
end
|
|
81
81
|
|
|
82
|
-
# Synchronizes all the cookbooks from the chef-server.
|
|
83
|
-
#
|
|
84
|
-
# === Returns
|
|
85
|
-
# true:: Always returns true
|
|
86
|
-
def self.sync_cookbooks(cookbook_hash)
|
|
87
|
-
Chef::Log.info("Loading cookbooks [#{cookbook_hash.keys.sort.join(', ')}]")
|
|
88
|
-
Chef::Log.debug("Cookbooks detail: #{cookbook_hash.inspect}")
|
|
89
|
-
|
|
90
|
-
clear_obsoleted_cookbooks(cookbook_hash)
|
|
91
|
-
|
|
92
|
-
# Synchronize each of the node's cookbooks, and add to the
|
|
93
|
-
# valid_cache_entries hash.
|
|
94
|
-
cookbook_hash.values.each do |cookbook|
|
|
95
|
-
sync_cookbook_file_cache(cookbook)
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
true
|
|
99
|
-
end
|
|
100
|
-
|
|
101
|
-
# Iterates over cached cookbooks' files, removing files belonging to
|
|
102
|
-
# cookbooks that don't appear in +cookbook_hash+
|
|
103
|
-
def self.clear_obsoleted_cookbooks(cookbook_hash)
|
|
104
|
-
# Remove all cookbooks no longer relevant to this node
|
|
105
|
-
cache.find(File.join(%w{cookbooks ** *})).each do |cache_file|
|
|
106
|
-
cache_file =~ /^cookbooks\/([^\/]+)\//
|
|
107
|
-
unless cookbook_hash.has_key?($1)
|
|
108
|
-
Chef::Log.info("Removing #{cache_file} from the cache; its cookbook is no longer needed on this client.")
|
|
109
|
-
cache.delete(cache_file)
|
|
110
|
-
end
|
|
111
|
-
end
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
# Update the file caches for a given cache segment. Takes a segment name
|
|
115
|
-
# and a hash that matches one of the cookbooks/_attribute_files style
|
|
116
|
-
# remote file listings.
|
|
117
|
-
#
|
|
118
|
-
# === Parameters
|
|
119
|
-
# cookbook<Chef::Cookbook>:: The cookbook to update
|
|
120
|
-
# valid_cache_entries<Hash>:: Out-param; Added to this hash are the files that
|
|
121
|
-
# were referred to by this cookbook
|
|
122
|
-
def self.sync_cookbook_file_cache(cookbook)
|
|
123
|
-
Chef::Log.debug("Synchronizing cookbook #{cookbook.name}")
|
|
124
|
-
|
|
125
|
-
# files and templates are lazily loaded, and will be done later.
|
|
126
|
-
eager_segments = COOKBOOK_SEGMENTS.dup
|
|
127
|
-
|
|
128
|
-
unless Chef::Config[:no_lazy_load] then
|
|
129
|
-
eager_segments.delete(:files)
|
|
130
|
-
eager_segments.delete(:templates)
|
|
131
|
-
end
|
|
132
|
-
|
|
133
|
-
eager_segments.each do |segment|
|
|
134
|
-
segment_filenames = Array.new
|
|
135
|
-
cookbook.manifest[segment].each do |manifest_record|
|
|
136
|
-
# segment = cookbook segment
|
|
137
|
-
# remote_list = list of file hashes
|
|
138
|
-
#
|
|
139
|
-
# We need the list of known good attribute files, so we can delete any that are
|
|
140
|
-
# just laying about.
|
|
141
|
-
|
|
142
|
-
cache_filename = File.join("cookbooks", cookbook.name, manifest_record['path'])
|
|
143
|
-
valid_cache_entries[cache_filename] = true
|
|
144
|
-
|
|
145
|
-
current_checksum = nil
|
|
146
|
-
if cache.has_key?(cache_filename)
|
|
147
|
-
current_checksum = checksum_cookbook_file(cache.load(cache_filename, false))
|
|
148
|
-
end
|
|
149
|
-
|
|
150
|
-
# If the checksums are different between on-disk (current) and on-server
|
|
151
|
-
# (remote, per manifest), do the update. This will also execute if there
|
|
152
|
-
# is no current checksum.
|
|
153
|
-
if current_checksum != manifest_record['checksum']
|
|
154
|
-
raw_file = chef_server_rest.get_rest(manifest_record[:url], true)
|
|
155
|
-
|
|
156
|
-
Chef::Log.info("Storing updated #{cache_filename} in the cache.")
|
|
157
|
-
cache.move_to(raw_file.path, cache_filename)
|
|
158
|
-
else
|
|
159
|
-
Chef::Log.debug("Not storing #{cache_filename}, as the cache is up to date.")
|
|
160
|
-
end
|
|
161
|
-
|
|
162
|
-
# make the segment filenames a full path.
|
|
163
|
-
full_path_cache_filename = cache.load(cache_filename, false)
|
|
164
|
-
segment_filenames << full_path_cache_filename
|
|
165
|
-
end
|
|
166
|
-
|
|
167
|
-
# replace segment filenames with a full-path one.
|
|
168
|
-
if segment.to_sym == :recipes
|
|
169
|
-
cookbook.recipe_filenames = segment_filenames
|
|
170
|
-
elsif segment.to_sym == :attributes
|
|
171
|
-
cookbook.attribute_filenames = segment_filenames
|
|
172
|
-
else
|
|
173
|
-
cookbook.segment_filenames(segment).replace(segment_filenames)
|
|
174
|
-
end
|
|
175
|
-
end
|
|
176
|
-
end
|
|
177
|
-
|
|
178
|
-
def self.cleanup_file_cache
|
|
179
|
-
unless Chef::Config[:solo]
|
|
180
|
-
# Delete each file in the cache that we didn't encounter in the
|
|
181
|
-
# manifest.
|
|
182
|
-
cache.find(File.join(%w{cookbooks ** *})).each do |cache_filename|
|
|
183
|
-
unless valid_cache_entries[cache_filename]
|
|
184
|
-
Chef::Log.info("Removing #{cache_filename} from the cache; it is no longer needed by chef-client.")
|
|
185
|
-
cache.delete(cache_filename)
|
|
186
|
-
end
|
|
187
|
-
end
|
|
188
|
-
end
|
|
189
|
-
end
|
|
190
|
-
|
|
191
82
|
# Creates a new Chef::CookbookVersion object.
|
|
192
83
|
#
|
|
193
84
|
# === Returns
|
data/lib/chef/data_bag.rb
CHANGED
|
@@ -82,14 +82,23 @@ class Chef
|
|
|
82
82
|
end
|
|
83
83
|
|
|
84
84
|
def self.list(inflate=false)
|
|
85
|
-
if
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
response[bag_and_uri.first] = load(bag_and_uri.first)
|
|
89
|
-
response
|
|
85
|
+
if Chef::Config[:solo]
|
|
86
|
+
unless File.directory?(Chef::Config[:data_bag_path])
|
|
87
|
+
raise Chef::Exceptions::InvalidDataBagPath, "Data bag path '#{Chef::Config[:data_bag_path]}' is invalid"
|
|
90
88
|
end
|
|
89
|
+
|
|
90
|
+
names = Dir.glob(File.join(Chef::Config[:data_bag_path], "*")).map{|f|File.basename(f)}.sort
|
|
91
|
+
names.inject({}) {|h, n| h[n] = n; h}
|
|
91
92
|
else
|
|
92
|
-
|
|
93
|
+
if inflate
|
|
94
|
+
# Can't search for all data bags like other objects, fall back to N+1 :(
|
|
95
|
+
list(false).inject({}) do |response, bag_and_uri|
|
|
96
|
+
response[bag_and_uri.first] = load(bag_and_uri.first)
|
|
97
|
+
response
|
|
98
|
+
end
|
|
99
|
+
else
|
|
100
|
+
Chef::REST.new(Chef::Config[:chef_server_url]).get_rest("data")
|
|
101
|
+
end
|
|
93
102
|
end
|
|
94
103
|
end
|
|
95
104
|
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Serdar Sutay (<serdar@opscode.com>)
|
|
3
|
+
# Copyright:: Copyright (c) 2013 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 'tempfile'
|
|
20
|
+
require 'erubis'
|
|
21
|
+
|
|
22
|
+
class Chef
|
|
23
|
+
module Deprecation
|
|
24
|
+
module Mixin
|
|
25
|
+
# == Deprecation::Provider::Mixin::Template
|
|
26
|
+
# This module contains the deprecated functions of
|
|
27
|
+
# Chef::Mixin::Template. These functions are refactored to different
|
|
28
|
+
# components. They are frozen and will be removed in Chef 12.
|
|
29
|
+
#
|
|
30
|
+
|
|
31
|
+
module Template
|
|
32
|
+
def render_template(template, context)
|
|
33
|
+
begin
|
|
34
|
+
eruby = Erubis::Eruby.new(template)
|
|
35
|
+
output = eruby.evaluate(context)
|
|
36
|
+
rescue Object => e
|
|
37
|
+
raise TemplateError.new(e, template, context)
|
|
38
|
+
end
|
|
39
|
+
Tempfile.open("chef-rendered-template") do |tempfile|
|
|
40
|
+
tempfile.print(output)
|
|
41
|
+
tempfile.close
|
|
42
|
+
yield tempfile
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Serdar Sutay (<serdar@opscode.com>)
|
|
3
|
+
# Copyright:: Copyright (c) 2013 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
|
+
|
|
20
|
+
class Chef
|
|
21
|
+
module Deprecation
|
|
22
|
+
module Provider
|
|
23
|
+
|
|
24
|
+
# == Deprecation::Provider::CookbookFile
|
|
25
|
+
# This module contains the deprecated functions of
|
|
26
|
+
# Chef::Provider::CookbookFile. These functions are refactored to
|
|
27
|
+
# different components. They are frozen and will be removed in Chef 12.
|
|
28
|
+
#
|
|
29
|
+
module CookbookFile
|
|
30
|
+
|
|
31
|
+
def file_cache_location
|
|
32
|
+
@file_cache_location ||= begin
|
|
33
|
+
cookbook = run_context.cookbook_collection[resource_cookbook]
|
|
34
|
+
cookbook.preferred_filename_on_disk_location(node, :files, @new_resource.source, @new_resource.path)
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def resource_cookbook
|
|
39
|
+
@new_resource.cookbook || @new_resource.cookbook_name
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def content_stale?
|
|
43
|
+
( ! ::File.exist?(@new_resource.path)) || ( ! compare_content)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def backup_new_resource
|
|
47
|
+
if ::File.exists?(@new_resource.path)
|
|
48
|
+
backup @new_resource.path
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Serdar Sutay (<serdar@opscode.com>)
|
|
3
|
+
# Copyright:: Copyright (c) 2013 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
|
+
|
|
20
|
+
class Chef
|
|
21
|
+
module Deprecation
|
|
22
|
+
module Provider
|
|
23
|
+
|
|
24
|
+
# == Deprecation::Provider::File
|
|
25
|
+
# This module contains the deprecated functions of
|
|
26
|
+
# Chef::Provider::File. These functions are refactored to different
|
|
27
|
+
# components. They are frozen and will be removed in Chef 12.
|
|
28
|
+
#
|
|
29
|
+
module File
|
|
30
|
+
|
|
31
|
+
def diff_current_from_content(new_content)
|
|
32
|
+
result = nil
|
|
33
|
+
Tempfile.open("chef-diff") do |file|
|
|
34
|
+
file.write new_content
|
|
35
|
+
file.close
|
|
36
|
+
result = diff_current file.path
|
|
37
|
+
end
|
|
38
|
+
result
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def is_binary?(path)
|
|
42
|
+
::File.open(path) do |file|
|
|
43
|
+
|
|
44
|
+
buff = file.read(Chef::Config[:diff_filesize_threshold])
|
|
45
|
+
buff = "" if buff.nil?
|
|
46
|
+
return buff !~ /^[\r[:print:]]*$/
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def diff_current(temp_path)
|
|
51
|
+
suppress_resource_reporting = false
|
|
52
|
+
|
|
53
|
+
return [ "(diff output suppressed by config)" ] if Chef::Config[:diff_disabled]
|
|
54
|
+
return [ "(no temp file with new content, diff output suppressed)" ] unless ::File.exists?(temp_path) # should never happen?
|
|
55
|
+
|
|
56
|
+
# solaris does not support diff -N, so create tempfile to diff against if we are creating a new file
|
|
57
|
+
target_path = if ::File.exists?(@current_resource.path)
|
|
58
|
+
@current_resource.path
|
|
59
|
+
else
|
|
60
|
+
suppress_resource_reporting = true # suppress big diffs going to resource reporting service
|
|
61
|
+
tempfile = Tempfile.new('chef-tempfile')
|
|
62
|
+
tempfile.path
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
diff_filesize_threshold = Chef::Config[:diff_filesize_threshold]
|
|
66
|
+
diff_output_threshold = Chef::Config[:diff_output_threshold]
|
|
67
|
+
|
|
68
|
+
if ::File.size(target_path) > diff_filesize_threshold || ::File.size(temp_path) > diff_filesize_threshold
|
|
69
|
+
return [ "(file sizes exceed #{diff_filesize_threshold} bytes, diff output suppressed)" ]
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# MacOSX(BSD?) diff will *sometimes* happily spit out nasty binary diffs
|
|
73
|
+
return [ "(current file is binary, diff output suppressed)"] if is_binary?(target_path)
|
|
74
|
+
return [ "(new content is binary, diff output suppressed)"] if is_binary?(temp_path)
|
|
75
|
+
|
|
76
|
+
begin
|
|
77
|
+
# -u: Unified diff format
|
|
78
|
+
result = shell_out("diff -u #{target_path} #{temp_path}" )
|
|
79
|
+
rescue Exception => e
|
|
80
|
+
# Should *not* receive this, but in some circumstances it seems that
|
|
81
|
+
# an exception can be thrown even using shell_out instead of shell_out!
|
|
82
|
+
return [ "Could not determine diff. Error: #{e.message}" ]
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# diff will set a non-zero return code even when there's
|
|
86
|
+
# valid stdout results, if it encounters something unexpected
|
|
87
|
+
# So as long as we have output, we'll show it.
|
|
88
|
+
if not result.stdout.empty?
|
|
89
|
+
if result.stdout.length > diff_output_threshold
|
|
90
|
+
[ "(long diff of over #{diff_output_threshold} characters, diff output suppressed)" ]
|
|
91
|
+
else
|
|
92
|
+
val = result.stdout.split("\n")
|
|
93
|
+
val.delete("\")
|
|
94
|
+
@new_resource.diff(val.join("\\n")) unless suppress_resource_reporting
|
|
95
|
+
val
|
|
96
|
+
end
|
|
97
|
+
elsif not result.stderr.empty?
|
|
98
|
+
[ "Could not determine diff. Error: #{result.stderr}" ]
|
|
99
|
+
else
|
|
100
|
+
[ "(no diff)" ]
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def setup_acl
|
|
105
|
+
return if Chef::Platform.windows?
|
|
106
|
+
acl_scanner = ScanAccessControl.new(@new_resource, @current_resource)
|
|
107
|
+
acl_scanner.set_all!
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def compare_content
|
|
111
|
+
checksum(@current_resource.path) == new_resource_content_checksum
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def set_content
|
|
115
|
+
unless compare_content
|
|
116
|
+
description = []
|
|
117
|
+
description << "update content in file #{@new_resource.path} from #{short_cksum(@current_resource.checksum)} to #{short_cksum(new_resource_content_checksum)}"
|
|
118
|
+
description << diff_current_from_content(@new_resource.content)
|
|
119
|
+
converge_by(description) do
|
|
120
|
+
backup @new_resource.path if ::File.exists?(@new_resource.path)
|
|
121
|
+
::File.open(@new_resource.path, "w") {|f| f.write @new_resource.content }
|
|
122
|
+
Chef::Log.info("#{@new_resource} contents updated")
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
def update_new_file_state(path=@new_resource.path)
|
|
128
|
+
if !::File.directory?(path)
|
|
129
|
+
@new_resource.checksum(checksum(path))
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
if Chef::Platform.windows?
|
|
133
|
+
# TODO: To work around CHEF-3554, add support for Windows
|
|
134
|
+
# equivalent, or implicit resource reporting won't work for
|
|
135
|
+
# Windows.
|
|
136
|
+
return
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
acl_scanner = ScanAccessControl.new(@new_resource, @new_resource)
|
|
140
|
+
acl_scanner.set_all!
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
def set_all_access_controls
|
|
144
|
+
if access_controls.requires_changes?
|
|
145
|
+
converge_by(access_controls.describe_changes) do
|
|
146
|
+
access_controls.set_all
|
|
147
|
+
#Update file state with new access values
|
|
148
|
+
update_new_file_state
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
def deploy_tempfile
|
|
154
|
+
Tempfile.open(::File.basename(@new_resource.name)) do |tempfile|
|
|
155
|
+
yield tempfile
|
|
156
|
+
|
|
157
|
+
temp_res = Chef::Resource::CookbookFile.new(@new_resource.name)
|
|
158
|
+
temp_res.path(tempfile.path)
|
|
159
|
+
ac = Chef::FileAccessControl.new(temp_res, @new_resource, self)
|
|
160
|
+
ac.set_all!
|
|
161
|
+
FileUtils.mv(tempfile.path, @new_resource.path)
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
def backup(file=nil)
|
|
166
|
+
file ||= @new_resource.path
|
|
167
|
+
if @new_resource.backup != false && @new_resource.backup > 0 && ::File.exist?(file)
|
|
168
|
+
time = Time.now
|
|
169
|
+
savetime = time.strftime("%Y%m%d%H%M%S")
|
|
170
|
+
backup_filename = "#{@new_resource.path}.chef-#{savetime}"
|
|
171
|
+
backup_filename = backup_filename.sub(/^([A-Za-z]:)/, "") #strip drive letter on Windows
|
|
172
|
+
# if :file_backup_path is nil, we fallback to the old behavior of
|
|
173
|
+
# keeping the backup in the same directory. We also need to to_s it
|
|
174
|
+
# so we don't get a type error around implicit to_str conversions.
|
|
175
|
+
prefix = Chef::Config[:file_backup_path].to_s
|
|
176
|
+
backup_path = ::File.join(prefix, backup_filename)
|
|
177
|
+
FileUtils.mkdir_p(::File.dirname(backup_path)) if Chef::Config[:file_backup_path]
|
|
178
|
+
FileUtils.cp(file, backup_path, :preserve => true)
|
|
179
|
+
Chef::Log.info("#{@new_resource} backed up to #{backup_path}")
|
|
180
|
+
|
|
181
|
+
# Clean up after the number of backups
|
|
182
|
+
slice_number = @new_resource.backup
|
|
183
|
+
backup_files = Dir[::File.join(prefix, ".#{@new_resource.path}.chef-*")].sort { |a,b| b <=> a }
|
|
184
|
+
if backup_files.length >= @new_resource.backup
|
|
185
|
+
remainder = backup_files.slice(slice_number..-1)
|
|
186
|
+
remainder.each do |backup_to_delete|
|
|
187
|
+
FileUtils.rm(backup_to_delete)
|
|
188
|
+
Chef::Log.info("#{@new_resource} removed backup at #{backup_to_delete}")
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
end
|
|
195
|
+
end
|
|
196
|
+
end
|
|
197
|
+
end
|