chef 14.8.12-universal-mingw32 → 14.9.13-universal-mingw32
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -1
- data/chef.gemspec +1 -1
- data/distro/ruby_bin_folder/msvcp140.dll +0 -0
- data/distro/ruby_bin_folder/vcruntime140.dll +0 -0
- data/lib/chef/api_client.rb +1 -1
- data/lib/chef/api_client/registration.rb +1 -1
- data/lib/chef/api_client_v1.rb +4 -4
- data/lib/chef/chef_fs/file_system/chef_server/acl_entry.rb +1 -1
- data/lib/chef/chef_fs/file_system/chef_server/cookbook_dir.rb +2 -2
- data/lib/chef/chef_fs/file_system/chef_server/cookbook_file.rb +1 -1
- data/lib/chef/chef_fs/file_system/chef_server/cookbooks_dir.rb +1 -1
- data/lib/chef/chef_fs/file_system/chef_server/data_bag_dir.rb +1 -1
- data/lib/chef/chef_fs/file_system/chef_server/data_bags_dir.rb +2 -2
- data/lib/chef/chef_fs/file_system/chef_server/nodes_dir.rb +1 -1
- data/lib/chef/chef_fs/file_system/chef_server/organization_invites_entry.rb +1 -1
- data/lib/chef/chef_fs/file_system/chef_server/organization_members_entry.rb +1 -1
- data/lib/chef/chef_fs/file_system/chef_server/policies_dir.rb +3 -3
- data/lib/chef/chef_fs/file_system/chef_server/policy_group_entry.rb +2 -2
- data/lib/chef/chef_fs/file_system/chef_server/rest_list_dir.rb +3 -3
- data/lib/chef/chef_fs/file_system/chef_server/rest_list_entry.rb +4 -4
- data/lib/chef/client.rb +2 -2
- data/lib/chef/config_fetcher.rb +1 -1
- data/lib/chef/cookbook_uploader.rb +3 -3
- data/lib/chef/cookbook_version.rb +1 -1
- data/lib/chef/data_bag.rb +1 -1
- data/lib/chef/data_bag_item.rb +1 -1
- data/lib/chef/environment.rb +1 -1
- data/lib/chef/formatters/error_inspectors/cookbook_resolve_error_inspector.rb +1 -1
- data/lib/chef/formatters/error_inspectors/cookbook_sync_error_inspector.rb +1 -1
- data/lib/chef/formatters/error_inspectors/node_load_error_inspector.rb +1 -1
- data/lib/chef/formatters/error_inspectors/registration_error_inspector.rb +1 -1
- data/lib/chef/formatters/error_inspectors/run_list_expansion_error_inspector.rb +1 -1
- data/lib/chef/http.rb +3 -3
- data/lib/chef/key.rb +1 -1
- data/lib/chef/knife.rb +1 -1
- data/lib/chef/knife/bootstrap/client_builder.rb +1 -1
- data/lib/chef/knife/cookbook_delete.rb +1 -1
- data/lib/chef/knife/cookbook_upload.rb +1 -1
- data/lib/chef/knife/data_bag_create.rb +1 -1
- data/lib/chef/knife/raw.rb +1 -1
- data/lib/chef/knife/search.rb +1 -1
- data/lib/chef/knife/supermarket_share.rb +1 -1
- data/lib/chef/knife/supermarket_unshare.rb +1 -1
- data/lib/chef/mixin/api_version_request_handling.rb +1 -1
- data/lib/chef/monkey_patches/net_http.rb +5 -1
- data/lib/chef/node.rb +4 -4
- data/lib/chef/node/mixin/immutablize_array.rb +5 -0
- data/lib/chef/node/mixin/immutablize_hash.rb +3 -0
- data/lib/chef/org.rb +1 -1
- data/lib/chef/policy_builder/policyfile.rb +1 -1
- data/lib/chef/provider/apt_repository.rb +1 -1
- data/lib/chef/provider/group/windows.rb +1 -0
- data/lib/chef/provider/remote_file/content.rb +1 -1
- data/lib/chef/provider/windows_task.rb +2 -2
- data/lib/chef/resource/group.rb +4 -0
- data/lib/chef/resource/homebrew_cask.rb +8 -8
- data/lib/chef/resource/homebrew_tap.rb +6 -6
- data/lib/chef/resource/openssl_ec_private_key.rb +1 -1
- data/lib/chef/resource/openssl_x509_request.rb +1 -1
- data/lib/chef/resource/powershell_package_source.rb +11 -7
- data/lib/chef/resource/ssh_known_hosts_entry.rb +1 -1
- data/lib/chef/resource/sysctl.rb +6 -6
- data/lib/chef/resource/timezone.rb +17 -1
- data/lib/chef/resource/windows_ad_join.rb +11 -1
- data/lib/chef/resource/windows_certificate.rb +7 -4
- data/lib/chef/resource/windows_printer.rb +3 -3
- data/lib/chef/resource/windows_task.rb +17 -8
- data/lib/chef/role.rb +1 -1
- data/lib/chef/run_list/run_list_expansion.rb +1 -1
- data/lib/chef/user.rb +1 -1
- data/lib/chef/user_v1.rb +4 -4
- data/lib/chef/util/windows/net_group.rb +6 -0
- data/lib/chef/version.rb +1 -1
- data/lib/chef/win32/api/net.rb +16 -0
- data/lib/chef/win32/net.rb +15 -0
- data/lib/chef/win32/version.rb +15 -15
- data/spec/functional/http/simple_spec.rb +10 -10
- data/spec/functional/resource/timezone_spec.rb +39 -0
- data/spec/functional/resource/windows_task_spec.rb +51 -7
- data/spec/integration/knife/client_create_spec.rb +1 -1
- data/spec/integration/knife/client_key_create_spec.rb +1 -1
- data/spec/integration/knife/cookbook_download_spec.rb +1 -1
- data/spec/integration/knife/cookbook_show_spec.rb +2 -2
- data/spec/integration/knife/data_bag_create_spec.rb +1 -1
- data/spec/integration/knife/environment_create_spec.rb +1 -1
- data/spec/integration/knife/node_create_spec.rb +1 -1
- data/spec/integration/knife/role_create_spec.rb +1 -1
- data/spec/support/shared/context/client.rb +1 -1
- data/spec/support/shared/unit/api_error_inspector.rb +5 -5
- data/spec/support/shared/unit/api_versioning.rb +2 -2
- data/spec/unit/api_client/registration_spec.rb +1 -1
- data/spec/unit/api_client_spec.rb +2 -2
- data/spec/unit/api_client_v1_spec.rb +3 -3
- data/spec/unit/chef_fs/file_system/operation_failed_error_spec.rb +1 -1
- data/spec/unit/client_spec.rb +2 -2
- data/spec/unit/data_bag_item_spec.rb +1 -1
- data/spec/unit/data_bag_spec.rb +1 -1
- data/spec/unit/formatters/error_inspectors/cookbook_resolve_error_inspector_spec.rb +4 -4
- data/spec/unit/formatters/error_inspectors/run_list_expansion_error_inspector_spec.rb +2 -2
- data/spec/unit/knife/bootstrap/client_builder_spec.rb +1 -1
- data/spec/unit/knife/cookbook_delete_spec.rb +3 -3
- data/spec/unit/knife/data_bag_create_spec.rb +2 -2
- data/spec/unit/knife/supermarket_share_spec.rb +1 -1
- data/spec/unit/knife/supermarket_unshare_spec.rb +3 -3
- data/spec/unit/knife_spec.rb +7 -7
- data/spec/unit/mixin/api_version_request_handling_spec.rb +2 -2
- data/spec/unit/node_spec.rb +2 -2
- data/spec/unit/policy_builder/policyfile_spec.rb +2 -2
- data/spec/unit/provider/group/windows_spec.rb +15 -0
- data/spec/unit/provider/remote_file/content_spec.rb +2 -2
- data/spec/unit/resource/group_spec.rb +17 -0
- data/spec/unit/resource/powershell_package_source_spec.rb +2 -2
- data/spec/unit/resource/windows_certificate.rb +7 -0
- data/spec/unit/resource/windows_task_spec.rb +61 -20
- data/spec/unit/resource_reporter_spec.rb +7 -7
- data/spec/unit/user_v1_spec.rb +2 -2
- metadata +15 -6
@@ -104,7 +104,7 @@ class Chef
|
|
104
104
|
keys = r.variables[:entries].reject(&:empty?)
|
105
105
|
|
106
106
|
if key_exists?(keys, key, comment)
|
107
|
-
Chef::Log.debug "Known hosts key for #{new_resource.
|
107
|
+
Chef::Log.debug "Known hosts key for #{new_resource.host} already exists - skipping"
|
108
108
|
else
|
109
109
|
r.variables[:entries].push(key)
|
110
110
|
end
|
data/lib/chef/resource/sysctl.rb
CHANGED
@@ -80,7 +80,7 @@ class Chef
|
|
80
80
|
|
81
81
|
directory new_resource.conf_dir
|
82
82
|
|
83
|
-
file "#{new_resource.conf_dir}/99-chef-#{new_resource.key}.conf" do
|
83
|
+
file "#{new_resource.conf_dir}/99-chef-#{new_resource.key.tr('/', '.')}.conf" do
|
84
84
|
content "#{new_resource.key} = #{new_resource.value}"
|
85
85
|
end
|
86
86
|
|
@@ -96,9 +96,9 @@ class Chef
|
|
96
96
|
description "Remove a sysctl value."
|
97
97
|
|
98
98
|
# only converge the resource if the file actually exists to delete
|
99
|
-
if ::File.exist?("#{new_resource.conf_dir}/99-chef-#{new_resource.key}.conf")
|
100
|
-
converge_by "removing sysctl config at #{new_resource.conf_dir}/99-chef-#{new_resource.key}.conf" do
|
101
|
-
file "#{new_resource.conf_dir}/99-chef-#{new_resource.key}.conf" do
|
99
|
+
if ::File.exist?("#{new_resource.conf_dir}/99-chef-#{new_resource.key.tr('/', '.')}.conf")
|
100
|
+
converge_by "removing sysctl config at #{new_resource.conf_dir}/99-chef-#{new_resource.key.tr('/', '.')}.conf" do
|
101
|
+
file "#{new_resource.conf_dir}/99-chef-#{new_resource.key.tr('/', '.')}.conf" do
|
102
102
|
action :delete
|
103
103
|
end
|
104
104
|
|
@@ -140,8 +140,8 @@ class Chef
|
|
140
140
|
# return the value. Raise in case this conf file needs to be created
|
141
141
|
# or updated
|
142
142
|
def get_sysctld_value(key)
|
143
|
-
raise unless ::File.exist?("/etc/sysctl.d/99-chef-#{key}.conf")
|
144
|
-
k, v = ::File.read("/etc/sysctl.d/99-chef-#{key}.conf").match(/(.*) = (.*)/).captures
|
143
|
+
raise unless ::File.exist?("/etc/sysctl.d/99-chef-#{key.tr('/', '.')}.conf")
|
144
|
+
k, v = ::File.read("/etc/sysctl.d/99-chef-#{key.tr('/', '.')}.conf").match(/(.*) = (.*)/).captures
|
145
145
|
raise "Unknown sysctl key!" if k.nil?
|
146
146
|
raise "Unknown sysctl value!" if v.nil?
|
147
147
|
v
|
@@ -25,7 +25,7 @@ class Chef
|
|
25
25
|
preview_resource true
|
26
26
|
resource_name :timezone
|
27
27
|
|
28
|
-
description "Use the timezone resource to change the system timezone on Linux and macOS hosts. Timezones are specified in tz database format, with a complete list of available TZ values here https://en.wikipedia.org/wiki/List_of_tz_database_time_zones."
|
28
|
+
description "Use the timezone resource to change the system timezone on Windows, Linux, and macOS hosts. Timezones are specified in tz database format, with a complete list of available TZ values for Linux and macOS here: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones and for Windows here: https://ss64.com/nt/timezones.html."
|
29
29
|
introduced "14.6"
|
30
30
|
|
31
31
|
property :timezone, String,
|
@@ -96,6 +96,12 @@ class Chef
|
|
96
96
|
shell_out!("sudo systemsetup -settimezone #{new_resource.timezone}")
|
97
97
|
end
|
98
98
|
end
|
99
|
+
when "windows"
|
100
|
+
unless current_windows_tz.casecmp?(new_resource.timezone)
|
101
|
+
converge_by("setting timezone to \"#{new_resource.timezone}\"") do
|
102
|
+
shell_out!("tzutil /s \"#{new_resource.timezone}\"")
|
103
|
+
end
|
104
|
+
end
|
99
105
|
end
|
100
106
|
end
|
101
107
|
end
|
@@ -113,6 +119,16 @@ class Chef
|
|
113
119
|
/Time Zone: (.*)/.match(tz_shellout.stdout)[1]
|
114
120
|
end
|
115
121
|
end
|
122
|
+
|
123
|
+
# detect the current timezone on windows hosts
|
124
|
+
#
|
125
|
+
# @since 14.9
|
126
|
+
# @return [String] timezone id
|
127
|
+
def current_windows_tz
|
128
|
+
tz_shellout = shell_out("tzutil /g")
|
129
|
+
raise "There was an error running the tzutil command" if tz_shellout.exitstatus == 1
|
130
|
+
tz_shellout.stdout.strip
|
131
|
+
end
|
116
132
|
end
|
117
133
|
end
|
118
134
|
end
|
@@ -73,7 +73,13 @@ class Chef
|
|
73
73
|
|
74
74
|
converge_by("join Active Directory domain #{new_resource.domain_name}") do
|
75
75
|
ps_run = powershell_out(cmd)
|
76
|
-
|
76
|
+
if ps_run.error?
|
77
|
+
if sensitive?
|
78
|
+
raise "Failed to join the domain #{new_resource.domain_name}: *suppressed sensitive resource output*"
|
79
|
+
else
|
80
|
+
raise "Failed to join the domain #{new_resource.domain_name}: #{ps_run.stderr}"
|
81
|
+
end
|
82
|
+
end
|
77
83
|
|
78
84
|
unless new_resource.reboot == :never
|
79
85
|
reboot "Reboot to join domain #{new_resource.domain_name}" do
|
@@ -104,6 +110,10 @@ class Chef
|
|
104
110
|
reboot_action
|
105
111
|
end
|
106
112
|
end
|
113
|
+
|
114
|
+
def sensitive?
|
115
|
+
!!new_resource.sensitive
|
116
|
+
end
|
107
117
|
end
|
108
118
|
end
|
109
119
|
end
|
@@ -59,7 +59,6 @@ class Chef
|
|
59
59
|
|
60
60
|
action :create do
|
61
61
|
description "Creates or updates a certificate."
|
62
|
-
|
63
62
|
add_cert(OpenSSL::X509::Certificate.new(raw_source))
|
64
63
|
end
|
65
64
|
|
@@ -91,8 +90,12 @@ class Chef
|
|
91
90
|
|
92
91
|
action :delete do
|
93
92
|
description "Deletes a certificate."
|
94
|
-
|
95
|
-
|
93
|
+
cert_obj = fetch_cert
|
94
|
+
if cert_obj
|
95
|
+
converge_by("Deleting certificate #{new_resource.source} from Store #{new_resource.store_name}") do
|
96
|
+
delete_cert
|
97
|
+
end
|
98
|
+
end
|
96
99
|
end
|
97
100
|
|
98
101
|
action :fetch do
|
@@ -250,7 +253,7 @@ class Chef
|
|
250
253
|
when ".cer"
|
251
254
|
powershell_out("openssl x509 -text -inform DER -in #{source} -outform PEM").stdout
|
252
255
|
when ".pfx"
|
253
|
-
powershell_out("openssl pkcs12 -in #{source} -nodes -passin pass
|
256
|
+
powershell_out("openssl pkcs12 -in #{source} -nodes -passin pass:'#{new_resource.pfx_password}'").stdout
|
254
257
|
when ".p7b"
|
255
258
|
powershell_out("openssl pkcs7 -print_certs -in #{source} -outform PEM").stdout
|
256
259
|
end
|
@@ -114,7 +114,7 @@ class Chef
|
|
114
114
|
|
115
115
|
port_name = "IP_#{new_resource.ipv4_address}"
|
116
116
|
|
117
|
-
declare_resource(:powershell_script, "Creating printer: #{new_resource.
|
117
|
+
declare_resource(:powershell_script, "Creating printer: #{new_resource.device_id}") do
|
118
118
|
code <<-EOH
|
119
119
|
|
120
120
|
Set-WmiInstance -class Win32_Printer `
|
@@ -133,9 +133,9 @@ class Chef
|
|
133
133
|
end
|
134
134
|
|
135
135
|
def delete_printer
|
136
|
-
declare_resource(:powershell_script, "Deleting printer: #{new_resource.
|
136
|
+
declare_resource(:powershell_script, "Deleting printer: #{new_resource.device_id}") do
|
137
137
|
code <<-EOH
|
138
|
-
$printer = Get-WMIObject -class Win32_Printer -EnableAllPrivileges -Filter "name = '#{new_resource.
|
138
|
+
$printer = Get-WMIObject -class Win32_Printer -EnableAllPrivileges -Filter "name = '#{new_resource.device_id}'"
|
139
139
|
$printer.Delete()
|
140
140
|
EOH
|
141
141
|
end
|
@@ -143,7 +143,6 @@ class Chef
|
|
143
143
|
validate_start_time(start_time, frequency)
|
144
144
|
validate_start_day(start_day, frequency) if start_day
|
145
145
|
validate_user_and_password(user, password)
|
146
|
-
validate_interactive_setting(interactive_enabled, password)
|
147
146
|
validate_create_frequency_modifier(frequency, frequency_modifier) if frequency_modifier
|
148
147
|
validate_create_day(day, frequency, frequency_modifier) if day
|
149
148
|
validate_create_months(months, frequency) if months
|
@@ -226,20 +225,30 @@ class Chef
|
|
226
225
|
end
|
227
226
|
end
|
228
227
|
|
228
|
+
# System users will not require a password
|
229
|
+
# Other users will require a password if the task is non-interactive.
|
230
|
+
#
|
231
|
+
# @param [String] user
|
232
|
+
# @param [String] password
|
233
|
+
#
|
229
234
|
def validate_user_and_password(user, password)
|
230
|
-
if
|
231
|
-
|
235
|
+
if non_system_user?(user)
|
236
|
+
if password.nil? && !interactive_enabled
|
237
|
+
raise ArgumentError, "Please provide a password or check if this task needs to be interactive! Valid passwordless users are: '#{Chef::ReservedNames::Win32::Security::SID::SYSTEM_USER.join("', '")}'"
|
238
|
+
end
|
239
|
+
else
|
240
|
+
unless password.nil?
|
241
|
+
raise ArgumentError, "Password is not required for system users."
|
242
|
+
end
|
232
243
|
end
|
233
244
|
end
|
234
245
|
|
246
|
+
# Password is not required for system user and required for non-system user.
|
235
247
|
def password_required?(user)
|
236
|
-
|
237
|
-
@password_required ||= !Chef::ReservedNames::Win32::Security::SID.system_user?(user)
|
248
|
+
@password_required ||= (!user.nil? && !Chef::ReservedNames::Win32::Security::SID.system_user?(user))
|
238
249
|
end
|
239
250
|
|
240
|
-
|
241
|
-
raise ArgumentError, "Please provide the password when attempting to set interactive/non-interactive." if interactive_enabled && password.nil?
|
242
|
-
end
|
251
|
+
alias non_system_user? password_required?
|
243
252
|
|
244
253
|
def validate_create_frequency_modifier(frequency, frequency_modifier)
|
245
254
|
if ([:on_logon, :onstart, :on_idle, :none].include?(frequency)) && ( frequency_modifier != 1)
|
data/lib/chef/role.rb
CHANGED
@@ -224,7 +224,7 @@ class Chef
|
|
224
224
|
def save
|
225
225
|
begin
|
226
226
|
chef_server_rest.put("roles/#{@name}", self)
|
227
|
-
rescue Net::
|
227
|
+
rescue Net::HTTPClientException => e
|
228
228
|
raise e unless e.response.code == "404"
|
229
229
|
chef_server_rest.post("roles", self)
|
230
230
|
end
|
@@ -219,7 +219,7 @@ class Chef
|
|
219
219
|
|
220
220
|
def fetch_role(name, included_by)
|
221
221
|
Chef::Role.from_hash(rest.get("roles/#{name}"))
|
222
|
-
rescue Net::
|
222
|
+
rescue Net::HTTPClientException => e
|
223
223
|
if e.message == '404 "Not Found"'
|
224
224
|
role_not_found(name, included_by)
|
225
225
|
else
|
data/lib/chef/user.rb
CHANGED
data/lib/chef/user_v1.rb
CHANGED
@@ -164,7 +164,7 @@ class Chef
|
|
164
164
|
new_user["public_key"] = new_user["chef_key"]["public_key"]
|
165
165
|
new_user.delete("chef_key")
|
166
166
|
end
|
167
|
-
rescue Net::
|
167
|
+
rescue Net::HTTPClientException => e
|
168
168
|
# rescue API V0 if 406 and the server supports V0
|
169
169
|
supported_versions = server_client_api_version_intersection(e, SUPPORTED_API_VERSIONS)
|
170
170
|
raise e unless supported_versions && supported_versions.include?(0)
|
@@ -200,7 +200,7 @@ class Chef
|
|
200
200
|
payload[:private_key] = new_key if new_key
|
201
201
|
|
202
202
|
updated_user = chef_root_rest_v1.put("users/#{username}", payload)
|
203
|
-
rescue Net::
|
203
|
+
rescue Net::HTTPClientException => e
|
204
204
|
if e.response.code == "400"
|
205
205
|
# if a 400 is returned but the error message matches the error related to private / public key fields, try V0
|
206
206
|
# else, raise the 400
|
@@ -220,7 +220,7 @@ class Chef
|
|
220
220
|
|
221
221
|
def save(new_key = false)
|
222
222
|
create
|
223
|
-
rescue Net::
|
223
|
+
rescue Net::HTTPClientException => e
|
224
224
|
if e.response.code == "409"
|
225
225
|
update(new_key)
|
226
226
|
else
|
@@ -235,7 +235,7 @@ class Chef
|
|
235
235
|
reregistered_self = chef_root_rest_v0.put("users/#{username}", payload)
|
236
236
|
private_key(reregistered_self["private_key"])
|
237
237
|
# only V0 supported for reregister
|
238
|
-
rescue Net::
|
238
|
+
rescue Net::HTTPClientException => e
|
239
239
|
# if there was a 406 related to versioning, give error explaining that
|
240
240
|
# only API version 0 is supported for reregister command
|
241
241
|
if e.response.code == "406" && e.response["x-ops-server-api-version"]
|
@@ -58,6 +58,12 @@ class Chef::Util::Windows::NetGroup
|
|
58
58
|
raise ArgumentError, e
|
59
59
|
end
|
60
60
|
|
61
|
+
def local_group_set_info(comment)
|
62
|
+
Chef::ReservedNames::Win32::NetUser.net_local_group_set_info(nil, groupname, comment)
|
63
|
+
rescue Chef::Exceptions::Win32APIError => e
|
64
|
+
raise ArgumentError, e
|
65
|
+
end
|
66
|
+
|
61
67
|
def local_delete_members(members)
|
62
68
|
Chef::ReservedNames::Win32::NetUser.net_local_group_del_members(nil, groupname, members)
|
63
69
|
rescue Chef::Exceptions::Win32APIError => e
|
data/lib/chef/version.rb
CHANGED
data/lib/chef/win32/api/net.rb
CHANGED
@@ -144,6 +144,11 @@ class Chef
|
|
144
144
|
layout :lgrpi0_name, :LPWSTR
|
145
145
|
end
|
146
146
|
|
147
|
+
class LOCALGROUP_INFO_1 < FFI::Struct
|
148
|
+
layout :lgrpi1_name, :LPWSTR,
|
149
|
+
:lgrpi1_comment, :LPWSTR
|
150
|
+
end
|
151
|
+
|
147
152
|
class USE_INFO_2 < FFI::Struct
|
148
153
|
include StructHelpers
|
149
154
|
|
@@ -168,6 +173,17 @@ class Chef
|
|
168
173
|
:LPCWSTR, :DWORD, :LPBYTE, :LPDWORD
|
169
174
|
], :DWORD
|
170
175
|
|
176
|
+
# NET_API_STATUS NetLocalGroupSetInfo(
|
177
|
+
# _In_ LPCWSTR servername,
|
178
|
+
# _In_ LPCWSTR groupname,
|
179
|
+
# _In_ DWORD level,
|
180
|
+
# _In_ LPBYTE buf,
|
181
|
+
# _Out_ LPDWORD parm_err
|
182
|
+
# );
|
183
|
+
safe_attach_function :NetLocalGroupSetInfo, [
|
184
|
+
:LPCWSTR, :LPCWSTR, :DWORD, :LPBYTE, :LPDWORD
|
185
|
+
], :DWORD
|
186
|
+
|
171
187
|
# NET_API_STATUS NetLocalGroupDel(
|
172
188
|
# _In_ LPCWSTR servername,
|
173
189
|
# _In_ LPCWSTR groupname
|
data/lib/chef/win32/net.rb
CHANGED
@@ -180,6 +180,21 @@ class Chef
|
|
180
180
|
end
|
181
181
|
end
|
182
182
|
|
183
|
+
def self.net_local_group_set_info(server_name, group_name, comment)
|
184
|
+
server_name = wstring(server_name)
|
185
|
+
group_name = wstring(group_name)
|
186
|
+
comment = wstring(comment)
|
187
|
+
|
188
|
+
buf = LOCALGROUP_INFO_1.new
|
189
|
+
buf[:lgrpi1_name] = FFI::MemoryPointer.from_string(group_name)
|
190
|
+
buf[:lgrpi1_comment] = FFI::MemoryPointer.from_string(comment)
|
191
|
+
|
192
|
+
rc = NetLocalGroupSetInfo(server_name, group_name, 1, buf, nil)
|
193
|
+
if rc != NERR_Success
|
194
|
+
Chef::ReservedNames::Win32::Error.raise!(nil, rc)
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
183
198
|
def self.net_user_del(server_name, user_name)
|
184
199
|
server_name = wstring(server_name)
|
185
200
|
user_name = wstring(user_name)
|
data/lib/chef/win32/version.rb
CHANGED
@@ -44,25 +44,25 @@ class Chef
|
|
44
44
|
|
45
45
|
def self.method_name_from_marketing_name(marketing_name)
|
46
46
|
"#{marketing_name.gsub(/\s/, '_').tr('.', '_').downcase}?"
|
47
|
-
# "#{marketing_name.gsub(/\s/, '_').gsub(//, '_').downcase}?"
|
48
47
|
end
|
49
48
|
|
50
49
|
private_class_method :method_name_from_marketing_name
|
51
50
|
|
52
51
|
WIN_VERSIONS = {
|
53
|
-
"Windows
|
54
|
-
"Windows
|
55
|
-
"Windows
|
56
|
-
"Windows
|
57
|
-
"Windows
|
58
|
-
"Windows
|
59
|
-
"Windows
|
60
|
-
"Windows
|
61
|
-
"Windows Server 2008" => { major: 6, minor:
|
62
|
-
"Windows
|
63
|
-
"Windows
|
64
|
-
"Windows
|
65
|
-
"Windows Server
|
52
|
+
"Windows Server 2019" => { major: 10, minor: 0, callable: lambda { |product_type, suite_mask, build_number| product_type != VER_NT_WORKSTATION && build_number >= 17763 } },
|
53
|
+
"Windows 10" => { major: 10, minor: 0, callable: lambda { |product_type, suite_mask, build_number| product_type == VER_NT_WORKSTATION } },
|
54
|
+
"Windows Server 2016" => { major: 10, minor: 0, callable: lambda { |product_type, suite_mask, build_number| product_type != VER_NT_WORKSTATION && build_number <= 14393 } },
|
55
|
+
"Windows 8.1" => { major: 6, minor: 3, callable: lambda { |product_type, suite_mask, build_number| product_type == VER_NT_WORKSTATION } },
|
56
|
+
"Windows Server 2012 R2" => { major: 6, minor: 3, callable: lambda { |product_type, suite_mask, build_number| product_type != VER_NT_WORKSTATION } },
|
57
|
+
"Windows 8" => { major: 6, minor: 2, callable: lambda { |product_type, suite_mask, build_number| product_type == VER_NT_WORKSTATION } },
|
58
|
+
"Windows Server 2012" => { major: 6, minor: 2, callable: lambda { |product_type, suite_mask, build_number| product_type != VER_NT_WORKSTATION } },
|
59
|
+
"Windows 7" => { major: 6, minor: 1, callable: lambda { |product_type, suite_mask, build_number| product_type == VER_NT_WORKSTATION } },
|
60
|
+
"Windows Server 2008 R2" => { major: 6, minor: 1, callable: lambda { |product_type, suite_mask, build_number| product_type != VER_NT_WORKSTATION } },
|
61
|
+
"Windows Server 2008" => { major: 6, minor: 0, callable: lambda { |product_type, suite_mask, build_number| product_type != VER_NT_WORKSTATION } },
|
62
|
+
"Windows Vista" => { major: 6, minor: 0, callable: lambda { |product_type, suite_mask, build_number| product_type == VER_NT_WORKSTATION } },
|
63
|
+
"Windows Server 2003 R2" => { major: 5, minor: 2, callable: lambda { |product_type, suite_mask, build_number| get_system_metrics(SM_SERVERR2) != 0 } },
|
64
|
+
"Windows Home Server" => { major: 5, minor: 2, callable: lambda { |product_type, suite_mask, build_number| (suite_mask & VER_SUITE_WH_SERVER) == VER_SUITE_WH_SERVER } },
|
65
|
+
"Windows Server 2003" => { major: 5, minor: 2, callable: lambda { |product_type, suite_mask, build_number| get_system_metrics(SM_SERVERR2) == 0 } },
|
66
66
|
"Windows XP" => { major: 5, minor: 1 },
|
67
67
|
"Windows 2000" => { major: 5, minor: 0 },
|
68
68
|
}.freeze
|
@@ -88,7 +88,7 @@ class Chef
|
|
88
88
|
define_method(method_name) do
|
89
89
|
(@major_version == v[:major]) &&
|
90
90
|
(@minor_version == v[:minor]) &&
|
91
|
-
(v[:callable] ? v[:callable].call(@product_type, @suite_mask) : true)
|
91
|
+
(v[:callable] ? v[:callable].call(@product_type, @suite_mask, @build_number) : true)
|
92
92
|
end
|
93
93
|
marketing_names << [k, method_name]
|
94
94
|
end
|
@@ -61,27 +61,27 @@ describe Chef::HTTP::Simple do
|
|
61
61
|
end
|
62
62
|
|
63
63
|
shared_examples_for "an endpoint that 403s" do
|
64
|
-
it "fails with a Net::
|
65
|
-
expect { http_client.streaming_request(source) }.to raise_error(Net::
|
64
|
+
it "fails with a Net::HTTPClientException for a streaming request" do
|
65
|
+
expect { http_client.streaming_request(source) }.to raise_error(Net::HTTPClientException)
|
66
66
|
end
|
67
67
|
|
68
|
-
it "fails with a Net::
|
69
|
-
expect { http_client.get(source) }.to raise_error(Net::
|
68
|
+
it "fails with a Net::HTTPClientException for a GET request" do
|
69
|
+
expect { http_client.get(source) }.to raise_error(Net::HTTPClientException)
|
70
70
|
end
|
71
71
|
end
|
72
72
|
|
73
73
|
# see CHEF-5100
|
74
74
|
shared_examples_for "a 403 after a successful request when reusing the request object" do
|
75
|
-
it "fails with a Net::
|
75
|
+
it "fails with a Net::HTTPClientException for a streaming request" do
|
76
76
|
tempfile = http_client.streaming_request(source)
|
77
77
|
tempfile.close
|
78
78
|
expect(Digest::MD5.hexdigest(binread(tempfile.path))).to eq(Digest::MD5.hexdigest(expected_content))
|
79
|
-
expect { http_client.streaming_request(source2) }.to raise_error(Net::
|
79
|
+
expect { http_client.streaming_request(source2) }.to raise_error(Net::HTTPClientException)
|
80
80
|
end
|
81
81
|
|
82
|
-
it "fails with a Net::
|
82
|
+
it "fails with a Net::HTTPClientException for a GET request" do
|
83
83
|
expect(Digest::MD5.hexdigest(http_client.get(source))).to eq(Digest::MD5.hexdigest(expected_content))
|
84
|
-
expect { http_client.get(source2) }.to raise_error(Net::
|
84
|
+
expect { http_client.get(source2) }.to raise_error(Net::HTTPClientException)
|
85
85
|
end
|
86
86
|
end
|
87
87
|
|
@@ -120,7 +120,7 @@ describe Chef::HTTP::Simple do
|
|
120
120
|
it "Logs the request and response and bodies for 400 response" do
|
121
121
|
expect do
|
122
122
|
http_client.get("http://localhost:9000/bad_request")
|
123
|
-
end.to raise_error(Net::
|
123
|
+
end.to raise_error(Net::HTTPClientException)
|
124
124
|
expect(@debug_log).to match(/400/)
|
125
125
|
expect(@debug_log).to match(/HTTP Request Header Data/)
|
126
126
|
expect(@debug_log).to match(/HTTP Status and Header Data/)
|
@@ -133,7 +133,7 @@ describe Chef::HTTP::Simple do
|
|
133
133
|
it "Logs the request and response and bodies for 400 POST response" do
|
134
134
|
expect do
|
135
135
|
http_client.post("http://localhost:9000/bad_request", "hithere")
|
136
|
-
end.to raise_error(Net::
|
136
|
+
end.to raise_error(Net::HTTPClientException)
|
137
137
|
expect(@debug_log).to match(/400/)
|
138
138
|
expect(@debug_log).to match(/HTTP Request Header Data/)
|
139
139
|
expect(@debug_log).to match(/HTTP Status and Header Data/)
|