Prechádzať zdrojové kódy

Add script to install agent as a Systemd service

Anton Petruhin 2 rokov pred
rodič
commit
f55e13dca3
1 zmenil súbory, kde vykonal 255 pridanie a 0 odobranie
  1. 255 0
      install.sh

+ 255 - 0
install.sh

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