Files
athens/scripts/systemd.sh
Marcel f969e03904 Remove hard coded values from SystemD Unit and installation (#1874)
Removes hardcoded values form our supplied SystemD Unit file and the installation script. Users, prior to installation, will need to ensure that their user, group, and permissions settings of where Athens stores data are correct.

Co-authored-by: Manu Gupta <manugupt1@gmail.com>
Co-authored-by: Matt <matt.ouille@protonmail.com>
2024-04-13 14:42:47 -07:00

171 lines
4.2 KiB
Bash
Executable File

#!/bin/bash -e
# This script manages installation using SystemD, if available, or SysV as a fall-back.
#
# Usage:
# systemd.sh [ install | remove | status | log ]
cd $(dirname $0)/..
[[ -n $VERSION ]] || export VERSION=unset
function ensureSystemdIsPresent
{
if [[ $( uname -s ) != "Linux" ]]; then
echo "SystemD can only be used on Linux systems."
exit 1
fi
id=$(uname -msn)
if command -v systemctl >/dev/null; then
echo -n "$id has "
systemctl --version | head -1
elif [ -d /etc/init.d ]; then
echo "$id has SysV."
else
echo "Neither SystemD nor SysV is available in this operating system."
lsb_release -a
exit 1
fi
}
# doInstallConfig installs the config file
function doInstallConfig
{
if [ ! -r config.toml ]; then
echo "Missing: config.toml"
echo "Copy & modify config.dev.toml as needed."
exit 1
fi
sudo mkdir -p /etc/athens
sudo install -v -o root -g root -m 644 config.toml /etc/athens
}
# doInstallBinary copies the Athens binary to /usr/local/bin with the necessary settings.
function doInstallBinary
{
[ -f athens ] || make athens
if [ ! -x /usr/local/bin/athens -o athens -nt /usr/local/bin/athens ]; then
[ -f /etc/systemd/system/athens.service ] && sudo systemctl stop athens
[ -f /etc/init.d/athens ] && sudo /etc/init.d/athens stop
sudo install -v -o root -g root athens /usr/local/bin
fi
# Give the athens binary the ability to bind to privileged ports (e.g. 80, 443) as a non-root user:
command -v setcap >/dev/null && sudo setcap 'cap_net_bind_service=+ep' /usr/local/bin/athens
}
# doInstallSystemd sets up the SystemD service unit.
function doInstallSystemd
{
local rootPath=$(sed -nr 's/(RootPath) = (".*")/\2/p' /etc/athens/config.toml | xargs)
sed -i "/ReadWritePaths/ s|=.*|=$rootPath|" scripts/service/athens.service
sudo install -v -o root -g root -m 644 scripts/service/athens.service /etc/systemd/system
sudo systemctl daemon-reload
sudo systemctl enable athens
sudo systemctl start athens
}
# doInstall builds and installs the binary as a SystemD unit
function doInstall
{
doInstallConfig
doInstallBinary
doInstallSystemd
}
# doRemove deletes the SystemD unit and cleans up log files etc
function doRemove
{
if [ -f /etc/systemd/system/athens.service ]; then
sudo systemctl stop athens
sudo rm -f /etc/systemd/system/athens.service
# Reset systemctl
sudo systemctl daemon-reload
echo "SystemD installation was removed."
elif [ -f /etc/init.d/athens ]; then
sudo service athens stop
sudo update-rc.d athens remove
sudo rm -f /etc/init.d/athens
echo "SysV installation was removed."
fi
sudo rm -rf /etc/athens /etc/ssl/athens /usr/local/bin/athens /var/log/athens.log /var/www/.athens
}
# doStatus shows what is installed, if anything, and whether it is running
function doStatus
{
if [ -x /usr/local/bin/athens ]; then
echo "Athens is /usr/local/bin/athens"
/usr/local/bin/athens --version
else
echo "Athens is absent (no /usr/local/bin/athens)."
exit 0
fi
if [ -f /etc/systemd/system/athens.service ]; then
echo
echo "SystemD: /etc/systemd/system/athens.service exists."
sudo systemctl status athens ||:
elif [ -f /etc/init.d/athens ]; then
echo
echo "SysV: /etc/init.d/athens exists."
sudo service athens status ||:
else
echo "Athens is not installed as a service."
fi
}
# showLog shows the relevant lines in syslog
function showLog
{
if [ -x /usr/local/bin/athens ]; then
echo "Athens is /usr/local/bin/athens"
/usr/local/bin/athens --version
else
echo "Athens is absent (no /usr/local/bin/athens)."
exit 0
fi
if [ -f /etc/systemd/system/athens.service ]; then
fgrep athens /var/log/syslog | fgrep "$(date '+%b %d')"
elif [ -f /etc/init.d/athens ]; then
fgrep athens /var/log/syslog | fgrep "$(date '+%b %d')"
else
echo "Athens is not installed as a service."
fi
}
### Main script ###doStatus
case $1 in
install)
ensureSystemdIsPresent; doInstall ;;
remove|uninstall)
ensureSystemdIsPresent; doRemove ;;
status)
ensureSystemdIsPresent; doStatus ;;
log)
ensureSystemdIsPresent; showLog ;;
*)
echo "Usage: $0 [ install | remove | status | log"
exit 1 ;;
esac