Update logging based on verbosity, add vvvvv support to show details of put/fetch file.

This commit is contained in:
Chris Church 2014-06-18 10:43:15 -05:00 committed by Matt Martz
parent 9ca83446a2
commit 8f762a7d15

View file

@ -27,7 +27,7 @@ import traceback
import urlparse import urlparse
from ansible import errors from ansible import errors
from ansible import utils from ansible import utils
from ansible.callbacks import vvv, vvvv from ansible.callbacks import vvv, vvvv, verbose
from ansible.runner.shell_plugins import powershell from ansible.runner.shell_plugins import powershell
try: try:
@ -41,6 +41,9 @@ _winrm_cache = {
# 'user:pwhash@host:port': <protocol instance> # 'user:pwhash@host:port': <protocol instance>
} }
def vvvvv(msg, host=None):
verbose(msg, host=None, caplevel=4)
class Connection(object): class Connection(object):
'''WinRM connections over HTTP/HTTPS.''' '''WinRM connections over HTTP/HTTPS.'''
@ -98,8 +101,11 @@ class Connection(object):
if exc: if exc:
raise exc raise exc
def _winrm_exec(self, command, args): def _winrm_exec(self, command, args, from_exec=False):
if from_exec:
vvvv("WINRM EXEC %r %r" % (command, args), host=self.host) vvvv("WINRM EXEC %r %r" % (command, args), host=self.host)
else:
vvvvv("WINRM EXEC %r %r" % (command, args), host=self.host)
if not self.protocol: if not self.protocol:
self.protocol = self._winrm_connect() self.protocol = self._winrm_connect()
if not self.shell_id: if not self.shell_id:
@ -108,8 +114,12 @@ class Connection(object):
try: try:
command_id = self.protocol.run_command(self.shell_id, command, args) command_id = self.protocol.run_command(self.shell_id, command, args)
response = Response(self.protocol.get_command_output(self.shell_id, command_id)) response = Response(self.protocol.get_command_output(self.shell_id, command_id))
if from_exec:
vvvv('WINRM RESULT %r' % response, host=self.host) vvvv('WINRM RESULT %r' % response, host=self.host)
vvvv('WINRM STDERR %s' % response.std_err, host=self.host) else:
vvvvv('WINRM RESULT %r' % response, host=self.host)
vvvvv('WINRM STDOUT %s' % response.std_out, host=self.host)
vvvvv('WINRM STDERR %s' % response.std_err, host=self.host)
return response return response
finally: finally:
if command_id: if command_id:
@ -122,15 +132,19 @@ class Connection(object):
def exec_command(self, cmd, tmp_path, sudo_user=None, sudoable=False, executable=None, in_data=None, su=None, su_user=None): def exec_command(self, cmd, tmp_path, sudo_user=None, sudoable=False, executable=None, in_data=None, su=None, su_user=None):
cmd = cmd.encode('utf-8') cmd = cmd.encode('utf-8')
vvv("EXEC %s" % cmd, host=self.host)
cmd_parts = shlex.split(cmd, posix=False) cmd_parts = shlex.split(cmd, posix=False)
vvvv("WINRM PARTS %r" % cmd_parts, host=self.host) if '-EncodedCommand' in cmd_parts:
encoded_cmd = cmd_parts[cmd_parts.index('-EncodedCommand') + 1]
decoded_cmd = base64.b64decode(encoded_cmd)
vvv("EXEC %s" % decoded_cmd, host=self.host)
else:
vvv("EXEC %s" % cmd, host=self.host)
# For script/raw support. # For script/raw support.
if cmd_parts and cmd_parts[0].lower().endswith('.ps1'): if cmd_parts and cmd_parts[0].lower().endswith('.ps1'):
script = powershell._build_file_cmd(cmd_parts) script = powershell._build_file_cmd(cmd_parts)
cmd_parts = powershell._encode_script(script, as_list=True) cmd_parts = powershell._encode_script(script, as_list=True)
try: try:
result = self._winrm_exec(cmd_parts[0], cmd_parts[1:]) result = self._winrm_exec(cmd_parts[0], cmd_parts[1:], from_exec=True)
except Exception, e: except Exception, e:
traceback.print_exc() traceback.print_exc()
raise errors.AnsibleError("failed to exec cmd %s" % cmd) raise errors.AnsibleError("failed to exec cmd %s" % cmd)
@ -160,6 +174,7 @@ class Connection(object):
$stream.SetLength(%d) | Out-Null; $stream.SetLength(%d) | Out-Null;
$stream.Close() | Out-Null; $stream.Close() | Out-Null;
''' % (buffer_size, powershell._escape(out_path), offset, b64_data, in_size) ''' % (buffer_size, powershell._escape(out_path), offset, b64_data, in_size)
vvvv("WINRM PUT %s to %s (offset=%d size=%d)" % (in_path, out_path, offset, len(out_data)), host=self.host)
cmd_parts = powershell._encode_script(script, as_list=True) cmd_parts = powershell._encode_script(script, as_list=True)
result = self._winrm_exec(cmd_parts[0], cmd_parts[1:]) result = self._winrm_exec(cmd_parts[0], cmd_parts[1:])
if result.status_code != 0: if result.status_code != 0:
@ -188,6 +203,7 @@ class Connection(object):
[System.Convert]::ToBase64String($bytes); [System.Convert]::ToBase64String($bytes);
$stream.Close() | Out-Null; $stream.Close() | Out-Null;
''' % (buffer_size, powershell._escape(in_path), offset) ''' % (buffer_size, powershell._escape(in_path), offset)
vvvv("WINRM FETCH %s to %s (offset=%d)" % (in_path, out_path, offset), host=self.host)
cmd_parts = powershell._encode_script(script, as_list=True) cmd_parts = powershell._encode_script(script, as_list=True)
result = self._winrm_exec(cmd_parts[0], cmd_parts[1:]) result = self._winrm_exec(cmd_parts[0], cmd_parts[1:])
data = base64.b64decode(result.std_out.strip()) data = base64.b64decode(result.std_out.strip())