def start(args, stdin=None, stdout=None, stderr=None, cwd=None, env=None, sudo=False, setsid=False, nice=None, ioclass=None, ioclassdata=None, reset_cpu_affinity=True): """ Starts a command and return it. The caller is responsible for communicating with the commmand, waiting for it, and if needed, terminating it. args are always logged when command starts. If args contain sensitive information that should not be logged, such as passwords, they must be wrapped with ProtectedPassword. Arguments: args (list): Command arguments stdin (file or int): file object or descriptor for sending data to the child process stdin. stdout (file or int): file object or descriptor for receiving data from the child process stdout. stderr (file or int): file object or descriptor for receiving data from the child process stderr. cwd (str): working directory for the child process env (dict): environment of the new child process sudo (bool): if set to True, run the command via sudo nice (int): if not None, run the command via nice command with the specified nice value ioclass (int): if not None, run the command with the ionice command using specified ioclass value. ioclassdata (int): if ioclass is set, the scheduling class data. 0-7 are valid data (priority levels). reset_cpu_affinity (bool): Run the command via the taskset command, allowing the child process to run on all cpus (default True). Returns: subprocess.Popen instance or commands.PrivilegedPopen if sudo is True. Raises: OSError if the command could not start. """ args = cmdutils.wrap_command( args, with_ioclass=ioclass, ioclassdata=ioclassdata, with_nice=nice, with_setsid=setsid, with_sudo=sudo, reset_cpu_affinity=reset_cpu_affinity, ) log.debug(cmdutils.command_log_line(args, cwd=cwd)) args = [password.unprotect(a) for a in args] cmd_class = PrivilegedPopen if sudo else subprocess.Popen return cmd_class( args, cwd=cwd, stdin=stdin, stdout=stdout, stderr=stderr, env=env)
def _simple_exec_cmd(command, env=None, nice=None, ioclass=None, stdin=None, stdout=None, stderr=None): command = wrap_command(command, with_ioclass=ioclass, ioclassdata=None, with_nice=nice, with_setsid=False, with_sudo=False, reset_cpu_affinity=True) logging.debug(cmdutils.command_log_line(command, cwd=None)) p = subprocess.Popen(command, close_fds=True, cwd=None, env=env, stdin=stdin, stdout=stdout, stderr=stderr) return p
def start(args, stdin=None, stdout=None, stderr=None, cwd=None, env=None, sudo=False, setsid=False, nice=None, ioclass=None, ioclassdata=None, reset_cpu_affinity=True): """ Starts a command and return it. The caller is responsible for communicating with the commmand, waiting for it, and if needed, terminating it. args are always logged when command starts. If args contain sensitive information that should not be logged, such as passwords, they must be wrapped with ProtectedPassword. Arguments: args (list): Command arguments stdin (file or int): file object or descriptor for sending data to the child process stdin. stdout (file or int): file object or descriptor for receiving data from the child process stdout. stderr (file or int): file object or descriptor for receiving data from the child process stderr. cwd (str): working directory for the child process env (dict): environment of the new child process sudo (bool): if set to True, run the command via sudo nice (int): if not None, run the command via nice command with the specified nice value ioclass (int): if not None, run the command with the ionice command using specified ioclass value. ioclassdata (int): if ioclass is set, the scheduling class data. 0-7 are valid data (priority levels). reset_cpu_affinity (bool): Run the command via the taskset command, allowing the child process to run on all cpus (default True). Returns: subprocess.Popen instance or commands.PrivilegedPopen if sudo is True. Raises: OSError if the command could not start. """ args = cmdutils.wrap_command( args, with_ioclass=ioclass, ioclassdata=ioclassdata, with_nice=nice, with_setsid=setsid, with_sudo=sudo, reset_cpu_affinity=reset_cpu_affinity, ) log.debug(cmdutils.command_log_line(args, cwd=cwd)) args = [password.unprotect(a) for a in args] cmd_class = PrivilegedPopen if sudo else subprocess.Popen return cmd_class( args, cwd=cwd, stdin=stdin, stdout=stdout, stderr=stdout, env=env)
def execCmd(command, sudo=False, cwd=None, data=None, raw=False, printable=None, env=None, nice=None, ioclass=None, ioclassdata=None, setsid=False, execCmdLogger=logging.root, resetCpuAffinity=True): """ Executes an external command, optionally via sudo. """ command = cmdutils.wrap_command(command, with_ioclass=ioclass, ioclassdata=ioclassdata, with_nice=nice, with_setsid=setsid, with_sudo=sudo, reset_cpu_affinity=resetCpuAffinity) # Unsubscriptable objects (e.g. generators) need conversion if not callable(getattr(command, '__getitem__', None)): command = tuple(command) if not printable: printable = command execCmdLogger.debug(command_log_line(printable, cwd=cwd)) p = subprocess.Popen(command, close_fds=True, cwd=cwd, env=env, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) with terminating(p): (out, err) = p.communicate(data) if out is None: # Prevent splitlines() from barfing later on out = b"" execCmdLogger.debug(retcode_log_line(p.returncode, err=err)) if not raw: out = out.splitlines(False) err = err.splitlines(False) return p.returncode, out, err
def __init__(self, cmd, cwd=None, nice=utils.NICENESS.HIGH, ioclass=utils.IOCLASS.IDLE): self._cmd = cmdutils.wrap_command(cmd, with_nice=nice, with_ioclass=ioclass) self._cwd = cwd self._lock = threading.Lock() self._state = CREATED self._proc = None
def _start_process(self): """ Starts a dd process performing direct I/O to path, reading the process stderr. When stderr has closed, _read_completed will be called. """ cmd = [constants.EXT_DD, "if=%s" % self._path, "of=/dev/null", "bs=4096", "count=1", "iflag=direct"] cmd = cmdutils.wrap_command(cmd) self._proc = subprocess.Popen( cmd, stdin=None, stdout=None, stderr=subprocess.PIPE) self._reader = self._loop.create_dispatcher( asyncevent.BufferedReader, self._proc.stderr, self._read_completed)
def _simple_exec_cmd(command, env=None, nice=None, ioclass=None, stdin=None, stdout=None, stderr=None): command = wrap_command(command, with_ioclass=ioclass, ioclassdata=None, with_nice=nice, with_setsid=False, with_sudo=False, reset_cpu_affinity=True) logging.debug(cmdutils.command_log_line(command, cwd=None)) p = subprocess.Popen( command, close_fds=True, cwd=None, env=env, stdin=stdin, stdout=stdout, stderr=stderr) return p
def execCmd(command, sudo=False, cwd=None, data=None, raw=False, printable=None, env=None, sync=True, nice=None, ioclass=None, ioclassdata=None, setsid=False, execCmdLogger=logging.root, resetCpuAffinity=True): """ Executes an external command, optionally via sudo. """ command = cmdutils.wrap_command(command, with_ioclass=ioclass, ioclassdata=ioclassdata, with_nice=nice, with_setsid=setsid, with_sudo=sudo, reset_cpu_affinity=resetCpuAffinity) # Unsubscriptable objects (e.g. generators) need conversion if not callable(getattr(command, '__getitem__', None)): command = tuple(command) if not printable: printable = command execCmdLogger.debug(command_log_line(printable, cwd=cwd)) p = subprocess.Popen( command, close_fds=True, cwd=cwd, env=env, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) if not sync: p = AsyncProc(p) if data is not None: p.stdin.write(data) p.stdin.flush() return p with terminating(p): (out, err) = p.communicate(data) if out is None: # Prevent splitlines() from barfing later on out = "" execCmdLogger.debug(retcode_log_line(p.returncode, err=err)) if not raw: out = out.splitlines(False) err = err.splitlines(False) return p.returncode, out, err