#!/bin/bash

### EXAMPLE
###
###		cd Sandbox/Stroika-Dev && SANDBOX_FROM=/Sandbox CONTAINER_NAME=Stroika-Dev CONTAINER_IMAGE=sophistsolutionsinc/stroika-dev INCLUDE_EXTRA_PERSONAL_MOUNT_FILES=1 ScriptsLib/RunInDockerEnvironment
###


CONTAINER_NAME="${CONTAINER_NAME:-regression-tests}"
CONTAINER_IMAGE="${CONTAINER_IMAGE:-sophistsolutionsinc/stroika-buildvm-ubuntu1804-regression-tests}"
# Default EXTRA_DNS to include my local LAN DNS server so I get local machine names, like raspberrypi (where I run my rasberry pi regtests)
#EXTRA_DNS="${EXTRA_DNS:-192.168.244.1}"
EXTRA_DOCKER_ARGS="${EXTRA_DOCKER_ARGS:-}"
ECHO_DOCKER_COMMANDS="${ECHO_DOCKER_COMMANDS:-0}"
STOP_AT_END="${STOP_AT_END:-1}"
PRIVATE_COMPILER_BUILDS_DIR="${PRIVATE_COMPILER_BUILDS_DIR:-/private-compiler-builds}"
INCLUDE_EXTRA_PERSONAL_MOUNT_FILES="${INCLUDE_EXTRA_PERSONAL_MOUNT_FILES:-0}"

SANDBOX_FROM="${SANDBOX_FROM:=`pwd`}"
SANDBOX_TO="${SANDBOX_TO:=${SANDBOX_FROM}}"


# used todo 	#--dns ${EXTRA_DNS} --dns 8.8.8.8 \
# but didn't seem to be helping... so simplify
if [ "${EXTRA_DNS}" != "" ] ; then
	EXTRA_DOCKER_ARGS = "$EXTRA_DOCKER_ARGS --dns $EXTRA_DNS "
fi


### Can set CMD2RUN=./ScriptsLib/RegressionTests
CMD2RUN="${CMD2RUN:-bash}"

if [ "${USER_FLAGS}" == "" ] ; then
	USER_FLAGS="-u`id -u` `for i in $( id -G ); do echo -n " --group-add $i "; done`"
fi

# so sudo works, and user name shows up right
PASSWORD_FILE_MOUNTS="-v /etc/passwd:/etc/passwd:ro -v /etc/group:/etc/group:ro -v /etc/shadow:/etc/shadow:ro"

if [ $ECHO_DOCKER_COMMANDS -eq 1 ]; then
	echo "***USER_FLAGS = ${USER_FLAGS}"
	echo "***CMD2RUN = $CMD2RUN"
	echo "***CONTAINER_IMAGE = $CONTAINER_IMAGE"
	echo "***PRIVATE_COMPILER_BUILDS_DIR = $PRIVATE_COMPILER_BUILDS_DIR"
	echo "***INCLUDE_EXTRA_PERSONAL_MOUNT_FILES = $INCLUDE_EXTRA_PERSONAL_MOUNT_FILES"
fi

# Silently remove the previous version of the container if it was there before
docker stop ${CONTAINER_NAME} >& /dev/null || true
docker rm ${CONTAINER_NAME} >& /dev/null || true



# --dns lines since the default for a container is to use global (google) dns server, which doesn't have local dns entries (like raspberrypi device)

# -security-opt seccomp=unconfined  needed to run some google sanitizers (and probably to debug?/valgrind?)


# -e COLUMNS=\"`tput cols`\" -e LINES=\"`tput lines`\" doesn't work perfectly, but better than completely shitty display of # of lines 
#  which appears to be the docker default
EXTRATERMARGS=""
if [ "$TERM" != "" ] && [ "$TERM" != "dumb" ]; then
	EXTRATERMARGS="-e COLUMNS=\"`tput cols`\" -e LINES=\"`tput lines`\" -i"
else
	EXTRATERMARGS="-it"
fi


# -v $HOME/.ssh:$HOME/.ssh:ro so connect to raspberrypi can use ssh keys
PERSONAL_FILE_MOUNTS="\
	-v $HOME/.ssh:$HOME/.ssh \
"
if [ $INCLUDE_EXTRA_PERSONAL_MOUNT_FILES -eq 1 ]; then
PERSONAL_FILE_MOUNTS="${PERSONAL_FILE_MOUNTS} \
	-v $HOME/.bashrc:$HOME/.bashrc:ro \
	-v $HOME/.bash_aliases:$HOME/.bash_aliases:ro \
	-v $HOME/.gitconfig:$HOME/.gitconfig \
	-v $HOME/.npm:$HOME/.npm \
	-v /Sandbox/Stroika-Dev/.dockerstuff/.vscode-server:$HOME/.vscode-server \
	"
fi


RunCMD_()
{
	CMD=$*
	if [ $ECHO_DOCKER_COMMANDS -eq 1 ]; then
		echo  ${CMD}
	fi
	eval "${CMD}"
}

### If you run docker with the argument script, when the script finishes, the container stops
### restarting the container restarts the script (not what we want here).
### so start with a boring task (sleep inf), and then run the CMD2RUN arg using exec, and then
### stop the container (it can then be safely restarted)


##NB: redirect to /dev/null so container ID not shown - actual errors go to stderr
RunCMD_ "docker run \
	${USER_FLAGS} ${PASSWORD_FILE_MOUNTS} \
	-v /etc/localtime:/etc/localtime:ro \
	${PERSONAL_FILE_MOUNTS} \
	-v ${PRIVATE_COMPILER_BUILDS_DIR}:/private-compiler-builds \
	--security-opt seccomp=unconfined \
	$EXTRATERMARGS \
	--name ${CONTAINER_NAME} \
	-h ${CONTAINER_NAME} \
	-v ${SANDBOX_FROM}:${SANDBOX_TO} \
	--workdir ${SANDBOX_TO} \
	${EXTRA_DOCKER_ARGS} \
	--detach \
	${CONTAINER_IMAGE} \
	bash -c '(sudo mkdir -p ~; sudo chmod a+w ~; sleep inf) > /dev/null'"

# Run this to completion
RunCMD_ docker exec ${CONTAINER_NAME} ${CMD2RUN} 
	
# Then automatically stop the container - simulating if we had done a run of the actual CMD2RUN (except that now)
# you can restart the container without re-running the command
if [ $STOP_AT_END -eq 1 ] ; then
	RunCMD_ docker stop ${CONTAINER_NAME}
fi
