#!/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, database_cleanup, migrate' exit 2 } # Permanently install the Citadel AppImage to this system installation() { clear echo 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 Installation cannot proceed while Citadel is running. echo Stop your services and try again. 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 Compatibility failed. exit 2 } ) echo OK 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 } 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 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 } 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 } echo OK echo echo Enabling the service... systemctl enable citadel || { echo Installation has failed with error code $? . exit 6 } echo OK echo echo Starting the service... systemctl start citadel || { echo Installation has failed with error code $? . exit 6 } echo OK echo echo Installation has completed. echo Please continue by browsing to http://`hostname`:${HTTP_PORT} 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 ;; 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 ;; *) echo Unexpected command: ${1} usage exit 1 ;; esac exit 0