mirror of
https://github.com/gomods/athens
synced 2026-02-03 11:00:32 +00:00
* First implementation; older systemd is not yet supported; SysV is not supported at all * small correction * more documentation; manual testing confirms that Athens is working as a SystemD service * documentation updates * removed differences from author/master branch
174 lines
4.3 KiB
Bash
Executable File
174 lines
4.3 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
|
|
|
|
# if storage is on disk, this is where the database goes (see scripts/service/athens.service)
|
|
ATHENS_DISK_STORAGE_ROOT=/var/run/athens
|
|
sudo mkdir -p $ATHENS_DISK_STORAGE_ROOT
|
|
sudo chown www-data $ATHENS_DISK_STORAGE_ROOT
|
|
sudo chgrp www-data $ATHENS_DISK_STORAGE_ROOT
|
|
}
|
|
|
|
# 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
|
|
{
|
|
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
|