Initial attempt to confirm commands
This commit is contained in:
parent
dcc3a1947a
commit
9c2102ae9d
1 changed files with 49 additions and 5 deletions
|
@ -17,6 +17,42 @@ class CommandRunner(Executor):
|
||||||
directive)
|
directive)
|
||||||
return self._process_commands(data)
|
return self._process_commands(data)
|
||||||
|
|
||||||
|
# Modified, but source:
|
||||||
|
# http://stackoverflow.com/questions/3041986/python-command-line-yes-no-input
|
||||||
|
def _query_yes_no(question, default="yes"):
|
||||||
|
"""Ask a yes/no question via raw_input() and return their answer.
|
||||||
|
|
||||||
|
"question" is a string that is presented to the user.
|
||||||
|
"default" is the presumed answer if the user just hits <Enter>.
|
||||||
|
It must be "yes" (the default), "no" or None (meaning
|
||||||
|
an answer is required of the user).
|
||||||
|
|
||||||
|
The "answer" return value is True for "yes" or False for "no".
|
||||||
|
"""
|
||||||
|
valid = {"yes": True, "y": True, "ye": True,
|
||||||
|
"Yes": True, "No", False,
|
||||||
|
"no": False, "n": False}
|
||||||
|
if default is None:
|
||||||
|
prompt = " [y/n] "
|
||||||
|
elif default in valid:
|
||||||
|
if valid[default] == True:
|
||||||
|
prompt = " [Y/n] "
|
||||||
|
elif valid[default] == False:
|
||||||
|
prompt = " [y/N] "
|
||||||
|
else:
|
||||||
|
raise ValueError("invalid default answer: '%s'" % default)
|
||||||
|
|
||||||
|
while True:
|
||||||
|
sys.stdout.write(question + prompt)
|
||||||
|
choice = raw_input().lower()
|
||||||
|
if default is not None and choice == '':
|
||||||
|
return valid[default]
|
||||||
|
elif choice in valid:
|
||||||
|
return valid[choice]
|
||||||
|
else:
|
||||||
|
sys.stdout.write("Please respond with 'yes' or 'no'.\n")
|
||||||
|
|
||||||
|
|
||||||
def _process_commands(self, data):
|
def _process_commands(self, data):
|
||||||
success = True
|
success = True
|
||||||
with open(os.devnull, 'w') as devnull:
|
with open(os.devnull, 'w') as devnull:
|
||||||
|
@ -31,6 +67,8 @@ class CommandRunner(Executor):
|
||||||
stdout = None
|
stdout = None
|
||||||
if item.get('stderr', False) is True:
|
if item.get('stderr', False) is True:
|
||||||
stderr = None
|
stderr = None
|
||||||
|
if item.get('confirm', False) is True:
|
||||||
|
confirm = True
|
||||||
elif isinstance(item, list):
|
elif isinstance(item, list):
|
||||||
cmd = item[0]
|
cmd = item[0]
|
||||||
msg = item[1] if len(item) > 1 else None
|
msg = item[1] if len(item) > 1 else None
|
||||||
|
@ -41,11 +79,17 @@ class CommandRunner(Executor):
|
||||||
self._log.lowinfo(cmd)
|
self._log.lowinfo(cmd)
|
||||||
else:
|
else:
|
||||||
self._log.lowinfo('%s [%s]' % (msg, cmd))
|
self._log.lowinfo('%s [%s]' % (msg, cmd))
|
||||||
ret = subprocess.call(cmd, shell=True, stdin=stdin, stdout=stdout,
|
if confirm:
|
||||||
stderr=stderr, cwd=self._base_directory)
|
run = self._query_yes_no('Do you want to run this command:'
|
||||||
if ret != 0:
|
' %s' % cmd)
|
||||||
success = False
|
else:
|
||||||
self._log.warning('Command [%s] failed' % cmd)
|
run = True;
|
||||||
|
if run:
|
||||||
|
ret = subprocess.call(cmd, shell=True, stdin=stdin,
|
||||||
|
stdout=stdout, stderr=stderr, cwd=self._base_directory)
|
||||||
|
if ret != 0:
|
||||||
|
success = False
|
||||||
|
self._log.warning('Command [%s] failed' % cmd)
|
||||||
if success:
|
if success:
|
||||||
self._log.info('All commands have been executed')
|
self._log.info('All commands have been executed')
|
||||||
else:
|
else:
|
||||||
|
|
Loading…
Reference in a new issue