diff options
author | Bryan McLellan <btm@opscode.com> | 2014-02-27 13:50:40 -0800 |
---|---|---|
committer | Bryan McLellan <btm@loftninjas.org> | 2014-03-27 19:19:34 -0400 |
commit | 9e9cab6a89d9dab4ddf852b88eb522610d89f2d8 (patch) | |
tree | e5799c600477a37331f66e618201a042413e60e1 /lib/chef/provider/package/windows | |
parent | df07eaf9e8905ca1fce72cf3186b30c600fd7251 (diff) | |
download | chef-9e9cab6a89d9dab4ddf852b88eb522610d89f2d8.tar.gz |
CHEF-5087: Add a Windows Installer package provider
Adds the framework for a windows package provider, which must determine the
correct provider by examining metadata about the source file, or the source
file itself.
Provides FFI based access to the Windows Installer functions to retrieve
metadata from the MSI files and from the Windows product database.
Combines both of these into an MSI package provider.
Continues to work alongside the windows_package LWRP.
Diffstat (limited to 'lib/chef/provider/package/windows')
-rw-r--r-- | lib/chef/provider/package/windows/msi.rb | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/lib/chef/provider/package/windows/msi.rb b/lib/chef/provider/package/windows/msi.rb new file mode 100644 index 0000000000..0764a15901 --- /dev/null +++ b/lib/chef/provider/package/windows/msi.rb @@ -0,0 +1,69 @@ +# +# Author:: Bryan McLellan <btm@loftninjas.org> +# Copyright:: Copyright (c) 2014 Chef Software, Inc. +# License:: Apache License, Version 2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# TODO: Allow @new_resource.source to be a Product Code as a GUID for uninstall / network install + +require 'chef/mixin/shell_out' +require 'chef/win32/api/installer' + +class Chef + class Provider + class Package + class Windows + class MSI + include Chef::ReservedNames::Win32::API::Installer + include Chef::Mixin::ShellOut + + def initialize(resource) + @new_resource = resource + end + + # From Chef::Provider::Package + def expand_options(options) + options ? " #{options}" : "" + end + + # Returns a version if the package is installed or nil if it is not. + def installed_version + Chef::Log.debug("#{@new_resource} getting product code for package at #{@new_resource.source}") + product_code = get_product_property(@new_resource.source, "ProductCode") + Chef::Log.debug("#{@new_resource} checking package status and verion for #{product_code}") + get_installed_version(product_code) + end + + def package_version + Chef::Log.debug("#{@new_resource} getting product version for package at #{@new_resource.source}") + get_product_property(@new_resource.source, "ProductVersion") + end + + def install_package(name, version) + # We could use MsiConfigureProduct here, but we'll start off with msiexec + Chef::Log.debug("#{@new_resource} installing MSI package '#{@new_resource.source}'") + shell_out!("msiexec /qn /i \"#{@new_resource.source}\" #{expand_options(@new_resource.options)}", {:timeout => @new_resource.timeout, :returns => @new_resource.returns}) + end + + def remove_package(name, version) + # We could use MsiConfigureProduct here, but we'll start off with msiexec + Chef::Log.debug("#{@new_resource} removing MSI package '#{@new_resource.source}'") + shell_out!("msiexec /qn /x \"#{@new_resource.source}\" #{expand_options(@new_resource.options)}", {:timeout => @new_resource.timeout, :returns => @new_resource.returns}) + end + end + end + end + end +end |