mirror of
https://github.com/ansible-collections/community.general.git
synced 2025-04-24 11:21:25 -07:00
Add PowerShell exception handling and turn on strict mode.
* Add exception handling when running PowerShell modules to provide exception message and stack trace. * Enable strict mode for all PowerShell modules and internal commands. * Update common PowerShell code to fix strict mode errors. * Fix an issue with Set-Attr where it would not replace an existing property if already set. * Add tests for exception handling using modified win_ping modules.
This commit is contained in:
parent
a1948dd1c1
commit
5c65ee7f0c
9 changed files with 286 additions and 22 deletions
|
@ -112,12 +112,41 @@ class ShellModule(object):
|
|||
cmd_parts.insert(0, '&')
|
||||
elif shebang and shebang.startswith('#!'):
|
||||
cmd_parts.insert(0, shebang[2:])
|
||||
catch = '''
|
||||
$_obj = @{ failed = $true; $msg = $_ }
|
||||
echo $_obj | ConvertTo-Json -Compress -Depth 99
|
||||
Exit 1
|
||||
'''
|
||||
script = 'Try { %s }\nCatch { %s }' % (' '.join(cmd_parts), 'throw')
|
||||
script = '''
|
||||
Try
|
||||
{
|
||||
%s
|
||||
}
|
||||
Catch
|
||||
{
|
||||
$_obj = @{ failed = $true }
|
||||
If ($_.Exception.GetType)
|
||||
{
|
||||
$_obj.Add('msg', $_.Exception.Message)
|
||||
}
|
||||
Else
|
||||
{
|
||||
$_obj.Add('msg', $_.ToString())
|
||||
}
|
||||
If ($_.InvocationInfo.PositionMessage)
|
||||
{
|
||||
$_obj.Add('exception', $_.InvocationInfo.PositionMessage)
|
||||
}
|
||||
ElseIf ($_.ScriptStackTrace)
|
||||
{
|
||||
$_obj.Add('exception', $_.ScriptStackTrace)
|
||||
}
|
||||
Try
|
||||
{
|
||||
$_obj.Add('error_record', ($_ | ConvertTo-Json | ConvertFrom-Json))
|
||||
}
|
||||
Catch
|
||||
{
|
||||
}
|
||||
Echo $_obj | ConvertTo-Json -Compress -Depth 99
|
||||
Exit 1
|
||||
}
|
||||
''' % (' '.join(cmd_parts))
|
||||
if rm_tmp:
|
||||
rm_tmp = self._escape(self._unquote(rm_tmp))
|
||||
rm_cmd = 'Remove-Item "%s" -Force -Recurse -ErrorAction SilentlyContinue' % rm_tmp
|
||||
|
@ -149,9 +178,11 @@ class ShellModule(object):
|
|||
replace = lambda m: substs[m.lastindex - 1]
|
||||
return re.sub(pattern, replace, value)
|
||||
|
||||
def _encode_script(self, script, as_list=False):
|
||||
def _encode_script(self, script, as_list=False, strict_mode=True):
|
||||
'''Convert a PowerShell script to a single base64-encoded command.'''
|
||||
script = to_unicode(script)
|
||||
if strict_mode:
|
||||
script = u'Set-StrictMode -Version Latest\r\n%s' % script
|
||||
script = '\n'.join([x.strip() for x in script.splitlines() if x.strip()])
|
||||
encoded_script = base64.b64encode(script.encode('utf-16-le'))
|
||||
cmd_parts = _common_args + ['-EncodedCommand', encoded_script]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue