Diagnose - script

Here is a diagnose script for Zorin os 18.

#!/bin/bash
# ------------------------------------------------------------
# Zorin/Ubuntu Interaktives Diagnose & Reparatur Script
# Version: 2.0
# Verbesserte Fehlerbehandlung, Logging & User Experience
# ------------------------------------------------------------

# Farben für die Konsole
GREEN="\033[0;32m"
YELLOW="\033[1;33m"
RED="\033[0;31m"
BLUE="\033[0;34m"
NC="\033[0m"

# Globale Variablen
LOGFILE="/tmp/diagnose_$(date +%Y%m%d_%H%M%S).log"
ERROR_COUNT=0
WARNING_COUNT=0

# ----------------------------
# Initialisierung
# ----------------------------
init_script() {
    echo -e "${GREEN}=== Interaktives Diagnose & Reparatur Script v2.0 ===${NC}"
    echo -e "${BLUE}Logfile wird erstellt: $LOGFILE${NC}\n"
    
    # Logfile Header
    {
        echo "=== Diagnose Log ==="
        echo "Datum: $(date)"
        echo "Hostname: $(hostname)"
        echo "Kernel: $(uname -r)"
        echo "===================="
        echo ""
    } > "$LOGFILE"
    
    # Sudo-Check
    if [ "$EUID" -ne 0 ] && ! sudo -n true 2>/dev/null; then
        echo -e "${YELLOW}Hinweis: Dieses Script benötigt sudo-Rechte für die meisten Funktionen.${NC}"
        echo -e "${YELLOW}Du wirst möglicherweise nach deinem Passwort gefragt.${NC}\n"
    fi
}

# ----------------------------
# Hilfsfunktionen
# ----------------------------
log_output() {
    tee -a "$LOGFILE"
}

log_error() {
    echo -e "${RED}[FEHLER] $1${NC}" | log_output
    ((ERROR_COUNT++))
}

log_warning() {
    echo -e "${YELLOW}[WARNUNG] $1${NC}" | log_output
    ((WARNING_COUNT++))
}

log_success() {
    echo -e "${GREEN}[OK] $1${NC}" | log_output
}

install_if_missing() {
    local cmd=$1
    local pkg=$2
    if ! command -v "$cmd" &>/dev/null; then
        echo -e "${YELLOW}Installiere $pkg...${NC}" | log_output
        sudo apt install -y "$pkg" &>> "$LOGFILE" || {
            log_error "$pkg konnte nicht installiert werden"
            return 1
        }
        log_success "$pkg erfolgreich installiert"
    fi
    return 0
}

# ----------------------------
# Funktion: Menü anzeigen
# ----------------------------
show_menu() {
    echo -e "${YELLOW}┌─────────────────────────────────────────────────┐${NC}"
    echo -e "${YELLOW}│  Wähle die Checks, die du durchführen willst:  │${NC}"
    echo -e "${YELLOW}└─────────────────────────────────────────────────┘${NC}"
    echo "1) Systeminfos (Hardware, Treiber, Kernel)"
    echo "2) Paket-Check & Reparatur"
    echo "3) Temperaturen (CPU/GPU/Fans)"
    echo "4) Festplatten-Check (SMART)"
    echo "5) CPU & RAM Kurztest"
    echo "6) Netzwerk-Test"
    echo "7) Treiberprüfung (NVIDIA/AMD/Intel)"
    echo "8) Sicherheitsupdates prüfen & installieren"
    echo "9) Speicherplatz & große Dateien"
    echo "10) Systemlogs auf Fehler prüfen"
    echo ""
    echo "99) Alles ausführen"
    echo "0) Abbrechen"
    echo ""
    echo -n "Auswahl (z.B. 1 3 5): "
}

# ----------------------------
# Funktion: Systeminfos
# ----------------------------
check_systeminfo() {
    echo -e "\n${YELLOW}[1] Systeminformationen${NC}" | log_output
    echo "======================================" | log_output
    
    install_if_missing "inxi" "inxi" || return 1
    
    inxi -Fxz 2>&1 | log_output
    
    echo -e "\n${BLUE}Aktuelle Kernel-Version:${NC}" | log_output
    uname -r | log_output
    
    echo -e "\n${BLUE}Verfügbare Kernel:${NC}" | log_output
    dpkg --list | grep linux-image | log_output
    
    log_success "Systeminfo-Check abgeschlossen"
}

# ----------------------------
# Funktion: Paket-Check & Reparatur
# ----------------------------
check_packages() {
    echo -e "\n${YELLOW}[2] Paket-Check & Reparatur${NC}" | log_output
    echo "======================================" | log_output
    
    echo "Repariere beschädigte Pakete..." | log_output
    sudo apt --fix-broken install -y &>> "$LOGFILE"
    
    echo "Konfiguriere ausstehende Pakete..." | log_output
    sudo dpkg --configure -a &>> "$LOGFILE"
    
    echo "Entferne nicht mehr benötigte Pakete..." | log_output
    sudo apt autoremove -y &>> "$LOGFILE"
    
    echo "Bereinige Paket-Cache..." | log_output
    sudo apt autoclean &>> "$LOGFILE"
    
    # Prüfe auf ausstehende Neustarts
    if [ -f /var/run/reboot-required ]; then
        log_warning "Systemneustart erforderlich!"
        cat /var/run/reboot-required.pkgs 2>/dev/null | log_output
    fi
    
    log_success "Paket-Check abgeschlossen"
}

# ----------------------------
# Funktion: Temperaturen
# ----------------------------
check_temps() {
    echo -e "\n${YELLOW}[3] Hardware-Temperaturen${NC}" | log_output
    echo "======================================" | log_output
    
    install_if_missing "sensors" "lm-sensors" || return 1
    
    # Sensors automatisch konfigurieren (beim ersten Mal)
    if [ ! -f /etc/sensors3.conf ]; then
        echo "Konfiguriere Sensoren (kann einige Sekunden dauern)..." | log_output
        sudo sensors-detect --auto &>> "$LOGFILE"
    fi
    
    sensors 2>&1 | log_output
    
    # Warnungen bei hohen Temperaturen
    while IFS= read -r line; do
        if echo "$line" | grep -qE '\+[8-9][0-9]\.[0-9]°C|\+1[0-9]{2}\.[0-9]°C'; then
            log_warning "Hohe Temperatur erkannt: $line"
        fi
    done < <(sensors 2>/dev/null)
    
    log_success "Temperatur-Check abgeschlossen"
}

# ----------------------------
# Funktion: Festplatten-Check
# ----------------------------
check_disks() {
    echo -e "\n${YELLOW}[4] Festplatten-Check (SMART)${NC}" | log_output
    echo "======================================" | log_output
    
    install_if_missing "smartctl" "smartmontools" || return 1
    
    # Nur echte Festplatten prüfen (keine Loop-Devices etc.)
    for disk in $(lsblk -d -n -o NAME,TYPE | grep 'disk' | awk '{print $1}'); do
        echo -e "\n${BLUE}Disk: /dev/$disk${NC}" | log_output
        
        # SMART-Fähigkeit prüfen
        if sudo smartctl -i /dev/$disk &>> "$LOGFILE"; then
            # SMART-Health-Status
            if sudo smartctl -H /dev/$disk 2>&1 | grep -q "PASSED"; then
                log_success "/dev/$disk: SMART Status OK"
            else
                log_error "/dev/$disk: SMART Status FAILED!"
            fi
            
            # Detaillierte Infos
            sudo smartctl -A /dev/$disk 2>&1 | log_output
        else
            log_warning "/dev/$disk: SMART nicht verfügbar oder nicht unterstützt"
        fi
    done
    
    # Speicherplatz prüfen
    echo -e "\n${BLUE}Speicherplatz-Übersicht:${NC}" | log_output
    df -h 2>&1 | log_output
    
    # Warnung bei wenig freiem Speicher
    while IFS= read -r line; do
        usage=$(echo "$line" | awk '{print $5}' | tr -d '%')
        if [ "$usage" -ge 90 ] 2>/dev/null; then
            log_warning "Partition fast voll: $line"
        fi
    done < <(df -h | grep -v "Filesystem")
    
    log_success "Festplatten-Check abgeschlossen"
}

# ----------------------------
# Funktion: CPU & RAM Test
# ----------------------------
check_stress() {
    echo -e "\n${YELLOW}[5] CPU & RAM Kurztest${NC}" | log_output
    echo "======================================" | log_output
    
    install_if_missing "stress-ng" "stress-ng" || return 1
    
    echo "Starte Stresstest (10 Sekunden)..." | log_output
    echo "Dies belastet CPU und RAM kurzzeitig..." | log_output
    
    stress-ng --cpu 2 --vm 1 --vm-bytes 512M --timeout 10s --metrics-brief 2>&1 | log_output
    
    if [ ${PIPESTATUS[0]} -eq 0 ]; then
        log_success "Stresstest erfolgreich abgeschlossen"
    else
        log_error "Stresstest mit Fehlern beendet"
    fi
    
    # RAM-Info
    echo -e "\n${BLUE}RAM-Auslastung:${NC}" | log_output
    free -h | log_output
}

# ----------------------------
# Funktion: Netzwerk-Test
# ----------------------------
check_network() {
    echo -e "\n${YELLOW}[6] Netzwerk-Test${NC}" | log_output
    echo "======================================" | log_output
    
    # Netzwerk-Interfaces
    echo -e "${BLUE}Netzwerk-Interfaces:${NC}" | log_output
    ip addr show 2>&1 | log_output
    
    # Ping Test
    echo -e "\n${BLUE}Ping Test (Google DNS):${NC}" | log_output
    if ping -c 4 -W 2 8.8.8.8 &>> "$LOGFILE"; then
        log_success "Netzwerk-Verbindung OK (IP-Ebene)"
    else
        log_error "Keine Netzwerk-Verbindung (IP-Ebene)"
        return 1
    fi
    
    echo -e "\n${BLUE}Ping Test (google.com):${NC}" | log_output
    if ping -c 4 -W 2 google.com &>> "$LOGFILE"; then
        log_success "DNS-Auflösung OK"
    else
        log_warning "DNS-Auflösung fehlgeschlagen"
    fi
    
    # DNS Server
    echo -e "\n${BLUE}Konfigurierte DNS-Server:${NC}" | log_output
    if command -v resolvectl &>/dev/null; then
        resolvectl status | grep "DNS Servers" | log_output
    else
        cat /etc/resolv.conf | grep nameserver | log_output
    fi
    
    log_success "Netzwerk-Check abgeschlossen"
}

# ----------------------------
# Funktion: Treiberprüfung
# ----------------------------
check_drivers() {
    echo -e "\n${YELLOW}[7] Treiberprüfung${NC}" | log_output
    echo "======================================" | log_output
    
    # GPU erkennen
    echo -e "${BLUE}Erkannte GPUs:${NC}" | log_output
    lspci | grep -i vga | log_output
    lspci | grep -i 3d | log_output
    
    # NVIDIA
    if lspci | grep -i nvidia &>/dev/null; then
        echo -e "\n${BLUE}NVIDIA GPU erkannt${NC}" | log_output
        if command -v nvidia-smi &>/dev/null; then
            nvidia-smi 2>&1 | log_output
            log_success "NVIDIA-Treiber installiert und aktiv"
        else
            log_warning "NVIDIA GPU vorhanden, aber nvidia-smi nicht verfügbar"
            log_warning "Treiber möglicherweise nicht installiert"
        fi
    fi
    
    # AMD
    if lspci | grep -i amd | grep -i vga &>/dev/null; then
        echo -e "\n${BLUE}AMD GPU erkannt${NC}" | log_output
        if command -v glxinfo &>/dev/null; then
            glxinfo | grep -i "OpenGL renderer" | log_output
            log_success "AMD GPU-Treiber aktiv"
        else
            log_warning "glxinfo nicht installiert (mesa-utils)"
        fi
    fi
    
    # Intel
    if lspci | grep -i intel | grep -i vga &>/dev/null; then
        echo -e "\n${BLUE}Intel GPU erkannt${NC}" | log_output
        log_success "Intel integrierte Grafik (Standard-Treiber)"
    fi
    
    # Ubuntu Drivers Tool
    if command -v ubuntu-drivers &>/dev/null; then
        echo -e "\n${BLUE}Verfügbare proprietäre Treiber:${NC}" | log_output
        ubuntu-drivers list 2>&1 | log_output
        
        echo -e "\n${BLUE}Empfohlene Treiber:${NC}" | log_output
        ubuntu-drivers devices 2>&1 | log_output
        
        echo -e "\n${YELLOW}Möchtest du die empfohlenen Treiber installieren? (y/n):${NC} "
        read -r install_drivers
        if [[ "$install_drivers" =~ ^[Yy]$ ]]; then
            echo "Installiere empfohlene Treiber..." | log_output
            sudo ubuntu-drivers autoinstall &>> "$LOGFILE"
            log_success "Treiber-Installation abgeschlossen (Neustart erforderlich)"
        fi
    else
        log_warning "ubuntu-drivers nicht verfügbar"
    fi
    
    log_success "Treiber-Check abgeschlossen"
}

# ----------------------------
# Funktion: Sicherheitsupdates
# ----------------------------
check_updates() {
    echo -e "\n${YELLOW}[8] Sicherheitsupdates${NC}" | log_output
    echo "======================================" | log_output
    
    echo "Aktualisiere Paketlisten..." | log_output
    sudo apt update 2>&1 | log_output
    
    echo -e "\n${BLUE}Verfügbare Updates:${NC}" | log_output
    apt list --upgradable 2>/dev/null | log_output
    
    # Sicherheitsupdates zählen
    security_updates=$(apt list --upgradable 2>/dev/null | grep -i security | wc -l)
    if [ "$security_updates" -gt 0 ]; then
        log_warning "$security_updates Sicherheitsupdates verfügbar!"
    fi
    
    echo -e "\n${YELLOW}Updates installieren? (y/n):${NC} "
    read -r install_updates
    if [[ "$install_updates" =~ ^[Yy]$ ]]; then
        echo "Installiere Updates..." | log_output
        sudo apt upgrade -y 2>&1 | log_output
        log_success "Updates installiert"
    else
        log_warning "Updates übersprungen"
    fi
}

# ----------------------------
# Funktion: Speicherplatz-Analyse
# ----------------------------
check_diskspace() {
    echo -e "\n${YELLOW}[9] Speicherplatz & große Dateien${NC}" | log_output
    echo "======================================" | log_output
    
    # Übersicht
    df -h | log_output
    
    # Größte Verzeichnisse im Home
    echo -e "\n${BLUE}Größte Verzeichnisse in $HOME:${NC}" | log_output
    du -h "$HOME" --max-depth=1 2>/dev/null | sort -hr | head -10 | log_output
    
    # Alte Kernels
    echo -e "\n${BLUE}Installierte Kernel:${NC}" | log_output
    dpkg --list | grep linux-image | log_output
    
    # Paket-Cache
    echo -e "\n${BLUE}APT Cache Größe:${NC}" | log_output
    du -sh /var/cache/apt/archives 2>&1 | log_output
    
    log_success "Speicherplatz-Analyse abgeschlossen"
}

# ----------------------------
# Funktion: Systemlogs prüfen
# ----------------------------
check_systemlogs() {
    echo -e "\n${YELLOW}[10] Systemlogs auf Fehler prüfen${NC}" | log_output
    echo "======================================" | log_output
    
    # Letzte kritische Fehler
    echo -e "${BLUE}Kritische Fehler (letzte 24h):${NC}" | log_output
    journalctl -p err -S today 2>&1 | tail -50 | log_output
    
    # Kernel-Panics
    echo -e "\n${BLUE}Kernel-Panics:${NC}" | log_output
    dmesg | grep -i "panic\|oops\|bug" | log_output || echo "Keine Kernel-Panics gefunden" | log_output
    
    # OOM (Out of Memory)
    echo -e "\n${BLUE}Out-of-Memory Ereignisse:${NC}" | log_output
    dmesg | grep -i "out of memory\|oom" | log_output || echo "Keine OOM-Ereignisse" | log_output
    
    log_success "Systemlog-Check abgeschlossen"
}

# ----------------------------
# Hauptmenü & Ausführung
# ----------------------------
main() {
    init_script
    show_menu
    read -r choices
    
    # Eingabe validieren
    if [[ -z "$choices" || "$choices" == "0" ]]; then
        echo -e "${YELLOW}Abbruch...${NC}"
        exit 0
    fi
    
    if [[ ! "$choices" =~ ^[0-9\ ]+$ ]]; then
        log_error "Ungültige Eingabe! Nur Zahlen und Leerzeichen erlaubt."
        exit 1
    fi
    
    echo -e "\n${GREEN}Starte Diagnose...${NC}\n"
    
    # Befehle ausführen
    for choice in $choices; do
        case $choice in
            1) check_systeminfo ;;
            2) check_packages ;;
            3) check_temps ;;
            4) check_disks ;;
            5) check_stress ;;
            6) check_network ;;
            7) check_drivers ;;
            8) check_updates ;;
            9) check_diskspace ;;
            10) check_systemlogs ;;
            99)
                check_systeminfo
                check_packages
                check_temps
                check_disks
                check_stress
                check_network
                check_drivers
                check_updates
                check_diskspace
                check_systemlogs
                ;;
            *)
                log_error "Ungültige Auswahl: $choice"
                ;;
        esac
    done
    
    # Zusammenfassung
    echo -e "\n${GREEN}╔════════════════════════════════════════════════════╗${NC}"
    echo -e "${GREEN}║          DIAGNOSE ABGESCHLOSSEN                    ║${NC}"
    echo -e "${GREEN}╚════════════════════════════════════════════════════╝${NC}"
    echo -e "${BLUE}Durchgeführte Checks:${NC} $choices"
    echo -e "${BLUE}Logfile:${NC} $LOGFILE"
    
    if [ $ERROR_COUNT -gt 0 ]; then
        echo -e "${RED}Fehler gefunden:${NC} $ERROR_COUNT"
    fi
    
    if [ $WARNING_COUNT -gt 0 ]; then
        echo -e "${YELLOW}Warnungen:${NC} $WARNING_COUNT"
    fi
    
    if [ $ERROR_COUNT -eq 0 ] && [ $WARNING_COUNT -eq 0 ]; then
        echo -e "${GREEN}✓ Keine kritischen Probleme gefunden!${NC}"
    else
        echo -e "\n${YELLOW}Bitte überprüfe das Logfile für Details:${NC}"
        echo "  cat $LOGFILE"
    fi
    
    echo ""
}

# Script starten
main

create a file: nano ~/diagnose.sh

make it executable: chmod +x ~/diagnose.sh

run command in Console: ~/diagnose.sh

you can dump the result in any AI to get additional help.


I hope that helps other Users as it helped me.

Cheers Rash

2 Likes