From a555a0652eaf489b98ae5ad28003b7c31c7aa63e Mon Sep 17 00:00:00 2001 From: Brian Coca Date: Thu, 6 Aug 2015 19:19:46 -0400 Subject: [PATCH] allow for vars_prompt and pause prompt to be skipped in non interactive settings ansible-pull users rejoice --- lib/ansible/executor/playbook_executor.py | 52 ++++++++++++----------- lib/ansible/plugins/action/pause.py | 18 +++++--- 2 files changed, 40 insertions(+), 30 deletions(-) diff --git a/lib/ansible/executor/playbook_executor.py b/lib/ansible/executor/playbook_executor.py index 686da5c321..96833d5c17 100644 --- a/lib/ansible/executor/playbook_executor.py +++ b/lib/ansible/executor/playbook_executor.py @@ -238,34 +238,38 @@ class PlaybookExecutor: def _do_var_prompt(self, varname, private=True, prompt=None, encrypt=None, confirm=False, salt_size=None, salt=None, default=None): - if prompt and default is not None: - msg = "%s [%s]: " % (prompt, default) - elif prompt: - msg = "%s: " % prompt - else: - msg = 'input for %s: ' % varname - - def do_prompt(prompt, private): - if sys.stdout.encoding: - msg = prompt.encode(sys.stdout.encoding) + if sys.__stdin__.isatty(): + if prompt and default is not None: + msg = "%s [%s]: " % (prompt, default) + elif prompt: + msg = "%s: " % prompt else: - # when piping the output, or at other times when stdout - # may not be the standard file descriptor, the stdout - # encoding may not be set, so default to something sane - msg = prompt.encode(locale.getpreferredencoding()) - if private: - return getpass.getpass(msg) - return raw_input(msg) + msg = 'input for %s: ' % varname - if confirm: - while True: + def do_prompt(prompt, private): + if sys.stdout.encoding: + msg = prompt.encode(sys.stdout.encoding) + else: + # when piping the output, or at other times when stdout + # may not be the standard file descriptor, the stdout + # encoding may not be set, so default to something sane + msg = prompt.encode(locale.getpreferredencoding()) + if private: + return getpass.getpass(msg) + return raw_input(msg) + + if confirm: + while True: + result = do_prompt(msg, private) + second = do_prompt("confirm " + msg, private) + if result == second: + break + self._display.display("***** VALUES ENTERED DO NOT MATCH ****") + else: result = do_prompt(msg, private) - second = do_prompt("confirm " + msg, private) - if result == second: - break - self._display.display("***** VALUES ENTERED DO NOT MATCH ****") else: - result = do_prompt(msg, private) + result = None + self._display.warning("Not prompting as we are not in interactive mode") # if result is false and default is not None if not result and default is not None: diff --git a/lib/ansible/plugins/action/pause.py b/lib/ansible/plugins/action/pause.py index d012b026c2..d4ebf802b6 100644 --- a/lib/ansible/plugins/action/pause.py +++ b/lib/ansible/plugins/action/pause.py @@ -24,6 +24,7 @@ import termios import time import tty +from os import isatty from ansible.errors import * from ansible.plugins.action import ActionBase @@ -106,12 +107,13 @@ class ActionModule(ActionBase): # save the attributes on the existing (duped) stdin so # that we can restore them later after we set raw mode fd = self._connection._new_stdin.fileno() - old_settings = termios.tcgetattr(fd) - tty.setraw(fd) + if isatty(fd): + old_settings = termios.tcgetattr(fd) + tty.setraw(fd) - # flush the buffer to make sure no previous key presses - # are read in below - termios.tcflush(self._connection._new_stdin, termios.TCIFLUSH) + # flush the buffer to make sure no previous key presses + # are read in below + termios.tcflush(self._connection._new_stdin, termios.TCIFLUSH) while True: try: @@ -120,6 +122,9 @@ class ActionModule(ActionBase): raise KeyboardInterrupt if not seconds: + if not isatty(fd): + self._display.warning("Not waiting from prompt as stdin is not interactive") + break # read key presses and act accordingly if key_pressed == '\r': break @@ -143,7 +148,8 @@ class ActionModule(ActionBase): finally: # cleanup and save some information # restore the old settings for the duped stdin fd - termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) + if isatty(fd): + termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) duration = time.time() - start result['stop'] = str(datetime.datetime.now())