# The container expects a persistent volume called "citadel-data" in which it will keep everything.
# The remainder of the container is ephermal and can be deleted at any time.
+migrate_mode=false
+database_cleanup_mode=false
+volume_mode=false
+bind_mode=false
+
+# Parse the command line arguments
+while getopts ":mdv:h:" o
+do
+ case "${o}" in
+ m)
+ echo "migrate mode"
+ migrate_mode=true
+ ;;
+ d)
+ echo "database cleanup mode";
+ database_cleanup_mode=true
+ ;;
+ v)
+ volume_mode=true
+ CTDL_DIR=${OPTARG}
+ ;;
+ h)
+ bind_mode=true
+ CTDL_DIR=${OPTARG}
+ ;;
+ *)
+ echo
+ echo "$0: usage: $0 [-v volume_name] [-h home_directory] [-m] [-d] container_image_name"
+ echo " -v volume_name Use or create a Citadel database stored in a Docker volume called 'volume_name'"
+ echo " -h home_directory Use or create a Citadel database stored in 'home_directory' on the host system"
+ echo " -m Enter migrate mode, to copy a remote Citadel installation to this host"
+ echo " -d Attempt to recover a corrupt database"
+ exit 1
+ ;;
+ esac
+done
+shift $((OPTIND-1))
+
+if ( ${volume_mode} && ${bind_mode} ) ; then
+ echo "$0: -v and -h cannot both be specified."
+ exit 2
+fi
+
+if ${volume_mode} ; then
+ CTDL_VOL=volume
+elif ${bind_mode} ; then
+ CTDL_VOL=bind
+else
+ volume_mode=true
+ CTDL_VOL=bind
+ CTDL_DIR=/usr/local/citadel
+ mkdir /usr/local/citadel >/dev/null 2>/dev/null
+fi
+
+if ( ${migrate_mode} && ${database_cleanup_mode} ) ; then
+ echo "$0: -m and -d cannot both be specified."
+ exit 3
+fi
+
+docker run -i --rm citadel -c || exit 1
+
+n_args=""
+c_args=""
+
+if ${migrate_mode} ; then
+ c_args="-m" # Tell ctdlvisor to run ctdlmigrate
+elif ${database_cleanup_mode} ; then
+ c_args="-d" # Tell ctdlvisor to run database_cleanup.sh
+else
+ n_args="--network=host" # Only open ports if we're running in normal mode
+fi
+
exec docker run \
- --name citadel \
- -it \
+ --name=citadel \
+ -i \
--rm \
- --network host \
- --mount type=bind,source=/root/citadel/citadel,target=/citadel-data \
- $*
-
-# Explanation of the above options:
-#
-# --name citadel Create a container named "citadel"
-# -it Run in the foreground
-# --rm Delete the container when it exits
-# --network host Bind directly to the host's network ports instead of creating a separate interface
-# --mount This identifies where on the host our persistent Citadel database is found
+ ${n_args} \
+ --mount type=${CTDL_VOL},source=${CTDL_DIR},target=/citadel-data \
+ citadel \
+ ${c_args}