aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSébastien Fabbro <bicatali@gentoo.org>2013-06-26 10:23:18 -0700
committerSébastien Fabbro <bicatali@gentoo.org>2013-06-26 10:23:18 -0700
commit0ed65facdbd4db0e275f314b56d66de1bc00283d (patch)
tree560d048b36b9877db9dbafa9e0630ebe068f2ad8 /sys-cluster/modules/files
parentMerge branch 'master' of git://git.overlays.gentoo.org/proj/sci; github.com:g... (diff)
downloadsci-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-xsys-cluster/modules/files/createmodule.py186
-rwxr-xr-xsys-cluster/modules/files/createmodule.sh166
-rw-r--r--sys-cluster/modules/files/modules-3.2.10-avail.patch12
-rw-r--r--sys-cluster/modules/files/modules-3.2.10-bindir.patch11
-rw-r--r--sys-cluster/modules/files/modules-3.2.10-clear.patch11
-rw-r--r--sys-cluster/modules/files/modules-3.2.10-versioning.patch10
-rw-r--r--sys-cluster/modules/files/modules.sh.in7
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