Initial Chef repository
This commit is contained in:
33
cookbooks/windows/providers/auto_run.rb
Normal file
33
cookbooks/windows/providers/auto_run.rb
Normal file
@@ -0,0 +1,33 @@
|
||||
#
|
||||
# Author:: Paul Morton (<pmorton@biaprotect.com>)
|
||||
# Cookbook Name:: windows
|
||||
# Provider:: auto_run
|
||||
#
|
||||
# Copyright:: 2011, Business Intelligence Associates, Inc
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
use_inline_resources if defined?(use_inline_resources)
|
||||
|
||||
action :create do
|
||||
windows_registry 'HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run' do
|
||||
values new_resource.name => "\"#{new_resource.program}\" #{new_resource.args}"
|
||||
end
|
||||
end
|
||||
|
||||
action :remove do
|
||||
windows_registry 'HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run' do
|
||||
values new_resource.name => ''
|
||||
action :remove
|
||||
end
|
||||
end
|
||||
63
cookbooks/windows/providers/batch.rb
Normal file
63
cookbooks/windows/providers/batch.rb
Normal file
@@ -0,0 +1,63 @@
|
||||
#
|
||||
# Author:: Seth Chisamore (<schisamo@chef.io>)
|
||||
# Cookbook Name:: windws
|
||||
# Provider:: batch
|
||||
#
|
||||
# Copyright:: 2011, Chef Software, Inc.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
use_inline_resources if defined?(use_inline_resources)
|
||||
|
||||
require 'tempfile'
|
||||
require 'chef/resource/execute'
|
||||
|
||||
action :run do
|
||||
begin
|
||||
script_file.puts(@new_resource.code)
|
||||
script_file.close
|
||||
set_owner_and_group
|
||||
|
||||
# cwd hax...shell_out on windows needs to support proper 'cwd'
|
||||
# follow CHEF-2357 for more
|
||||
cwd = @new_resource.cwd ? "cd \"#{@new_resource.cwd}\" & " : ""
|
||||
|
||||
r = Chef::Resource::Execute.new(@new_resource.name, run_context)
|
||||
r.user(@new_resource.user)
|
||||
r.group(@new_resource.group)
|
||||
r.command("#{cwd}call \"#{script_file.path}\" #{@new_resource.flags}")
|
||||
r.creates(@new_resource.creates)
|
||||
r.returns(@new_resource.returns)
|
||||
r.run_action(:run)
|
||||
|
||||
@new_resource.updated_by_last_action(r.updated_by_last_action?)
|
||||
ensure
|
||||
unlink_script_file
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
def set_owner_and_group
|
||||
# FileUtils itself implements a no-op if +user+ or +group+ are nil
|
||||
# You can prove this by running FileUtils.chown(nil,nil,'/tmp/file')
|
||||
# as an unprivileged user.
|
||||
FileUtils.chown(@new_resource.user, @new_resource.group, script_file.path)
|
||||
end
|
||||
|
||||
def script_file
|
||||
@script_file ||= Tempfile.open(['chef-script', '.bat'])
|
||||
end
|
||||
|
||||
def unlink_script_file
|
||||
@script_file && @script_file.close!
|
||||
end
|
||||
64
cookbooks/windows/providers/feature_dism.rb
Normal file
64
cookbooks/windows/providers/feature_dism.rb
Normal file
@@ -0,0 +1,64 @@
|
||||
#
|
||||
# Author:: Seth Chisamore (<schisamo@chef.io>)
|
||||
# Cookbook Name:: windows
|
||||
# Provider:: feature_dism
|
||||
#
|
||||
# Copyright:: 2011, Chef Software, Inc.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
include Chef::Provider::WindowsFeature::Base
|
||||
include Chef::Mixin::ShellOut
|
||||
include Windows::Helper
|
||||
|
||||
def install_feature(name)
|
||||
addsource = @new_resource.source ? "/LimitAccess /Source:\"#{@new_resource.source}\"" : ""
|
||||
addall = @new_resource.all ? "/All" : ""
|
||||
shell_out!("#{dism} /online /enable-feature /featurename:#{@new_resource.feature_name} /norestart #{addsource} #{addall}", {:returns => [0,42,127,3010]})
|
||||
end
|
||||
|
||||
def remove_feature(name)
|
||||
shell_out!("#{dism} /online /disable-feature /featurename:#{@new_resource.feature_name} /norestart", {:returns => [0,42,127,3010]})
|
||||
end
|
||||
|
||||
def delete_feature(name)
|
||||
if win_version.major_version >= 6 and win_version.minor_version >=2
|
||||
shell_out!("#{dism} /online /disable-feature /featurename:#{@new_resource.feature_name} /Remove /norestart", {:returns => [0,42,127,3010]})
|
||||
else
|
||||
raise Chef::Exceptions::UnsupportedAction, "#{self.to_s} :delete action not support on #{win_version.sku}"
|
||||
end
|
||||
end
|
||||
|
||||
def installed?
|
||||
@installed ||= begin
|
||||
cmd = shell_out("#{dism} /online /Get-Features", {:returns => [0,42,127]})
|
||||
cmd.stderr.empty? && (cmd.stdout =~ /^Feature Name : #{@new_resource.feature_name}.?$\n^State : Enabled.?$/i)
|
||||
end
|
||||
end
|
||||
|
||||
def available?
|
||||
@available ||= begin
|
||||
cmd = shell_out("#{dism} /online /Get-Features", {:returns => [0,42,127]})
|
||||
cmd.stderr.empty? && (cmd.stdout !~ /^Feature Name : #{@new_resource.feature_name}.?$\n^State : .* with payload removed.?$/i)
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
# account for File System Redirector
|
||||
# http://msdn.microsoft.com/en-us/library/aa384187(v=vs.85).aspx
|
||||
def dism
|
||||
@dism ||= begin
|
||||
locate_sysnative_cmd("dism.exe")
|
||||
end
|
||||
end
|
||||
38
cookbooks/windows/providers/feature_powershell.rb
Normal file
38
cookbooks/windows/providers/feature_powershell.rb
Normal file
@@ -0,0 +1,38 @@
|
||||
#
|
||||
# Author:: Greg Zapp (<greg.zapp@gmail.com>)
|
||||
# Cookbook Name:: windows
|
||||
# Provider:: feature_powershell
|
||||
#
|
||||
|
||||
include Chef::Provider::WindowsFeature::Base
|
||||
include Chef::Mixin::PowershellOut
|
||||
include Windows::Helper
|
||||
|
||||
def install_feature(name)
|
||||
cmd = powershell_out("Install-WindowsFeature #{@new_resource.feature_name}")
|
||||
Chef::Log.info(cmd.stdout)
|
||||
end
|
||||
|
||||
def remove_feature(name)
|
||||
cmd = powershell_out("Uninstall-WindowsFeature #{@new_resource.feature_name}")
|
||||
Chef::Log.info(cmd.stdout)
|
||||
end
|
||||
|
||||
def delete_feature(name)
|
||||
cmd = powershell_out("Uninstall-WindowsFeature #{@new_resource.feature_name} -Remove")
|
||||
Chef::Log.info(cmd.stdout)
|
||||
end
|
||||
|
||||
def installed?
|
||||
@installed ||= begin
|
||||
cmd = powershell_out("Get-WindowsFeature #{@new_resource.feature_name} | Select Installed | % { Write-Host $_.Installed }")
|
||||
cmd.stderr.empty? && cmd.stdout =~ /True/i
|
||||
end
|
||||
end
|
||||
|
||||
def available?
|
||||
@available ||= begin
|
||||
cmd = powershell_out("Get-WindowsFeature #{@new_resource.feature_name}")
|
||||
cmd.stderr.empty? && cmd.stdout !~ /Removed/i
|
||||
end
|
||||
end
|
||||
61
cookbooks/windows/providers/feature_servermanagercmd.rb
Normal file
61
cookbooks/windows/providers/feature_servermanagercmd.rb
Normal file
@@ -0,0 +1,61 @@
|
||||
#
|
||||
# Author:: Seth Chisamore (<schisamo@chef.io>)
|
||||
# Cookbook Name:: windows
|
||||
# Provider:: feature_servermanagercmd
|
||||
#
|
||||
# Copyright:: 2011, Chef Software, Inc.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
include Chef::Provider::WindowsFeature::Base
|
||||
include Chef::Mixin::ShellOut
|
||||
include Windows::Helper
|
||||
|
||||
# Exit codes are listed at http://technet.microsoft.com/en-us/library/cc749128(v=ws.10).aspx
|
||||
|
||||
def check_reboot(result, feature)
|
||||
if result.exitstatus == 3010 # successful, but needs reboot
|
||||
node.run_state[:reboot_requested] = true
|
||||
Chef::Log.warn("Require reboot to install #{feature}")
|
||||
elsif result.exitstatus == 1001 # failure, but needs reboot before we can do anything else
|
||||
node.run_state[:reboot_requested] = true
|
||||
Chef::Log.warn("Failed installing #{feature} and need to reboot")
|
||||
end
|
||||
result.error! # throw for any other bad results. The above results will also get raised, and should cause a reboot via the handler.
|
||||
end
|
||||
|
||||
def install_feature(name)
|
||||
check_reboot(shell_out("#{servermanagercmd} -install #{@new_resource.feature_name}", {:returns => [0,42,127,1003,3010]}), @new_resource.feature_name)
|
||||
end
|
||||
|
||||
def remove_feature(name)
|
||||
check_reboot(shell_out("#{servermanagercmd} -remove #{@new_resource.feature_name}", {:returns => [0,42,127,1003,3010]}), @new_resource.feature_name)
|
||||
end
|
||||
|
||||
def installed?
|
||||
@installed ||= begin
|
||||
cmd = shell_out("#{servermanagercmd} -query", {:returns => [0,42,127,1003]})
|
||||
cmd.stderr.empty? && (cmd.stdout =~ /^\s*?\[X\]\s.+?\s\[#{@new_resource.feature_name}\]\s*$/i)
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
# account for File System Redirector
|
||||
# http://msdn.microsoft.com/en-us/library/aa384187(v=vs.85).aspx
|
||||
def servermanagercmd
|
||||
@servermanagercmd ||= begin
|
||||
locate_sysnative_cmd("servermanagercmd.exe")
|
||||
end
|
||||
end
|
||||
69
cookbooks/windows/providers/font.rb
Normal file
69
cookbooks/windows/providers/font.rb
Normal file
@@ -0,0 +1,69 @@
|
||||
#
|
||||
# Author:: Sander Botman <sbotman@schubergphilis.com>
|
||||
# Cookbook Name:: windows
|
||||
# Provider:: font
|
||||
#
|
||||
# Copyright:: 2014, Schuberg Philis BV.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
include Windows::Helper
|
||||
|
||||
def load_current_resource
|
||||
require 'win32ole'
|
||||
fonts_dir = WIN32OLE.new("WScript.Shell").SpecialFolders("Fonts")
|
||||
@current_resource = Chef::Resource::WindowsFont.new(@new_resource.name)
|
||||
@current_resource.file(win_friendly_path(::File.join(fonts_dir, @new_resource.file)))
|
||||
@current_resource
|
||||
end
|
||||
|
||||
# Check to see if the font is installed
|
||||
#
|
||||
# === Returns
|
||||
# <true>:: If the font is installed
|
||||
# <false>:: If the font is not instaled
|
||||
def font_exists?
|
||||
::File.exists?(@current_resource.file)
|
||||
end
|
||||
|
||||
def get_cookbook_font
|
||||
r = Chef::Resource::CookbookFile.new(@new_resource.file, run_context)
|
||||
r.path(win_friendly_path(::File.join(ENV['TEMP'], @new_resource.file)))
|
||||
r.cookbook(cookbook_name.to_s)
|
||||
r.run_action(:create)
|
||||
end
|
||||
|
||||
def del_cookbook_font
|
||||
r = Chef::Resource::File.new(::File.join(ENV['TEMP'], @new_resource.file), run_context)
|
||||
r.run_action(:delete)
|
||||
end
|
||||
|
||||
def install_font
|
||||
require 'win32ole'
|
||||
fonts_dir = WIN32OLE.new("WScript.Shell").SpecialFolders("Fonts")
|
||||
folder = WIN32OLE.new("Shell.Application").Namespace(fonts_dir)
|
||||
folder.CopyHere(win_friendly_path(::File.join(ENV['TEMP'], @new_resource.file)))
|
||||
Chef::Log.debug("Installing font: #{@new_resource.file}")
|
||||
end
|
||||
|
||||
def action_install
|
||||
unless font_exists?
|
||||
get_cookbook_font
|
||||
install_font
|
||||
del_cookbook_font
|
||||
new_resource.updated_by_last_action(true)
|
||||
else
|
||||
Chef::Log.debug("Not installing font: #{@new_resource.file}, font already installed.")
|
||||
new_resource.updated_by_last_action(false)
|
||||
end
|
||||
end
|
||||
153
cookbooks/windows/providers/pagefile.rb
Normal file
153
cookbooks/windows/providers/pagefile.rb
Normal file
@@ -0,0 +1,153 @@
|
||||
#
|
||||
# Author:: Kevin Moser (<kevin.moser@nordstrom.com>)
|
||||
# Cookbook Name:: windows
|
||||
# Provider:: pagefile
|
||||
#
|
||||
# Copyright:: 2012, Nordstrom, Inc.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
include Chef::Mixin::ShellOut
|
||||
include Windows::Helper
|
||||
|
||||
action :set do
|
||||
pagefile = @new_resource.name
|
||||
initial_size = @new_resource.initial_size
|
||||
maximum_size = @new_resource.maximum_size
|
||||
system_managed = @new_resource.system_managed
|
||||
automatic_managed = @new_resource.automatic_managed
|
||||
updated = false
|
||||
|
||||
if automatic_managed
|
||||
unless automatic_managed?
|
||||
set_automatic_managed
|
||||
updated = true
|
||||
end
|
||||
else
|
||||
if automatic_managed?
|
||||
unset_automatic_managed
|
||||
updated = true
|
||||
end
|
||||
|
||||
# Check that the resource is not just trying to unset automatic managed, if it is do nothing more
|
||||
if (initial_size && maximum_size) || system_managed
|
||||
unless exists?(pagefile)
|
||||
create(pagefile)
|
||||
end
|
||||
|
||||
if system_managed
|
||||
unless max_and_min_set?(pagefile, 0, 0)
|
||||
set_system_managed(pagefile)
|
||||
updated = true
|
||||
end
|
||||
else
|
||||
unless max_and_min_set?(pagefile, initial_size, maximum_size)
|
||||
set_custom_size(pagefile, initial_size, maximum_size)
|
||||
updated = true
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
new_resource.updated_by_last_action(updated)
|
||||
end
|
||||
|
||||
action :delete do
|
||||
pagefile = @new_resource.name
|
||||
updated = false
|
||||
|
||||
if exists?(pagefile)
|
||||
delete(pagefile)
|
||||
updated = true
|
||||
end
|
||||
|
||||
new_resource.updated_by_last_action(updated)
|
||||
end
|
||||
|
||||
|
||||
private
|
||||
def exists?(pagefile)
|
||||
@exists ||= begin
|
||||
cmd = shell_out("#{wmic} pagefileset where SettingID=\"#{get_setting_id(pagefile)}\" list /format:list", {:returns => [0]})
|
||||
cmd.stderr.empty? && (cmd.stdout =~ /SettingID=#{get_setting_id(pagefile)}/i)
|
||||
end
|
||||
end
|
||||
|
||||
def max_and_min_set?(pagefile, min, max)
|
||||
@max_and_min_set ||= begin
|
||||
cmd = shell_out("#{wmic} pagefileset where SettingID=\"#{get_setting_id(pagefile)}\" list /format:list", {:returns => [0]})
|
||||
cmd.stderr.empty? && (cmd.stdout =~ /InitialSize=#{min}/i) && (cmd.stdout =~ /MaximumSize=#{max}/i)
|
||||
end
|
||||
end
|
||||
|
||||
def create(pagefile)
|
||||
Chef::Log.debug("Creating pagefile #{pagefile}")
|
||||
cmd = shell_out("#{wmic} pagefileset create name=\"#{win_friendly_path(pagefile)}\"")
|
||||
check_for_errors(cmd.stderr)
|
||||
end
|
||||
|
||||
def delete(pagefile)
|
||||
Chef::Log.debug("Removing pagefile #{pagefile}")
|
||||
cmd = shell_out("#{wmic} pagefileset where SettingID=\"#{get_setting_id(pagefile)}\" delete")
|
||||
check_for_errors(cmd.stderr)
|
||||
end
|
||||
|
||||
def automatic_managed?
|
||||
@automatic_managed ||= begin
|
||||
cmd = shell_out("#{wmic} computersystem where name=\"%computername%\" get AutomaticManagedPagefile /format:list")
|
||||
cmd.stderr.empty? && (cmd.stdout =~ /AutomaticManagedPagefile=TRUE/i)
|
||||
end
|
||||
end
|
||||
|
||||
def set_automatic_managed
|
||||
Chef::Log.debug("Setting pagefile to Automatic Managed")
|
||||
cmd = shell_out("#{wmic} computersystem where name=\"%computername%\" set AutomaticManagedPagefile=True")
|
||||
check_for_errors(cmd.stderr)
|
||||
end
|
||||
|
||||
def unset_automatic_managed
|
||||
Chef::Log.debug("Setting pagefile to User Managed")
|
||||
cmd = shell_out("#{wmic} computersystem where name=\"%computername%\" set AutomaticManagedPagefile=False")
|
||||
check_for_errors(cmd.stderr)
|
||||
end
|
||||
|
||||
def set_custom_size(pagefile, min, max)
|
||||
Chef::Log.debug("Setting #{pagefile} to InitialSize=#{min} & MaximumSize=#{max}")
|
||||
cmd = shell_out("#{wmic} pagefileset where SettingID=\"#{get_setting_id(pagefile)}\" set InitialSize=#{min},MaximumSize=#{max}", {:returns => [0]})
|
||||
check_for_errors(cmd.stderr)
|
||||
end
|
||||
|
||||
def set_system_managed(pagefile)
|
||||
Chef::Log.debug("Setting #{pagefile} to System Managed")
|
||||
cmd = shell_out("#{wmic} pagefileset where SettingID=\"#{get_setting_id(pagefile)}\" set InitialSize=0,MaximumSize=0", {:returns => [0]})
|
||||
check_for_errors(cmd.stderr)
|
||||
end
|
||||
|
||||
def get_setting_id(pagefile)
|
||||
pagefile = win_friendly_path(pagefile)
|
||||
pagefile = pagefile.split("\\")
|
||||
"#{pagefile[1]} @ #{pagefile[0]}"
|
||||
end
|
||||
|
||||
def check_for_errors(stderr)
|
||||
unless stderr.empty?
|
||||
Chef::Log.fatal(stderr)
|
||||
end
|
||||
end
|
||||
|
||||
def wmic
|
||||
@wmic ||= begin
|
||||
locate_sysnative_cmd("wmic.exe")
|
||||
end
|
||||
end
|
||||
52
cookbooks/windows/providers/path.rb
Normal file
52
cookbooks/windows/providers/path.rb
Normal file
@@ -0,0 +1,52 @@
|
||||
#
|
||||
# Author:: Paul Morton (<pmorton@biaprotect.com>)
|
||||
# Cookbook Name:: windows
|
||||
# Provider:: path
|
||||
#
|
||||
# Copyright:: 2011, Business Intelligence Associates, Inc
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
use_inline_resources if defined?(use_inline_resources)
|
||||
|
||||
include Windows::Helper
|
||||
|
||||
action :add do
|
||||
env "path" do
|
||||
action :modify
|
||||
delim ::File::PATH_SEPARATOR
|
||||
value new_resource.path
|
||||
notifies :run, "ruby_block[fix ruby ENV['PATH']]", :immediately
|
||||
end
|
||||
|
||||
# The windows Env provider does not correctly expand variables in
|
||||
# the PATH environment variable. Ruby expects these to be expanded.
|
||||
# This is a temporary fix for that.
|
||||
#
|
||||
# Follow at https://github.com/chef/chef/pull/1876
|
||||
#
|
||||
ruby_block "fix ruby ENV['PATH']" do
|
||||
block do
|
||||
ENV['PATH'] = expand_env_vars(ENV['PATH'])
|
||||
end
|
||||
action :nothing
|
||||
end
|
||||
end
|
||||
|
||||
action :remove do
|
||||
env "path" do
|
||||
action :delete
|
||||
delim ::File::PATH_SEPARATOR
|
||||
value new_resource.path
|
||||
end
|
||||
end
|
||||
101
cookbooks/windows/providers/printer.rb
Normal file
101
cookbooks/windows/providers/printer.rb
Normal file
@@ -0,0 +1,101 @@
|
||||
#
|
||||
# Author:: Doug Ireton (<doug.ireton@nordstrom.com>)
|
||||
# Cookbook Name:: windows
|
||||
# Provider:: printer
|
||||
#
|
||||
# Copyright:: 2012, Nordstrom, Inc.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
use_inline_resources if defined?(use_inline_resources)
|
||||
|
||||
# Support whyrun
|
||||
def whyrun_supported?
|
||||
true
|
||||
end
|
||||
|
||||
action :create do
|
||||
if @current_resource.exists
|
||||
Chef::Log.info "#{ @new_resource } already exists - nothing to do."
|
||||
else
|
||||
converge_by("Create #{ @new_resource }") do
|
||||
create_printer
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
action :delete do
|
||||
if @current_resource.exists
|
||||
converge_by("Delete #{ @new_resource }") do
|
||||
delete_printer
|
||||
end
|
||||
else
|
||||
Chef::Log.info "#{ @current_resource } doesn't exist - can't delete."
|
||||
end
|
||||
end
|
||||
|
||||
def load_current_resource
|
||||
@current_resource = Chef::Resource::WindowsPrinter.new(@new_resource.name)
|
||||
@current_resource.name(@new_resource.name)
|
||||
|
||||
if printer_exists?(@current_resource.name)
|
||||
# TODO: Set @current_resource printer properties from registry
|
||||
@current_resource.exists = true
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
private
|
||||
|
||||
PRINTERS_REG_KEY = 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Printers\\'.freeze unless defined?(PRINTERS_REG_KEY)
|
||||
|
||||
def printer_exists?(name)
|
||||
printer_reg_key = PRINTERS_REG_KEY + name
|
||||
Chef::Log.debug "Checking to see if this reg key exists: '#{ printer_reg_key }'"
|
||||
Registry.key_exists?(printer_reg_key)
|
||||
end
|
||||
|
||||
def create_printer
|
||||
|
||||
# Create the printer port first
|
||||
windows_printer_port new_resource.ipv4_address do
|
||||
end
|
||||
|
||||
port_name = "IP_#{ new_resource.ipv4_address }"
|
||||
|
||||
powershell_script "Creating printer: #{ new_resource.name }" do
|
||||
code <<-EOH
|
||||
|
||||
Set-WmiInstance -class Win32_Printer `
|
||||
-EnableAllPrivileges `
|
||||
-Argument @{ DeviceID = "#{ new_resource.device_id }";
|
||||
Comment = "#{ new_resource.comment }";
|
||||
Default = "$#{ new_resource.default }";
|
||||
DriverName = "#{ new_resource.driver_name }";
|
||||
Location = "#{ new_resource.location }";
|
||||
PortName = "#{ port_name }";
|
||||
Shared = "$#{ new_resource.shared }";
|
||||
ShareName = "#{ new_resource.share_name }";
|
||||
}
|
||||
EOH
|
||||
end
|
||||
end
|
||||
|
||||
def delete_printer
|
||||
powershell_script "Deleting printer: #{ new_resource.name }" do
|
||||
code <<-EOH
|
||||
$printer = Get-WMIObject -class Win32_Printer -EnableAllPrivileges -Filter "name = '#{ new_resource.name }'"
|
||||
$printer.Delete()
|
||||
EOH
|
||||
end
|
||||
end
|
||||
103
cookbooks/windows/providers/printer_port.rb
Normal file
103
cookbooks/windows/providers/printer_port.rb
Normal file
@@ -0,0 +1,103 @@
|
||||
#
|
||||
# Author:: Doug Ireton (<doug.ireton@nordstrom.com>)
|
||||
# Cookbook Name:: windows
|
||||
# Provider:: printer_port
|
||||
#
|
||||
# Copyright:: 2012, Nordstrom, Inc.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
use_inline_resources if defined?(use_inline_resources)
|
||||
|
||||
# Support whyrun
|
||||
def whyrun_supported?
|
||||
true
|
||||
end
|
||||
|
||||
action :create do
|
||||
if @current_resource.exists
|
||||
Chef::Log.info "#{ @new_resource } already exists - nothing to do."
|
||||
else
|
||||
converge_by("Create #{ @new_resource }") do
|
||||
create_printer_port
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
action :delete do
|
||||
if @current_resource.exists
|
||||
converge_by("Delete #{ @new_resource }") do
|
||||
delete_printer_port
|
||||
end
|
||||
else
|
||||
Chef::Log.info "#{ @current_resource } doesn't exist - can't delete."
|
||||
end
|
||||
end
|
||||
|
||||
def load_current_resource
|
||||
@current_resource = Chef::Resource::WindowsPrinterPort.new(@new_resource.name)
|
||||
@current_resource.name(@new_resource.name)
|
||||
@current_resource.ipv4_address(@new_resource.ipv4_address)
|
||||
@current_resource.port_name(@new_resource.port_name || "IP_#{ @new_resource.ipv4_address }")
|
||||
|
||||
if port_exists?(@current_resource.port_name)
|
||||
# TODO: Set @current_resource port properties from registry
|
||||
@current_resource.exists = true
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
private
|
||||
|
||||
PORTS_REG_KEY = 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\\'.freeze unless defined?(PORTS_REG_KEY)
|
||||
|
||||
def port_exists?(name)
|
||||
port_reg_key = PORTS_REG_KEY + name
|
||||
|
||||
Chef::Log.debug "Checking to see if this reg key exists: '#{ port_reg_key }'"
|
||||
Registry.key_exists?(port_reg_key)
|
||||
end
|
||||
|
||||
|
||||
def create_printer_port
|
||||
|
||||
port_name = new_resource.port_name || "IP_#{ new_resource.ipv4_address }"
|
||||
|
||||
# create the printer port using PowerShell
|
||||
powershell_script "Creating printer port #{ new_resource.port_name }" do
|
||||
code <<-EOH
|
||||
|
||||
Set-WmiInstance -class Win32_TCPIPPrinterPort `
|
||||
-EnableAllPrivileges `
|
||||
-Argument @{ HostAddress = "#{ new_resource.ipv4_address }";
|
||||
Name = "#{ port_name }";
|
||||
Description = "#{ new_resource.port_description }";
|
||||
PortNumber = "#{ new_resource.port_number }";
|
||||
Protocol = "#{ new_resource.port_protocol }";
|
||||
SNMPEnabled = "$#{ new_resource.snmp_enabled }";
|
||||
}
|
||||
EOH
|
||||
end
|
||||
end
|
||||
|
||||
def delete_printer_port
|
||||
|
||||
port_name = new_resource.port_name || "IP_#{ new_resource.ipv4_address }"
|
||||
|
||||
powershell_script "Deleting printer port: #{ new_resource.port_name }" do
|
||||
code <<-EOH
|
||||
$port = Get-WMIObject -class Win32_TCPIPPrinterPort -EnableAllPrivileges -Filter "name = '#{ port_name }'"
|
||||
$port.Delete()
|
||||
EOH
|
||||
end
|
||||
end
|
||||
33
cookbooks/windows/providers/reboot.rb
Normal file
33
cookbooks/windows/providers/reboot.rb
Normal file
@@ -0,0 +1,33 @@
|
||||
#
|
||||
# Author:: Seth Chisamore (<schisamo@chef.io>)
|
||||
# Cookbook Name:: windows
|
||||
# Provider:: reboot
|
||||
#
|
||||
# Copyright:: 2011, Chef Software, Inc.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
action :request do
|
||||
node.run_state[:reboot_requested] = true
|
||||
node.run_state[:reboot_timeout] = @new_resource.timeout
|
||||
node.run_state[:reboot_reason] = @new_resource.reason
|
||||
new_resource.updated_by_last_action(true)
|
||||
end
|
||||
|
||||
action :cancel do
|
||||
node.run_state.delete(:reboot_requested)
|
||||
node.run_state.delete(:reboot_timeout)
|
||||
node.run_state.delete(:reboot_reason)
|
||||
new_resource.updated_by_last_action(true)
|
||||
end
|
||||
75
cookbooks/windows/providers/registry.rb
Normal file
75
cookbooks/windows/providers/registry.rb
Normal file
@@ -0,0 +1,75 @@
|
||||
#
|
||||
# Author:: Doug MacEachern (<dougm@vmware.com>)
|
||||
# Author:: Seth Chisamore (<schisamo@chef.io>)
|
||||
# Author:: Paul Morton (<pmorton@biaprotect.com>)
|
||||
# Cookbook Name:: windows
|
||||
# Provider:: registry
|
||||
#
|
||||
# Copyright:: 2010, VMware, Inc.
|
||||
# Copyright:: 2011, Chef Software, Inc.
|
||||
# Copyright:: 2011, Business Intelligence Associates, Inc
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
include Windows::RegistryHelper
|
||||
|
||||
action :create do
|
||||
updated = registry_update(:create)
|
||||
new_resource.updated_by_last_action(updated)
|
||||
end
|
||||
|
||||
action :modify do
|
||||
updated = registry_update(:open)
|
||||
new_resource.updated_by_last_action(updated)
|
||||
end
|
||||
|
||||
action :force_modify do
|
||||
require 'timeout'
|
||||
Timeout.timeout(120) do
|
||||
@new_resource.values.each do |value_name, value_data|
|
||||
i = 1
|
||||
until i > 5 do
|
||||
desired_value_data = value_data
|
||||
current_value_data = get_value(@new_resource.key_name.dup, value_name.dup)
|
||||
if current_value_data.to_s == desired_value_data.to_s
|
||||
Chef::Log.debug("#{@new_resource} value [#{value_name}] desired [#{desired_value_data}] data already set. Check #{i}/5.")
|
||||
i+=1
|
||||
else
|
||||
Chef::Log.debug("#{@new_resource} value [#{value_name}] current [#{current_value_data}] data not equal to desired [#{desired_value_data}] data. Setting value and restarting check loop.")
|
||||
begin
|
||||
updated = registry_update(:open)
|
||||
new_resource.updated_by_last_action(updated)
|
||||
rescue Exception
|
||||
updated = registry_update(:create)
|
||||
new_resource.updated_by_last_action(updated)
|
||||
end
|
||||
i=0 # start count loop over
|
||||
end
|
||||
end
|
||||
end
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
action :remove do
|
||||
delete_value(@new_resource.key_name,@new_resource.values)
|
||||
new_resource.updated_by_last_action(true)
|
||||
end
|
||||
|
||||
private
|
||||
def registry_update(mode)
|
||||
|
||||
Chef::Log.debug("Registry Mode (#{mode})")
|
||||
updated = set_value(mode,@new_resource.key_name,@new_resource.values,@new_resource.type)
|
||||
end
|
||||
56
cookbooks/windows/providers/shortcut.rb
Normal file
56
cookbooks/windows/providers/shortcut.rb
Normal file
@@ -0,0 +1,56 @@
|
||||
#
|
||||
# Author:: Doug MacEachern <dougm@vmware.com>
|
||||
# Cookbook Name:: windows
|
||||
# Provider:: shortcut
|
||||
#
|
||||
# Copyright:: 2010, VMware, Inc.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
def load_current_resource
|
||||
require 'win32ole'
|
||||
|
||||
@link = WIN32OLE.new("WScript.Shell").CreateShortcut(@new_resource.name)
|
||||
|
||||
@current_resource = Chef::Resource::WindowsShortcut.new(@new_resource.name)
|
||||
@current_resource.name(@new_resource.name)
|
||||
@current_resource.target(@link.TargetPath)
|
||||
@current_resource.arguments(@link.Arguments)
|
||||
@current_resource.description(@link.Description)
|
||||
@current_resource.cwd(@link.WorkingDirectory)
|
||||
end
|
||||
|
||||
# Check to see if the shorcut needs any changes
|
||||
#
|
||||
# === Returns
|
||||
# <true>:: If a change is required
|
||||
# <false>:: If the shorcuts are identical
|
||||
def compare_shortcut
|
||||
[:target, :arguments, :description, :cwd].any? do |attr|
|
||||
!@new_resource.send(attr).nil? && @current_resource.send(attr) != @new_resource.send(attr)
|
||||
end
|
||||
end
|
||||
|
||||
def action_create
|
||||
if compare_shortcut
|
||||
@link.TargetPath = @new_resource.target if @new_resource.target != nil
|
||||
@link.Arguments = @new_resource.arguments if @new_resource.arguments != nil
|
||||
@link.Description = @new_resource.description if @new_resource.description != nil
|
||||
@link.WorkingDirectory = @new_resource.cwd if @new_resource.cwd != nil
|
||||
#ignoring: WindowStyle, Hotkey, IconLocation
|
||||
@link.Save
|
||||
Chef::Log.info("Added #{@new_resource} shortcut")
|
||||
new_resource.updated_by_last_action(true)
|
||||
end
|
||||
end
|
||||
167
cookbooks/windows/providers/task.rb
Normal file
167
cookbooks/windows/providers/task.rb
Normal file
@@ -0,0 +1,167 @@
|
||||
#
|
||||
# Author:: Paul Mooring (<paul@chef.io>)
|
||||
# Cookbook Name:: windows
|
||||
# Provider:: task
|
||||
#
|
||||
# Copyright:: 2012, Chef Software, Inc.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
require 'chef/mixin/shell_out'
|
||||
include Chef::Mixin::ShellOut
|
||||
|
||||
action :create do
|
||||
if @current_resource.exists
|
||||
Chef::Log.info "#{@new_resource} task already exists - nothing to do"
|
||||
else
|
||||
if @new_resource.user and @new_resource.password.nil? then Chef::Log.debug "#{@new_resource} did not specify a password, creating task without a password" end
|
||||
use_force = @new_resource.force ? '/F' : ''
|
||||
cmd = "schtasks /Create #{use_force} /TN \"#{@new_resource.name}\" "
|
||||
schedule = @new_resource.frequency == :on_logon ? "ONLOGON" : @new_resource.frequency
|
||||
cmd += "/SC #{schedule} "
|
||||
cmd += "/MO #{@new_resource.frequency_modifier} " if [:minute, :hourly, :daily, :weekly, :monthly].include?(@new_resource.frequency)
|
||||
cmd += "/SD \"#{@new_resource.start_day}\" " unless @new_resource.start_day.nil?
|
||||
cmd += "/ST \"#{@new_resource.start_time}\" " unless @new_resource.start_time.nil?
|
||||
cmd += "/TR \"#{@new_resource.command}\" "
|
||||
cmd += "/RU \"#{@new_resource.user}\" " if @new_resource.user
|
||||
cmd += "/RP \"#{@new_resource.password}\" " if @new_resource.user and @new_resource.password
|
||||
cmd += "/RL HIGHEST " if @new_resource.run_level == :highest
|
||||
shell_out!(cmd, {:returns => [0]})
|
||||
new_resource.updated_by_last_action true
|
||||
Chef::Log.info "#{@new_resource} task created"
|
||||
end
|
||||
end
|
||||
|
||||
action :run do
|
||||
if @current_resource.exists
|
||||
if @current_resource.status == :running
|
||||
Chef::Log.info "#{@new_resource} task is currently running, skipping run"
|
||||
else
|
||||
cmd = "schtasks /Run /TN \"#{@current_resource.name}\""
|
||||
shell_out!(cmd, {:returns => [0]})
|
||||
new_resource.updated_by_last_action true
|
||||
Chef::Log.info "#{@new_resource} task ran"
|
||||
end
|
||||
else
|
||||
Chef::Log.debug "#{@new_resource} task doesn't exists - nothing to do"
|
||||
end
|
||||
end
|
||||
|
||||
action :change do
|
||||
if @current_resource.exists
|
||||
cmd = "schtasks /Change /TN \"#{@current_resource.name}\" "
|
||||
cmd += "/TR \"#{@new_resource.command}\" " if @new_resource.command
|
||||
if @new_resource.user && @new_resource.password
|
||||
cmd += "/RU \"#{@new_resource.user}\" /RP \"#{@new_resource.password}\" "
|
||||
elsif (@new_resource.user and !@new_resource.password) || (@new_resource.password and !@new_resource.user)
|
||||
Chef::Log.fatal "#{@new_resource.name}: Can't specify user or password without both!"
|
||||
end
|
||||
shell_out!(cmd, {:returns => [0]})
|
||||
new_resource.updated_by_last_action true
|
||||
Chef::Log.info "Change #{@new_resource} task ran"
|
||||
else
|
||||
Chef::Log.debug "#{@new_resource} task doesn't exists - nothing to do"
|
||||
end
|
||||
end
|
||||
|
||||
action :delete do
|
||||
if @current_resource.exists
|
||||
use_force = @new_resource.force ? '/F' : ''
|
||||
cmd = "schtasks /Delete #{use_force} /TN \"#{@current_resource.name}\""
|
||||
shell_out!(cmd, {:returns => [0]})
|
||||
new_resource.updated_by_last_action true
|
||||
Chef::Log.info "#{@new_resource} task deleted"
|
||||
else
|
||||
Chef::Log.debug "#{@new_resource} task doesn't exists - nothing to do"
|
||||
end
|
||||
end
|
||||
|
||||
action :enable do
|
||||
if @current_resource.exists
|
||||
if @current_resource.enabled
|
||||
Chef::Log.debug "#{@new_resource} already enabled - nothing to do"
|
||||
else
|
||||
cmd = "schtasks /Change /TN \"#{@current_resource.name}\" "
|
||||
cmd += "/ENABLE"
|
||||
shell_out!(cmd, {:returns => [0]})
|
||||
@new_resource.updated_by_last_action true
|
||||
Chef::Log.info "#{@new_resource} task enabled"
|
||||
end
|
||||
else
|
||||
Chef::Log.fatal "#{@new_resource} task doesn't exist - nothing to do"
|
||||
raise Errno::ENOENT, "#{@new_resource}: task does not exist, cannot enable"
|
||||
end
|
||||
end
|
||||
|
||||
action :disable do
|
||||
if @current_resource.exists
|
||||
if @current_resource.enabled
|
||||
cmd = "schtasks /Change /TN \"#{@current_resource.name}\" "
|
||||
cmd += "/DISABLE"
|
||||
shell_out!(cmd, {:returns => [0]})
|
||||
@new_resource.updated_by_last_action true
|
||||
Chef::Log.info "#{@new_resource} task disabled"
|
||||
else
|
||||
Chef::Log.debug "#{@new_resource} already disabled - nothing to do"
|
||||
end
|
||||
else
|
||||
Chef::Log.debug "#{@new_resource} task doesn't exist - nothing to do"
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def load_current_resource
|
||||
@current_resource = Chef::Resource::WindowsTask.new(@new_resource.name)
|
||||
@current_resource.name(@new_resource.name)
|
||||
|
||||
task_hash = load_task_hash(@current_resource.name)
|
||||
if task_hash[:TaskName] == '\\' + @new_resource.name
|
||||
@current_resource.exists = true
|
||||
if task_hash[:Status] == "Running"
|
||||
@current_resource.status = :running
|
||||
end
|
||||
if task_hash[:ScheduledTaskState] == "Enabled"
|
||||
@current_resource.enabled = true
|
||||
end
|
||||
@current_resource.cwd(task_hash[:Folder])
|
||||
@current_resource.command(task_hash[:TaskToRun])
|
||||
@current_resource.user(task_hash[:RunAsUser])
|
||||
end if task_hash.respond_to? :[]
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def load_task_hash(task_name)
|
||||
Chef::Log.debug "looking for existing tasks"
|
||||
|
||||
# we use shell_out here instead of shell_out! because a failure implies that the task does not exist
|
||||
output = shell_out("schtasks /Query /FO LIST /V /TN \"#{task_name}\"").stdout
|
||||
if output.empty?
|
||||
task = false
|
||||
else
|
||||
task = Hash.new
|
||||
|
||||
output.split("\n").map! do |line|
|
||||
line.split(":", 2).map! do |field|
|
||||
field.strip
|
||||
end
|
||||
end.each do |field|
|
||||
if field.kind_of? Array and field[0].respond_to? :to_sym
|
||||
task[field[0].gsub(/\s+/,"").to_sym] = field[1]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
task
|
||||
end
|
||||
93
cookbooks/windows/providers/zipfile.rb
Normal file
93
cookbooks/windows/providers/zipfile.rb
Normal file
@@ -0,0 +1,93 @@
|
||||
#
|
||||
# Author:: Doug MacEachern (<dougm@vmware.com>)
|
||||
# Author:: Seth Chisamore (<schisamo@chef.io>)
|
||||
# Cookbook Name:: windows
|
||||
# Provider:: zipfile
|
||||
#
|
||||
# Copyright:: 2010, VMware, Inc.
|
||||
# Copyright:: 2011, Chef Software, Inc.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
include Windows::Helper
|
||||
|
||||
require 'find'
|
||||
|
||||
action :unzip do
|
||||
ensure_rubyzip_gem_installed
|
||||
Chef::Log.debug("unzip #{@new_resource.source} => #{@new_resource.path} (overwrite=#{@new_resource.overwrite})")
|
||||
|
||||
Zip::File.open(cached_file(@new_resource.source, @new_resource.checksum)) do |zip|
|
||||
zip.each do |entry|
|
||||
path = ::File.join(@new_resource.path, entry.name)
|
||||
FileUtils.mkdir_p(::File.dirname(path))
|
||||
if @new_resource.overwrite && ::File.exists?(path) && !::File.directory?(path)
|
||||
FileUtils.rm(path)
|
||||
end
|
||||
zip.extract(entry, path)
|
||||
end
|
||||
end
|
||||
new_resource.updated_by_last_action(true)
|
||||
end
|
||||
|
||||
action :zip do
|
||||
ensure_rubyzip_gem_installed
|
||||
# sanitize paths for windows.
|
||||
@new_resource.source.downcase.gsub!(::File::SEPARATOR, ::File::ALT_SEPARATOR)
|
||||
@new_resource.path.downcase.gsub!(::File::SEPARATOR, ::File::ALT_SEPARATOR)
|
||||
Chef::Log.debug("zip #{@new_resource.source} => #{@new_resource.path} (overwrite=#{@new_resource.overwrite})")
|
||||
|
||||
if @new_resource.overwrite == false && ::File.exists?(@new_resource.path)
|
||||
Chef::Log.info("file #{@new_resource.path} already exists and overwrite is set to false, exiting")
|
||||
else
|
||||
# delete the archive if it already exists, because we are recreating it.
|
||||
if ::File.exists?(@new_resource.path)
|
||||
::File.unlink(@new_resource.path)
|
||||
end
|
||||
# only supporting compression of a single directory (recursively).
|
||||
if ::File.directory?(@new_resource.source)
|
||||
z = Zip::File.new(@new_resource.path, true)
|
||||
unless @new_resource.source =~ /::File::ALT_SEPARATOR$/
|
||||
@new_resource.source << ::File::ALT_SEPARATOR
|
||||
end
|
||||
Find.find(@new_resource.source) do |f|
|
||||
f.downcase.gsub!(::File::SEPARATOR, ::File::ALT_SEPARATOR)
|
||||
# don't add root directory to the zipfile.
|
||||
next if f == @new_resource.source
|
||||
# strip the root directory from the filename before adding it to the zipfile.
|
||||
zip_fname = f.sub(@new_resource.source, '')
|
||||
Chef::Log.debug("adding #{zip_fname} to archive, sourcefile is: #{f}")
|
||||
z.add(zip_fname, f)
|
||||
end
|
||||
z.close
|
||||
new_resource.updated_by_last_action(true)
|
||||
else
|
||||
Chef::Log.info("Single directory must be specified for compression, and #{@new_resource.source} does not meet that criteria.")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
def ensure_rubyzip_gem_installed
|
||||
begin
|
||||
require 'zip'
|
||||
rescue LoadError
|
||||
Chef::Log.info("Missing gem 'rubyzip'...installing now.")
|
||||
chef_gem "rubyzip" do
|
||||
version node['windows']['rubyzipversion']
|
||||
action :install
|
||||
end
|
||||
require 'zip'
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user