Bootstrap: first usefull version of modmanage

This commit is contained in:
2015-03-04 18:26:22 +01:00
parent 2a8cd068ea
commit afa18de45e
3 changed files with 225 additions and 141 deletions
+4
View File
@@ -0,0 +1,4 @@
#!/bin/bash
declare -r bindir=$( cd $(dirname $0) && pwd -P )
"${bindir}/bash" -c "${bindir}/modmanage.bash"
+218 -139
View File
@@ -1,15 +1,36 @@
#!/usr/bin/env bash #!@PMODULES_HOME@/bin/bash
shopt -s expand_aliases
function usage() { declare -r bindir=$(cd $(dirname "$0") && pwd -P)
local -r prog=$(basename $0)
echo "Usage: $prog [--user=<user>] [--force] [--dry-run] <target-directory>" get_options() {
echo " Initializes a local module environment in <target-directory>" "${bindir}/getopt" "$@"
echo " for user <user>. <directory> must not exist yet."
echo " The <user> parameter must only be present if"
echo " $prog is executed as root."
} }
print_version() {
echo "
Pmodules ${version} using Tcl Environment Modules @MODULES_VERSION@
Copyright GNU GPL v2
" 1>&2
}
usage() {
local -r prog=$(basename $0)
print_version
echo "
Usage: ${prog} [ switches ] [ subcommand ] [subcommand-args ]
Switches:
--dry-run do nothing
--force force overwrite
Available SubCommands and Args:
init [--src=<src>] [--user=<user>] --dst=<dst>
Initialize a new minimal Pmodule environment.
"
}
log() { log() {
local -ri fd=$1 local -ri fd=$1
local -r fmt="$2\n" local -r fmt="$2\n"
@@ -50,152 +71,210 @@ die() {
declare force='no' declare force='no'
declare dry_run='no' declare dry_run='no'
declare DRY='' declare DRY=''
declare target_dirs=() declare subcommand=''
declare sargs=()
while (($# > 0)); do subcommand_help_init() {
if [[ "${1#--dir}" != "$1" ]]; then echo "
option="${1#--dir}" init [--src=<src>] [--user=<user>] <dst>
option="${option#=}" Initialize a new minimal Pmodule environment in directory
[[ -z "$option" ]] && { shift; option="$1"; } <dst>. The <user> parameter must only be present if
{target_dir}="$option" ${prog} is executed as root.
elif [[ "${1#--user}" != "$1" ]]; then " 1>&2
option="${1#--user}" }
option="${option#=}"
[[ -z "$option" ]] && { shift; option="$1"; }
ENV_USER="$option"
elif [[ "$1" == "--force" ]]; then
force='yes'
elif [[ "$1" == "--dry-run" ]]; then
dry_run='yes'
DRY='echo'
elif [[ "$1" =~ "^-" ]]; then
echo "Error: Unknown option: $1"
usage
exit 1
else
target_dirs+=( "$1" )
fi
shift
done
if [[ ${#target_dirs[@]} == 0 ]]; then subcommand_help() {
echo "Error: no target directory specified!" if [[ $# == 0 ]]; then
usage usage
exit 1 elif typeset -F subcommand_help_$1 > /dev/null 2>&1 ; then
fi # help for sub-command
subcommand_help_$1
else
usage
fi
}
if (( EUID == 0 )); then subcommand_init() {
if [[ -z "$ENV_USER" ]]; then local src=''
echo "Error: --user parameter is required!" local target_dirs=()
usage local user=''
exit 1 local opts=''
fi opts=$(get_options -o h -l src: -l user: -l help -- "$@")
USER_ID=$(id -u "$ENV_USER") if [[ $? != 0 ]]; then
if (( $? != 0 )); then subcommand_help_init
echo "Error: Unable to retrieve user id of user '$ENV_USER'" exit 1
exit 1 fi
fi eval set -- "${opts}"
else while (($# > 0)); do
if [[ -n "$ENV_USER" ]]; then case $1 in
echo "Error: --user option is only allowed if running as root!" --src )
usage src=$2
exit 1 shift
fi ;;
USER_ID=$EUID --user )
fi user=$2
shift
;;
-- )
:
;;
-* | -h | --help )
echo "$1: illegal option" 1>&2
subcommand_help_init
exit 1
;;
* )
target_dirs+=( "$1" )
;;
esac
shift
done
(( ${#target_dirs[@]} != 0 )) || die 1 "Error: no target directory specified!"
[[ -n "${PSI_PREFIX}" ]] && if [[ -n "${src}" ]]; then
[[ -n "${PSI_CONFIG_DIR}" ]] && [[ -d "${src}" ]] || die 1 "Error: ${src}: source directory does not exist!"
[[ -n "${PSI_MODULES_ROOT}" ]] && [[ -r "${src}/config/profile.bash" ]] || die 1 "Error: ${src}: shell profile does not exist or is not readable!"
[[ -n "${PSI_TEMPLATES_DIR}" ]] && source "${src}/config/profile.bash"
[[ -n "${PMODULES_HOME}" ]] && fi
[[ -n "${PMODULES_VERSION}" ]] || { local -i euid=$(id -u)
die 1 " if (( euid == 0 )); then
[[ -n "$ENV_USER" ]] || die 1 "Error: --user parameter is required!"
id -u "$ENV_USER" > /dev/null 2>&1 || die 1 "Error: Unable to retrieve user id of user '$ENV_USER'"
else
[[ -z "$ENV_USER" ]] || die 1 "Error: --user option is only allowed if running as root!"
fi
[[ -n "${PSI_PREFIX}" ]] &&
[[ -n "${PSI_CONFIG_DIR}" ]] &&
[[ -n "${PSI_MODULES_ROOT}" ]] &&
[[ -n "${PSI_TEMPLATES_DIR}" ]] &&
[[ -n "${PMODULES_HOME}" ]] &&
[[ -n "${PMODULES_VERSION}" ]] || die 1 "
Error: the module environment you are going to use as source has not been Error: the module environment you are going to use as source has not been
initialized properly!" initialized properly!"
}
[[ -d "${PSI_PREFIX}" ]] &&
[[ -d "${PSI_PREFIX}" ]] && [[ -d "${PSI_PREFIX}/${PSI_CONFIG_DIR}" ]] &&
[[ -d "${PSI_PREFIX}/${PSI_CONFIG_DIR}" ]] && [[ -d "${PSI_PREFIX}/${PSI_MODULES_ROOT}" ]] &&
[[ -d "${PSI_PREFIX}/${PSI_MODULES_ROOT}" ]] && [[ -d "${PSI_PREFIX}/${PSI_TEMPLATES_DIR}" ]] &&
[[ -d "${PSI_PREFIX}/${PSI_TEMPLATES_DIR}" ]] && [[ -d "${PMODULES_HOME}" ]] || die 1 "
[[ -d "${PMODULES_HOME}" ]] || {
die 1 "
Error: the module environment '$PSI_PREFIX' has not been initialized properly!" Error: the module environment '$PSI_PREFIX' has not been initialized properly!"
}
echo " echo "
Attempting to create a minimal module environment from the Attempting to create a minimal module environment from the
environment at '${PSI_PREFIX}' environment at '${PSI_PREFIX}'
" "
function init_pmodules_environment() { function init_pmodules_environment() {
local -r target_dir=$1 local -r target_dir=$1
local src='' local src=''
local dst='' local dst=''
echo "Initializing target directory '${target_dir}' ..." echo "Initializing target directory '${target_dir}' ..."
if [[ -d "${target_dir}" ]] && [[ ${force} == no ]]; then if [[ -d "${target_dir}" ]] && [[ ${force} == no ]]; then
echo "Warning: ${target_dir} already exists." echo "Warning: ${target_dir} already exists."
read -p "Do you really want to re-run the initialization? (y/N) " ans read -p "Do you really want to re-run the initialization? (y/N) " ans
case ${ans} in case ${ans} in
y|Y ) y|Y )
: :
;; ;;
* ) * )
exit 1 exit 1
;; ;;
esac esac
fi fi
dst="${target_dir}" dst="${target_dir}"
echo "Creating target directory '${src}'..." echo "Creating target directory '${dst}'..."
$DRY mkdir -p "${dst}" || die 1 "Error: make directory failed!" $DRY mkdir -p "${dst}" || die 1 "Error: make directory failed!"
echo
src="${PSI_PREFIX}/${PSI_CONFIG_DIR}/"
dst="${target_dir}/${PSI_CONFIG_DIR}/"
echo "Synching configuration from '${src}' to '${dst}'..."
$DRY rsync --recursive --links --perms --delete \
"${src}" "${dst}" || die 1 "Error: synch operation failed!"
echo
src="${PSI_PREFIX}/${PSI_TEMPLATES_DIR}/"
dst="${target_dir}/${PSI_TEMPLATES_DIR}/"
echo "Synching template files from '${src}' to '${dst}'..."
$DRY rsync --recursive --links --perms --delete \
"${src}" "${dst}" || die 1 "Error: synch operation failed!"
echo
src="${PMODULES_HOME}/"
dst="${target_dir}/${PMODULES_HOME#$PSI_PREFIX/}/"
echo "Synching Pmodules software from '${src}' to '${dst}'..."
$DRY mkdir -p "${dst}" || die 1 "Error: creating target directory failed!"
$DRY rsync --recursive --links --perms --delete \
"${src}" "${dst}" || die 1 "Error: synch operation failed!"
echo
src="${PSI_PREFIX}/${PSI_MODULES_ROOT}/Tools/Pmodules"
dst="${target_dir}/${PSI_MODULES_ROOT}/Tools/Pmodules"
echo "Setting up modulefile for Pmodules in '${dst}'..."
$DRY mkdir -p "${dst}" || die 1 "Error: make directory failed!"
$DRY ln -fs "../../../${PSI_TEMPLATES_DIR}/Tools/Pmodules/modulefile" \
"${dst}/${PMODULES_VERSION}" || die 1 "Error: setting sym-link failed!"
$DRY cp "${src}/.release-${PMODULES_VERSION}" "${dst}" || die 1 "Error: setting release failed!"
echo
if [[ -n "${ENV_USER}" ]]; then
echo "Changing user of new module environment to '${ENV_USER}'..."
$DRY chown -R "${ENV_USER}" "${target_dir}" || die 1 "Error: changing owner failed!"
echo echo
fi
echo "New minimal module environment created at '${target_dir}'." src="${PSI_PREFIX}/${PSI_CONFIG_DIR}/"
echo "To use this environment, execute" dst="${target_dir}/${PSI_CONFIG_DIR}/"
echo " ln -s ${target_dir} /opt/psi as root (delete the /opt/psi link if it already exists)" echo "Synching configuration from '${src}' to '${dst}'..."
echo " source ${target_dir}/$PSI_CONFIG_DIR/profile.bash" $DRY rsync --recursive --links --perms --delete \
"${src}" "${dst}" || die 1 "Error: synch operation failed!"
echo
src="${PSI_PREFIX}/${PSI_TEMPLATES_DIR}/"
dst="${target_dir}/${PSI_TEMPLATES_DIR}/"
echo "Synching template files from '${src}' to '${dst}'..."
$DRY rsync --recursive --links --perms --delete \
"${src}" "${dst}" || die 1 "Error: synch operation failed!"
echo
src="${PMODULES_HOME}/"
dst="${target_dir}/${PMODULES_HOME#$PSI_PREFIX/}/"
echo "Synching Pmodules software from '${src}' to '${dst}'..."
$DRY mkdir -p "${dst}" || die 1 "Error: creating target directory failed!"
$DRY rsync --recursive --links --perms --delete \
"${src}" "${dst}" || die 1 "Error: synch operation failed!"
echo
src="${PSI_PREFIX}/${PSI_MODULES_ROOT}/Tools/Pmodules"
dst="${target_dir}/${PSI_MODULES_ROOT}/Tools/Pmodules"
echo "Setting up modulefile for Pmodules in '${dst}'..."
$DRY mkdir -p "${dst}" || die 1 "Error: make directory failed!"
$DRY ln -fs "../../../${PSI_TEMPLATES_DIR}/Tools/Pmodules/modulefile" \
"${dst}/${PMODULES_VERSION}" || die 1 "Error: setting sym-link failed!"
$DRY cp "${src}/.release-${PMODULES_VERSION}" "${dst}" || die 1 "Error: setting release failed!"
echo
if [[ -n "${ENV_USER}" ]]; then
echo "Changing user of new module environment to '${ENV_USER}'..."
$DRY chown -R "${ENV_USER}" "${target_dir}" || die 1 "Error: changing owner failed!"
echo
fi
echo "New minimal module environment created at '${target_dir}'."
echo "To use this environment, execute"
echo " ln -s ${target_dir} /opt/psi as root (delete the /opt/psi link if it already exists)"
echo " source ${target_dir}/$PSI_CONFIG_DIR/profile.bash"
}
umask 022
for target_dir in "${target_dirs[@]}"; do
init_pmodules_environment "${target_dir}"
done
} }
umask 022 while (($# > 0)); do
for target_dir in "${target_dirs[@]}"; do case $1 in
init_pmodules_environment "${target_dir}" -h | -H | -\? | --help | -help )
usage
exit 1
;;
-V | --version )
print_version
exit 1
;;
-f | --force )
force='yes'
;;
--dry-run )
dry_run='yes'
DRY='echo'
;;
-* )
echo "$1: unknown switch.\n" 1>&2
exit 1
;;
init|help )
subcommand="subcommand_$1"
shift
sargs=( $* )
shift $#
;;
* )
echo "$1: unknown sub-command" 1>&2
exit 1
esac
shift
done done
$subcommand "${sargs[@]}"
# Local Variables:
# mode: sh
# sh-basic-offset: 8
# tab-width: 8
# End:
+3 -2
View File
@@ -13,6 +13,7 @@ sed_cmd="s:@PMODULES_HOME@:${PMODULES_HOME}:g;"
sed_cmd+="s:@PMODULES_VERSION@:${PMODULES_VERSION}:g;" sed_cmd+="s:@PMODULES_VERSION@:${PMODULES_VERSION}:g;"
sed_cmd+="s:@MODULES_VERSION@:${MODULES_VERSION}:g" sed_cmd+="s:@MODULES_VERSION@:${MODULES_VERSION}:g"
sed "${sed_cmd}" "${SRC_DIR}/modulecmd.in" > "${SRC_DIR}/modulecmd" sed "${sed_cmd}" "${SRC_DIR}/modulecmd.in" > "${SRC_DIR}/modulecmd"
sed "${sed_cmd}" "${SRC_DIR}/modmanage.in" > "${SRC_DIR}/modmanage.bash"
install -d -m 0755 "${PMODULES_HOME}/bin" install -d -m 0755 "${PMODULES_HOME}/bin"
install -d -m 0755 "${PMODULES_HOME}/config" install -d -m 0755 "${PMODULES_HOME}/config"
@@ -20,8 +21,8 @@ install -d -m 0755 "${PMODULES_HOME}/init"
install -d -m 0755 "${PMODULES_HOME}/lib" install -d -m 0755 "${PMODULES_HOME}/lib"
install -m 0755 "${SRC_DIR}/modulecmd" "${PMODULES_HOME}/bin" install -m 0755 "${SRC_DIR}/modulecmd" "${PMODULES_HOME}/bin"
install -m 0755 "${SRC_DIR}/init_local_env.bash" "${PMODULES_HOME}/bin" install -m 0755 "${SRC_DIR}/modmanage" "${PMODULES_HOME}/bin"
install -m 0755 "${SRC_DIR}/modsync.bash" "${PMODULES_HOME}/bin" install -m 0755 "${SRC_DIR}/modmanage.bash" "${PMODULES_HOME}/bin"
install -m 0755 "${SRC_DIR}/dialog.bash" "${PMODULES_HOME}/bin" install -m 0755 "${SRC_DIR}/dialog.bash" "${PMODULES_HOME}/bin"
install -m 0644 "${SRC_DIR}/bash" "${PMODULES_HOME}/init" install -m 0644 "${SRC_DIR}/bash" "${PMODULES_HOME}/init"