|
|
@@ -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
|
|
|
+}
|