Downgrade mysql cookbook for now
It doesn't play well with our current dev server setup
This commit is contained in:
@@ -1,33 +0,0 @@
|
||||
#
|
||||
# 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
|
||||
@@ -1,64 +0,0 @@
|
||||
#
|
||||
# Author:: Seth Chisamore (<schisamo@chef.io>)
|
||||
# Cookbook Name:: windws
|
||||
# Provider:: batch
|
||||
#
|
||||
# Copyright:: 2011-2015, 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
|
||||
@@ -1,178 +0,0 @@
|
||||
#
|
||||
# Author:: Richard Lavey (richard.lavey@calastone.com)
|
||||
# Cookbook Name:: windows
|
||||
# Provider:: certificate
|
||||
#
|
||||
# Copyright:: 2015, Calastone Ltd.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
# See this for info on certutil
|
||||
# https://technet.microsoft.com/en-gb/library/cc732443.aspx
|
||||
|
||||
include Windows::Helper
|
||||
|
||||
# Support whyrun
|
||||
def whyrun_supported?
|
||||
true
|
||||
end
|
||||
|
||||
use_inline_resources
|
||||
|
||||
action :create do
|
||||
hash = '$cert.GetCertHashString()'
|
||||
code_script = cert_script(true) <<
|
||||
within_store_script { |store| store + '.Add($cert)' } <<
|
||||
acl_script(hash)
|
||||
|
||||
guard_script = cert_script(false) <<
|
||||
cert_exists_script(hash)
|
||||
|
||||
powershell_script @new_resource.name do
|
||||
guard_interpreter :powershell_script
|
||||
convert_boolean_return true
|
||||
code code_script
|
||||
not_if guard_script
|
||||
end
|
||||
end
|
||||
|
||||
# acl_add is a modify-if-exists operation : not idempotent
|
||||
action :acl_add do
|
||||
if ::File.exist?(@new_resource.source)
|
||||
hash = '$cert.GetCertHashString()'
|
||||
code_script = cert_script(false)
|
||||
guard_script = cert_script(false)
|
||||
else
|
||||
# make sure we have no spaces in the hash string
|
||||
hash = "\"#{@new_resource.source.gsub(/\s/, '')}\""
|
||||
code_script = ''
|
||||
guard_script = ''
|
||||
end
|
||||
code_script << acl_script(hash)
|
||||
guard_script << cert_exists_script(hash)
|
||||
|
||||
powershell_script @new_resource.name do
|
||||
guard_interpreter :powershell_script
|
||||
convert_boolean_return true
|
||||
code code_script
|
||||
only_if guard_script
|
||||
end
|
||||
end
|
||||
|
||||
action :delete do
|
||||
# do we have a hash or a subject?
|
||||
# TODO: It's a bit annoying to know the thumbprint of a cert you want to remove when you already
|
||||
# have the file. Support reading the hash directly from the file if provided.
|
||||
if @new_resource.source.match(/^[a-fA-F0-9]{40}$/)
|
||||
search = "Thumbprint -eq '#{@new_resource.source}'"
|
||||
else
|
||||
search = "Subject -like '*#{@new_resource.source.sub(/\*/, '`*')}*'" # escape any * in the source
|
||||
end
|
||||
cert_command = "Get-ChildItem Cert:\\#{@location}\\#{@new_resource.store_name} | where { $_.#{search} }"
|
||||
|
||||
code_script = within_store_script do |store|
|
||||
<<-EOH
|
||||
foreach ($c in #{cert_command})
|
||||
{
|
||||
#{store}.Remove($c)
|
||||
}
|
||||
EOH
|
||||
end
|
||||
guard_script = "@(#{cert_command}).Count -gt 0\n"
|
||||
|
||||
powershell_script @new_resource.name do
|
||||
guard_interpreter :powershell_script
|
||||
convert_boolean_return true
|
||||
code code_script
|
||||
only_if guard_script
|
||||
end
|
||||
end
|
||||
|
||||
def load_current_resource
|
||||
# Currently we don't read out the cert acl here and converge it in a very Chef-y way.
|
||||
# We also don't read if the private key is available or populate "exists". This means
|
||||
# that if you converged a cert without persisting the private key once, we won't do it
|
||||
# again, even if you have a cert with the keys now.
|
||||
# TODO: Make this more Chef-y and follow a more state-based patten of convergence.
|
||||
@current_resource = Chef::Resource::WindowsCertificate.new(@new_resource.name)
|
||||
# TODO: Change to allow source to be read from the cookbook. It makes testing
|
||||
# and loading certs from the cookbook much easier.
|
||||
@current_resource.source(@new_resource.source)
|
||||
@current_resource.pfx_password(@new_resource.pfx_password)
|
||||
@current_resource.private_key_acl(@new_resource.private_key_acl)
|
||||
@current_resource.store_name(@new_resource.store_name)
|
||||
@current_resource.user_store(@new_resource.user_store)
|
||||
@location = @current_resource.user_store ? 'CurrentUser' : 'LocalMachine'
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def cert_script(persist)
|
||||
cert_script = '$cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2'
|
||||
file = win_friendly_path(@new_resource.source)
|
||||
cert_script << " \"#{file}\""
|
||||
if ::File.extname(file.downcase) == '.pfx'
|
||||
cert_script << ", \"#{@new_resource.pfx_password}\""
|
||||
if persist && @new_resource.user_store
|
||||
cert_script << ', [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::PersistKeySet'
|
||||
elsif persist
|
||||
cert_script << ', ([System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::PersistKeySet -bor [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::MachineKeyset)'
|
||||
end
|
||||
end
|
||||
cert_script << "\n"
|
||||
end
|
||||
|
||||
def cert_exists_script(hash)
|
||||
<<-EOH
|
||||
$hash = #{hash}
|
||||
Test-Path "Cert:\\#{@location}\\#{@new_resource.store_name}\\$hash"
|
||||
EOH
|
||||
end
|
||||
|
||||
def within_store_script
|
||||
inner_script = yield '$store'
|
||||
<<-EOH
|
||||
$store = New-Object System.Security.Cryptography.X509Certificates.X509Store "#{@new_resource.store_name}", ([System.Security.Cryptography.X509Certificates.StoreLocation]::#{@location})
|
||||
$store.Open([System.Security.Cryptography.X509Certificates.OpenFlags]::ReadWrite)
|
||||
#{inner_script}
|
||||
$store.Close()
|
||||
EOH
|
||||
end
|
||||
|
||||
def acl_script(hash)
|
||||
return '' if @new_resource.private_key_acl.nil? || @new_resource.private_key_acl.length == 0
|
||||
# this PS came from http://blogs.technet.com/b/operationsguy/archive/2010/11/29/provide-access-to-private-keys-commandline-vs-powershell.aspx
|
||||
# and from https://msdn.microsoft.com/en-us/library/windows/desktop/bb204778(v=vs.85).aspx
|
||||
set_acl_script = <<-EOH
|
||||
$hash = #{hash}
|
||||
$storeCert = Get-ChildItem "cert:\\#{@location}\\#{@new_resource.store_name}\\$hash"
|
||||
if ($storeCert -eq $null) { throw 'no key exists.' }
|
||||
$keyname = $storeCert.PrivateKey.CspKeyContainerInfo.UniqueKeyContainerName
|
||||
if ($keyname -eq $null) { throw 'no private key exists.' }
|
||||
if ($storeCert.PrivateKey.CspKeyContainerInfo.MachineKeyStore)
|
||||
{
|
||||
$fullpath = "$Env:ProgramData\\Microsoft\\Crypto\\RSA\\MachineKeys\\$keyname"
|
||||
}
|
||||
else
|
||||
{
|
||||
$currentUser = New-Object System.Security.Principal.NTAccount($Env:UserDomain, $Env:UserName)
|
||||
$userSID = $currentUser.Translate([System.Security.Principal.SecurityIdentifier]).Value
|
||||
$fullpath = "$Env:ProgramData\\Microsoft\\Crypto\\RSA\\$userSID\\$keyname"
|
||||
}
|
||||
EOH
|
||||
@new_resource.private_key_acl.each do |name|
|
||||
set_acl_script << "$uname='#{name}'; icacls $fullpath /grant $uname`:RX\n"
|
||||
end
|
||||
set_acl_script
|
||||
end
|
||||
@@ -1,133 +0,0 @@
|
||||
#
|
||||
# Author:: Richard Lavey (richard.lavey@calastone.com)
|
||||
# Cookbook Name:: windows
|
||||
# Provider:: certificate_binding
|
||||
#
|
||||
# Copyright:: 2015, Calastone Ltd.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
# See https://msdn.microsoft.com/en-us/library/windows/desktop/cc307236%28v=vs.85%29.aspx for netsh info
|
||||
|
||||
include Chef::Mixin::ShellOut
|
||||
include Chef::Mixin::PowershellOut
|
||||
include Windows::Helper
|
||||
|
||||
# Support whyrun
|
||||
def whyrun_supported?
|
||||
true
|
||||
end
|
||||
|
||||
action :create do
|
||||
hash = @new_resource.name_kind == :subject ? getHashFromSubject : @new_resource.cert_name
|
||||
|
||||
if @current_resource.exists
|
||||
needsChange = (hash.casecmp(@current_hash) != 0)
|
||||
|
||||
if needsChange
|
||||
converge_by("Changing #{@current_resource.address}:#{@current_resource.port}") do
|
||||
deleteBinding
|
||||
setBinding hash
|
||||
end
|
||||
else
|
||||
Chef::Log.debug("#{@current_resource.address}:#{@current_resource.port} already bound to #{hash} - nothing to do")
|
||||
end
|
||||
else
|
||||
converge_by("Binding #{@current_resource.address}:#{@current_resource.port}") do
|
||||
setBinding hash
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
action :delete do
|
||||
if @current_resource.exists
|
||||
converge_by("Deleting #{@current_resource.address}:#{@current_resource.port}") do
|
||||
deleteBinding
|
||||
end
|
||||
else
|
||||
Chef::Log.debug("#{@current_resource.address}:#{@current_resource.port} not bound - nothing to do")
|
||||
end
|
||||
end
|
||||
|
||||
def load_current_resource
|
||||
@current_resource = Chef::Resource::WindowsCertificateBinding.new(@new_resource.name)
|
||||
@current_resource.cert_name(@new_resource.cert_name)
|
||||
@current_resource.name_kind(@new_resource.name_kind)
|
||||
@current_resource.address(@new_resource.address)
|
||||
@current_resource.port(@new_resource.port)
|
||||
@current_resource.store_name(@new_resource.store_name)
|
||||
|
||||
@command = locate_sysnative_cmd('netsh.exe')
|
||||
getCurrentHash
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def getCurrentHash
|
||||
cmd = shell_out("#{@command} http show sslcert ipport=#{@current_resource.address}:#{@current_resource.port}")
|
||||
Chef::Log.debug "netsh reports: #{cmd.stdout}"
|
||||
|
||||
if cmd.exitstatus == 0
|
||||
m = cmd.stdout.scan(/Certificate Hash\s+:\s?([A-Fa-f0-9]{40})/)
|
||||
if m.length == 0
|
||||
fail "Failed to extract hash from command output #{cmd.stdout}"
|
||||
else
|
||||
@current_hash = m[0][0]
|
||||
@current_resource.exists = true
|
||||
end
|
||||
else
|
||||
@current_resource.exists = false
|
||||
end
|
||||
end
|
||||
|
||||
def setBinding(hash)
|
||||
cmd = "#{@command} http add sslcert"
|
||||
cmd << " ipport=#{@current_resource.address}:#{@current_resource.port}"
|
||||
cmd << " certhash=#{hash}"
|
||||
cmd << " appid=#{@current_resource.app_id}"
|
||||
cmd << " certstorename=#{@current_resource.store_name}"
|
||||
checkHash hash
|
||||
|
||||
shell_out!(cmd)
|
||||
end
|
||||
|
||||
def deleteBinding
|
||||
shell_out!("#{@command} http delete sslcert ipport=#{@current_resource.address}:#{@current_resource.port}")
|
||||
end
|
||||
|
||||
def checkHash(hash)
|
||||
p = powershell_out!("Test-Path \"cert:\\LocalMachine\\#{@current_resource.store_name}\\#{hash}\"")
|
||||
|
||||
unless p.stderr.empty? && p.stdout =~ /True/i
|
||||
fail "A Cert with hash of #{hash} doesn't exist in keystore LocalMachine\\#{@current_resource.store_name}"
|
||||
end
|
||||
nil
|
||||
end
|
||||
|
||||
def getHashFromSubject
|
||||
# escape wildcard subject name (*.acme.com)
|
||||
subject = @current_resource.cert_name.sub(/\*/, '`*')
|
||||
ps_script = "& { gci cert:\\localmachine\\#{@current_resource.store_name} | where subject -like '*#{subject}*' | select -first 1 -expandproperty Thumbprint }"
|
||||
|
||||
Chef::Log.debug "Running PS script #{ps_script}"
|
||||
p = powershell_out!(ps_script)
|
||||
|
||||
if !p.stderr.nil? && p.stderr.length > 0
|
||||
fail "#{ps_script} failed with #{p.stderr}"
|
||||
elsif p.stdout.nil? || p.stdout.length == 0
|
||||
fail "Couldn't find thumbprint for subject #{@current_resource.cert_name}"
|
||||
end
|
||||
|
||||
p.stdout.strip
|
||||
end
|
||||
@@ -1,65 +0,0 @@
|
||||
#
|
||||
# Author:: Seth Chisamore (<schisamo@chef.io>)
|
||||
# Cookbook Name:: windows
|
||||
# Provider:: feature_dism
|
||||
#
|
||||
# Copyright:: 2011-2015, 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 && win_version.minor_version >= 2
|
||||
shell_out!("#{dism} /online /disable-feature /featurename:#{@new_resource.feature_name} /Remove /norestart", returns: [0, 42, 127, 3010])
|
||||
else
|
||||
fail Chef::Exceptions::UnsupportedAction, "#{self} :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
|
||||
@@ -1,38 +0,0 @@
|
||||
#
|
||||
# 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
|
||||
@@ -1,61 +0,0 @@
|
||||
#
|
||||
# Author:: Seth Chisamore (<schisamo@chef.io>)
|
||||
# Cookbook Name:: windows
|
||||
# Provider:: feature_servermanagercmd
|
||||
#
|
||||
# Copyright:: 2011-2015, 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
|
||||
@@ -1,69 +0,0 @@
|
||||
#
|
||||
# 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.exist?(@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
|
||||
@@ -1,91 +0,0 @@
|
||||
#
|
||||
# Author:: Richard Lavey (richard.lavey@calastone.com)
|
||||
# Cookbook Name:: windows
|
||||
# Provider:: http_acl
|
||||
#
|
||||
# Copyright:: 2015, Calastone Ltd.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
# See https://msdn.microsoft.com/en-us/library/windows/desktop/cc307236%28v=vs.85%29.aspx for netsh info
|
||||
|
||||
include Chef::Mixin::ShellOut
|
||||
include Windows::Helper
|
||||
|
||||
# Support whyrun
|
||||
def whyrun_supported?
|
||||
true
|
||||
end
|
||||
|
||||
action :create do
|
||||
fail 'No user property set' if @new_resource.user.nil? || @new_resource.user.empty?
|
||||
|
||||
if @current_resource.exists
|
||||
needsChange = (@current_resource.user.casecmp(@new_resource.user) != 0)
|
||||
|
||||
if needsChange
|
||||
converge_by("Changing #{@current_resource.url}") do
|
||||
deleteAcl
|
||||
setAcl
|
||||
end
|
||||
else
|
||||
Chef::Log.debug("#{@current_resource.url} already set - nothing to do")
|
||||
end
|
||||
else
|
||||
converge_by("Setting #{@current_resource.url}") do
|
||||
setAcl
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
action :delete do
|
||||
if @current_resource.exists
|
||||
converge_by("Deleting #{@current_resource.url}") do
|
||||
deleteAcl
|
||||
end
|
||||
else
|
||||
Chef::Log.debug("#{@current_resource.url} does not exist - nothing to do")
|
||||
end
|
||||
end
|
||||
|
||||
def load_current_resource
|
||||
@current_resource = Chef::Resource::WindowsHttpAcl.new(@new_resource.name)
|
||||
@current_resource.url(@new_resource.url)
|
||||
|
||||
@command = locate_sysnative_cmd('netsh.exe')
|
||||
getCurrentAcl
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def getCurrentAcl
|
||||
cmd = shell_out!("#{@command} http show urlacl url=#{@current_resource.url}")
|
||||
Chef::Log.debug "netsh reports: #{cmd.stdout}"
|
||||
|
||||
m = cmd.stdout.scan(/User:\s*(\S+)/)
|
||||
if m.length == 0
|
||||
@current_resource.exists = false
|
||||
else
|
||||
@current_resource.user(m[0][0])
|
||||
@current_resource.exists = true
|
||||
end
|
||||
end
|
||||
|
||||
def setAcl
|
||||
shell_out!("#{@command} http add urlacl url=#{@new_resource.url} user=\"#{@new_resource.user}\"")
|
||||
end
|
||||
|
||||
def deleteAcl
|
||||
shell_out!("#{@command} http delete urlacl url=#{@new_resource.url}")
|
||||
end
|
||||
@@ -1,149 +0,0 @@
|
||||
#
|
||||
# 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
|
||||
create(pagefile) unless exists?(pagefile)
|
||||
|
||||
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)
|
||||
Chef::Log.fatal(stderr) unless stderr.empty?
|
||||
end
|
||||
|
||||
def wmic
|
||||
@wmic ||= begin
|
||||
locate_sysnative_cmd('wmic.exe')
|
||||
end
|
||||
end
|
||||
@@ -1,52 +0,0 @@
|
||||
#
|
||||
# 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
|
||||
@@ -1,99 +0,0 @@
|
||||
#
|
||||
# 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
|
||||
@@ -1,99 +0,0 @@
|
||||
#
|
||||
# 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
|
||||
@@ -1,33 +0,0 @@
|
||||
#
|
||||
# Author:: Seth Chisamore (<schisamo@chef.io>)
|
||||
# Cookbook Name:: windows
|
||||
# Provider:: reboot
|
||||
#
|
||||
# Copyright:: 2011-2015, 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
|
||||
@@ -1,75 +0,0 @@
|
||||
#
|
||||
# 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-2015, 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
|
||||
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
|
||||
@@ -1,58 +0,0 @@
|
||||
#
|
||||
# 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)
|
||||
@current_resource.iconlocation(@link.IconLocation)
|
||||
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, :iconlocation].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 unless @new_resource.target.nil?
|
||||
@link.Arguments = @new_resource.arguments unless @new_resource.arguments.nil?
|
||||
@link.Description = @new_resource.description unless @new_resource.description.nil?
|
||||
@link.WorkingDirectory = @new_resource.cwd unless @new_resource.cwd.nil?
|
||||
@link.IconLocation = @new_resource.iconlocation unless @new_resource.iconlocation.nil?
|
||||
# ignoring: WindowStyle, Hotkey
|
||||
@link.Save
|
||||
Chef::Log.info("Added #{@new_resource} shortcut")
|
||||
new_resource.updated_by_last_action(true)
|
||||
end
|
||||
end
|
||||
@@ -1,236 +0,0 @@
|
||||
#
|
||||
# Author:: Paul Mooring (<paul@chef.io>)
|
||||
# Cookbook Name:: windows
|
||||
# Provider:: task
|
||||
#
|
||||
# Copyright:: 2012-2015, 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
|
||||
|
||||
use_inline_resources
|
||||
|
||||
action :create do
|
||||
if @current_resource.exists && (!(task_need_update? || @new_resource.force))
|
||||
Chef::Log.info "#{@new_resource} task already exists - nothing to do"
|
||||
else
|
||||
validate_user_and_password
|
||||
validate_interactive_setting
|
||||
validate_create_day
|
||||
|
||||
schedule = @new_resource.frequency == :on_logon ? 'ONLOGON' : @new_resource.frequency
|
||||
frequency_modifier_allowed = [:minute, :hourly, :daily, :weekly, :monthly]
|
||||
options = {}
|
||||
options['F'] = '' if @new_resource.force || task_need_update?
|
||||
options['SC'] = schedule
|
||||
options['MO'] = @new_resource.frequency_modifier if frequency_modifier_allowed.include?(@new_resource.frequency)
|
||||
options['SD'] = @new_resource.start_day unless @new_resource.start_day.nil?
|
||||
options['ST'] = @new_resource.start_time unless @new_resource.start_time.nil?
|
||||
options['TR'] = "\"#{@new_resource.command}\" "
|
||||
options['RU'] = @new_resource.user
|
||||
options['RP'] = @new_resource.password if use_password?
|
||||
options['RL'] = 'HIGHEST' if @new_resource.run_level == :highest
|
||||
options['IT'] = '' if @new_resource.interactive_enabled
|
||||
options['D'] = @new_resource.day if @new_resource.day
|
||||
|
||||
run_schtasks 'CREATE', options
|
||||
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
|
||||
run_schtasks 'RUN'
|
||||
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
|
||||
validate_user_and_password
|
||||
validate_interactive_setting
|
||||
|
||||
options = {}
|
||||
options['TR'] = "\"#{@new_resource.command}\" " if @new_resource.command
|
||||
options['RU'] = @new_resource.user if @new_resource.user
|
||||
options['RP'] = @new_resource.password if @new_resource.password
|
||||
options['SD'] = @new_resource.start_day unless @new_resource.start_day.nil?
|
||||
options['ST'] = @new_resource.start_time unless @new_resource.start_time.nil?
|
||||
options['IT'] = '' if @new_resource.interactive_enabled
|
||||
|
||||
run_schtasks 'CHANGE', options
|
||||
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
|
||||
# always need to force deletion
|
||||
run_schtasks 'DELETE', 'F' => ''
|
||||
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 :end do
|
||||
if @current_resource.exists
|
||||
if @current_resource.status != :running
|
||||
Chef::Log.debug "#{@new_resource} is not running - nothing to do"
|
||||
else
|
||||
run_schtasks 'END'
|
||||
@new_resource.updated_by_last_action true
|
||||
Chef::Log.info "#{@new_resource} task ended"
|
||||
end
|
||||
else
|
||||
Chef::Log.fatal "#{@new_resource} task doesn't exist - nothing to do"
|
||||
fail Errno::ENOENT, "#{@new_resource}: task does not exist, cannot end"
|
||||
end
|
||||
end
|
||||
|
||||
action :enable do
|
||||
if @current_resource.exists
|
||||
if @current_resource.enabled
|
||||
Chef::Log.debug "#{@new_resource} already enabled - nothing to do"
|
||||
else
|
||||
run_schtasks 'CHANGE', 'ENABLE' => ''
|
||||
@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"
|
||||
fail Errno::ENOENT, "#{@new_resource}: task does not exist, cannot enable"
|
||||
end
|
||||
end
|
||||
|
||||
action :disable do
|
||||
if @current_resource.exists
|
||||
if @current_resource.enabled
|
||||
run_schtasks 'CHANGE', 'DISABLE' => ''
|
||||
@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.task_name(@new_resource.task_name)
|
||||
|
||||
pathed_task_name = @new_resource.task_name[0, 1] == '\\' ? @new_resource.task_name : @new_resource.task_name.prepend('\\')
|
||||
task_hash = load_task_hash(@current_resource.task_name)
|
||||
if task_hash[:TaskName] == pathed_task_name
|
||||
@current_resource.exists = true
|
||||
@current_resource.status = :running if task_hash[:Status] == 'Running'
|
||||
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 run_schtasks(task_action, options = {})
|
||||
cmd = "schtasks /#{task_action} /TN \"#{@new_resource.task_name}\" "
|
||||
options.keys.each do |option|
|
||||
cmd += "/#{option} #{options[option]} "
|
||||
end
|
||||
Chef::Log.debug('running: ')
|
||||
Chef::Log.debug(" #{cmd}")
|
||||
shell_out!(cmd, returns: [0])
|
||||
end
|
||||
|
||||
def task_need_update?
|
||||
# gsub needed as schtasks converts single quotes to double quotes on creation
|
||||
@current_resource.command != @new_resource.command.tr("'", "\"") ||
|
||||
@current_resource.user != @new_resource.user
|
||||
end
|
||||
|
||||
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 = {}
|
||||
|
||||
output.split("\n").map! do |line|
|
||||
line.split(':', 2).map!(&:strip)
|
||||
end.each do |field|
|
||||
if field.is_a?(Array) && field[0].respond_to?(:to_sym)
|
||||
task[field[0].gsub(/\s+/, '').to_sym] = field[1]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
task
|
||||
end
|
||||
|
||||
SYSTEM_USERS = ['NT AUTHORITY\SYSTEM', 'SYSTEM', 'NT AUTHORITY\LOCALSERVICE', 'NT AUTHORITY\NETWORKSERVICE']
|
||||
|
||||
def validate_user_and_password
|
||||
if @new_resource.user && use_password?
|
||||
if @new_resource.password.nil?
|
||||
Chef::Log.fatal "#{@new_resource.task_name}: Can't specify a non-system user without a password!"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def validate_interactive_setting
|
||||
if @new_resource.interactive_enabled && @new_resource.password.nil?
|
||||
Chef::Log.fatal "#{new_resource} did not provide a password when attempting to set interactive/non-interactive."
|
||||
end
|
||||
end
|
||||
|
||||
def validate_create_day
|
||||
return unless @new_resource.day
|
||||
unless [:weekly, :monthly].include?(@new_resource.frequency)
|
||||
fail 'day attribute is only valid for tasks that run weekly or monthly'
|
||||
end
|
||||
if @new_resource.day.is_a? String
|
||||
days = @new_resource.day.split(',')
|
||||
days.each do |day|
|
||||
unless ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun', '*'].include?(day.strip.downcase)
|
||||
fail 'day attribute invalid. Only valid values are: MON, TUE, WED, THU, FRI, SAT, SUN and *. Multiple values must be separated by a comma.'
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def use_password?
|
||||
@use_password ||= !SYSTEM_USERS.include?(@new_resource.user.upcase)
|
||||
end
|
||||
@@ -1,90 +0,0 @@
|
||||
#
|
||||
# Author:: Doug MacEachern (<dougm@vmware.com>)
|
||||
# Author:: Seth Chisamore (<schisamo@chef.io>)
|
||||
# Cookbook Name:: windows
|
||||
# Provider:: zipfile
|
||||
#
|
||||
# Copyright:: 2010, VMware, Inc.
|
||||
# Copyright:: 2011-2015, 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.exist?(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.exist?(@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.
|
||||
::File.unlink(@new_resource.path) if ::File.exist?(@new_resource.path)
|
||||
# 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
|
||||
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
|
||||
Reference in New Issue
Block a user