chef 16.1.16-universal-mingw32 → 16.3.45-universal-mingw32
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +6 -7
- data/README.md +3 -3
- data/Rakefile +3 -16
- data/chef-universal-mingw32.gemspec +2 -2
- data/chef.gemspec +7 -6
- data/lib/chef/application.rb +12 -0
- data/lib/chef/application/apply.rb +2 -1
- data/lib/chef/application/base.rb +1 -1
- data/lib/chef/application/client.rb +1 -1
- data/lib/chef/application/windows_service_manager.rb +1 -1
- data/lib/chef/{whitelist.rb → attribute_allowlist.rb} +11 -11
- data/lib/chef/{blacklist.rb → attribute_blocklist.rb} +9 -9
- data/lib/chef/chef_fs/data_handler/data_bag_item_data_handler.rb +1 -1
- data/lib/chef/chef_fs/data_handler/organization_data_handler.rb +1 -2
- 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/repository/base_file.rb +1 -0
- data/lib/chef/chef_fs/parallelizer/parallel_enumerable.rb +1 -1
- data/lib/chef/chef_fs/path_utils.rb +1 -1
- data/lib/chef/client.rb +3 -3
- data/lib/chef/cookbook/chefignore.rb +1 -1
- data/lib/chef/cookbook/metadata.rb +1 -1
- 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/cookbook_version.rb +2 -2
- data/lib/chef/data_bag.rb +5 -6
- data/lib/chef/deprecated.rb +12 -0
- data/lib/chef/digester.rb +3 -2
- data/lib/chef/dsl/platform_introspection.rb +2 -0
- data/lib/chef/environment.rb +1 -2
- data/lib/chef/exceptions.rb +3 -0
- data/lib/chef/file_access_control.rb +1 -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/formatters/error_inspectors/compile_error_inspector.rb +1 -1
- data/lib/chef/formatters/error_inspectors/resource_failure_inspector.rb +3 -3
- data/lib/chef/handler.rb +2 -0
- data/lib/chef/http.rb +27 -13
- data/lib/chef/http/authenticator.rb +3 -1
- data/lib/chef/http/http_request.rb +1 -1
- data/lib/chef/http/json_output.rb +1 -1
- data/lib/chef/http/ssl_policies.rb +18 -0
- data/lib/chef/knife.rb +5 -5
- data/lib/chef/knife/bootstrap.rb +19 -19
- data/lib/chef/knife/bootstrap/templates/chef-full.erb +9 -9
- data/lib/chef/knife/bootstrap/train_connector.rb +1 -0
- data/lib/chef/knife/client_bulk_delete.rb +1 -1
- data/lib/chef/knife/config_get.rb +2 -1
- 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_delete.rb +1 -1
- data/lib/chef/knife/cookbook_upload.rb +6 -14
- data/lib/chef/knife/core/bootstrap_context.rb +1 -1
- data/lib/chef/knife/core/cookbook_scm_repo.rb +1 -1
- data/lib/chef/knife/core/gem_glob_loader.rb +1 -1
- data/lib/chef/knife/core/hashed_command_loader.rb +1 -0
- 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 +2 -3
- data/lib/chef/knife/data_bag_create.rb +1 -1
- data/lib/chef/knife/node_bulk_delete.rb +1 -1
- data/lib/chef/knife/node_run_list_remove.rb +1 -1
- data/lib/chef/knife/rehash.rb +3 -21
- data/lib/chef/knife/role_bulk_delete.rb +1 -1
- data/lib/chef/knife/ssh.rb +6 -2
- data/lib/chef/knife/supermarket_share.rb +1 -1
- data/lib/chef/knife/supermarket_unshare.rb +1 -1
- data/lib/chef/log.rb +8 -3
- data/{spec/functional/resource/base.rb → lib/chef/mixin/chef_utils_wiring.rb} +24 -12
- data/{spec/unit/log_spec.rb → lib/chef/mixin/default_paths.rb} +13 -5
- data/lib/chef/mixin/openssl_helper.rb +27 -5
- data/lib/chef/mixin/path_sanity.rb +5 -4
- data/lib/chef/mixin/securable.rb +2 -2
- 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/node.rb +36 -12
- data/lib/chef/node_map.rb +21 -18
- data/lib/chef/platform/service_helpers.rb +31 -28
- data/lib/chef/powershell.rb +1 -1
- data/lib/chef/provider/batch.rb +3 -10
- data/lib/chef/provider/cron.rb +2 -14
- data/lib/chef/provider/execute.rb +2 -1
- data/lib/chef/provider/git.rb +12 -4
- data/lib/chef/provider/group/dscl.rb +2 -2
- data/lib/chef/provider/group/windows.rb +1 -1
- data/lib/chef/provider/ifconfig.rb +7 -7
- data/lib/chef/provider/mount/aix.rb +1 -1
- data/lib/chef/provider/mount/solaris.rb +0 -1
- data/lib/chef/provider/mount/windows.rb +2 -2
- data/lib/chef/provider/noop.rb +1 -1
- data/lib/chef/provider/package/openbsd.rb +1 -1
- data/lib/chef/provider/package/portage.rb +2 -2
- data/lib/chef/provider/package/powershell.rb +6 -2
- data/lib/chef/provider/package/rubygems.rb +2 -2
- data/lib/chef/provider/package/snap.rb +97 -29
- data/lib/chef/provider/package/windows.rb +9 -4
- data/lib/chef/provider/package/windows/msi.rb +3 -3
- data/lib/chef/provider/package/windows/registry_uninstall_entry.rb +1 -1
- data/lib/chef/provider/package/zypper.rb +0 -1
- data/lib/chef/provider/powershell_script.rb +10 -14
- data/lib/chef/provider/remote_file/http.rb +4 -1
- data/lib/chef/provider/script.rb +4 -75
- data/lib/chef/provider/service.rb +2 -2
- data/lib/chef/provider/service/arch.rb +1 -1
- data/lib/chef/provider/service/debian.rb +2 -2
- data/lib/chef/provider/service/openbsd.rb +4 -4
- data/lib/chef/provider/service/redhat.rb +1 -1
- data/lib/chef/provider/service/windows.rb +1 -1
- data/lib/chef/provider/subversion.rb +2 -2
- data/lib/chef/provider/user/dscl.rb +4 -4
- data/lib/chef/provider/user/linux.rb +3 -3
- data/lib/chef/provider/user/mac.rb +5 -5
- data/lib/chef/provider/windows_script.rb +87 -25
- data/lib/chef/provider/yum_repository.rb +1 -1
- data/lib/chef/provider/zypper_repository.rb +31 -11
- data/lib/chef/resource.rb +24 -11
- data/lib/chef/resource/alternatives.rb +1 -1
- data/lib/chef/resource/apt_package.rb +1 -1
- data/lib/chef/resource/archive_file.rb +28 -8
- data/lib/chef/resource/bash.rb +0 -1
- data/lib/chef/resource/batch.rb +4 -2
- data/lib/chef/resource/build_essential.rb +2 -2
- data/lib/chef/resource/chef_client_scheduled_task.rb +14 -2
- data/lib/chef/resource/chef_gem.rb +57 -21
- data/lib/chef/resource/chocolatey_feature.rb +1 -2
- data/lib/chef/resource/cron/_cron_shared.rb +98 -0
- data/lib/chef/resource/cron/cron.rb +46 -0
- data/lib/chef/resource/{cron_d.rb → cron/cron_d.rb} +7 -87
- data/lib/chef/resource/cron_access.rb +13 -5
- data/lib/chef/resource/csh.rb +0 -1
- data/lib/chef/resource/dmg_package.rb +2 -2
- data/lib/chef/resource/execute.rb +479 -9
- data/lib/chef/resource/file.rb +1 -1
- data/lib/chef/resource/freebsd_package.rb +1 -1
- data/lib/chef/resource/gem_package.rb +35 -2
- data/lib/chef/resource/helpers/cron_validations.rb +6 -3
- data/lib/chef/resource/homebrew_package.rb +30 -1
- data/lib/chef/resource/homebrew_update.rb +107 -0
- data/lib/chef/resource/hostname.rb +23 -36
- data/lib/chef/resource/kernel_module.rb +14 -1
- 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/mount.rb +1 -1
- data/lib/chef/resource/openssl_x509_certificate.rb +11 -14
- data/lib/chef/resource/openssl_x509_crl.rb +1 -2
- data/lib/chef/resource/perl.rb +0 -1
- data/lib/chef/resource/plist.rb +23 -4
- data/lib/chef/resource/powershell_script.rb +4 -2
- data/lib/chef/resource/python.rb +0 -1
- data/lib/chef/resource/remote_file.rb +26 -10
- data/lib/chef/resource/ruby.rb +0 -1
- 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 +30 -3
- data/lib/chef/resource/swap_file.rb +17 -0
- data/lib/chef/resource/template.rb +1 -1
- 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 +30 -1
- data/lib/chef/resource/windows_audit_policy.rb +227 -0
- data/lib/chef/resource/windows_auto_run.rb +11 -0
- data/lib/chef/resource/windows_certificate.rb +26 -0
- data/lib/chef/resource/windows_dns_record.rb +17 -0
- data/lib/chef/resource/windows_firewall_profile.rb +197 -0
- data/lib/chef/resource/windows_font.rb +3 -3
- data/lib/chef/resource/windows_package.rb +1 -1
- data/lib/chef/resource/windows_pagefile.rb +1 -1
- data/lib/chef/resource/windows_script.rb +2 -16
- data/lib/chef/resource/windows_security_policy.rb +67 -36
- data/lib/chef/resource/windows_shortcut.rb +1 -2
- data/lib/chef/resource/windows_task.rb +4 -4
- data/lib/chef/resource/windows_user_privilege.rb +30 -7
- data/lib/chef/resource/yum_repository.rb +9 -9
- data/lib/chef/resource_inspector.rb +7 -1
- data/lib/chef/resources.rb +5 -2
- data/lib/chef/role.rb +1 -2
- data/lib/chef/search/query.rb +1 -1
- data/lib/chef/server_api_versions.rb +4 -0
- data/lib/chef/shell/shell_session.rb +2 -0
- data/lib/chef/util/diff.rb +2 -3
- data/lib/chef/util/windows/net_user.rb +1 -1
- data/lib/chef/util/windows/volume.rb +1 -1
- data/lib/chef/version.rb +2 -2
- data/lib/chef/win32/file.rb +1 -1
- data/lib/chef/win32/registry.rb +3 -4
- data/lib/chef/win32/security.rb +1 -1
- data/spec/data/lwrp/providers/buck_passer.rb +1 -1
- data/spec/data/lwrp/providers/buck_passer_2.rb +1 -1
- data/spec/data/lwrp/providers/embedded_resource_accesses_providers_scope.rb +1 -1
- 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 +1 -2
- 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 +1 -1
- data/spec/functional/resource/chocolatey_package_spec.rb +4 -0
- data/spec/functional/resource/cron_spec.rb +20 -2
- data/spec/functional/resource/dnf_package_spec.rb +4 -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 +15 -3
- data/spec/functional/resource/ifconfig_spec.rb +9 -1
- data/spec/functional/resource/insserv_spec.rb +3 -3
- data/spec/functional/resource/link_spec.rb +2 -5
- 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 +4 -4
- data/spec/functional/resource/remote_file_spec.rb +9 -15
- data/spec/functional/resource/rpm_spec.rb +1 -1
- data/spec/functional/resource/timezone_spec.rb +2 -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 -1
- data/spec/functional/resource/windows_service_spec.rb +4 -0
- data/spec/functional/resource/windows_task_spec.rb +12 -11
- 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 +2 -1
- 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/integration/knife/config_list_profiles_spec.rb +30 -2
- data/spec/integration/knife/config_use_profile_spec.rb +55 -2
- 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/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/recipes/accumulator_spec.rb +1 -1
- data/spec/integration/recipes/lwrp_inline_resources_spec.rb +1 -1
- 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 +10 -4
- data/spec/support/chef_helpers.rb +1 -20
- data/spec/support/platform_helpers.rb +1 -3
- data/spec/support/platforms/win32/spec_service.rb +1 -1
- data/spec/support/shared/functional/execute_resource.rb +1 -1
- data/spec/support/shared/functional/file_resource.rb +0 -1
- 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/windows_script.rb +2 -2
- 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/execute_resource.rb +1 -1
- data/spec/support/shared/unit/provider/file.rb +12 -8
- data/spec/unit/application/solo_spec.rb +4 -2
- data/spec/unit/application_spec.rb +11 -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 +1 -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 +5 -1
- 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/http/ssl_policies_spec.rb +20 -0
- data/spec/unit/json_compat_spec.rb +1 -1
- data/spec/unit/knife/bootstrap_spec.rb +5 -8
- data/spec/unit/knife/cookbook_download_spec.rb +2 -2
- data/spec/unit/knife/cookbook_show_spec.rb +6 -7
- data/spec/unit/knife/cookbook_upload_spec.rb +7 -10
- data/spec/unit/knife/data_bag_edit_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/unformatter_spec.rb +2 -2
- data/spec/unit/mixin/uris_spec.rb +1 -1
- data/spec/unit/mixin/user_context_spec.rb +1 -9
- data/spec/unit/mixin/which.rb +8 -0
- data/spec/unit/node_spec.rb +98 -11
- data/spec/unit/property_spec.rb +6 -6
- data/spec/unit/provider/batch_spec.rb +130 -0
- data/spec/unit/provider/cron/unix_spec.rb +1 -1
- data/spec/unit/provider/cron_spec.rb +9 -49
- 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/powershell_spec.rb +95 -86
- 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/snap_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 +3 -45
- data/spec/unit/provider/script_spec.rb +20 -110
- data/spec/unit/provider/service/redhat_spec.rb +1 -1
- 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/zypper_repository_spec.rb +60 -10
- data/spec/unit/provider_spec.rb +1 -0
- data/spec/unit/resource/archive_file_spec.rb +11 -2
- data/spec/unit/resource/chef_client_cron_spec.rb +23 -7
- data/spec/unit/resource/chef_client_scheduled_task_spec.rb +17 -7
- data/spec/unit/resource/chef_client_systemd_timer_spec.rb +7 -4
- data/spec/unit/resource/cron_spec.rb +2 -2
- data/spec/unit/resource/execute_spec.rb +10 -0
- data/spec/unit/resource/file/verification_spec.rb +2 -1
- data/spec/unit/resource/helpers/cron_validations_spec.rb +5 -1
- data/spec/unit/resource/homebrew_update_spec.rb +30 -0
- data/spec/unit/resource/macos_user_defaults_spec.rb +103 -2
- data/spec/unit/resource/powershell_script_spec.rb +10 -15
- data/spec/unit/resource/timezone_spec.rb +1 -1
- data/spec/unit/resource/windows_audit_policy_spec.rb +64 -0
- data/spec/unit/resource/windows_dns_record_spec.rb +3 -3
- data/spec/unit/resource/windows_dns_zone_spec.rb +2 -2
- 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/windows_task_spec.rb +1 -1
- data/spec/unit/resource/windows_uac_spec.rb +2 -2
- data/spec/unit/resource/yum_repository_spec.rb +21 -21
- data/spec/unit/resource_reporter_spec.rb +1 -1
- data/spec/unit/resource_spec.rb +84 -1
- data/spec/unit/role_spec.rb +23 -21
- 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/dsc/configuration_generator_spec.rb +1 -1
- data/spec/unit/util/powershell/ps_credential_spec.rb +2 -2
- data/spec/unit/util/selinux_spec.rb +2 -1
- data/spec/unit/util/threaded_job_queue_spec.rb +9 -0
- data/spec/unit/win32/security_spec.rb +4 -3
- metadata +68 -40
- data/lib/chef/resource/cron.rb +0 -157
data/lib/chef/resource/file.rb
CHANGED
@@ -76,7 +76,7 @@ class Chef
|
|
76
76
|
property :diff, [ String, nil ], desired_state: false, skip_docs: true
|
77
77
|
|
78
78
|
property :force_unlink, [ TrueClass, FalseClass ], desired_state: false, default: false,
|
79
|
-
description: "How #{Chef::Dist::PRODUCT} handles certain situations when the target file turns out not to be a file. For example, when a target file is actually a symlink. Set to true for #{Chef::Dist::PRODUCT} to delete the non-file target and replace it with the specified file. Set to false for #{Chef::Dist::PRODUCT} to raise an error."
|
79
|
+
description: "How #{Chef::Dist::PRODUCT} handles certain situations when the target file turns out not to be a file. For example, when a target file is actually a symlink. Set to `true` for #{Chef::Dist::PRODUCT} to delete the non-file target and replace it with the specified file. Set to `false` for #{Chef::Dist::PRODUCT} to raise an error."
|
80
80
|
|
81
81
|
property :manage_symlink_source, [ TrueClass, FalseClass ], desired_state: false,
|
82
82
|
description: "Change the behavior of the file resource if it is pointed at a symlink. When this value is set to true, #{Chef::Dist::PRODUCT} will manage the symlink's permissions or will replace the symlink with a normal file if the resource has content. When this value is set to false, #{Chef::Dist::PRODUCT} will follow the symlink and will manage the permissions and content of symlink's target file. The default behavior is true but emits a warning that the default value will be changed to false in a future version; setting this explicitly to true or false suppresses this warning."
|
@@ -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.",
|
@@ -35,7 +35,7 @@ class Chef
|
|
35
35
|
# Lists of individual values, ranges, and step values all share the validity range for type
|
36
36
|
spec.split(%r{\/|-|,}).each do |x|
|
37
37
|
next if x == "*"
|
38
|
-
return false unless
|
38
|
+
return false unless /^\d+$/.match?(x)
|
39
39
|
|
40
40
|
x = x.to_i
|
41
41
|
return false unless x >= min && x <= max
|
@@ -62,13 +62,16 @@ class Chef
|
|
62
62
|
end
|
63
63
|
end
|
64
64
|
|
65
|
-
# validate the provided day of the week is sun-sat, 0-7, or *
|
65
|
+
# validate the provided day of the week is sun-sat, sunday-saturday, 0-7, or *
|
66
|
+
# Added crontab param to check cron resource
|
66
67
|
# @param spec the value to validate
|
67
68
|
# @return [Boolean] valid or not?
|
68
69
|
def validate_dow(spec)
|
70
|
+
spec = spec.to_s
|
69
71
|
spec == "*" ||
|
70
72
|
validate_numeric(spec, 0, 7) ||
|
71
|
-
%w{sun mon tue wed thu fri sat}.include?(
|
73
|
+
%w{sun mon tue wed thu fri sat}.include?(spec.downcase) ||
|
74
|
+
%w{sunday monday tuesday wednesday thursday friday saturday}.include?(spec.downcase)
|
72
75
|
end
|
73
76
|
|
74
77
|
# validate the day of the month is 1-31
|
@@ -29,8 +29,37 @@ class Chef
|
|
29
29
|
provides :homebrew_package
|
30
30
|
provides :package, os: "darwin"
|
31
31
|
|
32
|
-
description "Use the **homebrew_package** resource to manage packages for the macOS platform."
|
32
|
+
description "Use the **homebrew_package** resource to manage packages for the macOS platform. Note: Starting with #{Chef::Dist::PRODUCT} 16 the homebrew resource now accepts an array of packages for installing multiple packages at once."
|
33
33
|
introduced "12.0"
|
34
|
+
examples <<~DOC
|
35
|
+
**Install a package**:
|
36
|
+
|
37
|
+
```ruby
|
38
|
+
homebrew_package 'git'
|
39
|
+
```
|
40
|
+
|
41
|
+
**Install multiple packages at once**:
|
42
|
+
|
43
|
+
```ruby
|
44
|
+
homebrew_package %w(git fish ruby)
|
45
|
+
```
|
46
|
+
|
47
|
+
**Specify the Homebrew user with a UUID**
|
48
|
+
|
49
|
+
```ruby
|
50
|
+
homebrew_package 'git' do
|
51
|
+
homebrew_user 1001
|
52
|
+
end
|
53
|
+
```
|
54
|
+
|
55
|
+
**Specify the Homebrew user with a string**:
|
56
|
+
|
57
|
+
```ruby
|
58
|
+
homebrew_package 'vim' do
|
59
|
+
homebrew_user 'user1'
|
60
|
+
end
|
61
|
+
```
|
62
|
+
DOC
|
34
63
|
|
35
64
|
property :homebrew_user, [ String, Integer ],
|
36
65
|
description: "The name or uid of the Homebrew owner to be used by #{Chef::Dist::PRODUCT} when executing a command."
|
@@ -0,0 +1,107 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Joshua Timberman (<jtimberman@chef.io>)
|
3
|
+
# Author:: Dan Webb (<dan@webb-agile-solutions.ltd>)
|
4
|
+
#
|
5
|
+
# Copyright:: Copyright (c) Chef Software Inc.
|
6
|
+
# Copyright:: Copyright (c) Webb Agile Solutions Ltd.
|
7
|
+
#
|
8
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
9
|
+
# you may not use this file except in compliance with the License.
|
10
|
+
# You may obtain a copy of the License at
|
11
|
+
#
|
12
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
13
|
+
#
|
14
|
+
# Unless required by applicable law or agreed to in writing, software
|
15
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
16
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
17
|
+
# See the License for the specific language governing permissions and
|
18
|
+
# limitations under the License.
|
19
|
+
#
|
20
|
+
|
21
|
+
require_relative "../resource"
|
22
|
+
require_relative "../dist"
|
23
|
+
|
24
|
+
class Chef
|
25
|
+
class Resource
|
26
|
+
class HomebrewUpdate < Chef::Resource
|
27
|
+
unified_mode true
|
28
|
+
|
29
|
+
provides(:homebrew_update) { true }
|
30
|
+
|
31
|
+
description "Use the **homebrew_update** resource to manage Homebrew repository updates on macOS."
|
32
|
+
introduced "16.2"
|
33
|
+
examples <<~DOC
|
34
|
+
**Update the homebrew repository data at a specified interval**:
|
35
|
+
```ruby
|
36
|
+
homebrew_update 'all platforms' do
|
37
|
+
frequency 86400
|
38
|
+
action :periodic
|
39
|
+
end
|
40
|
+
```
|
41
|
+
**Update the Homebrew repository at the start of a #{Chef::Dist::PRODUCT} run**:
|
42
|
+
```ruby
|
43
|
+
homebrew_update 'update'
|
44
|
+
```
|
45
|
+
DOC
|
46
|
+
|
47
|
+
# allow bare homebrew_update with no name
|
48
|
+
property :name, String, default: ""
|
49
|
+
|
50
|
+
property :frequency, Integer,
|
51
|
+
description: "Determines how frequently (in seconds) Homebrew updates are made. Use this property when the `:periodic` action is specified.",
|
52
|
+
default: 86_400
|
53
|
+
|
54
|
+
default_action :periodic
|
55
|
+
allowed_actions :update, :periodic
|
56
|
+
|
57
|
+
action_class do
|
58
|
+
BREW_STAMP_DIR = "/var/lib/homebrew/periodic".freeze
|
59
|
+
BREW_STAMP = "#{BREW_STAMP_DIR}/update-success-stamp".freeze
|
60
|
+
|
61
|
+
# Determines whether we need to run `homebrew update`
|
62
|
+
#
|
63
|
+
# @return [Boolean]
|
64
|
+
def brew_up_to_date?
|
65
|
+
::File.exist?("#{BREW_STAMP}") &&
|
66
|
+
::File.mtime("#{BREW_STAMP}") > Time.now - new_resource.frequency
|
67
|
+
end
|
68
|
+
|
69
|
+
def do_update
|
70
|
+
directory BREW_STAMP_DIR do
|
71
|
+
recursive true
|
72
|
+
end
|
73
|
+
|
74
|
+
file "#{BREW_STAMP}" do
|
75
|
+
content "BREW::Update::Post-Invoke-Success\n"
|
76
|
+
action :create_if_missing
|
77
|
+
end
|
78
|
+
|
79
|
+
execute "brew update" do
|
80
|
+
command %w{brew update}
|
81
|
+
default_env true
|
82
|
+
user Homebrew.owner
|
83
|
+
notifies :touch, "file[#{BREW_STAMP}]", :immediately
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
action :periodic do
|
89
|
+
return unless mac_os_x?
|
90
|
+
|
91
|
+
unless brew_up_to_date?
|
92
|
+
converge_by "update new lists of packages" do
|
93
|
+
do_update
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
action :update do
|
99
|
+
return unless mac_os_x?
|
100
|
+
|
101
|
+
converge_by "force update new lists of packages" do
|
102
|
+
do_update
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
@@ -1,4 +1,7 @@
|
|
1
1
|
#
|
2
|
+
# Copyright:: Copyright (c) Chef Software Inc.
|
3
|
+
# License:: Apache License, Version 2.0
|
4
|
+
#
|
2
5
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
3
6
|
# you may not use this file except in compliance with the License.
|
4
7
|
# You may obtain a copy of the License at
|
@@ -13,6 +16,7 @@
|
|
13
16
|
#
|
14
17
|
|
15
18
|
require_relative "../resource"
|
19
|
+
require_relative "../dist"
|
16
20
|
|
17
21
|
class Chef
|
18
22
|
class Resource
|
@@ -83,8 +87,7 @@ class Chef
|
|
83
87
|
def updated_ec2_config_xml
|
84
88
|
begin
|
85
89
|
require "rexml/document" unless defined?(REXML::Document)
|
86
|
-
|
87
|
-
config = REXML::Document.new(::File.read(config_file))
|
90
|
+
config = REXML::Document.new(::File.read(WINDOWS_EC2_CONFIG))
|
88
91
|
# find an element named State with a sibling element whose value is Ec2SetComputerName
|
89
92
|
REXML::XPath.each(config, "//Plugin/State[../Name/text() = 'Ec2SetComputerName']") do |element|
|
90
93
|
element.text = "Disabled"
|
@@ -199,24 +202,7 @@ class Chef
|
|
199
202
|
group node["root_group"]
|
200
203
|
mode "0644"
|
201
204
|
end
|
202
|
-
when ::File.exist?("/
|
203
|
-
# Solaris <= 5.10 systems prior to svccfg taking over this functionality (must come before svccfg handling)
|
204
|
-
declare_resource(:file, "/etc/nodename") do
|
205
|
-
content "#{new_resource.hostname}\n"
|
206
|
-
owner "root"
|
207
|
-
group node["root_group"]
|
208
|
-
mode "0644"
|
209
|
-
end
|
210
|
-
# Solaris also has /etc/inet/hosts (copypasta alert)
|
211
|
-
unless new_resource.ipaddress.nil?
|
212
|
-
newline = "#{new_resource.ipaddress} #{new_resource.hostname}"
|
213
|
-
newline << " #{new_resource.aliases.join(" ")}" if new_resource.aliases && !new_resource.aliases.empty?
|
214
|
-
newline << " #{new_resource.hostname[/[^\.]*/]}"
|
215
|
-
r = append_replacing_matching_lines("/etc/inet/hosts", /^#{new_resource.ipaddress}\s+|\s+#{new_resource.hostname}\s+/, newline)
|
216
|
-
r.notifies :reload, "ohai[reload hostname]"
|
217
|
-
end
|
218
|
-
when ::File.exist?("/usr/sbin/svccfg")
|
219
|
-
# Solaris >= 5.11 systems using svccfg (must come after /etc/nodename handling)
|
205
|
+
when ::File.exist?("/usr/sbin/svccfg") # solaris 5.11
|
220
206
|
declare_resource(:execute, "svccfg -s system/identity:node setprop config/nodename=\'#{new_resource.hostname}\'") do
|
221
207
|
notifies :run, "execute[svcadm refresh]", :immediately
|
222
208
|
notifies :run, "execute[svcadm restart]", :immediately
|
@@ -236,35 +222,36 @@ class Chef
|
|
236
222
|
end
|
237
223
|
|
238
224
|
else # windows
|
225
|
+
WINDOWS_EC2_CONFIG = 'C:\Program Files\Amazon\Ec2ConfigService\Settings\config.xml'.freeze
|
226
|
+
|
239
227
|
raise "Windows hostnames cannot contain a period." if new_resource.hostname.match?(/\./)
|
240
228
|
|
241
229
|
# suppress EC2 config service from setting our hostname
|
242
|
-
if ::File.exist?(
|
230
|
+
if ::File.exist?(WINDOWS_EC2_CONFIG)
|
243
231
|
xml_contents = updated_ec2_config_xml
|
244
232
|
if xml_contents.empty?
|
245
233
|
Chef::Log.warn('Unable to properly parse and update C:\Program Files\Amazon\Ec2ConfigService\Settings\config.xml contents. Skipping file update.')
|
246
234
|
else
|
247
|
-
|
235
|
+
file WINDOWS_EC2_CONFIG do
|
248
236
|
content xml_contents
|
249
237
|
end
|
250
238
|
end
|
251
239
|
end
|
252
240
|
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
not_if { Socket.gethostbyname(Socket.gethostname).first == new_resource.hostname }
|
261
|
-
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
|
262
248
|
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
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
|
268
255
|
end
|
269
256
|
end
|
270
257
|
end
|
@@ -19,11 +19,14 @@ class Chef
|
|
19
19
|
introduced "14.3"
|
20
20
|
examples <<~DOC
|
21
21
|
Install and load a kernel module, and ensure it loads on reboot.
|
22
|
+
|
22
23
|
```ruby
|
23
24
|
kernel_module 'loop'
|
24
25
|
```
|
26
|
+
|
25
27
|
Install and load a kernel with a specific set of options, and ensure it loads on reboot. Consult kernel module
|
26
28
|
documentation for specific options that are supported.
|
29
|
+
|
27
30
|
```ruby
|
28
31
|
kernel_module 'loop' do
|
29
32
|
options [
|
@@ -32,31 +35,41 @@ class Chef
|
|
32
35
|
]
|
33
36
|
end
|
34
37
|
```
|
38
|
+
|
35
39
|
Load a kernel module.
|
40
|
+
|
36
41
|
```ruby
|
37
42
|
kernel_module 'loop' do
|
38
43
|
action :load
|
39
44
|
end
|
40
45
|
```
|
41
|
-
|
46
|
+
|
47
|
+
Unload a kernel module and remove module config, so it doesn't load on reboot.
|
48
|
+
|
42
49
|
```ruby
|
43
50
|
kernel_module 'loop' do
|
44
51
|
action :uninstall
|
45
52
|
end
|
46
53
|
```
|
54
|
+
|
47
55
|
Unload kernel module.
|
56
|
+
|
48
57
|
```ruby
|
49
58
|
kernel_module 'loop' do
|
50
59
|
action :unload
|
51
60
|
end
|
52
61
|
```
|
62
|
+
|
53
63
|
Blacklist a module from loading.
|
64
|
+
|
54
65
|
```ruby
|
55
66
|
kernel_module 'loop' do
|
56
67
|
action :blacklist
|
57
68
|
end
|
58
69
|
```
|
70
|
+
|
59
71
|
Disable a kernel module.
|
72
|
+
|
60
73
|
```ruby
|
61
74
|
kernel_module 'loop' do
|
62
75
|
action :disable
|
@@ -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
|