From f4d68b8860678d710fc9e3ff04aa1b3736e28ab2 Mon Sep 17 00:00:00 2001 From: Toshio Kuratomi Date: Mon, 25 Jan 2016 19:17:46 -0800 Subject: [PATCH] Transform tracebacks into unicode before printing Fixes #14042 --- bin/ansible | 3 ++- lib/ansible/executor/process/worker.py | 7 ++++--- lib/ansible/executor/task_queue_manager.py | 3 ++- lib/ansible/plugins/connection/winrm.py | 12 ++++++------ 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/bin/ansible b/bin/ansible index 627510a72e8..a02c5bc1745 100755 --- a/bin/ansible +++ b/bin/ansible @@ -40,6 +40,7 @@ from ansible.errors import AnsibleError, AnsibleOptionsError, AnsibleParserError from ansible.utils.display import Display from ansible.utils.unicode import to_unicode + ######################################## ### OUTPUT OF LAST RESORT ### class LastResort(object): @@ -108,7 +109,7 @@ if __name__ == '__main__': have_cli_options = cli is not None and cli.options is not None display.error("Unexpected Exception: %s" % to_unicode(e), wrap_text=False) if not have_cli_options or have_cli_options and cli.options.verbosity > 2: - display.display("the full traceback was:\n\n%s" % traceback.format_exc()) + display.display(u"the full traceback was:\n\n%s" % to_unicode(traceback.format_exc())) else: display.display("to see the full traceback, use -vvv") sys.exit(250) diff --git a/lib/ansible/executor/process/worker.py b/lib/ansible/executor/process/worker.py index 73f5faa78b6..120bd8b1414 100644 --- a/lib/ansible/executor/process/worker.py +++ b/lib/ansible/executor/process/worker.py @@ -48,6 +48,7 @@ from ansible.playbook.task import Task from ansible.vars.unsafe_proxy import AnsibleJSONUnsafeDecoder from ansible.utils.debug import debug +from ansible.utils.unicode import to_unicode __all__ = ['WorkerProcess'] @@ -135,11 +136,11 @@ class WorkerProcess(multiprocessing.Process): try: self._host.vars = dict() self._host.groups = [] - task_result = TaskResult(self._host, self._task, dict(failed=True, exception=traceback.format_exc(), stdout='')) + task_result = TaskResult(self._host, self._task, dict(failed=True, exception=to_unicode(traceback.format_exc()), stdout='')) self._rslt_q.put(task_result, block=False) except: - debug("WORKER EXCEPTION: %s" % e) - debug("WORKER EXCEPTION: %s" % traceback.format_exc()) + debug(u"WORKER EXCEPTION: %s" % to_unicode(e)) + debug(u"WORKER EXCEPTION: %s" % to_unicode(traceback.format_exc())) debug("WORKER PROCESS EXITING") diff --git a/lib/ansible/executor/task_queue_manager.py b/lib/ansible/executor/task_queue_manager.py index b5260c1f41a..64b952126fe 100644 --- a/lib/ansible/executor/task_queue_manager.py +++ b/lib/ansible/executor/task_queue_manager.py @@ -35,6 +35,7 @@ from ansible.plugins import callback_loader, strategy_loader, module_loader from ansible.template import Templar from ansible.vars.hostvars import HostVars from ansible.plugins.callback import CallbackBase +from ansible.utils.unicode import to_unicode try: from __main__ import display @@ -306,7 +307,7 @@ class TaskQueueManager: method(*args, **kwargs) except Exception as e: import traceback - orig_tb = traceback.format_exc() + orig_tb = to_unicode(traceback.format_exc()) try: v1_method = method.replace('v2_','') v1_method(*args, **kwargs) diff --git a/lib/ansible/plugins/connection/winrm.py b/lib/ansible/plugins/connection/winrm.py index dec48787408..ef2f630f97a 100644 --- a/lib/ansible/plugins/connection/winrm.py +++ b/lib/ansible/plugins/connection/winrm.py @@ -137,20 +137,20 @@ class Connection(ConnectionBase): protocol.send_message('') return protocol except Exception as e: - err_msg = (str(e) or repr(e)).strip() - if re.search(r'Operation\s+?timed\s+?out', err_msg, re.I): + err_msg = to_unicode(e).strip() + if re.search(ur'Operation\s+?timed\s+?out', err_msg, re.I): raise AnsibleError('the connection attempt timed out') - m = re.search(r'Code\s+?(\d{3})', err_msg) + m = re.search(ur'Code\s+?(\d{3})', err_msg) if m: code = int(m.groups()[0]) if code == 401: err_msg = 'the username/password specified for this server was incorrect' elif code == 411: return protocol - errors.append('%s: %s' % (transport, err_msg)) - display.vvvvv('WINRM CONNECTION ERROR: %s\n%s' % (err_msg, traceback.format_exc()), host=self._winrm_host) + errors.append(u'%s: %s' % (transport, err_msg)) + display.vvvvv(u'WINRM CONNECTION ERROR: %s\n%s' % (err_msg, to_unicode(traceback.format_exc())), host=self._winrm_host) if errors: - raise AnsibleError(', '.join(errors)) + raise AnsibleError(', '.join(to_str(errors))) else: raise AnsibleError('No transport found for WinRM connection')