From 34d0e720f58a2b23a93fabf5ab968fa3c9b7ae4a Mon Sep 17 00:00:00 2001 From: sylvain tricot Date: Tue, 21 Sep 2021 17:52:10 +0200 Subject: [PATCH] Add the frontend to the linux dockerized MsSpec. This script is the frontend of the dockerized MsSpec for Linux. The user has just to download it, make it executable and place it in the $PATH to run MsSpec. --- utils/dockerized/linux/msspec | 165 ++++++++++++++++++++++++++++++++++ 1 file changed, 165 insertions(+) create mode 100644 utils/dockerized/linux/msspec 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