summaryrefslogtreecommitdiffstats
path: root/packaging/installer/kickstart-ng.sh
diff options
context:
space:
mode:
Diffstat (limited to 'packaging/installer/kickstart-ng.sh')
-rw-r--r--packaging/installer/kickstart-ng.sh1362
1 files changed, 1362 insertions, 0 deletions
diff --git a/packaging/installer/kickstart-ng.sh b/packaging/installer/kickstart-ng.sh
new file mode 100644
index 000000000..8fcc6d5d3
--- /dev/null
+++ b/packaging/installer/kickstart-ng.sh
@@ -0,0 +1,1362 @@
+#!/bin/sh
+#
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+# ======================================================================
+# Constants
+
+KICKSTART_OPTIONS="${*}"
+PACKAGES_SCRIPT="https://raw.githubusercontent.com/netdata/netdata/master/packaging/installer/install-required-packages.sh"
+PATH="${PATH}:/usr/local/bin:/usr/local/sbin"
+REPOCONFIG_URL_PREFIX="https://packagecloud.io/netdata/netdata-repoconfig/packages"
+REPOCONFIG_VERSION="1-1"
+TELEMETRY_URL="https://posthog.netdata.cloud/capture/"
+START_TIME="$(date +%s)"
+
+# ======================================================================
+# Defaults for environment variables
+
+SELECTED_INSTALL_METHOD="none"
+INSTALL_TYPE="unknown"
+INSTALL_PREFIX=""
+NETDATA_AUTO_UPDATES="1"
+NETDATA_CLAIM_ONLY=0
+NETDATA_CLAIM_URL="https://app.netdata.cloud"
+NETDATA_DISABLE_CLOUD=0
+NETDATA_ONLY_BUILD=0
+NETDATA_ONLY_NATIVE=0
+NETDATA_ONLY_STATIC=0
+NETDATA_REQUIRE_CLOUD=1
+RELEASE_CHANNEL="nightly"
+
+NETDATA_DISABLE_TELEMETRY="${DO_NOT_TRACK:-0}"
+NETDATA_TARBALL_BASEURL="${NETDATA_TARBALL_BASEURL:-https://storage.googleapis.com/netdata-nightlies}"
+NETDATA_INSTALLER_OPTIONS="${NETDATA_INSTALLER_OPTIONS:-""}"
+TELEMETRY_API_KEY="${NETDATA_POSTHOG_API_KEY:-mqkwGT0JNFqO-zX2t0mW6Tec9yooaVu7xCBlXtHnt5Y}"
+
+if [ ! -t 1 ]; then
+ INTERACTIVE=0
+else
+ INTERACTIVE=1
+fi
+
+# ======================================================================
+# Usage info
+
+usage() {
+ cat << HEREDOC
+USAGE: kickstart.sh [options]
+ where options include:
+
+ --non-interactive Do not prompt for user input. (default: prompt if there is a controlling terminal)
+ --interactive Prompt for user input even if there is no controlling terminal.
+ --dont-start-it Do not start the agent by default (only for static installs or local builds)
+ --stable-channel Install a stable version instead of a nightly build (default: install a nightly build)
+ --nightly-channel Install a nightly build instead of a stable version
+ --no-updates Do not enable automatic updates (default: enable automatic updates)
+ --auto-update Enable automatic updates.
+ --disable-telemetry Opt-out of anonymous statistics.
+ --native-only Only install if native binary packages are available.
+ --static-only Only install if a static build is available.
+ --build-only Only install using a local build.
+ --reinstall Explicitly reinstall instead of updating any existing install.
+ --reinstall-even-if-unsafe Even try to reinstall if we don't think we can do so safely (implies --reinstall).
+ --disable-cloud Disable support for Netdata Cloud (default: detect)
+ --require-cloud Only install if Netdata Cloud can be enabled. Overrides --disable-cloud.
+ --install <path> Specify an installation prefix for local builds (default: autodetect based on system type).
+ --claim-token Use a specified token for claiming to Netdata Cloud.
+ --claim-rooms When claiming, add the node to the specified rooms.
+ --claim-only If there is an existing install, only try to claim it, not update it.
+ --claim-* Specify other options for the claiming script.
+ --no-cleanup Don't do any cleanup steps. This is intended to help with debugging the installer.
+
+Additionally, this script may use the following environment variables:
+
+ TMPDIR: Used to specify where to put temporary files. On most systems, the default we select
+ automatically should be fine. The user running the script needs to both be able to
+ write files to the temporary directory, and run files from that location.
+ ROOTCMD: Used to specify a command to use to run another command with root privileges if needed. By
+ default we try to use sudo, doas, or pkexec (in that order of preference), but if
+ you need special options for one of those to work, or have a different tool to do
+ the same thing on your system, you can specify it here.
+ DO_NOT_TRACK If set to a value other than 0, behave as if \`--disable-telemetry\` was specified.
+ NETDATA_INSTALLER_OPTIONS: Specifies extra options to pass to the static installer or local build script.
+
+HEREDOC
+}
+
+# ======================================================================
+# Telemetry functions
+
+telemetry_event() {
+ if [ "${NETDATA_DISABLE_TELEMETRY}" -eq 1 ]; then
+ return 0
+ fi
+
+ now="$(date +%s)"
+ total_duration="$((now - START_TIME))"
+
+ if [ -e "/etc/os-release" ]; then
+ eval "$(grep -E "^(NAME|ID|ID_LIKE|VERSION|VERSION_ID)=" < /etc/os-release | sed 's/^/HOST_/')"
+ fi
+
+ if [ -z "${HOST_NAME}" ] || [ -z "${HOST_VERSION}" ] || [ -z "${HOST_ID}" ]; then
+ if [ -f "/etc/lsb-release" ]; then
+ DISTRIB_ID="unknown"
+ DISTRIB_RELEASE="unknown"
+ DISTRIB_CODENAME="unknown"
+ eval "$(grep -E "^(DISTRIB_ID|DISTRIB_RELEASE|DISTRIB_CODENAME)=" < /etc/lsb-release)"
+ if [ -z "${HOST_NAME}" ]; then HOST_NAME="${DISTRIB_ID}"; fi
+ if [ -z "${HOST_VERSION}" ]; then HOST_VERSION="${DISTRIB_RELEASE}"; fi
+ if [ -z "${HOST_ID}" ]; then HOST_ID="${DISTRIB_CODENAME}"; fi
+ fi
+ fi
+
+ KERNEL_NAME="$(uname -s)"
+
+ if [ "${KERNEL_NAME}" = FreeBSD ]; then
+ TOTAL_RAM="$(sysctl -n hw.physmem)"
+ elif [ "${KERNEL_NAME}" = Darwin ]; then
+ TOTAL_RAM="$(sysctl -n hw.memsize)"
+ elif [ -r /proc/meminfo ]; then
+ TOTAL_RAM="$(grep -F MemTotal /proc/meminfo | cut -f 2 -d ':' | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//' | cut -f 1 -d ' ')"
+ TOTAL_RAM="$((TOTAL_RAM * 1024))"
+ fi
+
+ if [ -f /etc/machine-id ]; then
+ DISTINCT_ID="$(cat /etc/machine-id)"
+ elif command -v uuidgen > /dev/null 2>&1; then
+ DISTINCT_ID="$(uuidgen)"
+ else
+ DISTINCT_ID="null"
+ fi
+
+ REQ_BODY="$(cat << EOF
+{
+ "api_key": "${TELEMETRY_API_KEY}",
+ "event": "${1}",
+ "properties": {
+ "distinct_id": "${DISTINCT_ID}",
+ "event_source": "agent installer",
+ "\$current_url": "agent installer",
+ "\$pathname": "netdata-installer",
+ "\$host": "installer.netdata.io",
+ "\$ip": "127.0.0.1",
+ "script_variant": "kickstart-ng",
+ "error_code": "${3}",
+ "error_message": "${2}",
+ "install_options": "${KICKSTART_OPTIONS}",
+ "total_runtime": "${total_duration}",
+ "selected_install_method": "${SELECTED_INSTALL_METHOD}",
+ "netdata_release_channel": "${RELEASE_CHANNEL:-null}",
+ "netdata_install_type": "${INSTALL_TYPE}",
+ "host_os_name": "${HOST_NAME:-unknown}",
+ "host_os_id": "${HOST_ID:-unknown}",
+ "host_os_id_like": "${HOST_ID_LIKE:-unknown}",
+ "host_os_version": "${HOST_VERSION:-unknown}",
+ "host_os_version_id": "${HOST_VERSION_ID:-unknown}",
+ "system_kernel_name": "${KERNEL_NAME}",
+ "system_kernel_version": "$(uname -r)",
+ "system_architecture": "$(uname -m)",
+ "system_total_ram": "${TOTAL_RAM:-unknown}"
+ }
+}
+EOF
+)"
+
+ if [ -n "$(command -v curl 2> /dev/null)" ]; then
+ curl --silent -o /dev/null -X POST --max-time 2 --header "Content-Type: application/json" -d "${REQ_BODY}" "${TELEMETRY_URL}" > /dev/null
+ else
+ wget -q -O - --no-check-certificate \
+ --method POST \
+ --timeout=1 \
+ --header 'Content-Type: application/json' \
+ --body-data "${REQ_BODY}" \
+ "${TELEMETRY_URL}" > /dev/null
+ fi
+}
+
+trap_handler() {
+ code="${1}"
+ lineno="${2}"
+
+ printf >&2 "%s\n\n" "${TPUT_BGRED}${TPUT_WHITE}${TPUT_BOLD} ERROR ${TPUT_RESET} Installer exited unexpectedly (${code}-${lineno})"
+
+ telemetry_event INSTALL_CRASH "Installer exited unexpectedly (${code}-${lineno})" "E${code}-${lineno}"
+
+ trap - EXIT
+
+ cleanup
+
+ exit 1
+}
+
+trap 'trap_handler 0 ${LINENO}' EXIT
+trap 'trap_handler 1 0' HUP
+trap 'trap_handler 2 0' INT
+trap 'trap_handler 3 0' QUIT
+trap 'trap_handler 13 0' PIPE
+trap 'trap_handler 15 0' TERM
+
+# ======================================================================
+# Utility functions
+
+setup_terminal() {
+ TPUT_RESET=""
+ 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_WHITE="$(tput setaf 7)"
+ TPUT_BGRED="$(tput setab 1)"
+ TPUT_BGGREEN="$(tput setab 2)"
+ TPUT_BOLD="$(tput bold)"
+ TPUT_DIM="$(tput dim)"
+ fi
+ fi
+
+ echo "${TPUT_RESET}"
+
+ return 0
+}
+
+cleanup() {
+ if [ -z "${NO_CLEANUP}" ]; then
+ ${ROOTCMD} rm -rf "${tmpdir}"
+ fi
+}
+
+fatal() {
+ printf >&2 "%s\n\n" "${TPUT_BGRED}${TPUT_WHITE}${TPUT_BOLD} ABORTED ${TPUT_RESET} ${*}"
+ telemetry_event "INSTALL_FAILED" "${1}" "${2}"
+ cleanup
+ trap - EXIT
+ exit 1
+}
+
+run_ok() {
+ printf >&2 "%s\n\n" "${TPUT_BGGREEN}${TPUT_WHITE}${TPUT_BOLD} OK ${TPUT_RESET}"
+}
+
+run_failed() {
+ printf >&2 "%s\n\n" "${TPUT_BGRED}${TPUT_WHITE}${TPUT_BOLD} FAILED ${TPUT_RESET}"
+}
+
+ESCAPED_PRINT_METHOD=
+# shellcheck disable=SC3050
+if printf "%q " test > /dev/null 2>&1; then
+ ESCAPED_PRINT_METHOD="printfq"
+fi
+
+escaped_print() {
+ if [ "${ESCAPED_PRINT_METHOD}" = "printfq" ]; then
+ # shellcheck disable=SC3050
+ printf "%q " "${@}"
+ else
+ printf "%s" "${*}"
+ fi
+ return 0
+}
+
+progress() {
+ echo >&2 " --- ${TPUT_BOLD}${*}${TPUT_RESET} --- "
+}
+
+run_logfile="/dev/null"
+run() {
+ user="${USER--}"
+ dir="${PWD}"
+
+ if [ "$(id -u)" = "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 "%s" "${info}"
+ escaped_print "${@}"
+ printf " ... "
+ } >> "${run_logfile}"
+
+ printf >&2 "%s" "${info_console}${TPUT_BOLD}"
+ escaped_print >&2 "${@}"
+ printf >&2 "%s\n" "${TPUT_RESET}"
+
+ "${@}"
+
+ ret=$?
+ if [ ${ret} -ne 0 ]; then
+ run_failed
+ printf "%s\n" "FAILED with exit code ${ret}" >> "${run_logfile}"
+ else
+ run_ok
+ printf "OK\n" >> "${run_logfile}"
+ fi
+
+ return ${ret}
+}
+
+warning() {
+ printf >&2 "%s\n\n" "${TPUT_BGRED}${TPUT_WHITE}${TPUT_BOLD} WARNING ${TPUT_RESET} ${*}"
+}
+
+_cannot_use_tmpdir() {
+ testfile="$(TMPDIR="${1}" mktemp -q -t netdata-test.XXXXXXXXXX)"
+ ret=0
+
+ if [ -z "${testfile}" ]; then
+ return "${ret}"
+ fi
+
+ if printf '#!/bin/sh\necho SUCCESS\n' > "${testfile}"; then
+ if chmod +x "${testfile}"; then
+ if [ "$("${testfile}")" = "SUCCESS" ]; then
+ ret=1
+ fi
+ fi
+ fi
+
+ rm -f "${testfile}"
+ return "${ret}"
+}
+
+create_tmp_directory() {
+ if [ -z "${TMPDIR}" ] || _cannot_use_tmpdir "${TMPDIR}"; then
+ if _cannot_use_tmpdir /tmp; then
+ if _cannot_use_tmpdir "${PWD}"; then
+ fatal "Unable to find a usable temporary directory. Please set \$TMPDIR to a path that is both writable and allows execution of files and try again." F0400
+ else
+ TMPDIR="${PWD}"
+ fi
+ else
+ TMPDIR="/tmp"
+ fi
+ fi
+
+ mktemp -d -t netdata-kickstart-XXXXXXXXXX
+}
+
+download() {
+ url="${1}"
+ dest="${2}"
+ if command -v curl > /dev/null 2>&1; then
+ run curl -q -sSL --connect-timeout 10 --retry 3 --output "${dest}" "${url}" || return 1
+ elif command -v wget > /dev/null 2>&1; then
+ run wget -T 15 -O "${dest}" "${url}" || return 1
+ else
+ fatal "I need curl or wget to proceed, but neither of them are available on this system." F0003
+ fi
+}
+
+get_redirect() {
+ url="${1}"
+
+ if command -v curl > /dev/null 2>&1; then
+ run sh -c "curl ${url} -s -L -I -o /dev/null -w '%{url_effective}' | grep -o '[^/]*$'" || return 1
+ elif command -v wget > /dev/null 2>&1; then
+ run sh -c "wget --max-redirect=0 ${url} 2>&1 | grep Location | cut -d ' ' -f2 | grep -o '[^/]*$'" || return 1
+ else
+ fatal "I need curl or wget to proceed, but neither of them are available on this system." F0003
+ fi
+}
+
+safe_sha256sum() {
+ # Within the context of the installer, we only use -c option that is common between the two commands
+ # We will have to reconsider if we start using non-common options
+ if command -v sha256sum > /dev/null 2>&1; then
+ sha256sum "$@"
+ elif command -v shasum > /dev/null 2>&1; then
+ shasum -a 256 "$@"
+ else
+ fatal "I could not find a suitable checksum binary to use" F0004
+ fi
+}
+
+get_system_info() {
+ case "$(uname -s)" in
+ Linux)
+ SYSTYPE="Linux"
+
+ os_release_file=
+ if [ -s "/etc/os-release" ] && [ -r "/etc/os-release" ]; then
+ os_release_file="/etc/os-release"
+ elif [ -s "/usr/lib/os-release" ] && [ -r "/usr/lib/os-release" ]; then
+ os_release_file="/usr/lib/os-release"
+ else
+ fatal "Cannot find an os-release file ..." F0401
+ fi
+
+ # shellcheck disable=SC1090
+ . "${os_release_file}"
+
+ DISTRO="${ID}"
+ SYSVERSION="${VERSION_ID}"
+ SYSCODENAME="${VERSION_CODENAME}"
+ SYSARCH="$(uname -m)"
+
+ supported_compat_names="debian ubuntu centos fedora opensuse"
+
+ if str_in_list "${DISTRO}" "${supported_compat_names}"; then
+ DISTRO_COMPAT_NAME="${DISTRO}"
+ else
+ case "${DISTRO}" in
+ opensuse-leap)
+ DISTRO_COMPAT_NAME="opensuse"
+ ;;
+ rhel)
+ DISTRO_COMPAT_NAME="centos"
+ ;;
+ *)
+ DISTRO_COMPAT_NAME="unknown"
+ ;;
+ esac
+ fi
+ ;;
+ Darwin)
+ SYSTYPE="Darwin"
+ SYSVERSION="$(sw_vers -buildVersion)"
+ SYSARCH="$(uname -m)"
+ ;;
+ FreeBSD)
+ SYSTYPE="FreeBSD"
+ SYSVERSION="$(uname -K)"
+ SYSARCH="$(uname -m)"
+ ;;
+ *)
+ fatal "Unsupported system type detected. Netdata cannot be installed on this system using this script." F0200
+ ;;
+ esac
+}
+
+str_in_list() {
+ printf "%s\n" "${2}" | tr ' ' "\n" | grep -qE "^${1}\$"
+ return $?
+}
+
+confirm_root_support() {
+ if [ "$(id -u)" -ne "0" ]; then
+ if [ -z "${ROOTCMD}" ] && command -v sudo > /dev/null; then
+ ROOTCMD="sudo"
+ fi
+
+ if [ -z "${ROOTCMD}" ] && command -v doas > /dev/null; then
+ ROOTCMD="doas"
+ fi
+
+ if [ -z "${ROOTCMD}" ] && command -v pkexec > /dev/null; then
+ ROOTCMD="pkexec"
+ fi
+
+ if [ -z "${ROOTCMD}" ]; then
+ fatal "We need root privileges to continue, but cannot find a way to gain them. Either re-run this script as root, or set \$ROOTCMD to a command that can be used to gain root privileges" F0201
+ fi
+ fi
+}
+
+confirm() {
+ prompt="${1} [y/n]"
+
+ while true; do
+ echo "${prompt}"
+ read -r yn
+
+ case "$yn" in
+ [Yy]*) return 0;;
+ [Nn]*) return 1;;
+ *) echo "Please answer yes or no.";;
+ esac
+ done
+}
+
+# ======================================================================
+# Existing install handling code
+
+update() {
+ updater="${ndprefix}/usr/libexec/netdata/netdata-updater.sh"
+
+ if [ -x "${updater}" ]; then
+ if run ${ROOTCMD} "${updater}" --not-running-from-cron; then
+ progress "Updated existing install at ${ndprefix}"
+ return 0
+ else
+ fatal "Failed to update existing Netdata install at ${ndprefix}" F0100
+ fi
+ else
+ return 1
+ fi
+}
+
+handle_existing_install() {
+ if pkg_installed netdata; then
+ ndprefix="/"
+ else
+ if [ -n "${INSTALL_PREFIX}" ]; then
+ searchpath="${INSTALL_PREFIX}/bin:${INSTALL_PREFIX}/sbin:${INSTALL_PREFIX}/usr/bin:${INSTALL_PREFIX}/usr/sbin:${PATH}"
+ searchpath="${INSTALL_PREFIX}/netdata/bin:${INSTALL_PREFIX}/netdata/sbin:${INSTALL_PREFIX}/netdata/usr/bin:${INSTALL_PREFIX}/netdata/usr/sbin:${searchpath}"
+ else
+ searchpath="${PATH}"
+ fi
+
+ ndpath="$(PATH="${searchpath}" command -v netdata 2>/dev/null)"
+
+ if [ -z "$ndpath" ] && [ -x /opt/netdata/bin/netdata ]; then
+ ndpath="/opt/netdata/bin/netdata"
+ fi
+
+ if [ -n "${ndpath}" ]; then
+ ndprefix="$(dirname "$(dirname "${ndpath}")")"
+ fi
+
+ if echo "${ndprefix}" | grep -Eq '/usr$'; then
+ ndprefix="$(dirname "${ndprefix}")"
+ fi
+ fi
+
+ if [ -n "${ndprefix}" ]; then
+ typefile="${ndprefix}/etc/netdata/.install-type"
+ if [ -r "${typefile}" ]; then
+ ${ROOTCMD} sh -c "cat \"${typefile}\" > \"${tmpdir}/install-type\""
+ # shellcheck disable=SC1091
+ . "${tmpdir}/install-type"
+ else
+ INSTALL_TYPE="unknown"
+ fi
+ fi
+
+ if [ -z "${ndprefix}" ]; then
+ progress "No existing installations of netdata found, assuming this is a fresh install."
+ return 0
+ fi
+
+ case "${INSTALL_TYPE}" in
+ kickstart-*|legacy-*|binpkg-*|manual-static|unknown)
+ if [ "${INSTALL_TYPE}" = "unknown" ]; then
+ warning "Found an existing netdata install at ${ndprefix}, but could not determine the install type."
+ else
+ progress "Found an existing netdata install at ${ndprefix}, with installation type '${INSTALL_TYPE}'."
+ fi
+
+ if [ -n "${NETDATA_REINSTALL}" ] || [ -n "${NETDATA_UNSAFE_REINSTALL}" ]; then
+ progress "Found an existing netdata install at ${ndprefix}, but user requested reinstall, continuing."
+
+ case "${INSTALL_TYPE}" in
+ binpkg-*) NETDATA_ONLY_NATIVE=1 ;;
+ *-build) NETDATA_ONLY_BUILD=1 ;;
+ *-static) NETDATA_ONLY_STATIC=1 ;;
+ *)
+ if [ -n "${NETDATA_UNSAFE_REINSTALL}" ]; then
+ warning "Reinstalling over top of a ${INSTALL_TYPE} installation may be unsafe, but the user has requested we proceed."
+ elif [ "${INTERACTIVE}" -eq 0 ]; then
+ fatal "User requested reinstall, but we cannot safely reinstall over top of a ${INSTALL_TYPE} installation, exiting." F0104
+ else
+ if confirm "Reinstalling over top of a ${INSTALL_TYPE} installation may be unsafe, do you want to continue?"; then
+ progress "OK, continuing."
+ else
+ fatal "Cancelling reinstallation at user request." F0105
+ fi
+ fi
+ ;;
+ esac
+
+ return 0
+ fi
+
+ ret=0
+
+ if [ "${NETDATA_CLAIM_ONLY}" -eq 0 ] && echo "${INSTALL_TYPE}" | grep -vq "binpkg-*"; then
+ if ! update; then
+ warning "Unable to find usable updater script, not updating existing install at ${ndprefix}."
+ fi
+ else
+ warning "Not updating existing install at ${ndprefix}."
+ fi
+
+ if [ -n "${NETDATA_CLAIM_TOKEN}" ]; then
+ progress "Attempting to claim existing install at ${ndprefix}."
+ INSTALL_PREFIX="${ndprefix}"
+ claim
+ ret=$?
+ elif [ "${NETDATA_CLAIM_ONLY}" -eq 1 ]; then
+ fatal "User asked to claim, but did not proide a claiming token." F0202
+ else
+ progress "Not attempting to claim existing install at ${ndprefix} (no claiming token provided)."
+ fi
+
+ cleanup
+ trap - EXIT
+ exit $ret
+ ;;
+ oci)
+ fatal "This is an OCI container, use the regular image lifecycle management commands in your container instead of this script for managing it." F0203
+ ;;
+ *)
+ if [ -n "${NETDATA_REINSTALL}" ] || [ -n "${NETDATA_UNSAFE_REINSTALL}" ]; then
+ if [ -n "${NETDATA_UNSAFE_REINSTALL}" ]; then
+ warning "Reinstalling over top of a ${INSTALL_TYPE} installation may be unsafe, but the user has requested we proceed."
+ elif [ "${INTERACTIVE}" -eq 0 ]; then
+ fatal "User requested reinstall, but we cannot safely reinstall over top of a ${INSTALL_TYPE} installation, exiting." F0104
+ else
+ if confirm "Reinstalling over top of a ${INSTALL_TYPE} installation may be unsafe, do you want to continue?"; then
+ progress "OK, continuing."
+ else
+ fatal "Cancelling reinstallation at user request." F0105
+ fi
+ fi
+ else
+ fatal "Found an existing netdata install at ${ndprefix}, but the install type is '${INSTALL_TYPE}', which is not supported, refusing to proceed." F0103
+ fi
+ ;;
+ esac
+}
+
+soft_disable_cloud() {
+ cloud_prefix="${INSTALL_PREFIX}/var/lib/netdata/cloud.d"
+
+ run ${ROOTCMD} mkdir -p "${cloud_prefix}"
+
+ cat > "${tmpdir}/cloud.conf" << EOF
+[global]
+ enabled = no
+EOF
+
+ run ${ROOTCMD} cp "${tmpdir}/cloud.conf" "${cloud_prefix}/cloud.conf"
+
+ if [ -z "${NETDATA_NO_START}" ]; then
+ case "${SYSTYPE}" in
+ Darwin) run ${ROOTCMD} launchctl kickstart -k com.github.netdata ;;
+ FreeBSD) run ${ROOTCMD} service netdata restart ;;
+ Linux)
+ initpath="$(${ROOTCMD} readlink /proc/1/exe)"
+
+ if command -v service > /dev/null 2>&1; then
+ run ${ROOTCMD} service netdata restart
+ elif command -v rc-service > /dev/null 2>&1; then
+ run ${ROOTCMD} rc-service netdata restart
+ elif [ "$(basename "${initpath}" 2> /dev/null)" = "systemd" ]; then
+ run ${ROOTCMD} systemctl restart netdata
+ elif [ -f /etc/init.d/netdata ]; then
+ run ${ROOTCMD} /etc/init.d/netdata restart
+ fi
+ ;;
+ esac
+ fi
+}
+
+confirm_install_prefix() {
+ if [ -n "${INSTALL_PREFIX}" ] && [ "${NETDATA_ONLY_BUILD}" -ne 1 ]; then
+ fatal "The \`--install\` option is only supported together with the \`--only-build\` option." F0204
+ fi
+
+ if [ -n "${INSTALL_PREFIX}" ]; then
+ NETDATA_INSTALLER_OPTIONS="${NETDATA_INSTALLER_OPTIONS} --install ${INSTALL_PREFIX}"
+ else
+ case "${SYSTYPE}" in
+ Darwin)
+ INSTALL_PREFIX="/usr/local/netdata"
+ NETDATA_INSTALLER_OPTIONS="${NETDATA_INSTALLER_OPTIONS} --install-no-prefix ${INSTALL_PREFIX}"
+ ;;
+ FreeBSD)
+ INSTALL_PREFIX="/usr/local"
+ NETDATA_INSTALLER_OPTIONS="${NETDATA_INSTALLER_OPTIONS} --install-no-prefix ${INSTALL_PREFIX}"
+ ;;
+ esac
+ fi
+}
+
+# ======================================================================
+# Claiming support code
+
+check_claim_opts() {
+# shellcheck disable=SC2235,SC2030
+ if [ -z "${NETDATA_CLAIM_TOKEN}" ] && [ -n "${NETDATA_CLAIM_ROOMS}" ]; then
+ fatal "Invalid claiming options, claim rooms may only be specified when a token and URL are specified." F0204
+ elif [ -z "${NETDATA_CLAIM_TOKEN}" ] && [ -n "${NETDATA_CLAIM_EXTRA}" ]; then
+ fatal "Invalid claiming options, a claiming token must be specified." F0204
+ elif [ "${NETDATA_DISABLE_CLOUD}" -eq 1 ] && [ -n "${NETDATA_CLAIM_TOKEN}" ]; then
+ fatal "Cloud explicitly disabled, but automatic claiming requested. Either enable Netdata Cloud, or remove the --claim-* options." F0204
+ fi
+}
+
+claim() {
+ progress "Attempting to claim agent to ${NETDATA_CLAIM_URL}"
+ if [ -z "${INSTALL_PREFIX}" ]; then
+ NETDATA_CLAIM_PATH=/usr/sbin/netdata-claim.sh
+ elif [ "${INSTALL_PREFIX}" = "/opt/netdata" ]; then
+ NETDATA_CLAIM_PATH="/opt/netdata/bin/netdata-claim.sh"
+ else
+ NETDATA_CLAIM_PATH="${INSTALL_PREFIX}/netdata/usr/sbin/netdata-claim.sh"
+ fi
+
+ if ! pgrep netdata > /dev/null; then
+ NETDATA_CLAIM_EXTRA="${NETDATA_CLAIM_EXTRA} -daemon-not-running"
+ fi
+
+ # shellcheck disable=SC2086
+ if ${ROOTCMD} "${NETDATA_CLAIM_PATH}" -token="${NETDATA_CLAIM_TOKEN}" -rooms="${NETDATA_CLAIM_ROOMS}" -url="${NETDATA_CLAIM_URL}" ${NETDATA_CLAIM_EXTRA}; then
+ progress "Successfully claimed node"
+ else
+ warning "Unable to claim node, you must do so manually."
+ if [ -z "${NETDATA_NEW_INSTALL}" ]; then
+ cleanup
+ trap - EXIT
+ exit 1
+ fi
+ fi
+}
+
+# ======================================================================
+# Native package install code.
+
+# Check for an already installed package with a given name.
+pkg_installed() {
+ case "${DISTRO_COMPAT_NAME}" in
+ debian|ubuntu)
+ dpkg -l "${1}" > /dev/null 2>&1
+ return $?
+ ;;
+ centos|fedora|opensuse)
+ rpm -q "${1}" > /dev/null 2>&1
+ return $?
+ ;;
+ *)
+ return 1
+ ;;
+ esac
+}
+
+# Check for the existence of a usable netdata package in the repo.
+netdata_avail_check() {
+ case "${DISTRO_COMPAT_NAME}" in
+ debian|ubuntu)
+ env DEBIAN_FRONTEND=noninteractive apt-cache policy netdata | grep -q packagecloud.io/netdata/netdata;
+ return $?
+ ;;
+ centos|fedora)
+ # shellcheck disable=SC2086
+ ${pm_cmd} search -v netdata | grep -qE 'Repo *: netdata(-edge)?$'
+ return $?
+ ;;
+ opensuse)
+ zypper packages -r "$(zypper repos | grep -E 'netdata |netdata-edge ' | cut -f 1 -d '|' | tr -d ' ')" | grep -E 'netdata '
+ return $?
+ ;;
+ *)
+ return 1
+ ;;
+ esac
+}
+
+# Check for any distro-specific dependencies we know we need.
+check_special_native_deps() {
+ if [ "${DISTRO_COMPAT_NAME}" = "centos" ] && [ "${SYSVERSION}" = "7" ]; then
+ progress "Checking for libuv availability."
+ # shellcheck disable=SC2086
+ if ${pm_cmd} search ${interactive_opts} -v libuv | grep -q "No matches found"; then
+ progress "libv not found, checking for EPEL availability."
+ # shellcheck disable=SC2086
+ if ${pm_cmd} search ${interactive_opts} -v epel-release | grep -q "No matches found"; then
+ warning "Unable to find a suitable source for libuv, cannot install on this system."
+ return 1
+ else
+ progress "EPEL is available, attempting to install so that required dependencies are available."
+
+ # shellcheck disable=SC2086
+ if ! run ${ROOTCMD} env ${env} ${pm_cmd} install ${pkg_install_opts} epel-release; then
+ warning "Failed to install EPEL."
+ return 1
+ fi
+ fi
+ else
+ return 0
+ fi
+ fi
+}
+
+try_package_install() {
+ if [ -z "${DISTRO}" ]; then
+ warning "Unable to determine Linux distribution for native packages."
+ return 1
+ fi
+
+ progress "Attempting to install using native packages..."
+
+ if [ "${RELEASE_CHANNEL}" = "nightly" ]; then
+ release="-edge"
+ else
+ release=""
+ fi
+
+ if [ "${INTERACTIVE}" = "0" ]; then
+ interactive_opts="-y"
+ env="DEBIAN_FRONTEND=noninteractive"
+ else
+ interactive_opts=""
+ env=""
+ fi
+
+ case "${DISTRO_COMPAT_NAME}" in
+ debian)
+ needs_early_refresh=1
+ pm_cmd="apt-get"
+ repo_subcmd="update"
+ repo_prefix="debian/${SYSCODENAME}"
+ pkg_type="deb"
+ pkg_suffix="_all"
+ pkg_vsep="_"
+ pkg_install_opts="${interactive_opts}"
+ repo_update_opts="${interactive_opts}"
+ uninstall_subcmd="uninstall"
+ INSTALL_TYPE="binpkg-deb"
+ ;;
+ ubuntu)
+ needs_early_refresh=1
+ pm_cmd="apt-get"
+ repo_subcmd="update"
+ repo_prefix="ubuntu/${SYSCODENAME}"
+ pkg_type="deb"
+ pkg_suffix="_all"
+ pkg_vsep="_"
+ pkg_install_opts="${interactive_opts}"
+ repo_update_opts="${interactive_opts}"
+ uninstall_subcmd="uninstall"
+ INSTALL_TYPE="binpkg-deb"
+ ;;
+ centos)
+ if command -v dnf > /dev/null; then
+ pm_cmd="dnf"
+ repo_subcmd="makecache"
+ else
+ pm_cmd="yum"
+ fi
+ repo_prefix="el/${SYSVERSION}"
+ pkg_type="rpm"
+ pkg_suffix=".noarch"
+ pkg_vsep="-"
+ pkg_install_opts="${interactive_opts}"
+ repo_update_opts="${interactive_opts}"
+ uninstall_subcmd="remove"
+ INSTALL_TYPE="binpkg-rpm"
+ ;;
+ fedora)
+ if command -v dnf > /dev/null; then
+ pm_cmd="dnf"
+ repo_subcmd="makecache"
+ else
+ pm_cmd="yum"
+ fi
+ repo_prefix="fedora/${SYSVERSION}"
+ pkg_type="rpm"
+ pkg_suffix=".noarch"
+ pkg_vsep="-"
+ pkg_install_opts="${interactive_opts}"
+ repo_update_opts="${interactive_opts}"
+ uninstall_subcmd="remove"
+ INSTALL_TYPE="binpkg-rpm"
+ ;;
+ opensuse)
+ pm_cmd="zypper"
+ repo_subcmd="--gpg-auto-import-keys refresh"
+ repo_prefix="opensuse/${SYSVERSION}"
+ pkg_type="rpm"
+ pkg_suffix=".noarch"
+ pkg_vsep="-"
+ pkg_install_opts="${interactive_opts} --allow-unsigned-rpm"
+ repo_update_opts=""
+ uninstall_subcmd="remove"
+ INSTALL_TYPE="binpkg-rpm"
+ ;;
+ *)
+ warning "We do not provide native packages for ${DISTRO}."
+ return 2
+ ;;
+ esac
+
+ repoconfig_name="netdata-repo${release}"
+ repoconfig_file="${repoconfig_name}${pkg_vsep}${REPOCONFIG_VERSION}${pkg_suffix}.${pkg_type}"
+ repoconfig_url="${REPOCONFIG_URL_PREFIX}/${repo_prefix}/${repoconfig_file}/download.${pkg_type}"
+
+ if ! pkg_installed "${repoconfig_name}"; then
+ progress "Downloading repository configuration package."
+ if ! download "${repoconfig_url}" "${tmpdir}/${repoconfig_file}"; then
+ warning "Failed to download repository configuration package."
+ return 2
+ fi
+
+ if [ -n "${needs_early_refresh}" ]; then
+ progress "Updating repository metadata."
+ # shellcheck disable=SC2086
+ if ! run ${ROOTCMD} env ${env} ${pm_cmd} ${repo_subcmd} ${repo_update_opts}; then
+ warning "Failed to refresh repository metadata."
+ return 2
+ fi
+ fi
+
+ progress "Installing repository configuration package."
+ # shellcheck disable=SC2086
+ if ! run ${ROOTCMD} env ${env} ${pm_cmd} install ${pkg_install_opts} "${tmpdir}/${repoconfig_file}"; then
+ warning "Failed to install repository configuration package."
+ return 2
+ fi
+
+ if [ -n "${repo_subcmd}" ]; then
+ progress "Updating repository metadata."
+ # shellcheck disable=SC2086
+ if ! run ${ROOTCMD} env ${env} ${pm_cmd} ${repo_subcmd} ${repo_update_opts}; then
+ fatal "Failed to update repository metadata." F0205
+ fi
+ fi
+ else
+ progress "Repository configuration is already present, attempting to install netdata."
+ fi
+
+ if ! check_special_native_deps; then
+ warning "Could not find secondary dependencies ${DISTRO} on ${SYSARCH}."
+ if [ -z "${NO_CLEANUP}" ]; then
+ progress "Attempting to uninstall repository configuration package."
+ # shellcheck disable=SC2086
+ run ${ROOTCMD} env ${env} ${pm_cmd} ${uninstall_subcmd} ${pkg_install_opts} "${repoconfig_name}"
+ fi
+ return 2
+ fi
+
+ progress "Checking for usable Netdata package."
+ if ! netdata_avail_check "${DISTRO_COMPAT_NAME}"; then
+ warning "Could not find a usable native package for ${DISTRO} on ${SYSARCH}."
+ if [ -z "${NO_CLEANUP}" ]; then
+ progress "Attempting to uninstall repository configuration package."
+ # shellcheck disable=SC2086
+ run ${ROOTCMD} env ${env} ${pm_cmd} ${uninstall_subcmd} ${pkg_install_opts} "${repoconfig_name}"
+ fi
+ return 2
+ fi
+
+ if [ "${NETDATA_DISABLE_TELEMETRY}" -eq 1 ]; then
+ run ${ROOTCMD} mkdir -p "/etc/netdata"
+ run ${ROOTCMD} touch "/etc/netdata/.opt-out-from-anonymous-statistics"
+ fi
+
+ progress "Installing Netdata package."
+ # shellcheck disable=SC2086
+ if ! run ${ROOTCMD} env ${env} ${pm_cmd} install ${pkg_install_opts} netdata; then
+ warning "Failed to install Netdata package."
+ if [ -z "${NO_CLEANUP}" ]; then
+ progress "Attempting to uninstall repository configuration package."
+ # shellcheck disable=SC2086
+ run ${ROOTCMD} env ${env} ${pm_cmd} ${uninstall_subcmd} ${pkg_install_opts} "${repoconfig_name}"
+ fi
+ return 2
+ fi
+}
+
+# ======================================================================
+# Static build install code
+
+set_static_archive_urls() {
+ if [ "${RELEASE_CHANNEL}" = "stable" ]; then
+ latest="$(get_redirect "https://github.com/netdata/netdata/releases/latest")"
+ export NETDATA_STATIC_ARCHIVE_URL="https://github.com/netdata/netdata/releases/download/${latest}/netdata-${SYSARCH}-${latest}.gz.run"
+ export NETDATA_STATIC_ARCHIVE_CHECKSUM_URL="https://github.com/netdata/netdata/releases/download/${latest}/sha256sums.txt"
+ else
+ export NETDATA_STATIC_ARCHIVE_URL="${NETDATA_TARBALL_BASEURL}/netdata-latest.gz.run"
+ export NETDATA_STATIC_ARCHIVE_CHECKSUM_URL="${NETDATA_TARBALL_BASEURL}/sha256sums.txt"
+ fi
+}
+
+try_static_install() {
+ set_static_archive_urls "${RELEASE_CHANNEL}"
+ progress "Downloading static netdata binary: ${NETDATA_STATIC_ARCHIVE_URL}"
+
+ if ! download "${NETDATA_STATIC_ARCHIVE_URL}" "${tmpdir}/netdata-${SYSARCH}-latest.gz.run"; then
+ warning "Unable to download static build archive for ${SYSARCH}."
+ return 2
+ fi
+
+ if ! download "${NETDATA_STATIC_ARCHIVE_CHECKSUM_URL}" "${tmpdir}/sha256sum.txt"; then
+ fatal "Unable to fetch checksums to verify static build archive." F0206
+ fi
+
+ if ! grep "netdata-${SYSARCH}-latest.gz.run" "${tmpdir}/sha256sum.txt" | safe_sha256sum -c - > /dev/null 2>&1; then
+ fatal "Static binary checksum validation failed. Usually this is a result of an older copy of the file being cached somewhere upstream and can be resolved by retrying in an hour." F0207
+ fi
+
+ if [ "${INTERACTIVE}" -eq 0 ]; then
+ opts="${opts} --accept"
+ fi
+
+ progress "Installing netdata"
+ # shellcheck disable=SC2086
+ if ! run ${ROOTCMD} sh "${tmpdir}/netdata-${SYSARCH}-latest.gz.run" ${opts} -- ${NETDATA_AUTO_UPDATES:+--auto-update} ${NETDATA_INSTALLER_OPTIONS}; then
+ warning "Failed to install static build of Netdata on ${SYSARCH}."
+ run rm -rf /opt/netdata
+ return 2
+ fi
+
+ install_type_file="/opt/netdata/etc/netdata/.install-type"
+ if [ -f "${install_type_file}" ]; then
+ ${ROOTCMD} sh -c "cat \"${install_type_file}\" > \"${tmpdir}/install-type\""
+ ${ROOTCMD} chown "$(id -u)":"$(id -g)" "${tmpdir}/install-type"
+ # shellcheck disable=SC1091
+ . "${tmpdir}/install-type"
+ cat > "${tmpdir}/install-type" <<- EOF
+ INSTALL_TYPE='kickstart-static'
+ PREBUILT_ARCH='${PREBUILT_ARCH}'
+ EOF
+ ${ROOTCMD} chown netdata:netdata "${tmpdir}/install-type"
+ ${ROOTCMD} cp "${tmpdir}/install-type" "${install_type_file}"
+ fi
+}
+
+# ======================================================================
+# Local build install code
+
+set_source_archive_urls() {
+ if [ "$1" = "stable" ]; then
+ latest="$(get_redirect "https://github.com/netdata/netdata/releases/latest")"
+ export NETDATA_SOURCE_ARCHIVE_URL="https://github.com/netdata/netdata/releases/download/${latest}/netdata-${latest}.tar.gz"
+ export NETDATA_SOURCE_ARCHIVE_CHECKSUM_URL="https://github.com/netdata/netdata/releases/download/${latest}/sha256sums.txt"
+ else
+ export NETDATA_SOURCE_ARCHIVE_URL="${NETDATA_TARBALL_BASEURL}/netdata-latest.tar.gz"
+ export NETDATA_SOURCE_ARCHIVE_CHECKSUM_URL="${NETDATA_TARBALL_BASEURL}/sha256sums.txt"
+ fi
+}
+
+install_local_build_dependencies() {
+ bash="$(command -v bash 2> /dev/null)"
+
+ if [ -z "${bash}" ] || [ ! -x "${bash}" ]; then
+ warning "Unable to find a usable version of \`bash\` (required for local build)."
+ return 1
+ fi
+
+ progress "Fetching script to detect required packages..."
+ download "${PACKAGES_SCRIPT}" "${tmpdir}/install-required-packages.sh"
+
+ if [ ! -s "${tmpdir}/install-required-packages.sh" ]; then
+ warning "Downloaded dependency installation script is empty."
+ else
+ progress "Running downloaded script to detect required packages..."
+
+ if [ "${INTERACTIVE}" -eq 0 ]; then
+ opts="--dont-wait --non-interactive"
+ fi
+
+ if [ "${SYSTYPE}" = "Darwin" ]; then
+ sudo=""
+ else
+ sudo="${ROOTCMD}"
+ fi
+
+ # shellcheck disable=SC2086
+ if ! run ${sudo} "${bash}" "${tmpdir}/install-required-packages.sh" ${opts} netdata; then
+ warning "It failed to install all the required packages, but installation might still be possible."
+ fi
+ fi
+}
+
+build_and_install() {
+ progress "Building netdata"
+
+ echo "INSTALL_TYPE='kickstart-build'" > system/.install-type
+
+ opts="${NETDATA_INSTALLER_OPTIONS}"
+
+ if [ "${INTERACTIVE}" -eq 0 ]; then
+ opts="${opts} --dont-wait"
+ fi
+
+ if [ "${NETDATA_AUTO_UPDATES}" -eq 1 ]; then
+ opts="${opts} --auto-update"
+ fi
+
+ if [ "${RELEASE_CHANNEL}" = "stable" ]; then
+ opts="${opts} --stable-channel"
+ fi
+
+ if [ "${NETDATA_REQUIRE_CLOUD}" -eq 1 ]; then
+ opts="${opts} --require-cloud"
+ elif [ "${NETDATA_DISABLE_CLOUD}" -eq 1 ]; then
+ opts="${opts} --disable-cloud"
+ fi
+
+ # shellcheck disable=SC2086
+ run ${ROOTCMD} ./netdata-installer.sh ${opts}
+
+ case $? in
+ 1)
+ fatal "netdata-installer.sh exited with error" F0007
+ ;;
+ 2)
+ fatal "Insufficient RAM to install netdata" F0008
+ ;;
+ esac
+}
+
+try_build_install() {
+ if ! install_local_build_dependencies; then
+ return 1
+ fi
+
+ set_source_archive_urls "${RELEASE_CHANNEL}"
+
+ download "${NETDATA_SOURCE_ARCHIVE_CHECKSUM_URL}" "${tmpdir}/sha256sum.txt"
+ download "${NETDATA_SOURCE_ARCHIVE_URL}" "${tmpdir}/netdata-latest.tar.gz"
+
+ if ! grep netdata-latest.tar.gz "${tmpdir}/sha256sum.txt" | safe_sha256sum -c - > /dev/null 2>&1; then
+ fatal "Tarball checksum validation failed. Usually this is a result of an older copy of the file being cached somewhere upstream and can be resolved by retrying in an hour." F0005
+ fi
+
+ run tar -xf "${tmpdir}/netdata-latest.tar.gz" -C "${tmpdir}"
+ rm -rf "${tmpdir}/netdata-latest.tar.gz" > /dev/null 2>&1
+ cd "$(find "${tmpdir}" -mindepth 1 -maxdepth 1 -type d -name netdata-)" || fatal "Cannot cd to netdata source tree" F0006
+
+ if [ -x netdata-installer.sh ]; then
+ build_and_install || return 1
+ else
+ # This case is needed because some platforms produce an extra directory on the source tarball extraction.
+ if [ "$(find . -mindepth 1 -maxdepth 1 -type d | wc -l)" -eq 1 ] && [ -x "$(find . -mindepth 1 -maxdepth 1 -type d)/netdata-installer.sh" ]; then
+ cd "$(find . -mindepth 1 -maxdepth 1 -type d)" && build_and_install || return 1
+ else
+ fatal "Cannot install netdata from source (the source directory does not include netdata-installer.sh). Leaving all files in ${tmpdir}" F0009
+ fi
+ fi
+}
+
+# ======================================================================
+# Per system-type install logic
+
+install_on_linux() {
+ if [ "${NETDATA_ONLY_STATIC}" -ne 1 ] && [ "${NETDATA_ONLY_BUILD}" -ne 1 ]; then
+ SELECTED_INSTALL_METHOD="native"
+ try_package_install
+
+ case "$?" in
+ 0)
+ NETDATA_INSTALL_SUCCESSFUL=1
+ ;;
+ 1)
+ fatal "Unable to install on this system." F0300
+ ;;
+ 2)
+ if [ "${NETDATA_ONLY_NATIVE}" -eq 1 ]; then
+ fatal "Could not install native binary packages." F0301
+ else
+ warning "Could not install native binary packages, falling back to alternative installation method."
+ fi
+ ;;
+ esac
+ fi
+
+ if [ "${NETDATA_ONLY_NATIVE}" -ne 1 ] && [ "${NETDATA_ONLY_BUILD}" -ne 1 ] && [ -z "${NETDATA_INSTALL_SUCCESSFUL}" ]; then
+ SELECTED_INSTALL_METHOD="static"
+ INSTALL_TYPE="kickstart-static"
+ try_static_install
+
+ case "$?" in
+ 0)
+ NETDATA_INSTALL_SUCCESSFUL=1
+ INSTALL_PREFIX="/opt/netdata"
+ ;;
+ 1)
+ fatal "Unable to install on this system." F0302
+ ;;
+ 2)
+ if [ "${NETDATA_ONLY_STATIC}" -eq 1 ]; then
+ fatal "Could not install static build." F0303
+ else
+ warning "Could not install static build, falling back to alternative installation method."
+ fi
+ ;;
+ esac
+ fi
+
+ if [ "${NETDATA_ONLY_NATIVE}" -ne 1 ] && [ "${NETDATA_ONLY_STATIC}" -ne 1 ] && [ -z "${NETDATA_INSTALL_SUCCESSFUL}" ]; then
+ SELECTED_INSTALL_METHOD="build"
+ INSTALL_TYPE="kickstart-build"
+ try_build_install
+
+ case "$?" in
+ 0)
+ NETDATA_INSTALL_SUCCESSFUL=1
+ ;;
+ *)
+ fatal "Unable to install on this system." F0304
+ ;;
+ esac
+ fi
+}
+
+install_on_macos() {
+ if [ "${NETDATA_ONLY_NATIVE}" -eq 1 ]; then
+ fatal "User requested native package, but native packages are not available for macOS. Try installing without \`--only-native\` option." F0305
+ elif [ "${NETDATA_ONLY_STATIC}" -eq 1 ]; then
+ fatal "User requested static build, but static builds are not available for macOS. Try installing without \`--only-static\` option." F0306
+ else
+ SELECTED_INSTALL_METHOD="build"
+ INSTALL_TYPE="kickstart-build"
+ try_build_install
+
+ case "$?" in
+ 0)
+ NETDATA_INSTALL_SUCCESSFUL=1
+ ;;
+ *)
+ fatal "Unable to install on this system." F0307
+ ;;
+ esac
+ fi
+}
+
+install_on_freebsd() {
+ if [ "${NETDATA_ONLY_NATIVE}" -eq 1 ]; then
+ fatal "User requested native package, but native packages are not available for FreeBSD. Try installing without \`--only-native\` option." F0308
+ elif [ "${NETDATA_ONLY_STATIC}" -eq 1 ]; then
+ fatal "User requested static build, but static builds are not available for FreeBSD. Try installing without \`--only-static\` option." F0309
+ else
+ SELECTED_INSTALL_METHOD="build"
+ INSTALL_TYPE="kickstart-build"
+ try_build_install
+
+ case "$?" in
+ 0)
+ NETDATA_INSTALL_SUCCESSFUL=1
+ ;;
+ *)
+ fatal "Unable to install on this system." F030A
+ ;;
+ esac
+ fi
+}
+
+# ======================================================================
+# Main program
+
+setup_terminal || echo > /dev/null
+
+while [ -n "${1}" ]; do
+ case "${1}" in
+ "--help")
+ usage
+ cleanup
+ trap - EXIT
+ exit 0
+ ;;
+ "--no-cleanup") NO_CLEANUP=1 ;;
+ "--dont-wait"|"--non-interactive") INTERACTIVE=0 ;;
+ "--interactive") INTERACTIVE=1 ;;
+ "--stable-channel") RELEASE_CHANNEL="stable" ;;
+ "--no-updates") NETDATA_AUTO_UPDATES=0 ;;
+ "--auto-update") NETDATA_AUTO_UPDATES="1" ;;
+ "--reinstall") NETDATA_REINSTALL=1 ;;
+ "--reinstall-even-if-unsafe") NETDATA_UNSAFE_REINSTALL=1 ;;
+ "--claim-only") NETDATA_CLAIM_ONLY=1 ;;
+ "--disable-cloud")
+ NETDATA_DISABLE_CLOUD=1
+ NETDATA_REQUIRE_CLOUD=0
+ ;;
+ "--require-cloud")
+ NETDATA_DISABLE_CLOUD=0
+ NETDATA_REQUIRE_CLOUD=1
+ ;;
+ "--dont-start-it")
+ NETDATA_NO_START=1
+ NETDATA_INSTALLER_OPTIONS="${NETDATA_INSTALLER_OPTIONS} --dont-start-it"
+ ;;
+ "--disable-telemetry")
+ NETDATA_DISABLE_TELEMETRY="1"
+ NETDATA_INSTALLER_OPTIONS="${NETDATA_INSTALLER_OPTIONS} --disable-telemetry"
+ ;;
+ "--install")
+ INSTALL_PREFIX="${2}"
+ shift 1
+ ;;
+ "--native-only")
+ NETDATA_ONLY_NATIVE=1
+ NETDATA_ONLY_STATIC=0
+ NETDATA_ONLY_BUILD=0
+ SELECTED_INSTALL_METHOD="native"
+ ;;
+ "--static-only")
+ NETDATA_ONLY_STATIC=1
+ NETDATA_ONLY_NATIVE=0
+ NETDATA_ONLY_BUILD=0
+ SELECTED_INSTALL_METHOD="static"
+ ;;
+ "--build-only")
+ NETDATA_ONLY_BUILD=1
+ NETDATA_ONLY_NATIVE=0
+ NETDATA_ONLY_STATIC=0
+ SELECTED_INSTALL_METHOD="build"
+ ;;
+ "--claim-token")
+ NETDATA_CLAIM_TOKEN="${2}"
+ shift 1
+ ;;
+ "--claim-rooms")
+ NETDATA_CLAIM_ROOMS="${2}"
+ shift 1
+ ;;
+ "--claim-url")
+ NETDATA_CLAIM_URL="${2}"
+ shift 1
+ ;;
+ "--claim-*")
+ optname="$(echo "${1}" | cut -d '-' -f 4-)"
+ case "${optname}" in
+ id|proxy|user|hostname)
+ NETDATA_CLAIM_EXTRA="${NETDATA_CLAIM_EXTRA} -${optname} ${2}"
+ shift 1
+ ;;
+ verbose|insecure|noproxy|noreload|daemon-not-running)
+ NETDATA_CLAIM_EXTRA="${NETDATA_CLAIM_EXTRA} -${optname}"
+ ;;
+ *)
+ warning "Ignoring unrecognized claiming option ${optname}"
+ ;;
+ esac
+ ;;
+ *)
+ warning "Passing unrecognized option '${1}' to installer script. If this is intended, please add it to \$NETDATA_INSTALLER_OPTIONS instead."
+ NETDATA_INSTALLER_OPTIONS="${NETDATA_INSTALLER_OPTIONS} ${1}"
+ ;;
+ esac
+ shift 1
+done
+
+check_claim_opts
+confirm_root_support
+get_system_info
+confirm_install_prefix
+
+tmpdir="$(create_tmp_directory)"
+progress "Using ${tmpdir} as a temporary directory."
+cd "${tmpdir}" || exit 1
+
+handle_existing_install
+
+case "${SYSTYPE}" in
+ Linux) install_on_linux ;;
+ Darwin) install_on_macos ;;
+ FreeBSD) install_on_freebsd ;;
+esac
+
+if [ -n "${NETDATA_CLAIM_TOKEN}" ]; then
+ claim
+elif [ "${NETDATA_DISABLE_CLOUD}" -eq 1 ]; then
+ soft_disable_cloud
+fi
+
+telemetry_event INSTALL_SUCCESS "" ""
+cleanup
+trap - EXIT