-
Notifications
You must be signed in to change notification settings - Fork 63
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #76 from coroot/systemd_install
Add script to install agent as a Systemd service
- Loading branch information
Showing
1 changed file
with
255 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
} |