#!/bin/bash # This is an AppImage control script for the Citadel system. # # Copyright (c) 2021 by the citadel.org team # # This program is open source software. It runs great on the # Linux operating system (and probably elsewhere). You can use, # copy, and run it under the terms of the GNU General Public # License version 3. # # This program 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. # Default values HTTP_PORT=80 HTTPS_PORT=443 CTDL_DIR=/usr/local/citadel export APPDIR ulimit -c unlimited usage() { echo ${APPIMAGE}: usage: ${APPIMAGE} '[-h data_directory] [-p http_port] [-s https_port] command' echo 'command must be one of: run, test, install, client, database_cleanup, migrate' exit 2 } # Permanently install the Citadel AppImage to this system installation() { # Clear the screen and draw the banner echo -e '\033[2J\033[H\033[44m\033[37m\033[K\033[0m' echo -e '\033[44m\033[37m\033[1m Citadel installation\033[K\033[0m' echo -e '\033[44m\033[37m \033[K\033[0m' echo # First ... check to make sure Citadel isn't already running. echo Checking to make sure Citadel is not already running... if ps ax | grep citserver | grep -v grep ; then echo echo -e '\033[31m\033[1mInstallation cannot proceed while Citadel is running.\033[0m' echo Stop your services and try again. echo exit 1 fi echo OK echo # Check compatibility echo Checking this AppImage compatibility with your host system... ( export LD_LIBRARY_PATH=$APPDIR/usr/lib export PATH=$APPDIR/usr/bin $APPDIR/usr/local/citadel/citserver -c || { echo echo -e '\033[31m\033[1mCompatibility failed.\033[0m' echo 'This AppImage is not compatible with your system.' echo 'If you are attempting to run it on a compatible platform, please make sure you' echo 'have all of the latest updates and patches applied. Otherwise, you may have' echo 'better luck with the Easy Install method.' echo '' exit 2 } ) || exit 2 echo OK echo # Clear the screen and draw the banner echo -e '\033[2J\033[H\033[44m\033[37m\033[K\033[0m' echo -e '\033[44m\033[37m\033[1m Citadel installation\033[K\033[0m' echo -e '\033[44m\033[37m \033[K\033[0m' echo # Locate the Citadel run directory confirmed=0 while [ ${confirmed} == 0 ] do echo -n In what directory will you run Citadel\? \[${CTDL_DIR}\]\ read dir if [ "${dir}" == "" ] then dir=${CTDL_DIR} fi if [ ! -d ${dir} ] then echo -n ${dir} does not exist. Do you want to create it\?\ read yesno if [ `echo ${yesno} | cut -c1` == 'y' ] then mkdir ${dir} fi fi if [ -d ${dir} ] then confirmed=1 fi done CTDL_DIR=${dir} # Check systemd echo Checking this operating system for systemd... systemctl --version >/dev/null 2>&1 || { echo Automatic installation is only supported with systemd. echo You can still run Citadel but you will need to start it some other way. exit 3 } | exit 3 echo OK echo # Remove old unit files echo Checking for old startup files. ls /etc/systemd/system/citadel* 2>/dev/null && { rm -i /etc/systemd/system/citadel* } ls /etc/systemd/system/webcit* 2>/dev/null && { rm -i /etc/systemd/system/webcit* } echo OK echo # Clear the screen and draw the banner echo -e '\033[2J\033[H\033[44m\033[37m\033[K\033[0m' echo -e '\033[44m\033[37m\033[1m Citadel installation\033[K\033[0m' echo -e '\033[44m\033[37m \033[K\033[0m' echo echo Ready to install ${APPIMAGE} in ${CTDL_DIR} echo Copying the AppImage... rm -f ${CTDL_DIR}/citadel.appimage 2>/dev/null cp ${APPIMAGE} ${CTDL_DIR}/citadel.appimage || { echo Installation has failed with error code $? . exit 4 } | exit 4 echo Creating the systemd unit file... ( echo '# This unit file starts all Citadel services via the AppImage distribution.' echo '# Automatically installed on' `date` echo '' echo '[Unit]' echo 'Description=Citadel' echo 'After=network.target' echo '' echo '[Service]' echo 'ExecStart='${CTDL_DIR}'/citadel.appimage run -h '${CTDL_DIR}' -p '${HTTP_PORT}' -s '${HTTPS_PORT} echo 'ExecStop=/bin/kill $MAINPID' echo 'KillMode=process' echo 'Restart=on-failure' echo 'LimitCORE=infinity' echo '' echo '[Install]' echo 'WantedBy=multi-user.target' ) >/etc/systemd/system/citadel.service || { echo Installation has failed with error code $? . exit 5 } | exit 5 echo OK echo echo Enabling the service... systemctl enable citadel || { echo Installation has failed with error code $? . exit 6 } | exit 6 echo OK echo echo Starting the service... systemctl start citadel || { echo Installation has failed with error code $? . exit 6 } || exit 6 echo OK echo # Clear the screen and draw the banner echo -e '\033[2J\033[H\033[44m\033[37m\033[K\033[0m' echo -e '\033[44m\033[37m\033[1m Citadel installation\033[K\033[0m' echo -e '\033[44m\033[37m \033[K\033[0m' echo echo Installation has completed. echo Please continue by browsing to http://`hostname`:${HTTP_PORT} echo echo -e 'If this is a new installation, the default administrator' echo -e 'will be named \033[7madmin\033[0m with password \033[7mcitadel\033[0m.' exit } PARSED_ARGUMENTS=$(getopt -o h:p:s: -- "$@") VALID_ARGUMENTS=$? if [ "$VALID_ARGUMENTS" != "0" ]; then usage fi eval set -- ${PARSED_ARGUMENTS} while : do case ${1} in -h) CTDL_DIR=${2} ; shift 2 ;; -p) HTTP_PORT=${2} ; shift 2 ;; -s) HTTPS_PORT=${2} ; shift 2 ;; --) shift; break;; *) echo Unexpected option: ${1} usage; esac done case ${1} in run) export APPDIR CTDL_DIR HTTP_PORT HTTPS_PORT export LD_LIBRARY_PATH=$APPDIR/usr/lib export PATH=$APPDIR/usr/bin exec ctdlvisor $* ;; test) export LD_LIBRARY_PATH=$APPDIR/usr/lib export PATH=$APPDIR/usr/bin exec $APPDIR/usr/local/citadel/citserver -c ;; install) installation ;; client) exec $APPDIR/usr/bin/citadel ;; database_cleanup) export LD_LIBRARY_PATH=$APPDIR/usr/lib export PATH=$APPDIR/usr/bin:$PATH exec $APPDIR/usr/local/citadel/database_cleanup.sh -h $CTDL_DIR ;; migrate) export APPDIR CTDL_DIR HTTP_PORT HTTPS_PORT export LD_LIBRARY_PATH=$APPDIR/usr/lib export PATH=$APPDIR/usr/bin exec ctdlvisor -m ;; mount) echo This mode of operation mounts the AppImage but does not run anything. echo -n Kill it when you are finished... while true do sleep 1 done ;; debug) export LD_LIBRARY_PATH=$APPDIR/usr/lib export PATH=$APPDIR/usr/bin:$PATH exec $APPDIR/usr/local/citadel/citserver -x9 -h $CTDL_DIR ;; connect) export LD_LIBRARY_PATH=$APPDIR/usr/lib export PATH=$APPDIR/usr/bin:$PATH cd $APPDIR exec citadel $* ;; *) echo Unexpected command: ${1} usage exit 1 ;; esac exit 0