import errno
import stat
import fnmatch
+import pprint as PP
from ftplib import FTP
from . import pyconf
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
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
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"""
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
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.
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
return os.path.join(dir_complete, file_name)
return False
-def find_file_in_ftppath(file_name, ftppath, installation_dir, logger):
+def find_file_in_ftppath(file_name, ftppath, installation_dir, logger, additional_dir = ""):
"""\
Find in all ftp servers in ftppath the file called file_name
If it is found then return the destination path of the file
: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)
- for ftp_archive in ftppath:
+
+ # 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("/")
for directory in ftp_archive_split[1:]:
logger.write(" Change directory to %s\n" % directory, 3)
ftp.cwd(directory)
+ if additional_dir:
+ ftp.cwd(additional_dir)
except:
logger.error("while connecting to ftp server %s\n" % ftp_server)
+ continue
+
+ try: # get md5 file if it exists
+ file_name_md5=file_name + ".md5"
+ destination_md5=destination + ".md5"
+ if ftp.size(file_name_md5) > 0:
+ with open(destination_md5,'wb') as dest_file_md5:
+ ftp.retrbinary("RETR "+file_name_md5, dest_file_md5.write)
+ except:
+ pass
try:
if ftp.size(file_name) > 0:
return destination
except:
logger.error("File not found in ftp_archive %s\n" % ftp_server)
- pass
return False