X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2F__init__.py;h=95bd104faf73f075ba1173a6acd339d9d20efbac;hb=28cebd157f9d39920d0480232e7c361716ca45bb;hp=789e23030a3ec1979d049cdbac79588c15a5e781;hpb=e06d9a603359f19e1d1ac5af37a6579b49691f75;p=tools%2Fsat.git diff --git a/src/__init__.py b/src/__init__.py index 789e230..95bd104 100644 --- a/src/__init__.py +++ b/src/__init__.py @@ -26,6 +26,8 @@ import shutil import errno import stat import fnmatch +import pprint as PP +from ftplib import FTP from . import pyconf from . import architecture @@ -53,8 +55,13 @@ KNOWNFAILURE_STATUS = "KF" TIMEOUT_STATUS = "TIMEOUT" class SatException(Exception): - """rename Exception Class""" - pass + """sat exception class""" + def message(self, arg): + if sys.version_info[0] >= 3: + # message method is not available for python 3.8+ + return super().msg(arg) + else: + return super(SatException,self).message(arg) def ensure_path_exists(p): """Create a path if not existing @@ -89,6 +96,27 @@ def check_config_has_profile( config, details = None ): details.append(message) raise SatException( message ) +def appli_test_property(config,property_name, property_value): + """Generic function to test if an application has a property set to a value + :param config class 'common.pyconf.Config': The config. + :param property_name : The name of the property to check + :param property_value : The value of the property to test + :return: True if the application has the property set to property_value + :rtype: boolean + """ + # first check if application has property_value + if not ("APPLICATION" in config and + "properties" in config.APPLICATION and + property_name in config.APPLICATION.properties): + return False + + # then check to the property is set to property_value + eval_expression = 'config.APPLICATION.properties.%s == "%s"' %\ + (property_name,property_value) + result = eval(eval_expression) + return result + + def config_has_application( config ): return 'APPLICATION' in config @@ -109,6 +137,24 @@ def get_cfg_param(config, param_name, default): return config[param_name] return default +def strSplitN(aList, nb, skip="\n "): + """ + example + aStr = 'this-is-a-string' + splitN(aStr, 2, '-') + split it by every 2nd '-' rather than every '-' + """ + strValue = "" + i = 0 + for v in aList: + strValue += "%15s, " % str(v) + i += 1 + if i >= nb: + strValue += skip + i = 0 + if len(aList) > nb: + strValue = skip + strValue + return strValue def getProductNames(cfg, wildcards, logger): """get products names using * or ? as wildcards like shell Linux""" @@ -117,16 +163,25 @@ def getProductNames(cfg, wildcards, logger): wilds = wildcards else: wilds = [wildcards] + notFound = {} products = cfg.APPLICATION.products.keys() - for prod in products: - for wild in wildcards: + for wild in wildcards: + ok = False + for prod in products: filtered = fnmatch.filter([prod], wild) # print("filtered", prod, wild, filtered) if len(filtered) > 0: res.append(prod) - break + ok = True + continue + if not ok: + notFound[wild] = None if len(res) == 0: logger.warning("Empty list of products, from %s" % wilds) + if len(notFound.keys()) > 0: + strProd = strSplitN( sorted(products), 5) + logger.warning("products not found: %s\n availables products are:\n%s" % \ + (sorted(notFound.keys()), strProd) ) return res @@ -180,6 +235,23 @@ def get_launcher_name(config): return launcher_name +def get_launcher_exe(config): + """\ + Returns the name of exe defined in profile section. + + :param config Config: The global Config instance. + :return: The name of the exe to use in launcher. + :rtype: str + """ + check_config_has_application(config) + if 'profile' in config.APPLICATION and 'exe' in config.APPLICATION.profile: + exe_name = config.APPLICATION.profile.exe + else: + exe_name = None + + return exe_name + + def get_log_path(config): """\ Returns the path of the logs. @@ -199,6 +271,15 @@ def get_log_path(config): return log_dir_path +def get_salometool_version(config): + """Return the salomeTool version. + + :param config Config: The global Config instance. + :return: the description of this version of sat in terms of tag and commit + """ + return config.LOCAL.tag + + def get_salome_version(config): import versionMinorMajorPatch as VMMP @@ -219,7 +300,7 @@ def get_salome_version(config): res = version.strCompact() # print("get_salome_version %s -> %s" % (version, res)) - return res + return int(res) # TODO may be future avoid test(s) on integer, use MajorMinorPatch def read_config_from_a_file(filePath): try: @@ -375,6 +456,61 @@ def find_file_in_lpath(file_name, lpath, additional_dir = ""): return os.path.join(dir_complete, file_name) return False +def find_file_in_ftppath(file_name, ftppath, installation_dir, logger): + """\ + Find in all ftp servers in ftppath the file called file_name + If it is found then return the destination path of the file + (the place where the file was downloaded" + else return False. + + :param file_name str: The file name to search + :param ftppath, List: The list of ftp servers where to search + :param installation_dir str: The name of the installation directory + :return: the full path of the file or False if not found + :param logger Logger: The logging instance to use for the prints. + :rtype: str + """ + + # make sure installation_dir exists + if not os.path.exists(installation_dir): + os.makedirs(installation_dir) + + destination=os.path.join(installation_dir, file_name) + + # paths in ftppath may contain several paths separated by ":" + # we plit them, and push all paths in bigftppath + bigftppath=[] + for ipath in ftppath: + splpath=ipath.split(":") + bigftppath+=splpath + + for ftp_archive in bigftppath: + try: + # ftp_archive has the form ftp.xxx.yyy/dir1/dir2/... + ftp_archive_split=ftp_archive.split("/") + ftp_server=ftp_archive_split[0] + ftp = FTP(ftp_server) + logger.write(" Connect to ftp server %s\n" % ftp_server, 3) + ftp.login() + for directory in ftp_archive_split[1:]: + logger.write(" Change directory to %s\n" % directory, 3) + ftp.cwd(directory) + except: + logger.error("while connecting to ftp server %s\n" % ftp_server) + + try: + if ftp.size(file_name) > 0: + # if file exists and is non empty + with open(destination,'wb') as dest_file: + ftp.retrbinary("RETR "+file_name, dest_file.write) + logger.write(" Archive %s was retrieved and stored in %s\n" % (file_name, destination), 3) + return destination + except: + logger.error("File not found in ftp_archive %s\n" % ftp_server) + pass + + return False + def handleRemoveReadonly(func, path, exc): excvalue = exc[1] if func in (os.rmdir, os.remove) and excvalue.errno == errno.EACCES: