80 lines
2.4 KiB
Ruby
80 lines
2.4 KiB
Ruby
class Chef
|
|
module Mixin
|
|
module PowershellOut
|
|
include Chef::Mixin::ShellOut
|
|
|
|
begin
|
|
include Chef::Mixin::WindowsArchitectureHelper
|
|
rescue
|
|
# nothing to do, as the include will happen when windows_architecture_helper.rb
|
|
# is loaded. This is for ease of removal of that library when either
|
|
# powershell_out is core chef or powershell cookbook depends upon version
|
|
# of chef that has Chef::Mixin::WindowsArchitectureHelper in core chef
|
|
end
|
|
|
|
def powershell_out(*command_args)
|
|
script = command_args.first
|
|
options = command_args.last.is_a?(Hash) ? command_args.last : nil
|
|
|
|
run_command(script, options)
|
|
end
|
|
|
|
def powershell_out!(*command_args)
|
|
cmd = powershell_out(*command_args)
|
|
cmd.error!
|
|
cmd
|
|
end
|
|
|
|
private
|
|
def run_command(script, options)
|
|
if options && options[:architecture]
|
|
architecture = options[:architecture]
|
|
options.delete(:architecture)
|
|
else
|
|
architecture = node_windows_architecture(node)
|
|
end
|
|
|
|
disable_redirection = wow64_architecture_override_required?(node, architecture)
|
|
|
|
if disable_redirection
|
|
original_redirection_state = disable_wow64_file_redirection(node)
|
|
end
|
|
|
|
command = build_command(script)
|
|
|
|
if options
|
|
cmd = shell_out(command, options)
|
|
else
|
|
cmd = shell_out(command)
|
|
end
|
|
|
|
if disable_redirection
|
|
restore_wow64_file_redirection(node, original_redirection_state)
|
|
end
|
|
|
|
cmd
|
|
end
|
|
|
|
def build_command(script)
|
|
flags = [
|
|
# Hides the copyright banner at startup.
|
|
"-NoLogo",
|
|
# Does not present an interactive prompt to the user.
|
|
"-NonInteractive",
|
|
# Does not load the Windows PowerShell profile.
|
|
"-NoProfile",
|
|
# always set the ExecutionPolicy flag
|
|
# see http://technet.microsoft.com/en-us/library/ee176961.aspx
|
|
"-ExecutionPolicy RemoteSigned",
|
|
# Powershell will hang if STDIN is redirected
|
|
# http://connect.microsoft.com/PowerShell/feedback/details/572313/powershell-exe-can-hang-if-stdin-is-redirected
|
|
"-InputFormat None"
|
|
]
|
|
|
|
command = "powershell.exe #{flags.join(' ')} -Command \"#{script}\""
|
|
command
|
|
end
|
|
end
|
|
end
|
|
end
|