From e549d203be930464cd3f3a6a2bc705a9c69b7bfc Mon Sep 17 00:00:00 2001 From: Serge Rehbinder Date: Tue, 9 Feb 2016 11:48:06 +0100 Subject: [PATCH] Add log command and update logging mecanism --- commands/config.py | 11 +++++++++- commands/log.py | 40 +++++++++++++++++++++++++++++++++ src/logger.py | 3 ++- src/xmlManager.py | 29 +++++++++++++++++++----- src/xsl/LOGO-SAT.png | Bin 0 -> 6614 bytes src/xsl/hat.xsl | 51 +++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 127 insertions(+), 7 deletions(-) create mode 100644 commands/log.py create mode 100644 src/xsl/LOGO-SAT.png create mode 100644 src/xsl/hat.xsl diff --git a/commands/config.py b/commands/config.py index e8701dd..f294e10 100644 --- a/commands/config.py +++ b/commands/config.py @@ -272,6 +272,15 @@ class ConfigManager: for rule in self.get_command_line_overrides(options, ["USER"]): exec('cfg.' + rule) # this cannot be factorize because of the exec + # ======================================================================================= + # Add log directory in the config + # get the log directory regarding the fact the command uses an application or not + if 'APPLICATION' in cfg: + logDir = os.path.join(cfg.APPLICATION.out_dir, 'LOGS') + else: + logDir = os.path.join(cfg.VARS.personalDir, 'LOGS') + cfg.VARS.logDir = logDir + return cfg def setUserConfigFile(self, config): @@ -459,7 +468,7 @@ def run(args, runner): # perform the copy shutil.copyfile(source_full_path, dest_file) - runner.logger.write(_("%s has been created.") % dest_file) + runner.logger.write(_("%s has been created.\n") % dest_file) # case : display all the available pyconf applications elif options.list: diff --git a/commands/log.py b/commands/log.py new file mode 100644 index 0000000..fe1031e --- /dev/null +++ b/commands/log.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python +#-*- coding:utf-8 -*- + +import os +import shutil + +import src + +# Define all possible option for log command : sat log +parser = src.options.Options() +parser.add_option('t', 'terminal', 'boolean', 'terminal', "Terminal log.") + + + +def description(): + return _("Gives access to logs of salomeTools.") + +def run(args, runner): + (options, args) = parser.parse_args(args) + if options.terminal: + print('terminal') + + # Find stylesheet Directory and files + xslDir = os.path.join(runner.cfg.VARS.srcDir, 'xsl') + xslCommand = os.path.join(xslDir, "command.xsl") + xslHat = os.path.join(xslDir, "hat.xsl") + imgLogo = os.path.join(xslDir, "LOGO-SAT.png") + + # get the log direcory. If there is an application, it is in cfg.APPLICATION.out_dir, else in user directory + logDir = runner.cfg.VARS.logDir + + # copy the stylesheet in the log directory + shutil.copy2(xslCommand, logDir) + shutil.copy2(xslHat, logDir) + shutil.copy2(imgLogo, logDir) + + xmlHatFilePath = os.path.join(logDir, 'hat.xml') + src.xmlManager.update_hat_xml(logDir) + + src.system.show_in_editor(runner.cfg.USER.browser, xmlHatFilePath) \ No newline at end of file diff --git a/src/logger.py b/src/logger.py index 9b0135d..a624600 100644 --- a/src/logger.py +++ b/src/logger.py @@ -48,7 +48,7 @@ class Logger(object): self.logFileName = logFileName self.logFilePath = logFilePath - self.xmlFile = xmlManager.xmlLogFile(logFilePath, config.VARS.command) + self.xmlFile = xmlManager.xmlLogFile(logFilePath, "SATcommand", attrib = {"command" : config.VARS.command}) self.putInitialXMLFields() def putInitialXMLFields(self): @@ -118,6 +118,7 @@ class Logger(object): self.xmlFile.add_simple_node("field", text=endtime , attrib={"name" : "endTime"}) self.xmlFile.add_simple_node("field", text="%ih%im%is" % (hours, minutes, seconds) , attrib={"name" : "Total Time"}) self.xmlFile.write_tree(stylesheet = "command.xsl") + src.xmlManager.update_hat_xml(self.config.VARS.logDir) def date_to_datetime(date): Y = int(date[:4]) diff --git a/src/xmlManager.py b/src/xmlManager.py index 26e980c..87cdeb4 100644 --- a/src/xmlManager.py +++ b/src/xmlManager.py @@ -17,6 +17,7 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import os +import re import src from . import ElementTree as etree @@ -24,10 +25,10 @@ from . import ElementTree as etree class xmlLogFile(object): '''Class to manage writing in salomeTools xml log file ''' - def __init__(self, filePath, command): + def __init__(self, filePath, rootname, attrib = {}): self.logFile = filePath - src.ensure_path_exists(os.path.dirname(filePath)) - self.xmlroot = etree.Element("SATcommand", attrib = {"command" : command}) + src.ensure_path_exists(os.path.dirname(filePath)) + self.xmlroot = etree.Element(rootname, attrib = attrib) def write_tree(self, stylesheet=None): f = open(self.logFile, 'w') @@ -37,7 +38,6 @@ class xmlLogFile(object): f.write(etree.tostring(self.xmlroot, encoding='utf-8')) f.close() - def add_simple_node(self, node_name, text=None, attrib={}): n = etree.Element(node_name, attrib=attrib) n.text = text @@ -47,4 +47,23 @@ class xmlLogFile(object): def append_node(self, node_name, text): for field in self.xmlroot: if field.tag == node_name: - field.text += text \ No newline at end of file + field.text += text + +def update_hat_xml(logDir): + xmlHatFilePath = os.path.join(logDir, 'hat.xml') + xmlHat = xmlLogFile(xmlHatFilePath, "LOGlist") + + for fileName in os.listdir(logDir): + sExpr = "^[0-9]{8}_+[0-9]{6}_+[A-Za-z0-9]*.xml$" + oExpr = re.compile(sExpr) + if oExpr.search(fileName): + date_hour_cmd = fileName.split('_') + date_not_formated = date_hour_cmd[0] + date = "%s/%s/%s" % (date_not_formated[6:8], date_not_formated[4:6], date_not_formated[0:4] ) + hour_not_formated = date_hour_cmd[1] + hour = "%s:%s:%s" % (hour_not_formated[0:2], hour_not_formated[2:4], hour_not_formated[4:6]) + cmd = date_hour_cmd[2][:-len('.xml')] + + xmlHat.add_simple_node("LogCommand", text=fileName, attrib = {"date" : date, "hour" : hour, "cmd" : cmd}) + + xmlHat.write_tree('hat.xsl') \ No newline at end of file diff --git a/src/xsl/LOGO-SAT.png b/src/xsl/LOGO-SAT.png new file mode 100644 index 0000000000000000000000000000000000000000..44f2ee668317b36748554fc8681e6603ece9b45e GIT binary patch literal 6614 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 + + + + + + SAlomeTools log + + + +

+ + + + + + + + + + + + +
Commanddatetime
+ + + + +
+ +
+
-- 2.39.2