diff options
author | 2013-06-26 10:23:18 -0700 | |
---|---|---|
committer | 2013-06-26 10:23:18 -0700 | |
commit | 0ed65facdbd4db0e275f314b56d66de1bc00283d (patch) | |
tree | 560d048b36b9877db9dbafa9e0630ebe068f2ad8 /sys-cluster/modules/files | |
parent | Merge branch 'master' of git://git.overlays.gentoo.org/proj/sci; github.com:g... (diff) | |
download | sci-0ed65facdbd4db0e275f314b56d66de1bc00283d.tar.gz sci-0ed65facdbd4db0e275f314b56d66de1bc00283d.tar.bz2 sci-0ed65facdbd4db0e275f314b56d66de1bc00283d.zip |
sys-cluster/modules: Prefix keyworded. Added tests. FHS fixes. Add bunch of fedora patches
Package-Manager: portage-2.2.01.22013-prefix
Diffstat (limited to 'sys-cluster/modules/files')
-rwxr-xr-x | sys-cluster/modules/files/createmodule.py | 186 | ||||
-rwxr-xr-x | sys-cluster/modules/files/createmodule.sh | 166 | ||||
-rw-r--r-- | sys-cluster/modules/files/modules-3.2.10-avail.patch | 12 | ||||
-rw-r--r-- | sys-cluster/modules/files/modules-3.2.10-bindir.patch | 11 | ||||
-rw-r--r-- | sys-cluster/modules/files/modules-3.2.10-clear.patch | 11 | ||||
-rw-r--r-- | sys-cluster/modules/files/modules-3.2.10-versioning.patch | 10 | ||||
-rw-r--r-- | sys-cluster/modules/files/modules.sh.in | 7 |
7 files changed, 403 insertions, 0 deletions
diff --git a/sys-cluster/modules/files/createmodule.py b/sys-cluster/modules/files/createmodule.py new file mode 100755 index 000000000..60c6ba7fa --- /dev/null +++ b/sys-cluster/modules/files/createmodule.py @@ -0,0 +1,186 @@ +#!/usr/bin/python +# +# createmodule.py - Takes the name of a environment init script and +# produces a modulefile that duplicates the changes made by the init script +# +# Copyright (C) 2012 by Orion E. Poplawski <orion@cora.nwra.com> +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +from optparse import OptionParser +import os,sys +from subprocess import * + +# Handle options +usage = "Usage: %prog [-p prefix] <initscript> [args]" +parser = OptionParser() +parser.set_usage(usage) +parser.add_option('-p', '--prefix', dest='prefix', help='Specify path prefix') +(options, args) = parser.parse_args() + +# Need a script name +if not args: + parser.print_usage() + exit(1) + +# Return environment after a command +def getenv(cmd = ':'): + env = {} + p = Popen(cmd + ";env", shell=True, stdout=PIPE, stderr=PIPE) + (stdout, stderr) = p.communicate() + if p.returncode != 0: + print "EROR: Could not execute initscript:" + print "%s returned exit code %d" % (cmd, p.returncode) + print stderr + exit(1) + if stderr != '': + print "WARNING: initscript sent the following to stderr:" + print stderr + # Parse the output key=value pairs + for line in stdout.splitlines(): + try: + (var,value) = line.split('=',1) + except ValueError: + print "ERROR: Could not parse output:" + print stdout + exit(1) + env[var] = value + return env + +#Record initial environment +env1=getenv() + +#Record environment after sourcing the initscript +env2=getenv(". " + " ".join(args)) + +# Initialize our variables for storing modifications +chdir = None +appendpath = {} +prependpath = {} +setenv = {} +unsetenv = [] +pathnames = [] + +# Function to nomalize all paths in a list of paths and remove duplicate items +def normpaths(paths): + newpaths = [] + for path in paths: + normpath = os.path.normpath(path) + if normpath not in newpaths: + newpaths.append(os.path.normpath(path)) + return newpaths + +# Start with existing keys and look for changes +for key in env1.keys(): + # Test for delete + if key not in env2: + unsetenv.append(key) + continue + # No change + if env1[key] == env2[key]: + del env2[key] + continue + #Working directory change + if key == 'PWD': + chdir=os.path.normpath(env2[key]) + pathnames.append(chdir) + del env2[key] + continue + # Determine modifcations to beginning and end of the string + (prepend,append) = env2[key].split(env1[key]) + if prepend: + prependpaths = prepend.strip(':').split(':') + # LICENSE variables often include paths outside install directory + if 'LICENSE' not in key: + pathnames += prependpaths + prependpath[key] = ':'.join(normpaths(prependpaths)) + if append: + appendpaths = append.strip(':').split(':') + # LICENSE variables often include paths outside install directory + if 'LICENSE' not in key: + pathnames += appendpaths + appendpath[key] = ':'.join(normpaths(appendpaths)) + del env2[key] + +# We're left with new keys in env2 +for key in env2.keys(): + # Use prepend-path for new paths + if ('PATH' in key) or (':' in env2[key]): + prependpaths = env2[key].strip(':').split(':') + # MANPATH can have system defaults added it it wasn't previously set + # LICENSE variables often include paths outside install directory + if key != 'MANPATH' and 'LICENSE' not in key: + pathnames += prependpaths + prependpath[key] = ':'.join(normpaths(prependpaths)) + continue + # Set new variables + setenv[key] = os.path.normpath(env2[key]) + if 'LICENSE' not in key: + pathnames.append(setenv[key]) + +# Determine a prefix +prefix = None +if options.prefix: + prefix = options.prefix +else: + prefix = os.path.commonprefix(pathnames).rstrip('/') + if prefix == '': + prefix = None + +# Print out the modulefile +print "#%Module 1.0" + +# Prefix +if prefix is not None: + print "\nset prefix " + prefix + "\n" + +# Chdir +if chdir is not None: + print "chdir\t" + chdir + +# Function to format output line with tabs and substituting prefix +def formatline(item, key, value=None): + print item, + print "\t"*(2-(len(item)+1)/8), + print key, + if value is not None: + print "\t"*(3-(len(key)+1)/8), + if prefix is not None: + print value.replace(prefix,'$prefix') + else: + print value + +# Paths first, grouped by variable name +pathkeys = appendpath.keys() + prependpath.keys() +pathkeys.sort() +for key in pathkeys: + if key in prependpath: + formatline("prepend-path",key,prependpath[key]) + if key in appendpath: + formatline("append-path",key,appendpath[key]) + +# Setenv +setenvkeys = setenv.keys() +setenvkeys.sort() +if setenvkeys: + print +for key in setenvkeys: + formatline("setenv",key,setenv[key]) + +# Unsetenv +unsetenv.sort() +if unsetenv: + print +for key in unsetenv: + formatline("unsetenv",key) diff --git a/sys-cluster/modules/files/createmodule.sh b/sys-cluster/modules/files/createmodule.sh new file mode 100755 index 000000000..b44cf0512 --- /dev/null +++ b/sys-cluster/modules/files/createmodule.sh @@ -0,0 +1,166 @@ +#!/bin/bash +# +# createmodule.sh - Takes the name of a environment init script and +# produces a modulefile that duplicates the changes made by the init script +# +# Copyright (C) 2010-2012 by Orion E. Poplawski <orion@cora.nwra.com> +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +usage="Usage: $0 [-p prefix] <initscript> [args]" + +usage() { + echo $usage 1>&2 + exit 1 +} + +while getopts "p:" opt +do + case $opt in + p) prefix=$OPTARG; shift 2;; + *) usage;; + esac +done + +# Need a script name +[ -z "$1" ] && usage + +# Need to be a readable script +if [ ! -r "$1" ] +then + echo "ERROR: Cannot read $1" 1>&2 + exit 1 +fi + +#Will print out array assignment list +printenvarray () { + env | while read x + do + key=${x%%=*} + value=${x#*=} + echo [$key]="'$value'" + done +} + +#Apparently we need to declare the associative arrays +declare -A env1 env2 + +#Record starting environment +eval env1=(`printenvarray`) + +#Source the environment script +. "$@" + +#Record ending environment +eval env2=(`printenvarray`) + +#Print out the modulefile +echo "#%Module 1.0" + +#Prefix +[ -n "$prefix" ] && echo -e "\nset prefix $prefix\n" + +#Subshell so we can sort the output +( +dedup() { + list=`mktemp` + echo $1 | sed -r -e 's,[^/]+/\.\./,,g' -e 's,[^/]+/\.\./,,g' -e 's/:/\n/g' | + while read x + do + grep -Fx ${x} $list && continue + if [ -n "$prefix" ] + then + echo $x | sed -e s,$prefix,\$prefix, + else + echo $x + fi + echo $x >> $list + done | tr '\n' : | sed -e 's/:$//' + rm $list +} + +#Keys that changed +for key in "${!env1[@]}" +do + if [ "${env1[$key]}" != "${env2[$key]}" ] + then + #Working directory change + if [ "$key" = PWD ] + then + if [ -n "$prefix" ] + then + echo -e "chdir\t\t${env2[PWD]}" | sed -e s,$prefix,\$prefix,g + else + echo -e "chdir\t\t${env2[PWD]}" + fi + #Test for delete + elif [ -z "${env2[$key]}" ] + then + echo -e "unsetenv\t${key}\t${env2[$key]}" + #Test for prepend + elif [ "${env2[$key]%${env1[$key]}}" != "${env2[$key]}" ] + then + added=$(dedup ${env2[$key]%:${env1[$key]}}) + echo -e "prepend-path\t$key\t${added}" + #Test for prepend plus : added at end (MANPATH) + elif [ "${env2[$key]%${env1[$key]}:}" != "${env2[$key]}" ] + then + added=$(dedup ${env2[$key]%${env1[$key]}:}) + echo -e "prepend-path\t$key\t${added}" + #Test for append + elif [ "${env2[$key]#${env1[$key]}}" != "${env2[$key]}" ] + then + added=$(dedup ${env2[$key]#:${env1[$key]}}) + echo -e "append-path\t$key\t${added}" + #Test for prepend plus append + elif [ "${env2[$key]%${env1[$key]}:*}" != "${env2[$key]}" ] + then + added=$(dedup ${env2[$key]%:${env1[$key]}*}) + echo -e "prepend-path\t$key\t${added}" + added=$(dedup ${env2[$key]#*${env1[$key]}:}) + echo -e "append-path\t$key\t${added}" + else + #Unhandled + echo "Unhandled change of $key" 1>&2 + echo "Before <${env1[$key]}>" 1>&2 + echo "After <${env2[$key]}>" 1>&2 + fi + fi + #Delete keys we've handled + unset env1[$key] + unset env2[$key] +done + +#New keys +for key in "${!env2[@]}" +do + if [ "$key" = OLDPWD ] + then + continue + fi + #Use prepend-path for new paths + if [ "${key/PATH/}" != "$key" ] + then + # TODO - Need to handle stripping of default MANPATH + echo -e "prepend-path\t${key}\t"$(dedup ${env2[$key]}) + else + if [ -n "$prefix" ] + then + echo -e "setenv\t\t${key}\t${env2[$key]}" | sed -e s,$prefix,\$prefix,g + else + echo -e "setenv\t\t${key}\t${env2[$key]}" + fi + fi +done +) | sort diff --git a/sys-cluster/modules/files/modules-3.2.10-avail.patch b/sys-cluster/modules/files/modules-3.2.10-avail.patch new file mode 100644 index 000000000..8d6f52b92 --- /dev/null +++ b/sys-cluster/modules/files/modules-3.2.10-avail.patch @@ -0,0 +1,12 @@ +diff -up modules-3.2.10/init/bash_completion.in.avail modules-3.2.10/init/bash_completion.in +--- modules-3.2.10/init/bash_completion.in.avail 2012-10-25 13:33:34.000000000 -0600 ++++ modules-3.2.10/init/bash_completion.in 2013-01-15 12:05:37.247309733 -0700 +@@ -56,7 +56,7 @@ _module() { + unuse) COMPREPLY=( $(IFS=: compgen -W "${MODULEPATH}" -- "$cur") );; + use|*-a*) ;; # let readline handle the completion + -u|--userlvl) COMPREPLY=( $(compgen -W "novice expert advanced" -- "$cur") );; +- display|help|show|whatis) ++ av*|disp*|help|show|whatis) + COMPREPLY=( $(compgen -W "$(_module_avail)" -- "$cur") );; + *) if test $COMP_CWORD -gt 2 + then diff --git a/sys-cluster/modules/files/modules-3.2.10-bindir.patch b/sys-cluster/modules/files/modules-3.2.10-bindir.patch new file mode 100644 index 000000000..2066d7f13 --- /dev/null +++ b/sys-cluster/modules/files/modules-3.2.10-bindir.patch @@ -0,0 +1,11 @@ +--- modules-3.2.10.orig/init/Makefile.in 2009-09-22 12:13:52.000000000 -0600 ++++ modules-3.2.10/init/Makefile.in 2009-09-23 12:19:50.797470155 -0600 +@@ -404,7 +404,7 @@ + sed -e "/@$(if $(subst 0,,$(WANTS_VERSIONING)),NOT,)VERSIONING\@/d; \ + s,@$(if $(subst 0,,$(WANTS_VERSIONING)),,NOT)VERSIONING\@,,g; \ + s,@prefix\@,${prefix},g; \ +- s,@bindir\@,${exec_prefix}/bin,g; \ ++ s,@bindir\@,${bindir},g; \ + s,@VERSION\@,@VERSION@,g; \ + s,@BASEPREFIX\@,@BASEPREFIX@,g;" < $< > $@ + diff --git a/sys-cluster/modules/files/modules-3.2.10-clear.patch b/sys-cluster/modules/files/modules-3.2.10-clear.patch new file mode 100644 index 000000000..0817db5c2 --- /dev/null +++ b/sys-cluster/modules/files/modules-3.2.10-clear.patch @@ -0,0 +1,11 @@ +--- modules-3.2.9/utility.c 2011-11-28 22:27:13.000000000 +0100 ++++ modules-3.2.9-new/utility.c 2012-06-13 15:17:41.570629148 +0200 +@@ -727,7 +727,7 @@ int Output_Modulefile_Changes( Tcl_Inter + output_unset_variable( (char*) key); + } else { + val = EMGetEnv(interp, key); +- if(val && *val) ++ if(val) + output_set_variable(interp, (char*) key, val); + null_free((void *)&val); + } diff --git a/sys-cluster/modules/files/modules-3.2.10-versioning.patch b/sys-cluster/modules/files/modules-3.2.10-versioning.patch new file mode 100644 index 000000000..7bda92023 --- /dev/null +++ b/sys-cluster/modules/files/modules-3.2.10-versioning.patch @@ -0,0 +1,10 @@ +diff -up modules-3.2.10/modulefiles/modules.in.versioning modules-3.2.10/modulefiles/modules.in +--- modules-3.2.10/modulefiles/modules.in.versioning 2012-10-25 13:33:34.000000000 -0600 ++++ modules-3.2.10/modulefiles/modules.in 2013-01-15 11:30:22.046031158 -0700 +@@ -26,5 +26,5 @@ setenv MODULESHOME $prefix + prepend-path PATH @bindir@ + prepend-path MANPATH @mandir@ + +-module use @VERSIONPATH@ ++@VERSIONING@module use @VERSIONPATH@ + diff --git a/sys-cluster/modules/files/modules.sh.in b/sys-cluster/modules/files/modules.sh.in new file mode 100644 index 000000000..6ed502e87 --- /dev/null +++ b/sys-cluster/modules/files/modules.sh.in @@ -0,0 +1,7 @@ +shell=$(basename $(ps -p $$ -ocomm=)) +if [ -f @EPREFIX@/usr/share/Modules/init/${shell} ] +then + . @EPREFIX@/usr/share/Modules/init/${shell} +else + . @PREFIX@/usr/share/Modules/init/sh +fi |