From d59bba4652b8379bd49e0b56363b1148ddad022e Mon Sep 17 00:00:00 2001 From: bdowling Date: Fri, 15 Dec 2017 11:31:28 -0500 Subject: [PATCH] Fixes prompt doubling issue that impacted missing ios enable password prompts. (#33794) * Fixes a prompt doubling issue that impacted missing ios enable password prompts. Due to get_prompt sending a '\n' the prompts became doubled and out-of-sync with what was expected. This caused the enable command prompts to be missed. Also added verification that on_become succeeded to reach enable prompt. * Moved prompt doubling comment per shippable --- lib/ansible/plugins/terminal/__init__.py | 5 ++++- lib/ansible/plugins/terminal/ios.py | 6 +++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/lib/ansible/plugins/terminal/__init__.py b/lib/ansible/plugins/terminal/__init__.py index 592ef5e4398..a876c7fb060 100644 --- a/lib/ansible/plugins/terminal/__init__.py +++ b/lib/ansible/plugins/terminal/__init__.py @@ -69,7 +69,10 @@ class TerminalBase(with_metaclass(ABCMeta, object)): :returns: A byte string of the prompt """ - self._exec_cli_command(b'\n') + # do not send '\n' here, exec_cli_command sends '\r' already, + # doing so causes double prompts. + self._exec_cli_command(b'') + return self._connection._matched_prompt def on_open_shell(self): diff --git a/lib/ansible/plugins/terminal/ios.py b/lib/ansible/plugins/terminal/ios.py index 17023f09866..42ecfe64ee3 100644 --- a/lib/ansible/plugins/terminal/ios.py +++ b/lib/ansible/plugins/terminal/ios.py @@ -65,8 +65,12 @@ class TerminalModule(TerminalBase): try: self._exec_cli_command(to_bytes(json.dumps(cmd), errors='surrogate_or_strict')) + prompt = self._get_prompt() + if not prompt.endswith(b'#'): + raise AnsibleConnectionFailure('failed to elevate privilege to enable mode still at prompt [%s]' % prompt) except AnsibleConnectionFailure: - raise AnsibleConnectionFailure('unable to elevate privilege to enable mode') + prompt = self._get_prompt() + raise AnsibleConnectionFailure('unable to elevate privilege to enable mode, at prompt [%s]' % prompt) def on_unbecome(self): prompt = self._get_prompt()