/lib/ansible/utils/cmd_functions.py
https://github.com/ajanthanm/ansible · Python · 59 lines · 32 code · 7 blank · 20 comment · 12 complexity · b5eedd77a0d662d0db64e4041a0cd57d MD5 · raw file
- # (c) 2012, Michael DeHaan <michael.dehaan@gmail.com>
- #
- # This file is part of Ansible
- #
- # Ansible is free software: you can redistribute it and/or modify
- # it under the terms of the GNU General Public License as published by
- # the Free Software Foundation, either version 3 of the License, or
- # (at your option) any later version.
- #
- # Ansible is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- # GNU General Public License for more details.
- #
- # You should have received a copy of the GNU General Public License
- # along with Ansible. If not, see <http://www.gnu.org/licenses/>.
- import os
- import sys
- import shlex
- import subprocess
- import select
- def run_cmd(cmd, live=False, readsize=10):
- #readsize = 10
- cmdargs = shlex.split(cmd)
- p = subprocess.Popen(cmdargs, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
-
- stdout = ''
- stderr = ''
- rpipes = [p.stdout, p.stderr]
- while True:
- rfd, wfd, efd = select.select(rpipes, [], rpipes, 1)
- if p.stdout in rfd:
- dat = os.read(p.stdout.fileno(), readsize)
- if live:
- sys.stdout.write(dat)
- stdout += dat
- if dat == '':
- rpipes.remove(p.stdout)
- if p.stderr in rfd:
- dat = os.read(p.stderr.fileno(), readsize)
- stderr += dat
- if live:
- sys.stdout.write(dat)
- if dat == '':
- rpipes.remove(p.stderr)
- # only break out if we've emptied the pipes, or there is nothing to
- # read from and the process has finished.
- if (not rpipes or not rfd) and p.poll() is not None:
- break
- # Calling wait while there are still pipes to read can cause a lock
- elif not rpipes and p.poll() == None:
- p.wait()
- return p.returncode, stdout, stderr