#!/bin/bash # Konfigurationsvariablen FILE_URL="http://fileserver.fritz.box/Mobaxterm/Homelab.mxtsessions" INPUT_FILE="Homelab.mxtsessions" OUTPUT_FILE="serverliste.csv" LOG_FILE="script.log" LOG_RETENTION_DAYS=2 # Log-Einträge älter als X Tage werden entfernt log() { echo "[$(date +"%Y-%m-%d %H:%M:%S")] $1" | tee -a "$LOG_FILE" } clean_old_logs() { tmp_log="${LOG_FILE}.tmp" cutoff_date=$(date -d "-${LOG_RETENTION_DAYS} days" +'%Y-%m-%d %H:%M:%S') awk -v cutoff="$cutoff_date" ' /^\[[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}\]/ { timestamp = substr($0, 2, 19) if (timestamp >= cutoff) print $0 next } # Alle anderen Zeilen behalten (auch ohne Zeitstempel) { print $0 } ' "$LOG_FILE" > "$tmp_log" && mv "$tmp_log" "$LOG_FILE" } download_file() { rm -f "$INPUT_FILE" 2>/dev/null if wget -q "$FILE_URL" -O "$INPUT_FILE"; then log "Datei erfolgreich heruntergeladen." else log "Fehler: Datei konnte nicht heruntergeladen werden. Skript wird beendet." exit 1 fi } extract_data() { echo "Name,Host,Port,Benutzer" > "$OUTPUT_FILE" awk ' /^\[Bookmarks/ { in_section=1; next } /^\[/ && !/^\[Bookmarks/ { in_section=0 } in_section && /=#109#0%/ { split($0, parts, "=") name = parts[1] split(parts[2], details, "%") host = details[2] port = details[3] user = details[4] if (host != "") { if (port == "") port = "22" if (user == "") user = "root" print name "," host "," port "," user } } ' "$INPUT_FILE" >> "$OUTPUT_FILE" log "Daten extrahiert und in $OUTPUT_FILE gespeichert." } read_server_list() { server_names=() ip_addresses=() port_numbers=() usernames=() while IFS="," read -r name ip port user; do server_names+=("$name") ip_addresses+=("$ip") port_numbers+=("$port") usernames+=("$user") done < <(tail -n +2 "$OUTPUT_FILE") log "Serverliste erfolgreich eingelesen." } show_menu() { while true; do menu_entries=() for i in "${!server_names[@]}"; do menu_entries+=("$i" "${server_names[i]} (${ip_addresses[i]}:${port_numbers[i]})") done menu_entries+=("q" "Ende") gui_choice=$(whiptail --title "Serverauswahl" \ --menu "Wähle einen Server aus:" 20 90 10 \ "${menu_entries[@]}" 3>&1 1>&2 2>&3) if [[ $? -ne 0 || "$gui_choice" == "q" ]]; then log "Benutzer hat das Programm beendet." exit 0 fi index=$gui_choice log "Verbinde zu ${server_names[index]} (${usernames[index]}@${ip_addresses[index]}:${port_numbers[index]})..." ssh -p "${port_numbers[index]}" "${usernames[index]}@${ip_addresses[index]}" done } main() { [[ -f "$LOG_FILE" ]] && clean_old_logs log "Skript gestartet." download_file extract_data read_server_list show_menu } main