chef 12.5.1 → 12.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +6 -1
- data/README.md +6 -4
- data/Rakefile +1 -4
- data/chef-windows.gemspec +21 -0
- data/chef.gemspec +58 -0
- data/lib/chef/api_client/registration.rb +9 -4
- data/lib/chef/application.rb +3 -84
- data/lib/chef/application/apply.rb +9 -2
- data/lib/chef/application/client.rb +8 -3
- data/lib/chef/application/solo.rb +7 -1
- data/lib/chef/application/windows_service.rb +21 -6
- data/lib/chef/application/windows_service_manager.rb +2 -3
- data/lib/chef/audit/runner.rb +1 -0
- data/lib/chef/chef_class.rb +1 -11
- data/lib/chef/chef_fs/chef_fs_data_store.rb +181 -2
- data/lib/chef/chef_fs/file_system/cookbook_subdir.rb +5 -0
- data/lib/chef/chef_fs/file_system/file_system_entry.rb +11 -7
- data/lib/chef/client.rb +28 -1
- data/lib/chef/cookbook/cookbook_collection.rb +14 -1
- data/lib/chef/cookbook/cookbook_version_loader.rb +1 -1
- data/lib/chef/cookbook/metadata.rb +115 -9
- data/lib/chef/cookbook/remote_file_vendor.rb +1 -1
- data/lib/chef/cookbook_version.rb +6 -2
- data/lib/chef/data_bag.rb +1 -1
- data/lib/chef/data_bag_item.rb +1 -1
- data/lib/chef/digester.rb +5 -1
- data/lib/chef/dsl/chef_provisioning.rb +57 -0
- data/lib/chef/dsl/cheffish.rb +64 -0
- data/lib/chef/dsl/declare_resource.rb +108 -0
- data/lib/chef/dsl/platform_introspection.rb +3 -3
- data/lib/chef/dsl/recipe.rb +3 -73
- data/lib/chef/dsl/resources.rb +27 -1
- data/lib/chef/event_dispatch/base.rb +3 -0
- data/lib/chef/event_dispatch/dispatcher.rb +5 -0
- data/lib/chef/event_dispatch/events_output_stream.rb +8 -0
- data/lib/chef/exceptions.rb +21 -1
- data/lib/chef/file_access_control/unix.rb +12 -12
- data/lib/chef/file_content_management/deploy/cp.rb +2 -2
- data/lib/chef/file_content_management/deploy/mv_unix.rb +4 -4
- data/lib/chef/file_content_management/deploy/mv_windows.rb +1 -1
- data/lib/chef/formatters/base.rb +7 -0
- data/lib/chef/formatters/error_inspectors/compile_error_inspector.rb +2 -2
- data/lib/chef/formatters/indentable_output_stream.rb +5 -0
- data/lib/chef/http.rb +19 -3
- data/lib/chef/http/decompressor.rb +2 -2
- data/lib/chef/json_compat.rb +1 -0
- data/lib/chef/knife.rb +16 -2
- data/lib/chef/knife/bootstrap.rb +55 -10
- data/lib/chef/knife/cookbook_site_install.rb +5 -1
- data/lib/chef/knife/core/bootstrap_context.rb +2 -1
- data/lib/chef/knife/core/node_presenter.rb +1 -1
- data/lib/chef/knife/ssh.rb +30 -16
- data/lib/chef/knife/ssl_check.rb +4 -2
- data/lib/chef/knife/ssl_fetch.rb +3 -2
- data/lib/chef/knife/status.rb +14 -1
- data/lib/chef/log.rb +14 -0
- data/lib/chef/mixin/get_source_from_package.rb +7 -2
- data/lib/chef/mixin/properties.rb +302 -0
- data/lib/chef/mixin/proxified_socket.rb +38 -0
- data/lib/chef/mixin/subclass_directive.rb +37 -0
- data/lib/chef/node.rb +13 -5
- data/lib/chef/platform/query_helpers.rb +14 -3
- data/lib/chef/platform/service_helpers.rb +20 -38
- data/lib/chef/policy_builder/expand_node_object.rb +3 -0
- data/lib/chef/policy_builder/policyfile.rb +1 -0
- data/lib/chef/property.rb +51 -12
- data/lib/chef/provider.rb +40 -35
- data/lib/chef/provider/deploy.rb +1 -1
- data/lib/chef/provider/dsc_resource.rb +54 -20
- data/lib/chef/provider/execute.rb +25 -4
- data/lib/chef/provider/group.rb +1 -1
- data/lib/chef/provider/lwrp_base.rb +1 -0
- data/lib/chef/provider/package.rb +76 -30
- data/lib/chef/provider/package/dpkg.rb +152 -69
- data/lib/chef/provider/package/openbsd.rb +6 -8
- data/lib/chef/provider/package/solaris.rb +2 -0
- data/lib/chef/provider/package/windows.rb +95 -14
- data/lib/chef/provider/package/windows/exe.rb +129 -0
- data/lib/chef/provider/package/windows/msi.rb +37 -13
- data/lib/chef/provider/package/windows/registry_uninstall_entry.rb +89 -0
- data/lib/chef/provider/package/yum.rb +13 -3
- data/lib/chef/provider/powershell_script.rb +3 -0
- data/lib/chef/provider/remote_file/cache_control_data.rb +37 -4
- data/lib/chef/provider/remote_file/http.rb +1 -1
- data/lib/chef/provider/script.rb +1 -0
- data/lib/chef/provider/service.rb +13 -10
- data/lib/chef/provider/service/solaris.rb +43 -17
- data/lib/chef/provider/service/upstart.rb +3 -3
- data/lib/chef/provider/user.rb +1 -1
- data/lib/chef/provider/user/dscl.rb +111 -100
- data/lib/chef/provider/user/windows.rb +5 -3
- data/lib/chef/recipe.rb +3 -5
- data/lib/chef/resource.rb +77 -320
- data/lib/chef/resource/action_class.rb +4 -0
- data/lib/chef/resource/dpkg_package.rb +4 -3
- data/lib/chef/resource/dsc_resource.rb +40 -2
- data/lib/chef/resource/execute.rb +9 -1
- data/lib/chef/resource/ksh.rb +32 -0
- data/lib/chef/resource/lwrp_base.rb +6 -10
- data/lib/chef/resource/package.rb +8 -9
- data/lib/chef/resource/registry_key.rb +1 -1
- data/lib/chef/resource/resource_notification.rb +14 -1
- data/lib/chef/resource/script.rb +1 -1
- data/lib/chef/resource/windows_package.rb +1 -1
- data/lib/chef/resource_builder.rb +14 -7
- data/lib/chef/resource_reporter.rb +6 -0
- data/lib/chef/resources.rb +1 -7
- data/lib/chef/rest.rb +1 -1
- data/lib/chef/run_context.rb +45 -2
- data/lib/chef/run_list/run_list_expansion.rb +47 -0
- data/lib/chef/runner.rb +25 -0
- data/lib/chef/search/query.rb +16 -2
- data/lib/chef/util/diff.rb +2 -2
- data/lib/chef/util/powershell/ps_credential.rb +2 -3
- data/lib/chef/version.rb +1 -1
- data/lib/chef/win32/api/file.rb +51 -1
- data/lib/chef/win32/file.rb +5 -0
- data/lib/chef/win32/file/version_info.rb +93 -0
- data/lib/chef/win32/mutex.rb +1 -1
- data/spec/data/apt/chef-integration-test2-1.0/debian/changelog +5 -0
- data/spec/data/apt/chef-integration-test2-1.0/debian/chef-integration-test2.debhelper.log +45 -0
- data/spec/data/apt/chef-integration-test2-1.0/debian/chef-integration-test2.substvars +1 -0
- data/spec/data/apt/chef-integration-test2-1.0/debian/chef-integration-test2/DEBIAN/conffiles +1 -0
- data/spec/data/apt/chef-integration-test2-1.0/debian/chef-integration-test2/DEBIAN/control +10 -0
- data/spec/data/apt/chef-integration-test2-1.0/debian/chef-integration-test2/DEBIAN/md5sums +1 -0
- data/spec/data/apt/chef-integration-test2-1.0/debian/compat +1 -0
- data/spec/data/apt/chef-integration-test2-1.0/debian/conffiles +1 -0
- data/spec/data/apt/chef-integration-test2-1.0/debian/control +13 -0
- data/spec/data/apt/chef-integration-test2-1.0/debian/copyright +34 -0
- data/spec/data/apt/chef-integration-test2-1.0/debian/files +1 -0
- data/spec/data/apt/chef-integration-test2-1.0/debian/rules +13 -0
- data/spec/data/apt/chef-integration-test2-1.0/debian/source/format +1 -0
- data/spec/data/apt/chef-integration-test2_1.0-1.debian.tar.gz +0 -0
- data/spec/data/apt/chef-integration-test2_1.0-1.dsc +18 -0
- data/spec/data/apt/chef-integration-test2_1.0-1_amd64.build +91 -0
- data/spec/data/apt/chef-integration-test2_1.0-1_amd64.changes +31 -0
- data/spec/data/apt/chef-integration-test2_1.0-1_amd64.deb +0 -0
- data/spec/data/apt/chef-integration-test2_1.0.orig.tar.gz +0 -0
- data/spec/functional/application_spec.rb +1 -1
- data/spec/functional/audit/runner_spec.rb +4 -0
- data/spec/functional/knife/ssh_spec.rb +5 -5
- data/spec/functional/notifications_spec.rb +74 -4
- data/spec/functional/resource/aix_service_spec.rb +2 -2
- data/spec/functional/resource/dpkg_package_spec.rb +339 -0
- data/spec/functional/resource/ifconfig_spec.rb +3 -1
- data/spec/functional/resource/mount_spec.rb +5 -2
- data/spec/functional/resource/package_spec.rb +1 -1
- data/spec/functional/resource/user/windows_spec.rb +8 -0
- data/spec/functional/resource/windows_package_spec.rb +177 -0
- data/spec/functional/win32/version_info_spec.rb +50 -0
- data/spec/integration/client/client_spec.rb +80 -0
- data/spec/integration/knife/download_spec.rb +9 -0
- data/spec/integration/knife/upload_spec.rb +28 -1
- data/spec/integration/recipes/lwrp_inline_resources_spec.rb +93 -23
- data/spec/integration/recipes/resource_action_spec.rb +211 -116
- data/spec/integration/recipes/resource_converge_if_changed_spec.rb +72 -0
- data/spec/integration/solo/solo_spec.rb +34 -0
- data/spec/spec_helper.rb +11 -1
- data/spec/support/platform_helpers.rb +8 -0
- data/spec/support/shared/integration/integration_helper.rb +6 -0
- data/spec/support/shared/unit/execute_resource.rb +5 -0
- data/spec/support/shared/unit/platform_introspector.rb +7 -0
- data/spec/tiny_server.rb +6 -2
- data/spec/unit/api_client/registration_spec.rb +5 -4
- data/spec/unit/application_spec.rb +1 -181
- data/spec/unit/chef_fs/file_system/cookbook_subdir_spec.rb +34 -0
- data/spec/unit/cookbook/metadata_spec.rb +122 -2
- data/spec/unit/http_spec.rb +102 -0
- data/spec/unit/knife/bootstrap_spec.rb +55 -13
- data/spec/unit/knife/core/bootstrap_context_spec.rb +10 -3
- data/spec/unit/knife/ssl_check_spec.rb +7 -3
- data/spec/unit/knife/ssl_fetch_spec.rb +2 -2
- data/spec/unit/knife/status_spec.rb +13 -13
- data/spec/unit/knife_spec.rb +26 -2
- data/spec/unit/lwrp_spec.rb +1 -1
- data/spec/unit/mixin/properties_spec.rb +97 -0
- data/spec/unit/mixin/proxified_socket_spec.rb +94 -0
- data/spec/unit/mixin/subclass_directive_spec.rb +45 -0
- data/spec/unit/node_spec.rb +9 -1
- data/spec/unit/policy_builder/policyfile_spec.rb +2 -0
- data/spec/unit/property/validation_spec.rb +14 -12
- data/spec/unit/property_spec.rb +56 -0
- data/spec/unit/provider/deploy_spec.rb +1 -1
- data/spec/unit/provider/dsc_resource_spec.rb +63 -24
- data/spec/unit/provider/execute_spec.rb +95 -28
- data/spec/unit/provider/package/dpkg_spec.rb +185 -96
- data/spec/unit/provider/package/windows/exe_spec.rb +251 -0
- data/spec/unit/provider/package/windows/msi_spec.rb +94 -10
- data/spec/unit/provider/package/windows_spec.rb +227 -26
- data/spec/unit/provider/package/yum_spec.rb +6 -0
- data/spec/unit/provider/package_spec.rb +495 -366
- data/spec/unit/provider/remote_file/cache_control_data_spec.rb +62 -36
- data/spec/unit/provider/script_spec.rb +2 -2
- data/spec/unit/provider/service/solaris_smf_service_spec.rb +110 -39
- data/spec/unit/provider/service/upstart_service_spec.rb +19 -0
- data/spec/unit/provider/user/dscl_spec.rb +14 -0
- data/spec/unit/provider/user/windows_spec.rb +2 -2
- data/spec/unit/provider/user_spec.rb +9 -0
- data/spec/unit/provider_resolver_spec.rb +6 -30
- data/spec/unit/recipe_spec.rb +46 -20
- data/spec/unit/resource/chef_gem_spec.rb +1 -1
- data/spec/unit/resource/dsc_resource_spec.rb +14 -3
- data/spec/unit/resource/ksh_spec.rb +40 -0
- data/spec/unit/resource/registry_key_spec.rb +2 -2
- data/spec/unit/resource/resource_notification_spec.rb +44 -45
- data/spec/unit/resource_reporter_spec.rb +7 -0
- data/spec/unit/resource_spec.rb +268 -253
- data/spec/unit/rest_spec.rb +2 -2
- data/spec/unit/run_list/run_list_expansion_spec.rb +18 -3
- data/spec/unit/search/query_spec.rb +19 -1
- data/spec/unit/util/powershell/ps_credential_spec.rb +8 -1
- data/spec/unit/windows_service_spec.rb +83 -38
- data/tasks/external_tests.rb +19 -9
- data/tasks/rspec.rb +1 -1
- metadata +64 -15
- data/spec/support/pedant/Gemfile +0 -3
- data/spec/support/pedant/pedant_config.rb +0 -129
- data/spec/support/pedant/run_pedant.rb +0 -63
- data/spec/support/pedant/stickywicket.pem +0 -27
- data/spec/unit/provider/package_spec.rbe +0 -0
@@ -22,6 +22,7 @@ require 'chef/mixin/deep_merge'
|
|
22
22
|
|
23
23
|
require 'chef/role'
|
24
24
|
require 'chef/rest'
|
25
|
+
require 'chef/json_compat'
|
25
26
|
|
26
27
|
class Chef
|
27
28
|
class RunList
|
@@ -54,6 +55,13 @@ class Chef
|
|
54
55
|
# * Duplicate roles are not shown.
|
55
56
|
attr_reader :run_list_trace
|
56
57
|
|
58
|
+
# Like run list trace but instead of saving the entries as strings it saves their objects
|
59
|
+
# The to_json method uses this list to construct json.
|
60
|
+
attr_reader :better_run_list_trace
|
61
|
+
|
62
|
+
attr_reader :all_missing_roles
|
63
|
+
attr_reader :role_errors
|
64
|
+
|
57
65
|
def initialize(environment, run_list_items, source=nil)
|
58
66
|
@environment = environment
|
59
67
|
@missing_roles_with_including_role = Array.new
|
@@ -68,6 +76,9 @@ class Chef
|
|
68
76
|
|
69
77
|
@applied_roles = {}
|
70
78
|
@run_list_trace = Hash.new {|h, key| h[key] = [] }
|
79
|
+
@better_run_list_trace = Hash.new {|h, key| h[key] = [] }
|
80
|
+
@all_missing_roles = {}
|
81
|
+
@role_errors = {}
|
71
82
|
end
|
72
83
|
|
73
84
|
# Did we find any errors (expanding roles)?
|
@@ -124,6 +135,7 @@ class Chef
|
|
124
135
|
def role_not_found(name, included_by)
|
125
136
|
Chef::Log.error("Role #{name} (included by '#{included_by}') is in the runlist but does not exist. Skipping expand.")
|
126
137
|
@missing_roles_with_including_role << [name, included_by]
|
138
|
+
@all_missing_roles[name] = true
|
127
139
|
nil
|
128
140
|
end
|
129
141
|
|
@@ -131,6 +143,15 @@ class Chef
|
|
131
143
|
@missing_roles_with_including_role.map {|item| item.first }
|
132
144
|
end
|
133
145
|
|
146
|
+
def to_json(*a)
|
147
|
+
Chef::JSONCompat.to_json(to_hash, *a)
|
148
|
+
end
|
149
|
+
|
150
|
+
def to_hash
|
151
|
+
seen_items = {:recipe => {}, :role => {}}
|
152
|
+
{:id => @environment, :run_list => convert_run_list_trace('top level', seen_items)}
|
153
|
+
end
|
154
|
+
|
134
155
|
private
|
135
156
|
|
136
157
|
# these methods modifies internal state based on arguments, so hide it.
|
@@ -140,8 +161,10 @@ class Chef
|
|
140
161
|
end
|
141
162
|
|
142
163
|
def expand_run_list_items(items, included_by="top level")
|
164
|
+
|
143
165
|
if entry = items.shift
|
144
166
|
@run_list_trace[included_by.to_s] << entry.to_s
|
167
|
+
@better_run_list_trace[included_by.to_s] << entry
|
145
168
|
|
146
169
|
case entry.type
|
147
170
|
when :recipe
|
@@ -156,8 +179,26 @@ class Chef
|
|
156
179
|
end
|
157
180
|
end
|
158
181
|
|
182
|
+
# Recursive helper to decode the non-nested hash form back into a tree
|
183
|
+
def convert_run_list_trace(base, seen_items)
|
184
|
+
@better_run_list_trace[base].map do |item|
|
185
|
+
skipped = seen_items[item.type][item.name]
|
186
|
+
seen_items[item.type][item.name] = true
|
187
|
+
case item.type
|
188
|
+
when :recipe
|
189
|
+
{:type => 'recipe', :name => item.name, :version => item.version, :skipped => !!skipped}
|
190
|
+
when :role
|
191
|
+
error = @role_errors[item.name]
|
192
|
+
missing = @all_missing_roles[item.name]
|
193
|
+
{:type => :role, :name => item.name, :children => (missing || error || skipped) ? [] : convert_run_list_trace(item.to_s, seen_items),
|
194
|
+
:missing => missing, :error => error, :skipped => skipped}
|
195
|
+
end
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
159
199
|
end
|
160
200
|
|
201
|
+
|
161
202
|
# Expand a run list from disk. Suitable for chef-solo
|
162
203
|
class RunListExpansionFromDisk < RunListExpansion
|
163
204
|
|
@@ -184,8 +225,14 @@ class Chef
|
|
184
225
|
else
|
185
226
|
raise
|
186
227
|
end
|
228
|
+
rescue Exception => e
|
229
|
+
@role_errors[name] = e.to_s
|
230
|
+
raise
|
187
231
|
end
|
232
|
+
|
188
233
|
end
|
189
234
|
|
190
235
|
end
|
191
236
|
end
|
237
|
+
|
238
|
+
|
data/lib/chef/runner.rb
CHANGED
@@ -46,6 +46,31 @@ class Chef
|
|
46
46
|
# Determine the appropriate provider for the given resource, then
|
47
47
|
# execute it.
|
48
48
|
def run_action(resource, action, notification_type=nil, notifying_resource=nil)
|
49
|
+
|
50
|
+
# If there are any before notifications, why-run the resource
|
51
|
+
# and notify anyone who needs notifying
|
52
|
+
# TODO cheffish has a bug where it passes itself instead of the run_context to us, so doesn't have before_notifications. Fix there, update dependency requirement, and remove this if statement.
|
53
|
+
before_notifications = run_context.before_notifications(resource) if run_context.respond_to?(:before_notifications)
|
54
|
+
if before_notifications && !before_notifications.empty?
|
55
|
+
whyrun_before = Chef::Config[:why_run]
|
56
|
+
begin
|
57
|
+
Chef::Config[:why_run] = true
|
58
|
+
Chef::Log.info("#{resource} running why-run #{action} action to support before action")
|
59
|
+
resource.run_action(action, notification_type, notifying_resource)
|
60
|
+
ensure
|
61
|
+
Chef::Config[:why_run] = whyrun_before
|
62
|
+
end
|
63
|
+
|
64
|
+
if resource.updated_by_last_action?
|
65
|
+
before_notifications.each do |notification|
|
66
|
+
Chef::Log.info("#{resource} sending #{notification.action} action to #{notification.resource} (before)")
|
67
|
+
run_action(notification.resource, notification.action, :before, resource)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
|
73
|
+
# Actually run the action for realsies
|
49
74
|
resource.run_action(action, notification_type, notifying_resource)
|
50
75
|
|
51
76
|
# Execute any immediate and queue up any delayed notifications
|
data/lib/chef/search/query.rb
CHANGED
@@ -88,8 +88,21 @@ WARNDEP
|
|
88
88
|
|
89
89
|
if block
|
90
90
|
response["rows"].each { |row| block.call(row) if row }
|
91
|
-
|
92
|
-
|
91
|
+
#
|
92
|
+
# args_h[:rows] and args_h[:start] are the page size and
|
93
|
+
# start position requested of the search index backing the
|
94
|
+
# search API.
|
95
|
+
#
|
96
|
+
# The response may contain fewer rows than arg_h[:rows] if
|
97
|
+
# the page of index results included deleted nodes which
|
98
|
+
# have been filtered from the returned data. In this case,
|
99
|
+
# we still want to start the next page at start +
|
100
|
+
# args_h[:rows] to avoid asking the search backend for
|
101
|
+
# overlapping pages (which could result in duplicates).
|
102
|
+
#
|
103
|
+
next_start = response["start"] + (args_h[:rows] || response["rows"].length)
|
104
|
+
unless next_start >= response["total"]
|
105
|
+
args_h[:start] = next_start
|
93
106
|
search(type, query, args_h, &block)
|
94
107
|
end
|
95
108
|
true
|
@@ -99,6 +112,7 @@ WARNDEP
|
|
99
112
|
end
|
100
113
|
|
101
114
|
private
|
115
|
+
|
102
116
|
def validate_type(t)
|
103
117
|
unless t.kind_of?(String) || t.kind_of?(Symbol)
|
104
118
|
msg = "Invalid search object type #{t.inspect} (#{t.class}), must be a String or Symbol." +
|
data/lib/chef/util/diff.rb
CHANGED
@@ -64,7 +64,7 @@ class Chef
|
|
64
64
|
def use_tempfile_if_missing(file)
|
65
65
|
tempfile = nil
|
66
66
|
unless File.exists?(file)
|
67
|
-
Chef::Log.debug("
|
67
|
+
Chef::Log.debug("File #{file} does not exist to diff against, using empty tempfile")
|
68
68
|
tempfile = Tempfile.new("chef-diff")
|
69
69
|
file = tempfile.path
|
70
70
|
end
|
@@ -139,7 +139,7 @@ class Chef
|
|
139
139
|
return "(new content is binary, diff output suppressed)" if is_binary?(new_file)
|
140
140
|
|
141
141
|
begin
|
142
|
-
Chef::Log.debug("
|
142
|
+
Chef::Log.debug("Running: diff -u #{old_file} #{new_file}")
|
143
143
|
diff_str = udiff(old_file, new_file)
|
144
144
|
|
145
145
|
rescue Exception => e
|
@@ -29,9 +29,8 @@ class Chef::Util::Powershell
|
|
29
29
|
"New-Object System.Management.Automation.PSCredential('#{@username}',('#{encrypt(@password)}' | ConvertTo-SecureString))"
|
30
30
|
end
|
31
31
|
|
32
|
-
|
33
|
-
|
34
|
-
end
|
32
|
+
alias to_s to_psobject
|
33
|
+
alias to_text to_psobject
|
35
34
|
|
36
35
|
private
|
37
36
|
|
data/lib/chef/version.rb
CHANGED
data/lib/chef/win32/api/file.rb
CHANGED
@@ -182,7 +182,14 @@ class Chef
|
|
182
182
|
# Win32 API Bindings
|
183
183
|
###############################################
|
184
184
|
|
185
|
-
ffi_lib 'kernel32'
|
185
|
+
ffi_lib 'kernel32', 'version'
|
186
|
+
|
187
|
+
# Does not map directly to a win32 struct
|
188
|
+
# see https://msdn.microsoft.com/en-us/library/windows/desktop/ms647464(v=vs.85).aspx
|
189
|
+
class Translation < FFI::Struct
|
190
|
+
layout :w_lang, :WORD,
|
191
|
+
:w_code_page, :WORD
|
192
|
+
end
|
186
193
|
|
187
194
|
=begin
|
188
195
|
typedef struct _FILETIME {
|
@@ -470,6 +477,34 @@ BOOL WINAPI DeviceIoControl(
|
|
470
477
|
#);
|
471
478
|
safe_attach_function :GetVolumeNameForVolumeMountPointW, [:LPCTSTR, :LPTSTR, :DWORD], :BOOL
|
472
479
|
|
480
|
+
=begin
|
481
|
+
BOOL WINAPI GetFileVersionInfo(
|
482
|
+
_In_ LPCTSTR lptstrFilename,
|
483
|
+
_Reserved_ DWORD dwHandle,
|
484
|
+
_In_ DWORD dwLen,
|
485
|
+
_Out_ LPVOID lpData
|
486
|
+
);
|
487
|
+
=end
|
488
|
+
safe_attach_function :GetFileVersionInfoW, [:LPCTSTR, :DWORD, :DWORD, :LPVOID], :BOOL
|
489
|
+
|
490
|
+
=begin
|
491
|
+
DWORD WINAPI GetFileVersionInfoSize(
|
492
|
+
_In_ LPCTSTR lptstrFilename,
|
493
|
+
_Out_opt_ LPDWORD lpdwHandle
|
494
|
+
);
|
495
|
+
=end
|
496
|
+
safe_attach_function :GetFileVersionInfoSizeW, [:LPCTSTR, :LPDWORD], :DWORD
|
497
|
+
|
498
|
+
=begin
|
499
|
+
BOOL WINAPI VerQueryValue(
|
500
|
+
_In_ LPCVOID pBlock,
|
501
|
+
_In_ LPCTSTR lpSubBlock,
|
502
|
+
_Out_ LPVOID *lplpBuffer,
|
503
|
+
_Out_ PUINT puLen
|
504
|
+
);
|
505
|
+
=end
|
506
|
+
safe_attach_function :VerQueryValueW, [:LPCVOID, :LPCTSTR, :LPVOID, :PUINT], :BOOL
|
507
|
+
|
473
508
|
###############################################
|
474
509
|
# Helpers
|
475
510
|
###############################################
|
@@ -565,6 +600,21 @@ BOOL WINAPI DeviceIoControl(
|
|
565
600
|
file_information
|
566
601
|
end
|
567
602
|
|
603
|
+
def retrieve_file_version_info(file_name)
|
604
|
+
file_name = encode_path(file_name)
|
605
|
+
file_size = GetFileVersionInfoSizeW(file_name, nil)
|
606
|
+
if file_size == 0
|
607
|
+
Chef::ReservedNames::Win32::Error.raise!
|
608
|
+
end
|
609
|
+
|
610
|
+
version_info = FFI::MemoryPointer.new(file_size)
|
611
|
+
unless GetFileVersionInfoW(file_name, 0, file_size, version_info)
|
612
|
+
Chef::ReservedNames::Win32::Error.raise!
|
613
|
+
end
|
614
|
+
|
615
|
+
version_info
|
616
|
+
end
|
617
|
+
|
568
618
|
end
|
569
619
|
end
|
570
620
|
end
|
data/lib/chef/win32/file.rb
CHANGED
@@ -150,6 +150,10 @@ class Chef
|
|
150
150
|
Info.new(file_name)
|
151
151
|
end
|
152
152
|
|
153
|
+
def self.version_info(file_name)
|
154
|
+
VersionInfo.new(file_name)
|
155
|
+
end
|
156
|
+
|
153
157
|
def self.verify_links_supported!
|
154
158
|
begin
|
155
159
|
CreateSymbolicLinkW(nil)
|
@@ -211,3 +215,4 @@ class Chef
|
|
211
215
|
end
|
212
216
|
|
213
217
|
require 'chef/win32/file/info'
|
218
|
+
require 'chef/win32/file/version_info'
|
@@ -0,0 +1,93 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Matt Wrock (<matt@mattwrock.com>)
|
3
|
+
# Copyright:: Copyright 2015 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/win32/file'
|
20
|
+
|
21
|
+
class Chef
|
22
|
+
module ReservedNames::Win32
|
23
|
+
class File
|
24
|
+
|
25
|
+
class VersionInfo
|
26
|
+
|
27
|
+
include Chef::ReservedNames::Win32::API::File
|
28
|
+
|
29
|
+
def initialize(file_name)
|
30
|
+
raise Errno::ENOENT, file_name unless ::File.exist?(file_name)
|
31
|
+
@file_version_info = retrieve_file_version_info(file_name)
|
32
|
+
end
|
33
|
+
|
34
|
+
# defining method for each predefined version resource string
|
35
|
+
# see https://msdn.microsoft.com/en-us/library/windows/desktop/ms647464(v=vs.85).aspx
|
36
|
+
[
|
37
|
+
:Comments,
|
38
|
+
:CompanyName,
|
39
|
+
:FileDescription,
|
40
|
+
:FileVersion,
|
41
|
+
:InternalName,
|
42
|
+
:LegalCopyright,
|
43
|
+
:LegalTrademarks,
|
44
|
+
:OriginalFilename,
|
45
|
+
:ProductName,
|
46
|
+
:ProductVersion,
|
47
|
+
:PrivateBuild,
|
48
|
+
:SpecialBuild
|
49
|
+
].each do |method|
|
50
|
+
define_method method do
|
51
|
+
begin
|
52
|
+
get_version_info_string(method.to_s)
|
53
|
+
rescue Chef::Exceptions::Win32APIError
|
54
|
+
return nil
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
private
|
60
|
+
|
61
|
+
def translation
|
62
|
+
@translation ||= begin
|
63
|
+
info_ptr = FFI::MemoryPointer.new(:pointer)
|
64
|
+
unless VerQueryValueW(@file_version_info, "\\VarFileInfo\\Translation".to_wstring, info_ptr, FFI::MemoryPointer.new(:int))
|
65
|
+
Chef::ReservedNames::Win32::Error.raise!
|
66
|
+
end
|
67
|
+
|
68
|
+
# there can potentially be multiple translations but most installers just have one
|
69
|
+
# we use the first because we use this for the version strings which are language
|
70
|
+
# agnostic. If/when we need other fields, we should we should add logic to find
|
71
|
+
# the "best" translation
|
72
|
+
trans = Translation.new(info_ptr.read_pointer)
|
73
|
+
to_hex(trans[:w_lang]) + to_hex(trans[:w_code_page])
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def to_hex(integer)
|
78
|
+
integer.to_s(16).rjust(4,"0")
|
79
|
+
end
|
80
|
+
|
81
|
+
def get_version_info_string(string_key)
|
82
|
+
info_ptr = FFI::MemoryPointer.new(:pointer)
|
83
|
+
size_ptr = FFI::MemoryPointer.new(:int)
|
84
|
+
unless VerQueryValueW(@file_version_info, "\\StringFileInfo\\#{translation}\\#{string_key}".to_wstring, info_ptr, size_ptr)
|
85
|
+
Chef::ReservedNames::Win32::Error.raise!
|
86
|
+
end
|
87
|
+
|
88
|
+
info_ptr.read_pointer.read_wstring(size_ptr.read_uint)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
data/lib/chef/win32/mutex.rb
CHANGED
@@ -79,7 +79,7 @@ class Chef
|
|
79
79
|
# of the process goes away and this class is only being used
|
80
80
|
# to synchronize chef-clients runs on a node.
|
81
81
|
Chef::Log.error("Can not release mutex '#{name}'. This might cause issues \
|
82
|
-
if
|
82
|
+
if other threads attempt to acquire the mutex.")
|
83
83
|
Chef::ReservedNames::Win32::Error.raise!
|
84
84
|
end
|
85
85
|
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
dh_auto_configure
|
2
|
+
dh_auto_build
|
3
|
+
dh_auto_test
|
4
|
+
dh_prep
|
5
|
+
dh_installdirs
|
6
|
+
dh_auto_install
|
7
|
+
dh_install
|
8
|
+
dh_installdocs
|
9
|
+
dh_installchangelogs
|
10
|
+
dh_installexamples
|
11
|
+
dh_installman
|
12
|
+
dh_installcatalogs
|
13
|
+
dh_installcron
|
14
|
+
dh_installdebconf
|
15
|
+
dh_installemacsen
|
16
|
+
dh_installifupdown
|
17
|
+
dh_installinfo
|
18
|
+
dh_pysupport
|
19
|
+
dh_installinit
|
20
|
+
dh_installmenu
|
21
|
+
dh_installmime
|
22
|
+
dh_installmodules
|
23
|
+
dh_installlogcheck
|
24
|
+
dh_installlogrotate
|
25
|
+
dh_installpam
|
26
|
+
dh_installppp
|
27
|
+
dh_installudev
|
28
|
+
dh_installwm
|
29
|
+
dh_installxfonts
|
30
|
+
dh_bugfiles
|
31
|
+
dh_lintian
|
32
|
+
dh_gconf
|
33
|
+
dh_icons
|
34
|
+
dh_perl
|
35
|
+
dh_usrlocal
|
36
|
+
dh_link
|
37
|
+
dh_compress
|
38
|
+
dh_fixperms
|
39
|
+
dh_strip
|
40
|
+
dh_makeshlibs
|
41
|
+
dh_shlibdeps
|
42
|
+
dh_installdeb
|
43
|
+
dh_gencontrol
|
44
|
+
dh_md5sums
|
45
|
+
dh_builddeb
|