X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=commands%2Fapplication.py;h=025baf3077a79443c5f4face376680e2bceaeb55;hb=00a94c7b2e189587897f2fed3d7ee94a1f642800;hp=78c8e39516d129014b1b78d2a5b91027debef407;hpb=c3d7c3fee7ab10fcc24de57d3dcfe1d6eb2bec8d;p=tools%2Fsat.git diff --git a/commands/application.py b/commands/application.py index 78c8e39..025baf3 100644 --- a/commands/application.py +++ b/commands/application.py @@ -25,10 +25,11 @@ import getpass from src import ElementTree as etree import src +from src.versionMinorMajorPatch import MinorMajorPatch as MMP parser = src.options.Options() parser.add_option('n', 'name', 'string', 'name', - _('Optional: The name of the application (default is APPLI.name or ' + _('Optional: The name of the application (default is APPLICATION.virtual_app.name or ' 'runAppli)')) parser.add_option('c', 'catalog', 'string', 'catalog', _('Optional: The resources catalog to use')) @@ -42,6 +43,9 @@ parser.add_option('', 'gencat', 'string', 'gencat', parser.add_option('m', 'module', 'list2', 'modules', _("Optional: the restricted list of module(s) to include in the " "application")) +parser.add_option('', 'use_mesa', 'boolean', 'use_mesa', + _("Optional: Create a launcher that will use mesa products\n\t" + "It can be usefull whan salome is used on a remote machine through ssh")) ## # Creates an alias for runAppli. @@ -69,7 +73,7 @@ def add_module_to_appli(out, module, has_gui, module_path, logger, flagline): ## # Creates the config file to create an application with the list of modules. -def create_config_file(config, modules, env_file, logger): +def create_config_file(config, modules, env_files, logger): samples = "" if 'SAMPLES' in config.APPLICATION.products: @@ -79,22 +83,34 @@ def create_config_file(config, modules, env_file, logger): f = open(config_file, "w") f.write('\n') - f.write('\n' % env_file) + for env_file in env_files: + if env_file.endswith("cfg"): + f.write('\n' % env_file) + else: + f.write('\n' % env_file) + f.write('\n') f.write('\n') flagline = False for m in modules: mm = src.product.get_product_config(config, m) + # do not include in virtual application application module! + if src.get_property_in_product_cfg(mm, "is_salome_application") == "yes": + continue + # do not include products that do not compile + if not src.product.product_compiles(mm): + continue + #obsolete? if src.product.product_is_smesh_plugin(mm): continue - if 'install_dir' in mm and bool(mm.install_dir) : + if 'install_dir' in mm and bool(mm.install_dir): if src.product.product_is_cpp(mm): # cpp module for aa in src.product.get_product_components(mm): - install_dir = os.path.join(config.APPLICATION.workdir, - "INSTALL") + install_dir=os.path.join(config.APPLICATION.workdir, + config.INTERNAL.config.install_dir) mp = os.path.join(install_dir, aa) flagline = add_module_to_appli(f, aa, @@ -118,8 +134,8 @@ def create_config_file(config, modules, env_file, logger): ## # Customizes the application by editing SalomeApp.xml. def customize_app(config, appli_dir, logger): - if 'configure' not in config.APPLI \ - or len(config.APPLI.configure) == 0: + if 'configure' not in config.APPLICATION.virtual_app \ + or len(config.APPLICATION.virtual_app.configure) == 0: return # shortcut to get an element (section or parameter) from parent. @@ -152,9 +168,9 @@ def customize_app(config, appli_dir, logger): assert document is not None, "document tag not found" logger.write("\n", 4) - for section_name in config.APPLI.configure: - for parameter_name in config.APPLI.configure[section_name]: - parameter_value = config.APPLI.configure[section_name][parameter_name] + for section_name in config.APPLICATION.virtual_app.configure: + for parameter_name in config.APPLICATION.virtual_app.configure[section_name]: + parameter_value = config.APPLICATION.virtual_app.configure[section_name][parameter_name] logger.write(" configure: %s/%s = %s\n" % (section_name, parameter_name, parameter_value), 4) @@ -178,8 +194,8 @@ def generate_application(config, appli_dir, config_file, logger): script = os.path.join(install_KERNEL_dir, "bin", "salome", "appli_gen.py") if not os.path.exists(script): raise src.SatException(_("KERNEL is not installed")) - - # Add SALOME python in the environment in order to avoid python version + + # Add SALOME python in the environment in order to avoid python version # problems at appli_gen.py call if 'Python' in config.APPLICATION.products: envi = src.environment.SalomeEnviron(config, @@ -187,7 +203,7 @@ def generate_application(config, appli_dir, config_file, logger): dict(os.environ)), True) envi.set_a_product('Python', logger) - + command = "python %s --prefix=%s --config=%s" % (script, appli_dir, config_file) @@ -198,7 +214,7 @@ def generate_application(config, appli_dir, config_file, logger): env=envi.environ.environ, stdout=logger.logTxtFile, stderr=subprocess.STDOUT) - + if res != 0: raise src.SatException(_("Cannot create application, code = %d\n") % res) @@ -213,9 +229,9 @@ def write_step(logger, message, level=3, pad=50): ## # Creates a SALOME application. def create_application(config, appli_dir, catalog, logger, display=True): - + SALOME_modules = get_SALOME_modules(config) - + warn = ['KERNEL', 'GUI'] if display: for w in warn: @@ -229,9 +245,9 @@ def create_application(config, appli_dir, catalog, logger, display=True): catalog, logger, SALOME_modules) - + if retcode == 0: - cmd = src.printcolors.printcLabel("%s/runAppli" % appli_dir) + cmd = src.printcolors.printcLabel("%s/salome" % appli_dir) if display: logger.write("\n", 3, False) @@ -244,7 +260,8 @@ def get_SALOME_modules(config): l_modules = [] for product in config.APPLICATION.products: product_info = src.product.get_product_config(config, product) - if src.product.product_is_SALOME(product_info): + if (src.product.product_is_salome(product_info) or + src.product.product_is_generated(product_info)): l_modules.append(product) return l_modules @@ -256,25 +273,37 @@ def generate_launch_file(config, appli_dir, catalog, logger, l_SALOME_modules): if len(catalog) > 0 and not os.path.exists(catalog): raise IOError(_("Catalog not found: %s") % catalog) - + write_step(logger, _("Creating environment files")) status = src.KO_STATUS + + # build the application (the name depends upon salome version + env_file = os.path.join(config.APPLICATION.workdir, "env_launch") + VersionSalome = src.get_salome_version(config) + if VersionSalome>=MMP([8,2,0]): + # for salome 8+ we use a salome context file for the virtual app + app_shell=["cfg", "bash"] + env_files=[env_file+".cfg", env_file+".sh"] + else: + app_shell=["bash"] + env_files=[env_file+".sh"] + try: import environ # generate only shells the user wants (by default bash, csh, batch) - # the environ command will only generate file compatible + # the environ command will only generate file compatible # with the current system. environ.write_all_source_files(config, logger, + shells=app_shell, silent=True) status = src.OK_STATUS finally: logger.write(src.printcolors.printc(status) + "\n", 2, False) - # build the application - env_file = os.path.join(config.APPLICATION.workdir, "env_launch.sh") + write_step(logger, _("Building application"), level=2) - cf = create_config_file(config, l_SALOME_modules, env_file, logger) + cf = create_config_file(config, l_SALOME_modules, env_files, logger) # create the application directory os.makedirs(appli_dir) @@ -295,44 +324,6 @@ def generate_launch_file(config, appli_dir, catalog, logger, l_SALOME_modules): return retcode -## -# Generates a launcher that sources Salome's python and calls original launcher -def generate_sourcing_launcher(config, appli_dir, logger) : - - # Rename original launcher - launcher_name = os.path.join( appli_dir, - "bin", - "salome", - config.APPLI.launch_alias_name ) - original_launcher = launcher_name + "-original" - os.rename( launcher_name, original_launcher ) - - # Open new launcher - f = open(launcher_name, "w") - - # Write the set up of the environment - env = src.environment.SalomeEnviron( config, - src.fileEnviron.get_file_environ( - f, - "bash", - {}, - config)) - env.set_a_product( "Python", logger) - - # Write the call to the original launcher - f.write( "\n\n") - f.write( "# This is the call to the original launcher\n") - f.write( original_launcher + " $*" ) - f.write( "\n\n") - - # Write the cleaning of the environment - env.finish(True) - - # Close new launcher - f.close() - os.chmod(launcher_name, stat.S_IRWXU| stat.S_IRWXG| stat.S_IRWXO) # 0777 - - ## # Generates the catalog from a list of machines. @@ -349,47 +340,51 @@ def generate_catalog(machines, config, logger): user = getpass.getuser() catfile = src.get_tmp_filename(config, "CatalogResources.xml") - catalog = file(catfile, "w") - catalog.write("\n\n") - for k in machines: - logger.write(" ssh %s " % (k + " ").ljust(20, '.'), 4) - logger.flush() - - ssh_cmd = 'ssh -o "StrictHostKeyChecking no" %s %s' % (k, cmd) - p = subprocess.Popen(ssh_cmd, shell=True, - stdin=subprocess.PIPE, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - p.wait() - - if p.returncode != 0: - logger.write(src.printcolors.printc(src.KO_STATUS) + "\n", 4) - logger.write(" " + src.printcolors.printcWarning(p.stderr.read()), - 2) - else: - logger.write(src.printcolors.printc(src.OK_STATUS) + "\n", 4) - lines = p.stdout.readlines() - freq = lines[0][:-1].split(':')[-1].split('.')[0].strip() - nb_proc = len(lines) -1 - memory = lines[-1].split(':')[-1].split()[0].strip() - memory = int(memory) / 1000 - - catalog.write(" \n") - catalog.write(" \n") - - catalog.write("\n") - catalog.close() + with open(catfile, 'w') as catalog: + catalog.write("\n\n") + for k in machines: + if not src.architecture.is_windows(): + logger.write(" ssh %s " % (k + " ").ljust(20, '.'), 4) + logger.flush() + + ssh_cmd = 'ssh -o "StrictHostKeyChecking no" %s %s' % (k, cmd) + p = subprocess.Popen(ssh_cmd, shell=True, + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + p.wait() + + machine_access = (p.returncode == 0) + if not machine_access: + logger.write(src.printcolors.printc(src.KO_STATUS) + "\n", 4) + logger.write(" " + src.printcolors.printcWarning(p.stderr.read()), + 2) + else: + logger.write(src.printcolors.printc(src.OK_STATUS) + "\n", 4) + lines = p.stdout.readlines() + freq = lines[0][:-1].split(':')[-1].split('.')[0].strip() + nb_proc = len(lines) -1 + memory = lines[-1].split(':')[-1].split()[0].strip() + memory = int(memory) / 1000 + + catalog.write(" \n") + catalog.write(" \n") + + catalog.write("\n") return catfile ################################################## @@ -398,7 +393,7 @@ def generate_catalog(machines, config, logger): # Describes the command def description(): '''method that is called when salomeTools is called with --help option. - + :return: The text to display for the application command description. :rtype: str ''' @@ -413,7 +408,7 @@ def run(args, runner, logger): '''method that is called when salomeTools is called with application parameter. ''' - + (options, args) = parser.parse_args(args) # check for product @@ -422,9 +417,9 @@ def run(args, runner, logger): application = src.printcolors.printcLabel(runner.cfg.VARS.application) logger.write(_("Building application for %s\n") % application, 1) - # if section APPLI does not exists create one - if "APPLI" not in runner.cfg: - msg = _("The section APPLI is not defined in the product.") + # if section APPLICATION.virtual_app does not exists create one + if "virtual_app" not in runner.cfg.APPLICATION: + msg = _("The section APPLICATION.virtual_app is not defined in the product. Use sat launcher in state") logger.write(src.printcolors.printcError(msg), 1) logger.write("\n", 1) return 1 @@ -436,16 +431,20 @@ def run(args, runner, logger): # set list of modules if options.modules: - runner.cfg.APPLI['modules'] = options.modules + runner.cfg.APPLICATION.virtual_app['modules'] = options.modules + + # activate mesa use in the generated application + if options.use_mesa: + src.activate_mesa_property(runner.cfg) # set name and application_name if options.name: - runner.cfg.APPLI['name'] = options.name - runner.cfg.APPLI['application_name'] = options.name + "_appdir" - - application_name = src.get_cfg_param(runner.cfg.APPLI, + runner.cfg.APPLICATION.virtual_app['name'] = options.name + runner.cfg.APPLICATION.virtual_app['application_name'] = options.name + "_appdir" + + application_name = src.get_cfg_param(runner.cfg.APPLICATION.virtual_app, "application_name", - runner.cfg.APPLI.name + "_appdir") + runner.cfg.APPLICATION.virtual_app.name + "_appdir") appli_dir = os.path.join(target_dir, application_name) src.printcolors.print_value(logger, @@ -463,18 +462,18 @@ def run(args, runner, logger): catalog_src = options.gencat catalog = generate_catalog(options.gencat.split(","), runner.cfg,logger) - elif 'catalog' in runner.cfg.APPLI: + elif 'catalog' in runner.cfg.APPLICATION.virtual_app: # use catalog specified in the product - if runner.cfg.APPLI.catalog.endswith(".xml"): + if runner.cfg.APPLICATION.virtual_app.catalog.endswith(".xml"): # catalog as a file - catalog = runner.cfg.APPLI.catalog + catalog = runner.cfg.APPLICATION.virtual_app.catalog else: # catalog as a list of computers - catalog_src = runner.cfg.APPLI.catalog + catalog_src = runner.cfg.APPLICATION.virtual_app.catalog mlist = filter(lambda l: len(l.strip()) > 0, - runner.cfg.APPLI.catalog.split(",")) + runner.cfg.APPLICATION.virtual_app.catalog.split(",")) if len(mlist) > 0: - catalog = generate_catalog(runner.cfg.APPLI.catalog.split(","), + catalog = generate_catalog(runner.cfg.APPLICATION.virtual_app.catalog.split(","), runner.cfg, logger) # display which catalog is used @@ -516,4 +515,3 @@ def run(args, runner, logger): logger.write("\n", 3, False) return retcode -