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
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Adam Edwards (<adamed@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 'chef/provider/windows_script'
|
|
20
|
+
|
|
21
|
+
class Chef
|
|
22
|
+
class Provider
|
|
23
|
+
class PowershellScript < Chef::Provider::WindowsScript
|
|
24
|
+
|
|
25
|
+
protected
|
|
26
|
+
|
|
27
|
+
EXIT_STATUS_NORMALIZATION_SCRIPT = "\nif ($? -eq $true) {exit 0} elseif ( $LASTEXITCODE -ne 0) {exit $LASTEXITCODE} else { exit 1 }"
|
|
28
|
+
EXIT_STATUS_RESET_SCRIPT = "$LASTEXITCODE=0\n"
|
|
29
|
+
|
|
30
|
+
# Process exit codes are strange with PowerShell. Unless you
|
|
31
|
+
# explicitly call exit in Powershell, the powershell.exe
|
|
32
|
+
# interpreter returns only 0 for success or 1 for failure. Since
|
|
33
|
+
# we'd like to get specific exit codes from executable tools run
|
|
34
|
+
# with Powershell, we do some work using the automatic variables
|
|
35
|
+
# $? and $LASTEXITCODE to return the process exit code of the
|
|
36
|
+
# last process run in the script if it is the last command
|
|
37
|
+
# executed, otherwise 0 or 1 based on whether $? is set to true
|
|
38
|
+
# (success, where we return 0) or false (where we return 1).
|
|
39
|
+
def NormalizeScriptExitStatus( code )
|
|
40
|
+
@code = (! code.nil?) ? ( EXIT_STATUS_RESET_SCRIPT + code + EXIT_STATUS_NORMALIZATION_SCRIPT ) : nil
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
public
|
|
44
|
+
|
|
45
|
+
def initialize (new_resource, run_context)
|
|
46
|
+
super(new_resource, run_context, '.ps1')
|
|
47
|
+
NormalizeScriptExitStatus(new_resource.code)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def flags
|
|
51
|
+
default_flags = [
|
|
52
|
+
"-NoLogo",
|
|
53
|
+
"-NonInteractive",
|
|
54
|
+
"-NoProfile",
|
|
55
|
+
"-ExecutionPolicy RemoteSigned",
|
|
56
|
+
# Powershell will hang if STDIN is redirected
|
|
57
|
+
# http://connect.microsoft.com/PowerShell/feedback/details/572313/powershell-exe-can-hang-if-stdin-is-redirected
|
|
58
|
+
"-InputFormat None",
|
|
59
|
+
# Must use -File rather than -Command to launch the script
|
|
60
|
+
# file created by the base class that contains the script
|
|
61
|
+
# code -- otherwise, powershell.exe does not propagate the
|
|
62
|
+
# error status of a failed Windows process that ran at the
|
|
63
|
+
# end of the script, it gets changed to '1'.
|
|
64
|
+
"-File"
|
|
65
|
+
]
|
|
66
|
+
|
|
67
|
+
interpreter_flags = default_flags.join(' ')
|
|
68
|
+
|
|
69
|
+
if ! (@new_resource.flags.nil?)
|
|
70
|
+
interpreter_flags = [@new_resource.flags, interpreter_flags].join(' ')
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
interpreter_flags
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
@@ -31,7 +31,6 @@ class Chef
|
|
|
31
31
|
class Provider
|
|
32
32
|
class RemoteDirectory < Chef::Provider::Directory
|
|
33
33
|
|
|
34
|
-
include Chef::Mixin::EnforceOwnershipAndPermissions
|
|
35
34
|
include Chef::Mixin::FileClass
|
|
36
35
|
|
|
37
36
|
def action_create
|
|
@@ -67,7 +66,7 @@ class Chef
|
|
|
67
66
|
if @new_resource.purge
|
|
68
67
|
unmanaged_files.sort.reverse.each do |f|
|
|
69
68
|
# file_class comes from Chef::Mixin::FileClass
|
|
70
|
-
if ::File.directory?(f) && !Chef::Platform.windows? && !file_class.symlink?(f.dup)
|
|
69
|
+
if ::File.directory?(f) && !Chef::Platform.windows? && !file_class.symlink?(f.dup)
|
|
71
70
|
# Linux treats directory symlinks as files
|
|
72
71
|
# Remove a directory as a directory when not on windows if it is not a symlink
|
|
73
72
|
purge_directory(f)
|
|
@@ -134,10 +133,10 @@ class Chef
|
|
|
134
133
|
cookbook_file.rights(permission, *args)
|
|
135
134
|
end
|
|
136
135
|
end
|
|
137
|
-
cookbook_file.mode(@new_resource.files_mode)
|
|
138
|
-
cookbook_file.group(@new_resource.files_group)
|
|
139
|
-
cookbook_file.owner(@new_resource.files_owner)
|
|
140
|
-
cookbook_file.backup(@new_resource.files_backup)
|
|
136
|
+
cookbook_file.mode(@new_resource.files_mode) if @new_resource.files_mode
|
|
137
|
+
cookbook_file.group(@new_resource.files_group) if @new_resource.files_group
|
|
138
|
+
cookbook_file.owner(@new_resource.files_owner) if @new_resource.files_owner
|
|
139
|
+
cookbook_file.backup(@new_resource.files_backup) if @new_resource.files_backup
|
|
141
140
|
|
|
142
141
|
cookbook_file
|
|
143
142
|
end
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
#
|
|
2
|
+
# Author:: Jesse Campbell (<hikeit@gmail.com>)
|
|
2
3
|
# Author:: Adam Jacob (<adam@opscode.com>)
|
|
3
4
|
# Copyright:: Copyright (c) 2008 Opscode, Inc.
|
|
4
5
|
# License:: Apache License, Version 2.0
|
|
@@ -17,125 +18,28 @@
|
|
|
17
18
|
#
|
|
18
19
|
|
|
19
20
|
require 'chef/provider/file'
|
|
20
|
-
require 'chef/
|
|
21
|
-
require '
|
|
22
|
-
require 'tempfile'
|
|
23
|
-
require 'net/https'
|
|
21
|
+
require 'chef/deprecation/provider/remote_file'
|
|
22
|
+
require 'chef/deprecation/warnings'
|
|
24
23
|
|
|
25
24
|
class Chef
|
|
26
25
|
class Provider
|
|
27
26
|
class RemoteFile < Chef::Provider::File
|
|
28
27
|
|
|
29
|
-
|
|
28
|
+
extend Chef::Deprecation::Warnings
|
|
29
|
+
include Chef::Deprecation::Provider::RemoteFile
|
|
30
|
+
add_deprecation_warnings_for(Chef::Deprecation::Provider::RemoteFile.instance_methods)
|
|
30
31
|
|
|
31
|
-
def
|
|
32
|
-
@
|
|
32
|
+
def initialize(new_resource, run_context)
|
|
33
|
+
@content_class = Chef::Provider::RemoteFile::Content
|
|
33
34
|
super
|
|
34
35
|
end
|
|
35
36
|
|
|
36
|
-
def
|
|
37
|
-
Chef::
|
|
38
|
-
|
|
39
|
-
if current_resource_matches_target_checksum?
|
|
40
|
-
Chef::Log.debug("#{@new_resource} checksum matches target checksum (#{@new_resource.checksum}) - not updating")
|
|
41
|
-
else
|
|
42
|
-
sources = @new_resource.source
|
|
43
|
-
source = sources.shift
|
|
44
|
-
begin
|
|
45
|
-
rest = Chef::REST.new(source, nil, nil, http_client_opts(source))
|
|
46
|
-
raw_file = rest.streaming_request(rest.create_url(source), {})
|
|
47
|
-
rescue SocketError, Errno::ECONNREFUSED, Timeout::Error, Net::HTTPFatalError => e
|
|
48
|
-
Chef::Log.debug("#{@new_resource} cannot be downloaded from #{source}")
|
|
49
|
-
if source = sources.shift
|
|
50
|
-
Chef::Log.debug("#{@new_resource} trying to download from another mirror")
|
|
51
|
-
retry
|
|
52
|
-
else
|
|
53
|
-
raise e
|
|
54
|
-
end
|
|
55
|
-
end
|
|
56
|
-
if matches_current_checksum?(raw_file)
|
|
57
|
-
Chef::Log.debug "#{@new_resource} target and source checksums are the same - not updating"
|
|
58
|
-
else
|
|
59
|
-
description = []
|
|
60
|
-
description << "copy file downloaded from #{@new_resource.source} into #{@new_resource.path}"
|
|
61
|
-
description << diff_current(raw_file.path)
|
|
62
|
-
converge_by(description) do
|
|
63
|
-
backup_new_resource
|
|
64
|
-
FileUtils.cp raw_file.path, @new_resource.path
|
|
65
|
-
Chef::Log.info "#{@new_resource} updated"
|
|
66
|
-
raw_file.close!
|
|
67
|
-
end
|
|
68
|
-
# whyrun mode cleanup - the temp file will never be used,
|
|
69
|
-
# so close/unlink it here.
|
|
70
|
-
if whyrun_mode?
|
|
71
|
-
raw_file.close!
|
|
72
|
-
end
|
|
73
|
-
end
|
|
74
|
-
end
|
|
75
|
-
set_all_access_controls
|
|
76
|
-
update_new_file_state
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
def current_resource_matches_target_checksum?
|
|
80
|
-
@new_resource.checksum && @current_resource.checksum && @current_resource.checksum =~ /^#{Regexp.escape(@new_resource.checksum)}/
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
def matches_current_checksum?(candidate_file)
|
|
84
|
-
Chef::Log.debug "#{@new_resource} checking for file existence of #{@new_resource.path}"
|
|
85
|
-
if ::File.exists?(@new_resource.path)
|
|
86
|
-
Chef::Log.debug "#{@new_resource} file exists at #{@new_resource.path}"
|
|
87
|
-
@new_resource.checksum(checksum(candidate_file.path))
|
|
88
|
-
Chef::Log.debug "#{@new_resource} target checksum: #{@current_resource.checksum}"
|
|
89
|
-
Chef::Log.debug "#{@new_resource} source checksum: #{@new_resource.checksum}"
|
|
90
|
-
|
|
91
|
-
@new_resource.checksum == @current_resource.checksum
|
|
92
|
-
else
|
|
93
|
-
Chef::Log.debug "#{@new_resource} creating #{@new_resource.path}"
|
|
94
|
-
false
|
|
95
|
-
end
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
def backup_new_resource
|
|
99
|
-
if ::File.exists?(@new_resource.path)
|
|
100
|
-
Chef::Log.debug "#{@new_resource} checksum changed from #{@current_resource.checksum} to #{@new_resource.checksum}"
|
|
101
|
-
backup @new_resource.path
|
|
102
|
-
end
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
def source_file(source, current_checksum, &block)
|
|
106
|
-
if absolute_uri?(source)
|
|
107
|
-
fetch_from_uri(source, &block)
|
|
108
|
-
elsif !Chef::Config[:solo]
|
|
109
|
-
fetch_from_chef_server(source, current_checksum, &block)
|
|
110
|
-
else
|
|
111
|
-
fetch_from_local_cookbook(source, &block)
|
|
112
|
-
end
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
def http_client_opts(source)
|
|
116
|
-
opts={}
|
|
117
|
-
# CHEF-3140
|
|
118
|
-
# 1. If it's already compressed, trying to compress it more will
|
|
119
|
-
# probably be counter-productive.
|
|
120
|
-
# 2. Some servers are misconfigured so that you GET $URL/file.tgz but
|
|
121
|
-
# they respond with content type of tar and content encoding of gzip,
|
|
122
|
-
# which tricks Chef::REST into decompressing the response body. In this
|
|
123
|
-
# case you'd end up with a tar archive (no gzip) named, e.g., foo.tgz,
|
|
124
|
-
# which is not what you wanted.
|
|
125
|
-
if @new_resource.path =~ /gz$/ or source =~ /gz$/
|
|
126
|
-
opts[:disable_gzip] = true
|
|
127
|
-
end
|
|
128
|
-
opts
|
|
129
|
-
end
|
|
130
|
-
|
|
131
|
-
private
|
|
132
|
-
|
|
133
|
-
def absolute_uri?(source)
|
|
134
|
-
URI.parse(source).absolute?
|
|
135
|
-
rescue URI::InvalidURIError
|
|
136
|
-
false
|
|
37
|
+
def load_current_resource
|
|
38
|
+
@current_resource = Chef::Resource::RemoteFile.new(@new_resource.name)
|
|
39
|
+
super
|
|
137
40
|
end
|
|
138
41
|
|
|
139
42
|
end
|
|
140
43
|
end
|
|
141
44
|
end
|
|
45
|
+
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Daniel DeLeo (<dan@opscode.com>)
|
|
3
|
+
# Author:: Jesse Campbell (<hikeit@gmail.com>)
|
|
4
|
+
# Author:: Lamont Granquist (<lamont@opscode.com>)
|
|
5
|
+
# Copyright:: Copyright (c) 2013 Jesse Campbell
|
|
6
|
+
# Copyright:: Copyright (c) 2013 Opscode, Inc.
|
|
7
|
+
# License:: Apache License, Version 2.0
|
|
8
|
+
#
|
|
9
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
10
|
+
# you may not use this file except in compliance with the License.
|
|
11
|
+
# You may obtain a copy of the License at
|
|
12
|
+
#
|
|
13
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
14
|
+
#
|
|
15
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
16
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
17
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
18
|
+
# See the License for the specific language governing permissions and
|
|
19
|
+
# limitations under the License.
|
|
20
|
+
#
|
|
21
|
+
|
|
22
|
+
require 'stringio'
|
|
23
|
+
require 'chef/file_cache'
|
|
24
|
+
require 'chef/json_compat'
|
|
25
|
+
require 'chef/digester'
|
|
26
|
+
require 'chef/exceptions'
|
|
27
|
+
|
|
28
|
+
class Chef
|
|
29
|
+
class Provider
|
|
30
|
+
class RemoteFile
|
|
31
|
+
|
|
32
|
+
# == CacheControlData
|
|
33
|
+
# Implements per-uri storage of cache control data for a remote resource
|
|
34
|
+
# along with a sanity check checksum of the file in question.
|
|
35
|
+
# Provider::RemoteFile protocol implementation classes can use this
|
|
36
|
+
# information to avoid re-fetching files when the current copy is up to
|
|
37
|
+
# date. The way this information is used is protocol-dependent. For HTTP,
|
|
38
|
+
# this information is sent to the origin server via headers to make a
|
|
39
|
+
# conditional GET request.
|
|
40
|
+
#
|
|
41
|
+
# == API
|
|
42
|
+
# The general shape of the API is active-record-the-pattern-like. New
|
|
43
|
+
# instances should be instantiated via
|
|
44
|
+
# `CacheControlData.load_and_validate`, which will do a find-or-create
|
|
45
|
+
# operation and then sanity check the data against the checksum of the
|
|
46
|
+
# current copy of the file. If there is no data or the sanity check
|
|
47
|
+
# fails, the `etag` and `mtime` attributes will be set to nil; otherwise
|
|
48
|
+
# they are populated with the previously saved values.
|
|
49
|
+
#
|
|
50
|
+
# After fetching a file, the CacheControlData instance should be updated
|
|
51
|
+
# with new etag, mtime and checksum values in whatever format is
|
|
52
|
+
# preferred by the protocol used. Then call #save to save the data to disk.
|
|
53
|
+
class CacheControlData
|
|
54
|
+
|
|
55
|
+
def self.load_and_validate(uri, current_copy_checksum)
|
|
56
|
+
ccdata = new(uri)
|
|
57
|
+
ccdata.load
|
|
58
|
+
ccdata.validate!(current_copy_checksum)
|
|
59
|
+
ccdata
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# Entity Tag of the resource. HTTP-specific. See also:
|
|
63
|
+
# http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.3.2
|
|
64
|
+
# http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.19
|
|
65
|
+
attr_accessor :etag
|
|
66
|
+
|
|
67
|
+
# Last modified time of the remote resource. Different protocols will
|
|
68
|
+
# use different types for this field (e.g., string representation of a
|
|
69
|
+
# specific date format, integer, etc.) For HTTP-specific references,
|
|
70
|
+
# see:
|
|
71
|
+
# * http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3
|
|
72
|
+
# * http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.3.1
|
|
73
|
+
# * http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.25
|
|
74
|
+
attr_accessor :mtime
|
|
75
|
+
|
|
76
|
+
# SHA2-256 Hash of the file as last fetched.
|
|
77
|
+
attr_accessor :checksum
|
|
78
|
+
|
|
79
|
+
# URI of the resource as a String. This is the "primary key" used for
|
|
80
|
+
# storage and retrieval.
|
|
81
|
+
attr_reader :uri
|
|
82
|
+
|
|
83
|
+
def initialize(uri)
|
|
84
|
+
uri = uri.dup
|
|
85
|
+
uri.password = "XXXX" unless uri.userinfo.nil?
|
|
86
|
+
@uri = uri.to_s
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def load
|
|
90
|
+
if previous_cc_data = load_data
|
|
91
|
+
apply(previous_cc_data)
|
|
92
|
+
self
|
|
93
|
+
else
|
|
94
|
+
false
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def validate!(current_copy_checksum)
|
|
99
|
+
if current_copy_checksum.nil? or checksum != current_copy_checksum
|
|
100
|
+
reset!
|
|
101
|
+
false
|
|
102
|
+
else
|
|
103
|
+
true
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# Saves the data to disk using Chef::FileCache. The filename is a
|
|
108
|
+
# sanitized version of the URI with a MD5 of the same URI appended (to
|
|
109
|
+
# avoid collisions between different URIs having the same sanitized
|
|
110
|
+
# form).
|
|
111
|
+
def save
|
|
112
|
+
Chef::FileCache.store("remote_file/#{sanitized_cache_file_basename}", json_data)
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
# :nodoc:
|
|
116
|
+
# JSON representation of this object for storage.
|
|
117
|
+
def json_data
|
|
118
|
+
Chef::JSONCompat.to_json(hash_data)
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
private
|
|
122
|
+
|
|
123
|
+
def hash_data
|
|
124
|
+
as_hash = {}
|
|
125
|
+
as_hash["etag"] = etag
|
|
126
|
+
as_hash["mtime"] = mtime
|
|
127
|
+
as_hash["checksum"] = checksum
|
|
128
|
+
as_hash
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def reset!
|
|
132
|
+
@etag, @mtime = nil, nil
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
def apply(previous_cc_data)
|
|
136
|
+
@etag = previous_cc_data["etag"]
|
|
137
|
+
@mtime = previous_cc_data["mtime"]
|
|
138
|
+
@checksum = previous_cc_data["checksum"]
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def load_data
|
|
142
|
+
Chef::JSONCompat.from_json(load_json_data)
|
|
143
|
+
rescue Chef::Exceptions::FileNotFound, Yajl::ParseError
|
|
144
|
+
false
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
def load_json_data
|
|
148
|
+
Chef::FileCache.load("remote_file/#{sanitized_cache_file_basename}")
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
def sanitized_cache_file_basename
|
|
152
|
+
# Scrub and truncate in accordance with the goals of keeping the name
|
|
153
|
+
# human-readable but within the bounds of local file system
|
|
154
|
+
# path length limits
|
|
155
|
+
scrubbed_uri = uri.gsub(/\W/, '_')[0..63]
|
|
156
|
+
uri_md5 = Chef::Digester.instance.generate_md5_checksum(StringIO.new(uri))
|
|
157
|
+
"#{scrubbed_uri}-#{uri_md5}.json"
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Jesse Campbell (<hikeit@gmail.com>)
|
|
3
|
+
# Author:: Lamont Granquist (<lamont@opscode.com>)
|
|
4
|
+
# Copyright:: Copyright (c) 2013 Opscode, Inc.
|
|
5
|
+
# License:: Apache License, Version 2.0
|
|
6
|
+
#
|
|
7
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
# you may not use this file except in compliance with the License.
|
|
9
|
+
# You may obtain a copy of the License at
|
|
10
|
+
#
|
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
#
|
|
13
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
# See the License for the specific language governing permissions and
|
|
17
|
+
# limitations under the License.
|
|
18
|
+
#
|
|
19
|
+
|
|
20
|
+
require 'rest_client'
|
|
21
|
+
require 'uri'
|
|
22
|
+
require 'tempfile'
|
|
23
|
+
require 'chef/file_content_management/content_base'
|
|
24
|
+
|
|
25
|
+
class Chef
|
|
26
|
+
class Provider
|
|
27
|
+
class RemoteFile
|
|
28
|
+
class Content < Chef::FileContentManagement::ContentBase
|
|
29
|
+
|
|
30
|
+
private
|
|
31
|
+
|
|
32
|
+
def file_for_provider
|
|
33
|
+
Chef::Log.debug("#{@new_resource} checking for changes")
|
|
34
|
+
|
|
35
|
+
if current_resource_matches_target_checksum?
|
|
36
|
+
Chef::Log.debug("#{@new_resource} checksum matches target checksum (#{@new_resource.checksum}) - not updating")
|
|
37
|
+
else
|
|
38
|
+
sources = @new_resource.source
|
|
39
|
+
raw_file = try_multiple_sources(sources)
|
|
40
|
+
end
|
|
41
|
+
raw_file
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Given an array of source uris, iterate through them until one does not fail
|
|
45
|
+
def try_multiple_sources(sources)
|
|
46
|
+
sources = sources.dup
|
|
47
|
+
source = sources.shift
|
|
48
|
+
begin
|
|
49
|
+
uri = URI.parse(source)
|
|
50
|
+
raw_file = grab_file_from_uri(uri)
|
|
51
|
+
rescue SocketError, Errno::ECONNREFUSED, Errno::ENOENT, Errno::EACCES, Timeout::Error, Net::HTTPFatalError, Net::FTPError => e
|
|
52
|
+
Chef::Log.warn("#{@new_resource} cannot be downloaded from #{source}: #{e.to_s}")
|
|
53
|
+
if source = sources.shift
|
|
54
|
+
Chef::Log.info("#{@new_resource} trying to download from another mirror")
|
|
55
|
+
retry
|
|
56
|
+
else
|
|
57
|
+
raise e
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
raw_file
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# Given a source uri, return a Tempfile, or a File that acts like a Tempfile (close! method)
|
|
64
|
+
def grab_file_from_uri(uri)
|
|
65
|
+
Chef::Provider::RemoteFile::Fetcher.for_resource(uri, @new_resource, @current_resource).fetch
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def current_resource_matches_target_checksum?
|
|
69
|
+
@new_resource.checksum && @current_resource.checksum && @current_resource.checksum =~ /^#{Regexp.escape(@new_resource.checksum)}/
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|