Skip to content

Commit

Permalink
Merge pull request #76 from coroot/systemd_install
Browse files Browse the repository at this point in the history
Add script to install agent as a Systemd service
  • Loading branch information
def authored Apr 16, 2024
2 parents 23505d2 + f55e13d commit ca6fba4
Showing 1 changed file with 255 additions and 0 deletions.
255 changes: 255 additions & 0 deletions install.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,255 @@
#!/bin/sh
set -e

GITHUB_URL="https://github.com/coroot/coroot-node-agent/releases"
DOWNLOADER=
SUDO=sudo
if [ $(id -u) -eq 0 ]; then
SUDO=
fi

BIN_DIR=/usr/bin
SYSTEMD_DIR=/etc/systemd/system
VERSION=
SYSTEM_NAME=coroot-node-agent
SYSTEMD_SERVICE=${SYSTEM_NAME}.service
UNINSTALL_SH=${BIN_DIR}/${SYSTEM_NAME}-uninstall.sh
FILE_SERVICE=${SYSTEMD_DIR}/${SYSTEMD_SERVICE}
FILE_ENV=${SYSTEMD_DIR}/${SYSTEMD_SERVICE}.env
ENV_VARS="^(LISTEN|CGROUPFS_ROOT|DISABLE_LOG_PARSING|DISABLE_PINGER|DISABLE_L7_TRACING|TRACK_PUBLIC_NETWORK|EPHEMERAL_PORT_RANGE|PROVIDER|REGION|AVAILABILITY_ZONE|INSTANCE_TYPE|INSTANCE_LIFE_CYCLE|LOG_PER_SECOND|LOG_BURST|COLLECTOR_ENDPOINT|API_KEY|METRICS_ENDPOINT|TRACES_ENDPOINT|LOGS_ENDPOINT|PROFILES_ENDPOINT|SCRAPE_INTERVAL|WAL_DIR)"

info()
{
echo '[INFO] ' "$@"
}

fatal()
{
echo '[ERROR] ' "$@" >&2
exit 1
}

verify_system() {
if [ -x /bin/systemctl ] || type systemctl > /dev/null 2>&1; then
return
fi
fatal 'Cannot find systemd'
}

verify_executable() {
if [ ! -x ${BIN_DIR}/coroot-node-agent ]; then
fatal "Executable coroot-node-agent binary not found at ${BIN_DIR}/coroot-node-agent"
fi
}

verify_arch() {
if [ -z "$ARCH" ]; then
ARCH=$(uname -m)
fi
case $ARCH in
amd64)
ARCH=amd64
;;
x86_64)
ARCH=amd64
;;
arm64)
ARCH=arm64
;;
aarch64)
ARCH=arm64
;;
*)
fatal "Unsupported architecture $ARCH"
esac
}

verify_downloader() {
[ -x "$(command -v $1)" ] || return 1
DOWNLOADER=$1
return 0
}

setup_tmp() {
TMP_DIR=$(mktemp -d -t coroot-agent-install.XXXXXXXXXX)
TMP_BIN=${TMP_DIR}/coroot-node-agent
cleanup() {
code=$?
set +e
trap - EXIT
rm -rf ${TMP_DIR}
exit $code
}
trap cleanup INT EXIT
}

get_release_version() {
info "Finding the latest release"
latest_release_url=${GITHUB_URL}/latest
case $DOWNLOADER in
curl)
VERSION=$(curl -w '%{url_effective}' -L -s -S ${latest_release_url} -o /dev/null | sed -e 's|.*/||')
;;
wget)
VERSION=$(wget -SqO /dev/null ${latest_release_url} 2>&1 | grep -i Location | sed -e 's|.*/||')
;;
*)
fatal "Incorrect downloader executable '$DOWNLOADER'"
;;
esac
info "The latest release is ${VERSION}"
}

download_binary() {
info "Downloading binary"
URL="${GITHUB_URL}/download/${VERSION}/coroot-node-agent-${ARCH}"
set +e
case $DOWNLOADER in
curl)
curl -o ${TMP_BIN} -sfL ${URL}
;;
wget)
wget -qO ${TMP_BIN} ${URL}
;;
*)
fatal "Incorrect executable '$DOWNLOADER'"
;;
esac

[ $? -eq 0 ] || fatal 'Download failed'
set -e
}

setup_binary() {
chmod 755 ${TMP_BIN}
info "Installing coroot-node-agent to ${BIN_DIR}/coroot-node-agent"
$SUDO chown root:root ${TMP_BIN}
$SUDO mv -f ${TMP_BIN} ${BIN_DIR}/coroot-node-agent
}

download() {
verify_arch
verify_downloader curl || verify_downloader wget || fatal 'Can not find curl or wget for downloading files'
setup_tmp
get_release_version
download_binary
setup_binary
}


create_uninstall() {
info "Creating uninstall script ${UNINSTALL_SH}"
$SUDO tee ${UNINSTALL_SH} >/dev/null << EOF
#!/bin/sh
set -x
[ \$(id -u) -eq 0 ] || exec sudo \$0 \$@
systemctl stop ${SYSTEM_NAME}
systemctl disable ${SYSTEM_NAME}
systemctl reset-failed ${SYSTEM_NAME}
systemctl daemon-reload
rm -f ${FILE_SERVICE}
rm -f ${FILE_ENV}
remove_uninstall() {
rm -f ${UNINSTALL_SH}
}
trap remove_uninstall EXIT
rm -rf /var/lib/coroot-node-agent || true
rm -f ${BIN_DIR}/coroot-node-agent
EOF
$SUDO chmod 755 ${UNINSTALL_SH}
$SUDO chown root:root ${UNINSTALL_SH}
}

systemd_disable() {
$SUDO systemctl disable ${SYSTEM_NAME} >/dev/null 2>&1 || true
$SUDO rm -f ${FILE_SERVICE} || true
$SUDO rm -f ${FILE_ENV} || true
}

create_env_file() {
info "env: Creating environment file ${FILE_ENV}"
$SUDO touch ${FILE_ENV}
$SUDO chmod 0600 ${FILE_ENV}
sh -c export | while read x v; do echo $v; done | grep -E ${ENV_VARS} | $SUDO tee ${FILE_ENV} >/dev/null
}

create_systemd_service_file() {
info "systemd: Creating service file ${FILE_SERVICE}"
$SUDO tee ${FILE_SERVICE} >/dev/null << EOF
[Unit]
Description=Coroot node agent
Documentation=https://coroot.com
Wants=network-online.target
After=network-online.target
[Install]
WantedBy=multi-user.target
[Service]
Type=exec
EnvironmentFile=-/etc/default/%N
EnvironmentFile=-/etc/sysconfig/%N
EnvironmentFile=-${FILE_ENV}
KillMode=process
Delegate=yes
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=1048576
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
TimeoutStartSec=0
Restart=always
RestartSec=5s
ExecStart=${BIN_DIR}/coroot-node-agent
EOF
}

create_service_file() {
create_systemd_service_file
return 0
}

get_installed_hashes() {
$SUDO sha256sum ${BIN_DIR}/coroot-node-agent ${FILE_SERVICE} ${FILE_ENV} 2>&1 || true
}

systemd_enable() {
info "systemd: Enabling ${SYSTEM_NAME} unit"
$SUDO systemctl enable ${FILE_SERVICE} >/dev/null
$SUDO systemctl daemon-reload >/dev/null
}

systemd_start() {
info "systemd: Starting ${SYSTEM_NAME}"
$SUDO systemctl restart ${SYSTEM_NAME}
}


service_enable_and_start() {
systemd_enable

POST_INSTALL_HASHES=$(get_installed_hashes)
if [ "${PRE_INSTALL_HASHES}" = "${POST_INSTALL_HASHES}" ]; then
info 'No change detected so skipping service start'
return
fi

systemd_start

return 0
}

{
verify_system
download
create_uninstall
systemd_disable
create_env_file
create_service_file
service_enable_and_start
}

0 comments on commit ca6fba4

Please sign in to comment.