summaryrefslogtreecommitdiffstats
path: root/packaging/installer/netdata-uninstaller.sh
diff options
context:
space:
mode:
Diffstat (limited to 'packaging/installer/netdata-uninstaller.sh')
-rwxr-xr-xpackaging/installer/netdata-uninstaller.sh293
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