From 91d58bc7013b5f8f9fad89cecca8bcc7b828566b Mon Sep 17 00:00:00 2001 From: Pavel Sviderski Date: Tue, 4 Mar 2025 12:14:49 +1000 Subject: [PATCH] chore: add uninstall.sh script to remove uncloud and managed containers and network from machine --- scripts/uninstall.sh | 134 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 scripts/uninstall.sh diff --git a/scripts/uninstall.sh b/scripts/uninstall.sh new file mode 100644 index 00000000..4e268acb --- /dev/null +++ b/scripts/uninstall.sh @@ -0,0 +1,134 @@ +#!/usr/bin/env bash + +set -euo pipefail + +AUTO_CONFIRM=${AUTO_CONFIRM:-false} +# Define variables based on the same defaults used in the installation script. +INSTALL_BIN_DIR=${INSTALL_BIN_DIR:-/usr/local/bin} +INSTALL_SYSTEMD_DIR=${INSTALL_SYSTEMD_DIR:-/etc/systemd/system} +UNCLOUD_USER="uncloud" +UNCLOUD_DATA_DIR=${UNCLOUD_DATA_DIR:-/var/lib/uncloud} +UNCLOUD_RUN_DIR=${UNCLOUD_RUN_DIR:-/run/uncloud} + +log() { + echo -e "\033[1;32m$1\033[0m" +} + +error() { + echo -e "\033[1;31mERROR: $1\033[0m" >&2 + exit 1 +} + +confirm() { + if [ "${AUTO_CONFIRM}" = "true" ]; then + return 0 + fi + + read -r -p "$1 [y/N] " response + case "$response" in + [yY][eE][sS]|[yY]) + return 0 + ;; + *) + return 1 + ;; + esac +} + +# Check if user is root. +if [ "$EUID" -ne 0 ]; then + error "Please run the uninstall script with sudo or as root." +fi + +# Confirm before proceeding. +log "⚠️This script will uninstall Uncloud and remove ALL service containers deployed to this machine." +log "The following actions will be performed:" +echo "- Remove Uncloud systemd services" +echo "- Remove Uncloud binaries and data" +echo "- Remove Uncloud user and group" +echo "- Remove all Docker containers managed by Uncloud" +echo "- Remove Uncloud Docker network" +echo "- Remove Uncloud WireGuard interface" + +if ! confirm "Do you want to proceed with uninstallation?"; then + log "Uninstallation cancelled." + exit 0 +fi + +log "⏳ Stopping systemd services..." +systemctl stop uncloud.service || log "uncloud.service not running or doesn't exist." +systemctl stop uncloud-corrosion.service || log "uncloud-corrosion.service not running or doesn't exist." +systemctl disable uncloud.service || log "uncloud.service already disabled or doesn't exist." +systemctl disable uncloud-corrosion.service || log "uncloud-corrosion.service already disabled or doesn't exist." +log "✓ Systemd services stopped." + +log "⏳ Removing systemd service files..." +rm -fv "${INSTALL_SYSTEMD_DIR}/uncloud.service" +rm -fv "${INSTALL_SYSTEMD_DIR}/uncloud-corrosion.service" +systemctl daemon-reload +log "✓ Systemd service files removed." + +log "⏳ Removing binaries..." +rm -fv "${INSTALL_BIN_DIR}/uncloudd" +rm -fv "${INSTALL_BIN_DIR}/uncloud-corrosion" +log "✓ Binaries removed." + +log "⏳ Removing data and run directories..." +rm -rfv "${UNCLOUD_DATA_DIR}" +rm -rfv "${UNCLOUD_RUN_DIR}" +log "✓ Data and run directories removed." + +log "⏳ Removing Linux user and group..." +if id "${UNCLOUD_USER}" &> /dev/null; then + userdel "${UNCLOUD_USER}" || error "Failed to remove user ${UNCLOUD_USER}, it may still be used by other processes." + log "✓ Linux user '${UNCLOUD_USER}' removed." +else + log "Linux user '${UNCLOUD_USER}' does not exist." +fi + +# Check if the group still exists (other users may be using it). +if getent group "${UNCLOUD_USER}" &> /dev/null; then + groupdel "${UNCLOUD_USER}" || error "Failed to remove group ${UNCLOUD_USER}, it may still be used by other processes or users." + log "✓ Linux group '${UNCLOUD_USER}' removed." +else + log "Linux group '${UNCLOUD_USER}' does not exist or was already removed." +fi + +log "⏳ Looking for Docker containers and network created by Uncloud..." +if command -v docker &> /dev/null; then + uncloud_containers=$(docker ps -a --filter "label=uncloud.managed" -q) + if [ -n "${uncloud_containers}" ]; then + log "Found $(echo "${uncloud_containers}" | wc -w) Uncloud managed containers." + log "⏳ Stopping Uncloud managed containers..." + echo "${uncloud_containers}" | xargs docker stop || error "Failed to stop Uncloud managed containers." + log "⏳ Removing Uncloud managed containers..." + echo "${uncloud_containers}" | xargs docker rm || error "Failed to remove Uncloud managed containers." + log "✓ Uncloud managed containers stopped and removed." + else + log "No Uncloud managed containers found." + fi + + uncloud_network=$(docker network ls --filter "name=uncloud" -q) + if [ -n "${uncloud_network}" ]; then + log "⏳ Removing Docker network uncloud..." + docker network rm uncloud || error "Failed to remove Docker network uncloud." + log "✓ Docker network uncloud removed." + else + log "Docker network uncloud not found." + fi +else + log "Docker CLI not found, skipping Docker container and network cleanup." +fi + +log "⏳ Removing WireGuard interface uncloud..." +if ip link show uncloud &> /dev/null; then + ip link delete uncloud + log "✓ WireGuard interface uncloud removed." +else + log "WireGuard interface uncloud not found." +fi + +echo +log "✅ Uncloud has been uninstalled successfully!" +log "Note: Docker installation was preserved. If you want to completely remove Docker as well, \ +follow https://docs.docker.com/engine/install/ubuntu/#uninstall-docker-engine"