2023-09-25 23:36:14 +00:00
#!/bin/bash
set -e
# IMAGE=akilesalreadytaken/analog-xk:latest
2023-09-29 19:04:17 +00:00
IMAGE = akilesalreadytaken/chipathon-tools:latest
2023-09-25 23:36:14 +00:00
# IMAGE=git.1159.cl/mario1159/analog-xk-web:latest
CALL =
function parse ( ) {
while getopts ":hsvp:k:" option; do
case $option in
h) documentation ; ;
s) CALL = "echo [CMD] " ; ;
#v) ENABLE_VNC=1 ;; # VNC not working rigth now
p) DESIGNS = $OPTARG ; ;
k) PDK = $OPTARG ; ;
\? ) echo "Error: Invalid option" ; documentation ; ;
esac
done
}
function documentation ( ) {
echo "Usage: run.bat [ OPTIONS ]"
echo ""
echo " -h Show usage information"
echo " -s See the commands to be executed"
echo " -p PATH Link to a directory"
# echo " -v Enable the vnc in port "https:\\localhost:8444""
# echo " If vnc is not working, execute:"
# echo " $ xfce4-session --display=:1 &"
echo " -k PDK Set the PDK to be used (gf180mcuC | sky130A)"
echo " By default: gf180mcuC"
exit
}
function run ( ) {
# Set fixed parameters
####################
[ -z " ${ DESIGNS +x } " ] && DESIGNS = $PWD
DESIGNS = $( realpath $DESIGNS )
[ -z " ${ PDK +x } " ] && PDK = gf180mcuC
[ -z " ${ DOCKER_USER +x } " ] && DOCKER_USER = git.1159.cl/mario1159
[ -z " ${ DOCKER_IMAGE +x } " ] && DOCKER_IMAGE = analog-xk
[ -z " ${ DOCKER_TAG +x } " ] && DOCKER_TAG = latest
[ -z " ${ CONTAINER_USER +x } " ] && CONTAINER_USER = $( id -u)
[ -z " ${ CONTAINER_GROUP +x } " ] && CONTAINER_GROUP = $( id -g)
2023-09-29 19:04:17 +00:00
[ -z " ${ CONTAINER_NAME +x } " ] && CONTAINER_NAME = chipathon-tools
2023-09-25 23:36:14 +00:00
[ -z " ${ JUPYTER_PORT +x } " ] && JUPYTER_PORT = 8888
[ -z " ${ VNC_PORT +x } " ] && VNC_PORT = 8444
# Validate parameters
#####################
if [ [ ${ CONTAINER_USER } -ne 0 ] ] && [ [ ${ CONTAINER_USER } -lt 1000 ] ] ; then
prt_str = " # [WARNING] Selected User ID ${ CONTAINER_USER } is below 1000. This ID might interfere with User-IDs inside the container and cause undefined behavior! # "
printf -- '#%.0s' $( seq 1 ${# prt_str } )
echo
echo " ${ prt_str } "
printf -- '#%.0s' $( seq 1 ${# prt_str } )
echo
fi
if [ [ ${ CONTAINER_GROUP } -ne 0 ] ] && [ [ ${ CONTAINER_GROUP } -lt 1000 ] ] ; then
prt_str = " # [WARNING] Selected Group ID ${ CONTAINER_GROUP } is below 1000. This ID might interfere with Group-IDs inside the container and cause undefined behavior! # "
printf -- '#%.0s' $( seq 1 ${# prt_str } )
echo
echo " ${ prt_str } "
printf -- '#%.0s' $( seq 1 ${# prt_str } )
echo
fi
# Check if the container exists and if it is running.
if [ " $( docker ps -q -f name = " ${ CONTAINER_NAME } " ) " ] ; then
echo "[WARNING] Container is running!"
echo " [HINT] It can also be stopped with \"docker stop ${ CONTAINER_NAME } \" and removed with \"docker rm ${ CONTAINER_NAME } \" if required. "
echo
echo -n "Press \"s\" to stop, and \"r\" to stop & remove: "
read -r -n 1 k <& 1
echo
if [ [ $k = s ] ] ; then
$CALL docker stop " ${ CONTAINER_NAME } "
elif [ [ $k = r ] ] ; then
$CALL docker stop " ${ CONTAINER_NAME } "
$CALL docker rm " ${ CONTAINER_NAME } "
fi
exit
fi
# If the container exists but is exited, it is restarted.
if [ " $( docker ps -aq -f name = " ${ CONTAINER_NAME } " ) " ] ; then
echo " [WARNING] Container ${ CONTAINER_NAME } exists. "
echo " [HINT] It can also be restarted with \"docker start ${ CONTAINER_NAME } \" or removed with \"docker rm ${ CONTAINER_NAME } \" if required. "
echo
echo -n "Press \"s\" to start, and \"r\" to remove: "
read -r -n 1 k <& 1
echo
if [ [ $k = s ] ] ; then
$CALL docker start " ${ CONTAINER_NAME } "
elif [ [ $k = r ] ] ; then
$CALL docker rm " ${ CONTAINER_NAME } "
fi
exit
fi
# Set environment, variables and run the container
##################################################
echo " [INFO] Container does not exist, creating ${ CONTAINER_NAME } ... "
PARAMS = "-d"
PARAMS = " $PARAMS --name $CONTAINER_NAME "
PARAMS = " $PARAMS -e PDK= $PDK "
PARAMS = " $PARAMS --user ${ CONTAINER_USER } : ${ CONTAINER_GROUP } "
PARAMS = " $PARAMS --security-opt seccomp=unconfined "
PARAMS = " $PARAMS -p $JUPYTER_PORT :8888 "
PARAMS = " $PARAMS -v $DESIGNS :/home/designer/shared "
PARAMS = " $PARAMS -v /tmp/.X11-unix:/tmp/.X11-unix "
if [ -z " ${ ENABLE_VNC +x } " ] ; then
PARAMS = " $PARAMS -e DISPLAY= $DISPLAY "
PARAMS = " $PARAMS -e WAYLAND_DISPLAY= $WAYLAND_DISPLAY "
PARAMS = " $PARAMS -e XDG_RUNTIME_DIR= $XDG_RUNTIME_DIR "
else
PARAMS = " $PARAMS -p $VNC_PORT :8444 "
# Should use WSL_DISTRO_NAME ?
PARAMS = " $PARAMS -v /mnt/wslg:/mnt/wsl "
fi
if [ -z " ${ IMAGE +x } " ] ; then
IMAGE = $DOCKER_USER /$DOCKER_IMAGE :$DOCKER_TAG
fi
echo " [INFO] Container based on $IMAGE "
$CALL docker run $PARAMS $IMAGE $COMMAND
attach_shell
}
function attach_shell ( ) {
$CALL docker exec -it $CONTAINER_NAME bash
}
function restart_shell ( ) {
$CALL docker start $CONTAINER_NAME
attach_shell
}
parse $@
run