diff options
Diffstat (limited to 'packaging/installer/netdata-uninstaller.sh')
-rwxr-xr-x | packaging/installer/netdata-uninstaller.sh | 293 |
1 files changed, 254 insertions, 39 deletions
diff --git a/packaging/installer/netdata-uninstaller.sh b/packaging/installer/netdata-uninstaller.sh index a248860d..f2cc7b7c 100755 --- a/packaging/installer/netdata-uninstaller.sh +++ b/packaging/installer/netdata-uninstaller.sh @@ -1,4 +1,4 @@ -#!/usr/bin/env bash +#!/bin/sh # # This is the netdata uninstaller script # @@ -21,6 +21,7 @@ where: FILE_REMOVAL_STATUS=0 ENVIRONMENT_FILE="/etc/netdata/.environment" +# shellcheck disable=SC2034 INTERACTIVITY="-i" YES=0 while :; do @@ -35,6 +36,7 @@ while :; do ;; -y | --yes) YES=1 + FLAG=-y shift ;; -e | --env) @@ -55,15 +57,219 @@ if [ "$YES" != "1" ]; then exit 1 fi -if [[ $EUID -ne 0 ]]; then +if [ "$(id -u)" -ne 0 ]; then echo >&2 "This script SHOULD be run as root or otherwise it won't delete all installed components." key="n" - read -r -s -n 1 -p "Do you want to continue as non-root user [y/n] ? " key + read -r 1 -p "Do you want to continue as non-root user [y/n] ? " key if [ "$key" != "y" ] && [ "$key" != "Y" ]; then exit 1 fi fi +user_input() { + if [ "${INTERACTIVITY}" = "-i" ]; then + TEXT="$1 [y/n]" + + while true; do + echo "$TEXT" + read -r yn + + case "$yn" in + [Yy]*) return 0;; + [Nn]*) return 1;; + *) echo "Please answer yes or no.";; + esac + done + fi +} + +_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 +} + +tmpdir="$(create_tmp_directory)" + +detect_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" + envfile="${ndprefix}/etc/netdata/.environment" + if [ -r "${typefile}" ]; then + ${ROOTCMD} sh -c "cat \"${typefile}\" > \"${tmpdir}/install-type\"" + # shellcheck disable=SC1090,SC1091 + . "${tmpdir}/install-type" + else + INSTALL_TYPE="unknown" + fi + + if [ "${INSTALL_TYPE}" = "unknown" ] || [ "${INSTALL_TYPE}" = "custom" ]; then + if [ -r "${envfile}" ]; then + ${ROOTCMD} sh -c "cat \"${envfile}\" > \"${tmpdir}/environment\"" + # shellcheck disable=SC1091 + . "${tmpdir}/environment" + if [ -n "${NETDATA_IS_STATIC_INSTALL}" ]; then + if [ "${NETDATA_IS_STATIC_INSTALL}" = "yes" ]; then + INSTALL_TYPE="legacy-static" + else + INSTALL_TYPE="legacy-build" + fi + fi + fi + fi + fi +} + +pkg_installed() { + case "${DISTRO_COMPAT_NAME}" in + debian|ubuntu) + dpkg-query --show --showformat '${Status}' "${1}" 2>&1 | cut -f 1 -d ' ' | grep -q '^install$' + return $? + ;; + centos|fedora|opensuse|ol) + rpm -q "${1}" > /dev/null 2>&1 + return $? + ;; + *) + return 1 + ;; + esac +} + +detect_existing_install + +if [ -x "$(command -v apt-get)" ] && [ "${INSTALL_TYPE}" = "binpkg-deb" ]; then + if dpkg -s netdata > /dev/null; then + echo "Found netdata native installation" + if user_input "Do you want to remove netdata? "; then + apt-get remove netdata ${FLAG} + fi + if dpkg -s netdata-repo-edge > /dev/null; then + if user_input "Do you want to remove netdata-repo-edge? "; then + apt-get remove netdata-repo-edge ${FLAG} + fi + fi + if dpkg -s netdata-repo > /dev/null; then + if user_input "Do you want to remove netdata-repo? "; then + apt-get remove netdata-repo ${FLAG} + fi + fi + exit 0 + fi +elif [ -x "$(command -v dnf)" ] && [ "${INSTALL_TYPE}" = "binpkg-rpm" ]; then + if rpm -q netdata > /dev/null; then + echo "Found netdata native installation." + if user_input "Do you want to remove netdata? "; then + dnf remove netdata ${FLAG} + fi + if rpm -q netdata-repo-edge > /dev/null; then + if user_input "Do you want to remove netdata-repo-edge? "; then + dnf remove netdata-repo-edge ${FLAG} + fi + fi + if rpm -q netdata-repo > /dev/null; then + if user_input "Do you want to remove netdata-repo? "; then + dnf remove netdata-repo ${FLAG} + fi + fi + exit 0 + fi +elif [ -x "$(command -v yum)" ] && [ "${INSTALL_TYPE}" = "binpkg-rpm" ]; then + if rpm -q netdata > /dev/null; then + echo "Found netdata native installation." + if user_input "Do you want to remove netdata? "; then + yum remove netdata ${FLAG} + fi + if rpm -q netdata-repo-edge > /dev/null; then + if user_input "Do you want to remove netdata-repo-edge? "; then + yum remove netdata-repo-edge ${FLAG} + fi + fi + if rpm -q netdata-repo > /dev/null; then + if user_input "Do you want to remove netdata-repo? "; then + yum remove netdata-repo ${FLAG} + fi + fi + exit 0 + fi +elif [ -x "$(command -v zypper)" ] && [ "${INSTALL_TYPE}" = "binpkg-rpm" ]; then + if [ "${FLAG}" = "-y" ]; then + FLAG=-n + fi + if zypper search -i netdata > /dev/null; then + echo "Found netdata native installation." + if user_input "Do you want to remove netdata? "; then + zypper ${FLAG} remove netdata + fi + if zypper search -i netdata-repo-edge > /dev/null; then + if user_input "Do you want to remove netdata-repo-edge? "; then + zypper ${FLAG} remove netdata-repo-edge + fi + fi + if zypper search -i netdata-repo > /dev/null; then + if user_input "Do you want to remove netdata-repo? "; then + zypper ${FLAG} remove netdata-repo + fi + fi + exit 0 + fi +fi + # ----------------------------------------------------------------------------- # portable service command @@ -72,7 +278,8 @@ rcservice_cmd="$(command -v rc-service 2> /dev/null)" systemctl_cmd="$(command -v systemctl 2> /dev/null)" service() { - local cmd="${1}" action="${2}" + cmd="${1}" + action="${2}" if [ -n "${systemctl_cmd}" ]; then run "${systemctl_cmd}" "${action}" "${cmd}" @@ -127,12 +334,12 @@ run_failed() { } ESCAPED_PRINT_METHOD= -if printf "%q " test > /dev/null 2>&1; then +if printf "%s " test > /dev/null 2>&1; then ESCAPED_PRINT_METHOD="printfq" fi escaped_print() { if [ "${ESCAPED_PRINT_METHOD}" = "printfq" ]; then - printf "%q " "${@}" + printf "%s " "${@}" else printf "%s" "${*}" fi @@ -141,9 +348,10 @@ escaped_print() { run_logfile="/dev/null" run() { - local user="${USER--}" dir="${PWD}" info info_console + user="${USER--}" + dir="${PWD}" - if [ "${UID}" = "0" ]; then + if [ "$(id -u)" = "0" ]; then info="[root ${dir}]# " info_console="[${TPUT_DIM}${dir}${TPUT_RESET}]# " else @@ -163,7 +371,7 @@ run() { "${@}" - local ret=$? + ret=$? if [ ${ret} -ne 0 ]; then run_failed printf >> "${run_logfile}" "FAILED with exit code %s\n" "${ret}" @@ -176,7 +384,7 @@ run() { } portable_del_group() { - local groupname="${1}" + groupname="${1}" # Check if group exist echo >&2 "Removing ${groupname} user group ..." @@ -206,7 +414,11 @@ portable_del_group() { } issystemd() { - local pids p myns ns systemctl + pids='' + p='' + myns='' + ns='' + systemctl='' # if the directory /lib/systemd/system OR /usr/lib/systemd/system (SLES 12.x) does not exit, it is not systemd if [ ! -d /lib/systemd/system ] && [ ! -d /usr/lib/systemd/system ]; then @@ -240,7 +452,7 @@ issystemd() { } portable_del_user() { - local username="${1}" + username="${1}" echo >&2 "Deleting ${username} user account ..." # Linux @@ -258,7 +470,8 @@ portable_del_user() { } portable_del_user_from_group() { - local groupname="${1}" username="${2}" + groupname="${1}" + username="${2}" # username is not in group echo >&2 "Deleting ${username} user from ${groupname} group ..." @@ -296,30 +509,25 @@ quit_msg() { fi } -user_input() { - TEXT="$1" - if [ "${INTERACTIVITY}" = "-i" ]; then - read -r -p "$TEXT" >&2 - fi -} - rm_file() { FILE="$1" if [ -f "${FILE}" ]; then - run rm -v ${INTERACTIVITY} "${FILE}" + if user_input "Do you want to delete this file '$FILE' ? "; then + run rm -v "${FILE}" + fi fi } rm_dir() { DIR="$1" if [ -n "$DIR" ] && [ -d "$DIR" ]; then - user_input "Press ENTER to recursively delete directory '$DIR' > " - run rm -v -f -R "${DIR}" + if user_input "Do you want to delete this directory '$DIR' ? "; then + run rm -v -f -R "${DIR}" + fi fi } safe_pidof() { - local pidof_cmd pidof_cmd="$(command -v pidof 2> /dev/null)" if [ -n "${pidof_cmd}" ]; then ${pidof_cmd} "${@}" @@ -345,7 +553,9 @@ pidisnetdata() { } stop_netdata_on_pid() { - local pid="${1}" ret=0 count=0 + pid="${1}" + ret=0 + count=0 pidisnetdata "${pid}" || return 0 @@ -386,7 +596,8 @@ stop_netdata_on_pid() { } netdata_pids() { - local p myns ns + p='' + ns='' myns="$(readlink /proc/self/ns/pid 2> /dev/null)" @@ -403,9 +614,9 @@ netdata_pids() { } stop_all_netdata() { - local p + p='' - if [ "${UID}" -eq 0 ]; then + if [ "$(id -u)" -eq 0 ]; then uname="$(uname 2> /dev/null)" # Any of these may fail, but we need to not bail if they do. @@ -428,7 +639,7 @@ stop_all_netdata() { fi fi - if [ -n "$(netdata_pids)" ] && [ -n "$(builtin type -P netdatacli)" ]; then + if [ -n "$(netdata_pids)" ] && [ -n "$(command -v netdatacli)" ]; then netdatacli shutdown-agent sleep 20 fi @@ -441,8 +652,9 @@ stop_all_netdata() { trap quit_msg EXIT -#shellcheck source=/dev/null -source "${ENVIRONMENT_FILE}" || exit 1 +# shellcheck source=/dev/null +# shellcheck disable=SC1090 +. "${ENVIRONMENT_FILE}" || exit 1 #### STOP NETDATA echo >&2 "Stopping a possibly running netdata..." @@ -484,16 +696,19 @@ FILE_REMOVAL_STATUS=1 #### REMOVE NETDATA USER FROM ADDED GROUPS if [ -n "$NETDATA_ADDED_TO_GROUPS" ]; then - user_input "Press ENTER to delete 'netdata' from following groups: '$NETDATA_ADDED_TO_GROUPS' > " - for group in $NETDATA_ADDED_TO_GROUPS; do - portable_del_user_from_group "${group}" "netdata" - done + if user_input "Do you want to delete 'netdata' from following groups: '$NETDATA_ADDED_TO_GROUPS' ? "; then + for group in $NETDATA_ADDED_TO_GROUPS; do + portable_del_user_from_group "${group}" "netdata" + done + fi fi #### REMOVE USER -user_input "Press ENTER to delete 'netdata' system user > " -portable_del_user "netdata" || : +if user_input "Do you want to delete 'netdata' system user ? "; then + portable_del_user "netdata" || : +fi ### REMOVE GROUP -user_input "Press ENTER to delete 'netdata' system group > " -portable_del_group "netdata" || : +if user_input "Do you want to delete 'netdata' system group ? "; then + portable_del_group "netdata" || : +fi |