chef 16.2.44 → 16.4.35
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 +4 -4
- data/Gemfile +4 -4
- data/Rakefile +3 -16
- data/chef-universal-mingw32.gemspec +2 -3
- data/chef.gemspec +4 -3
- data/lib/chef/action_collection.rb +4 -0
- data/lib/chef/api_client/registration.rb +8 -8
- data/lib/chef/application.rb +18 -1
- data/lib/chef/application/apply.rb +6 -5
- data/lib/chef/application/base.rb +2 -0
- data/lib/chef/application/client.rb +3 -0
- data/lib/chef/application/windows_service.rb +27 -27
- data/lib/chef/{whitelist.rb → attribute_allowlist.rb} +11 -11
- data/lib/chef/{blacklist.rb → attribute_blocklist.rb} +9 -9
- data/lib/chef/chef_class.rb +0 -1
- data/lib/chef/chef_fs/chef_fs_data_store.rb +54 -54
- data/lib/chef/chef_fs/data_handler/organization_data_handler.rb +1 -2
- data/lib/chef/chef_fs/file_system/chef_server/acl_entry.rb +10 -10
- data/lib/chef/chef_fs/file_system/chef_server/cookbook_file.rb +2 -2
- data/lib/chef/chef_fs/file_system/chef_server/cookbooks_dir.rb +1 -5
- data/lib/chef/chef_fs/file_system/chef_server/organization_invites_entry.rb +8 -8
- data/lib/chef/chef_fs/file_system/chef_server/organization_members_entry.rb +8 -8
- data/lib/chef/chef_fs/file_system/repository/base_file.rb +1 -0
- data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_cookbook_dir.rb +2 -2
- data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_cookbook_entry.rb +1 -1
- data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_root_dir.rb +18 -18
- data/lib/chef/chef_fs/file_system/repository/directory.rb +1 -1
- data/lib/chef/chef_fs/file_system/repository/file_system_entry.rb +1 -1
- data/lib/chef/chef_fs/parallelizer/parallel_enumerable.rb +1 -1
- data/lib/chef/client.rb +14 -14
- data/lib/chef/cookbook/remote_file_vendor.rb +1 -3
- data/lib/chef/cookbook/syntax_check.rb +1 -2
- data/lib/chef/cookbook_loader.rb +15 -29
- data/lib/chef/data_bag.rb +1 -2
- data/lib/chef/data_collector/run_end_message.rb +11 -1
- data/lib/chef/deprecated.rb +8 -0
- data/lib/chef/digester.rb +3 -2
- data/lib/chef/dsl/platform_introspection.rb +9 -7
- data/lib/chef/encrypted_data_bag_item/decryptor.rb +1 -1
- data/lib/chef/environment.rb +3 -4
- data/lib/chef/exceptions.rb +4 -1
- data/lib/chef/file_access_control/windows.rb +2 -2
- data/lib/chef/file_content_management/deploy/mv_unix.rb +1 -1
- data/lib/chef/file_content_management/tempfile.rb +9 -9
- data/lib/chef/handler.rb +2 -0
- data/lib/chef/http.rb +12 -12
- data/lib/chef/http/authenticator.rb +3 -1
- data/lib/chef/json_compat.rb +1 -1
- data/lib/chef/knife.rb +4 -4
- data/lib/chef/knife/bootstrap.rb +18 -15
- data/lib/chef/knife/bootstrap/train_connector.rb +1 -0
- data/lib/chef/knife/config_get.rb +1 -0
- data/lib/chef/knife/config_list_profiles.rb +4 -1
- data/lib/chef/knife/config_use_profile.rb +15 -5
- data/lib/chef/knife/configure.rb +1 -1
- data/lib/chef/knife/cookbook_download.rb +1 -1
- data/lib/chef/knife/cookbook_metadata.rb +1 -1
- data/lib/chef/knife/cookbook_upload.rb +29 -37
- data/lib/chef/knife/core/bootstrap_context.rb +1 -1
- data/lib/chef/knife/core/gem_glob_loader.rb +1 -1
- data/lib/chef/knife/core/generic_presenter.rb +1 -1
- data/lib/chef/knife/core/hashed_command_loader.rb +3 -2
- data/lib/chef/knife/core/subcommand_loader.rb +20 -1
- data/lib/chef/knife/core/ui.rb +8 -2
- data/lib/chef/knife/core/windows_bootstrap_context.rb +33 -26
- data/lib/chef/knife/delete.rb +15 -15
- data/lib/chef/knife/exec.rb +2 -2
- data/lib/chef/knife/rehash.rb +3 -21
- data/lib/chef/knife/ssh.rb +11 -7
- data/lib/chef/knife/xargs.rb +19 -19
- data/lib/chef/knife/yaml_convert.rb +1 -1
- data/lib/chef/log.rb +7 -2
- data/lib/chef/mixin/checksum.rb +0 -1
- data/{spec/functional/resource/base.rb → lib/chef/mixin/chef_utils_wiring.rb} +24 -12
- data/lib/chef/mixin/deep_merge.rb +35 -6
- data/{spec/unit/log_spec.rb → lib/chef/mixin/default_paths.rb} +13 -5
- data/lib/chef/mixin/openssl_helper.rb +30 -6
- data/lib/chef/mixin/path_sanity.rb +5 -4
- data/lib/chef/mixin/shell_out.rb +4 -188
- data/lib/chef/mixin/template.rb +1 -0
- data/lib/chef/mixin/which.rb +6 -3
- data/lib/chef/mixins.rb +1 -0
- data/lib/chef/monkey_patches/webrick-utils.rb +10 -10
- data/lib/chef/node.rb +36 -12
- data/lib/chef/node/attribute.rb +2 -4
- data/lib/chef/node_map.rb +21 -18
- data/lib/chef/platform/service_helpers.rb +31 -28
- data/lib/chef/property.rb +1 -1
- data/lib/chef/provider/cron/unix.rb +0 -2
- data/lib/chef/provider/git.rb +17 -9
- data/lib/chef/provider/group.rb +0 -2
- data/lib/chef/provider/group/suse.rb +5 -5
- data/lib/chef/provider/ifconfig.rb +1 -4
- data/lib/chef/provider/mount.rb +0 -2
- data/lib/chef/provider/mount/solaris.rb +0 -1
- data/lib/chef/provider/package.rb +0 -2
- data/lib/chef/provider/package/rubygems.rb +1 -1
- data/lib/chef/provider/package/snap.rb +3 -4
- data/lib/chef/provider/package/windows.rb +9 -4
- data/lib/chef/provider/package/windows/registry_uninstall_entry.rb +9 -9
- data/lib/chef/provider/package/zypper.rb +0 -1
- data/lib/chef/provider/powershell_script.rb +21 -5
- data/lib/chef/provider/route.rb +1 -1
- data/lib/chef/provider/service.rb +2 -2
- data/lib/chef/provider/service/arch.rb +1 -1
- data/lib/chef/provider/service/debian.rb +1 -1
- data/lib/chef/provider/service/gentoo.rb +2 -2
- data/lib/chef/provider/service/macosx.rb +2 -2
- data/lib/chef/provider/service/openbsd.rb +1 -4
- data/lib/chef/provider/service/redhat.rb +2 -2
- data/lib/chef/provider/service/upstart.rb +1 -1
- data/lib/chef/provider/service/windows.rb +10 -10
- data/lib/chef/provider/systemd_unit.rb +0 -2
- data/lib/chef/provider/template/content.rb +1 -0
- data/lib/chef/provider/user/dscl.rb +2 -2
- data/lib/chef/provider/user/mac.rb +9 -9
- data/lib/chef/provider/windows_task.rb +0 -3
- data/lib/chef/provider/yum_repository.rb +1 -1
- data/lib/chef/provider/zypper_repository.rb +1 -2
- data/lib/chef/providers.rb +0 -1
- data/lib/chef/recipe.rb +1 -1
- data/lib/chef/resource.rb +9 -11
- data/lib/chef/resource/alternatives.rb +1 -1
- data/lib/chef/resource/apt_repository.rb +1 -10
- data/lib/chef/resource/build_essential.rb +2 -2
- data/lib/chef/resource/chef_client_scheduled_task.rb +1 -1
- data/lib/chef/resource/chef_client_systemd_timer.rb +2 -2
- data/lib/chef/resource/chef_gem.rb +57 -21
- data/lib/chef/resource/chef_vault_secret.rb +13 -13
- data/lib/chef/resource/chocolatey_feature.rb +1 -2
- data/lib/chef/resource/cron/cron_d.rb +1 -1
- data/lib/chef/resource/cron_access.rb +2 -2
- data/lib/chef/resource/dmg_package.rb +2 -2
- data/lib/chef/resource/execute.rb +4 -5
- data/lib/chef/resource/gem_package.rb +35 -2
- data/lib/chef/resource/homebrew_update.rb +2 -2
- data/lib/chef/resource/hostname.rb +18 -18
- data/lib/chef/resource/launchd.rb +1 -1
- data/lib/chef/resource/lwrp_base.rb +1 -0
- data/lib/chef/resource/macos_userdefaults.rb +176 -61
- data/lib/chef/resource/openssl_dhparam.rb +2 -0
- data/lib/chef/resource/openssl_ec_private_key.rb +2 -0
- data/lib/chef/resource/openssl_ec_public_key.rb +2 -0
- data/lib/chef/resource/openssl_rsa_private_key.rb +2 -0
- data/lib/chef/resource/openssl_rsa_public_key.rb +2 -0
- data/lib/chef/resource/openssl_x509_certificate.rb +35 -35
- data/lib/chef/resource/openssl_x509_crl.rb +3 -2
- data/lib/chef/resource/openssl_x509_request.rb +23 -20
- data/lib/chef/resource/osx_profile.rb +227 -5
- data/lib/chef/resource/powershell_package_source.rb +1 -1
- data/lib/chef/resource/powershell_script.rb +24 -30
- data/lib/chef/resource/service.rb +2 -2
- data/lib/chef/resource/ssh_known_hosts_entry.rb +16 -1
- data/lib/chef/resource/sudo.rb +31 -4
- data/lib/chef/resource/swap_file.rb +17 -0
- data/lib/chef/resource/sysctl.rb +5 -5
- data/lib/chef/resource/timezone.rb +15 -0
- data/lib/chef/resource/user_ulimit.rb +1 -1
- data/lib/chef/resource/windows_ad_join.rb +2 -0
- data/lib/chef/resource/windows_audit_policy.rb +3 -0
- data/lib/chef/resource/windows_auto_run.rb +2 -0
- data/lib/chef/resource/windows_certificate.rb +2 -0
- data/lib/chef/resource/windows_dfs_folder.rb +2 -0
- data/lib/chef/resource/windows_dfs_namespace.rb +2 -0
- data/lib/chef/resource/windows_dfs_server.rb +2 -0
- data/lib/chef/resource/windows_dns_record.rb +25 -5
- data/lib/chef/resource/windows_dns_zone.rb +12 -7
- data/lib/chef/resource/windows_feature.rb +2 -0
- data/lib/chef/resource/windows_feature_dism.rb +10 -0
- data/lib/chef/resource/windows_feature_powershell.rb +14 -2
- data/lib/chef/resource/windows_firewall_profile.rb +199 -0
- data/lib/chef/resource/windows_firewall_rule.rb +5 -3
- data/lib/chef/resource/windows_font.rb +3 -1
- data/lib/chef/resource/windows_pagefile.rb +4 -0
- data/lib/chef/resource/windows_printer.rb +17 -18
- data/lib/chef/resource/windows_printer_port.rb +14 -13
- data/lib/chef/resource/windows_security_policy.rb +52 -21
- data/lib/chef/resource/windows_share.rb +5 -3
- data/lib/chef/resource/windows_shortcut.rb +2 -0
- data/lib/chef/resource/windows_uac.rb +2 -0
- data/lib/chef/resource/windows_user_privilege.rb +27 -2
- data/lib/chef/resource/windows_workgroup.rb +2 -3
- data/lib/chef/resource_collection/stepable_iterator.rb +1 -2
- data/lib/chef/resource_inspector.rb +7 -1
- data/lib/chef/resources.rb +1 -0
- data/lib/chef/role.rb +3 -4
- data/lib/chef/run_context/cookbook_compiler.rb +20 -20
- data/lib/chef/run_status.rb +2 -6
- data/lib/chef/server_api_versions.rb +4 -0
- data/lib/chef/shell.rb +1 -1
- data/lib/chef/shell/shell_session.rb +2 -0
- data/lib/chef/util/backup.rb +1 -1
- data/lib/chef/util/diff.rb +11 -12
- data/lib/chef/util/powershell/cmdlet.rb +1 -1
- data/lib/chef/version.rb +2 -2
- data/lib/chef/win32/file.rb +2 -2
- data/lib/chef/win32/file/version_info.rb +5 -5
- data/lib/chef/win32/registry.rb +1 -2
- data/spec/data/ssl/chef-rspec.cert +15 -15
- data/spec/functional/knife/configure_spec.rb +1 -1
- data/spec/functional/knife/ssh_spec.rb +5 -16
- data/spec/functional/resource/aix_service_spec.rb +9 -2
- data/spec/functional/resource/aixinit_service_spec.rb +8 -9
- data/spec/functional/resource/apt_package_spec.rb +0 -1
- data/spec/functional/resource/bash_spec.rb +3 -2
- data/spec/functional/resource/bff_spec.rb +3 -3
- data/spec/functional/resource/chocolatey_package_spec.rb +4 -0
- data/spec/functional/resource/cookbook_file_spec.rb +1 -1
- data/spec/functional/resource/cron_spec.rb +10 -2
- data/spec/functional/resource/dnf_package_spec.rb +4 -1
- data/spec/functional/resource/dsc_resource_spec.rb +1 -1
- data/spec/functional/resource/dsc_script_spec.rb +0 -1
- data/spec/functional/resource/execute_spec.rb +1 -1
- data/spec/functional/resource/git_spec.rb +23 -1
- data/spec/functional/resource/group_spec.rb +21 -9
- data/spec/functional/resource/ifconfig_spec.rb +9 -1
- data/spec/functional/resource/insserv_spec.rb +7 -7
- data/spec/functional/resource/link_spec.rb +22 -25
- data/spec/functional/resource/mount_spec.rb +9 -1
- data/spec/functional/resource/msu_package_spec.rb +9 -3
- data/spec/functional/resource/powershell_script_spec.rb +8 -8
- data/spec/functional/resource/remote_file_spec.rb +7 -13
- data/spec/functional/resource/rpm_spec.rb +3 -3
- data/spec/functional/resource/timezone_spec.rb +2 -0
- data/spec/functional/resource/windows_certificate_spec.rb +3 -3
- data/spec/functional/resource/windows_font_spec.rb +49 -0
- data/spec/functional/resource/windows_package_spec.rb +0 -1
- data/spec/functional/resource/windows_path_spec.rb +4 -0
- data/spec/functional/resource/windows_security_policy_spec.rb +0 -4
- data/spec/functional/resource/windows_service_spec.rb +4 -0
- data/spec/functional/resource/windows_task_spec.rb +4 -3
- data/spec/functional/resource/windows_user_privilege_spec.rb +1 -2
- data/spec/functional/resource/yum_package_spec.rb +4 -1
- data/spec/functional/resource/zypper_package_spec.rb +4 -1
- data/spec/functional/run_lock_spec.rb +26 -25
- data/spec/functional/shell_spec.rb +5 -6
- data/spec/functional/util/powershell/cmdlet_spec.rb +1 -1
- data/spec/functional/version_spec.rb +1 -1
- data/spec/functional/win32/crypto_spec.rb +1 -1
- data/spec/functional/win32/registry_spec.rb +8 -8
- data/spec/functional/win32/service_manager_spec.rb +1 -1
- data/spec/integration/knife/common_options_spec.rb +12 -12
- data/spec/integration/knife/config_get_profile_spec.rb +69 -68
- data/spec/integration/knife/config_get_spec.rb +126 -125
- data/spec/integration/knife/config_list_profiles_spec.rb +181 -152
- data/spec/integration/knife/config_use_profile_spec.rb +115 -61
- data/spec/integration/knife/cookbook_upload_spec.rb +28 -1
- data/spec/integration/knife/data_bag_from_file_spec.rb +1 -1
- data/spec/integration/knife/diff_spec.rb +3 -1
- data/spec/integration/knife/download_spec.rb +3 -1
- data/spec/integration/knife/environment_from_file_spec.rb +1 -1
- data/spec/integration/knife/node_from_file_spec.rb +1 -1
- data/spec/integration/knife/role_from_file_spec.rb +1 -1
- data/spec/integration/knife/serve_spec.rb +5 -5
- data/spec/integration/knife/upload_spec.rb +3 -1
- data/spec/integration/recipes/accumulator_spec.rb +1 -1
- data/spec/integration/recipes/lwrp_inline_resources_spec.rb +2 -2
- data/spec/integration/recipes/lwrp_spec.rb +1 -1
- data/spec/integration/recipes/notifies_spec.rb +1 -1
- data/spec/integration/recipes/notifying_block_spec.rb +1 -1
- data/spec/integration/recipes/recipe_dsl_spec.rb +5 -1
- data/spec/integration/recipes/resource_converge_if_changed_spec.rb +2 -0
- data/spec/integration/recipes/resource_load_spec.rb +4 -2
- data/spec/integration/recipes/unified_mode_spec.rb +1 -1
- data/spec/integration/recipes/use_partial_spec.rb +1 -1
- data/spec/scripts/ssl-serve.rb +1 -1
- data/spec/spec_helper.rb +16 -10
- data/spec/support/chef_helpers.rb +1 -20
- data/spec/support/platform_helpers.rb +9 -11
- data/spec/support/platforms/win32/spec_service.rb +1 -1
- data/spec/support/shared/functional/directory_resource.rb +1 -1
- data/spec/support/shared/functional/execute_resource.rb +1 -1
- data/spec/support/shared/functional/file_resource.rb +20 -21
- data/spec/support/shared/functional/securable_resource.rb +1 -2
- data/spec/support/shared/functional/securable_resource_with_reporting.rb +0 -1
- data/spec/support/shared/functional/win32_service.rb +1 -1
- data/spec/support/shared/functional/windows_script.rb +5 -5
- data/spec/support/shared/integration/integration_helper.rb +22 -52
- data/spec/support/shared/integration/knife_support.rb +2 -9
- data/spec/support/shared/unit/application_dot_d.rb +0 -1
- data/spec/support/shared/unit/provider/file.rb +12 -8
- data/spec/support/shared/unit/script_resource.rb +6 -20
- data/spec/support/shared/unit/windows_script_resource.rb +15 -28
- data/spec/unit/application/solo_spec.rb +4 -2
- data/spec/unit/application_spec.rb +4 -2
- data/spec/unit/chef_fs/config_spec.rb +2 -2
- data/spec/unit/chef_fs/diff_spec.rb +8 -8
- data/spec/unit/chef_fs/file_system/operation_failed_error_spec.rb +2 -4
- data/spec/unit/chef_fs/{parallelizer.rb → parallelizer_spec.rb} +1 -1
- data/spec/unit/client_spec.rb +4 -1
- data/spec/unit/cookbook/gem_installer_spec.rb +2 -1
- data/spec/unit/cookbook/synchronizer_spec.rb +26 -24
- data/spec/unit/data_bag_spec.rb +6 -3
- data/spec/unit/data_collector_spec.rb +23 -1
- data/spec/unit/decorator_spec.rb +23 -23
- data/spec/unit/dsl/platform_introspection_spec.rb +1 -0
- data/spec/unit/environment_spec.rb +12 -8
- data/spec/unit/event_dispatch/dispatcher_spec.rb +3 -0
- data/spec/unit/guard_interpreter_spec.rb +1 -1
- data/spec/unit/http/api_versions_spec.rb +20 -2
- data/spec/unit/json_compat_spec.rb +1 -1
- data/spec/unit/knife/bootstrap_spec.rb +17 -20
- data/spec/unit/knife/cookbook_download_spec.rb +6 -6
- data/spec/unit/knife/cookbook_metadata_from_file_spec.rb +1 -1
- data/spec/unit/knife/cookbook_show_spec.rb +6 -7
- data/spec/unit/knife/cookbook_upload_spec.rb +7 -10
- data/spec/unit/knife/core/hashed_command_loader_spec.rb +3 -3
- data/spec/unit/knife/core/windows_bootstrap_context_spec.rb +21 -12
- data/spec/unit/knife/data_bag_edit_spec.rb +1 -1
- data/spec/unit/knife/supermarket_share_spec.rb +1 -1
- data/spec/unit/log/syslog_spec.rb +6 -10
- data/spec/unit/log/winevt_spec.rb +21 -13
- data/spec/unit/lwrp_spec.rb +9 -6
- data/spec/unit/mixin/{path_sanity_spec.rb → default_paths_spec.rb} +14 -14
- data/spec/unit/mixin/powershell_exec_spec.rb +1 -1
- data/spec/unit/mixin/powershell_out_spec.rb +2 -4
- data/spec/unit/mixin/powershell_type_coercions_spec.rb +1 -1
- data/spec/unit/mixin/securable_spec.rb +0 -1
- data/spec/unit/mixin/shell_out_spec.rb +25 -26
- data/spec/unit/mixin/subclass_directive_spec.rb +2 -2
- data/spec/unit/mixin/template_spec.rb +30 -30
- data/spec/unit/mixin/unformatter_spec.rb +2 -2
- data/spec/unit/mixin/uris_spec.rb +1 -1
- data/spec/unit/mixin/which.rb +8 -0
- data/spec/unit/mixin/windows_architecture_helper_spec.rb +4 -4
- data/spec/unit/node/immutable_collections_spec.rb +6 -2
- data/spec/unit/node_spec.rb +103 -16
- data/spec/unit/property_spec.rb +5 -5
- data/spec/unit/provider/batch_spec.rb +1 -1
- data/spec/unit/provider/cron/unix_spec.rb +1 -1
- data/spec/unit/provider/dsc_resource_spec.rb +22 -38
- data/spec/unit/provider/dsc_script_spec.rb +10 -10
- data/spec/unit/provider/execute_spec.rb +1 -8
- data/spec/unit/provider/git_spec.rb +3 -3
- data/spec/unit/provider/ifconfig_spec.rb +0 -1
- data/spec/unit/provider/mdadm_spec.rb +1 -3
- data/spec/unit/provider/package/dnf/python_helper_spec.rb +1 -1
- data/spec/unit/provider/package/openbsd_spec.rb +1 -1
- data/spec/unit/provider/package/pacman_spec.rb +17 -20
- data/spec/unit/provider/package/rubygems_spec.rb +5 -10
- data/spec/unit/provider/package/smartos_spec.rb +1 -1
- data/spec/unit/provider/package/windows/registry_uninstall_entry_spec.rb +3 -3
- data/spec/unit/provider/package/windows_spec.rb +30 -53
- data/spec/unit/provider/powershell_script_spec.rb +11 -4
- data/spec/unit/provider/remote_directory_spec.rb +9 -9
- data/spec/unit/provider/service/arch_service_spec.rb +3 -2
- data/spec/unit/provider/service/debian_service_spec.rb +1 -1
- data/spec/unit/provider/service/gentoo_service_spec.rb +7 -7
- data/spec/unit/provider/service/macosx_spec.rb +3 -3
- data/spec/unit/provider/service/redhat_spec.rb +3 -3
- data/spec/unit/provider/service/upstart_service_spec.rb +3 -3
- data/spec/unit/provider/service/windows_spec.rb +2 -6
- data/spec/unit/provider/systemd_unit_spec.rb +28 -24
- data/spec/unit/provider/user/dscl_spec.rb +2 -2
- data/spec/unit/provider/windows_env_spec.rb +5 -4
- data/spec/unit/provider_resolver_spec.rb +6 -6
- data/spec/unit/provider_spec.rb +1 -0
- data/spec/unit/resource/batch_spec.rb +6 -6
- data/spec/unit/resource/chef_client_cron_spec.rb +23 -7
- data/spec/unit/resource/chef_client_systemd_timer_spec.rb +7 -4
- data/spec/unit/resource/execute_spec.rb +123 -118
- data/spec/unit/resource/file/verification_spec.rb +2 -1
- data/spec/unit/resource/macos_user_defaults_spec.rb +103 -2
- data/spec/unit/resource/osx_profile_spec.rb +233 -0
- data/spec/unit/resource/powershell_script_spec.rb +11 -29
- data/spec/unit/resource/script_spec.rb +6 -1
- data/spec/unit/resource/windows_feature_powershell_spec.rb +30 -4
- data/spec/unit/resource/windows_firewall_profile_spec.rb +77 -0
- data/spec/unit/resource/windows_package_spec.rb +1 -0
- data/spec/unit/resource_reporter_spec.rb +1 -1
- data/spec/unit/resource_spec.rb +25 -8
- data/spec/unit/role_spec.rb +30 -28
- data/spec/unit/run_context/cookbook_compiler_spec.rb +1 -1
- data/spec/unit/run_lock_spec.rb +1 -1
- data/spec/unit/scan_access_control_spec.rb +1 -1
- data/spec/unit/server_api_spec.rb +43 -16
- data/spec/unit/util/backup_spec.rb +1 -1
- data/spec/unit/util/diff_spec.rb +1 -15
- data/spec/unit/util/powershell/ps_credential_spec.rb +2 -2
- data/spec/unit/util/selinux_spec.rb +2 -1
- data/spec/unit/win32/security_spec.rb +4 -3
- data/tasks/rspec.rb +1 -1
- metadata +45 -24
- data/lib/chef/provider/osx_profile.rb +0 -255
- data/spec/unit/provider/osx_profile_spec.rb +0 -255
|
@@ -112,11 +112,11 @@ class Chef
|
|
|
112
112
|
|
|
113
113
|
action :remove do
|
|
114
114
|
systemd_unit "#{new_resource.job_name}.service" do
|
|
115
|
-
action :
|
|
115
|
+
action :delete
|
|
116
116
|
end
|
|
117
117
|
|
|
118
118
|
systemd_unit "#{new_resource.job_name}.timer" do
|
|
119
|
-
action :
|
|
119
|
+
action :delete
|
|
120
120
|
end
|
|
121
121
|
end
|
|
122
122
|
|
|
@@ -22,26 +22,59 @@ require_relative "../dist"
|
|
|
22
22
|
|
|
23
23
|
class Chef
|
|
24
24
|
class Resource
|
|
25
|
-
# Use the chef_gem resource to install a gem only for the instance of Ruby that is dedicated to the chef-client.
|
|
26
|
-
# When a gem is installed from a local file, it must be added to the node using the remote_file or cookbook_file
|
|
27
|
-
# resources.
|
|
28
|
-
#
|
|
29
|
-
# The chef_gem resource works with all of the same properties and options as the gem_package resource, but does not
|
|
30
|
-
# accept the gem_binary property because it always uses the CurrentGemEnvironment under which the chef-client is
|
|
31
|
-
# running. In addition to performing actions similar to the gem_package resource, the chef_gem resource does the
|
|
32
|
-
# following:
|
|
33
|
-
# - Runs its actions immediately, before convergence, allowing a gem to be used in a recipe immediately after it is
|
|
34
|
-
# installed
|
|
35
|
-
# - Runs Gem.clear_paths after the action, ensuring that gem is aware of changes so that it can be required
|
|
36
|
-
# immediately after it is installed
|
|
37
|
-
|
|
38
|
-
require_relative "gem_package"
|
|
39
|
-
require_relative "../dist"
|
|
40
|
-
|
|
41
25
|
class ChefGem < Chef::Resource::Package::GemPackage
|
|
42
26
|
unified_mode true
|
|
43
27
|
provides :chef_gem
|
|
44
28
|
|
|
29
|
+
description <<~DESC
|
|
30
|
+
Use the **chef_gem** resource to install a gem only for the instance of Ruby that is dedicated to the #{Chef::Dist::CLIENT}.
|
|
31
|
+
When a gem is installed from a local file, it must be added to the node using the **remote_file** or **cookbook_file** resources.
|
|
32
|
+
|
|
33
|
+
The **chef_gem** resource works with all of the same properties and options as the **gem_package** resource, but does not
|
|
34
|
+
accept the `gem_binary` property because it always uses the `CurrentGemEnvironment` under which the `#{Chef::Dist::CLIENT}` is
|
|
35
|
+
running. In addition to performing actions similar to the **gem_package** resource, the **chef_gem** resource does the
|
|
36
|
+
following:
|
|
37
|
+
- Runs its actions immediately, before convergence, allowing a gem to be used in a recipe immediately after it is installed.
|
|
38
|
+
- Runs `Gem.clear_paths` after the action, ensuring that gem is aware of changes so that it can be required immediately after it is installed.
|
|
39
|
+
|
|
40
|
+
Warning: The **chef_gem** and **gem_package** resources are both used to install Ruby gems. For any machine on which #{Chef::Dist::PRODUCT} is
|
|
41
|
+
installed, there are two instances of Ruby. One is the standard, system-wide instance of Ruby and the other is a dedicated instance that is
|
|
42
|
+
available only to #{Chef::Dist::PRODUCT}.
|
|
43
|
+
Use the **chef_gem** resource to install gems into the instance of Ruby that is dedicated to #{Chef::Dist::PRODUCT}.
|
|
44
|
+
Use the **gem_package** resource to install all other gems (i.e. install gems system-wide).
|
|
45
|
+
DESC
|
|
46
|
+
|
|
47
|
+
examples <<~EXAMPLES
|
|
48
|
+
**Compile time vs. converge time installation of gems**
|
|
49
|
+
|
|
50
|
+
To install a gem while #{Chef::Dist::PRODUCT} is configuring the node (the converge phase), set the `compile_time` property to `false`:
|
|
51
|
+
```ruby
|
|
52
|
+
chef_gem 'right_aws' do
|
|
53
|
+
compile_time false
|
|
54
|
+
action :install
|
|
55
|
+
end
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
To install a gem while the resource collection is being built (the compile phase), set the `compile_time` property to `true`:
|
|
59
|
+
```ruby
|
|
60
|
+
chef_gem 'right_aws' do
|
|
61
|
+
compile_time true
|
|
62
|
+
action :install
|
|
63
|
+
end
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Install MySQL for Chef
|
|
67
|
+
```ruby
|
|
68
|
+
apt_update
|
|
69
|
+
|
|
70
|
+
build_essential 'install compilation tools' do
|
|
71
|
+
compile_time true
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
chef_gem 'mysql'
|
|
75
|
+
```
|
|
76
|
+
EXAMPLES
|
|
77
|
+
|
|
45
78
|
property :package_name, String,
|
|
46
79
|
description: "An optional property to set the package name if it differs from the resource block's name.",
|
|
47
80
|
identity: true
|
|
@@ -49,11 +82,14 @@ class Chef
|
|
|
49
82
|
property :version, String,
|
|
50
83
|
description: "The version of a package to be installed or upgraded."
|
|
51
84
|
|
|
52
|
-
property :gem_binary,
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
85
|
+
property :gem_binary, String,
|
|
86
|
+
default: "#{RbConfig::CONFIG["bindir"]}/gem",
|
|
87
|
+
default_description: "The `gem` binary included with #{Chef::Dist::PRODUCT}.",
|
|
88
|
+
description: "The path of a gem binary to use for the installation. By default, the same version of Ruby that is used by #{Chef::Dist::PRODUCT} will be used.",
|
|
89
|
+
callbacks: {
|
|
90
|
+
"The `chef_gem` resource is restricted to the current gem environment, use `gem_package` to install to other environments." =>
|
|
91
|
+
proc { |v| v == "#{RbConfig::CONFIG["bindir"]}/gem" },
|
|
92
|
+
}
|
|
57
93
|
end
|
|
58
94
|
end
|
|
59
95
|
end
|
|
@@ -73,19 +73,19 @@ class Chef
|
|
|
73
73
|
description: "The Chef environment of the data if storing per environment values."
|
|
74
74
|
|
|
75
75
|
load_current_value do
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
76
|
+
|
|
77
|
+
item = ChefVault::Item.load(data_bag, id)
|
|
78
|
+
raw_data item.raw_data
|
|
79
|
+
clients item.get_clients
|
|
80
|
+
admins item.get_admins
|
|
81
|
+
search item.search
|
|
82
|
+
rescue ChefVault::Exceptions::SecretDecryption
|
|
83
|
+
current_value_does_not_exist!
|
|
84
|
+
rescue ChefVault::Exceptions::KeysNotFound
|
|
85
|
+
current_value_does_not_exist!
|
|
86
|
+
rescue Net::HTTPClientException => e
|
|
87
|
+
current_value_does_not_exist! if e.response_code == "404"
|
|
88
|
+
|
|
89
89
|
end
|
|
90
90
|
|
|
91
91
|
action :create do
|
|
@@ -89,8 +89,7 @@ class Chef
|
|
|
89
89
|
# @param [String] action the name of the action to perform
|
|
90
90
|
# @return [String] the choco feature command string
|
|
91
91
|
def choco_cmd(action)
|
|
92
|
-
|
|
93
|
-
cmd
|
|
92
|
+
"#{ENV["ALLUSERSPROFILE"]}\\chocolatey\\bin\\choco feature #{action} --name #{new_resource.feature_name}"
|
|
94
93
|
end
|
|
95
94
|
end
|
|
96
95
|
end
|
|
@@ -158,7 +158,7 @@ class Chef
|
|
|
158
158
|
|
|
159
159
|
# @todo this is Chef 12 era cleanup. Someday we should remove it all
|
|
160
160
|
template "/etc/cron.d/#{sanitized_name}" do
|
|
161
|
-
source ::File.expand_path("
|
|
161
|
+
source ::File.expand_path("../support/cron.d.erb", __dir__)
|
|
162
162
|
local true
|
|
163
163
|
mode new_resource.mode
|
|
164
164
|
variables(
|
|
@@ -70,7 +70,7 @@ class Chef
|
|
|
70
70
|
|
|
71
71
|
with_run_context :root do
|
|
72
72
|
edit_resource(:template, allow_path) do |new_resource|
|
|
73
|
-
source ::File.expand_path("
|
|
73
|
+
source ::File.expand_path("support/cron_access.erb", __dir__)
|
|
74
74
|
local true
|
|
75
75
|
mode "0600"
|
|
76
76
|
variables["users"] ||= []
|
|
@@ -87,7 +87,7 @@ class Chef
|
|
|
87
87
|
|
|
88
88
|
with_run_context :root do
|
|
89
89
|
edit_resource(:template, deny_path) do |new_resource|
|
|
90
|
-
source ::File.expand_path("
|
|
90
|
+
source ::File.expand_path("support/cron_access.erb", __dir__)
|
|
91
91
|
local true
|
|
92
92
|
mode "0600"
|
|
93
93
|
variables["users"] ||= []
|
|
@@ -38,7 +38,7 @@ class Chef
|
|
|
38
38
|
end
|
|
39
39
|
```
|
|
40
40
|
|
|
41
|
-
**Install
|
|
41
|
+
**Install VirtualBox from the .mpkg**:
|
|
42
42
|
|
|
43
43
|
```ruby
|
|
44
44
|
dmg_package 'Virtualbox' do
|
|
@@ -66,7 +66,7 @@ class Chef
|
|
|
66
66
|
description: "The remote URL that is used to download the `.dmg` file, if specified."
|
|
67
67
|
|
|
68
68
|
property :file, String,
|
|
69
|
-
description: "The
|
|
69
|
+
description: "The absolute path to the `.dmg` file on the local system."
|
|
70
70
|
|
|
71
71
|
property :owner, [String, Integer],
|
|
72
72
|
description: "The user that should own the package installation."
|
|
@@ -161,11 +161,11 @@ class Chef
|
|
|
161
161
|
|
|
162
162
|
```ruby
|
|
163
163
|
execute 'test_rule' do
|
|
164
|
-
command
|
|
164
|
+
command "command_to_run
|
|
165
165
|
--option value
|
|
166
166
|
--option value
|
|
167
167
|
--source \#{node[:name_of_node][:ipsec][:local][:subnet]}
|
|
168
|
-
-j test_rule
|
|
168
|
+
-j test_rule"
|
|
169
169
|
|
|
170
170
|
action :nothing
|
|
171
171
|
end
|
|
@@ -509,7 +509,6 @@ class Chef
|
|
|
509
509
|
def initialize(name, run_context = nil)
|
|
510
510
|
super
|
|
511
511
|
@command = name
|
|
512
|
-
@backup = 5
|
|
513
512
|
@default_guard_interpreter = :execute
|
|
514
513
|
@is_guard_interpreter = false
|
|
515
514
|
end
|
|
@@ -630,11 +629,11 @@ class Chef
|
|
|
630
629
|
end
|
|
631
630
|
|
|
632
631
|
# if domain is provided in both username and domain
|
|
633
|
-
if specified_user && ((specified_user.include? '\\') || (specified_user.include? "@")) && specified_domain
|
|
632
|
+
if specified_user.is_a?(String) && ((specified_user.include? '\\') || (specified_user.include? "@")) && specified_domain
|
|
634
633
|
raise ArgumentError, "The domain is provided twice. Username: `#{specified_user}`, Domain: `#{specified_domain}`. Please specify domain only once."
|
|
635
634
|
end
|
|
636
635
|
|
|
637
|
-
if
|
|
636
|
+
if specified_user.is_a?(String) && specified_domain.nil?
|
|
638
637
|
# Splitting username of format: Domain\Username
|
|
639
638
|
domain_and_user = user.split('\\')
|
|
640
639
|
|
|
@@ -25,7 +25,40 @@ class Chef
|
|
|
25
25
|
unified_mode true
|
|
26
26
|
provides :gem_package
|
|
27
27
|
|
|
28
|
-
description
|
|
28
|
+
description <<~DESC
|
|
29
|
+
Use the **gem_package** resource to manage gem packages that are only included in recipes.
|
|
30
|
+
When a gem is installed from a local file, it must be added to the node using the **remote_file** or **cookbook_file** resources.
|
|
31
|
+
|
|
32
|
+
Note: The **gem_package** resource must be specified as `gem_package` and cannot be shortened to `package` in a recipe.
|
|
33
|
+
|
|
34
|
+
Warning: The **chef_gem** and **gem_package** resources are both used to install Ruby gems. For any machine on which #{Chef::Dist::PRODUCT} is
|
|
35
|
+
installed, there are two instances of Ruby. One is the standard, system-wide instance of Ruby and the other is a dedicated instance that is
|
|
36
|
+
available only to #{Chef::Dist::PRODUCT}.
|
|
37
|
+
Use the **chef_gem** resource to install gems into the instance of Ruby that is dedicated to #{Chef::Dist::PRODUCT}.
|
|
38
|
+
Use the **gem_package** resource to install all other gems (i.e. install gems system-wide).
|
|
39
|
+
DESC
|
|
40
|
+
|
|
41
|
+
examples <<~EXAMPLES
|
|
42
|
+
The following examples demonstrate various approaches for using the **gem_package** resource in recipes:
|
|
43
|
+
|
|
44
|
+
**Install a gem file from the local file system**
|
|
45
|
+
|
|
46
|
+
```ruby
|
|
47
|
+
gem_package 'right_aws' do
|
|
48
|
+
source '/tmp/right_aws-1.11.0.gem'
|
|
49
|
+
action :install
|
|
50
|
+
end
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
**Use the `ignore_failure` common attribute**
|
|
54
|
+
|
|
55
|
+
```ruby
|
|
56
|
+
gem_package 'syntax' do
|
|
57
|
+
action :install
|
|
58
|
+
ignore_failure true
|
|
59
|
+
end
|
|
60
|
+
```
|
|
61
|
+
EXAMPLES
|
|
29
62
|
|
|
30
63
|
property :package_name, String,
|
|
31
64
|
description: "An optional property to set the package name if it differs from the resource block's name.",
|
|
@@ -53,7 +86,7 @@ class Chef
|
|
|
53
86
|
default: lazy { Chef::Config[:clear_gem_sources] }, desired_state: false
|
|
54
87
|
|
|
55
88
|
property :gem_binary, String, desired_state: false,
|
|
56
|
-
description: "The path of a gem binary to use for the installation. By default, the same version of Ruby that is used by #{Chef::Dist::PRODUCT} will be
|
|
89
|
+
description: "The path of a gem binary to use for the installation. By default, the same version of Ruby that is used by #{Chef::Dist::PRODUCT} will be used."
|
|
57
90
|
|
|
58
91
|
property :include_default_source, [ TrueClass, FalseClass, nil ],
|
|
59
92
|
description: "Set to `false` to not include `Chef::Config[:rubygems_url]` in the sources.",
|
|
@@ -86,7 +86,7 @@ class Chef
|
|
|
86
86
|
end
|
|
87
87
|
|
|
88
88
|
action :periodic do
|
|
89
|
-
return unless
|
|
89
|
+
return unless macos?
|
|
90
90
|
|
|
91
91
|
unless brew_up_to_date?
|
|
92
92
|
converge_by "update new lists of packages" do
|
|
@@ -96,7 +96,7 @@ class Chef
|
|
|
96
96
|
end
|
|
97
97
|
|
|
98
98
|
action :update do
|
|
99
|
-
return unless
|
|
99
|
+
return unless macos?
|
|
100
100
|
|
|
101
101
|
converge_by "force update new lists of packages" do
|
|
102
102
|
do_update
|
|
@@ -87,8 +87,7 @@ class Chef
|
|
|
87
87
|
def updated_ec2_config_xml
|
|
88
88
|
begin
|
|
89
89
|
require "rexml/document" unless defined?(REXML::Document)
|
|
90
|
-
|
|
91
|
-
config = REXML::Document.new(::File.read(config_file))
|
|
90
|
+
config = REXML::Document.new(::File.read(WINDOWS_EC2_CONFIG))
|
|
92
91
|
# find an element named State with a sibling element whose value is Ec2SetComputerName
|
|
93
92
|
REXML::XPath.each(config, "//Plugin/State[../Name/text() = 'Ec2SetComputerName']") do |element|
|
|
94
93
|
element.text = "Disabled"
|
|
@@ -223,35 +222,36 @@ class Chef
|
|
|
223
222
|
end
|
|
224
223
|
|
|
225
224
|
else # windows
|
|
225
|
+
WINDOWS_EC2_CONFIG = 'C:\Program Files\Amazon\Ec2ConfigService\Settings\config.xml'.freeze
|
|
226
|
+
|
|
226
227
|
raise "Windows hostnames cannot contain a period." if new_resource.hostname.match?(/\./)
|
|
227
228
|
|
|
228
229
|
# suppress EC2 config service from setting our hostname
|
|
229
|
-
if ::File.exist?(
|
|
230
|
+
if ::File.exist?(WINDOWS_EC2_CONFIG)
|
|
230
231
|
xml_contents = updated_ec2_config_xml
|
|
231
232
|
if xml_contents.empty?
|
|
232
233
|
Chef::Log.warn('Unable to properly parse and update C:\Program Files\Amazon\Ec2ConfigService\Settings\config.xml contents. Skipping file update.')
|
|
233
234
|
else
|
|
234
|
-
|
|
235
|
+
file WINDOWS_EC2_CONFIG do
|
|
235
236
|
content xml_contents
|
|
236
237
|
end
|
|
237
238
|
end
|
|
238
239
|
end
|
|
239
240
|
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
not_if { Socket.gethostbyname(Socket.gethostname).first == new_resource.hostname }
|
|
248
|
-
end
|
|
241
|
+
unless Socket.gethostbyname(Socket.gethostname).first == new_resource.hostname
|
|
242
|
+
converge_by "set hostname to #{new_resource.hostname}" do
|
|
243
|
+
powershell_out! <<~EOH
|
|
244
|
+
$sysInfo = Get-WmiObject -Class Win32_ComputerSystem
|
|
245
|
+
$sysInfo.Rename("#{new_resource.hostname}")
|
|
246
|
+
EOH
|
|
247
|
+
end
|
|
249
248
|
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
249
|
+
# reboot because $windows
|
|
250
|
+
reboot "setting hostname" do
|
|
251
|
+
reason "#{Chef::Dist::PRODUCT} updated system hostname"
|
|
252
|
+
only_if { new_resource.windows_reboot }
|
|
253
|
+
action :request_reboot
|
|
254
|
+
end
|
|
255
255
|
end
|
|
256
256
|
end
|
|
257
257
|
end
|
|
@@ -68,7 +68,7 @@ class Chef
|
|
|
68
68
|
# check. According to `man 5 launchd.plist`:
|
|
69
69
|
# StartCalendarInterval <dictionary of integers or array of dictionaries of integers>
|
|
70
70
|
# ... Missing arguments are considered to be wildcard.
|
|
71
|
-
# What the man page doesn't state, but what was observed (OSX 10.11.5,
|
|
71
|
+
# What the man page doesn't state, but what was observed (OSX 10.11.5, launchctl v3.4.0)
|
|
72
72
|
# Is that keys that are specified, but invalid, will also be treated as a wildcard
|
|
73
73
|
# this means that an entry like:
|
|
74
74
|
# { "Hour"=>0, "Weekday"=>"6-7"}
|
|
@@ -16,6 +16,8 @@
|
|
|
16
16
|
#
|
|
17
17
|
|
|
18
18
|
require_relative "../resource"
|
|
19
|
+
require_relative "../dist"
|
|
20
|
+
require "plist"
|
|
19
21
|
|
|
20
22
|
class Chef
|
|
21
23
|
class Resource
|
|
@@ -28,99 +30,210 @@ class Chef
|
|
|
28
30
|
|
|
29
31
|
description "Use the **macos_userdefaults** resource to manage the macOS user defaults system. The properties of this resource are passed to the defaults command, and the parameters follow the convention of that command. See the defaults(1) man page for details on how the tool works."
|
|
30
32
|
introduced "14.0"
|
|
33
|
+
examples <<~DOC
|
|
34
|
+
**Specify a global domain value**
|
|
35
|
+
|
|
36
|
+
```ruby
|
|
37
|
+
macos_userdefaults 'Full keyboard access to all controls' do
|
|
38
|
+
key 'AppleKeyboardUIMode'
|
|
39
|
+
value 2
|
|
40
|
+
end
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
**Setting a value on a specific domain**
|
|
44
|
+
|
|
45
|
+
```ruby
|
|
46
|
+
macos_userdefaults 'Enable macOS firewall' do
|
|
47
|
+
domain '/Library/Preferences/com.apple.alf'
|
|
48
|
+
key 'globalstate'
|
|
49
|
+
value 1
|
|
50
|
+
end
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
**Specifying the type of a key to skip automatic type detection**
|
|
54
|
+
|
|
55
|
+
```ruby
|
|
56
|
+
macos_userdefaults 'Finder expanded save dialogs' do
|
|
57
|
+
key 'NSNavPanelExpandedStateForSaveMode'
|
|
58
|
+
value 'TRUE'
|
|
59
|
+
type 'bool'
|
|
60
|
+
end
|
|
61
|
+
```
|
|
62
|
+
DOC
|
|
31
63
|
|
|
32
64
|
property :domain, String,
|
|
33
65
|
description: "The domain that the user defaults belong to.",
|
|
34
|
-
|
|
66
|
+
default: "NSGlobalDomain",
|
|
67
|
+
default_description: "NSGlobalDomain: the global domain.",
|
|
68
|
+
desired_state: false
|
|
35
69
|
|
|
36
70
|
property :global, [TrueClass, FalseClass],
|
|
37
71
|
description: "Determines whether or not the domain is global.",
|
|
38
|
-
|
|
72
|
+
deprecated: true,
|
|
73
|
+
default: false,
|
|
74
|
+
desired_state: false
|
|
39
75
|
|
|
40
76
|
property :key, String,
|
|
41
|
-
description: "The preference key."
|
|
77
|
+
description: "The preference key.",
|
|
78
|
+
required: true
|
|
79
|
+
|
|
80
|
+
property :host, [String, Symbol],
|
|
81
|
+
description: "Set either :current or a hostname to set the user default at the host level.",
|
|
82
|
+
desired_state: false,
|
|
83
|
+
introduced: "16.3"
|
|
42
84
|
|
|
43
85
|
property :value, [Integer, Float, String, TrueClass, FalseClass, Hash, Array],
|
|
44
|
-
description: "The value of the key.",
|
|
45
|
-
required:
|
|
86
|
+
description: "The value of the key. Note: With the `type` property set to `bool`, `String` forms of Boolean true/false values that Apple accepts in the defaults command will be coerced: 0/1, 'TRUE'/'FALSE,' 'true'/false', 'YES'/'NO', or 'yes'/'no'.",
|
|
87
|
+
required: [:write],
|
|
88
|
+
coerce: proc { |v| v.is_a?(Hash) ? v.transform_keys(&:to_s) : v } # make sure keys are all strings for comparison
|
|
46
89
|
|
|
47
90
|
property :type, String,
|
|
48
91
|
description: "The value type of the preference key.",
|
|
49
|
-
|
|
92
|
+
equal_to: %w{bool string int float array dict},
|
|
93
|
+
desired_state: false
|
|
50
94
|
|
|
51
95
|
property :user, String,
|
|
52
|
-
description: "The system user that the default will be applied to."
|
|
96
|
+
description: "The system user that the default will be applied to.",
|
|
97
|
+
desired_state: false
|
|
53
98
|
|
|
54
99
|
property :sudo, [TrueClass, FalseClass],
|
|
55
|
-
description: "Set to true if the setting you wish to modify requires privileged access.",
|
|
100
|
+
description: "Set to true if the setting you wish to modify requires privileged access. This requires passwordless sudo for the '/usr/bin/defaults' command to be setup for the user running #{Chef::Dist::PRODUCT}.",
|
|
56
101
|
default: false,
|
|
57
102
|
desired_state: false
|
|
58
103
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
desired_state: false,
|
|
63
|
-
skip_docs: true
|
|
104
|
+
load_current_value do |desired|
|
|
105
|
+
Chef::Log.debug "#load_current_value: shelling out \"#{defaults_export_cmd(desired).join(" ")}\" to determine state"
|
|
106
|
+
state = shell_out(defaults_export_cmd(desired), user: desired.user)
|
|
64
107
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
108
|
+
if state.error? || state.stdout.empty?
|
|
109
|
+
Chef::Log.debug "#load_current_value: #{defaults_export_cmd(desired).join(" ")} returned stdout: #{state.stdout} and stderr: #{state.stderr}"
|
|
110
|
+
current_value_does_not_exist!
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
plist_data = ::Plist.parse_xml(state.stdout)
|
|
114
|
+
|
|
115
|
+
# handle the situation where the key doesn't exist in the domain
|
|
116
|
+
if plist_data.key?(desired.key)
|
|
117
|
+
key desired.key
|
|
118
|
+
else
|
|
119
|
+
current_value_does_not_exist!
|
|
120
|
+
end
|
|
71
121
|
|
|
72
|
-
|
|
122
|
+
value plist_data[desired.key]
|
|
73
123
|
end
|
|
74
124
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
125
|
+
#
|
|
126
|
+
# The defaults command to export a domain
|
|
127
|
+
#
|
|
128
|
+
# @return [Array] defaults command
|
|
129
|
+
#
|
|
130
|
+
def defaults_export_cmd(resource)
|
|
131
|
+
state_cmd = ["/usr/bin/defaults"]
|
|
132
|
+
|
|
133
|
+
if resource.host == "current"
|
|
134
|
+
state_cmd.concat(["-currentHost"])
|
|
135
|
+
elsif resource.host # they specified a non-nil value, which is a hostname
|
|
136
|
+
state_cmd.concat(["-host", resource.host])
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
state_cmd.concat(["export", resource.domain, "-"])
|
|
140
|
+
state_cmd
|
|
88
141
|
end
|
|
89
142
|
|
|
90
143
|
action :write do
|
|
91
|
-
description "Write the
|
|
92
|
-
|
|
93
|
-
unless current_resource.is_set
|
|
94
|
-
cmd = ["defaults write"]
|
|
95
|
-
cmd.unshift("sudo") if new_resource.sudo
|
|
96
|
-
|
|
97
|
-
cmd << if new_resource.global
|
|
98
|
-
"NSGlobalDomain"
|
|
99
|
-
else
|
|
100
|
-
"'#{new_resource.domain}'"
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
cmd << "'#{new_resource.key}'" if new_resource.key
|
|
104
|
-
value = new_resource.value
|
|
105
|
-
type = new_resource.type.empty? ? value_type(value) : new_resource.type
|
|
106
|
-
# creates a string of Key1 Value1 Key2 Value2...
|
|
107
|
-
value = value.map { |k, v| "\"#{k}\" \"#{v}\"" }.join(" ") if type == "dict"
|
|
108
|
-
if type == "array"
|
|
109
|
-
value = value.join("' '")
|
|
110
|
-
value = "'#{value}'"
|
|
111
|
-
end
|
|
112
|
-
cmd << "-#{type}" if type
|
|
113
|
-
cmd << value
|
|
144
|
+
description "Write the value to the specified domain/key."
|
|
114
145
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
146
|
+
converge_if_changed do
|
|
147
|
+
cmd = defaults_modify_cmd
|
|
148
|
+
Chef::Log.debug("Updating defaults value by shelling out: #{cmd.join(" ")}")
|
|
149
|
+
|
|
150
|
+
shell_out!(cmd, user: new_resource.user)
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
action :delete do
|
|
155
|
+
description "Delete a key from a domain."
|
|
156
|
+
|
|
157
|
+
# if it's not there there's nothing to remove
|
|
158
|
+
return unless current_resource
|
|
159
|
+
|
|
160
|
+
converge_by("delete domain:#{new_resource.domain} key:#{new_resource.key}") do
|
|
161
|
+
|
|
162
|
+
cmd = defaults_modify_cmd
|
|
163
|
+
Chef::Log.debug("Removing defaults key by shelling out: #{cmd.join(" ")}")
|
|
164
|
+
|
|
165
|
+
shell_out!(cmd, user: new_resource.user)
|
|
120
166
|
end
|
|
121
167
|
end
|
|
122
168
|
|
|
123
169
|
action_class do
|
|
170
|
+
#
|
|
171
|
+
# The command used to write or delete delete values from domains
|
|
172
|
+
#
|
|
173
|
+
# @return [Array] Array representation of defaults command to run
|
|
174
|
+
#
|
|
175
|
+
def defaults_modify_cmd
|
|
176
|
+
cmd = ["/usr/bin/defaults"]
|
|
177
|
+
|
|
178
|
+
if new_resource.host == :current
|
|
179
|
+
cmd.concat(["-currentHost"])
|
|
180
|
+
elsif new_resource.host # they specified a non-nil value, which is a hostname
|
|
181
|
+
cmd.concat(["-host", new_resource.host])
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
cmd.concat([action.to_s, new_resource.domain, new_resource.key])
|
|
185
|
+
cmd.concat(processed_value) if action == :write
|
|
186
|
+
cmd.prepend("sudo") if new_resource.sudo
|
|
187
|
+
cmd
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
#
|
|
191
|
+
# convert the provided value into the format defaults expects
|
|
192
|
+
#
|
|
193
|
+
# @return [array] array of values starting with the type if applicable
|
|
194
|
+
#
|
|
195
|
+
def processed_value
|
|
196
|
+
type = new_resource.type || value_type(new_resource.value)
|
|
197
|
+
|
|
198
|
+
# when dict this creates an array of values ["Key1", "Value1", "Key2", "Value2" ...]
|
|
199
|
+
cmd_values = ["-#{type}"]
|
|
200
|
+
|
|
201
|
+
case type
|
|
202
|
+
when "dict"
|
|
203
|
+
cmd_values.concat(new_resource.value.flatten)
|
|
204
|
+
when "array"
|
|
205
|
+
cmd_values.concat(new_resource.value)
|
|
206
|
+
when "bool"
|
|
207
|
+
cmd_values.concat(bool_to_defaults_bool(new_resource.value))
|
|
208
|
+
else
|
|
209
|
+
cmd_values.concat([new_resource.value])
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
cmd_values
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
#
|
|
216
|
+
# defaults booleans on the CLI must be 'TRUE' or 'FALSE' so convert various inputs to that
|
|
217
|
+
#
|
|
218
|
+
# @param [String, Integer, Boolean] input <description>
|
|
219
|
+
#
|
|
220
|
+
# @return [String] TRUE or FALSE
|
|
221
|
+
#
|
|
222
|
+
def bool_to_defaults_bool(input)
|
|
223
|
+
return ["TRUE"] if [true, "TRUE", "1", "true", "YES", "yes"].include?(input)
|
|
224
|
+
return ["FALSE"] if [false, "FALSE", "0", "false", "NO", "no"].include?(input)
|
|
225
|
+
|
|
226
|
+
# make sure it's very clear bad input was given
|
|
227
|
+
raise ArgumentError, "#{input} cannot be converted to a boolean value for use with Apple's defaults command. Acceptable values are: 'TRUE', 'YES', 'true, 'yes', '0', true, 'FALSE', 'false', 'NO', 'no', '1', or false."
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
#
|
|
231
|
+
# convert ruby type to defaults type
|
|
232
|
+
#
|
|
233
|
+
# @param [Integer, Float, String, TrueClass, FalseClass, Hash, Array] value The value being set
|
|
234
|
+
#
|
|
235
|
+
# @return [string, nil] the type value used by defaults or nil if not applicable
|
|
236
|
+
#
|
|
124
237
|
def value_type(value)
|
|
125
238
|
case value
|
|
126
239
|
when true, false
|
|
@@ -133,6 +246,8 @@ class Chef
|
|
|
133
246
|
"dict"
|
|
134
247
|
when Array
|
|
135
248
|
"array"
|
|
249
|
+
when String
|
|
250
|
+
"string"
|
|
136
251
|
end
|
|
137
252
|
end
|
|
138
253
|
end
|