allow for vars_prompt and pause prompt to be skipped in non interactive settings

ansible-pull users rejoice
pull/11898/head
Brian Coca 9 years ago
parent ce52fdebe8
commit a555a0652e

@ -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): 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: if sys.__stdin__.isatty():
msg = "%s [%s]: " % (prompt, default) if prompt and default is not None:
elif prompt: msg = "%s [%s]: " % (prompt, default)
msg = "%s: " % prompt elif prompt:
else: msg = "%s: " % prompt
msg = 'input for %s: ' % varname else:
msg = 'input for %s: ' % varname
def do_prompt(prompt, private):
if sys.stdout.encoding: def do_prompt(prompt, private):
msg = prompt.encode(sys.stdout.encoding) 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: 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) result = do_prompt(msg, private)
second = do_prompt("confirm " + msg, private)
if result == second:
break
self._display.display("***** VALUES ENTERED DO NOT MATCH ****")
else: 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 result is false and default is not None
if not result and default is not None: if not result and default is not None:

@ -24,6 +24,7 @@ import termios
import time import time
import tty import tty
from os import isatty
from ansible.errors import * from ansible.errors import *
from ansible.plugins.action import ActionBase from ansible.plugins.action import ActionBase
@ -106,12 +107,13 @@ class ActionModule(ActionBase):
# save the attributes on the existing (duped) stdin so # save the attributes on the existing (duped) stdin so
# that we can restore them later after we set raw mode # that we can restore them later after we set raw mode
fd = self._connection._new_stdin.fileno() fd = self._connection._new_stdin.fileno()
old_settings = termios.tcgetattr(fd) if isatty(fd):
tty.setraw(fd) old_settings = termios.tcgetattr(fd)
tty.setraw(fd)
# flush the buffer to make sure no previous key presses # flush the buffer to make sure no previous key presses
# are read in below # are read in below
termios.tcflush(self._connection._new_stdin, termios.TCIFLUSH) termios.tcflush(self._connection._new_stdin, termios.TCIFLUSH)
while True: while True:
try: try:
@ -120,6 +122,9 @@ class ActionModule(ActionBase):
raise KeyboardInterrupt raise KeyboardInterrupt
if not seconds: 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 # read key presses and act accordingly
if key_pressed == '\r': if key_pressed == '\r':
break break
@ -143,7 +148,8 @@ class ActionModule(ActionBase):
finally: finally:
# cleanup and save some information # cleanup and save some information
# restore the old settings for the duped stdin fd # 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 duration = time.time() - start
result['stop'] = str(datetime.datetime.now()) result['stop'] = str(datetime.datetime.now())

Loading…
Cancel
Save