From 5f6427b1fc7449a5c42212013d3f628665701c3d Mon Sep 17 00:00:00 2001 From: Nathaniel Case Date: Mon, 30 Mar 2020 11:26:33 -0400 Subject: [PATCH] Fix missing persistent connection messages (#68496) * Be more proactive about returning module messages * Move message display to a function, and replace handling already in shutdown() --- .../scripts/ansible_connection_cli_stub.py | 24 ++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/lib/ansible/cli/scripts/ansible_connection_cli_stub.py b/lib/ansible/cli/scripts/ansible_connection_cli_stub.py index b5347fd9f3f..204b67f2ebc 100755 --- a/lib/ansible/cli/scripts/ansible_connection_cli_stub.py +++ b/lib/ansible/cli/scripts/ansible_connection_cli_stub.py @@ -148,6 +148,8 @@ class ConnectionProcess(object): resp = self.srv.handle_request(data) signal.alarm(0) + display_messages(self.connection) + if log_messages: display.display("jsonrpc response: %s" % resp, log_only=True) @@ -197,9 +199,7 @@ class ConnectionProcess(object): self.sock.close() if self.connection: self.connection.close() - if self.connection.get_option("persistent_log_messages"): - for _level, message in self.connection.pop_messages(): - display.display(message, log_only=True) + display_messages(self.connection) except Exception: pass finally: @@ -337,6 +337,24 @@ def main(): sys.exit(rc) +def display_messages(connection): + # This should be handled elsewhere, but if this is the last task, nothing will + # come back to collect the messages. So now each task will dump its own messages + # to stdout before logging the response message. This may make some other + # pop_messages calls redundant. + for level, message in connection.pop_messages(): + if connection.get_option('persistent_log_messages') and level == "log": + display.display(message, log_only=True) + else: + # These should be keyed by valid method names, but + # fail gracefully just in case. + display_method = getattr(display, level, None) + if display_method: + display_method(message) + else: + display.display((level, message)) + + if __name__ == '__main__': display = Display() main()