chef 16.0.257 → 16.2.44
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +3 -1
- data/README.md +3 -3
- data/Rakefile +44 -16
- data/chef.gemspec +4 -4
- data/lib/chef/application/apply.rb +2 -2
- data/lib/chef/application/base.rb +1 -1
- data/lib/chef/application/client.rb +1 -1
- data/lib/chef/application/exit_code.rb +2 -2
- data/lib/chef/application/windows_service_manager.rb +1 -1
- data/lib/chef/chef_fs/chef_fs_data_store.rb +3 -3
- data/lib/chef/chef_fs/data_handler/data_bag_item_data_handler.rb +1 -1
- data/lib/chef/chef_fs/file_system/chef_server/acls_dir.rb +1 -1
- data/lib/chef/chef_fs/file_system/chef_server/cookbook_file.rb +1 -1
- data/lib/chef/chef_fs/file_system/chef_server/policies_dir.rb +1 -1
- data/lib/chef/chef_fs/file_system/chef_server/rest_list_dir.rb +1 -1
- data/lib/chef/chef_fs/file_system/multiplexed_dir.rb +1 -1
- data/lib/chef/chef_fs/file_system/repository/directory.rb +1 -1
- data/lib/chef/chef_fs/parallelizer/parallel_enumerable.rb +1 -1
- data/lib/chef/chef_fs/path_utils.rb +4 -4
- data/lib/chef/cookbook/chefignore.rb +1 -1
- data/lib/chef/cookbook/file_system_file_vendor.rb +1 -1
- data/lib/chef/cookbook/metadata.rb +2 -2
- data/lib/chef/cookbook_loader.rb +1 -1
- data/lib/chef/cookbook_manifest.rb +1 -1
- data/lib/chef/cookbook_site_streaming_uploader.rb +1 -1
- data/lib/chef/cookbook_version.rb +7 -7
- data/lib/chef/data_bag.rb +4 -4
- data/lib/chef/data_collector.rb +1 -1
- data/lib/chef/data_collector/error_handlers.rb +1 -1
- data/lib/chef/decorator/lazy_array.rb +2 -2
- data/lib/chef/deprecated.rb +5 -1
- data/lib/chef/digester.rb +4 -4
- data/lib/chef/dsl/declare_resource.rb +1 -1
- data/lib/chef/dsl/platform_introspection.rb +1 -1
- data/lib/chef/encrypted_data_bag_item/decryptor.rb +1 -1
- data/lib/chef/encrypted_data_bag_item/encryptor.rb +1 -1
- data/lib/chef/file_access_control.rb +1 -1
- data/lib/chef/formatters/base.rb +1 -1
- data/lib/chef/formatters/error_inspectors/compile_error_inspector.rb +1 -1
- data/lib/chef/formatters/error_inspectors/node_load_error_inspector.rb +2 -2
- data/lib/chef/formatters/error_inspectors/registration_error_inspector.rb +7 -7
- data/lib/chef/formatters/error_inspectors/resource_failure_inspector.rb +3 -3
- data/lib/chef/http.rb +18 -3
- data/lib/chef/http/decompressor.rb +1 -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/json_compat.rb +1 -1
- data/lib/chef/key.rb +1 -1
- data/lib/chef/knife.rb +2 -2
- data/lib/chef/knife/bootstrap.rb +13 -16
- data/lib/chef/knife/bootstrap/chef_vault_handler.rb +1 -1
- data/lib/chef/knife/bootstrap/client_builder.rb +1 -1
- data/lib/chef/knife/bootstrap/templates/chef-full.erb +9 -9
- data/lib/chef/knife/bootstrap/templates/windows-chef-client-msi.erb +3 -1
- data/lib/chef/knife/client_bulk_delete.rb +1 -1
- data/lib/chef/knife/config_get.rb +1 -1
- data/lib/chef/knife/cookbook_delete.rb +1 -1
- data/lib/chef/knife/core/cookbook_scm_repo.rb +1 -1
- data/lib/chef/knife/core/hashed_command_loader.rb +1 -1
- data/lib/chef/knife/core/node_presenter.rb +1 -1
- data/lib/chef/knife/core/status_presenter.rb +1 -1
- data/lib/chef/knife/core/subcommand_loader.rb +1 -1
- data/lib/chef/knife/core/windows_bootstrap_context.rb +18 -3
- data/lib/chef/knife/data_bag_create.rb +1 -1
- data/lib/chef/knife/environment_compare.rb +1 -1
- data/lib/chef/knife/key_create_base.rb +1 -1
- data/lib/chef/knife/key_edit_base.rb +1 -1
- data/lib/chef/knife/list.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/role_bulk_delete.rb +1 -1
- data/lib/chef/knife/ssh.rb +2 -2
- data/lib/chef/knife/supermarket_install.rb +1 -1
- data/lib/chef/knife/supermarket_share.rb +1 -1
- data/lib/chef/knife/supermarket_unshare.rb +1 -1
- data/lib/chef/knife/{user_invite_recind.rb → user_invite_rescind.rb} +6 -6
- data/lib/chef/knife/yaml_convert.rb +2 -2
- data/lib/chef/log.rb +1 -1
- data/lib/chef/mixin/api_version_request_handling.rb +1 -1
- data/lib/chef/mixin/checksum.rb +0 -1
- data/lib/chef/mixin/create_path.rb +8 -8
- data/lib/chef/mixin/openssl_helper.rb +4 -4
- data/lib/chef/mixin/properties.rb +4 -2
- data/lib/chef/mixin/securable.rb +2 -2
- data/lib/chef/mixin/shell_out.rb +1 -1
- data/lib/chef/node/attribute.rb +2 -2
- data/lib/chef/node/immutable_collections.rb +1 -1
- data/lib/chef/node/mixin/deep_merge_cache.rb +7 -7
- data/lib/chef/policy_builder/policyfile.rb +1 -1
- data/lib/chef/powershell.rb +1 -1
- data/lib/chef/property.rb +2 -2
- data/lib/chef/provider.rb +3 -3
- data/lib/chef/provider/batch.rb +3 -10
- data/lib/chef/provider/cron.rb +2 -14
- data/lib/chef/provider/directory.rb +1 -1
- data/lib/chef/provider/execute.rb +3 -2
- data/lib/chef/provider/file.rb +1 -1
- 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/launchd.rb +28 -32
- data/lib/chef/provider/mount/aix.rb +1 -1
- data/lib/chef/provider/mount/windows.rb +2 -2
- data/lib/chef/provider/noop.rb +1 -1
- data/lib/chef/provider/package/cab.rb +1 -1
- data/lib/chef/provider/package/chocolatey.rb +1 -1
- data/lib/chef/provider/package/dpkg.rb +1 -1
- data/lib/chef/provider/package/freebsd/base.rb +2 -1
- data/lib/chef/provider/package/homebrew.rb +1 -1
- data/lib/chef/provider/package/macports.rb +0 -2
- data/lib/chef/provider/package/openbsd.rb +1 -1
- data/lib/chef/provider/package/portage.rb +3 -2
- data/lib/chef/provider/package/powershell.rb +6 -2
- data/lib/chef/provider/package/rubygems.rb +3 -3
- data/lib/chef/provider/package/snap.rb +96 -27
- data/lib/chef/provider/package/windows.rb +27 -52
- 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/yum.rb +1 -1
- data/lib/chef/provider/package/yum/yum_cache.rb +1 -1
- data/lib/chef/provider/powershell_script.rb +11 -15
- data/lib/chef/provider/remote_directory.rb +2 -2
- data/lib/chef/provider/remote_file/http.rb +4 -1
- data/lib/chef/provider/script.rb +4 -75
- data/lib/chef/provider/service/arch.rb +2 -2
- data/lib/chef/provider/service/debian.rb +2 -2
- data/lib/chef/provider/service/macosx.rb +13 -2
- data/lib/chef/provider/service/openbsd.rb +4 -4
- data/lib/chef/provider/service/redhat.rb +1 -1
- data/lib/chef/provider/service/simple.rb +3 -3
- data/lib/chef/provider/service/upstart.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/aix.rb +1 -1
- data/lib/chef/provider/user/dscl.rb +7 -7
- data/lib/chef/provider/user/linux.rb +3 -3
- data/lib/chef/provider/user/mac.rb +15 -11
- data/lib/chef/provider/windows_script.rb +87 -25
- data/lib/chef/provider/windows_task.rb +5 -3
- data/lib/chef/provider/zypper_repository.rb +30 -10
- data/lib/chef/resource.rb +25 -14
- data/lib/chef/resource/alternatives.rb +65 -4
- data/lib/chef/resource/apt_package.rb +31 -2
- data/lib/chef/resource/apt_preference.rb +34 -5
- data/lib/chef/resource/apt_repository.rb +22 -15
- data/lib/chef/resource/apt_update.rb +6 -4
- data/lib/chef/resource/archive_file.rb +33 -12
- data/lib/chef/resource/bash.rb +1 -2
- data/lib/chef/resource/batch.rb +5 -3
- data/lib/chef/resource/bff_package.rb +1 -1
- data/lib/chef/resource/breakpoint.rb +1 -1
- data/lib/chef/resource/build_essential.rb +8 -4
- data/lib/chef/resource/cab_package.rb +1 -1
- data/lib/chef/resource/chef_client_cron.rb +12 -9
- data/lib/chef/resource/chef_client_scheduled_task.rb +22 -7
- data/lib/chef/resource/chef_client_systemd_timer.rb +10 -7
- data/lib/chef/resource/chef_gem.rb +6 -2
- data/lib/chef/resource/chef_handler.rb +3 -3
- data/lib/chef/resource/chef_sleep.rb +7 -4
- data/lib/chef/resource/chef_vault_secret.rb +4 -4
- data/lib/chef/resource/chocolatey_config.rb +5 -3
- data/lib/chef/resource/chocolatey_feature.rb +5 -3
- data/lib/chef/resource/chocolatey_package.rb +5 -3
- data/lib/chef/resource/chocolatey_source.rb +5 -3
- data/lib/chef/resource/cookbook_file.rb +3 -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} +28 -94
- data/lib/chef/resource/cron_access.rb +17 -6
- data/lib/chef/resource/csh.rb +1 -2
- data/lib/chef/resource/directory.rb +1 -1
- data/lib/chef/resource/dmg_package.rb +18 -15
- data/lib/chef/resource/dnf_package.rb +1 -1
- data/lib/chef/resource/dpkg_package.rb +1 -1
- data/lib/chef/resource/execute.rb +479 -9
- data/lib/chef/resource/file.rb +11 -8
- data/lib/chef/resource/freebsd_package.rb +2 -2
- data/lib/chef/resource/gem_package.rb +6 -6
- data/lib/chef/resource/group.rb +1 -1
- data/lib/chef/resource/helpers/cron_validations.rb +6 -3
- data/lib/chef/resource/homebrew_cask.rb +1 -1
- data/lib/chef/resource/homebrew_package.rb +30 -1
- data/lib/chef/resource/homebrew_tap.rb +1 -1
- data/lib/chef/resource/homebrew_update.rb +107 -0
- data/lib/chef/resource/hostname.rb +11 -24
- data/lib/chef/resource/http_request.rb +1 -1
- data/lib/chef/resource/ifconfig.rb +7 -7
- data/lib/chef/resource/ips_package.rb +1 -1
- data/lib/chef/resource/kernel_module.rb +15 -2
- data/lib/chef/resource/ksh.rb +1 -1
- data/lib/chef/resource/launchd.rb +5 -5
- data/lib/chef/resource/link.rb +4 -4
- data/lib/chef/resource/locale.rb +4 -4
- data/lib/chef/resource/log.rb +1 -1
- data/lib/chef/resource/macos_userdefaults.rb +15 -10
- data/lib/chef/resource/macosx_service.rb +1 -1
- data/lib/chef/resource/macports_package.rb +1 -1
- data/lib/chef/resource/mdadm.rb +1 -1
- data/lib/chef/resource/mount.rb +2 -2
- data/lib/chef/resource/msu_package.rb +2 -2
- data/lib/chef/resource/ohai.rb +1 -1
- data/lib/chef/resource/ohai_hint.rb +1 -1
- data/lib/chef/resource/openbsd_package.rb +1 -1
- data/lib/chef/resource/openssl_dhparam.rb +1 -1
- data/lib/chef/resource/openssl_ec_private_key.rb +1 -1
- data/lib/chef/resource/openssl_ec_public_key.rb +1 -1
- data/lib/chef/resource/openssl_rsa_private_key.rb +1 -1
- data/lib/chef/resource/openssl_rsa_public_key.rb +1 -1
- data/lib/chef/resource/openssl_x509_certificate.rb +1 -1
- data/lib/chef/resource/openssl_x509_crl.rb +1 -1
- data/lib/chef/resource/openssl_x509_request.rb +1 -1
- data/lib/chef/resource/osx_profile.rb +1 -1
- data/lib/chef/resource/package.rb +1 -1
- data/lib/chef/resource/pacman_package.rb +1 -1
- data/lib/chef/resource/paludis_package.rb +1 -1
- data/lib/chef/resource/perl.rb +1 -2
- data/lib/chef/resource/plist.rb +24 -5
- data/lib/chef/resource/portage_package.rb +1 -1
- data/lib/chef/resource/powershell_package.rb +1 -1
- data/lib/chef/resource/powershell_package_source.rb +1 -1
- data/lib/chef/resource/powershell_script.rb +5 -3
- data/lib/chef/resource/python.rb +1 -2
- data/lib/chef/resource/reboot.rb +1 -1
- data/lib/chef/resource/registry_key.rb +1 -1
- data/lib/chef/resource/remote_directory.rb +1 -1
- data/lib/chef/resource/remote_file.rb +26 -11
- data/lib/chef/resource/rhsm_errata.rb +1 -3
- data/lib/chef/resource/rhsm_errata_level.rb +1 -1
- data/lib/chef/resource/rhsm_register.rb +1 -2
- data/lib/chef/resource/rhsm_repo.rb +1 -2
- data/lib/chef/resource/rhsm_subscription.rb +1 -3
- data/lib/chef/resource/route.rb +1 -1
- data/lib/chef/resource/rpm_package.rb +5 -2
- data/lib/chef/resource/ruby.rb +1 -2
- data/lib/chef/resource/ruby_block.rb +1 -4
- data/lib/chef/resource/scm/_scm.rb +4 -3
- data/lib/chef/resource/scm/git.rb +2 -2
- data/lib/chef/resource/scm/subversion.rb +2 -2
- data/lib/chef/resource/script.rb +1 -1
- data/lib/chef/resource/service.rb +1 -1
- data/lib/chef/resource/smartos_package.rb +1 -1
- data/lib/chef/resource/snap_package.rb +1 -1
- data/lib/chef/resource/solaris_package.rb +1 -1
- data/lib/chef/resource/ssh_known_hosts_entry.rb +1 -1
- data/lib/chef/resource/sudo.rb +4 -4
- data/lib/chef/resource/swap_file.rb +2 -2
- data/lib/chef/resource/sysctl.rb +61 -2
- data/lib/chef/resource/systemd_unit.rb +2 -2
- data/lib/chef/resource/template.rb +1 -1
- data/lib/chef/resource/timezone.rb +1 -1
- data/lib/chef/resource/user.rb +2 -2
- data/lib/chef/resource/user_ulimit.rb +24 -22
- data/lib/chef/resource/windows_ad_join.rb +31 -2
- data/lib/chef/resource/windows_audit_policy.rb +227 -0
- data/lib/chef/resource/windows_auto_run.rb +13 -2
- data/lib/chef/resource/windows_certificate.rb +28 -2
- data/lib/chef/resource/windows_dfs_folder.rb +1 -1
- data/lib/chef/resource/windows_dfs_namespace.rb +1 -1
- data/lib/chef/resource/windows_dfs_server.rb +2 -2
- data/lib/chef/resource/windows_env.rb +10 -1
- data/lib/chef/resource/windows_feature.rb +57 -2
- data/lib/chef/resource/windows_feature_dism.rb +15 -2
- data/lib/chef/resource/windows_feature_powershell.rb +29 -2
- data/lib/chef/resource/windows_firewall_rule.rb +11 -7
- data/lib/chef/resource/windows_font.rb +13 -4
- data/lib/chef/resource/windows_package.rb +66 -6
- data/lib/chef/resource/windows_pagefile.rb +32 -4
- data/lib/chef/resource/windows_path.rb +18 -1
- data/lib/chef/resource/windows_printer.rb +26 -6
- data/lib/chef/resource/windows_printer_port.rb +29 -1
- data/lib/chef/resource/windows_script.rb +2 -16
- data/lib/chef/resource/windows_security_policy.rb +47 -16
- data/lib/chef/resource/windows_service.rb +1 -1
- data/lib/chef/resource/windows_share.rb +23 -3
- data/lib/chef/resource/windows_shortcut.rb +13 -3
- data/lib/chef/resource/windows_task.rb +143 -29
- data/lib/chef/resource/windows_uac.rb +20 -1
- data/lib/chef/resource/windows_user_privilege.rb +45 -3
- data/lib/chef/resource/windows_workgroup.rb +19 -3
- data/lib/chef/resource/yum_package.rb +88 -6
- data/lib/chef/resource/yum_repository.rb +36 -19
- data/lib/chef/resource/zypper_package.rb +29 -3
- data/lib/chef/resource/zypper_repository.rb +17 -5
- data/lib/chef/resource_inspector.rb +5 -4
- data/lib/chef/resources.rb +4 -2
- data/lib/chef/run_context/cookbook_compiler.rb +1 -1
- data/lib/chef/scan_access_control.rb +1 -1
- data/lib/chef/search/query.rb +1 -1
- data/lib/chef/shell/ext.rb +1 -1
- data/lib/chef/util/diff.rb +2 -2
- data/lib/chef/util/dsc/lcm_output_parser.rb +3 -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 +1 -1
- data/lib/chef/win32/api.rb +2 -2
- data/lib/chef/win32/api/error.rb +3 -1
- data/lib/chef/win32/api/file.rb +18 -18
- data/lib/chef/win32/api/net.rb +1 -0
- data/lib/chef/win32/file.rb +1 -1
- data/lib/chef/win32/mutex.rb +1 -1
- data/lib/chef/win32/net.rb +1 -0
- data/lib/chef/win32/process.rb +2 -2
- data/lib/chef/win32/registry.rb +2 -2
- data/lib/chef/win32/security.rb +1 -1
- data/lib/chef/win32/security/sid.rb +4 -4
- 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/resource/cron_spec.rb +10 -0
- data/spec/functional/resource/dnf_package_spec.rb +2 -2
- data/spec/functional/resource/git_spec.rb +6 -6
- data/spec/functional/resource/launchd_spec.rb +232 -0
- data/spec/functional/resource/link_spec.rb +3 -3
- data/spec/functional/resource/remote_file_spec.rb +3 -3
- data/spec/functional/resource/user/dscl_spec.rb +1 -1
- data/spec/functional/resource/user/mac_user_spec.rb +1 -1
- data/spec/functional/resource/windows_task_spec.rb +12 -12
- data/spec/integration/knife/raw_spec.rb +4 -4
- data/spec/integration/knife/redirection_spec.rb +2 -2
- data/spec/support/chef_helpers.rb +1 -1
- data/spec/support/platform_helpers.rb +1 -14
- 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 +1 -1
- data/spec/support/shared/functional/http.rb +2 -2
- data/spec/support/shared/functional/windows_script.rb +1 -1
- data/spec/support/shared/unit/execute_resource.rb +1 -1
- data/spec/support/shared/unit/mock_shellout.rb +1 -1
- data/spec/support/shared/unit/provider/useradd_based_user_provider.rb +4 -4
- data/spec/unit/application_spec.rb +7 -0
- data/spec/unit/data_bag_spec.rb +1 -1
- data/spec/unit/file_access_control_spec.rb +1 -1
- data/spec/unit/http/ssl_policies_spec.rb +20 -0
- data/spec/unit/knife/bootstrap_spec.rb +2 -2
- data/spec/unit/knife/core/windows_bootstrap_context_spec.rb +7 -1
- data/spec/unit/knife/role_env_run_list_add_spec.rb +6 -6
- data/spec/unit/knife/role_env_run_list_clear_spec.rb +4 -4
- data/spec/unit/knife/role_env_run_list_remove_spec.rb +4 -4
- data/spec/unit/knife/role_env_run_list_replace_spec.rb +4 -4
- data/spec/unit/knife/role_env_run_list_set_spec.rb +4 -4
- data/spec/unit/knife/role_run_list_add_spec.rb +6 -6
- data/spec/unit/knife/role_run_list_clear_spec.rb +4 -4
- data/spec/unit/knife/role_run_list_remove_spec.rb +4 -4
- data/spec/unit/knife/role_run_list_replace_spec.rb +4 -4
- data/spec/unit/knife/role_run_list_set_spec.rb +4 -4
- data/spec/unit/mixin/openssl_helper_spec.rb +4 -4
- data/spec/unit/mixin/shell_out_spec.rb +25 -31
- data/spec/unit/mixin/user_context_spec.rb +1 -9
- data/spec/unit/node/attribute_spec.rb +1 -1
- data/spec/unit/property_spec.rb +1 -1
- data/spec/unit/provider/apt_repository_spec.rb +27 -27
- data/spec/unit/provider/batch_spec.rb +130 -0
- data/spec/unit/provider/cron_spec.rb +9 -49
- data/spec/unit/provider/git_spec.rb +3 -3
- data/spec/unit/provider/group/groupadd_spec.rb +1 -1
- data/spec/unit/provider/launchd_spec.rb +8 -50
- data/spec/unit/provider/osx_profile_spec.rb +2 -2
- data/spec/unit/provider/package/msu_spec.rb +3 -3
- data/spec/unit/provider/package/portage_spec.rb +2 -2
- data/spec/unit/provider/package/powershell_spec.rb +96 -87
- data/spec/unit/provider/package/snap_spec.rb +1 -1
- data/spec/unit/provider/powershell_script_spec.rb +3 -45
- data/spec/unit/provider/script_spec.rb +20 -110
- data/spec/unit/provider/service/gentoo_service_spec.rb +1 -1
- data/spec/unit/provider/zypper_repository_spec.rb +75 -25
- data/spec/unit/provider_resolver_spec.rb +11 -11
- data/spec/unit/resource/archive_file_spec.rb +11 -2
- data/spec/unit/resource/chef_client_scheduled_task_spec.rb +17 -7
- data/spec/unit/resource/cron_spec.rb +2 -2
- 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/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_package_spec.rb +10 -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_spec.rb +67 -1
- data/spec/unit/run_context_spec.rb +1 -1
- data/spec/unit/util/dsc/configuration_generator_spec.rb +1 -1
- data/spec/unit/util/threaded_job_queue_spec.rb +9 -0
- data/spec/unit/win32/registry_spec.rb +1 -1
- metadata +28 -27
- data/lib/chef/resource/cron.rb +0 -157
@@ -31,7 +31,7 @@ class Chef
|
|
31
31
|
|
32
32
|
provides :cookbook_file
|
33
33
|
|
34
|
-
description "Use the cookbook_file resource to transfer files from a sub-directory of COOKBOOK_NAME/files/ to a specified path located on a host that is running the #{Chef::Dist::PRODUCT}. The file is selected according to file specificity, which allows different source files to be used based on the hostname, host platform (operating system, distro, or as appropriate), or platform version. Files that are located in the COOKBOOK_NAME/files/default sub-directory may be used on any platform.\n\nDuring a #{Chef::Dist::PRODUCT} run, the checksum for each local file is calculated and then compared against the checksum for the same file as it currently exists in the cookbook on the #{Chef::Dist::SERVER_PRODUCT}. A file is not transferred when the checksums match. Only files that require an update are transferred from the #{Chef::Dist::SERVER_PRODUCT} to a node."
|
34
|
+
description "Use the **cookbook_file** resource to transfer files from a sub-directory of COOKBOOK_NAME/files/ to a specified path located on a host that is running the #{Chef::Dist::PRODUCT}. The file is selected according to file specificity, which allows different source files to be used based on the hostname, host platform (operating system, distro, or as appropriate), or platform version. Files that are located in the COOKBOOK_NAME/files/default sub-directory may be used on any platform.\n\nDuring a #{Chef::Dist::PRODUCT} run, the checksum for each local file is calculated and then compared against the checksum for the same file as it currently exists in the cookbook on the #{Chef::Dist::SERVER_PRODUCT}. A file is not transferred when the checksums match. Only files that require an update are transferred from the #{Chef::Dist::SERVER_PRODUCT} to a node."
|
35
35
|
|
36
36
|
property :source, [ String, Array ],
|
37
37
|
description: "The name of the file in COOKBOOK_NAME/files/default or the path to a file located in COOKBOOK_NAME/files. The path must include the file name and its extension. This can be used to distribute specific files depending upon the platform used.",
|
@@ -39,7 +39,8 @@ class Chef
|
|
39
39
|
|
40
40
|
property :cookbook, String,
|
41
41
|
description: "The cookbook in which a file is located (if it is not located in the current cookbook).",
|
42
|
-
desired_state: false
|
42
|
+
desired_state: false,
|
43
|
+
default_description: "The current cookbook name"
|
43
44
|
|
44
45
|
default_action :create
|
45
46
|
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
unified_mode true
|
2
|
+
|
3
|
+
TIMEOUT_OPTS = %w{duration preserve-status foreground kill-after signal}.freeze
|
4
|
+
TIMEOUT_REGEX = /\A\S+/.freeze
|
5
|
+
WEEKDAYS = {
|
6
|
+
sunday: "0", monday: "1", tuesday: "2", wednesday: "3", thursday: "4", friday: "5", saturday: "6",
|
7
|
+
sun: "0", mon: "1", tue: "2", wed: "3", thu: "4", fri: "5", sat: "6"
|
8
|
+
}.freeze
|
9
|
+
|
10
|
+
property :minute, [Integer, String],
|
11
|
+
description: "The minute at which the cron entry should run (`0 - 59`).",
|
12
|
+
default: "*", callbacks: {
|
13
|
+
"should be a valid minute spec" => ->(spec) { Chef::ResourceHelpers::CronValidations.validate_numeric(spec, 0, 59) },
|
14
|
+
}
|
15
|
+
|
16
|
+
property :hour, [Integer, String],
|
17
|
+
description: "The hour at which the cron entry is to run (`0 - 23`).",
|
18
|
+
default: "*", callbacks: {
|
19
|
+
"should be a valid hour spec" => ->(spec) { Chef::ResourceHelpers::CronValidations.validate_numeric(spec, 0, 23) },
|
20
|
+
}
|
21
|
+
|
22
|
+
property :day, [Integer, String],
|
23
|
+
description: "The day of month at which the cron entry should run (`1 - 31`).",
|
24
|
+
default: "*", callbacks: {
|
25
|
+
"should be a valid day spec" => ->(spec) { Chef::ResourceHelpers::CronValidations.validate_numeric(spec, 1, 31) },
|
26
|
+
}
|
27
|
+
|
28
|
+
property :month, [Integer, String],
|
29
|
+
description: "The month in the year on which a cron entry is to run (`1 - 12`, `jan-dec`, or `*`).",
|
30
|
+
default: "*", callbacks: {
|
31
|
+
"should be a valid month spec" => ->(spec) { Chef::ResourceHelpers::CronValidations.validate_month(spec) },
|
32
|
+
}
|
33
|
+
|
34
|
+
property :weekday, [Integer, String, Symbol],
|
35
|
+
description: "The day of the week on which this entry is to run (`0-7`, `mon-sun`, `monday-sunday`, or `*`), where Sunday is both `0` and `7`.",
|
36
|
+
default: "*", coerce: proc { |day| weekday_in_crontab(day) },
|
37
|
+
callbacks: {
|
38
|
+
"should be a valid weekday spec" => ->(spec) { Chef::ResourceHelpers::CronValidations.validate_dow(spec) },
|
39
|
+
}
|
40
|
+
|
41
|
+
property :shell, String,
|
42
|
+
description: "Set the `SHELL` environment variable."
|
43
|
+
|
44
|
+
property :path, String,
|
45
|
+
description: "Set the `PATH` environment variable."
|
46
|
+
|
47
|
+
property :home, String,
|
48
|
+
description: "Set the `HOME` environment variable."
|
49
|
+
|
50
|
+
property :mailto, String,
|
51
|
+
description: "Set the `MAILTO` environment variable."
|
52
|
+
|
53
|
+
property :command, String,
|
54
|
+
description: "The command to be run, or the path to a file that contains the command to be run.",
|
55
|
+
identity: true,
|
56
|
+
required: [:create]
|
57
|
+
|
58
|
+
property :user, String,
|
59
|
+
description: "The name of the user that runs the command.",
|
60
|
+
default: "root"
|
61
|
+
|
62
|
+
property :environment, Hash,
|
63
|
+
description: "A Hash containing additional arbitrary environment variables under which the cron job will be run in the form of `({'ENV_VARIABLE' => 'VALUE'})`. **Note**: These variables must exist for a command to be run successfully.",
|
64
|
+
default: lazy { {} }
|
65
|
+
|
66
|
+
property :time_out, Hash,
|
67
|
+
description: "A Hash of timeouts in the form of `({'OPTION' => 'VALUE'})`. Accepted valid options are:
|
68
|
+
- `preserve-status` (BOOL, default: 'false'),
|
69
|
+
- `foreground` (BOOL, default: 'false'),
|
70
|
+
- `kill-after` (in seconds),
|
71
|
+
- `signal` (a name like 'HUP' or a number)",
|
72
|
+
default: lazy { {} },
|
73
|
+
introduced: "15.7",
|
74
|
+
coerce: proc { |h|
|
75
|
+
if h.is_a?(Hash)
|
76
|
+
invalid_keys = h.keys - TIMEOUT_OPTS
|
77
|
+
unless invalid_keys.empty?
|
78
|
+
error_msg = "Key of option time_out must be equal to one of: \"#{TIMEOUT_OPTS.join('", "')}\"! You passed \"#{invalid_keys.join(", ")}\"."
|
79
|
+
raise Chef::Exceptions::ValidationFailed, error_msg
|
80
|
+
end
|
81
|
+
unless h.values.all? { |x| x =~ TIMEOUT_REGEX }
|
82
|
+
error_msg = "Values of option time_out should be non-empty strings without any leading whitespace."
|
83
|
+
raise Chef::Exceptions::ValidationFailed, error_msg
|
84
|
+
end
|
85
|
+
h
|
86
|
+
elsif h.is_a?(Integer) || h.is_a?(String)
|
87
|
+
{ "duration" => h }
|
88
|
+
end
|
89
|
+
}
|
90
|
+
|
91
|
+
private
|
92
|
+
# Convert weekday input value into crontab format that
|
93
|
+
# could be written in the crontab
|
94
|
+
# @return [Integer, String] A weekday formed as per the user inputs.
|
95
|
+
def weekday_in_crontab(day)
|
96
|
+
weekday = day.to_s.downcase.to_sym
|
97
|
+
WEEKDAYS[weekday] || day
|
98
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Bryan McLellan (btm@loftninjas.org)
|
3
|
+
# Author:: Tyler Cloke (<tyler@chef.io>)
|
4
|
+
# Copyright:: Copyright 2009-2016, Bryan McLellan
|
5
|
+
# License:: Apache License, Version 2.0
|
6
|
+
#
|
7
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
8
|
+
# you may not use this file except in compliance with the License.
|
9
|
+
# You may obtain a copy of the License at
|
10
|
+
#
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
12
|
+
#
|
13
|
+
# Unless required by applicable law or agreed to in writing, software
|
14
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
15
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
16
|
+
# See the License for the specific language governing permissions and
|
17
|
+
# limitations under the License.
|
18
|
+
#
|
19
|
+
|
20
|
+
require_relative "../../resource"
|
21
|
+
require_relative "../helpers/cron_validations"
|
22
|
+
require_relative "../../provider/cron" # do not remove. we actually need this below
|
23
|
+
|
24
|
+
class Chef
|
25
|
+
class Resource
|
26
|
+
class Cron < Chef::Resource
|
27
|
+
unified_mode true
|
28
|
+
|
29
|
+
use "cron_shared"
|
30
|
+
|
31
|
+
provides :cron
|
32
|
+
|
33
|
+
description "Use the **cron** resource to manage cron entries for time-based job scheduling. Properties for a schedule will default to * if not provided. The cron resource requires access to a crontab program, typically cron."
|
34
|
+
|
35
|
+
state_attrs :minute, :hour, :day, :month, :weekday, :user
|
36
|
+
|
37
|
+
default_action :create
|
38
|
+
allowed_actions :create, :delete
|
39
|
+
|
40
|
+
property :time, Symbol,
|
41
|
+
description: "A time interval.",
|
42
|
+
equal_to: Chef::Provider::Cron::SPECIAL_TIME_VALUES
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -15,21 +15,25 @@
|
|
15
15
|
# limitations under the License.
|
16
16
|
#
|
17
17
|
|
18
|
-
require_relative "
|
19
|
-
require_relative "helpers/cron_validations"
|
18
|
+
require_relative "../../resource"
|
19
|
+
require_relative "../helpers/cron_validations"
|
20
20
|
require "shellwords" unless defined?(Shellwords)
|
21
|
-
require_relative "
|
21
|
+
require_relative "../../dist"
|
22
22
|
|
23
23
|
class Chef
|
24
24
|
class Resource
|
25
25
|
class CronD < Chef::Resource
|
26
26
|
unified_mode true
|
27
|
+
|
28
|
+
use "cron_shared"
|
29
|
+
|
27
30
|
provides :cron_d
|
28
31
|
|
29
32
|
introduced "14.4"
|
30
|
-
description "Use the cron_d resource to manage cron
|
33
|
+
description "Use the **cron_d** resource to manage cron job files in the /etc/cron.d directory. This is similar to the 'cron' resource, but it does not use the monolithic /etc/crontab file."
|
31
34
|
examples <<~DOC
|
32
|
-
|
35
|
+
**Run a program on the fifth hour of the day**
|
36
|
+
|
33
37
|
```ruby
|
34
38
|
cron_d 'noop' do
|
35
39
|
hour '5'
|
@@ -38,7 +42,8 @@ class Chef
|
|
38
42
|
end
|
39
43
|
```
|
40
44
|
|
41
|
-
|
45
|
+
**Run an entry if a folder exists**
|
46
|
+
|
42
47
|
```ruby
|
43
48
|
cron_d 'ganglia_tomcat_thread_max' do
|
44
49
|
command "/usr/bin/gmetric
|
@@ -50,18 +55,21 @@ class Chef
|
|
50
55
|
end
|
51
56
|
```
|
52
57
|
|
53
|
-
|
58
|
+
**Run an entry every Saturday, 8:00 AM**
|
59
|
+
|
54
60
|
```ruby
|
55
61
|
cron_d 'name_of_cron_entry' do
|
56
62
|
minute '0'
|
57
63
|
hour '8'
|
58
64
|
weekday '6'
|
59
65
|
mailto 'admin@example.com'
|
66
|
+
command "/bin/true"
|
60
67
|
action :create
|
61
68
|
end
|
62
69
|
```
|
63
70
|
|
64
|
-
|
71
|
+
**Run an entry at 8:00 PM, every weekday (Monday through Friday), but only in November**
|
72
|
+
|
65
73
|
```ruby
|
66
74
|
cron_d 'name_of_cron_entry' do
|
67
75
|
minute '0'
|
@@ -69,113 +77,39 @@ class Chef
|
|
69
77
|
day '*'
|
70
78
|
month '11'
|
71
79
|
weekday '1-5'
|
80
|
+
command "/bin/true"
|
72
81
|
action :create
|
73
82
|
end
|
74
83
|
```
|
84
|
+
|
85
|
+
**Remove a cron job by name**:
|
86
|
+
|
87
|
+
```ruby
|
88
|
+
cron_d 'job_to_remove' do
|
89
|
+
action :delete
|
90
|
+
end
|
91
|
+
```
|
75
92
|
DOC
|
76
93
|
|
77
94
|
property :cron_name, String,
|
78
95
|
description: "An optional property to set the cron name if it differs from the resource block's name.",
|
79
96
|
name_property: true
|
80
97
|
|
81
|
-
property :cookbook, String, desired_state: false
|
98
|
+
property :cookbook, String, desired_state: false, skip_docs: true
|
82
99
|
|
83
100
|
property :predefined_value, String,
|
84
101
|
description: "Schedule your cron job with one of the special predefined value instead of ** * pattern.",
|
85
102
|
equal_to: %w{ @reboot @yearly @annually @monthly @weekly @daily @midnight @hourly }
|
86
103
|
|
87
|
-
property :minute, [Integer, String],
|
88
|
-
description: "The minute at which the cron entry should run (0 - 59).",
|
89
|
-
default: "*", callbacks: {
|
90
|
-
"should be a valid minute spec" => ->(spec) { Chef::ResourceHelpers::CronValidations.validate_numeric(spec, 0, 59) },
|
91
|
-
}
|
92
|
-
|
93
|
-
property :hour, [Integer, String],
|
94
|
-
description: "The hour at which the cron entry is to run (0 - 23).",
|
95
|
-
default: "*", callbacks: {
|
96
|
-
"should be a valid hour spec" => ->(spec) { Chef::ResourceHelpers::CronValidations.validate_numeric(spec, 0, 23) },
|
97
|
-
}
|
98
|
-
|
99
|
-
property :day, [Integer, String],
|
100
|
-
description: "The day of month at which the cron entry should run (1 - 31).",
|
101
|
-
default: "*", callbacks: {
|
102
|
-
"should be a valid day spec" => ->(spec) { Chef::ResourceHelpers::CronValidations.validate_numeric(spec, 1, 31) },
|
103
|
-
}
|
104
|
-
|
105
|
-
property :month, [Integer, String],
|
106
|
-
description: "The month in the year on which a cron entry is to run (1 - 12, jan-dec, or *).",
|
107
|
-
default: "*", callbacks: {
|
108
|
-
"should be a valid month spec" => ->(spec) { Chef::ResourceHelpers::CronValidations.validate_month(spec) },
|
109
|
-
}
|
110
|
-
|
111
|
-
property :weekday, [Integer, String],
|
112
|
-
description: "The day of the week on which this entry is to run (0-7, mon-sun, or *), where Sunday is both 0 and 7.",
|
113
|
-
default: "*", callbacks: {
|
114
|
-
"should be a valid weekday spec" => ->(spec) { Chef::ResourceHelpers::CronValidations.validate_dow(spec) },
|
115
|
-
}
|
116
|
-
|
117
|
-
property :command, String,
|
118
|
-
description: "The command to run.",
|
119
|
-
required: true
|
120
|
-
|
121
|
-
property :user, String,
|
122
|
-
description: "The name of the user that runs the command.",
|
123
|
-
default: "root"
|
124
|
-
|
125
|
-
property :mailto, String,
|
126
|
-
description: "Set the MAILTO environment variable in the cron.d file."
|
127
|
-
|
128
|
-
property :path, String,
|
129
|
-
description: "Set the PATH environment variable in the cron.d file."
|
130
|
-
|
131
|
-
property :home, String,
|
132
|
-
description: "Set the HOME environment variable in the cron.d file."
|
133
|
-
|
134
|
-
property :shell, String,
|
135
|
-
description: "Set the SHELL environment variable in the cron.d file."
|
136
|
-
|
137
104
|
property :comment, String,
|
138
105
|
description: "A comment to place in the cron.d file."
|
139
106
|
|
140
|
-
property :environment, Hash,
|
141
|
-
description: "A Hash containing additional arbitrary environment variables under which the cron job will be run in the form of ``({'ENV_VARIABLE' => 'VALUE'})``.",
|
142
|
-
default: lazy { {} }
|
143
|
-
|
144
|
-
TIMEOUT_OPTS = %w{duration preserve-status foreground kill-after signal}.freeze
|
145
|
-
TIMEOUT_REGEX = /\A\S+/.freeze
|
146
|
-
|
147
|
-
property :time_out, Hash,
|
148
|
-
description: "A Hash of timeouts in the form of ({'OPTION' => 'VALUE'}).
|
149
|
-
Accepted valid options are:
|
150
|
-
preserve-status (BOOL, default: 'false'),
|
151
|
-
foreground (BOOL, default: 'false'),
|
152
|
-
kill-after (in seconds),
|
153
|
-
signal (a name like 'HUP' or a number)",
|
154
|
-
default: lazy { {} },
|
155
|
-
introduced: "15.7",
|
156
|
-
coerce: proc { |h|
|
157
|
-
if h.is_a?(Hash)
|
158
|
-
invalid_keys = h.keys - TIMEOUT_OPTS
|
159
|
-
unless invalid_keys.empty?
|
160
|
-
error_msg = "Key of option time_out must be equal to one of: \"#{TIMEOUT_OPTS.join('", "')}\"! You passed \"#{invalid_keys.join(", ")}\"."
|
161
|
-
raise Chef::Exceptions::ValidationFailed, error_msg
|
162
|
-
end
|
163
|
-
unless h.values.all? { |x| x =~ TIMEOUT_REGEX }
|
164
|
-
error_msg = "Values of option time_out should be non-empty string without any leading whitespaces."
|
165
|
-
raise Chef::Exceptions::ValidationFailed, error_msg
|
166
|
-
end
|
167
|
-
h
|
168
|
-
elsif h.is_a?(Integer) || h.is_a?(String)
|
169
|
-
{ "duration" => h }
|
170
|
-
end
|
171
|
-
}
|
172
|
-
|
173
107
|
property :mode, [String, Integer],
|
174
108
|
description: "The octal mode of the generated crontab file.",
|
175
109
|
default: "0600"
|
176
110
|
|
177
111
|
property :random_delay, Integer,
|
178
|
-
description: "Set the RANDOM_DELAY environment variable in the cron.d file."
|
112
|
+
description: "Set the `RANDOM_DELAY` environment variable in the cron.d file."
|
179
113
|
|
180
114
|
# warn if someone passes the deprecated cookbook property
|
181
115
|
def after_created
|
@@ -224,7 +158,7 @@ class Chef
|
|
224
158
|
|
225
159
|
# @todo this is Chef 12 era cleanup. Someday we should remove it all
|
226
160
|
template "/etc/cron.d/#{sanitized_name}" do
|
227
|
-
source ::File.expand_path("
|
161
|
+
source ::File.expand_path("../../support/cron.d.erb", __FILE__)
|
228
162
|
local true
|
229
163
|
mode new_resource.mode
|
230
164
|
variables(
|
@@ -28,21 +28,24 @@ class Chef
|
|
28
28
|
provides(:cron_manage) # legacy name @todo in Chef 15 we should { true } this so it wins over the cookbook
|
29
29
|
|
30
30
|
introduced "14.4"
|
31
|
-
description "Use the cron_access resource to manage
|
31
|
+
description "Use the **cron_access** resource to manage cron's cron.allow and cron.deny files. Note: This resource previously shipped in the `cron` cookbook as `cron_manage`, which it can still be used as for backwards compatibility with existing Chef Infra Client releases."
|
32
32
|
examples <<~DOC
|
33
|
-
Add the mike user to cron.allow
|
33
|
+
**Add the mike user to cron.allow**
|
34
|
+
|
34
35
|
```ruby
|
35
36
|
cron_access 'mike'
|
36
37
|
```
|
37
38
|
|
38
|
-
Add the mike user to cron.deny
|
39
|
+
**Add the mike user to cron.deny**
|
40
|
+
|
39
41
|
```ruby
|
40
42
|
cron_access 'mike' do
|
41
43
|
action :deny
|
42
44
|
end
|
43
45
|
```
|
44
46
|
|
45
|
-
Specify the username with the user property
|
47
|
+
**Specify the username with the user property**
|
48
|
+
|
46
49
|
```ruby
|
47
50
|
cron_access 'Deny the jenkins user access to cron for security purposes' do
|
48
51
|
user 'jenkins'
|
@@ -55,11 +58,18 @@ class Chef
|
|
55
58
|
description: "An optional property to set the user name if it differs from the resource block's name.",
|
56
59
|
name_property: true
|
57
60
|
|
61
|
+
CRON_PATHS = {
|
62
|
+
"aix" => "/var/adm/cron",
|
63
|
+
"solaris" => "/etc/cron.d",
|
64
|
+
"default" => "/etc",
|
65
|
+
}.freeze
|
66
|
+
|
58
67
|
action :allow do
|
59
68
|
description "Add the user to the cron.allow file."
|
69
|
+
allow_path = ::File.join(value_for_platform_family(CRON_PATHS), "cron.allow")
|
60
70
|
|
61
71
|
with_run_context :root do
|
62
|
-
edit_resource(:template,
|
72
|
+
edit_resource(:template, allow_path) do |new_resource|
|
63
73
|
source ::File.expand_path("../support/cron_access.erb", __FILE__)
|
64
74
|
local true
|
65
75
|
mode "0600"
|
@@ -73,9 +83,10 @@ class Chef
|
|
73
83
|
|
74
84
|
action :deny do
|
75
85
|
description "Add the user to the cron.deny file."
|
86
|
+
deny_path = ::File.join(value_for_platform_family(CRON_PATHS), "cron.deny")
|
76
87
|
|
77
88
|
with_run_context :root do
|
78
|
-
edit_resource(:template,
|
89
|
+
edit_resource(:template, deny_path) do |new_resource|
|
79
90
|
source ::File.expand_path("../support/cron_access.erb", __FILE__)
|
80
91
|
local true
|
81
92
|
mode "0600"
|
data/lib/chef/resource/csh.rb
CHANGED
@@ -17,7 +17,6 @@
|
|
17
17
|
#
|
18
18
|
|
19
19
|
require_relative "script"
|
20
|
-
require_relative "../provider/script"
|
21
20
|
|
22
21
|
class Chef
|
23
22
|
class Resource
|
@@ -26,7 +25,7 @@ class Chef
|
|
26
25
|
|
27
26
|
provides :csh
|
28
27
|
|
29
|
-
description "Use the csh resource to execute scripts using the csh interpreter."\
|
28
|
+
description "Use the **csh** resource to execute scripts using the csh interpreter."\
|
30
29
|
" This resource may also use any of the actions and properties that are"\
|
31
30
|
" available to the execute resource. Commands that are executed with this"\
|
32
31
|
" resource are (by their nature) not idempotent, as they are typically"\
|
@@ -28,7 +28,7 @@ class Chef
|
|
28
28
|
|
29
29
|
provides :directory
|
30
30
|
|
31
|
-
description "Use the directory resource to manage a directory, which is a hierarchy"\
|
31
|
+
description "Use the **directory** resource to manage a directory, which is a hierarchy"\
|
32
32
|
" of folders that comprises all of the information stored on a computer."\
|
33
33
|
" The root directory is the top-level, under which the rest of the directory"\
|
34
34
|
" is organized. The directory resource uses the name property to specify the"\
|