def run(self, args, stdin_string=None, env_extend=None, binary_output=False): # Allow overriding default settings. If a piece of code really wants to # set own PATH or CIB_file, we must allow it. I.e. it wants to run # a pacemaker tool on a CIB in a file but cannot afford the risk of # changing the CIB in the file specified by the user. env_vars = self._env_vars.copy() env_vars.update(dict(env_extend) if env_extend else dict()) log_args = " ".join([shell_quote(x) for x in args]) self._logger.debug( "Running: {args}\nEnvironment:{env_vars}{stdin_string}".format( args=log_args, stdin_string=("" if not stdin_string else ( "\n--Debug Input Start--\n{0}\n--Debug Input End--".format( stdin_string))), env_vars=("" if not env_vars else ("\n" + "\n".join([ " {0}={1}".format(key, val) for key, val in sorted(env_vars.items()) ]))))) self._reporter.process( reports.run_external_process_started(log_args, stdin_string, env_vars)) try: process = subprocess.Popen( args, # Some commands react differently if they get anything via stdin stdin=(subprocess.PIPE if stdin_string is not None else subprocess.DEVNULL), stdout=subprocess.PIPE, stderr=subprocess.PIPE, preexec_fn=( lambda: signal.signal(signal.SIGPIPE, signal.SIG_DFL)), close_fds=True, shell=False, env=env_vars, # decodes newlines and in python3 also converts bytes to str universal_newlines=(not binary_output)) out_std, out_err = process.communicate(stdin_string) retval = process.returncode except OSError as e: raise LibraryError( reports.run_external_process_error(log_args, e.strerror)) self._logger.debug( ("Finished running: {args}\nReturn value: {retval}" + "\n--Debug Stdout Start--\n{out_std}\n--Debug Stdout End--" + "\n--Debug Stderr Start--\n{out_err}\n--Debug Stderr End--" ).format(args=log_args, retval=retval, out_std=out_std, out_err=out_err)) self._reporter.process( reports.run_external_process_finished(log_args, retval, out_std, out_err)) return out_std, out_err, retval
def run( self, args, stdin_string=None, env_extend=None, binary_output=False ): #Reset environment variables by empty dict is desired here. We need to #get rid of defaults - we do not know the context and environment of the #library. So executable must be specified with full path. env_vars = dict(env_extend) if env_extend else dict() env_vars.update(self._env_vars) log_args = " ".join([shell_quote(x) for x in args]) msg = "Running: {args}" if stdin_string: msg += "\n--Debug Input Start--\n{stdin}\n--Debug Input End--" self._logger.debug(msg.format(args=log_args, stdin=stdin_string)) self._reporter.process( reports.run_external_process_started(log_args, stdin_string) ) try: process = subprocess.Popen( args, # Some commands react differently if they get anything via stdin stdin=(subprocess.PIPE if stdin_string is not None else None), stdout=subprocess.PIPE, stderr=subprocess.PIPE, preexec_fn=( lambda: signal.signal(signal.SIGPIPE, signal.SIG_DFL) ), close_fds=True, shell=False, env=env_vars, # decodes newlines and in python3 also converts bytes to str universal_newlines=(not self._python2 and not binary_output) ) out_std, out_err = process.communicate(stdin_string) retval = process.returncode except OSError as e: raise LibraryError( reports.run_external_process_error(log_args, e.strerror) ) self._logger.debug( ( "Finished running: {args}\nReturn value: {retval}" + "\n--Debug Stdout Start--\n{out_std}\n--Debug Stdout End--" + "\n--Debug Stderr Start--\n{out_err}\n--Debug Stderr End--" ).format( args=log_args, retval=retval, out_std=out_std, out_err=out_err ) ) self._reporter.process(reports.run_external_process_finished( log_args, retval, out_std, out_err )) return out_std, out_err, retval
def run(self, args, stdin_string=None, env_extend=None, binary_output=False): #Reset environment variables by empty dict is desired here. We need to #get rid of defaults - we do not know the context and environment of the #library. So executable must be specified with full path. env_vars = dict(env_extend) if env_extend else dict() env_vars.update(self._env_vars) log_args = " ".join([shell_quote(x) for x in args]) msg = "Running: {args}" if stdin_string: msg += "\n--Debug Input Start--\n{stdin}\n--Debug Input End--" self._logger.debug(msg.format(args=log_args, stdin=stdin_string)) self._reporter.process( reports.run_external_process_started(log_args, stdin_string)) try: process = subprocess.Popen( args, # Some commands react differently if they get anything via stdin stdin=(subprocess.PIPE if stdin_string is not None else None), stdout=subprocess.PIPE, stderr=subprocess.PIPE, preexec_fn=( lambda: signal.signal(signal.SIGPIPE, signal.SIG_DFL)), close_fds=True, shell=False, env=env_vars, # decodes newlines and in python3 also converts bytes to str universal_newlines=(not self._python2 and not binary_output)) out_std, out_err = process.communicate(stdin_string) retval = process.returncode except OSError as e: raise LibraryError( reports.run_external_process_error(log_args, e.strerror)) self._logger.debug( ("Finished running: {args}\nReturn value: {retval}" + "\n--Debug Stdout Start--\n{out_std}\n--Debug Stdout End--" + "\n--Debug Stderr Start--\n{out_err}\n--Debug Stderr End--" ).format(args=log_args, retval=retval, out_std=out_std, out_err=out_err)) self._reporter.process( reports.run_external_process_finished(log_args, retval, out_std, out_err)) return out_std, out_err, retval
def run( self, args, ignore_stderr=False, stdin_string=None, env_extend=None, binary_output=False ): env_vars = dict(env_extend) if env_extend else dict() env_vars.update(self._env_vars) log_args = " ".join([shell_quote(x) for x in args]) msg = "Running: {args}" if stdin_string: msg += "\n--Debug Input Start--\n{stdin}\n--Debug Input End--" self._logger.debug(msg.format(args=log_args, stdin=stdin_string)) self._reporter.process( reports.run_external_process_started(log_args, stdin_string) ) try: process = subprocess.Popen( args, # Some commands react differently if they get anything via stdin stdin=(subprocess.PIPE if stdin_string is not None else None), stdout=subprocess.PIPE, stderr=( subprocess.PIPE if ignore_stderr else subprocess.STDOUT ), preexec_fn=( lambda: signal.signal(signal.SIGPIPE, signal.SIG_DFL) ), close_fds=True, shell=False, env=env_vars, # decodes newlines and in python3 also converts bytes to str universal_newlines=(not self._python2 and not binary_output) ) output, dummy_stderror = process.communicate(stdin_string) retval = process.returncode except OSError as e: raise LibraryError( reports.run_external_process_error(log_args, e.strerror) ) self._logger.debug( ( "Finished running: {args}\nReturn value: {retval}" + "\n--Debug Output Start--\n{output}\n--Debug Output End--" ).format(args=log_args, retval=retval, output=output) ) self._reporter.process( reports.run_external_process_finished(log_args, retval, output) ) return output, retval
def run( self, args, stdin_string=None, env_extend=None, binary_output=False ): # Allow overriding default settings. If a piece of code really wants to # set own PATH or CIB_file, we must allow it. I.e. it wants to run # a pacemaker tool on a CIB in a file but cannot afford the risk of # changing the CIB in the file specified by the user. env_vars = self._env_vars.copy() env_vars.update( dict(env_extend) if env_extend else dict() ) log_args = " ".join([shell_quote(x) for x in args]) self._logger.debug( "Running: {args}\nEnvironment:{env_vars}{stdin_string}".format( args=log_args, stdin_string=("" if not stdin_string else ( "\n--Debug Input Start--\n{0}\n--Debug Input End--" .format(stdin_string) )), env_vars=("" if not env_vars else ( "\n" + "\n".join([ " {0}={1}".format(key, val) for key, val in sorted(env_vars.items()) ]) )) ) ) self._reporter.process( reports.run_external_process_started( log_args, stdin_string, env_vars ) ) try: process = subprocess.Popen( args, # Some commands react differently if they get anything via stdin stdin=(subprocess.PIPE if stdin_string is not None else None), stdout=subprocess.PIPE, stderr=subprocess.PIPE, preexec_fn=( lambda: signal.signal(signal.SIGPIPE, signal.SIG_DFL) ), close_fds=True, shell=False, env=env_vars, # decodes newlines and in python3 also converts bytes to str universal_newlines=(not self._python2 and not binary_output) ) out_std, out_err = process.communicate(stdin_string) retval = process.returncode except OSError as e: raise LibraryError( reports.run_external_process_error(log_args, e.strerror) ) self._logger.debug( ( "Finished running: {args}\nReturn value: {retval}" + "\n--Debug Stdout Start--\n{out_std}\n--Debug Stdout End--" + "\n--Debug Stderr Start--\n{out_err}\n--Debug Stderr End--" ).format( args=log_args, retval=retval, out_std=out_std, out_err=out_err ) ) self._reporter.process(reports.run_external_process_finished( log_args, retval, out_std, out_err )) return out_std, out_err, retval