chef 10.34.6-x86-mingw32 → 11.6.2-x86-mingw32
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.
- checksums.yaml +5 -13
- data/CONTRIBUTING.md +155 -0
- data/README.md +89 -0
- data/Rakefile +18 -1
- data/bin/chef-apply +25 -0
- data/bin/chef-service-manager +37 -0
- data/bin/chef-shell +34 -0
- data/bin/shef +6 -5
- 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/{shef.1.html → chef-shell.1.html} +49 -46
- data/distro/common/html/chef-solo.8.html +4 -4
- data/distro/common/html/chef-solr.8.html +5 -5
- 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 +4 -4
- data/distro/common/html/knife-data-bag.1.html +4 -4
- data/distro/common/html/knife-environment.1.html +4 -4
- data/distro/common/html/knife-exec.1.html +9 -9
- 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 +8 -13
- data/distro/common/man/man1/{shef.1 → chef-shell.1} +21 -57
- data/distro/common/man/man1/knife-bootstrap.1 +1 -1
- data/distro/common/man/man1/knife-client.1 +0 -99
- 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 +1 -1
- data/distro/common/man/man1/knife-data-bag.1 +1 -1
- data/distro/common/man/man1/knife-environment.1 +0 -168
- data/distro/common/man/man1/knife-exec.1 +4 -7
- 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 +3 -6
- 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 +1 -1
- data/distro/common/man/man8/chef-solr.8 +1 -1
- data/distro/common/markdown/man1/{shef.mkd → chef-shell.mkd} +49 -43
- data/distro/common/markdown/man1/knife-exec.mkd +11 -6
- data/distro/common/markdown/man1/knife.mkd +4 -9
- data/distro/debian/etc/default/chef-client +0 -1
- data/distro/debian/etc/init.d/chef-client +6 -4
- data/distro/windows/service_manager.rb +2 -146
- data/lib/chef.rb +3 -6
- data/lib/chef/api_client.rb +20 -130
- data/lib/chef/api_client/registration.rb +126 -0
- data/lib/chef/application.rb +68 -18
- data/lib/chef/application/apply.rb +162 -0
- data/lib/chef/application/client.rb +37 -22
- data/lib/chef/application/knife.rb +2 -4
- data/lib/chef/application/solo.rb +27 -13
- data/lib/chef/application/windows_service.rb +114 -54
- data/lib/chef/application/windows_service_manager.rb +179 -0
- data/lib/chef/applications.rb +1 -0
- data/lib/chef/chef_fs.rb +9 -0
- data/lib/chef/chef_fs/chef_fs_data_store.rb +371 -0
- data/lib/chef/chef_fs/command_line.rb +284 -0
- 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_pattern.rb +312 -0
- data/lib/chef/chef_fs/file_system.rb +426 -0
- 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_dir.rb +47 -0
- data/lib/chef/chef_fs/file_system/base_fs_object.rb +180 -0
- 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 +60 -0
- data/lib/chef/chef_fs/file_system/chef_repository_file_system_root_dir.rb +121 -0
- data/lib/chef/chef_fs/file_system/chef_server_root_dir.rb +110 -0
- data/lib/chef/chef_fs/file_system/cookbook_dir.rb +223 -0
- data/lib/chef/chef_fs/file_system/cookbook_file.rb +85 -0
- data/lib/chef/chef_fs/file_system/cookbook_frozen_error.rb +31 -0
- data/lib/chef/chef_fs/file_system/cookbook_subdir.rb +54 -0
- data/lib/chef/chef_fs/file_system/cookbooks_acl_dir.rb +41 -0
- data/lib/chef/chef_fs/file_system/cookbooks_dir.rb +149 -0
- data/lib/chef/chef_fs/file_system/data_bag_dir.rb +69 -0
- data/lib/chef/chef_fs/file_system/data_bags_dir.rb +72 -0
- 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 +90 -0
- data/lib/chef/chef_fs/file_system/file_system_error.rb +33 -0
- data/lib/chef/chef_fs/file_system/file_system_root_dir.rb +31 -0
- 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 +31 -0
- data/lib/chef/chef_fs/file_system/nodes_dir.rb +55 -0
- data/lib/chef/chef_fs/file_system/nonexistent_fs_object.rb +36 -0
- data/lib/chef/chef_fs/file_system/not_found_error.rb +31 -0
- 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 +113 -0
- data/lib/chef/chef_fs/file_system/rest_list_entry.rb +177 -0
- data/lib/chef/chef_fs/knife.rb +116 -0
- data/lib/chef/chef_fs/parallelizer.rb +129 -0
- data/lib/chef/chef_fs/path_utils.rb +90 -0
- data/lib/chef/chef_fs/raw_request.rb +79 -0
- data/lib/chef/client.rb +111 -34
- data/lib/chef/config.rb +111 -102
- data/lib/chef/cookbook/chefignore.rb +2 -1
- data/lib/chef/cookbook/metadata.rb +0 -2
- data/lib/chef/cookbook/syntax_check.rb +76 -14
- data/lib/chef/cookbook_loader.rb +39 -26
- data/lib/chef/cookbook_uploader.rb +16 -9
- data/lib/chef/cookbook_version.rb +2 -410
- data/lib/chef/daemon.rb +24 -19
- data/lib/chef/data_bag.rb +20 -104
- data/lib/chef/data_bag_item.rb +2 -65
- 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/digester.rb +73 -0
- data/lib/chef/dsl.rb +6 -0
- data/lib/chef/dsl/data_query.rb +71 -0
- data/lib/chef/dsl/include_attribute.rb +63 -0
- data/lib/chef/dsl/include_recipe.rb +45 -0
- data/lib/chef/dsl/platform_introspection.rb +218 -0
- data/lib/chef/dsl/recipe.rb +87 -0
- data/lib/chef/dsl/registry_helper.rb +59 -0
- data/lib/chef/encrypted_data_bag_item.rb +171 -24
- data/lib/chef/environment.rb +39 -179
- data/lib/chef/event_dispatch/base.rb +3 -0
- data/lib/chef/exceptions.rb +107 -8
- 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/base.rb +4 -1
- 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/resource_failure_inspector.rb +8 -0
- data/lib/chef/json_compat.rb +15 -14
- data/lib/chef/knife.rb +99 -41
- data/lib/chef/knife/bootstrap.rb +46 -2
- data/lib/chef/knife/bootstrap/archlinux-gems.erb +1 -1
- data/lib/chef/knife/bootstrap/centos5-gems.erb +1 -1
- data/lib/chef/knife/bootstrap/chef-full.erb +1 -1
- data/lib/chef/knife/bootstrap/fedora13-gems.erb +1 -1
- data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +1 -1
- data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +1 -1
- data/lib/chef/knife/bootstrap/ubuntu12.04-gems.erb +1 -1
- data/lib/chef/knife/client_show.rb +2 -5
- data/lib/chef/knife/configure.rb +19 -17
- data/lib/chef/knife/cookbook_create.rb +6 -5
- data/lib/chef/knife/cookbook_download.rb +13 -5
- data/lib/chef/knife/cookbook_metadata.rb +1 -0
- data/lib/chef/knife/cookbook_site_share.rb +1 -0
- data/lib/chef/knife/cookbook_test.rb +4 -2
- data/lib/chef/knife/cookbook_upload.rb +4 -4
- data/lib/chef/knife/core/bootstrap_context.rb +11 -5
- data/lib/chef/knife/core/generic_presenter.rb +42 -13
- data/lib/chef/knife/core/node_editor.rb +36 -16
- data/lib/chef/knife/core/node_presenter.rb +1 -1
- data/lib/chef/knife/core/subcommand_loader.rb +43 -12
- data/lib/chef/knife/core/text_formatter.rb +23 -37
- data/lib/chef/knife/core/ui.rb +34 -13
- data/lib/chef/knife/delete.rb +106 -0
- data/lib/chef/knife/deps.rb +139 -0
- data/lib/chef/knife/diff.rb +63 -0
- data/lib/chef/knife/download.rb +63 -0
- data/lib/chef/knife/edit.rb +76 -0
- data/lib/chef/knife/environment_show.rb +2 -0
- data/lib/chef/knife/exec.rb +5 -5
- data/lib/chef/knife/help_topics.rb +1 -1
- data/lib/chef/knife/index_rebuild.rb +91 -7
- data/lib/chef/knife/list.rb +153 -0
- 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 +64 -0
- data/lib/chef/knife/role_show.rb +2 -4
- data/lib/chef/knife/search.rb +45 -28
- data/lib/chef/knife/show.rb +55 -0
- data/lib/chef/knife/ssh.rb +14 -2
- data/lib/chef/knife/upload.rb +69 -0
- data/lib/chef/knife/user_create.rb +93 -0
- data/lib/chef/knife/user_delete.rb +46 -0
- data/lib/chef/knife/user_edit.rb +53 -0
- data/lib/chef/{provider/whyrun_safe_ruby_block.rb → knife/user_list.rb} +21 -9
- data/lib/chef/knife/user_reregister.rb +59 -0
- data/lib/chef/knife/user_show.rb +49 -0
- data/lib/chef/knife/xargs.rb +265 -0
- data/lib/chef/log.rb +2 -2
- data/lib/chef/mixin/checksum.rb +3 -3
- data/lib/chef/mixin/deep_merge.rb +78 -194
- data/lib/chef/mixin/deprecation.rb +35 -0
- data/lib/chef/mixin/file_class.rb +0 -9
- data/lib/chef/mixin/language.rb +22 -223
- data/lib/chef/mixin/language_include_attribute.rb +10 -36
- data/lib/chef/mixin/language_include_recipe.rb +7 -33
- data/lib/chef/mixin/params_validate.rb +0 -3
- data/lib/chef/mixin/recipe_definition_dsl_core.rb +10 -61
- data/lib/chef/mixin/securable.rb +32 -7
- data/lib/chef/mixin/template.rb +156 -26
- data/lib/chef/mixin/windows_architecture_helper.rb +91 -0
- data/lib/chef/mixins.rb +1 -5
- data/{spec/unit/monkey_patches/uri_spec.rb → lib/chef/monkey_patches/file.rb} +6 -14
- data/lib/chef/monkey_patches/net-ssh-multi.rb +140 -0
- data/lib/chef/monkey_patches/net_http.rb +0 -34
- data/lib/chef/monkey_patches/securerandom.rb +44 -0
- data/lib/chef/monologger.rb +93 -0
- data/lib/chef/node.rb +139 -308
- data/lib/chef/node/attribute.rb +367 -473
- data/lib/chef/node/attribute_collections.rb +206 -0
- data/lib/chef/node/immutable_collections.rb +186 -0
- data/lib/chef/platform.rb +4 -496
- data/lib/chef/platform/provider_mapping.rb +529 -0
- data/lib/chef/{mixin/check_helper.rb → platform/query_helpers.rb} +20 -9
- data/lib/chef/provider.rb +14 -58
- data/lib/chef/provider/batch.rb +35 -0
- data/lib/chef/provider/breakpoint.rb +6 -6
- data/lib/chef/provider/cookbook_file.rb +11 -80
- data/lib/chef/provider/cookbook_file/content.rb +49 -0
- data/lib/chef/provider/deploy.rb +26 -21
- data/lib/chef/provider/deploy/revision.rb +27 -0
- data/lib/chef/provider/directory.rb +12 -18
- data/lib/chef/provider/execute.rb +22 -5
- data/lib/chef/provider/file.rb +297 -248
- data/lib/chef/provider/file/content.rb +39 -0
- data/lib/chef/provider/git.rb +76 -43
- data/lib/chef/provider/group.rb +31 -51
- data/lib/chef/provider/group/dscl.rb +13 -53
- data/lib/chef/provider/group/gpasswd.rb +19 -14
- data/lib/chef/provider/group/groupadd.rb +1 -41
- data/lib/chef/provider/group/groupmod.rb +36 -46
- data/lib/chef/provider/group/pw.rb +16 -59
- data/lib/chef/provider/group/suse.rb +13 -16
- data/lib/chef/provider/group/usermod.rb +18 -40
- data/lib/chef/provider/group/windows.rb +6 -13
- data/lib/chef/provider/http_request.rb +25 -42
- 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 +12 -3
- data/lib/chef/provider/lwrp_base.rb +150 -0
- 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/rpm.rb +2 -2
- data/lib/chef/provider/package/rubygems.rb +4 -1
- data/lib/chef/provider/package/smartos.rb +47 -36
- data/lib/chef/provider/package/zypper.rb +45 -55
- data/lib/chef/provider/powershell_script.rb +77 -0
- data/lib/chef/provider/registry_key.rb +156 -0
- data/lib/chef/provider/remote_directory.rb +6 -5
- data/lib/chef/provider/remote_file.rb +13 -100
- 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/ruby_block.rb +5 -2
- data/lib/chef/provider/script.rb +14 -2
- data/lib/chef/provider/service.rb +15 -0
- data/lib/chef/provider/service/init.rb +9 -7
- data/lib/chef/provider/service/macosx.rb +29 -81
- data/lib/chef/provider/service/simple.rb +1 -1
- data/lib/chef/provider/service/solaris.rb +6 -5
- data/lib/chef/provider/template.rb +16 -81
- data/lib/chef/provider/template/content.rb +61 -0
- data/lib/chef/provider/template_finder.rb +61 -0
- data/lib/chef/provider/user.rb +0 -1
- data/lib/chef/provider/user/dscl.rb +175 -568
- data/lib/chef/provider/user/useradd.rb +50 -54
- data/lib/chef/provider/windows_script.rb +73 -0
- data/lib/chef/providers.rb +18 -1
- data/lib/chef/recipe.rb +14 -8
- data/lib/chef/resource.rb +52 -146
- data/lib/chef/resource/{whyrun_safe_ruby_block.rb → batch.rb} +10 -10
- 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/group.rb +1 -11
- data/lib/chef/resource/http_request.rb +2 -1
- data/lib/chef/resource/link.rb +17 -0
- data/lib/chef/resource/lwrp_base.rb +132 -0
- data/lib/chef/resource/mount.rb +39 -13
- data/lib/chef/resource/powershell_script.rb +31 -0
- data/lib/chef/resource/registry_key.rb +86 -0
- data/lib/chef/resource/remote_directory.rb +6 -5
- data/lib/chef/resource/remote_file.rb +62 -25
- data/lib/chef/resource/route.rb +1 -1
- data/lib/chef/resource/ruby_block.rb +2 -2
- data/lib/chef/resource/service.rb +14 -0
- data/lib/chef/resource/template.rb +145 -0
- data/lib/chef/resource/user.rb +0 -18
- data/lib/chef/resource/windows_script.rb +62 -0
- data/lib/chef/resource_collection.rb +69 -31
- data/lib/chef/resource_reporter.rb +81 -52
- data/lib/chef/resources.rb +4 -1
- data/lib/chef/rest.rb +55 -127
- data/lib/chef/rest/auth_credentials.rb +4 -20
- data/lib/chef/rest/rest_request.rb +7 -8
- data/lib/chef/role.rb +1 -97
- data/lib/chef/run_context.rb +108 -130
- data/lib/chef/run_context/cookbook_compiler.rb +280 -0
- data/lib/chef/run_list.rb +0 -2
- data/lib/chef/run_list/run_list_expansion.rb +1 -16
- data/lib/chef/run_lock.rb +96 -0
- data/lib/chef/runner.rb +28 -6
- data/lib/chef/sandbox.rb +15 -148
- data/lib/chef/scan_access_control.rb +8 -5
- data/lib/chef/search/query.rb +2 -2
- data/lib/chef/shef/ext.rb +3 -575
- data/lib/chef/{shef.rb → shell.rb} +35 -40
- data/lib/chef/shell/ext.rb +593 -0
- data/lib/chef/{shef → shell}/model_wrapper.rb +3 -3
- data/lib/chef/{shef/shef_rest.rb → shell/shell_rest.rb} +4 -4
- data/lib/chef/{shef/shef_session.rb → shell/shell_session.rb} +15 -13
- data/lib/chef/shell_out.rb +7 -0
- data/lib/chef/user.rb +182 -0
- 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_group.rb +1 -5
- 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/{index_queue.rb → version_constraint/platform.rb} +11 -14
- data/lib/chef/win32/api/file.rb +8 -2
- data/lib/chef/win32/api/security.rb +45 -1
- data/lib/chef/win32/registry.rb +382 -0
- data/lib/chef/win32/security.rb +19 -0
- 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/attributes/default.rb +10 -9
- data/spec/data/cookbooks/openldap/attributes/smokey.rb +1 -1
- 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_subcommand/test_yourself.rb +8 -0
- data/spec/data/lwrp/providers/inline_compiler.rb +26 -0
- data/spec/data/nodes/default.rb +3 -3
- data/spec/data/nodes/test.example.com.rb +3 -3
- data/spec/data/nodes/test.rb +3 -3
- data/spec/data/null_config.rb +1 -0
- data/spec/data/partial_one.erb +1 -0
- data/spec/data/remote_file/nyan_cat.png.gz +0 -0
- data/spec/data/run_context/cookbooks/circular-dep1/attributes/default.rb +4 -0
- data/spec/data/run_context/cookbooks/circular-dep1/definitions/circular_dep1_res.rb +1 -0
- data/spec/data/run_context/cookbooks/circular-dep1/libraries/lib.rb +2 -0
- data/spec/data/run_context/cookbooks/circular-dep1/metadata.rb +2 -0
- data/spec/data/run_context/cookbooks/circular-dep1/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/circular-dep1/recipes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/circular-dep1/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/circular-dep2/attributes/default.rb +3 -0
- data/spec/data/run_context/cookbooks/circular-dep2/definitions/circular_dep2_res.rb +1 -0
- data/spec/data/run_context/cookbooks/circular-dep2/libraries/lib.rb +2 -0
- data/spec/data/run_context/cookbooks/circular-dep2/metadata.rb +2 -0
- data/spec/data/run_context/cookbooks/circular-dep2/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/circular-dep2/recipes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/circular-dep2/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/dependency1/attributes/aa_first.rb +2 -0
- data/spec/data/run_context/cookbooks/dependency1/attributes/default.rb +2 -0
- data/spec/data/run_context/cookbooks/dependency1/attributes/zz_last.rb +3 -0
- data/spec/data/run_context/cookbooks/dependency1/definitions/dependency1_res.rb +1 -0
- data/spec/data/run_context/cookbooks/dependency1/libraries/lib.rb +2 -0
- data/spec/data/run_context/cookbooks/dependency1/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/dependency1/recipes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/dependency1/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/dependency2/attributes/default.rb +3 -0
- data/spec/data/run_context/cookbooks/dependency2/definitions/dependency2_res.rb +1 -0
- data/spec/data/run_context/cookbooks/dependency2/libraries/lib.rb +2 -0
- data/spec/data/run_context/cookbooks/dependency2/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/dependency2/recipes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/dependency2/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/no-default-attr/attributes/server.rb +3 -0
- data/spec/data/run_context/cookbooks/no-default-attr/definitions/no_default-attr_res.rb +1 -0
- data/spec/data/run_context/cookbooks/no-default-attr/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/no-default-attr/recipes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/no-default-attr/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/attributes/default.rb +3 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/definitions/test_with-circular-deps_res.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/libraries/lib.rb +2 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/metadata.rb +2 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/recipes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-deps/attributes/default.rb +3 -0
- data/spec/data/run_context/cookbooks/test-with-deps/definitions/test_with-deps_res.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-deps/libraries/lib.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-deps/metadata.rb +3 -0
- data/spec/data/run_context/cookbooks/test-with-deps/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-deps/recipes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/test-with-deps/recipes/server.rb +0 -0
- data/spec/data/run_context/cookbooks/test-with-deps/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/test/attributes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/test/attributes/george.rb +1 -1
- data/spec/data/run_context/cookbooks/test/definitions/test_res.rb +1 -0
- data/spec/data/run_context/cookbooks/test/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/test/resources/resource.rb +1 -0
- data/spec/data/shef-config.rb +10 -0
- data/spec/functional/dsl/registry_helper_spec.rb +63 -0
- data/spec/functional/file_content_management/deploy_strategies_spec.rb +238 -0
- data/spec/functional/knife/cookbook_delete_spec.rb +1 -1
- data/spec/functional/knife/exec_spec.rb +3 -3
- data/spec/functional/knife/smoke_test.rb +34 -0
- data/spec/functional/knife/ssh_spec.rb +5 -1
- 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 +15 -9
- data/spec/functional/resource/deploy_revision_spec.rb +180 -0
- data/spec/functional/resource/directory_spec.rb +5 -1
- data/spec/functional/resource/file_spec.rb +71 -21
- data/spec/functional/resource/git_spec.rb +259 -0
- data/spec/functional/resource/link_spec.rb +424 -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 +576 -0
- data/spec/functional/resource/remote_directory_spec.rb +143 -37
- data/spec/functional/resource/remote_file_spec.rb +99 -13
- data/spec/functional/resource/template_spec.rb +180 -3
- data/spec/functional/resource/user_spec.rb +547 -0
- data/spec/functional/run_lock_spec.rb +243 -0
- data/spec/functional/shell_spec.rb +102 -0
- data/spec/functional/win32/registry_helper_spec.rb +632 -0
- data/spec/functional/win32/security_spec.rb +37 -0
- 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 +49 -13
- data/spec/stress/win32/security_spec.rb +1 -1
- data/spec/support/chef_helpers.rb +33 -3
- data/spec/support/lib/chef/resource/cat.rb +3 -5
- data/spec/support/lib/chef/resource/one_two_three_four.rb +8 -10
- data/spec/support/lib/chef/resource/zen_master.rb +8 -10
- data/spec/support/platform_helpers.rb +46 -13
- data/spec/support/platforms/win32/spec_service.rb +59 -0
- data/spec/support/shared/functional/diff_disabled.rb +10 -0
- data/spec/support/shared/functional/directory_resource.rb +129 -38
- data/spec/support/shared/functional/file_resource.rb +837 -71
- data/spec/support/shared/functional/securable_resource.rb +189 -58
- data/spec/support/shared/functional/securable_resource_with_reporting.rb +385 -0
- 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 +70 -0
- data/spec/support/shared/unit/platform_introspector.rb +162 -0
- 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/api_client/registration_spec.rb +172 -0
- data/spec/unit/api_client_spec.rb +78 -156
- data/spec/unit/application/apply.rb +84 -0
- data/spec/unit/application/client_spec.rb +16 -14
- data/spec/unit/application/knife_spec.rb +17 -0
- data/spec/unit/application/solo_spec.rb +1 -1
- data/spec/unit/application_spec.rb +113 -3
- data/spec/unit/checksum/storage/filesystem_spec.rb +1 -1
- data/spec/unit/chef_fs/diff_spec.rb +328 -0
- data/spec/unit/chef_fs/file_pattern_spec.rb +526 -0
- data/spec/unit/chef_fs/file_system_spec.rb +135 -0
- data/spec/unit/client_spec.rb +195 -23
- data/spec/unit/config_spec.rb +102 -51
- data/spec/unit/cookbook/syntax_check_spec.rb +75 -111
- data/spec/unit/cookbook_loader_spec.rb +154 -91
- data/spec/unit/cookbook_manifest_spec.rb +81 -81
- data/spec/unit/cookbook_spec.rb +3 -20
- data/spec/unit/cookbook_version_spec.rb +23 -122
- data/spec/unit/daemon_spec.rb +24 -19
- data/spec/unit/data_bag_spec.rb +13 -4
- data/spec/unit/deprecation_spec.rb +86 -0
- data/spec/unit/digester_spec.rb +50 -0
- data/spec/unit/dsl/data_query_spec.rb +66 -0
- data/spec/unit/dsl/platform_introspection_spec.rb +130 -0
- data/spec/unit/dsl/regsitry_helper_spec.rb +55 -0
- data/spec/unit/encrypted_data_bag_item_spec.rb +197 -157
- data/spec/unit/environment_spec.rb +94 -126
- data/spec/unit/exceptions_spec.rb +8 -4
- 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 +6 -5
- data/spec/unit/json_compat_spec.rb +8 -0
- data/spec/unit/knife/bootstrap_spec.rb +130 -29
- data/spec/unit/knife/configure_spec.rb +64 -45
- data/spec/unit/knife/cookbook_download_spec.rb +24 -3
- data/spec/unit/knife/cookbook_metadata_spec.rb +11 -4
- data/spec/unit/knife/cookbook_test_spec.rb +1 -0
- data/spec/unit/knife/cookbook_upload_spec.rb +39 -0
- data/spec/unit/knife/core/bootstrap_context_spec.rb +79 -62
- data/spec/unit/knife/core/subcommand_loader_spec.rb +20 -0
- data/spec/unit/knife/core/ui_spec.rb +196 -124
- data/spec/unit/knife/data_bag_create_spec.rb +9 -0
- data/spec/unit/knife/data_bag_edit_spec.rb +1 -4
- data/spec/unit/knife/data_bag_from_file_spec.rb +4 -6
- data/spec/unit/knife/data_bag_show_spec.rb +11 -4
- data/spec/unit/knife/index_rebuild_spec.rb +96 -33
- data/spec/unit/knife/knife_help.rb +7 -7
- data/spec/unit/knife/node_edit_spec.rb +6 -33
- data/spec/unit/knife/node_run_list_remove_spec.rb +2 -1
- data/spec/unit/knife/node_run_list_set_spec.rb +140 -0
- data/spec/unit/knife/ssh_spec.rb +12 -15
- data/spec/unit/knife/status_spec.rb +2 -2
- data/spec/unit/knife/user_create_spec.rb +86 -0
- data/spec/unit/knife/user_delete_spec.rb +39 -0
- data/spec/unit/knife/user_edit_spec.rb +42 -0
- data/spec/unit/knife/user_list_spec.rb +32 -0
- data/spec/unit/knife/user_reregister_spec.rb +53 -0
- data/spec/unit/knife/user_show_spec.rb +41 -0
- data/spec/unit/knife_spec.rb +74 -0
- data/spec/unit/lwrp_spec.rb +102 -60
- data/spec/unit/mixin/checksum_spec.rb +2 -2
- data/spec/unit/mixin/deep_merge_spec.rb +130 -791
- data/spec/unit/mixin/deprecation_spec.rb +23 -0
- data/spec/unit/mixin/enforce_ownership_and_permissions_spec.rb +7 -1
- data/spec/unit/mixin/params_validate_spec.rb +4 -2
- data/spec/unit/mixin/securable_spec.rb +5 -3
- data/spec/unit/mixin/template_spec.rb +145 -14
- data/spec/unit/mixin/windows_architecture_helper_spec.rb +83 -0
- data/spec/unit/node/attribute_spec.rb +273 -173
- data/spec/unit/node/immutable_collections_spec.rb +139 -0
- data/spec/unit/node_spec.rb +418 -370
- data/spec/unit/platform_spec.rb +21 -8
- data/spec/unit/provider/breakpoint_spec.rb +8 -8
- data/spec/unit/provider/cookbook_file/content_spec.rb +40 -0
- data/spec/unit/provider/cookbook_file_spec.rb +26 -187
- 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 +99 -67
- data/spec/unit/provider/env_spec.rb +2 -2
- 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 -475
- data/spec/unit/provider/git_spec.rb +224 -28
- data/spec/unit/provider/group/dscl_spec.rb +0 -36
- data/spec/unit/provider/group/gpasswd_spec.rb +9 -16
- data/spec/unit/provider/group/groupadd_spec.rb +4 -3
- data/spec/unit/provider/group/groupmod_spec.rb +1 -0
- data/spec/unit/provider/group/pw_spec.rb +15 -12
- data/spec/unit/provider/group/usermod_spec.rb +9 -22
- data/spec/unit/provider/group/windows_spec.rb +8 -0
- data/spec/unit/provider/group_spec.rb +6 -28
- data/spec/unit/provider/http_request_spec.rb +28 -69
- 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/ohai_spec.rb +4 -4
- data/spec/unit/provider/package/apt_spec.rb +0 -1
- data/spec/unit/provider/package/ips_spec.rb +0 -1
- data/spec/unit/provider/package/rpm_spec.rb +0 -12
- data/spec/unit/provider/package/rubygems_spec.rb +1 -1
- data/spec/unit/provider/package/smartos_spec.rb +3 -2
- data/spec/unit/provider/package/zypper_spec.rb +84 -22
- data/spec/unit/provider/package_spec.rb +7 -9
- data/spec/unit/provider/powershell_spec.rb +38 -0
- data/spec/unit/provider/registry_key_spec.rb +269 -0
- data/spec/unit/provider/remote_directory_spec.rb +7 -7
- 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 -259
- data/spec/unit/provider/route_spec.rb +29 -12
- data/spec/unit/provider/ruby_block_spec.rb +8 -0
- data/spec/unit/provider/service/arch_service_spec.rb +5 -5
- data/spec/unit/provider/service/debian_service_spec.rb +1 -1
- data/spec/unit/provider/service/freebsd_service_spec.rb +5 -5
- data/spec/unit/provider/service/init_service_spec.rb +27 -4
- data/spec/unit/provider/service/insserv_service_spec.rb +1 -1
- data/spec/unit/provider/service/invokercd_service_spec.rb +4 -4
- data/spec/unit/provider/service/macosx_spec.rb +176 -207
- data/spec/unit/provider/service/redhat_spec.rb +1 -1
- data/spec/unit/provider/service/simple_service_spec.rb +3 -3
- 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 +11 -11
- data/spec/unit/provider/service_spec.rb +3 -3
- data/spec/unit/provider/subversion_spec.rb +1 -1
- data/spec/unit/provider/template/content_spec.rb +78 -0
- data/spec/unit/provider/template_spec.rb +52 -160
- data/spec/unit/provider/user/dscl_spec.rb +285 -681
- data/spec/unit/provider/user/solaris_spec.rb +39 -373
- data/spec/unit/provider/user/useradd_spec.rb +12 -379
- data/spec/unit/provider/user_spec.rb +1 -1
- data/spec/unit/recipe_spec.rb +10 -8
- data/spec/unit/registry_helper_spec.rb +376 -0
- 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 -11
- data/spec/unit/resource/powershell_spec.rb +48 -0
- data/spec/unit/resource/registry_key_spec.rb +171 -0
- data/spec/unit/resource/remote_file_spec.rb +63 -25
- data/spec/unit/resource/route_spec.rb +1 -1
- data/spec/unit/resource/ruby_block_spec.rb +7 -3
- data/spec/unit/resource/script_spec.rb +13 -36
- data/spec/unit/resource/service_spec.rb +11 -0
- 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 +197 -5
- data/spec/unit/rest/auth_credentials_spec.rb +4 -21
- data/spec/unit/rest_spec.rb +134 -284
- data/spec/unit/run_context/cookbook_compiler_spec.rb +190 -0
- data/spec/unit/run_context_spec.rb +18 -4
- data/spec/unit/run_list_spec.rb +0 -209
- data/spec/unit/run_lock_spec.rb +37 -0
- data/spec/unit/runner_spec.rb +102 -3
- data/spec/unit/scan_access_control_spec.rb +8 -6
- data/spec/unit/{shef → shell}/model_wrapper_spec.rb +5 -5
- data/spec/unit/{shef/shef_ext_spec.rb → shell/shell_ext_spec.rb} +21 -21
- data/spec/unit/{shef/shef_session_spec.rb → shell/shell_session_spec.rb} +16 -58
- data/spec/unit/shell_out_spec.rb +18 -0
- data/spec/unit/{shef_spec.rb → shell_spec.rb} +20 -20
- data/spec/unit/user_spec.rb +255 -0
- 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 +493 -264
- data/README.rdoc +0 -177
- data/distro/common/html/knife-recipe.1.html +0 -92
- data/lib/chef/certificate.rb +0 -161
- data/lib/chef/checksum.rb +0 -167
- data/lib/chef/checksum_cache.rb +0 -190
- data/lib/chef/cookbook_version_selector.rb +0 -168
- data/lib/chef/couchdb.rb +0 -246
- data/lib/chef/index_queue/amqp_client.rb +0 -116
- data/lib/chef/index_queue/consumer.rb +0 -76
- data/lib/chef/index_queue/indexable.rb +0 -109
- data/lib/chef/knife/bootstrap/ubuntu12.10-gems.erb +0 -60
- data/lib/chef/monkey_patches/dir.rb +0 -36
- data/lib/chef/monkey_patches/moneta.rb +0 -50
- data/lib/chef/monkey_patches/uri.rb +0 -70
- data/lib/chef/openid_registration.rb +0 -187
- data/lib/chef/solr_query.rb +0 -187
- data/lib/chef/solr_query/lucene.treetop +0 -150
- data/lib/chef/solr_query/lucene_nodes.rb +0 -285
- data/lib/chef/solr_query/query_transform.rb +0 -65
- data/lib/chef/solr_query/solr_http_request.rb +0 -132
- data/lib/chef/webui_user.rb +0 -231
- data/spec/data/mac_users/10.7-8.plist.xml +0 -559
- data/spec/data/mac_users/10.7-8.shadow.xml +0 -11
- data/spec/data/mac_users/10.7.plist.xml +0 -559
- data/spec/data/mac_users/10.7.shadow.xml +0 -11
- data/spec/data/mac_users/10.8.plist.xml +0 -559
- data/spec/data/mac_users/10.8.shadow.xml +0 -21
- data/spec/data/mac_users/10.9.plist.xml +0 -560
- data/spec/data/mac_users/10.9.shadow.xml +0 -21
- data/spec/functional/resource/base.rb +0 -40
- data/spec/functional/resource/group_spec.rb +0 -343
- data/spec/functional/resource/user/dscl_spec.rb +0 -199
- data/spec/unit/certificate_spec.rb +0 -76
- data/spec/unit/checksum_cache_spec.rb +0 -209
- data/spec/unit/checksum_spec.rb +0 -94
- data/spec/unit/couchdb_spec.rb +0 -274
- data/spec/unit/index_queue_spec.rb +0 -391
- data/spec/unit/mixin/language_spec.rb +0 -305
- data/spec/unit/openid_registration_spec.rb +0 -153
- data/spec/unit/provider/whyrun_safe_ruby_block_spec.rb +0 -47
- data/spec/unit/solr_query/query_transform_spec.rb +0 -454
- data/spec/unit/solr_query/solr_http_request_spec.rb +0 -244
- data/spec/unit/solr_query_spec.rb +0 -203
- data/spec/unit/webui_user_spec.rb +0 -238
@@ -0,0 +1,61 @@
|
|
1
|
+
#--
|
2
|
+
# Author:: Andrea Campi (<andrea.campi@zephirworks.com>)
|
3
|
+
# Copyright:: Copyright (c) 2012 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 Provider
|
21
|
+
|
22
|
+
class TemplateFinder
|
23
|
+
|
24
|
+
def initialize(run_context, cookbook_name, node)
|
25
|
+
@run_context = run_context
|
26
|
+
@cookbook_name = cookbook_name
|
27
|
+
@node = node
|
28
|
+
end
|
29
|
+
|
30
|
+
def find(template_name, options = {})
|
31
|
+
template_name = template_source_name(template_name, options)
|
32
|
+
|
33
|
+
if options[:local]
|
34
|
+
return template_name
|
35
|
+
end
|
36
|
+
|
37
|
+
cookbook_name = find_cookbook_name(options)
|
38
|
+
cookbook = @run_context.cookbook_collection[cookbook_name]
|
39
|
+
|
40
|
+
cookbook.preferred_filename_on_disk_location(@node, :templates, template_name)
|
41
|
+
end
|
42
|
+
|
43
|
+
protected
|
44
|
+
def template_source_name(name, options)
|
45
|
+
if options[:source]
|
46
|
+
options[:source]
|
47
|
+
else
|
48
|
+
name
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def find_cookbook_name(options)
|
53
|
+
if options[:cookbook]
|
54
|
+
options[:cookbook]
|
55
|
+
else
|
56
|
+
@cookbook_name
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
data/lib/chef/provider/user.rb
CHANGED
@@ -6,9 +6,9 @@
|
|
6
6
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
7
|
# you may not use this file except in compliance with the License.
|
8
8
|
# You may obtain a copy of the License at
|
9
|
-
#
|
9
|
+
#
|
10
10
|
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
-
#
|
11
|
+
#
|
12
12
|
# Unless required by applicable law or agreed to in writing, software
|
13
13
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
14
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
@@ -17,288 +17,246 @@
|
|
17
17
|
#
|
18
18
|
|
19
19
|
require 'chef/mixin/shell_out'
|
20
|
-
require 'mixlib/shellout'
|
21
20
|
require 'chef/provider/user'
|
22
21
|
require 'openssl'
|
23
|
-
require 'plist'
|
24
22
|
|
25
23
|
class Chef
|
26
24
|
class Provider
|
27
25
|
class User
|
28
|
-
include Chef::Mixin::ShellOut
|
29
|
-
|
30
|
-
#
|
31
|
-
# The most tricky bit of this provider is the way it deals with user passwords.
|
32
|
-
# Mac OS X has different password shadow calculations based on the version.
|
33
|
-
# < 10.7 => password shadow calculation format SALTED-SHA1
|
34
|
-
# => stored in: /var/db/shadow/hash/#{guid}
|
35
|
-
# => shadow binary length 68 bytes
|
36
|
-
# => First 4 bytes salt / Next 64 bytes shadow value
|
37
|
-
# = 10.7 => password shadow calculation format SALTED-SHA512
|
38
|
-
# => stored in: /var/db/dslocal/nodes/Default/users/#{name}.plist
|
39
|
-
# => shadow binary length 68 bytes
|
40
|
-
# => First 4 bytes salt / Next 64 bytes shadow value
|
41
|
-
# > 10.7 => password shadow calculation format SALTED-SHA512-PBKDF2
|
42
|
-
# => stored in: /var/db/dslocal/nodes/Default/users/#{name}.plist
|
43
|
-
# => shadow binary length 128 bytes
|
44
|
-
# => Salt / Iterations are stored seperately in the same file
|
45
|
-
#
|
46
|
-
# This provider only supports Mac OSX versions 10.7 and above
|
47
26
|
class Dscl < Chef::Provider::User
|
27
|
+
include Chef::Mixin::ShellOut
|
28
|
+
|
29
|
+
NFS_HOME_DIRECTORY = %r{^NFSHomeDirectory: (.*)$}
|
30
|
+
AUTHENTICATION_AUTHORITY = %r{^AuthenticationAuthority: (.*)$}
|
31
|
+
|
32
|
+
def dscl(*args)
|
33
|
+
shell_out("dscl . -#{args.join(' ')}")
|
34
|
+
end
|
48
35
|
|
49
|
-
def
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
requirements.assert(:all_actions) do |a|
|
58
|
-
a.assertion { ::File.exists?("/usr/bin/dscl") }
|
59
|
-
a.failure_message(Chef::Exceptions::User, "Cannot find binary '/usr/bin/dscl' on the system for #{@new_resource}!")
|
60
|
-
end
|
36
|
+
def safe_dscl(*args)
|
37
|
+
result = dscl(*args)
|
38
|
+
return "" if ( args.first =~ /^delete/ ) && ( result.exitstatus != 0 )
|
39
|
+
raise(Chef::Exceptions::DsclCommandFailed,"dscl error: #{result.inspect}") unless result.exitstatus == 0
|
40
|
+
raise(Chef::Exceptions::DsclCommandFailed,"dscl error: #{result.inspect}") if result.stdout =~ /No such key: /
|
41
|
+
return result.stdout
|
42
|
+
end
|
61
43
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
44
|
+
# This is handled in providers/group.rb by Etc.getgrnam()
|
45
|
+
# def user_exists?(user)
|
46
|
+
# users = safe_dscl("list /Users")
|
47
|
+
# !! ( users =~ Regexp.new("\n#{user}\n") )
|
48
|
+
# end
|
66
49
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
50
|
+
# get a free UID greater than 200
|
51
|
+
def get_free_uid(search_limit=1000)
|
52
|
+
uid = nil; next_uid_guess = 200
|
53
|
+
users_uids = safe_dscl("list /Users uid")
|
54
|
+
while(next_uid_guess < search_limit + 200)
|
55
|
+
if users_uids =~ Regexp.new("#{Regexp.escape(next_uid_guess.to_s)}\n")
|
56
|
+
next_uid_guess += 1
|
57
|
+
else
|
58
|
+
uid = next_uid_guess
|
59
|
+
break
|
75
60
|
end
|
76
|
-
a.failure_message(Chef::Exceptions::User, "SALTED-SHA512 passwords are not supported on Mac 10.8 and above. \
|
77
|
-
If you want to set the user password using shadow info make sure you specify a SALTED-SHA512-PBKDF2 shadow hash \
|
78
|
-
in 'password', with the associated 'salt' and 'iterations'.")
|
79
61
|
end
|
62
|
+
return uid || raise("uid not found. Exhausted. Searched #{search_limit} times")
|
63
|
+
end
|
80
64
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
a.failure_message(Chef::Exceptions::User, "SALTED-SHA512-PBKDF2 shadow hash is given without associated \
|
92
|
-
'salt' and 'iterations'. Please specify 'salt' and 'iterations' in order to set the user password using shadow hash.")
|
65
|
+
def uid_used?(uid)
|
66
|
+
return false unless uid
|
67
|
+
users_uids = safe_dscl("list /Users uid")
|
68
|
+
!! ( users_uids =~ Regexp.new("#{Regexp.escape(uid.to_s)}\n") )
|
69
|
+
end
|
70
|
+
|
71
|
+
def set_uid
|
72
|
+
@new_resource.uid(get_free_uid) if (@new_resource.uid.nil? || @new_resource.uid == '')
|
73
|
+
if uid_used?(@new_resource.uid)
|
74
|
+
raise(Chef::Exceptions::RequestedUIDUnavailable, "uid #{@new_resource.uid} is already in use")
|
93
75
|
end
|
76
|
+
safe_dscl("create /Users/#{@new_resource.username} UniqueID #{@new_resource.uid}")
|
77
|
+
end
|
94
78
|
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
79
|
+
def modify_home
|
80
|
+
return safe_dscl("delete /Users/#{@new_resource.username} NFSHomeDirectory") if (@new_resource.home.nil? || @new_resource.home.empty?)
|
81
|
+
if @new_resource.supports[:manage_home]
|
82
|
+
validate_home_dir_specification!
|
83
|
+
|
84
|
+
if (@current_resource.home == @new_resource.home) && !new_home_exists?
|
85
|
+
ditto_home
|
86
|
+
elsif !current_home_exists? && !new_home_exists?
|
87
|
+
ditto_home
|
88
|
+
elsif current_home_exists?
|
89
|
+
move_home
|
103
90
|
end
|
104
|
-
a.failure_message(Chef::Exceptions::User, "SALTED-SHA512-PBKDF2 shadow hashes are not supported on \
|
105
|
-
Mac OS X version 10.7. Please specify a SALTED-SHA512 shadow hash in 'password' attribute to set the \
|
106
|
-
user password using shadow hash.")
|
107
91
|
end
|
108
|
-
|
92
|
+
safe_dscl("create /Users/#{@new_resource.username} NFSHomeDirectory '#{@new_resource.home}'")
|
109
93
|
end
|
110
94
|
|
111
|
-
def
|
112
|
-
|
113
|
-
|
95
|
+
def osx_shadow_hash?(string)
|
96
|
+
return !! ( string =~ /^[[:xdigit:]]{1240}$/ )
|
97
|
+
end
|
114
98
|
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
@current_resource.gid(dscl_get(@user_info, :gid))
|
119
|
-
@current_resource.home(dscl_get(@user_info, :home))
|
120
|
-
@current_resource.shell(dscl_get(@user_info, :shell))
|
121
|
-
@current_resource.comment(dscl_get(@user_info, :comment))
|
122
|
-
@authentication_authority = dscl_get(@user_info, :auth_authority)
|
99
|
+
def osx_salted_sha1?(string)
|
100
|
+
return !! ( string =~ /^[[:xdigit:]]{48}$/ )
|
101
|
+
end
|
123
102
|
|
124
|
-
|
125
|
-
|
126
|
-
|
103
|
+
def guid
|
104
|
+
safe_dscl("read /Users/#{@new_resource.username} GeneratedUID").gsub(/GeneratedUID: /,"").strip
|
105
|
+
end
|
127
106
|
|
128
|
-
|
129
|
-
|
130
|
-
|
107
|
+
def shadow_hash_set?
|
108
|
+
user_data = safe_dscl("read /Users/#{@new_resource.username}")
|
109
|
+
if user_data =~ /AuthenticationAuthority: / && user_data =~ /ShadowHash/
|
110
|
+
true
|
111
|
+
else
|
112
|
+
false
|
113
|
+
end
|
114
|
+
end
|
131
115
|
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
@current_resource.salt(shadow_hash["SALTED-SHA512-PBKDF2"]["salt"].string.unpack('H*').first)
|
116
|
+
def modify_password
|
117
|
+
if @new_resource.password
|
118
|
+
shadow_hash = nil
|
119
|
+
|
120
|
+
Chef::Log.debug("#{new_resource} updating password")
|
121
|
+
if osx_shadow_hash?(@new_resource.password)
|
122
|
+
shadow_hash = @new_resource.password.upcase
|
123
|
+
else
|
124
|
+
if osx_salted_sha1?(@new_resource.password)
|
125
|
+
salted_sha1 = @new_resource.password.upcase
|
143
126
|
else
|
144
|
-
|
127
|
+
hex_salt = ""
|
128
|
+
OpenSSL::Random.random_bytes(10).each_byte { |b| hex_salt << b.to_i.to_s(16) }
|
129
|
+
hex_salt = hex_salt.slice(0...8)
|
130
|
+
salt = [hex_salt].pack("H*")
|
131
|
+
sha1 = ::OpenSSL::Digest::SHA1.hexdigest(salt+@new_resource.password)
|
132
|
+
salted_sha1 = (hex_salt+sha1).upcase
|
145
133
|
end
|
134
|
+
shadow_hash = String.new("00000000"*155)
|
135
|
+
shadow_hash[168] = salted_sha1
|
136
|
+
end
|
137
|
+
|
138
|
+
::File.open("/var/db/shadow/hash/#{guid}",'w',0600) do |output|
|
139
|
+
output.puts shadow_hash
|
140
|
+
end
|
141
|
+
|
142
|
+
unless shadow_hash_set?
|
143
|
+
safe_dscl("append /Users/#{@new_resource.username} AuthenticationAuthority ';ShadowHash;'")
|
146
144
|
end
|
147
|
-
|
148
|
-
convert_group_name if @new_resource.gid
|
149
|
-
else
|
150
|
-
@user_exists = false
|
151
|
-
Chef::Log.debug("#{@new_resource} user does not exist")
|
152
145
|
end
|
153
|
-
|
154
|
-
@current_resource
|
155
146
|
end
|
156
147
|
|
157
|
-
|
158
|
-
|
159
|
-
|
148
|
+
def load_current_resource
|
149
|
+
super
|
150
|
+
raise Chef::Exceptions::User, "Could not find binary /usr/bin/dscl for #{@new_resource}" unless ::File.exists?("/usr/bin/dscl")
|
151
|
+
end
|
160
152
|
|
161
153
|
def create_user
|
162
154
|
dscl_create_user
|
163
|
-
# set_password modifies the plist file of the user directly. So update
|
164
|
-
# the password first before making any modifications to the user.
|
165
|
-
set_password
|
166
155
|
dscl_create_comment
|
167
|
-
|
156
|
+
set_uid
|
168
157
|
dscl_set_gid
|
169
|
-
|
158
|
+
modify_home
|
170
159
|
dscl_set_shell
|
160
|
+
modify_password
|
171
161
|
end
|
172
|
-
|
162
|
+
|
173
163
|
def manage_user
|
174
|
-
# set_password modifies the plist file of the user directly. So update
|
175
|
-
# the password first before making any modifications to the user.
|
176
|
-
set_password if diverged_password?
|
177
164
|
dscl_create_user if diverged?(:username)
|
178
165
|
dscl_create_comment if diverged?(:comment)
|
179
|
-
|
166
|
+
set_uid if diverged?(:uid)
|
180
167
|
dscl_set_gid if diverged?(:gid)
|
181
|
-
|
168
|
+
modify_home if diverged?(:home)
|
182
169
|
dscl_set_shell if diverged?(:shell)
|
170
|
+
modify_password if diverged?(:password)
|
183
171
|
end
|
184
|
-
|
185
|
-
#
|
186
|
-
# Action Helpers
|
187
|
-
#
|
188
|
-
|
189
|
-
#
|
190
|
-
# Create a user using dscl
|
191
|
-
#
|
172
|
+
|
192
173
|
def dscl_create_user
|
193
|
-
|
174
|
+
safe_dscl("create /Users/#{@new_resource.username}")
|
194
175
|
end
|
195
|
-
|
196
|
-
#
|
197
|
-
# Saves the specified Chef user `comment` into RealName attribute
|
198
|
-
# of Mac user.
|
199
|
-
#
|
176
|
+
|
200
177
|
def dscl_create_comment
|
201
|
-
|
202
|
-
end
|
203
|
-
|
204
|
-
#
|
205
|
-
# Sets the user id for the user using dscl.
|
206
|
-
# If a `uid` is not specified, it finds the next available one starting
|
207
|
-
# from 200 if `system` is set, 500 otherwise.
|
208
|
-
#
|
209
|
-
def dscl_set_uid
|
210
|
-
@new_resource.uid(get_free_uid) if (@new_resource.uid.nil? || @new_resource.uid == '')
|
211
|
-
|
212
|
-
if uid_used?(@new_resource.uid)
|
213
|
-
raise(Chef::Exceptions::RequestedUIDUnavailable, "uid #{@new_resource.uid} is already in use")
|
214
|
-
end
|
215
|
-
|
216
|
-
run_dscl("create /Users/#{@new_resource.username} UniqueID #{@new_resource.uid}")
|
178
|
+
safe_dscl("create /Users/#{@new_resource.username} RealName '#{@new_resource.comment}'")
|
217
179
|
end
|
218
|
-
|
219
|
-
#
|
220
|
-
# Find the next available uid on the system. starting with 200 if `system` is set,
|
221
|
-
# 500 otherwise.
|
222
|
-
#
|
223
|
-
def get_free_uid(search_limit=1000)
|
224
|
-
uid = nil
|
225
|
-
base_uid = @new_resource.system ? 200 : 500
|
226
|
-
next_uid_guess = base_uid
|
227
|
-
users_uids = run_dscl("list /Users uid")
|
228
|
-
while(next_uid_guess < search_limit + base_uid)
|
229
|
-
if users_uids =~ Regexp.new("#{Regexp.escape(next_uid_guess.to_s)}\n")
|
230
|
-
next_uid_guess += 1
|
231
|
-
else
|
232
|
-
uid = next_uid_guess
|
233
|
-
break
|
234
|
-
end
|
235
|
-
end
|
236
|
-
return uid || raise("uid not found. Exhausted. Searched #{search_limit} times")
|
237
|
-
end
|
238
|
-
|
239
|
-
#
|
240
|
-
# Returns true if uid is in use by a different account, false otherwise.
|
241
|
-
#
|
242
|
-
def uid_used?(uid)
|
243
|
-
return false unless uid
|
244
|
-
users_uids = run_dscl("list /Users uid")
|
245
|
-
!! ( users_uids =~ Regexp.new("#{Regexp.escape(uid.to_s)}\n") )
|
246
|
-
end
|
247
|
-
|
248
|
-
#
|
249
|
-
# Sets the group id for the user using dscl. Fails if a group doesn't
|
250
|
-
# exist on the system with given group id.
|
251
|
-
#
|
180
|
+
|
252
181
|
def dscl_set_gid
|
253
182
|
unless @new_resource.gid && @new_resource.gid.to_s.match(/^\d+$/)
|
254
183
|
begin
|
255
|
-
possible_gid =
|
184
|
+
possible_gid = safe_dscl("read /Groups/#{@new_resource.gid} PrimaryGroupID").split(" ").last
|
256
185
|
rescue Chef::Exceptions::DsclCommandFailed => e
|
257
186
|
raise Chef::Exceptions::GroupIDNotFound.new("Group not found for #{@new_resource.gid} when creating user #{@new_resource.username}")
|
258
187
|
end
|
259
188
|
@new_resource.gid(possible_gid) if possible_gid && possible_gid.match(/^\d+$/)
|
260
189
|
end
|
261
|
-
|
190
|
+
safe_dscl("create /Users/#{@new_resource.username} PrimaryGroupID '#{@new_resource.gid}'")
|
262
191
|
end
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
if @new_resource.home.nil? || @new_resource.home.empty?
|
270
|
-
run_dscl("delete /Users/#{@new_resource.username} NFSHomeDirectory")
|
271
|
-
return
|
192
|
+
|
193
|
+
def dscl_set_shell
|
194
|
+
if @new_resource.password || ::File.exists?("#{@new_resource.shell}")
|
195
|
+
safe_dscl("create /Users/#{@new_resource.username} UserShell '#{@new_resource.shell}'")
|
196
|
+
else
|
197
|
+
safe_dscl("create /Users/#{@new_resource.username} UserShell '/usr/bin/false'")
|
272
198
|
end
|
273
|
-
|
199
|
+
end
|
200
|
+
|
201
|
+
def remove_user
|
274
202
|
if @new_resource.supports[:manage_home]
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
elsif current_home_exists?
|
282
|
-
move_home
|
203
|
+
user_info = safe_dscl("read /Users/#{@new_resource.username}")
|
204
|
+
if nfs_home_match = user_info.match(NFS_HOME_DIRECTORY)
|
205
|
+
#nfs_home = safe_dscl("read /Users/#{@new_resource.username} NFSHomeDirectory")
|
206
|
+
#nfs_home.gsub!(/NFSHomeDirectory: /,"").gsub!(/\n$/,"")
|
207
|
+
nfs_home = nfs_home_match[1]
|
208
|
+
FileUtils.rm_rf(nfs_home)
|
283
209
|
end
|
284
210
|
end
|
285
|
-
|
211
|
+
# remove the user from its groups
|
212
|
+
groups = []
|
213
|
+
Etc.group do |group|
|
214
|
+
groups << group.name if group.mem.include?(@new_resource.username)
|
215
|
+
end
|
216
|
+
groups.each do |group_name|
|
217
|
+
safe_dscl("delete /Groups/#{group_name} GroupMembership '#{@new_resource.username}'")
|
218
|
+
end
|
219
|
+
# remove user account
|
220
|
+
safe_dscl("delete /Users/#{@new_resource.username}")
|
221
|
+
end
|
222
|
+
|
223
|
+
def locked?
|
224
|
+
user_info = safe_dscl("read /Users/#{@new_resource.username}")
|
225
|
+
if auth_authority_md = AUTHENTICATION_AUTHORITY.match(user_info)
|
226
|
+
!!(auth_authority_md[1] =~ /DisabledUser/ )
|
227
|
+
else
|
228
|
+
false
|
229
|
+
end
|
230
|
+
end
|
231
|
+
|
232
|
+
def check_lock
|
233
|
+
return @locked = locked?
|
286
234
|
end
|
287
235
|
|
236
|
+
def lock_user
|
237
|
+
safe_dscl("append /Users/#{@new_resource.username} AuthenticationAuthority ';DisabledUser;'")
|
238
|
+
end
|
239
|
+
|
240
|
+
def unlock_user
|
241
|
+
auth_info = safe_dscl("read /Users/#{@new_resource.username} AuthenticationAuthority")
|
242
|
+
auth_string = auth_info.gsub(/AuthenticationAuthority: /,"").gsub(/;DisabledUser;/,"").strip#.gsub!(/[; ]*$/,"")
|
243
|
+
safe_dscl("create /Users/#{@new_resource.username} AuthenticationAuthority '#{auth_string}'")
|
244
|
+
end
|
245
|
+
|
288
246
|
def validate_home_dir_specification!
|
289
247
|
unless @new_resource.home =~ /^\//
|
290
|
-
raise(Chef::Exceptions::InvalidHomeDirectory,"invalid path spec for User: '#{@new_resource.username}', home directory: '#{@new_resource.home}'")
|
248
|
+
raise(Chef::Exceptions::InvalidHomeDirectory,"invalid path spec for User: '#{@new_resource.username}', home directory: '#{@new_resource.home}'")
|
291
249
|
end
|
292
250
|
end
|
293
|
-
|
251
|
+
|
294
252
|
def current_home_exists?
|
295
253
|
::File.exist?("#{@current_resource.home}")
|
296
254
|
end
|
297
|
-
|
255
|
+
|
298
256
|
def new_home_exists?
|
299
|
-
::File.exist?("#{@new_resource.home}")
|
257
|
+
::File.exist?("#{@new_resource.home}")
|
300
258
|
end
|
301
|
-
|
259
|
+
|
302
260
|
def ditto_home
|
303
261
|
skel = "/System/Library/User Template/English.lproj"
|
304
262
|
raise(Chef::Exceptions::User,"can't find skel at: #{skel}") unless ::File.exists?(skel)
|
@@ -308,7 +266,7 @@ user password using shadow hash.")
|
|
308
266
|
|
309
267
|
def move_home
|
310
268
|
Chef::Log.debug("#{@new_resource} moving #{self} home from #{@current_resource.home} to #{@new_resource.home}")
|
311
|
-
|
269
|
+
|
312
270
|
src = @current_resource.home
|
313
271
|
FileUtils.mkdir_p(@new_resource.home)
|
314
272
|
files = ::Dir.glob("#{src}/*", ::File::FNM_DOTMATCH) - ["#{src}/.","#{src}/.."]
|
@@ -316,365 +274,14 @@ user password using shadow hash.")
|
|
316
274
|
::FileUtils.rmdir(src)
|
317
275
|
::FileUtils.chown_R(@new_resource.username,@new_resource.gid.to_s,@new_resource.home)
|
318
276
|
end
|
319
|
-
|
320
|
-
#
|
321
|
-
# Sets the shell for the user using dscl.
|
322
|
-
#
|
323
|
-
def dscl_set_shell
|
324
|
-
if @new_resource.shell || ::File.exists?("#{@new_resource.shell}")
|
325
|
-
run_dscl("create /Users/#{@new_resource.username} UserShell '#{@new_resource.shell}'")
|
326
|
-
else
|
327
|
-
run_dscl("create /Users/#{@new_resource.username} UserShell '/usr/bin/false'")
|
328
|
-
end
|
329
|
-
end
|
330
|
-
|
331
|
-
#
|
332
|
-
# Sets the password for the user based on given password parameters.
|
333
|
-
# Chef supports specifying plain-text passwords and password shadow
|
334
|
-
# hash data.
|
335
|
-
#
|
336
|
-
def set_password
|
337
|
-
# Return if there is no password to set
|
338
|
-
return if @new_resource.password.nil?
|
339
|
-
|
340
|
-
shadow_info = prepare_password_shadow_info
|
341
|
-
|
342
|
-
# Shadow info is saved as binary plist. Convert the info to binary plist.
|
343
|
-
shadow_info_binary = StringIO.new
|
344
|
-
command = Mixlib::ShellOut.new("plutil -convert binary1 -o - -",
|
345
|
-
:input => shadow_info.to_plist, :live_stream => shadow_info_binary)
|
346
|
-
command.run_command
|
347
|
-
|
348
|
-
if @user_info.nil?
|
349
|
-
# User is just created. read_user_info() will read the fresh information
|
350
|
-
# for the user with a cache flush. However with experimentation we've seen
|
351
|
-
# that dscl cache is not immediately updated after the creation of the user
|
352
|
-
# This is odd and needs to be investigated further.
|
353
|
-
sleep 3
|
354
|
-
@user_info = read_user_info
|
355
|
-
end
|
356
|
-
|
357
|
-
# Replace the shadow info in user's plist
|
358
|
-
dscl_set(@user_info, :shadow_hash, shadow_info_binary)
|
359
|
-
save_user_info(@user_info)
|
360
|
-
end
|
361
|
-
|
362
|
-
#
|
363
|
-
# Prepares the password shadow info based on the platform version.
|
364
|
-
#
|
365
|
-
def prepare_password_shadow_info
|
366
|
-
shadow_info = { }
|
367
|
-
entropy = nil
|
368
|
-
salt = nil
|
369
|
-
iterations = nil
|
370
|
-
|
371
|
-
if mac_osx_version_10_7?
|
372
|
-
hash_value = if salted_sha512?(@new_resource.password)
|
373
|
-
@new_resource.password
|
374
|
-
else
|
375
|
-
# Create a random 4 byte salt
|
376
|
-
salt = OpenSSL::Random.random_bytes(4)
|
377
|
-
encoded_password = OpenSSL::Digest::SHA512.hexdigest(salt + @new_resource.password)
|
378
|
-
hash_value = salt.unpack('H*').first + encoded_password
|
379
|
-
end
|
380
|
-
|
381
|
-
shadow_info["SALTED-SHA512"] = StringIO.new
|
382
|
-
shadow_info["SALTED-SHA512"].string = convert_to_binary(hash_value)
|
383
|
-
shadow_info
|
384
|
-
else
|
385
|
-
if salted_sha512_pbkdf2?(@new_resource.password)
|
386
|
-
entropy = convert_to_binary(@new_resource.password)
|
387
|
-
salt = convert_to_binary(@new_resource.salt)
|
388
|
-
iterations = @new_resource.iterations
|
389
|
-
else
|
390
|
-
salt = OpenSSL::Random.random_bytes(32)
|
391
|
-
iterations = @new_resource.iterations # Use the default if not specified by the user
|
392
|
-
|
393
|
-
entropy = OpenSSL::PKCS5::pbkdf2_hmac(
|
394
|
-
@new_resource.password,
|
395
|
-
salt,
|
396
|
-
iterations,
|
397
|
-
128,
|
398
|
-
OpenSSL::Digest::SHA512.new
|
399
|
-
)
|
400
|
-
end
|
401
|
-
|
402
|
-
pbkdf_info = { }
|
403
|
-
pbkdf_info["entropy"] = StringIO.new
|
404
|
-
pbkdf_info["entropy"].string = entropy
|
405
|
-
pbkdf_info["salt"] = StringIO.new
|
406
|
-
pbkdf_info["salt"].string = salt
|
407
|
-
pbkdf_info["iterations"] = iterations
|
408
|
-
|
409
|
-
shadow_info["SALTED-SHA512-PBKDF2"] = pbkdf_info
|
410
|
-
end
|
411
|
-
|
412
|
-
shadow_info
|
413
|
-
end
|
414
|
-
|
415
|
-
#
|
416
|
-
# Removes the user from the system after removing user from his groups
|
417
|
-
# and deleting home directory if needed.
|
418
|
-
#
|
419
|
-
def remove_user
|
420
|
-
if @new_resource.supports[:manage_home]
|
421
|
-
# Remove home directory
|
422
|
-
FileUtils.rm_rf(@current_resource.home)
|
423
|
-
end
|
424
|
-
|
425
|
-
# Remove the user from its groups
|
426
|
-
run_dscl("list /Groups").each_line do |group|
|
427
|
-
if member_of_group?(group.chomp)
|
428
|
-
run_dscl("delete /Groups/#{group.chomp} GroupMembership '#{@new_resource.username}'")
|
429
|
-
end
|
430
|
-
end
|
431
|
-
|
432
|
-
# Remove user account
|
433
|
-
run_dscl("delete /Users/#{@new_resource.username}")
|
434
|
-
end
|
435
|
-
|
436
|
-
#
|
437
|
-
# Locks the user.
|
438
|
-
#
|
439
|
-
def lock_user
|
440
|
-
run_dscl("append /Users/#{@new_resource.username} AuthenticationAuthority ';DisabledUser;'")
|
441
|
-
end
|
442
|
-
|
443
|
-
#
|
444
|
-
# Unlocks the user
|
445
|
-
#
|
446
|
-
def unlock_user
|
447
|
-
auth_string = @authentication_authority.gsub(/AuthenticationAuthority: /,"").gsub(/;DisabledUser;/,"").strip
|
448
|
-
run_dscl("create /Users/#{@new_resource.username} AuthenticationAuthority '#{auth_string}'")
|
449
|
-
end
|
450
|
-
|
451
|
-
#
|
452
|
-
# Returns true if the user is locked, false otherwise.
|
453
|
-
#
|
454
|
-
def locked?
|
455
|
-
if @authentication_authority
|
456
|
-
!!(@authentication_authority =~ /DisabledUser/ )
|
457
|
-
else
|
458
|
-
false
|
459
|
-
end
|
460
|
-
end
|
461
|
-
|
462
|
-
#
|
463
|
-
# This is the interface base User provider requires to provide idempotency.
|
464
|
-
#
|
465
|
-
def check_lock
|
466
|
-
return @locked = locked?
|
467
|
-
end
|
468
|
-
|
469
|
-
#
|
470
|
-
# Helper functions
|
471
|
-
#
|
472
|
-
|
473
|
-
#
|
474
|
-
# Returns true if the system state and desired state is different for
|
475
|
-
# given attribute.
|
476
|
-
#
|
277
|
+
|
477
278
|
def diverged?(parameter)
|
478
279
|
parameter_updated?(parameter) && (not @new_resource.send(parameter).nil?)
|
479
280
|
end
|
480
|
-
|
281
|
+
|
481
282
|
def parameter_updated?(parameter)
|
482
283
|
not (@new_resource.send(parameter) == @current_resource.send(parameter))
|
483
284
|
end
|
484
|
-
|
485
|
-
#
|
486
|
-
# We need a special check function for password since we support both
|
487
|
-
# plain text and shadow hash data.
|
488
|
-
#
|
489
|
-
# Checks if password needs update based on platform version and the
|
490
|
-
# type of the password specified.
|
491
|
-
#
|
492
|
-
def diverged_password?
|
493
|
-
return false if @new_resource.password.nil?
|
494
|
-
|
495
|
-
# Dscl provider supports both plain text passwords and shadow hashes.
|
496
|
-
if mac_osx_version_10_7?
|
497
|
-
if salted_sha512?(@new_resource.password)
|
498
|
-
diverged?(:password)
|
499
|
-
else
|
500
|
-
!salted_sha512_password_match?
|
501
|
-
end
|
502
|
-
else
|
503
|
-
# When a system is upgraded to a version 10.7+ shadow hashes of the users
|
504
|
-
# will be updated when the user logs in. So it's possible that we will have
|
505
|
-
# SALTED-SHA512 password in the current_resource. In that case we will force
|
506
|
-
# password to be updated.
|
507
|
-
return true if salted_sha512?(@current_resource.password)
|
508
|
-
|
509
|
-
if salted_sha512_pbkdf2?(@new_resource.password)
|
510
|
-
diverged?(:password) || diverged?(:salt) || diverged?(:iterations)
|
511
|
-
else
|
512
|
-
!salted_sha512_pbkdf2_password_match?
|
513
|
-
end
|
514
|
-
end
|
515
|
-
end
|
516
|
-
|
517
|
-
#
|
518
|
-
# Returns true if user is member of the specified group, false otherwise.
|
519
|
-
#
|
520
|
-
def member_of_group?(group_name)
|
521
|
-
membership_info = ""
|
522
|
-
begin
|
523
|
-
membership_info = run_dscl("read /Groups/#{group_name}")
|
524
|
-
rescue Chef::Exceptions::DsclCommandFailed
|
525
|
-
# Raised if the group doesn't contain any members
|
526
|
-
end
|
527
|
-
# Output is something like:
|
528
|
-
# GroupMembership: root admin etc
|
529
|
-
members = membership_info.split(" ")
|
530
|
-
members.shift # Get rid of GroupMembership: string
|
531
|
-
members.include?(@new_resource.username)
|
532
|
-
end
|
533
|
-
|
534
|
-
#
|
535
|
-
# DSCL Helper functions
|
536
|
-
#
|
537
|
-
|
538
|
-
# A simple map of Chef's terms to DSCL's terms.
|
539
|
-
DSCL_PROPERTY_MAP = {
|
540
|
-
:uid => "generateduid",
|
541
|
-
:gid => "gid",
|
542
|
-
:home => "home",
|
543
|
-
:shell => "shell",
|
544
|
-
:comment => "realname",
|
545
|
-
:password => "passwd",
|
546
|
-
:auth_authority => "authentication_authority",
|
547
|
-
:shadow_hash => "ShadowHashData"
|
548
|
-
}.freeze
|
549
|
-
|
550
|
-
# Directory where the user plist files are stored for versions 10.7 and above
|
551
|
-
USER_PLIST_DIRECTORY = "/var/db/dslocal/nodes/Default/users".freeze
|
552
|
-
|
553
|
-
#
|
554
|
-
# Reads the user plist and returns a hash keyed with DSCL properties specified
|
555
|
-
# in DSCL_PROPERTY_MAP. Return nil if the user is not found.
|
556
|
-
#
|
557
|
-
def read_user_info
|
558
|
-
user_info = nil
|
559
|
-
|
560
|
-
# We flush the cache here in order to make sure that we read fresh information
|
561
|
-
# for the user.
|
562
|
-
shell_out("dscacheutil '-flushcache'")
|
563
|
-
|
564
|
-
begin
|
565
|
-
user_plist_file = "#{USER_PLIST_DIRECTORY}/#{@new_resource.username}.plist"
|
566
|
-
user_plist_info = run_plutil("convert xml1 -o - #{user_plist_file}")
|
567
|
-
user_info = Plist::parse_xml(user_plist_info)
|
568
|
-
rescue Chef::Exceptions::PlistUtilCommandFailed
|
569
|
-
end
|
570
|
-
|
571
|
-
user_info
|
572
|
-
end
|
573
|
-
|
574
|
-
#
|
575
|
-
# Saves the given hash keyed with DSCL properties specified
|
576
|
-
# in DSCL_PROPERTY_MAP to the disk.
|
577
|
-
#
|
578
|
-
def save_user_info(user_info)
|
579
|
-
user_plist_file = "#{USER_PLIST_DIRECTORY}/#{@new_resource.username}.plist"
|
580
|
-
Plist::Emit.save_plist(user_info, user_plist_file)
|
581
|
-
run_plutil("convert binary1 #{user_plist_file}")
|
582
|
-
end
|
583
|
-
|
584
|
-
#
|
585
|
-
# Sets a value in user information hash using Chef attributes as keys.
|
586
|
-
#
|
587
|
-
def dscl_set(user_hash, key, value)
|
588
|
-
raise "Unknown dscl key #{key}" unless DSCL_PROPERTY_MAP.keys.include?(key)
|
589
|
-
user_hash[DSCL_PROPERTY_MAP[key]] = [ value ]
|
590
|
-
user_hash
|
591
|
-
end
|
592
|
-
|
593
|
-
#
|
594
|
-
# Gets a value from user information hash using Chef attributes as keys.
|
595
|
-
#
|
596
|
-
def dscl_get(user_hash, key)
|
597
|
-
raise "Unknown dscl key #{key}" unless DSCL_PROPERTY_MAP.keys.include?(key)
|
598
|
-
# DSCL values are set as arrays
|
599
|
-
value = user_hash[DSCL_PROPERTY_MAP[key]]
|
600
|
-
value.nil? ? value : value.first
|
601
|
-
end
|
602
|
-
|
603
|
-
#
|
604
|
-
# System Helpets
|
605
|
-
#
|
606
|
-
|
607
|
-
def mac_osx_version
|
608
|
-
# This provider will only be invoked on node[:platform] == "mac_os_x"
|
609
|
-
# We do not check or assert that here.
|
610
|
-
node[:platform_version]
|
611
|
-
end
|
612
|
-
|
613
|
-
def mac_osx_version_10_7?
|
614
|
-
mac_osx_version.start_with?("10.7.")
|
615
|
-
end
|
616
|
-
|
617
|
-
def mac_osx_version_less_than_10_7?
|
618
|
-
versions = mac_osx_version.split(".")
|
619
|
-
# Make integer comparison in order not to report 10.10 less than 10.7
|
620
|
-
(versions[0].to_i <= 10 && versions[1].to_i < 7)
|
621
|
-
end
|
622
|
-
|
623
|
-
def mac_osx_version_greater_than_10_7?
|
624
|
-
versions = mac_osx_version.split(".")
|
625
|
-
# Make integer comparison in order not to report 10.10 less than 10.7
|
626
|
-
(versions[0].to_i >= 10 && versions[1].to_i > 7)
|
627
|
-
end
|
628
|
-
|
629
|
-
def run_dscl(*args)
|
630
|
-
result = shell_out("dscl . -#{args.join(' ')}")
|
631
|
-
return "" if ( args.first =~ /^delete/ ) && ( result.exitstatus != 0 )
|
632
|
-
raise(Chef::Exceptions::DsclCommandFailed,"dscl error: #{result.inspect}") unless result.exitstatus == 0
|
633
|
-
raise(Chef::Exceptions::DsclCommandFailed,"dscl error: #{result.inspect}") if result.stdout =~ /No such key: /
|
634
|
-
result.stdout
|
635
|
-
end
|
636
|
-
|
637
|
-
def run_plutil(*args)
|
638
|
-
result = shell_out("plutil -#{args.join(' ')}")
|
639
|
-
raise(Chef::Exceptions::PlistUtilCommandFailed,"plutil error: #{result.inspect}") unless result.exitstatus == 0
|
640
|
-
result.stdout
|
641
|
-
end
|
642
|
-
|
643
|
-
def convert_binary_plist_to_xml(binary_plist_string)
|
644
|
-
Mixlib::ShellOut.new("plutil -convert xml1 -o - -", :input => binary_plist_string).run_command.stdout
|
645
|
-
end
|
646
|
-
|
647
|
-
def convert_to_binary(string)
|
648
|
-
string.unpack('a2'*(string.size/2)).collect { |i| i.hex.chr }.join
|
649
|
-
end
|
650
|
-
|
651
|
-
def salted_sha512?(string)
|
652
|
-
!!(string =~ /^[[:xdigit:]]{136}$/)
|
653
|
-
end
|
654
|
-
|
655
|
-
def salted_sha512_password_match?
|
656
|
-
# Salt is included in the first 4 bytes of shadow data
|
657
|
-
salt = @current_resource.password.slice(0,8)
|
658
|
-
shadow = OpenSSL::Digest::SHA512.hexdigest(convert_to_binary(salt) + @new_resource.password)
|
659
|
-
@current_resource.password == salt + shadow
|
660
|
-
end
|
661
|
-
|
662
|
-
def salted_sha512_pbkdf2?(string)
|
663
|
-
!!(string =~ /^[[:xdigit:]]{256}$/)
|
664
|
-
end
|
665
|
-
|
666
|
-
def salted_sha512_pbkdf2_password_match?
|
667
|
-
salt = convert_to_binary(@current_resource.salt)
|
668
|
-
|
669
|
-
OpenSSL::PKCS5::pbkdf2_hmac(
|
670
|
-
@new_resource.password,
|
671
|
-
salt,
|
672
|
-
@current_resource.iterations,
|
673
|
-
128,
|
674
|
-
OpenSSL::Digest::SHA512.new
|
675
|
-
).unpack('H*').first == @current_resource.password
|
676
|
-
end
|
677
|
-
|
678
285
|
end
|
679
286
|
end
|
680
287
|
end
|