From 30afaadd8bef3238311f35d1beef382700279126 Mon Sep 17 00:00:00 2001 From: =?utf8?q?C=C3=A9dric=20Aguerre?= Date: Mon, 11 May 2015 16:56:44 +0200 Subject: [PATCH] manage extra environment files --- bin/appliskel/.salome-completion.sh | 4 +- bin/appliskel/salome | 9 ++- bin/salomeContextUtils.py.in | 101 +++++++++++++++++++++++++--- 3 files changed, 99 insertions(+), 15 deletions(-) diff --git a/bin/appliskel/.salome-completion.sh b/bin/appliskel/.salome-completion.sh index 705129f83..48f38eaf5 100644 --- a/bin/appliskel/.salome-completion.sh +++ b/bin/appliskel/.salome-completion.sh @@ -71,10 +71,10 @@ _salome() if [[ "$cur" == -* ]]; then case $command in start) - options='-t --terminal -g --gui -d --show-desktop= -o --hide-desktop -b --batch -l --logger -f --log-file= -r --resources= -x --xterm -m --modules= -e --embedded= -s --standalone= -p --portkill -k --killall -i --interp= -z --splash= -c --catch-exceptions= --print-port --nosave-config --pinter --ns-port-log= --test= --play= --gdb-session --ddd-session --valgrind-session -w --shutdown-servers= --foreground= --wake-up-session --server-launch-mode= --port= --siman --siman-study= --siman-scenario= --siman-user= --version -h --help --with-mpi-module=' + options='-t --terminal -g --gui -d --show-desktop= -o --hide-desktop -b --batch -l --logger -f --log-file= -r --resources= -x --xterm -m --modules= -e --embedded= -s --standalone= -p --portkill -k --killall -i --interp= -z --splash= -c --catch-exceptions= --print-port --nosave-config --pinter --ns-port-log= --test= --play= --gdb-session --ddd-session --valgrind-session -w --shutdown-servers= --foreground= --wake-up-session --server-launch-mode= --port= --siman --siman-study= --siman-scenario= --siman-user= --version -h --help --with-mpi-module= --config= --extra_env=' ;; shell) - options='-h --help -p --port= -m --machine= -d --directory= -u --user= --with-mpi-module=' + options='-h --help -p --port= -m --machine= -d --directory= -u --user= --with-mpi-module= --config= --extra_env=' ;; esac COMPREPLY=( $( compgen -W "$options" -- "$cur" ) ) diff --git a/bin/appliskel/salome b/bin/appliskel/salome index 1bcae77fa..df7e2fbe2 100755 --- a/bin/appliskel/salome +++ b/bin/appliskel/salome @@ -35,9 +35,10 @@ def main(args): sys.exit(0) from salomeContextUtils import getConfigFileNames - configFileNames, args, unexisting = getConfigFileNames(args, checkExistence=True) + configFileNames, extraEnv, args, unexisting = getConfigFileNames(args, checkExistence=True) + if len(unexisting) > 0: - print "ERROR: unexisting configuration file(s): " + ', '.join(unexisting) + print "ERROR: unexisting configuration/environment file(s): " + ', '.join(unexisting) sys.exit(1) # Create a SalomeContext which parses configFileNames to initialize environment @@ -52,6 +53,10 @@ def main(args): # context.addToPythonPath('mypythonpath') # context.setVariable('myvarname', 'value') + if extraEnv: + for key,val in extraEnv.items(): + context.addToVariable(key,val) + # Start SALOME, parsing command line arguments (out, err), returncode = context.runSalome(args) if out: diff --git a/bin/salomeContextUtils.py.in b/bin/salomeContextUtils.py.in index 724106a6e..a716b79f6 100644 --- a/bin/salomeContextUtils.py.in +++ b/bin/salomeContextUtils.py.in @@ -61,18 +61,14 @@ def __getConfigFileNamesDefault(): return __listDirectory(envdDir) # -def getConfigFileNames(args, checkExistence=False): - # special case: configuration files are provided by user - # Search for command-line argument(s) --config=file1,file2,..., filen - # Search for command-line argument(s) --config=dir1,dir2,..., dirn - configOptionPrefix = "--config=" - configArgs = [ str(x) for x in args if str(x).startswith(configOptionPrefix) ] - - if len(configArgs) == 0: - return __getConfigFileNamesDefault(), args, [] +def __getEnvironmentFileNames(args, optionPrefix, checkExistence): + # special case: extra configuration/environment files are provided by user + # Search for command-line argument(s) =file1,file2,..., filen + # Search for command-line argument(s) =dir1,dir2,..., dirn + configArgs = [ str(x) for x in args if str(x).startswith(optionPrefix) ] - args = [ x for x in args if not x.startswith(configOptionPrefix) ] - allLists = [ x.replace(configOptionPrefix, '') for x in configArgs ] + args = [ x for x in args if not x.startswith(optionPrefix) ] + allLists = [ x.replace(optionPrefix, '') for x in configArgs ] configFileNames = [] unexisting = [] @@ -91,6 +87,89 @@ def getConfigFileNames(args, checkExistence=False): return configFileNames, args, unexisting # +def __validate_pair(ob): + try: + if not (len(ob) == 2): + #print "Unexpected result:", ob + raise ValueError + except: + return False + return True +# +def __get_environment_from_batch_command(env_cmd, initial=None): + """ + Take a command (either a single command or list of arguments) + and return the environment created after running that command. + Note that if the command must be a batch file or .cmd file, or the + changes to the environment will not be captured. + + If initial is supplied, it is used as the initial environment passed + to the child process. + """ + #if not isinstance(env_cmd, (list, tuple)): + # env_cmd = [env_cmd] + # construct the command that will alter the environment + #env_cmd = subprocess.list2cmdline(env_cmd) + # create a tag so we can tell in the output when the proc is done + tag = 'Done running command' + # construct a command to do accomplish this + cmd = '{env_cmd} && echo "{tag}"'.format(**vars()) + + # launch the process + proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, env=initial, shell=True) + # parse the output sent to stdout + lines = proc.stdout + # consume whatever output occurs until the tag is reached + #consume(itertools.takewhile(lambda l: tag not in l, lines)) + # define a way to handle each KEY=VALUE line + handle_line = lambda l: l.rstrip().split('=',1) + # parse key/values into pairs + #pairs = map(handle_line, lines) + pairs = [] + cpt = 0 + while True: + line = lines.readline() + cpt = cpt+1 + if tag in line or cpt > 1000: + break + if line: + pairs.append(line.rstrip().split('=',1)) + # make sure the pairs are valid + valid_pairs = filter(__validate_pair, pairs) + # construct a dictionary of the pairs + result = dict(valid_pairs) + # let the process finish + proc.communicate() + return result +# +def __subtract(ref, dic): + result = {} + for item in set(ref).difference(set(dic)): + result[item] = ref[item] + return result +# + +def getConfigFileNames(args, checkExistence=False): + configOptionPrefix = "--config=" + configArgs = [ str(x) for x in args if str(x).startswith(configOptionPrefix) ] + if len(configArgs) == 0: + configFileNames, unexist1 = __getConfigFileNamesDefault(), [] + else: + # get configuration filenames + configFileNames, args, unexist1 = __getEnvironmentFileNames(args, configOptionPrefix, checkExistence) + + # get extra environment + extraEnvFileNames, args, unexist2 = __getEnvironmentFileNames(args, "--extra_env=", checkExistence) + before = __get_environment_from_batch_command("env") + after = {} + for filename in extraEnvFileNames: + after.update(__get_environment_from_batch_command(filename)) + pass + + extraEnv = __subtract(after,before) + return configFileNames, extraEnv, args, unexist1+unexist2 +# + def __getScriptPath(scriptName, searchPathList): scriptName = os.path.expanduser(scriptName) if os.path.isabs(scriptName): -- 2.39.2