install.sh 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. #!/bin/sh
  2. set -e
  3. GITHUB_URL="https://github.com/coroot/coroot-node-agent/releases"
  4. DOWNLOADER=
  5. SUDO=sudo
  6. if [ $(id -u) -eq 0 ]; then
  7. SUDO=
  8. fi
  9. BIN_DIR=/usr/bin
  10. SYSTEMD_DIR=/etc/systemd/system
  11. VERSION=
  12. SYSTEM_NAME=coroot-node-agent
  13. SYSTEMD_SERVICE=${SYSTEM_NAME}.service
  14. UNINSTALL_SH=${BIN_DIR}/${SYSTEM_NAME}-uninstall.sh
  15. FILE_SERVICE=${SYSTEMD_DIR}/${SYSTEMD_SERVICE}
  16. FILE_ENV=${SYSTEMD_DIR}/${SYSTEMD_SERVICE}.env
  17. 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)"
  18. info()
  19. {
  20. echo '[INFO] ' "$@"
  21. }
  22. fatal()
  23. {
  24. echo '[ERROR] ' "$@" >&2
  25. exit 1
  26. }
  27. verify_system() {
  28. if [ -x /bin/systemctl ] || type systemctl > /dev/null 2>&1; then
  29. return
  30. fi
  31. fatal 'Cannot find systemd'
  32. }
  33. verify_executable() {
  34. if [ ! -x ${BIN_DIR}/coroot-node-agent ]; then
  35. fatal "Executable coroot-node-agent binary not found at ${BIN_DIR}/coroot-node-agent"
  36. fi
  37. }
  38. verify_arch() {
  39. if [ -z "$ARCH" ]; then
  40. ARCH=$(uname -m)
  41. fi
  42. case $ARCH in
  43. amd64)
  44. ARCH=amd64
  45. ;;
  46. x86_64)
  47. ARCH=amd64
  48. ;;
  49. arm64)
  50. ARCH=arm64
  51. ;;
  52. aarch64)
  53. ARCH=arm64
  54. ;;
  55. *)
  56. fatal "Unsupported architecture $ARCH"
  57. esac
  58. }
  59. verify_downloader() {
  60. [ -x "$(command -v $1)" ] || return 1
  61. DOWNLOADER=$1
  62. return 0
  63. }
  64. setup_tmp() {
  65. TMP_DIR=$(mktemp -d -t coroot-agent-install.XXXXXXXXXX)
  66. TMP_BIN=${TMP_DIR}/coroot-node-agent
  67. cleanup() {
  68. code=$?
  69. set +e
  70. trap - EXIT
  71. rm -rf ${TMP_DIR}
  72. exit $code
  73. }
  74. trap cleanup INT EXIT
  75. }
  76. get_release_version() {
  77. info "Finding the latest release"
  78. latest_release_url=${GITHUB_URL}/latest
  79. case $DOWNLOADER in
  80. curl)
  81. VERSION=$(curl -w '%{url_effective}' -L -s -S ${latest_release_url} -o /dev/null | sed -e 's|.*/||')
  82. ;;
  83. wget)
  84. VERSION=$(wget -SqO /dev/null ${latest_release_url} 2>&1 | grep -i Location | sed -e 's|.*/||')
  85. ;;
  86. *)
  87. fatal "Incorrect downloader executable '$DOWNLOADER'"
  88. ;;
  89. esac
  90. info "The latest release is ${VERSION}"
  91. }
  92. download_binary() {
  93. info "Downloading binary"
  94. URL="${GITHUB_URL}/download/${VERSION}/coroot-node-agent-${ARCH}"
  95. set +e
  96. case $DOWNLOADER in
  97. curl)
  98. curl -o ${TMP_BIN} -sfL ${URL}
  99. ;;
  100. wget)
  101. wget -qO ${TMP_BIN} ${URL}
  102. ;;
  103. *)
  104. fatal "Incorrect executable '$DOWNLOADER'"
  105. ;;
  106. esac
  107. [ $? -eq 0 ] || fatal 'Download failed'
  108. set -e
  109. }
  110. setup_binary() {
  111. chmod 755 ${TMP_BIN}
  112. info "Installing coroot-node-agent to ${BIN_DIR}/coroot-node-agent"
  113. $SUDO chown root:root ${TMP_BIN}
  114. $SUDO mv -f ${TMP_BIN} ${BIN_DIR}/coroot-node-agent
  115. }
  116. download() {
  117. verify_arch
  118. verify_downloader curl || verify_downloader wget || fatal 'Can not find curl or wget for downloading files'
  119. setup_tmp
  120. get_release_version
  121. download_binary
  122. setup_binary
  123. }
  124. create_uninstall() {
  125. info "Creating uninstall script ${UNINSTALL_SH}"
  126. $SUDO tee ${UNINSTALL_SH} >/dev/null << EOF
  127. #!/bin/sh
  128. set -x
  129. [ \$(id -u) -eq 0 ] || exec sudo \$0 \$@
  130. systemctl stop ${SYSTEM_NAME}
  131. systemctl disable ${SYSTEM_NAME}
  132. systemctl reset-failed ${SYSTEM_NAME}
  133. systemctl daemon-reload
  134. rm -f ${FILE_SERVICE}
  135. rm -f ${FILE_ENV}
  136. remove_uninstall() {
  137. rm -f ${UNINSTALL_SH}
  138. }
  139. trap remove_uninstall EXIT
  140. rm -rf /var/lib/coroot-node-agent || true
  141. rm -f ${BIN_DIR}/coroot-node-agent
  142. EOF
  143. $SUDO chmod 755 ${UNINSTALL_SH}
  144. $SUDO chown root:root ${UNINSTALL_SH}
  145. }
  146. systemd_disable() {
  147. $SUDO systemctl disable ${SYSTEM_NAME} >/dev/null 2>&1 || true
  148. $SUDO rm -f ${FILE_SERVICE} || true
  149. $SUDO rm -f ${FILE_ENV} || true
  150. }
  151. create_env_file() {
  152. info "env: Creating environment file ${FILE_ENV}"
  153. $SUDO touch ${FILE_ENV}
  154. $SUDO chmod 0600 ${FILE_ENV}
  155. sh -c export | while read x v; do echo $v; done | grep -E ${ENV_VARS} | $SUDO tee ${FILE_ENV} >/dev/null
  156. }
  157. create_systemd_service_file() {
  158. info "systemd: Creating service file ${FILE_SERVICE}"
  159. $SUDO tee ${FILE_SERVICE} >/dev/null << EOF
  160. [Unit]
  161. Description=Coroot node agent
  162. Documentation=https://coroot.com
  163. Wants=network-online.target
  164. After=network-online.target
  165. [Install]
  166. WantedBy=multi-user.target
  167. [Service]
  168. Type=exec
  169. EnvironmentFile=-/etc/default/%N
  170. EnvironmentFile=-/etc/sysconfig/%N
  171. EnvironmentFile=-${FILE_ENV}
  172. KillMode=process
  173. Delegate=yes
  174. # Having non-zero Limit*s causes performance problems due to accounting overhead
  175. # in the kernel. We recommend using cgroups to do container-local accounting.
  176. LimitNOFILE=1048576
  177. LimitNPROC=infinity
  178. LimitCORE=infinity
  179. TasksMax=infinity
  180. TimeoutStartSec=0
  181. Restart=always
  182. RestartSec=5s
  183. ExecStart=${BIN_DIR}/coroot-node-agent
  184. EOF
  185. }
  186. create_service_file() {
  187. create_systemd_service_file
  188. return 0
  189. }
  190. get_installed_hashes() {
  191. $SUDO sha256sum ${BIN_DIR}/coroot-node-agent ${FILE_SERVICE} ${FILE_ENV} 2>&1 || true
  192. }
  193. systemd_enable() {
  194. info "systemd: Enabling ${SYSTEM_NAME} unit"
  195. $SUDO systemctl enable ${FILE_SERVICE} >/dev/null
  196. $SUDO systemctl daemon-reload >/dev/null
  197. }
  198. systemd_start() {
  199. info "systemd: Starting ${SYSTEM_NAME}"
  200. $SUDO systemctl restart ${SYSTEM_NAME}
  201. }
  202. service_enable_and_start() {
  203. systemd_enable
  204. POST_INSTALL_HASHES=$(get_installed_hashes)
  205. if [ "${PRE_INSTALL_HASHES}" = "${POST_INSTALL_HASHES}" ]; then
  206. info 'No change detected so skipping service start'
  207. return
  208. fi
  209. systemd_start
  210. return 0
  211. }
  212. {
  213. verify_system
  214. download
  215. create_uninstall
  216. systemd_disable
  217. create_env_file
  218. create_service_file
  219. service_enable_and_start
  220. }