allow for vars_prompt and pause prompt to be skipped in non interactive settings
ansible-pull users rejoice
This commit is contained in:
parent
ce52fdebe8
commit
a555a0652e
2 changed files with 40 additions and 30 deletions
|
@ -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
|
|
||||||
|
|
||||||
def do_prompt(prompt, private):
|
|
||||||
if sys.stdout.encoding:
|
|
||||||
msg = prompt.encode(sys.stdout.encoding)
|
|
||||||
else:
|
else:
|
||||||
# when piping the output, or at other times when stdout
|
msg = 'input for %s: ' % varname
|
||||||
# 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:
|
def do_prompt(prompt, private):
|
||||||
while True:
|
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)
|
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…
Reference in a new issue