chef 16.1.16 → 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 +2 -3
- data/README.md +3 -3
- data/Rakefile +2 -2
- data/chef.gemspec +3 -3
- data/lib/chef/application/apply.rb +1 -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/path_utils.rb +1 -1
- data/lib/chef/cookbook/chefignore.rb +1 -1
- data/lib/chef/cookbook/metadata.rb +1 -1
- data/lib/chef/cookbook_version.rb +2 -2
- data/lib/chef/data_bag.rb +4 -4
- data/lib/chef/deprecated.rb +4 -0
- data/lib/chef/file_access_control.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/http.rb +17 -2
- 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 +1 -1
- data/lib/chef/knife/bootstrap.rb +3 -6
- data/lib/chef/knife/bootstrap/templates/chef-full.erb +9 -9
- 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/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/role_bulk_delete.rb +1 -1
- data/lib/chef/knife/ssh.rb +1 -1
- 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/securable.rb +2 -2
- 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/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/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 +96 -27
- 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/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/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/zypper_repository.rb +30 -10
- data/lib/chef/resource.rb +22 -11
- 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/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/execute.rb +477 -7
- data/lib/chef/resource/file.rb +1 -1
- data/lib/chef/resource/freebsd_package.rb +1 -1
- 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 +6 -19
- data/lib/chef/resource/kernel_module.rb +14 -1
- 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/template.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_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 +17 -15
- 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 +5 -5
- data/lib/chef/resource/yum_repository.rb +9 -9
- data/lib/chef/resources.rb +4 -2
- data/lib/chef/search/query.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/file.rb +1 -1
- data/lib/chef/win32/registry.rb +2 -2
- 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/resource/cron_spec.rb +10 -0
- data/spec/functional/resource/remote_file_spec.rb +2 -2
- data/spec/functional/resource/windows_task_spec.rb +8 -8
- 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/unit/execute_resource.rb +1 -1
- data/spec/unit/application_spec.rb +7 -0
- data/spec/unit/data_bag_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/mixin/user_context_spec.rb +1 -9
- data/spec/unit/property_spec.rb +1 -1
- data/spec/unit/provider/batch_spec.rb +130 -0
- data/spec/unit/provider/cron_spec.rb +9 -49
- data/spec/unit/provider/package/powershell_spec.rb +95 -86
- 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/zypper_repository_spec.rb +60 -10
- 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_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/util/dsc/configuration_generator_spec.rb +1 -1
- data/spec/unit/util/threaded_job_queue_spec.rb +9 -0
- metadata +22 -22
- data/lib/chef/resource/cron.rb +0 -157
@@ -75,7 +75,7 @@ class Chef
|
|
75
75
|
# It's a regex.
|
76
76
|
filter_re = Regexp.new($1, $2 ? Regexp::IGNORECASE : 0)
|
77
77
|
config_data.each do |key, value|
|
78
|
-
output_data[key] = value if key.to_s
|
78
|
+
output_data[key] = value if key.to_s&.match?(filter_re)
|
79
79
|
end
|
80
80
|
else
|
81
81
|
# It's a dotted path string.
|
@@ -89,7 +89,7 @@ class Chef
|
|
89
89
|
url_and_version["versions"].map { |url_by_version| url_by_version["version"] }
|
90
90
|
end.flatten
|
91
91
|
rescue Net::HTTPClientException => e
|
92
|
-
if e.to_s
|
92
|
+
if /^404/.match?(e.to_s)
|
93
93
|
ui.error("Cannot find a cookbook named #{@cookbook_name} to delete.")
|
94
94
|
nil
|
95
95
|
else
|
@@ -58,7 +58,7 @@ class Chef
|
|
58
58
|
exit 1
|
59
59
|
end
|
60
60
|
cmd = git("status --porcelain")
|
61
|
-
if cmd.stdout
|
61
|
+
if DIRTY_REPO.match?(cmd.stdout)
|
62
62
|
ui.error "You have uncommitted changes to your cookbook repo (#{repo_path}):"
|
63
63
|
ui.msg cmd.stdout
|
64
64
|
ui.info "Commit or stash your changes before importing cookbooks"
|
@@ -54,7 +54,7 @@ class Chef
|
|
54
54
|
rest.get("data/#{@data_bag_name}")
|
55
55
|
ui.info("Data bag #{@data_bag_name} already exists")
|
56
56
|
rescue Net::HTTPClientException => e
|
57
|
-
raise unless e.to_s
|
57
|
+
raise unless /^404/.match?(e.to_s)
|
58
58
|
|
59
59
|
# if it doesn't exists, try to create it
|
60
60
|
rest.post("data", { "name" => @data_bag_name })
|
data/lib/chef/knife/ssh.rb
CHANGED
@@ -364,7 +364,7 @@ class Chef
|
|
364
364
|
|
365
365
|
ch.on_data do |ichannel, data|
|
366
366
|
print_data(ichannel.connection[:prefix], data)
|
367
|
-
if
|
367
|
+
if /^knife sudo password: /.match?(data)
|
368
368
|
print_data(ichannel.connection[:prefix], "\n")
|
369
369
|
ichannel.send_data("#{get_password}\n")
|
370
370
|
end
|
@@ -132,7 +132,7 @@ class Chef
|
|
132
132
|
res = Chef::JSONCompat.from_json(http_resp.body)
|
133
133
|
if http_resp.code.to_i != 201
|
134
134
|
if res["error_messages"]
|
135
|
-
if res["error_messages"][0]
|
135
|
+
if /Version already exists/.match?(res["error_messages"][0])
|
136
136
|
ui.error "The same version of this cookbook already exists on Supermarket."
|
137
137
|
exit(1)
|
138
138
|
else
|
@@ -48,7 +48,7 @@ class Chef
|
|
48
48
|
begin
|
49
49
|
rest.delete "#{config[:supermarket_site]}/api/v1/cookbooks/#{@name_args[0]}"
|
50
50
|
rescue Net::HTTPClientException => e
|
51
|
-
raise e unless e.message
|
51
|
+
raise e unless /Forbidden/.match?(e.message)
|
52
52
|
|
53
53
|
ui.error "Forbidden: You must be the maintainer of #{@cookbook_name} to unshare it."
|
54
54
|
exit 1
|
data/lib/chef/log.rb
CHANGED
@@ -21,7 +21,7 @@ require "logger"
|
|
21
21
|
require_relative "monologger"
|
22
22
|
require_relative "exceptions"
|
23
23
|
require "mixlib/log"
|
24
|
-
require_relative "log/syslog" unless RUBY_PLATFORM
|
24
|
+
require_relative "log/syslog" unless RUBY_PLATFORM.match?(/mswin|mingw|windows/)
|
25
25
|
require_relative "log/winevt"
|
26
26
|
|
27
27
|
class Chef
|
data/lib/chef/mixin/securable.rb
CHANGED
@@ -172,14 +172,14 @@ class Chef
|
|
172
172
|
end
|
173
173
|
end
|
174
174
|
|
175
|
-
if RUBY_PLATFORM
|
175
|
+
if RUBY_PLATFORM.match?(/mswin|mingw|windows/)
|
176
176
|
include WindowsSecurableAttributes
|
177
177
|
end
|
178
178
|
|
179
179
|
# Callback that fires when included; will extend the including class
|
180
180
|
# with WindowsMacros and define #rights and #deny_rights on it.
|
181
181
|
def self.included(including_class)
|
182
|
-
if RUBY_PLATFORM
|
182
|
+
if RUBY_PLATFORM.match?(/mswin|mingw|windows/)
|
183
183
|
including_class.extend(WindowsMacros)
|
184
184
|
# create a default 'rights' attribute
|
185
185
|
including_class.rights_attribute(:rights)
|
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/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
|
@@ -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
|
@@ -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)
|
@@ -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
@@ -71,7 +71,7 @@ class Chef
|
|
71
71
|
if pkginfo.exitstatus != 0
|
72
72
|
pkginfo.stderr.each_line do |line|
|
73
73
|
# cspell:disable-next-line
|
74
|
-
if
|
74
|
+
if /[Uu]nqualified atom .*match.* multiple/.match?(line)
|
75
75
|
raise_error_for_query("matched multiple packages (please specify a category):\n#{pkginfo.inspect}")
|
76
76
|
end
|
77
77
|
end
|
@@ -88,7 +88,7 @@ class Chef
|
|
88
88
|
end
|
89
89
|
|
90
90
|
pkginfo.stdout.chomp!
|
91
|
-
if
|
91
|
+
if /-r\d+$/.match?(pkginfo.stdout)
|
92
92
|
# Latest/Best version of the package is a revision (-rX).
|
93
93
|
@candidate_version = pkginfo.stdout.split(/(?<=-)/).last(2).join
|
94
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
|
@@ -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
|