chef 16.0.287 → 16.2.73
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 +2 -3
- data/README.md +3 -3
- data/Rakefile +3 -2
- data/chef.gemspec +5 -5
- 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/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 +2 -2
- 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 +4 -4
- 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 +4 -0
- data/lib/chef/digester.rb +5 -4
- data/lib/chef/dsl/declare_resource.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/file_access_control/windows.rb +2 -2
- data/lib/chef/file_content_management/deploy/mv_unix.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 +19 -4
- 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 +20 -14
- 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/config_use_profile.rb +15 -5
- data/lib/chef/knife/cookbook_delete.rb +1 -1
- data/lib/chef/knife/cookbook_upload.rb +1 -4
- 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/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 +19 -4
- data/lib/chef/knife/data_bag_create.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/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_share.rb +1 -1
- data/lib/chef/knife/supermarket_unshare.rb +1 -1
- 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/openssl_helper.rb +4 -4
- data/lib/chef/mixin/properties.rb +2 -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/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 +2 -1
- 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 +11 -9
- 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/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 +2 -2
- 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 +9 -0
- data/lib/chef/provider/service/openbsd.rb +4 -4
- data/lib/chef/provider/service/redhat.rb +1 -1
- 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 +6 -6
- 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 +4 -2
- data/lib/chef/provider/zypper_repository.rb +30 -10
- data/lib/chef/resource.rb +25 -14
- 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/chef_client_scheduled_task.rb +13 -1
- data/lib/chef/resource/chef_gem.rb +57 -21
- data/lib/chef/resource/chef_handler.rb +2 -2
- data/lib/chef/resource/chef_vault_secret.rb +1 -1
- 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 +11 -3
- data/lib/chef/resource/csh.rb +0 -1
- data/lib/chef/resource/dmg_package.rb +2 -2
- data/lib/chef/resource/execute.rb +478 -8
- data/lib/chef/resource/file.rb +10 -8
- 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 +7 -20
- data/lib/chef/resource/kernel_module.rb +14 -1
- data/lib/chef/resource/launchd.rb +1 -1
- data/lib/chef/resource/locale.rb +3 -3
- data/lib/chef/resource/macos_userdefaults.rb +11 -6
- data/lib/chef/resource/mount.rb +1 -1
- 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/scm/git.rb +1 -1
- data/lib/chef/resource/ssh_known_hosts_entry.rb +15 -0
- data/lib/chef/resource/sudo.rb +29 -2
- 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/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 +27 -1
- data/lib/chef/resource/windows_dfs_server.rb +1 -1
- 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 +2 -2
- data/lib/chef/resource/windows_script.rb +2 -16
- data/lib/chef/resource/windows_security_policy.rb +47 -16
- data/lib/chef/resource/windows_shortcut.rb +1 -2
- data/lib/chef/resource/windows_task.rb +10 -10
- data/lib/chef/resource/windows_user_privilege.rb +70 -5
- data/lib/chef/resource/yum_repository.rb +9 -9
- data/lib/chef/resource_inspector.rb +4 -3
- data/lib/chef/resources.rb +4 -2
- data/lib/chef/run_context/cookbook_compiler.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/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 +1 -1
- 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/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/knife/configure_spec.rb +1 -1
- data/spec/functional/resource/aix_service_spec.rb +10 -1
- data/spec/functional/resource/aixinit_service_spec.rb +1 -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 -1
- data/spec/functional/resource/dnf_package_spec.rb +6 -3
- data/spec/functional/resource/execute_spec.rb +1 -1
- data/spec/functional/resource/git_spec.rb +6 -6
- data/spec/functional/resource/group_spec.rb +9 -1
- data/spec/functional/resource/ifconfig_spec.rb +9 -1
- data/spec/functional/resource/insserv_spec.rb +3 -2
- data/spec/functional/resource/launchd_spec.rb +232 -0
- 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 +8 -8
- 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 +16 -15
- data/spec/functional/resource/windows_user_privilege_spec.rb +0 -1
- data/spec/functional/resource/yum_package_spec.rb +4 -1
- data/spec/functional/resource/zypper_package_spec.rb +4 -1
- data/spec/functional/shell_spec.rb +0 -1
- data/spec/functional/win32/crypto_spec.rb +1 -1
- data/spec/integration/knife/config_use_profile_spec.rb +55 -2
- data/spec/integration/knife/cookbook_upload_spec.rb +1 -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/recipe_dsl_spec.rb +4 -0
- data/spec/integration/recipes/resource_load_spec.rb +2 -2
- data/spec/support/chef_helpers.rb +1 -1
- data/spec/support/platform_helpers.rb +1 -1
- 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/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 +3 -3
- data/spec/support/shared/unit/execute_resource.rb +1 -1
- data/spec/support/shared/unit/provider/file.rb +12 -8
- data/spec/support/shared/unit/provider/useradd_based_user_provider.rb +4 -4
- data/spec/unit/application/solo_spec.rb +4 -2
- data/spec/unit/application_spec.rb +7 -0
- data/spec/unit/chef_fs/config_spec.rb +2 -2
- data/spec/unit/chef_fs/diff_spec.rb +8 -8
- data/spec/unit/client_spec.rb +4 -1
- data/spec/unit/cookbook/synchronizer_spec.rb +26 -24
- data/spec/unit/data_bag_spec.rb +6 -3
- data/spec/unit/decorator_spec.rb +23 -23
- data/spec/unit/environment_spec.rb +5 -1
- data/spec/unit/guard_interpreter_spec.rb +1 -1
- data/spec/unit/http/api_versions_spec.rb +1 -1
- data/spec/unit/http/ssl_policies_spec.rb +20 -0
- data/spec/unit/knife/bootstrap_spec.rb +3 -2
- data/spec/unit/knife/cookbook_download_spec.rb +2 -2
- data/spec/unit/knife/cookbook_show_spec.rb +6 -7
- data/spec/unit/knife/core/windows_bootstrap_context_spec.rb +7 -1
- data/spec/unit/knife/data_bag_edit_spec.rb +1 -1
- data/spec/unit/lwrp_spec.rb +5 -2
- data/spec/unit/mixin/openssl_helper_spec.rb +4 -4
- 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/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/node/attribute_spec.rb +1 -1
- data/spec/unit/property_spec.rb +1 -1
- 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 -1
- 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 +0 -42
- data/spec/unit/provider/mdadm_spec.rb +1 -3
- 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/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/package/windows/registry_uninstall_entry_spec.rb +3 -3
- data/spec/unit/provider/powershell_script_spec.rb +3 -45
- data/spec/unit/provider/script_spec.rb +20 -110
- 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/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/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/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_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 +84 -1
- data/spec/unit/role_spec.rb +23 -21
- data/spec/unit/util/backup_spec.rb +1 -1
- 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/registry_spec.rb +1 -1
- metadata +37 -31
- data/lib/chef/resource/cron.rb +0 -157
- data/spec/functional/resource/base.rb +0 -28
data/lib/chef/powershell.rb
CHANGED
|
@@ -34,7 +34,7 @@ class Chef
|
|
|
34
34
|
# @param script [String] script to run
|
|
35
35
|
# @return [Object] output
|
|
36
36
|
def initialize(script)
|
|
37
|
-
raise "Chef::PowerShell can only be used on the Windows platform." unless RUBY_PLATFORM
|
|
37
|
+
raise "Chef::PowerShell can only be used on the Windows platform." unless RUBY_PLATFORM.match?(/mswin|mingw32|windows/)
|
|
38
38
|
|
|
39
39
|
exec(script)
|
|
40
40
|
end
|
data/lib/chef/property.rb
CHANGED
|
@@ -574,7 +574,7 @@ class Chef
|
|
|
574
574
|
# be using the existing getter/setter to manipulate it instead.
|
|
575
575
|
return unless instance_variable_name
|
|
576
576
|
|
|
577
|
-
# Properties may override existing properties up the inheritance
|
|
577
|
+
# Properties may override existing properties up the inheritance hierarchy, but
|
|
578
578
|
# properties must not override inherited methods like Object#hash. When the Resource is
|
|
579
579
|
# placed into the resource collection the ruby Hash object will call the
|
|
580
580
|
# Object#hash method on the resource, and overriding that with a property will cause
|
|
@@ -702,7 +702,7 @@ class Chef
|
|
|
702
702
|
# override their own properties.
|
|
703
703
|
return false unless [ Object, BasicObject, Kernel, Chef::Resource ].include?(declared_in.instance_method(name).owner)
|
|
704
704
|
|
|
705
|
-
# Allow top-level Chef::Resource
|
|
705
|
+
# Allow top-level Chef::Resource properties, such as `name`, to be overridden.
|
|
706
706
|
# As of this writing, `name` is the only Chef::Resource property created with the
|
|
707
707
|
# `property` definition, but this will allow for future properties to be extended
|
|
708
708
|
# as needed.
|
data/lib/chef/provider.rb
CHANGED
|
@@ -152,7 +152,7 @@ class Chef
|
|
|
152
152
|
new_resource.cookbook_name
|
|
153
153
|
end
|
|
154
154
|
|
|
155
|
-
# hook that subclasses can use to do lazy validation for where properties aren't
|
|
155
|
+
# hook that subclasses can use to do lazy validation for where properties aren't flexible enough
|
|
156
156
|
def check_resource_semantics!; end
|
|
157
157
|
|
|
158
158
|
# a simple placeholder method that will be called / raise if a resource tries to
|
|
@@ -167,7 +167,7 @@ class Chef
|
|
|
167
167
|
|
|
168
168
|
def load_after_resource
|
|
169
169
|
# This is a backwards compatible hack, custom resources properly wire up a new after_resource
|
|
170
|
-
# via load_current_value. It is
|
|
170
|
+
# via load_current_value. It is acceptable for old style resources that cannot be easily made
|
|
171
171
|
# into custom resources to override this method and provide a proper after_resource.
|
|
172
172
|
@after_resource = @new_resource
|
|
173
173
|
end
|
|
@@ -190,7 +190,7 @@ class Chef
|
|
|
190
190
|
def run_action(action = nil)
|
|
191
191
|
@action = action unless action.nil?
|
|
192
192
|
|
|
193
|
-
# hook that subclasses can use to do lazy validation for where properties aren't
|
|
193
|
+
# hook that subclasses can use to do lazy validation for where properties aren't flexible enough
|
|
194
194
|
check_resource_semantics!
|
|
195
195
|
|
|
196
196
|
# force the validation of required properties
|
data/lib/chef/provider/batch.rb
CHANGED
|
@@ -24,22 +24,15 @@ class Chef
|
|
|
24
24
|
|
|
25
25
|
provides :batch
|
|
26
26
|
|
|
27
|
-
def initialize(new_resource, run_context)
|
|
28
|
-
super(new_resource, run_context, ".bat")
|
|
29
|
-
end
|
|
30
|
-
|
|
31
27
|
def command
|
|
32
|
-
basepath = is_forced_32bit ? wow64_directory : run_context.node["kernel"]["os_info"]["system_directory"]
|
|
33
|
-
|
|
34
28
|
interpreter_path = Chef::Util::PathHelper.join(basepath, interpreter)
|
|
35
29
|
|
|
36
|
-
"\"#{interpreter_path}\" #{flags} \"#{
|
|
30
|
+
"\"#{interpreter_path}\" #{new_resource.flags} /c \"#{script_file_path}\""
|
|
37
31
|
end
|
|
38
32
|
|
|
39
|
-
def
|
|
40
|
-
|
|
33
|
+
def script_extension
|
|
34
|
+
".bat"
|
|
41
35
|
end
|
|
42
|
-
|
|
43
36
|
end
|
|
44
37
|
end
|
|
45
38
|
end
|
data/lib/chef/provider/cron.rb
CHANGED
|
@@ -15,7 +15,6 @@
|
|
|
15
15
|
# See the License for the specific language governing permissions and
|
|
16
16
|
# limitations under the License.
|
|
17
17
|
#
|
|
18
|
-
|
|
19
18
|
require_relative "../log"
|
|
20
19
|
require_relative "../provider"
|
|
21
20
|
|
|
@@ -27,8 +26,6 @@ class Chef
|
|
|
27
26
|
|
|
28
27
|
SPECIAL_TIME_VALUES = %i{reboot yearly annually monthly weekly daily midnight hourly}.freeze
|
|
29
28
|
CRON_ATTRIBUTES = %i{minute hour day month weekday time command mailto path shell home environment}.freeze
|
|
30
|
-
WEEKDAY_SYMBOLS = %i{sunday monday tuesday wednesday thursday friday saturday}.freeze
|
|
31
|
-
|
|
32
29
|
CRON_PATTERN = %r{\A([-0-9*,/]+)\s([-0-9*,/]+)\s([-0-9*,/]+)\s([-0-9*,/]+|[a-zA-Z]{3})\s([-0-9*,/]+|[a-zA-Z]{3})\s(.*)}.freeze
|
|
33
30
|
SPECIAL_PATTERN = /\A(@(#{SPECIAL_TIME_VALUES.join('|')}))\s(.*)/.freeze
|
|
34
31
|
ENV_PATTERN = /\A(\S+)=(\S*)/.freeze
|
|
@@ -259,8 +256,8 @@ class Chef
|
|
|
259
256
|
return "" if new_resource.time_out.empty?
|
|
260
257
|
|
|
261
258
|
str = " timeout"
|
|
262
|
-
str << " --preserve-status" if new_resource.time_out["preserve-status"].to_s.
|
|
263
|
-
str << " --foreground" if new_resource.time_out["foreground"].to_s.
|
|
259
|
+
str << " --preserve-status" if new_resource.time_out["preserve-status"].to_s.casecmp("true") == 0
|
|
260
|
+
str << " --foreground" if new_resource.time_out["foreground"].to_s.casecmp("true") == 0
|
|
264
261
|
str << " --kill-after #{new_resource.time_out["kill-after"]}" if new_resource.time_out["kill-after"]
|
|
265
262
|
str << " --signal #{new_resource.time_out["signal"]}" if new_resource.time_out["signal"]
|
|
266
263
|
str << " #{new_resource.time_out["duration"]};"
|
|
@@ -288,15 +285,6 @@ class Chef
|
|
|
288
285
|
|
|
289
286
|
newcron.join("\n")
|
|
290
287
|
end
|
|
291
|
-
|
|
292
|
-
def weekday_in_crontab
|
|
293
|
-
weekday_in_crontab = WEEKDAY_SYMBOLS.index(new_resource.weekday)
|
|
294
|
-
if weekday_in_crontab.nil?
|
|
295
|
-
new_resource.weekday
|
|
296
|
-
else
|
|
297
|
-
weekday_in_crontab.to_s
|
|
298
|
-
end
|
|
299
|
-
end
|
|
300
288
|
end
|
|
301
289
|
end
|
|
302
290
|
end
|
|
@@ -142,7 +142,7 @@ class Chef
|
|
|
142
142
|
converge_by("delete existing directory #{new_resource.path}") do
|
|
143
143
|
if new_resource.recursive == true
|
|
144
144
|
# we don't use rm_rf here because it masks all errors, including
|
|
145
|
-
# IO errors or permission errors that would
|
|
145
|
+
# IO errors or permission errors that would prevent the deletion
|
|
146
146
|
FileUtils.rm_r(new_resource.path)
|
|
147
147
|
logger.info("#{new_resource} deleted #{new_resource.path} recursively")
|
|
148
148
|
else
|
|
@@ -27,7 +27,7 @@ class Chef
|
|
|
27
27
|
|
|
28
28
|
provides :execute, target_mode: true
|
|
29
29
|
|
|
30
|
-
def_delegators :new_resource, :command, :returns, :environment, :user, :domain, :password, :group, :cwd, :umask, :creates, :elevated, :default_env, :timeout
|
|
30
|
+
def_delegators :new_resource, :command, :returns, :environment, :user, :domain, :password, :group, :cwd, :umask, :creates, :elevated, :default_env, :timeout, :input
|
|
31
31
|
|
|
32
32
|
def load_current_resource
|
|
33
33
|
current_resource = Chef::Resource::Execute.new(new_resource.name)
|
|
@@ -91,6 +91,7 @@ class Chef
|
|
|
91
91
|
opts[:group] = group if group
|
|
92
92
|
opts[:cwd] = cwd if cwd
|
|
93
93
|
opts[:umask] = umask if umask
|
|
94
|
+
opts[:input] = input if input
|
|
94
95
|
opts[:default_env] = default_env
|
|
95
96
|
opts[:log_level] = :info
|
|
96
97
|
opts[:log_tag] = new_resource.to_s
|
data/lib/chef/provider/file.rb
CHANGED
|
@@ -334,7 +334,7 @@ class Chef
|
|
|
334
334
|
end
|
|
335
335
|
|
|
336
336
|
def do_validate_content
|
|
337
|
-
if new_resource.checksum && tempfile && ( new_resource.checksum
|
|
337
|
+
if new_resource.checksum && tempfile && ( new_resource.checksum != tempfile_checksum )
|
|
338
338
|
raise Chef::Exceptions::ChecksumMismatch.new(short_cksum(new_resource.checksum), short_cksum(tempfile_checksum))
|
|
339
339
|
end
|
|
340
340
|
|
|
@@ -39,7 +39,7 @@ class Chef
|
|
|
39
39
|
result = dscl(*args)
|
|
40
40
|
return "" if ( args.first =~ /^delete/ ) && ( result[1].exitstatus != 0 )
|
|
41
41
|
raise(Chef::Exceptions::Group, "dscl error: #{result.inspect}") unless result[1].exitstatus == 0
|
|
42
|
-
raise(Chef::Exceptions::Group, "dscl error: #{result.inspect}") if
|
|
42
|
+
raise(Chef::Exceptions::Group, "dscl error: #{result.inspect}") if /No such key: /.match?(result[2])
|
|
43
43
|
|
|
44
44
|
result[2]
|
|
45
45
|
end
|
|
@@ -77,7 +77,7 @@ class Chef
|
|
|
77
77
|
gid = nil; next_gid_guess = 200
|
|
78
78
|
groups_gids = safe_dscl("list", "/Groups", "gid")
|
|
79
79
|
while next_gid_guess < search_limit + 200
|
|
80
|
-
if groups_gids
|
|
80
|
+
if groups_gids&.match?(Regexp.new("#{Regexp.escape(next_gid_guess.to_s)}\n"))
|
|
81
81
|
next_gid_guess += 1
|
|
82
82
|
else
|
|
83
83
|
gid = next_gid_guess
|
|
@@ -59,12 +59,12 @@ class Chef
|
|
|
59
59
|
|
|
60
60
|
@net_tools_version = shell_out("ifconfig", "--version")
|
|
61
61
|
@net_tools_version.stdout.each_line do |line|
|
|
62
|
-
if
|
|
62
|
+
if /^net-tools (\d+\.\d+)/.match?(line)
|
|
63
63
|
@ifconfig_version = line.match(/^net-tools (\d+\.\d+)/)[1]
|
|
64
64
|
end
|
|
65
65
|
end
|
|
66
66
|
@net_tools_version.stderr.each_line do |line|
|
|
67
|
-
if
|
|
67
|
+
if /^net-tools (\d+\.\d+)/.match?(line)
|
|
68
68
|
@ifconfig_version = line.match(/^net-tools (\d+\.\d+)/)[1]
|
|
69
69
|
end
|
|
70
70
|
end
|
|
@@ -88,11 +88,11 @@ class Chef
|
|
|
88
88
|
@int_name = line[0..9].strip
|
|
89
89
|
@interfaces[@int_name] = { "hwaddr" => (line =~ /(HWaddr)/ ? ($') : "nil").strip.chomp }
|
|
90
90
|
else
|
|
91
|
-
@interfaces[@int_name]["inet_addr"] = (line =~ /inet addr:(\S+)/ ? Regexp.last_match(1) : "nil") if
|
|
92
|
-
@interfaces[@int_name]["bcast"] = (line =~ /Bcast:(\S+)/ ? Regexp.last_match(1) : "nil") if
|
|
93
|
-
@interfaces[@int_name]["mask"] = (line =~ /Mask:(\S+)/ ? Regexp.last_match(1) : "nil") if
|
|
94
|
-
@interfaces[@int_name]["mtu"] = (line =~ /MTU:(\S+)/ ? Regexp.last_match(1) : "nil") if
|
|
95
|
-
@interfaces[@int_name]["metric"] = (line =~ /Metric:(\S+)/ ? Regexp.last_match(1) : "nil") if
|
|
91
|
+
@interfaces[@int_name]["inet_addr"] = (line =~ /inet addr:(\S+)/ ? Regexp.last_match(1) : "nil") if /inet addr:/.match?(line)
|
|
92
|
+
@interfaces[@int_name]["bcast"] = (line =~ /Bcast:(\S+)/ ? Regexp.last_match(1) : "nil") if /Bcast:/.match?(line)
|
|
93
|
+
@interfaces[@int_name]["mask"] = (line =~ /Mask:(\S+)/ ? Regexp.last_match(1) : "nil") if /Mask:/.match?(line)
|
|
94
|
+
@interfaces[@int_name]["mtu"] = (line =~ /MTU:(\S+)/ ? Regexp.last_match(1) : "nil") if /MTU:/.match?(line)
|
|
95
|
+
@interfaces[@int_name]["metric"] = (line =~ /Metric:(\S+)/ ? Regexp.last_match(1) : "nil") if /Metric:/.match?(line)
|
|
96
96
|
end
|
|
97
97
|
|
|
98
98
|
next unless @interfaces.key?(new_resource.device)
|
|
@@ -62,23 +62,23 @@ class Chef
|
|
|
62
62
|
end
|
|
63
63
|
|
|
64
64
|
action :delete do
|
|
65
|
-
|
|
66
|
-
# the service will be in memory and you wont be able to stop it.
|
|
67
|
-
if ::File.exists?(@path)
|
|
65
|
+
if ::File.exists?(path)
|
|
68
66
|
manage_service(:disable)
|
|
69
67
|
end
|
|
70
68
|
manage_plist(:delete)
|
|
71
69
|
end
|
|
72
70
|
|
|
73
71
|
action :enable do
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
manage_service(:enable)
|
|
72
|
+
manage_service(:nothing)
|
|
73
|
+
manage_plist(:create) do
|
|
74
|
+
notifies :restart, "macosx_service[#{label}]", :immediately
|
|
78
75
|
end
|
|
76
|
+
manage_service(:enable)
|
|
79
77
|
end
|
|
80
78
|
|
|
81
79
|
action :disable do
|
|
80
|
+
return unless ::File.exist?(path)
|
|
81
|
+
|
|
82
82
|
manage_service(:disable)
|
|
83
83
|
end
|
|
84
84
|
|
|
@@ -86,13 +86,14 @@ class Chef
|
|
|
86
86
|
manage_service(:restart)
|
|
87
87
|
end
|
|
88
88
|
|
|
89
|
-
def manage_plist(action)
|
|
89
|
+
def manage_plist(action, &block)
|
|
90
90
|
if source
|
|
91
91
|
cookbook_file path do
|
|
92
92
|
cookbook_name = new_resource.cookbook if new_resource.cookbook
|
|
93
93
|
copy_properties_from(new_resource, :backup, :group, :mode, :owner, :source)
|
|
94
94
|
action(action)
|
|
95
95
|
only_if { manage_agent?(action) }
|
|
96
|
+
instance_eval(&block) if block_given?
|
|
96
97
|
end
|
|
97
98
|
else
|
|
98
99
|
file path do
|
|
@@ -100,6 +101,7 @@ class Chef
|
|
|
100
101
|
content(file_content) if file_content?
|
|
101
102
|
action(action)
|
|
102
103
|
only_if { manage_agent?(action) }
|
|
104
|
+
instance_eval(&block) if block_given?
|
|
103
105
|
end
|
|
104
106
|
end
|
|
105
107
|
end
|
|
@@ -207,7 +209,7 @@ class Chef
|
|
|
207
209
|
|
|
208
210
|
# @api private
|
|
209
211
|
def path
|
|
210
|
-
@path
|
|
212
|
+
@path ||= new_resource.path ? new_resource.path : gen_path_from_type
|
|
211
213
|
end
|
|
212
214
|
end
|
|
213
215
|
end
|
|
@@ -197,7 +197,7 @@ class Chef
|
|
|
197
197
|
::File.open("/etc/filesystems", "r").each_line do |line|
|
|
198
198
|
case line
|
|
199
199
|
when %r{^/.+:\s*$}
|
|
200
|
-
if
|
|
200
|
+
if /#{Regexp.escape(@new_resource.mount_point)}+:/.match?(line)
|
|
201
201
|
found_device = true
|
|
202
202
|
else
|
|
203
203
|
found_device = false
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
#
|
|
18
18
|
|
|
19
19
|
require_relative "../mount"
|
|
20
|
-
if RUBY_PLATFORM
|
|
20
|
+
if RUBY_PLATFORM.match?(/mswin|mingw32|windows/)
|
|
21
21
|
require_relative "../../util/windows/net_use"
|
|
22
22
|
require_relative "../../util/windows/volume"
|
|
23
23
|
end
|
|
@@ -30,7 +30,7 @@ class Chef
|
|
|
30
30
|
provides :mount, os: "windows"
|
|
31
31
|
|
|
32
32
|
def is_volume(name)
|
|
33
|
-
|
|
33
|
+
/^\\\\\?\\Volume\{[\w-]+\}\\$/.match?(name) ? true : false
|
|
34
34
|
end
|
|
35
35
|
|
|
36
36
|
def initialize(new_resource, run_context)
|
data/lib/chef/provider/noop.rb
CHANGED
|
@@ -74,7 +74,7 @@ class Chef
|
|
|
74
74
|
|
|
75
75
|
def dism_command(command)
|
|
76
76
|
with_os_architecture(nil) do
|
|
77
|
-
result = shell_out("dism.exe /Online /English #{command} /NoRestart",
|
|
77
|
+
result = shell_out("dism.exe /Online /English #{command} /NoRestart", timeout: new_resource.timeout)
|
|
78
78
|
if result.exitstatus == -2146498530
|
|
79
79
|
raise Chef::Exceptions::Package, "The specified package is not applicable to this image." if result.stdout.include?("0x800f081e")
|
|
80
80
|
|
|
@@ -249,7 +249,7 @@ class Chef
|
|
|
249
249
|
end
|
|
250
250
|
|
|
251
251
|
# Helper to convert choco.exe list output to a Hash
|
|
252
|
-
# (names are downcased for case-
|
|
252
|
+
# (names are downcased for case-insensitive matching)
|
|
253
253
|
#
|
|
254
254
|
# @param cmd [String] command to run
|
|
255
255
|
# @return [Hash] list output converted to ruby Hash
|
|
@@ -149,7 +149,7 @@ class Chef
|
|
|
149
149
|
resolved_source_array.all? { |s| s && ::File.exist?(s) }
|
|
150
150
|
end
|
|
151
151
|
|
|
152
|
-
# Helper to return all the
|
|
152
|
+
# Helper to return all the names of the missing sources for error messages.
|
|
153
153
|
#
|
|
154
154
|
# @return [Array<String>] Array of missing sources
|
|
155
155
|
def missing_sources
|
|
@@ -70,7 +70,8 @@ class Chef
|
|
|
70
70
|
|
|
71
71
|
if pkginfo.exitstatus != 0
|
|
72
72
|
pkginfo.stderr.each_line do |line|
|
|
73
|
-
|
|
73
|
+
# cspell:disable-next-line
|
|
74
|
+
if /[Uu]nqualified atom .*match.* multiple/.match?(line)
|
|
74
75
|
raise_error_for_query("matched multiple packages (please specify a category):\n#{pkginfo.inspect}")
|
|
75
76
|
end
|
|
76
77
|
end
|
|
@@ -87,7 +88,7 @@ class Chef
|
|
|
87
88
|
end
|
|
88
89
|
|
|
89
90
|
pkginfo.stdout.chomp!
|
|
90
|
-
if
|
|
91
|
+
if /-r\d+$/.match?(pkginfo.stdout)
|
|
91
92
|
# Latest/Best version of the package is a revision (-rX).
|
|
92
93
|
@candidate_version = pkginfo.stdout.split(/(?<=-)/).last(2).join
|
|
93
94
|
else
|
|
@@ -53,10 +53,13 @@ class Chef
|
|
|
53
53
|
|
|
54
54
|
# Installs the package specified with the version passed else latest version will be installed
|
|
55
55
|
def install_package(names, versions)
|
|
56
|
+
# To enable tls 1.2, which is disabled by default in some OS
|
|
57
|
+
powershell_out("[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12")
|
|
58
|
+
|
|
56
59
|
names.each_with_index do |name, index|
|
|
57
60
|
cmd = powershell_out(build_powershell_package_command("Install-Package '#{name}'", versions[index]), timeout: new_resource.timeout)
|
|
58
61
|
next if cmd.nil?
|
|
59
|
-
raise Chef::Exceptions::PowershellCmdletException, "Failed to install package due to catalog signing error, use skip_publisher_check to force install" if cmd.stderr
|
|
62
|
+
raise Chef::Exceptions::PowershellCmdletException, "Failed to install package due to catalog signing error, use skip_publisher_check to force install" if /SkipPublisherCheck/.match?(cmd.stderr)
|
|
60
63
|
end
|
|
61
64
|
end
|
|
62
65
|
|
|
@@ -115,7 +118,8 @@ class Chef
|
|
|
115
118
|
command = [command] unless command.is_a?(Array)
|
|
116
119
|
cmdlet_name = command.first
|
|
117
120
|
command.unshift("(")
|
|
118
|
-
|
|
121
|
+
# -WarningAction SilentlyContinue is used to suppress the warnings from stdout
|
|
122
|
+
%w{-Force -ForceBootstrap -WarningAction SilentlyContinue}.each do |arg|
|
|
119
123
|
command.push(arg)
|
|
120
124
|
end
|
|
121
125
|
command.push("-RequiredVersion #{version}") if version
|
|
@@ -250,7 +250,7 @@ class Chef
|
|
|
250
250
|
private
|
|
251
251
|
|
|
252
252
|
def logger
|
|
253
|
-
Chef::Log.with_child({
|
|
253
|
+
Chef::Log.with_child({ subsystem: "gem_installer_environment" })
|
|
254
254
|
end
|
|
255
255
|
|
|
256
256
|
end
|
|
@@ -420,7 +420,7 @@ class Chef
|
|
|
420
420
|
end
|
|
421
421
|
|
|
422
422
|
def is_omnibus?
|
|
423
|
-
if
|
|
423
|
+
if %r{/(opscode|chef|chefdk)/embedded/bin}.match?(RbConfig::CONFIG["bindir"])
|
|
424
424
|
logger.trace("#{new_resource} detected omnibus installation in #{RbConfig::CONFIG["bindir"]}")
|
|
425
425
|
# Omnibus installs to a static path because of linking on unix, find it.
|
|
426
426
|
true
|
|
@@ -447,7 +447,7 @@ class Chef
|
|
|
447
447
|
|
|
448
448
|
scheme = URI.parse(new_resource.source).scheme
|
|
449
449
|
# URI.parse gets confused by MS Windows paths with forward slashes.
|
|
450
|
-
scheme = nil if
|
|
450
|
+
scheme = nil if /^[a-z]$/.match?(scheme)
|
|
451
451
|
%w{http https}.include?(scheme)
|
|
452
452
|
rescue URI::InvalidURIError
|
|
453
453
|
logger.trace("#{new_resource} failed to parse source '#{new_resource.source}' as a URI, assuming a local path")
|
|
@@ -59,15 +59,14 @@ class Chef
|
|
|
59
59
|
def get_current_versions
|
|
60
60
|
package_name_array.each_with_index.map do |pkg, i|
|
|
61
61
|
installed_version(i)
|
|
62
|
-
end
|
|
62
|
+
end.compact
|
|
63
63
|
end
|
|
64
64
|
|
|
65
65
|
def install_package(names, versions)
|
|
66
66
|
if new_resource.source
|
|
67
67
|
install_snap_from_source(names, new_resource.source)
|
|
68
68
|
else
|
|
69
|
-
|
|
70
|
-
install_snaps(resolved_names)
|
|
69
|
+
install_snaps(names)
|
|
71
70
|
end
|
|
72
71
|
end
|
|
73
72
|
|
|
@@ -75,14 +74,16 @@ class Chef
|
|
|
75
74
|
if new_resource.source
|
|
76
75
|
install_snap_from_source(names, new_resource.source)
|
|
77
76
|
else
|
|
78
|
-
|
|
79
|
-
|
|
77
|
+
if get_current_versions.empty?
|
|
78
|
+
install_snaps(names, versions)
|
|
79
|
+
else
|
|
80
|
+
update_snaps(names)
|
|
81
|
+
end
|
|
80
82
|
end
|
|
81
83
|
end
|
|
82
84
|
|
|
83
85
|
def remove_package(names, versions)
|
|
84
|
-
|
|
85
|
-
uninstall_snaps(resolved_names)
|
|
86
|
+
uninstall_snaps(names)
|
|
86
87
|
end
|
|
87
88
|
|
|
88
89
|
alias purge_package remove_package
|
|
@@ -129,19 +130,73 @@ class Chef
|
|
|
129
130
|
"Accept: application/json\r\n" +
|
|
130
131
|
"Content-Type: application/json\r\n"
|
|
131
132
|
if method == "POST"
|
|
132
|
-
|
|
133
|
+
pdata = post_data.to_json.to_s
|
|
134
|
+
request.concat("Content-Length: #{pdata.bytesize}\r\n\r\n#{pdata}")
|
|
133
135
|
end
|
|
134
136
|
request.concat("\r\n")
|
|
135
|
-
|
|
136
|
-
#
|
|
137
|
-
#
|
|
137
|
+
|
|
138
|
+
# while it is expected to allow clients to connect using https over
|
|
139
|
+
# a tcp socket, at this point only a unix socket is supported. the
|
|
140
|
+
# socket is /run/snapd.socket note - unix socket is not defined on
|
|
141
|
+
# windows systems
|
|
138
142
|
if defined?(::UNIXSocket)
|
|
139
143
|
UNIXSocket.open("/run/snapd.socket") do |socket|
|
|
140
|
-
#
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
144
|
+
# send request, read the response, split the response and parse
|
|
145
|
+
# the body
|
|
146
|
+
socket.write(request)
|
|
147
|
+
|
|
148
|
+
# WARNING!!! HERE BE DRAGONs
|
|
149
|
+
#
|
|
150
|
+
# So snapd doesn't return an EOF at the end of its body, so
|
|
151
|
+
# doing a normal read will just hang forever.
|
|
152
|
+
#
|
|
153
|
+
# Well, sort of. if, after it writes everything, you then send
|
|
154
|
+
# yet-another newline, it'll then send its EOF and promptly
|
|
155
|
+
# disconnect closing the pipe and preventing reading. so, you
|
|
156
|
+
# have to read first, and therein lies the EOF problem.
|
|
157
|
+
#
|
|
158
|
+
# So you can do non-blocking reads with selects, but it
|
|
159
|
+
# makes every read take about 5 seconds. If, instead, we
|
|
160
|
+
# read the last line char-by-char, it's about half a second.
|
|
161
|
+
#
|
|
162
|
+
# Reading a character at a time isn't efficient, and since we
|
|
163
|
+
# know that http headers always have a blank line after them,
|
|
164
|
+
# we can read lines until we find a blank line and *then* read
|
|
165
|
+
# a character at a time. snap returns all the json on a single
|
|
166
|
+
# line, so once you pass headers you must read a character a
|
|
167
|
+
# time.
|
|
168
|
+
#
|
|
169
|
+
# - jaymzh
|
|
170
|
+
|
|
171
|
+
Chef::Log.trace(
|
|
172
|
+
"snap_package[#{new_resource.package_name}]: reading headers"
|
|
173
|
+
)
|
|
174
|
+
loop do
|
|
175
|
+
response = socket.readline
|
|
176
|
+
break if response.strip.empty? # finished headers
|
|
177
|
+
end
|
|
178
|
+
Chef::Log.trace(
|
|
179
|
+
"snap_package[#{new_resource.package_name}]: past headers, " +
|
|
180
|
+
"onto the body..."
|
|
181
|
+
)
|
|
182
|
+
result = nil
|
|
183
|
+
body = ""
|
|
184
|
+
socket.each_char do |c|
|
|
185
|
+
body << c
|
|
186
|
+
# we know we're not done if we don't have a char that
|
|
187
|
+
# can end JSON
|
|
188
|
+
next unless ["}", "]"].include?(c)
|
|
189
|
+
|
|
190
|
+
begin
|
|
191
|
+
result = JSON.parse(body)
|
|
192
|
+
# if we get here, we were able to parse the json so we
|
|
193
|
+
# are done reading
|
|
194
|
+
break
|
|
195
|
+
rescue JSON::ParserError
|
|
196
|
+
next
|
|
197
|
+
end
|
|
198
|
+
end
|
|
199
|
+
result
|
|
145
200
|
end
|
|
146
201
|
end
|
|
147
202
|
end
|
|
@@ -211,20 +266,22 @@ class Chef
|
|
|
211
266
|
response.error!
|
|
212
267
|
end
|
|
213
268
|
|
|
214
|
-
def install_snaps(snap_names)
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
269
|
+
def install_snaps(snap_names, versions)
|
|
270
|
+
snap_names.each do |snap|
|
|
271
|
+
response = post_snap(snap, "install", new_resource.channel, new_resource.options)
|
|
272
|
+
id = get_id_from_async_response(response)
|
|
273
|
+
wait_for_completion(id)
|
|
274
|
+
end
|
|
218
275
|
end
|
|
219
276
|
|
|
220
277
|
def update_snaps(snap_names)
|
|
221
|
-
response = post_snaps(snap_names, "refresh",
|
|
278
|
+
response = post_snaps(snap_names, "refresh", nil, new_resource.options)
|
|
222
279
|
id = get_id_from_async_response(response)
|
|
223
280
|
wait_for_completion(id)
|
|
224
281
|
end
|
|
225
282
|
|
|
226
283
|
def uninstall_snaps(snap_names)
|
|
227
|
-
response = post_snaps(snap_names, "remove",
|
|
284
|
+
response = post_snaps(snap_names, "remove", nil, new_resource.options)
|
|
228
285
|
id = get_id_from_async_response(response)
|
|
229
286
|
wait_for_completion(id)
|
|
230
287
|
end
|
|
@@ -278,18 +335,20 @@ class Chef
|
|
|
278
335
|
"action" => action,
|
|
279
336
|
"snaps" => snap_names,
|
|
280
337
|
}
|
|
281
|
-
if %w{install refresh switch}.include?(action)
|
|
338
|
+
if %w{install refresh switch}.include?(action) && channel
|
|
282
339
|
request["channel"] = channel
|
|
283
340
|
end
|
|
284
341
|
|
|
285
342
|
# No defensive handling of params
|
|
286
343
|
# Snap will throw the proper exception if called improperly
|
|
287
344
|
# And we can provide that exception to the end user
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
345
|
+
if options
|
|
346
|
+
request["classic"] = true if options.include?("classic")
|
|
347
|
+
request["devmode"] = true if options.include?("devmode")
|
|
348
|
+
request["jailmode"] = true if options.include?("jailmode")
|
|
349
|
+
request["ignore_validation"] = true if options.include?("ignore-validation")
|
|
350
|
+
end
|
|
291
351
|
request["revision"] = revision unless revision.nil?
|
|
292
|
-
request["ignore_validation"] = true if options["ignore-validation"]
|
|
293
352
|
request
|
|
294
353
|
end
|
|
295
354
|
|
|
@@ -305,12 +364,22 @@ class Chef
|
|
|
305
364
|
call_snap_api("POST", "/v2/snaps", json)
|
|
306
365
|
end
|
|
307
366
|
|
|
367
|
+
def post_snap(snap_name, action, channel, options, revision = nil)
|
|
368
|
+
json = generate_snap_json(snap_name, action, channel, options, revision = nil)
|
|
369
|
+
json.delete("snaps")
|
|
370
|
+
call_snap_api("POST", "/v2/snaps/#{snap_name}", json)
|
|
371
|
+
end
|
|
372
|
+
|
|
308
373
|
def get_latest_package_version(name, channel)
|
|
309
374
|
json = call_snap_api("GET", "/v2/find?name=#{name}")
|
|
310
375
|
if json["status-code"] != 200
|
|
311
376
|
raise Chef::Exceptions::Package, json["result"], caller
|
|
312
377
|
end
|
|
313
378
|
|
|
379
|
+
unless json["result"][0]["channels"]["latest/#{channel}"]
|
|
380
|
+
raise Chef::Exceptions::Package, "No version of #{name} in channel #{channel}", caller
|
|
381
|
+
end
|
|
382
|
+
|
|
314
383
|
# Return the version matching the channel
|
|
315
384
|
json["result"][0]["channels"]["latest/#{channel}"]["version"]
|
|
316
385
|
end
|