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
data/lib/chef/resources.rb
CHANGED
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
|
|
19
19
|
require 'chef/resource/apt_package'
|
|
20
20
|
require 'chef/resource/bash'
|
|
21
|
+
require 'chef/resource/batch'
|
|
21
22
|
require 'chef/resource/breakpoint'
|
|
22
23
|
require 'chef/resource/cookbook_file'
|
|
23
24
|
require 'chef/resource/chef_gem'
|
|
@@ -49,6 +50,7 @@ require 'chef/resource/package'
|
|
|
49
50
|
require 'chef/resource/pacman_package'
|
|
50
51
|
require 'chef/resource/perl'
|
|
51
52
|
require 'chef/resource/portage_package'
|
|
53
|
+
require 'chef/resource/powershell_script'
|
|
52
54
|
require 'chef/resource/python'
|
|
53
55
|
require 'chef/resource/registry_key'
|
|
54
56
|
require 'chef/resource/remote_directory'
|
data/lib/chef/rest.rb
CHANGED
|
@@ -31,8 +31,7 @@ require 'chef/monkey_patches/string'
|
|
|
31
31
|
require 'chef/monkey_patches/net_http'
|
|
32
32
|
require 'chef/config'
|
|
33
33
|
require 'chef/exceptions'
|
|
34
|
-
require 'chef/platform'
|
|
35
|
-
|
|
34
|
+
require 'chef/platform/query_helpers'
|
|
36
35
|
|
|
37
36
|
class Chef
|
|
38
37
|
# == Chef::REST
|
|
@@ -84,6 +83,10 @@ class Chef
|
|
|
84
83
|
@raw_key
|
|
85
84
|
end
|
|
86
85
|
|
|
86
|
+
def last_response
|
|
87
|
+
@last_response
|
|
88
|
+
end
|
|
89
|
+
|
|
87
90
|
# Send an HTTP GET request to the path
|
|
88
91
|
#
|
|
89
92
|
# Using this method to +fetch+ a file is considered deprecated.
|
|
@@ -164,6 +167,7 @@ class Chef
|
|
|
164
167
|
retriable_rest_request(method, url, body, headers) do |rest_request|
|
|
165
168
|
begin
|
|
166
169
|
response = rest_request.call {|r| r.read_body}
|
|
170
|
+
@last_response = response
|
|
167
171
|
|
|
168
172
|
Chef::Log.debug("---- HTTP Status and Header Data: ----")
|
|
169
173
|
Chef::Log.debug("HTTP #{response.http_version} #{response.code} #{response.msg}")
|
|
@@ -185,7 +189,11 @@ class Chef
|
|
|
185
189
|
elsif response.kind_of?(Net::HTTPNotModified) # Must be tested before Net::HTTPRedirection because it's subclass.
|
|
186
190
|
false
|
|
187
191
|
elsif redirect_location = redirected_to(response)
|
|
188
|
-
|
|
192
|
+
if [:GET, :HEAD].include?(method)
|
|
193
|
+
follow_redirect {api_request(method, create_url(redirect_location))}
|
|
194
|
+
else
|
|
195
|
+
raise Exceptions::InvalidRedirect, "#{method} request was redirected from #{url} to #{redirect_location}. Only GET and HEAD support redirects."
|
|
196
|
+
end
|
|
189
197
|
else
|
|
190
198
|
# have to decompress the body before making an exception for it. But the body could be nil.
|
|
191
199
|
response.body.replace(response_body) if response.body.respond_to?(:replace)
|
|
@@ -248,6 +256,7 @@ class Chef
|
|
|
248
256
|
tempfile = stream_to_tempfile(url, r)
|
|
249
257
|
end
|
|
250
258
|
end
|
|
259
|
+
@last_response = response
|
|
251
260
|
if response.kind_of?(Net::HTTPSuccess)
|
|
252
261
|
tempfile
|
|
253
262
|
elsif redirect_location = redirected_to(response)
|
|
@@ -364,7 +373,7 @@ class Chef
|
|
|
364
373
|
def stream_to_tempfile(url, response)
|
|
365
374
|
tf = Tempfile.open("chef-rest")
|
|
366
375
|
if Chef::Platform.windows?
|
|
367
|
-
tf.binmode #required for binary files on Windows platforms
|
|
376
|
+
tf.binmode # required for binary files on Windows platforms
|
|
368
377
|
end
|
|
369
378
|
Chef::Log.debug("Streaming download from #{url.to_s} to tempfile #{tf.path}")
|
|
370
379
|
# Stolen from http://www.ruby-forum.com/topic/166423
|
|
@@ -220,7 +220,11 @@ class Chef
|
|
|
220
220
|
|
|
221
221
|
@http_request.body = request_body if (request_body && @http_request.request_body_permitted?)
|
|
222
222
|
# Optionally handle HTTP Basic Authentication
|
|
223
|
-
|
|
223
|
+
if url.user
|
|
224
|
+
user = URI.unescape(url.user)
|
|
225
|
+
password = URI.unescape(url.password) if url.password
|
|
226
|
+
@http_request.basic_auth(user, password)
|
|
227
|
+
end
|
|
224
228
|
@http_request[USER_AGENT] = self.class.user_agent
|
|
225
229
|
end
|
|
226
230
|
|
|
@@ -259,11 +259,11 @@ class Chef
|
|
|
259
259
|
cookbook_collection[cookbook].segment_filenames(segment).sort
|
|
260
260
|
end
|
|
261
261
|
|
|
262
|
-
# Yields the name of each cookbook depended on by
|
|
263
|
-
# lexical sort order.
|
|
262
|
+
# Yields the name, as a symbol, of each cookbook depended on by
|
|
263
|
+
# +cookbook_name+ in lexical sort order.
|
|
264
264
|
def each_cookbook_dep(cookbook_name, &block)
|
|
265
265
|
cookbook = cookbook_collection[cookbook_name]
|
|
266
|
-
cookbook.metadata.dependencies.keys.sort.each(&block)
|
|
266
|
+
cookbook.metadata.dependencies.keys.sort.map{|x| x.to_sym}.each(&block)
|
|
267
267
|
end
|
|
268
268
|
|
|
269
269
|
# Given a +recipe_name+, finds the file associated with the recipe.
|
|
@@ -173,7 +173,7 @@ class Chef
|
|
|
173
173
|
class RunListExpansionFromAPI < RunListExpansion
|
|
174
174
|
|
|
175
175
|
def rest
|
|
176
|
-
@rest ||= (source || Chef::REST.new(Chef::Config[:
|
|
176
|
+
@rest ||= (source || Chef::REST.new(Chef::Config[:chef_server_url]))
|
|
177
177
|
end
|
|
178
178
|
|
|
179
179
|
def fetch_role(name, included_by)
|
data/lib/chef/run_lock.rb
CHANGED
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
# limitations under the License.
|
|
17
17
|
|
|
18
18
|
require 'chef/mixin/create_path'
|
|
19
|
+
require 'fcntl'
|
|
19
20
|
|
|
20
21
|
class Chef
|
|
21
22
|
|
|
@@ -55,10 +56,15 @@ class Chef
|
|
|
55
56
|
# ensure the runlock_file path exists
|
|
56
57
|
create_path(File.dirname(runlock_file))
|
|
57
58
|
@runlock = File.open(runlock_file,'w+')
|
|
59
|
+
# if we support FD_CLOEXEC (linux, !windows), then use it.
|
|
60
|
+
# NB: ruby-2.0.0-p195 sets FD_CLOEXEC by default, but not ruby-1.8.7/1.9.3
|
|
61
|
+
if Fcntl.const_defined?('F_SETFD') && Fcntl.const_defined?('FD_CLOEXEC')
|
|
62
|
+
runlock.fcntl(Fcntl::F_SETFD, runlock.fcntl(Fcntl::F_GETFD, 0) | Fcntl::FD_CLOEXEC)
|
|
63
|
+
end
|
|
58
64
|
unless runlock.flock(File::LOCK_EX|File::LOCK_NB)
|
|
59
65
|
# Another chef client running...
|
|
60
66
|
runpid = runlock.read.strip.chomp
|
|
61
|
-
Chef::Log.
|
|
67
|
+
Chef::Log.warn("Chef client #{runpid} is running, will wait for it to finish and then run.")
|
|
62
68
|
runlock.flock(File::LOCK_EX)
|
|
63
69
|
end
|
|
64
70
|
# We grabbed the run lock. Save the pid.
|
data/lib/chef/runner.rb
CHANGED
|
@@ -127,7 +127,12 @@ class Chef
|
|
|
127
127
|
end
|
|
128
128
|
|
|
129
129
|
def stat
|
|
130
|
-
@stat ||= @new_resource.instance_of?(Chef::Resource::Link)
|
|
130
|
+
@stat ||= if @new_resource.instance_of?(Chef::Resource::Link)
|
|
131
|
+
::File.lstat(@new_resource.path)
|
|
132
|
+
else
|
|
133
|
+
realpath = ::File.realpath(@new_resource.path)
|
|
134
|
+
::File.stat(realpath)
|
|
135
|
+
end
|
|
131
136
|
end
|
|
132
137
|
end
|
|
133
138
|
end
|
data/lib/chef/search/query.rb
CHANGED
|
@@ -31,7 +31,7 @@ class Chef
|
|
|
31
31
|
attr_accessor :rest
|
|
32
32
|
|
|
33
33
|
def initialize(url=nil)
|
|
34
|
-
@rest = Chef::REST.new(url ||Chef::Config[:
|
|
34
|
+
@rest = Chef::REST.new(url ||Chef::Config[:chef_server_url])
|
|
35
35
|
end
|
|
36
36
|
|
|
37
37
|
# Search Solr for objects of a given type, for a given query. If you give
|
|
@@ -53,7 +53,7 @@ class Chef
|
|
|
53
53
|
end
|
|
54
54
|
|
|
55
55
|
def list_indexes
|
|
56
|
-
|
|
56
|
+
@rest.get_rest("search")
|
|
57
57
|
end
|
|
58
58
|
|
|
59
59
|
private
|
|
@@ -204,8 +204,8 @@ module Shell
|
|
|
204
204
|
Chef::Cookbook::FileVendor.on_create { |manifest| Chef::Cookbook::RemoteFileVendor.new(manifest, Chef::REST.new(Chef::Config[:server_url])) }
|
|
205
205
|
cookbook_hash = @client.sync_cookbooks
|
|
206
206
|
cookbook_collection = Chef::CookbookCollection.new(cookbook_hash)
|
|
207
|
-
@run_context = Chef::RunContext.new(node, cookbook_collection, @events)
|
|
208
|
-
@run_context.load(
|
|
207
|
+
@run_context = Chef::RunContext.new(node, cookbook_collection, @events)
|
|
208
|
+
@run_context.load(@node.run_list.expand(@node.chef_environment))
|
|
209
209
|
@run_status.run_context = run_context
|
|
210
210
|
end
|
|
211
211
|
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Lamont Granquist (<lamont@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
|
+
class Chef
|
|
20
|
+
class Util
|
|
21
|
+
class Backup
|
|
22
|
+
attr_reader :new_resource
|
|
23
|
+
attr_accessor :path
|
|
24
|
+
|
|
25
|
+
def initialize(new_resource, path = nil)
|
|
26
|
+
@new_resource = new_resource
|
|
27
|
+
@path = path.nil? ? new_resource.path : path
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def backup!
|
|
31
|
+
if @new_resource.backup != false && @new_resource.backup > 0 && ::File.exist?(path)
|
|
32
|
+
do_backup
|
|
33
|
+
# Clean up after the number of backups
|
|
34
|
+
slice_number = @new_resource.backup
|
|
35
|
+
backup_files = sorted_backup_files
|
|
36
|
+
if backup_files.length >= @new_resource.backup
|
|
37
|
+
remainder = backup_files.slice(slice_number..-1)
|
|
38
|
+
remainder.each do |backup_to_delete|
|
|
39
|
+
delete_backup(backup_to_delete)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
private
|
|
46
|
+
|
|
47
|
+
def backup_filename
|
|
48
|
+
@backup_filename ||= begin
|
|
49
|
+
time = Time.now
|
|
50
|
+
savetime = time.strftime("%Y%m%d%H%M%S")
|
|
51
|
+
backup_filename = "#{path}.chef-#{savetime}"
|
|
52
|
+
backup_filename = backup_filename.sub(/^([A-Za-z]:)/, "") #strip drive letter on Windows
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def prefix
|
|
57
|
+
# if :file_backup_path is nil, we fallback to the old behavior of
|
|
58
|
+
# keeping the backup in the same directory. We also need to to_s it
|
|
59
|
+
# so we don't get a type error around implicit to_str conversions.
|
|
60
|
+
@prefix ||= Chef::Config[:file_backup_path].to_s
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def backup_path
|
|
64
|
+
@backup_path ||= ::File.join(prefix, backup_filename)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def do_backup
|
|
68
|
+
FileUtils.mkdir_p(::File.dirname(backup_path)) if Chef::Config[:file_backup_path]
|
|
69
|
+
FileUtils.cp(path, backup_path, :preserve => true)
|
|
70
|
+
Chef::Log.info("#{@new_resource} backed up to #{backup_path}")
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def delete_backup(backup_file)
|
|
74
|
+
FileUtils.rm(backup_file)
|
|
75
|
+
Chef::Log.info("#{@new_resource} removed backup at #{backup_file}")
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def sorted_backup_files
|
|
79
|
+
Dir[::File.join(prefix, ".#{path}.chef-*")].sort { |a,b| b <=> a }
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
# Author:: Lamont Granquist (<lamont@opscode.com>)
|
|
2
|
+
# Copyright:: Copyright (c) 2013 Opscode, Inc.
|
|
3
|
+
# License:: Apache License, Version 2.0
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
#
|
|
17
|
+
|
|
18
|
+
require 'chef/mixin/shell_out'
|
|
19
|
+
|
|
20
|
+
class Chef
|
|
21
|
+
class Util
|
|
22
|
+
class Diff
|
|
23
|
+
include Chef::Mixin::ShellOut
|
|
24
|
+
|
|
25
|
+
# @todo: to_a, to_s, to_json, inspect defs, accessors for @diff and @error
|
|
26
|
+
# @todo: move coercion to UTF-8 into to_json
|
|
27
|
+
# @todo: replace shellout to diff -u with diff-lcs gem
|
|
28
|
+
|
|
29
|
+
def for_output
|
|
30
|
+
# formatted output to a terminal uses arrays of strings and returns error strings
|
|
31
|
+
@diff.nil? ? [ @error ] : @diff
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def for_reporting
|
|
35
|
+
# caller needs to ensure that new files aren't posted to resource reporting
|
|
36
|
+
return nil if @diff.nil?
|
|
37
|
+
@diff.join("\\n")
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def use_tempfile_if_missing(file)
|
|
41
|
+
tempfile = nil
|
|
42
|
+
unless File.exists?(file)
|
|
43
|
+
Chef::Log.debug("file #{file} does not exist to diff against, using empty tempfile")
|
|
44
|
+
tempfile = Tempfile.new("chef-diff")
|
|
45
|
+
file = tempfile.path
|
|
46
|
+
end
|
|
47
|
+
yield file
|
|
48
|
+
unless tempfile.nil?
|
|
49
|
+
tempfile.close
|
|
50
|
+
tempfile.unlink
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def diff(old_file, new_file)
|
|
55
|
+
use_tempfile_if_missing(old_file) do |old_file|
|
|
56
|
+
use_tempfile_if_missing(new_file) do |new_file|
|
|
57
|
+
@error = do_diff(old_file, new_file)
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
private
|
|
63
|
+
|
|
64
|
+
def do_diff(old_file, new_file)
|
|
65
|
+
if Chef::Config[:diff_disabled]
|
|
66
|
+
return "(diff output suppressed by config)"
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
diff_filesize_threshold = Chef::Config[:diff_filesize_threshold]
|
|
70
|
+
diff_output_threshold = Chef::Config[:diff_output_threshold]
|
|
71
|
+
|
|
72
|
+
if ::File.size(old_file) > diff_filesize_threshold || ::File.size(new_file) > diff_filesize_threshold
|
|
73
|
+
return "(file sizes exceed #{diff_filesize_threshold} bytes, diff output suppressed)"
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# MacOSX(BSD?) diff will *sometimes* happily spit out nasty binary diffs
|
|
77
|
+
return "(current file is binary, diff output suppressed)" if is_binary?(old_file)
|
|
78
|
+
return "(new content is binary, diff output suppressed)" if is_binary?(new_file)
|
|
79
|
+
|
|
80
|
+
begin
|
|
81
|
+
# -u: Unified diff format
|
|
82
|
+
# LC_ALL: in ruby 1.9 we want to set nil which is a magic option to mixlib-shellout to
|
|
83
|
+
# pass through the LC_ALL locale. in ruby 1.8 we force to 7-bit 'C' locale
|
|
84
|
+
# (which is the mixlib-shellout default for all rubies all the time).
|
|
85
|
+
Chef::Log.debug("running: diff -u #{old_file} #{new_file}")
|
|
86
|
+
locale = ( Object.const_defined? :Encoding ) ? nil : 'C'
|
|
87
|
+
result = shell_out("diff -u #{old_file} #{new_file}", :env => {'LC_ALL' => locale})
|
|
88
|
+
|
|
89
|
+
rescue Exception => e
|
|
90
|
+
# Should *not* receive this, but in some circumstances it seems that
|
|
91
|
+
# an exception can be thrown even using shell_out instead of shell_out!
|
|
92
|
+
return "Could not determine diff. Error: #{e.message}"
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# diff will set a non-zero return code even when there's
|
|
96
|
+
# valid stdout results, if it encounters something unexpected
|
|
97
|
+
# So as long as we have output, we'll show it.
|
|
98
|
+
#
|
|
99
|
+
# Also on some platforms (Solaris) diff outputs a single line
|
|
100
|
+
# when there are no differences found. Look for this line
|
|
101
|
+
# before analyzing diff output.
|
|
102
|
+
if !result.stdout.empty? && result.stdout != "No differences encountered\n"
|
|
103
|
+
if result.stdout.length > diff_output_threshold
|
|
104
|
+
return "(long diff of over #{diff_output_threshold} characters, diff output suppressed)"
|
|
105
|
+
else
|
|
106
|
+
diff_str = result.stdout
|
|
107
|
+
if Object.const_defined? :Encoding # ruby >= 1.9
|
|
108
|
+
if ( diff_str.encoding == Encoding::ASCII_8BIT &&
|
|
109
|
+
diff_str.encoding != Encoding.default_external &&
|
|
110
|
+
RUBY_VERSION.to_f < 2.0 )
|
|
111
|
+
# @todo mixlib-shellout under ruby 1.9 hands back an ASCII-8BIT encoded string, which needs to
|
|
112
|
+
# be fixed to the default external encoding -- this should be moved into mixlib-shellout
|
|
113
|
+
diff_str = diff_str.force_encoding(Encoding.default_external)
|
|
114
|
+
end
|
|
115
|
+
diff_str.encode!('UTF-8', :invalid => :replace, :undef => :replace, :replace => '?')
|
|
116
|
+
end
|
|
117
|
+
@diff = diff_str.split("\n")
|
|
118
|
+
@diff.delete("\")
|
|
119
|
+
return "(diff available)"
|
|
120
|
+
end
|
|
121
|
+
elsif !result.stderr.empty?
|
|
122
|
+
return "Could not determine diff. Error: #{result.stderr}"
|
|
123
|
+
else
|
|
124
|
+
return "(no diff)"
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def is_binary?(path)
|
|
129
|
+
File.open(path) do |file|
|
|
130
|
+
# XXX: this slurps into RAM, but we should have already checked our diff has a reasonable size
|
|
131
|
+
buff = file.read
|
|
132
|
+
buff = "" if buff.nil?
|
|
133
|
+
begin
|
|
134
|
+
return buff !~ /\A[\s[:print:]]*\z/m
|
|
135
|
+
rescue ArgumentError => e
|
|
136
|
+
return true if e.message =~ /invalid byte sequence/
|
|
137
|
+
raise
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
|
data/lib/chef/util/file_edit.rb
CHANGED
|
@@ -33,7 +33,7 @@ class Chef
|
|
|
33
33
|
@file_edited = false
|
|
34
34
|
|
|
35
35
|
raise ArgumentError, "File doesn't exist" unless File.exist? @original_pathname
|
|
36
|
-
|
|
36
|
+
@contents = File.new(@original_pathname).readlines
|
|
37
37
|
end
|
|
38
38
|
|
|
39
39
|
#search the file line by line and match each line with the given regex
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Sean O'Meara
|
|
3
|
+
# Author:: Kevin Keane
|
|
4
|
+
# Author:: Lamont Granquist (<lamont@opscode.com>)
|
|
5
|
+
#
|
|
6
|
+
# Copyright:: Copyright (c) 2011 Opscode, Inc.
|
|
7
|
+
# Copyright:: Copyright (c) 2013, North County Tech Center, LLC
|
|
8
|
+
#
|
|
9
|
+
# License:: Apache License, Version 2.0
|
|
10
|
+
#
|
|
11
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
12
|
+
# you may not use this file except in compliance with the License.
|
|
13
|
+
# You may obtain a copy of the License at
|
|
14
|
+
#
|
|
15
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
16
|
+
#
|
|
17
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
18
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
19
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
20
|
+
# See the License for the specific language governing permissions and
|
|
21
|
+
# limitations under the License.
|
|
22
|
+
|
|
23
|
+
require 'chef/mixin/shell_out'
|
|
24
|
+
|
|
25
|
+
class Chef
|
|
26
|
+
class Util
|
|
27
|
+
#
|
|
28
|
+
# IMPORTANT: We assume that selinux utilities are installed on an
|
|
29
|
+
# selinux enabled server. Provisioning an selinux enabled server
|
|
30
|
+
# without selinux utilities is not supported.
|
|
31
|
+
#
|
|
32
|
+
module Selinux
|
|
33
|
+
|
|
34
|
+
include Chef::Mixin::ShellOut
|
|
35
|
+
|
|
36
|
+
# We want to initialize below variables once during a
|
|
37
|
+
# chef-client run therefore they are class variables.
|
|
38
|
+
@@selinux_enabled = nil
|
|
39
|
+
@@restorecon_path = nil
|
|
40
|
+
@@selinuxenabled_path = nil
|
|
41
|
+
|
|
42
|
+
def selinux_enabled?
|
|
43
|
+
@@selinux_enabled = check_selinux_enabled? if @@selinux_enabled.nil?
|
|
44
|
+
@@selinux_enabled
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def restore_security_context(file_path, recursive = false)
|
|
48
|
+
if restorecon_path
|
|
49
|
+
restorecon_command = recursive ? "#{restorecon_path} -R -r" : "#{restorecon_path} -R"
|
|
50
|
+
restorecon_command += " #{file_path}"
|
|
51
|
+
Chef::Log.debug("Restoring selinux security content with #{restorecon_command}")
|
|
52
|
+
shell_out!(restorecon_command)
|
|
53
|
+
else
|
|
54
|
+
Chef::Log.warn "Can not find 'restorecon' on the system. Skipping selinux security context restore."
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
private
|
|
59
|
+
|
|
60
|
+
def restorecon_path
|
|
61
|
+
@@restorecon_path = which("restorecon") if @@restorecon_path.nil?
|
|
62
|
+
@@restorecon_path
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def selinuxenabled_path
|
|
66
|
+
@@selinuxenabled_path = which("selinuxenabled") if @@selinuxenabled_path.nil?
|
|
67
|
+
@@selinuxenabled_path
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def which(cmd)
|
|
71
|
+
paths = ENV['PATH'].split(File::PATH_SEPARATOR) + [ '/bin', '/usr/bin', '/sbin', '/usr/sbin' ]
|
|
72
|
+
paths.each do |path|
|
|
73
|
+
filename = File.join(path, cmd)
|
|
74
|
+
return filename if File.executable?(filename)
|
|
75
|
+
end
|
|
76
|
+
false
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def check_selinux_enabled?
|
|
80
|
+
if selinuxenabled_path
|
|
81
|
+
cmd = shell_out!(selinuxenabled_path, :returns => [0,1])
|
|
82
|
+
case cmd.exitstatus
|
|
83
|
+
when 1
|
|
84
|
+
return false
|
|
85
|
+
when 0
|
|
86
|
+
return true
|
|
87
|
+
else
|
|
88
|
+
raise RuntimeError, "Unknown exit code from command #{selinuxenabled_path}: #{cmd.exitstatus}"
|
|
89
|
+
end
|
|
90
|
+
else
|
|
91
|
+
# We assume selinux is not enabled if selinux utils are not
|
|
92
|
+
# installed.
|
|
93
|
+
return false
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|