diff options
Diffstat (limited to 'packaging/installer/kickstart-static64.sh')
-rwxr-xr-x | packaging/installer/kickstart-static64.sh | 303 |
1 files changed, 106 insertions, 197 deletions
diff --git a/packaging/installer/kickstart-static64.sh b/packaging/installer/kickstart-static64.sh index cd13c4190..3a6b2653e 100755 --- a/packaging/installer/kickstart-static64.sh +++ b/packaging/installer/kickstart-static64.sh @@ -1,238 +1,149 @@ #!/usr/bin/env sh # SPDX-License-Identifier: GPL-3.0-or-later -# shellcheck disable=SC1117,SC2016,SC2034,SC2039,SC2059,SC2086,SC2119,SC2120,SC2129,SC2162,SC2166,SC2181 +# shellcheck disable=SC1117,SC2039,SC2059,SC2086 -umask 022 - -# make sure UID is set -# shellcheck disable=SC2155 -[ -z "${UID}" ] && export UID="$(id -u)" +# External files +NIGHTLY_PACKAGE_TARBALL="https://storage.googleapis.com/netdata-nightlies/netdata-latest.gz.run" +NIGHTLY_PACKAGE_CHECKSUM="https://storage.googleapis.com/netdata-nightlies/sha256sums.txt" # --------------------------------------------------------------------------------------------------------------------- # library functions copied from packaging/installer/functions.sh -which_cmd() { - # shellcheck disable=SC2230 - which "${1}" 2>/dev/null || command -v "${1}" 2>/dev/null -} - -check_cmd() { - which_cmd "${1}" >/dev/null 2>&1 && return 0 - return 1 -} - setup_terminal() { - TPUT_RESET="" - TPUT_BLACK="" - TPUT_RED="" - TPUT_GREEN="" - TPUT_YELLOW="" - TPUT_BLUE="" - TPUT_PURPLE="" - TPUT_CYAN="" - TPUT_WHITE="" - TPUT_BGBLACK="" - TPUT_BGRED="" - TPUT_BGGREEN="" - TPUT_BGYELLOW="" - TPUT_BGBLUE="" - TPUT_BGPURPLE="" - TPUT_BGCYAN="" - TPUT_BGWHITE="" - TPUT_BOLD="" - TPUT_DIM="" - TPUT_UNDERLINED="" - TPUT_BLINK="" - TPUT_INVERTED="" - TPUT_STANDOUT="" - TPUT_BELL="" - TPUT_CLEAR="" - - # Is stderr on the terminal? If not, then fail - test -t 2 || return 1 - - if check_cmd tput - then - if [ $(( $(tput colors 2>/dev/null) )) -ge 8 ] - then - # Enable colors - TPUT_RESET="$(tput sgr 0)" - TPUT_BLACK="$(tput setaf 0)" - TPUT_RED="$(tput setaf 1)" - TPUT_GREEN="$(tput setaf 2)" - TPUT_YELLOW="$(tput setaf 3)" - TPUT_BLUE="$(tput setaf 4)" - TPUT_PURPLE="$(tput setaf 5)" - TPUT_CYAN="$(tput setaf 6)" - TPUT_WHITE="$(tput setaf 7)" - TPUT_BGBLACK="$(tput setab 0)" - TPUT_BGRED="$(tput setab 1)" - TPUT_BGGREEN="$(tput setab 2)" - TPUT_BGYELLOW="$(tput setab 3)" - TPUT_BGBLUE="$(tput setab 4)" - TPUT_BGPURPLE="$(tput setab 5)" - TPUT_BGCYAN="$(tput setab 6)" - TPUT_BGWHITE="$(tput setab 7)" - TPUT_BOLD="$(tput bold)" - TPUT_DIM="$(tput dim)" - TPUT_UNDERLINED="$(tput smul)" - TPUT_BLINK="$(tput blink)" - TPUT_INVERTED="$(tput rev)" - TPUT_STANDOUT="$(tput smso)" - TPUT_BELL="$(tput bel)" - TPUT_CLEAR="$(tput clear)" - fi - fi - - return 0 + TPUT_RESET="" + TPUT_YELLOW="" + TPUT_WHITE="" + TPUT_BGRED="" + TPUT_BGGREEN="" + TPUT_BOLD="" + TPUT_DIM="" + + # Is stderr on the terminal? If not, then fail + test -t 2 || return 1 + + if command -v tput >/dev/null 2>&1; then + if [ $(($(tput colors 2>/dev/null))) -ge 8 ]; then + # Enable colors + TPUT_RESET="$(tput sgr 0)" + TPUT_YELLOW="$(tput setaf 3)" + TPUT_WHITE="$(tput setaf 7)" + TPUT_BGRED="$(tput setab 1)" + TPUT_BGGREEN="$(tput setab 2)" + TPUT_BOLD="$(tput bold)" + TPUT_DIM="$(tput dim)" + fi + fi + + return 0 } -setup_terminal || echo >/dev/null progress() { - echo >&2 " --- ${TPUT_DIM}${TPUT_BOLD}${*}${TPUT_RESET} --- " -} - -run_ok() { - printf >&2 "${TPUT_BGGREEN}${TPUT_WHITE}${TPUT_BOLD} OK ${TPUT_RESET} ${*} \n\n" -} - -run_failed() { - printf >&2 "${TPUT_BGRED}${TPUT_WHITE}${TPUT_BOLD} FAILED ${TPUT_RESET} ${*} \n\n" + echo >&2 " --- ${TPUT_DIM}${TPUT_BOLD}${*}${TPUT_RESET} --- " } -ESCAPED_PRINT_METHOD= -printf "%q " test >/dev/null 2>&1 -[ $? -eq 0 ] && ESCAPED_PRINT_METHOD="printfq" escaped_print() { - if [ "${ESCAPED_PRINT_METHOD}" = "printfq" ] - then - printf "%q " "${@}" - else - printf "%s" "${*}" - fi - return 0 + if printf "%q " test >/dev/null 2>&1; then + printf "%q " "${@}" + else + printf "%s" "${*}" + fi + return 0 } -run_logfile="/dev/null" run() { - local user="${USER--}" dir="${PWD}" info info_console - - if [ "${UID}" = "0" ] - then - info="[root ${dir}]# " - info_console="[${TPUT_DIM}${dir}${TPUT_RESET}]# " - else - info="[${user} ${dir}]$ " - info_console="[${TPUT_DIM}${dir}${TPUT_RESET}]$ " - fi - - printf >> "${run_logfile}" "${info}" - escaped_print >> "${run_logfile}" "${@}" - printf >> "${run_logfile}" " ... " - - printf >&2 "${info_console}${TPUT_BOLD}${TPUT_YELLOW}" - escaped_print >&2 "${@}" - printf >&2 "${TPUT_RESET}\n" - - "${@}" - - local ret=$? - if [ ${ret} -ne 0 ] - then - run_failed - printf >> "${run_logfile}" "FAILED with exit code ${ret}\n" - else - run_ok - printf >> "${run_logfile}" "OK\n" - fi - - return ${ret} -} + local dir="${PWD}" info_console + if [ "${UID}" = "0" ]; then + info_console="[${TPUT_DIM}${dir}${TPUT_RESET}]# " + else + info_console="[${TPUT_DIM}${dir}${TPUT_RESET}]$ " + fi -# --------------------------------------------------------------------------------------------------------------------- + escaped_print "${info_console}${TPUT_BOLD}${TPUT_YELLOW}" "${@}" "${TPUT_RESET}\n" >&2 -fatal() { - printf >&2 "${TPUT_BGRED}${TPUT_WHITE}${TPUT_BOLD} ABORTED ${TPUT_RESET} ${*} \n\n" - exit 1 + "${@}" + + local ret=$? + if [ ${ret} -ne 0 ]; then + printf >&2 "${TPUT_BGRED}${TPUT_WHITE}${TPUT_BOLD} FAILED ${TPUT_RESET} ${*} \n\n" + else + printf >&2 "${TPUT_BGGREEN}${TPUT_WHITE}${TPUT_BOLD} OK ${TPUT_RESET} ${*} \n\n" + fi + + return ${ret} } # --------------------------------------------------------------------------------------------------------------------- -if [ "$(uname -m)" != "x86_64" ] - then - fatal "Static binary versions of netdata are available only for 64bit Intel/AMD CPUs (x86_64), but yours is: $(uname -m)." -fi +fatal() { + printf >&2 "${TPUT_BGRED}${TPUT_WHITE}${TPUT_BOLD} ABORTED ${TPUT_RESET} ${*} \n\n" + exit 1 +} -if [ "$(uname -s)" != "Linux" ] - then - fatal "Static binary versions of netdata are available only for Linux, but this system is $(uname -s)" -fi +download() { + url="${1}" + dest="${2}" + if command -v curl >/dev/null 2>&1; then + run curl -L --connect-timeout 5 --retry 3 "${url}" >"${dest}" || fatal "Cannot download ${url}" + elif command -v wget >/dev/null 2>&1; then + run wget -T 15 -O - "${url}" >"${dest}" || fatal "Cannot download ${url}" + else + fatal "I need curl or wget to proceed, but neither is available on this system." + fi +} -curl="$(which_cmd curl)" -wget="$(which_cmd wget)" +umask 022 -# --------------------------------------------------------------------------------------------------------------------- +sudo="" +[ -z "${UID}" ] && UID="$(id -u)" +[ "${UID}" -ne "0" ] && sudo="sudo" -progress "Checking the latest version of static build..." +setup_terminal || echo >/dev/null -BASE='https://raw.githubusercontent.com/netdata/binary-packages/master' +# --------------------------------------------------------------------------------------------------------------------- -LATEST= -if [ ! -z "${curl}" -a -x "${curl}" ] -then - LATEST="$(run ${curl} "${BASE}/netdata-latest.gz.run")" -elif [ ! -z "${wget}" -a -x "${wget}" ] -then - LATEST="$(run ${wget} -O - "${BASE}/netdata-latest.gz.run")" -else - fatal "curl or wget are needed for this script to work." +if [ "$(uname -m)" != "x86_64" ]; then + fatal "Static binary versions of netdata are available only for 64bit Intel/AMD CPUs (x86_64), but yours is: $(uname -m)." fi -if [ -z "${LATEST}" ] - then - fatal "Cannot find the latest static binary version of netdata." +if [ "$(uname -s)" != "Linux" ]; then + fatal "Static binary versions of netdata are available only for Linux, but this system is $(uname -s)" fi # --------------------------------------------------------------------------------------------------------------------- -progress "Downloading static netdata binary: ${LATEST}" - -ret=1 -if [ ! -z "${curl}" -a -x "${curl}" ] -then - run ${curl} "${BASE}/${LATEST}" >"/tmp/${LATEST}" - ret=$? -elif [ ! -z "${wget}" -a -x "${wget}" ] -then - run ${wget} -O "/tmp/${LATEST}" "${BASE}/${LATEST}" - ret=$? +# Check if tmp is mounted as noexec +if grep -Eq '^[^ ]+ /tmp [^ ]+ ([^ ]*,)?noexec[, ]' /proc/mounts; then + pattern="$(pwd)/netdata-kickstart-static-XXXXXX" else - fatal "curl or wget are needed for this script to work." + pattern="/tmp/netdata-kickstart-static-XXXXXX" fi -if [ ${ret} -ne 0 -o ! -s "/tmp/${LATEST}" ] - then - fatal "Failed to download the latest static binary version of netdata." +tmpdir="$(mktemp -d $pattern)" +cd "${tmpdir}" || : + +progress "Downloading static netdata binary: ${NIGHTLY_PACKAGE_TARBALL}" + +download "${NIGHTLY_PACKAGE_CHECKSUM}" "${tmpdir}/sha256sum.txt" +download "${NIGHTLY_PACKAGE_TARBALL}" "${tmpdir}/netdata-latest.gz.run" +if ! grep netdata-latest.gz.run sha256sum.txt | sha256sum --check - >/dev/null 2>&1; then + failed "Static binary checksum validation failed. Stopping netdata installation and leaving binary in ${tmpdir}" fi # --------------------------------------------------------------------------------------------------------------------- opts= inner_opts= -while [ ! -z "${1}" ] -do - if [ "${1}" = "--dont-wait" -o "${1}" = "--non-interactive" -o "${1}" = "--accept" ] - then - opts="${opts} --accept" - elif [ "${1}" = "--dont-start-it" ] - then - inner_opts="${inner_opts} ${1}" - else - echo >&2 "Unknown option '${1}'" - exit 1 - fi - shift +while [ ! -z "${1}" ]; do + if [ "${1}" = "--dont-wait" ] || [ "${1}" = "--non-interactive" ] || [ "${1}" = "--accept" ]; then + opts="${opts} --accept" + elif [ "${1}" = "--dont-start-it" ]; then + inner_opts="${inner_opts} ${1}" + else + echo >&2 "Unknown option '${1}'" + exit 1 + fi + shift done [ ! -z "${inner_opts}" ] && inner_opts="-- ${inner_opts}" @@ -240,13 +151,11 @@ done progress "Installing netdata" -sudo= -[ "${UID}" != "0" ] && sudo="sudo" -run ${sudo} sh "/tmp/${LATEST}" ${opts} ${inner_opts} +run ${sudo} sh "${tmpdir}/netdata-latest.gz.run" ${opts} ${inner_opts} -if [ $? -eq 0 ] - then - rm "/tmp/${LATEST}" +#shellcheck disable=SC2181 +if [ $? -eq 0 ]; then + rm "${tmpdir}/netdata-latest.gz.run" else - echo >&2 "NOTE: did not remove: /tmp/${LATEST}" + echo >&2 "NOTE: did not remove: ${tmpdir}/netdata-latest.gz.run" fi |