164 lines
4.9 KiB
Bash
164 lines
4.9 KiB
Bash
#!/usr/bin/env bash
|
|
#
|
|
# Copyright © 2016-2021 - Rennes Physics Institute
|
|
#
|
|
# This file is part of msspec.
|
|
#
|
|
# msspec 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 3 of the License, or
|
|
# (at your option) any later version.
|
|
# msspec 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 msspec. If not, see <http://www.gnu.org/licenses/>.
|
|
#
|
|
# Source file : utils/dockerized/linux/msspec
|
|
# Last modified: Wed, 22 Sep 2021 14:29:59 +0200
|
|
# Committed by : sylvain tricot <sylvain.tricot@univ-rennes1.fr>
|
|
|
|
THIS_SCRIPT="$0"
|
|
IMAGE_NAME="iprcnrs/msspec:latest"
|
|
|
|
Logln () {
|
|
echo "$1" >&2
|
|
}
|
|
|
|
Log () {
|
|
echo -n "$1" >&2
|
|
}
|
|
|
|
Read_YesNo () {
|
|
PROMPT="$1"
|
|
DEFAULT="$2"
|
|
|
|
ANSWER=""
|
|
RESPONSE=""
|
|
|
|
VALID=1
|
|
while test $VALID -ne 0; do
|
|
read -p "${PROMPT} (y/n) [${DEFAULT}]? " "RESPONSE"
|
|
ANSWER="${RESPONSE:-${DEFAULT}}"
|
|
case "${ANSWER}" in
|
|
y|n) VALID=0 ;;
|
|
*) echo "Invalid choice, please answer \"y\" or \"n\"."; VALID=1 ;;
|
|
esac
|
|
done
|
|
}
|
|
|
|
Get_MsSpecContainerID () {
|
|
CID=$(docker ps -a -q --filter ancestor=$IMAGE_NAME)
|
|
echo $CID
|
|
}
|
|
|
|
Get_MsSpecImageID () {
|
|
IID=$(docker images -q $IMAGE_NAME)
|
|
echo $IID
|
|
}
|
|
|
|
Add_MsSpecImage () {
|
|
docker pull $IMAGE_NAME 1>&2
|
|
}
|
|
|
|
Add_MsSpecContainer () {
|
|
CID=$(Get_MsSpecContainerID)
|
|
if [ -z "$CID" ]; then
|
|
IID=$(Get_MsSpecImageID)
|
|
if [ -z "$IID" ]; then
|
|
Logln "Pulling MsSpec image..."
|
|
Add_MsSpecImage
|
|
fi
|
|
Log "Creating the MsSpec container... "
|
|
USERNAME=$(whoami)
|
|
USERID=$(id -u $USERNAME)
|
|
GROUPID=$(id -g $USERNAME)
|
|
CID=$(docker create -i --net=host -e DISPLAY=$DISPLAY -v $HOME:$HOME -u ${USERID}:${GROUPID} --entrypoint /bin/bash $IMAGE_NAME)
|
|
Logln "done."
|
|
fi
|
|
echo $CID
|
|
}
|
|
|
|
Start_MsSpecContainer () {
|
|
CID=$(Add_MsSpecContainer)
|
|
status=$(docker container inspect -f '{{.State.Status}}' $CID)
|
|
if [ $status != "running" ]; then
|
|
Log "Starting MsSpec container... "
|
|
# Start the container
|
|
CID=$(docker start $CID)
|
|
Logln "done."
|
|
fi
|
|
}
|
|
|
|
Remove_MsSpecContainer () {
|
|
Log "Removing MsSpec container... "
|
|
CID=$(Get_MsSpecContainerID)
|
|
docker stop -t 1 $CID >/dev/null 2>&1
|
|
docker rm $CID >/dev/null 2>&1
|
|
Logln "done."
|
|
}
|
|
|
|
Run_MsSpec () {
|
|
# Run msspec command
|
|
CID=$(Get_MsSpecContainerID)
|
|
xhost +localhost >/dev/null 2>&1
|
|
docker exec -i -t -w "$PWD" $CID msspec "$@"
|
|
}
|
|
|
|
Run_Bash () {
|
|
# Run msspec command
|
|
CID=$(Get_MsSpecContainerID)
|
|
xhost +localhost >/dev/null 2>&1
|
|
docker exec -i -t -w "$PWD" -e HOME=$HOME -e PS1="MsSpec:\w> " $CID /bin/bash --norc --noprofile
|
|
}
|
|
|
|
Uninstall_MsSpecImage () {
|
|
Read_YesNo "You are about to remove the MsSpec Docker image, its container and this script. Are you sure" "n"
|
|
case $ANSWER in
|
|
y) Remove_MsSpecContainer;
|
|
Log "Removing ${IMAGE_NAME}...";
|
|
docker rmi $IMAGE_NAME >/dev/null 2>&1;
|
|
Logln "done.";
|
|
Log "Removing ${THIS_SCRIPT}...";
|
|
rm -f $THIS_SCRIPT;
|
|
Logln "done.";
|
|
;;
|
|
n) echo "Uninstallation aborted."
|
|
esac
|
|
}
|
|
|
|
Show_Help () {
|
|
echo "Usage: 1) msspec -p [PYTHON OPTIONS] SCRIPT [ARGUMENTS...]"
|
|
echo " 2) msspec [-l FILE | -i | -h]"
|
|
echo " 3) msspec [bash | reset]"
|
|
echo ""
|
|
echo "Form (1) is used to launch a script"
|
|
echo "Form (2) is used to load a hdf5 data file"
|
|
echo "Form (3) is used to control the Docker container/image."
|
|
echo ""
|
|
echo "List of possible options:"
|
|
echo " -p Pass every arguments after this option to the msspec"
|
|
echo " virtual environment Python interpreter."
|
|
echo " -i Run the interactive Python interpreter within msspec"
|
|
echo " virtual environment."
|
|
echo " -l Load and display a *.hdf5 data file in a graphical"
|
|
echo " window."
|
|
echo " -v Print the version."
|
|
echo " -h Show this help message."
|
|
echo ""
|
|
echo " bash This command starts an interactive bash shell in the"
|
|
echo " MsSpec container."
|
|
echo " reset This command removes the MsSpec container (but not the"
|
|
echo " image). Changes made in the container will be lost and"
|
|
echo " any new call to msspec will recreate a new fresh container."
|
|
}
|
|
|
|
case $1 in
|
|
reset) Remove_MsSpecContainer ;;
|
|
bash) Start_MsSpecContainer; Run_Bash ;;
|
|
"-u") Uninstall_MsSpecImage ;;
|
|
"-h"|"") Start_MsSpecContainer; Show_Help ;;
|
|
*) Start_MsSpecContainer; Run_MsSpec "$@" ;;
|
|
esac
|