[Kimchi-devel] [PATCH V4] [Wok] Make run_command log its output into a file.
Daniel Henrique Barboza
dhbarboza82 at gmail.com
Thu Dec 24 18:49:29 UTC 2015
Reviewed-by: Daniel Barboza <dhbarboza82 at gmail.com>
On 12/24/2015 12:50 PM, pvital at linux.vnet.ibm.com wrote:
> From: Paulo Vital <pvital at linux.vnet.ibm.com>
>
> Adds the ability of run_command to log the output of a console command into a
> given file, like the "tee" command does.
>
> Using this patch, a command that takes too many time to execute can be monitored
> by reading the log file while other tasks are executed.
>
> Signed-off-by: Paulo Vital <pvital at linux.vnet.ibm.com>
> ---
> src/wok/utils.py | 45 +++++++++++++++++++++++++++++++++++++++++++--
> 1 file changed, 43 insertions(+), 2 deletions(-)
>
> diff --git a/src/wok/utils.py b/src/wok/utils.py
> index 7b1b309..9b0a113 100644
> --- a/src/wok/utils.py
> +++ b/src/wok/utils.py
> @@ -28,6 +28,7 @@ import pwd
> import re
> import sqlite3
> import subprocess
> +import sys
> import traceback
> import xml.etree.ElementTree as ET
> from cherrypy.lib.reprconf import Parser
> @@ -135,13 +136,15 @@ def import_module(module_name, class_name=''):
> return __import__(module_name, globals(), locals(), [class_name])
>
>
> -def run_command(cmd, timeout=None, silent=False):
> +def run_command(cmd, timeout=None, silent=False, tee=None):
> """
> cmd is a sequence of command arguments.
> timeout is a float number in seconds.
> timeout default value is None, means command run without timeout.
> silent is bool, it will log errors using debug handler not error.
> silent default value is False.
> + tee is a file path to store the output of the command, like 'tee' command.
> + tee default value is None, means output will not be logged.
> """
> # subprocess.kill() can leave descendants running
> # and halting the execution. Using psutil to
> @@ -159,6 +162,19 @@ def run_command(cmd, timeout=None, silent=False):
> else:
> timeout_flag[0] = True
>
> + # function to append the given msg into the log_file
> + def tee_log(msg=None, log_file=None):
> + if (msg is None) or (log_file is None):
> + return
> +
> + f = open(log_file, 'a')
> + msg += '\n'
> + try:
> + f.write(msg)
> + except TypeError:
> + f.write(msg.encode('utf_8'))
> + f.close()
> +
> proc = None
> timer = None
> timeout_flag = [False]
> @@ -171,8 +187,33 @@ def run_command(cmd, timeout=None, silent=False):
> timer.setDaemon(True)
> timer.start()
>
> - out, error = proc.communicate()
> wok_log.debug("Run command: '%s'", " ".join(cmd))
> + if tee is not None:
> + if os.path.exists(tee):
> + os.remove(tee)
> + output = []
> + while True:
> + line = ""
> + try:
> + line = proc.stdout.readline()
> + line = line.decode('utf_8')
> + except Exception:
> + type, e, tb = sys.exc_info()
> + wok_log.error(e)
> + wok_log.error("The output of the command could not be "
> + "decoded as %s\ncmd: %s\n line ignored: %s" %
> + ('utf_8', cmd, repr(line)))
> + pass
> +
> + output.append(line)
> + if not line:
> + break
> + line = line.rstrip('\n\r')
> + tee_log(line, tee)
> + out = ''.join(output)
> + error = proc.stderr.read()
> + else:
> + out, error = proc.communicate()
>
> if out:
> wok_log.debug("out:\n%s", out)
> --
> 2.5.0
>
> _______________________________________________
> Kimchi-devel mailing list
> Kimchi-devel at ovirt.org
> http://lists.ovirt.org/mailman/listinfo/kimchi-devel
More information about the Kimchi-devel
mailing list