Add ability to detect prompts in stdout from run_command

pull/9548/head
James Cammarata 10 years ago
parent 395952329a
commit 5bc81f9ae7

@ -1370,7 +1370,7 @@ class AnsibleModule(object):
# rename might not preserve context # rename might not preserve context
self.set_context_if_different(dest, context, False) self.set_context_if_different(dest, context, False)
def run_command(self, args, check_rc=False, close_fds=True, executable=None, data=None, binary_data=False, path_prefix=None, cwd=None, use_unsafe_shell=False): def run_command(self, args, check_rc=False, close_fds=True, executable=None, data=None, binary_data=False, path_prefix=None, cwd=None, use_unsafe_shell=False, prompt_regex=None):
''' '''
Execute a command, returns rc, stdout, and stderr. Execute a command, returns rc, stdout, and stderr.
args is the command to run args is the command to run
@ -1378,12 +1378,17 @@ class AnsibleModule(object):
If args is a string and use_unsafe_shell=False it will split args to a list and run with shell=False If args is a string and use_unsafe_shell=False it will split args to a list and run with shell=False
If args is a string and use_unsafe_shell=True it run with shell=True. If args is a string and use_unsafe_shell=True it run with shell=True.
Other arguments: Other arguments:
- check_rc (boolean) Whether to call fail_json in case of - check_rc (boolean) Whether to call fail_json in case of
non zero RC. Default is False. non zero RC. Default is False.
- close_fds (boolean) See documentation for subprocess.Popen(). - close_fds (boolean) See documentation for subprocess.Popen().
Default is True. Default is True.
- executable (string) See documentation for subprocess.Popen(). - executable (string) See documentation for subprocess.Popen().
Default is None. Default is None.
- prompt_regex (string) A regex string (not a compiled regex) which
can be used to detect prompts in the stdout
which would otherwise cause the execution
to hang (especially if no input data is
specified)
''' '''
shell = False shell = False
@ -1399,6 +1404,13 @@ class AnsibleModule(object):
msg = "Argument 'args' to run_command must be list or string" msg = "Argument 'args' to run_command must be list or string"
self.fail_json(rc=257, cmd=args, msg=msg) self.fail_json(rc=257, cmd=args, msg=msg)
prompt_re = None
if prompt_regex:
try:
prompt_re = re.compile(prompt_regex, re.MULTILINE)
except re.error:
self.fail_json(msg="invalid prompt regular expression given to run_command")
# expand things like $HOME and ~ # expand things like $HOME and ~
if not shell: if not shell:
args = [ os.path.expandvars(os.path.expanduser(x)) for x in args ] args = [ os.path.expandvars(os.path.expanduser(x)) for x in args ]
@ -1492,6 +1504,10 @@ class AnsibleModule(object):
stderr += dat stderr += dat
if dat == '': if dat == '':
rpipes.remove(cmd.stderr) rpipes.remove(cmd.stderr)
# if we're checking for prompts, do it now
if prompt_re:
if prompt_re.search(stdout) and not data:
return (257, stdout, "A prompt was encountered while running a command, but no input data was specified")
# only break out if no pipes are left to read or # only break out if no pipes are left to read or
# the pipes are completely read and # the pipes are completely read and
# the process is terminated # the process is terminated

Loading…
Cancel
Save