diff --git a/utils/dockerized/linux/msspec b/utils/dockerized/linux/msspec new file mode 100644 index 0000000..e0bc225 --- /dev/null +++ b/utils/dockerized/linux/msspec @@ -0,0 +1,165 @@ +#!/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 . +# +# Source file : utils/dockerized/linux/msspec +# Last modified: Tue, 21 Sep 2021 17:52:10 +0200 +# Committed by : sylvain tricot + +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 | uninstall]" + 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." + echo " uninstall This command will completely remove the MsSpec container," + echo " the image and this script." +} + +case $1 in + reset) Remove_MsSpecContainer ;; + uninstall) Uninstall_MsSpecImage ;; + bash) Start_MsSpecContainer; Run_Bash ;; + "-h"|"") Start_MsSpecContainer; Show_Help ;; + *) Start_MsSpecContainer; Run_MsSpec "$@" ;; +esac