#!/bin/bash set -e # --- Colors and Formatting --- RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' BOLD='\033[1m' RESET='\033[0m' info() { echo -e "${BLUE}ℹ $*${RESET}"; } success() { echo -e "${GREEN}✅ $*${RESET}"; } warn() { echo -e "${YELLOW}⚠ $*${RESET}"; } error() { echo -e "${RED}❌ $*${RESET}"; } # --- Detect Package Manager --- info "Detecting package manager..." if command -v nala &>/dev/null; then PM="nala" elif command -v apt &>/dev/null; then PM="apt" elif command -v dnf &>/dev/null; then PM="dnf" elif command -v yum &>/dev/null; then PM="yum" elif command -v pacman &>/dev/null; then PM="pacman" elif command -v zypper &>/dev/null; then PM="zypper" else error "No supported package manager found (apt/nala/dnf/yum/pacman/zypper)." exit 1 fi success "Detected: $PM" # --- System Update and Cleanup --- info "Starting system update and maintenance..." # Update and upgrade system case "$PM" in nala) info "Updating package list and upgrading system (nala)..." sudo nala update sudo nala upgrade -y sudo nala autoremove -y --purge sudo nala clean ;; apt) info "Updating package list and upgrading system (apt)..." sudo apt update sudo apt upgrade -y sudo apt autoremove -y --purge sudo apt clean ;; dnf) info "Updating and cleaning system (dnf)..." sudo dnf upgrade --refresh -y sudo dnf autoremove -y sudo dnf clean all ;; yum) info "Updating and cleaning system (yum)..." sudo yum update -y sudo yum autoremove -y sudo yum clean all ;; pacman) info "Updating and cleaning system (pacman)..." sudo pacman -Syu --noconfirm sudo pacman -Rns $(pacman -Qtdq) --noconfirm 2>/dev/null || true sudo pacman -Sc --noconfirm ;; zypper) info "Updating and cleaning system (zypper)..." sudo zypper refresh sudo zypper update -y sudo zypper clean --all ;; esac # --- Docker System Prune --- if command -v docker &>/dev/null; then info "Pruning Docker system..." sudo docker system prune -a -f --volumes success "Docker system pruned." else warn "Docker not installed. Skipping Docker prune." fi # --- Flatpak Update --- if command -v flatpak &>/dev/null; then info "Updating Flatpak packages..." flatpak update -y success "Flatpak packages updated." else warn "Flatpak not installed. Skipping Flatpak update." fi # --- Snap Update --- if command -v snap &>/dev/null; then info "Updating Snap packages..." sudo snap refresh success "Snap packages updated." else warn "Snap not installed. Skipping Snap update." fi # --- Clean Journal Logs --- info "Cleaning journal logs (older than 7 days)..." sudo journalctl --vacuum-time=7d success "Journal logs cleaned." # --- Clean Thumbnails Cache --- info "Cleaning thumbnails cache..." rm -rf ~/.cache/thumbnails/* success "Thumbnails cache cleaned." # --- Clean Temporary Files --- info "Cleaning /tmp and user cache..." sudo rm -rf /tmp/* ~/.cache/* success "Temporary files and cache cleaned." # --- Update Locate Database --- info "Updating locate database..." if command -v updatedb &>/dev/null; then sudo updatedb else info "Installing mlocate/plocate for 'updatedb'..." case "$PM" in apt|nala) sudo apt install -y plocate || sudo apt install -y mlocate ;; dnf) sudo dnf install -y plocate || sudo dnf install -y mlocate ;; yum) sudo yum install -y mlocate ;; pacman) sudo pacman -S --noconfirm mlocate ;; zypper) sudo zypper install -y mlocate ;; esac sudo updatedb fi success "Locate database updated." # --- Remove Orphaned Packages (Pacman/DNF) --- case "$PM" in pacman) info "Removing orphaned packages (pacman)..." sudo pacman -Rns $(pacman -Qtdq) --noconfirm 2>/dev/null || true ;; dnf) info "Removing orphaned packages (dnf)..." sudo dnf remove --unused -y ;; esac # --- Check if Restart is Recommended --- REBOOT_REQUIRED=false # Check for kernel updates (Debian/Ubuntu) if [ -f /var/run/reboot-required ]; then REBOOT_REQUIRED=true fi # Check for pending Docker daemon restart if sudo systemctl is-active docker >/dev/null 2>&1 && [ -n "$(sudo docker info 2>/dev/null | grep 'Pending updates')" ]; then REBOOT_REQUIRED=true fi # Check for other common restart triggers (e.g., glibc, systemd) if [ -f /var/run/reboot-required.pkgs ]; then REBOOT_REQUIRED=true fi # --- Final Message --- echo -e "${GREEN}${BOLD}✅ System update and maintenance completed!${RESET}" if [ "$REBOOT_REQUIRED" = true ]; then warn "⚠ A system restart is recommended to apply all updates (e.g., kernel, Docker, or critical libraries)." warn " This is especially important for cryptocurrency nodes, Proxmox, and UniFi services." else echo -e "${GREEN}✅ No restart required.${RESET}" fi