chef 11.14.6-x86-mingw32 → 11.16.0-x86-mingw32

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6f91371bb60065252a97632555f0df556cad3fae
4
- data.tar.gz: 1bb4529b9515de55e1ffd4ad6cd617e4545ca1e5
3
+ metadata.gz: 49b6fe3b7b3cc9463d7faa2c42c063805a8c0622
4
+ data.tar.gz: bf2edeaa5447924dc2f5d6c4f21409f99e268f03
5
5
  SHA512:
6
- metadata.gz: df49419774cdffd4dc4605f060b425bd544cebc16f6e244c5baa09f31eef7b88114bd0227fa659040cf7fa9d45b51d089a617d573723d8d5aa29970dd3595b34
7
- data.tar.gz: 1c5f519f24807ce4c72996a1faedcddaaee5d07f0b8bc20e0f6e6b57ec440b6eb138c090095ba9f546bbe863354ebb4289b06294b30abea3cbdbdbf85c070a00
6
+ metadata.gz: edd6c14fb435fc1c2ee3f19ae061221c3f895b650b77f44f5142c5ba6b0af671e7205535c76a90f23d24c4e96fbd5e45fb1eeb5f7e0a754733274d9e770b8057
7
+ data.tar.gz: 8f044ddd62016822cc9fdbfd3d80c9d1598b34aff1af8c0274bdfcd5339eebe61bdca9d0bd25c53cb114eded9a62fd45d412752eec5ff6064c2516326e71e986
@@ -117,6 +117,8 @@ class Chef
117
117
  class ObsoleteDependencySyntax < ArgumentError; end
118
118
  class InvalidDataBagPath < ArgumentError; end
119
119
 
120
+ class PowershellCmdletException < RuntimeError; end
121
+
120
122
  # A different version of a cookbook was added to a
121
123
  # VersionedRecipeList than the one already there.
122
124
  class CookbookVersionConflict < ArgumentError ; end
@@ -176,6 +178,8 @@ class Chef
176
178
 
177
179
  class ChildConvergeError < RuntimeError; end
178
180
 
181
+ class NoProviderAvailable < RuntimeError; end
182
+
179
183
  class MissingRole < RuntimeError
180
184
  NULL = Object.new
181
185
 
@@ -41,6 +41,22 @@ class Chef
41
41
  is_i386_process_on_x86_64_windows?
42
42
  end
43
43
 
44
+ def with_os_architecture(node)
45
+ wow64_redirection_state = nil
46
+
47
+ if wow64_architecture_override_required?(node, node_windows_architecture(node))
48
+ wow64_redirection_state = disable_wow64_file_redirection(node)
49
+ end
50
+
51
+ begin
52
+ yield
53
+ ensure
54
+ if wow64_redirection_state
55
+ restore_wow64_file_redirection(node, wow64_redirection_state)
56
+ end
57
+ end
58
+ end
59
+
44
60
  def node_supports_windows_architecture?(node, desired_architecture)
45
61
  assert_valid_windows_architecture!(desired_architecture)
46
62
  return (node_windows_architecture(node) == :x86_64 ||
@@ -45,7 +45,11 @@ class Chef
45
45
 
46
46
  is_server_2003
47
47
  end
48
- end
49
48
 
49
+ def supports_dsc?(node)
50
+ node[:languages] && node[:languages][:powershell] &&
51
+ node[:languages][:powershell][:version].to_i >= 4
52
+ end
53
+ end
50
54
  end
51
55
  end
@@ -0,0 +1,148 @@
1
+ #
2
+ # Author:: Adam Edwards (<adamed@getchef.com>)
3
+ #
4
+ # Copyright:: 2014, Chef Software, Inc.
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ require 'chef/util/powershell/cmdlet'
20
+ require 'chef/util/dsc/configuration_generator'
21
+ require 'chef/util/dsc/local_configuration_manager'
22
+
23
+ class Chef
24
+ class Provider
25
+ class DscScript < Chef::Provider
26
+ def initialize(dsc_resource, run_context)
27
+ super(dsc_resource, run_context)
28
+ @dsc_resource = dsc_resource
29
+ @resource_converged = false
30
+ @operations = {
31
+ :set => Proc.new { |config_manager, document|
32
+ config_manager.set_configuration(document)
33
+ },
34
+ :test => Proc.new { |config_manager, document|
35
+ config_manager.test_configuration(document)
36
+ }}
37
+ end
38
+
39
+ def action_run
40
+ if ! @resource_converged
41
+ converge_by(generate_description) do
42
+ run_configuration(:set)
43
+ Chef::Log.info("DSC resource configuration completed successfully")
44
+ end
45
+ end
46
+ end
47
+
48
+ def load_current_resource
49
+ @dsc_resources_info = run_configuration(:test)
50
+ @resource_converged = @dsc_resources_info.all? do |resource|
51
+ !resource.changes_state?
52
+ end
53
+ end
54
+
55
+ def whyrun_supported?
56
+ true
57
+ end
58
+
59
+ protected
60
+
61
+ def run_configuration(operation)
62
+ config_directory = ::Dir.mktmpdir("chef-dsc-script")
63
+ configuration_data_path = get_configuration_data_path(config_directory)
64
+ configuration_flags = get_augmented_configuration_flags(configuration_data_path)
65
+
66
+ config_manager = Chef::Util::DSC::LocalConfigurationManager.new(@run_context.node, config_directory)
67
+
68
+ begin
69
+ configuration_document = generate_configuration_document(config_directory, configuration_flags)
70
+ @operations[operation].call(config_manager, configuration_document)
71
+ rescue Exception => e
72
+ Chef::Log.error("DSC operation failed: #{e.message.to_s}")
73
+ raise e
74
+ ensure
75
+ ::FileUtils.rm_rf(config_directory)
76
+ end
77
+ end
78
+
79
+ def get_augmented_configuration_flags(configuration_data_path)
80
+ updated_flags = nil
81
+ if configuration_data_path
82
+ updated_flags = @dsc_resource.flags.nil? ? {} : @dsc_resource.flags.dup
83
+ Chef::Util::PathHelper.validate_path(configuration_data_path)
84
+ updated_flags[:configurationdata] = configuration_data_path
85
+ end
86
+ updated_flags
87
+ end
88
+
89
+ def generate_configuration_document(config_directory, configuration_flags)
90
+ shellout_flags = {
91
+ :cwd => @dsc_resource.cwd,
92
+ :environment => @dsc_resource.environment,
93
+ :timeout => @dsc_resource.timeout
94
+ }
95
+
96
+ generator = Chef::Util::DSC::ConfigurationGenerator.new(@run_context.node, config_directory)
97
+
98
+ if @dsc_resource.command
99
+ generator.configuration_document_from_script_path(@dsc_resource.command, configuration_name, configuration_flags, shellout_flags)
100
+ else
101
+ # If code is also not provided, we mimic what the other script resources do (execute nothing)
102
+ Chef::Log.warn("Neither code or command were provided for dsc_resource[#{@dsc_resource.name}].") unless @dsc_resource.code
103
+ generator.configuration_document_from_script_code(@dsc_resource.code || '', configuration_flags, shellout_flags)
104
+ end
105
+ end
106
+
107
+ def get_configuration_data_path(config_directory)
108
+ if @dsc_resource.configuration_data_script
109
+ @dsc_resource.configuration_data_script
110
+ elsif @dsc_resource.configuration_data
111
+ configuration_data_path = "#{config_directory}/chef_dsc_config_data.psd1"
112
+ ::File.open(configuration_data_path, 'wt') do | script |
113
+ script.write(@dsc_resource.configuration_data)
114
+ end
115
+ configuration_data_path
116
+ end
117
+ end
118
+
119
+ def configuration_name
120
+ @dsc_resource.configuration_name || @dsc_resource.name
121
+ end
122
+
123
+ def configuration_friendly_name
124
+ if @dsc_resource.code
125
+ @dsc_resource.name
126
+ else
127
+ configuration_name
128
+ end
129
+ end
130
+
131
+ private
132
+
133
+ def generate_description
134
+ ["converge DSC configuration '#{configuration_friendly_name}'"] +
135
+ @dsc_resources_info.map do |resource|
136
+ if resource.changes_state?
137
+ # We ignore the last log message because it only contains the time it took, which looks weird
138
+ cleaned_messages = resource.change_log[0..-2].map { |c| c.sub(/^#{Regexp.escape(resource.name)}/, '').strip }
139
+ "converge DSC resource #{resource.name} by #{cleaned_messages.find_all{ |c| c != ''}.join("\n")}"
140
+ else
141
+ # This is needed because a dsc script can have resouces that are both converged and not
142
+ "converge DSC resource #{resource.name} by doing nothing because it is already converged"
143
+ end
144
+ end
145
+ end
146
+ end
147
+ end
148
+ end
@@ -110,18 +110,18 @@ user password using shadow hash.")
110
110
  @current_resource = Chef::Resource::User.new(@new_resource.username)
111
111
  @current_resource.username(@new_resource.username)
112
112
 
113
- user_info = read_user_info
114
- if user_info
115
- @current_resource.uid(dscl_get(user_info, :uid))
116
- @current_resource.gid(dscl_get(user_info, :gid))
117
- @current_resource.home(dscl_get(user_info, :home))
118
- @current_resource.shell(dscl_get(user_info, :shell))
119
- @current_resource.comment(dscl_get(user_info, :comment))
120
- @authentication_authority = dscl_get(user_info, :auth_authority)
121
-
122
- if @new_resource.password && dscl_get(user_info, :password) == "********"
113
+ @user_info = read_user_info
114
+ if @user_info
115
+ @current_resource.uid(dscl_get(@user_info, :uid))
116
+ @current_resource.gid(dscl_get(@user_info, :gid))
117
+ @current_resource.home(dscl_get(@user_info, :home))
118
+ @current_resource.shell(dscl_get(@user_info, :shell))
119
+ @current_resource.comment(dscl_get(@user_info, :comment))
120
+ @authentication_authority = dscl_get(@user_info, :auth_authority)
121
+
122
+ if @new_resource.password && dscl_get(@user_info, :password) == "********"
123
123
  # A password is set. Let's get the password information from shadow file
124
- shadow_hash_binary = dscl_get(user_info, :shadow_hash)
124
+ shadow_hash_binary = dscl_get(@user_info, :shadow_hash)
125
125
 
126
126
  # Calling shell_out directly since we want to give an input stream
127
127
  shadow_hash_xml = convert_binary_plist_to_xml(shadow_hash_binary.string)
@@ -158,22 +158,26 @@ user password using shadow hash.")
158
158
 
159
159
  def create_user
160
160
  dscl_create_user
161
+ # set_password modifies the plist file of the user directly. So update
162
+ # the password first before making any modifications to the user.
163
+ set_password
161
164
  dscl_create_comment
162
165
  dscl_set_uid
163
166
  dscl_set_gid
164
167
  dscl_set_home
165
168
  dscl_set_shell
166
- set_password
167
169
  end
168
170
 
169
171
  def manage_user
172
+ # set_password modifies the plist file of the user directly. So update
173
+ # the password first before making any modifications to the user.
174
+ set_password if diverged_password?
170
175
  dscl_create_user if diverged?(:username)
171
176
  dscl_create_comment if diverged?(:comment)
172
177
  dscl_set_uid if diverged?(:uid)
173
178
  dscl_set_gid if diverged?(:gid)
174
179
  dscl_set_home if diverged?(:home)
175
180
  dscl_set_shell if diverged?(:shell)
176
- set_password if diverged_password?
177
181
  end
178
182
 
179
183
  #
@@ -339,22 +343,18 @@ user password using shadow hash.")
339
343
  :input => shadow_info.to_plist, :live_stream => shadow_info_binary)
340
344
  command.run_command
341
345
 
346
+ if @user_info.nil?
347
+ # User is just created. read_user_info() will read the fresh information
348
+ # for the user with a cache flush. However with experimentation we've seen
349
+ # that dscl cache is not immediately updated after the creation of the user
350
+ # This is odd and needs to be investigated further.
351
+ sleep 3
352
+ @user_info = read_user_info
353
+ end
354
+
342
355
  # Replace the shadow info in user's plist
343
- user_info = read_user_info
344
- dscl_set(user_info, :shadow_hash, shadow_info_binary)
345
-
346
- #
347
- # Before saving the user's plist file we need to wait for dscl to
348
- # update its caches and flush them to disk. In order to achieve this
349
- # we need to wait first for our changes to get into the dscl cache
350
- # and then flush the cache to disk before saving password into the
351
- # plist file. 3 seconds is the minimum experimental value for dscl
352
- # cache to be updated. We can get rid of this sleep when we find a
353
- # trigger to update dscl cache.
354
- #
355
- sleep 3
356
- shell_out("dscacheutil '-flushcache'")
357
- save_user_info(user_info)
356
+ dscl_set(@user_info, :shadow_hash, shadow_info_binary)
357
+ save_user_info(@user_info)
358
358
  end
359
359
 
360
360
  #
@@ -555,6 +555,10 @@ user password using shadow hash.")
555
555
  def read_user_info
556
556
  user_info = nil
557
557
 
558
+ # We flush the cache here in order to make sure that we read fresh information
559
+ # for the user.
560
+ shell_out("dscacheutil '-flushcache'")
561
+
558
562
  begin
559
563
  user_plist_file = "#{USER_PLIST_DIRECTORY}/#{@new_resource.username}.plist"
560
564
  user_plist_info = run_plutil("convert xml1 -o - #{user_plist_file}")
@@ -24,6 +24,7 @@ require 'chef/provider/cron/solaris'
24
24
  require 'chef/provider/cron/aix'
25
25
  require 'chef/provider/deploy'
26
26
  require 'chef/provider/directory'
27
+ require 'chef/provider/dsc_script'
27
28
  require 'chef/provider/env'
28
29
  require 'chef/provider/erl_call'
29
30
  require 'chef/provider/execute'
@@ -0,0 +1,140 @@
1
+ #
2
+ # Author:: Adam Edwards (<adamed@getchef.com>)
3
+ # Copyright:: Copyright (c) 2014 Chef Software, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ require 'chef/exceptions'
20
+
21
+ class Chef
22
+ class Resource
23
+ class DscScript < Chef::Resource
24
+
25
+ provides :dsc_script, :on_platforms => ["windows"]
26
+
27
+ def initialize(name, run_context=nil)
28
+ super
29
+ @allowed_actions.push(:run)
30
+ @action = :run
31
+ if(run_context && Chef::Platform.supports_dsc?(run_context.node))
32
+ @provider = Chef::Provider::DscScript
33
+ else
34
+ raise Chef::Exceptions::NoProviderAvailable,
35
+ "#{powershell_info_str(run_context)}\nPowershell 4.0 or higher was not detected on your system and is required to use the dsc_script resource."
36
+ end
37
+ end
38
+
39
+ def code(arg=nil)
40
+ if arg && command
41
+ raise ArgumentError, "Only one of 'code' and 'command' attributes may be specified"
42
+ end
43
+ if arg && configuration_name
44
+ raise ArgumentError, "The 'code' and 'command' attributes may not be used together"
45
+ end
46
+ set_or_return(
47
+ :code,
48
+ arg,
49
+ :kind_of => [ String ]
50
+ )
51
+ end
52
+
53
+ def configuration_name(arg=nil)
54
+ if arg && code
55
+ raise ArgumentError, "Attribute `configuration_name` may not be set if `code` is set"
56
+ end
57
+ set_or_return(
58
+ :configuration_name,
59
+ arg,
60
+ :kind_of => [ String ]
61
+ )
62
+ end
63
+
64
+ def command(arg=nil)
65
+ if arg && code
66
+ raise ArgumentError, "The 'code' and 'command' attributes may not be used together"
67
+ end
68
+ set_or_return(
69
+ :command,
70
+ arg,
71
+ :kind_of => [ String ]
72
+ )
73
+ end
74
+
75
+ def configuration_data(arg=nil)
76
+ if arg && configuration_data_script
77
+ raise ArgumentError, "The 'configuration_data' and 'configuration_data_script' attributes may not be used together"
78
+ end
79
+ set_or_return(
80
+ :configuration_data,
81
+ arg,
82
+ :kind_of => [ String ]
83
+ )
84
+ end
85
+
86
+ def configuration_data_script(arg=nil)
87
+ if arg && configuration_data
88
+ raise ArgumentError, "The 'configuration_data' and 'configuration_data_script' attributes may not be used together"
89
+ end
90
+ set_or_return(
91
+ :configuration_data_script,
92
+ arg,
93
+ :kind_of => [ String ]
94
+ )
95
+ end
96
+
97
+ def flags(arg=nil)
98
+ set_or_return(
99
+ :flags,
100
+ arg,
101
+ :kind_of => [ Hash ]
102
+ )
103
+ end
104
+
105
+ def cwd(arg=nil)
106
+ set_or_return(
107
+ :cwd,
108
+ arg,
109
+ :kind_of => [ String ]
110
+ )
111
+ end
112
+
113
+ def environment(arg=nil)
114
+ set_or_return(
115
+ :environment,
116
+ arg,
117
+ :kind_of => [ Hash ]
118
+ )
119
+ end
120
+
121
+ def timeout(arg=nil)
122
+ set_or_return(
123
+ :timeout,
124
+ arg,
125
+ :kind_of => [ Integer ]
126
+ )
127
+ end
128
+
129
+ private
130
+
131
+ def powershell_info_str(run_context)
132
+ if run_context && run_context.node[:languages] && run_context.node[:languages][:powershell]
133
+ install_info = "Powershell #{run_context.node[:languages][:powershell][:version]} was found on the system."
134
+ else
135
+ install_info = 'Powershell was not found.'
136
+ end
137
+ end
138
+ end
139
+ end
140
+ end