| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255 |
- #!/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
- }
|