#!/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