From 3f70509085bca332b9936b309432970eacd80bd1 Mon Sep 17 00:00:00 2001 From: christian Date: Sun, 10 May 2026 12:08:11 +0200 Subject: [PATCH] Coniguration Backup mit seperaten Datei --- README.md | 4 +- find.sh | 161 +++++++++++++++++++++++++++++++++--------------- sync_configs.sh | 126 +++++++++++++++++++++++++++++++++++++ 3 files changed, 239 insertions(+), 52 deletions(-) create mode 100755 sync_configs.sh diff --git a/README.md b/README.md index 468ac48..65c44b5 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ Dieses Bash-Skript automatisiert das Erstellen einer konsistenten Ordnerstruktur ## 🚀 Funktionen * Automatisierte Struktur: Erstellt vordefinierte Ordner für Hardware- und Softwareprojekte. -* Verschlagwortung (Tags): Fragt beim Erstellen Schlagworte ab und schreibt diese als #Tags in die Projekt-README für eine blitzschnelle Suche. +* Verschlagwortung (Tags): Fragt beim Erstellen Schlagworte ab und schreibt diese als Tags in die Projekt-README für eine blitzschnelle Suche. * Einsatzfertig: * Erstellt direkt eine main.py für Python-Projekte. * Erstellt ein ausführbares .sh-Skript für Bash-Projekte. @@ -55,7 +55,7 @@ Starte die Toolbox über das Desktop-Icon oder direkt im Terminal via `./toolbox Wähle **"1. Projekt erstellen"**. Ein grafischer Dialog führt dich durch die Einrichtung: * **Name**: Der Projektname (Leerzeichen werden automatisch in Unterstriche umgewandelt). * **Typ**: Auswahl zwischen Hardware (CAD/CAM Struktur) oder Software (Python/Bash). -* **Tags**: Schlagworte für die spätere Suche (z.B. #Motor #ESP32). +* **Tags**: Schlagworte für die spätere Suche. ![Projekt-Setup Dialog](name_angabe.png) ![Projekt-Setup Dialog](kategorien_auswahl.png) diff --git a/find.sh b/find.sh index 52f9420..569ca13 100755 --- a/find.sh +++ b/find.sh @@ -1,56 +1,117 @@ #!/bin/bash -# Pfad ermitteln -SCRIPT_PATH=$(readlink -f "$0") -BASE_DIR=$(dirname "$SCRIPT_PATH") +# ============================================================================== +# TOOLBOX MODUL: CONFIG-SYNC PRO (Relativ-Edition) +# ============================================================================== -while true; do - # 1. Tags sammeln (optimiert) - # Wir filtern hier noch aggressiver nach sauberen Text-Tags - tag_counts=$(grep -rhioE "(#\w+|Tags:.*)" "$BASE_DIR" --include="README.md" 2>/dev/null | \ - sed 's/Tags://g' | tr ',' '\n' | tr -d '\r' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//' | \ - grep -v '^$' | sort | uniq -c | sort -rn) +# 1. DYNAMISCHE PFADERMITTLUNG +# Ermittelt den Ordner, in dem dieses Skript liegt +SCRIPT_DIR=$(dirname "$(readlink -f "$0")") - if [ -z "$tag_counts" ]; then - zenity --error --title="Fehler" --text="Keine Tags gefunden in:\n$BASE_DIR" - break +# Ordner relativ zum Skript-Standort definieren +CONFIG_DIR="$SCRIPT_DIR/configs/profiles" +BACKUP_BASE="$SCRIPT_DIR/configs/data" + +# Ordner sofort erstellen +mkdir -p "$CONFIG_DIR" +mkdir -p "$BACKUP_BASE" + +# 2. UMGEBUNGSPRÜFUNG +ZENITY_BIN=$(which zenity) +[ -z "$ZENITY_BIN" ] && ZENITY_BIN="/usr/bin/zenity" + +# Prüfen auf grafische Oberfläche (wichtig für SSH) +if [ -z "$DISPLAY" ]; then + echo "FEHLER: Keine grafische Oberfläche (DISPLAY) erkannt." + echo "Nutze 'ssh -X christian@debian-keller' für den Fernzugriff." + exit 1 +fi + +# 3. PROFIL-MANAGEMENT +PROFILES="" +if ls "$CONFIG_DIR"/*.conf >/dev/null 2>&1; then + PROFILES=$(ls "$CONFIG_DIR"/*.conf | xargs -n 1 basename | sed 's/\.conf//') +fi + +# Auswahlfenster für Profil +if [ -z "$PROFILES" ]; then + PROFILE_ACTION=$($ZENITY_BIN --list --title="Profil-Management" --column="Aktion" \ + "Neues Profil erstellen" --width=300 --height=200) +else + PROFILE_ACTION=$($ZENITY_BIN --list --title="Profil wählen" --column="Profil / Aktion" \ + $PROFILES "Neues Profil erstellen" --width=300 --height=300) +fi + +[ -z "$PROFILE_ACTION" ] && exit 0 + +# 4. PROFIL-DATEI FESTLEGEN +if [ "$PROFILE_ACTION" == "Neues Profil erstellen" ]; then + PROFILE_NAME=$($ZENITY_BIN --entry --title="Neues Profil" --text="Name (z.B. Keller_PC):") + [ -z "$PROFILE_NAME" ] && exit 0 + PROFILE_FILE="$CONFIG_DIR/${PROFILE_NAME}.conf" + + # Standard-Einträge für ein neues Profil + echo "CrealitySlicer|$HOME/.config/CrealitySlicer/" > "$PROFILE_FILE" + echo "FreeCAD|$HOME/.config/FreeCAD/" >> "$PROFILE_FILE" + $ZENITY_BIN --info --text="Profil $PROFILE_NAME erstellt." --width=250 +else + PROFILE_FILE="$CONFIG_DIR/${PROFILE_ACTION}.conf" +fi + +# 5. AKTION WÄHLEN +ACTION=$($ZENITY_BIN --list --title="Aktion wählen" \ + --column="Aktion" "Backup (System -> Toolbox)" "Restore (Toolbox -> System)" --width=300) +[ -z "$ACTION" ] && exit 0 + +# 6. PROGRAMM-AUSWAHL +PROGRAM_LIST=$(cat "$PROFILE_FILE") +OPTIONS=() +while IFS='|' read -r NAME PATH; do + [ -z "$NAME" ] && continue + OPTIONS+=(FALSE "$NAME") +done <<< "$PROGRAM_LIST" + +SELECTED=$($ZENITY_BIN --list --title="Programme wählen" --checklist \ + --column="Wahl" --column="Programm" "${OPTIONS[@]}" --width=350 --height=400) +[ -z "$SELECTED" ] && exit 0 + +# 7. DURCHFÜHRUNG +IFS='|' read -ra ADDR <<< "$SELECTED" +for NAME in "${ADDR[@]}"; do + CURRENT_PATH=$(grep "^$NAME|" "$PROFILE_FILE" | cut -d'|' -f2) + + NEW_PATH=$($ZENITY_BIN --entry --title="$NAME" --text="Pfad prüfen/anpassen:" \ + --entry-text="$CURRENT_PATH" --width=500) + + if [ -n "$NEW_PATH" ]; then + # Profil-Datei bei Änderung aktualisieren + if [ "$NEW_PATH" != "$CURRENT_PATH" ]; then + # Nutzt @ als Trenner in sed, falls Pfade Slashes enthalten + sed -i "s@^$NAME|.*@$NAME|$NEW_PATH@" "$PROFILE_FILE" + fi + + DEST_PATH="$BACKUP_BASE/$NAME" + + if [ "$ACTION" == "Backup (System -> Toolbox)" ]; then + if [ -e "$NEW_PATH" ]; then + mkdir -p "$DEST_PATH" + rsync -av --delete "$NEW_PATH/" "$DEST_PATH/" + else + $ZENITY_BIN --error --text="Quellpfad nicht gefunden:\n$NEW_PATH" + fi + elif [ "$ACTION" == "Restore (Toolbox -> System)" ]; then + if [ -d "$DEST_PATH" ]; then + # Sicherheitskopie mit Tilde (~) erstellen + if [ -e "$NEW_PATH" ]; then + TIMESTAMP=$(date +%Y%m%d_%H%M%S) + BACKUP_NAME="${NEW_PATH%/}_${TIMESTAMP}~" + mv "$NEW_PATH" "$BACKUP_NAME" + fi + mkdir -p "$NEW_PATH" + rsync -av "$DEST_PATH/" "$NEW_PATH/" + fi + fi fi +done - # 2. Anzeige-Liste erstellen - zenity_list=$(echo "$tag_counts" | awk '{count=$1; $1=""; print $0 " (" count ")"}' | sed 's/^[[:space:]]*//') - - # 3. Auswahl - selected_item=$(echo "$zenity_list" | zenity --list \ - --title="Projekt-Tag-Suche" \ - --column="Tag (Anzahl)" \ - --width=400 --height=500 \ - --text="Wähle einen Tag aus:") - - if [ -z "$selected_item" ]; then break; fi - - # Extrahiere den reinen Tag (nimmt alles vor der ersten Klammer) - selected_tag=$(echo "$selected_item" | sed 's/ (.*)//') - - # 4. Suche nach den Projekten - # Wir suchen jetzt nach dem exakten String im gesamten Verzeichnisbaum - results=$(grep -rlF "$selected_tag" "$BASE_DIR" --include="README.md" 2>/dev/null | while read -r file; do - dirname "$file" - done | sort -u) - - if [ -z "$results" ]; then - zenity --info --text="Keine Projekte für den Tag '$selected_tag' gefunden.\n\nSuchpfad: $BASE_DIR" - continue - fi - - # 5. Projektauswahl - selected_project=$(echo "$results" | zenity --list \ - --title="Ergebnisse für: $selected_tag" \ - --column="Projekt-Pfad" \ - --width=800 --height=400 \ - --ok-label="README öffnen" \ - --cancel-label="Zurück") - - if [ -n "$selected_project" ] && [ -f "$selected_project/README.md" ]; then - xdg-open "$selected_project/README.md" &>/dev/null & - fi -done \ No newline at end of file +$ZENITY_BIN --info --text="Vorgang erfolgreich beendet!" --width=250 \ No newline at end of file diff --git a/sync_configs.sh b/sync_configs.sh new file mode 100755 index 0000000..8cdda8e --- /dev/null +++ b/sync_configs.sh @@ -0,0 +1,126 @@ +#!/bin/bash + +# ============================================================================== +# TOOLBOX MODUL: CONFIG-SYNC PRO (Dynamic Folder Edition) +# ============================================================================== + +# 1. SYSTEM-PFADE SICHERSTELLEN +export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin + +# 2. DYNAMISCHE PFADERMITTLUNG FÜR DAS SKRIPT +# Findet den Ort, an dem dieses Skript gespeichert ist +SCRIPT_DIR=$(dirname "$(readlink -f "$0")") + +# Ordner relativ zum Skript-Standort definieren +CONFIG_DIR="$SCRIPT_DIR/configs/profiles" +BACKUP_BASE="$SCRIPT_DIR/configs/data" + +# Ordner sofort erstellen +/usr/bin/mkdir -p "$CONFIG_DIR" +/usr/bin/mkdir -p "$BACKUP_BASE" + +# 3. UMGEBUNGSPRÜFUNG +ZENITY_BIN=$(/usr/bin/which zenity) +[ -z "$ZENITY_BIN" ] && ZENITY_BIN="/usr/bin/zenity" + +# Prüfen auf grafische Oberfläche (wichtig für SSH) +if [ -z "$DISPLAY" ]; then + echo "FEHLER: Keine grafische Oberfläche (DISPLAY) erkannt." + echo "Nutze 'ssh -X christian@debian-keller' für den Fernzugriff." + exit 1 +fi + +# 4. PROFIL-MANAGEMENT +PROFILES="" +if /usr/bin/ls "$CONFIG_DIR"/*.conf >/dev/null 2>&1; then + PROFILES=$(/usr/bin/ls "$CONFIG_DIR"/*.conf | /usr/bin/xargs -n 1 basename | /usr/bin/sed 's/\.conf//') +fi + +# Auswahlfenster für Profil +if [ -z "$PROFILES" ]; then + PROFILE_ACTION=$($ZENITY_BIN --list --title="Profil-Management" --column="Aktion" \ + "Neues Profil erstellen" --width=300 --height=200) +else + PROFILE_ACTION=$($ZENITY_BIN --list --title="Profil wählen" --column="Profil / Aktion" \ + $PROFILES "Neues Profil erstellen" --width=300 --height=300) +fi + +[ -z "$PROFILE_ACTION" ] && exit 0 + +# 5. PROFIL-DATEI FESTLEGEN +if [ "$PROFILE_ACTION" == "Neues Profil erstellen" ]; then + PROFILE_NAME=$($ZENITY_BIN --entry --title="Neues Profil" --text="Name (z.B. Keller_PC):") + [ -z "$PROFILE_NAME" ] && exit 0 + PROFILE_FILE="$CONFIG_DIR/${PROFILE_NAME}.conf" + + # Standard-Einträge für ein neues Profil + echo "CrealitySlicer|$HOME/.config/CrealitySlicer/" > "$PROFILE_FILE" + echo "FreeCAD|$HOME/.config/FreeCAD/" >> "$PROFILE_FILE" + $ZENITY_BIN --info --text="Profil $PROFILE_NAME erstellt." --width=250 +else + PROFILE_FILE="$CONFIG_DIR/${PROFILE_ACTION}.conf" +fi + +# 6. AKTION WÄHLEN +ACTION=$($ZENITY_BIN --list --title="Aktion wählen" \ + --column="Aktion" "Backup (System -> Toolbox)" "Restore (Toolbox -> System)" --width=300) +[ -z "$ACTION" ] && exit 0 + +# 7. PROGRAMM-AUSWAHL +PROGRAM_LIST=$(/usr/bin/cat "$PROFILE_FILE") +OPTIONS=() +while IFS='|' read -r NAME PATH; do + [ -z "$NAME" ] && continue + OPTIONS+=(FALSE "$NAME") +done <<< "$PROGRAM_LIST" + +SELECTED=$($ZENITY_BIN --list --title="Programme wählen" --checklist \ + --column="Wahl" --column="Programm" "${OPTIONS[@]}" --width=350 --height=400) +[ -z "$SELECTED" ] && exit 0 + +# 8. DURCHFÜHRUNG +IFS='|' read -ra ADDR <<< "$SELECTED" +for NAME in "${ADDR[@]}"; do + # Pfad aus Profil laden + CURRENT_PATH=$(/usr/bin/grep "^$NAME|" "$PROFILE_FILE" | /usr/bin/cut -d'|' -f2) + + # Pfad-Bestätigung (vorausgefüllt aus cp.conf) + NEW_PATH=$($ZENITY_BIN --entry --title="$NAME" --text="Pfad prüfen/anpassen:" \ + --entry-text="$CURRENT_PATH" --width=600) + + if [ -n "$NEW_PATH" ]; then + # Profil-Datei bei Änderung aktualisieren + if [ "$NEW_PATH" != "$CURRENT_PATH" ]; then + /usr/bin/sed -i "s@^$NAME|.*@$NAME|$NEW_PATH@" "$PROFILE_FILE" + fi + + # DYNAMISCHER ORDNERNAME: Wir nehmen den Namen des Ordners aus dem Systempfad + # Entfernt abschließende Slashes für basename + CLEAN_PATH="${NEW_PATH%/}" + REAL_FOLDER_NAME=$(/usr/bin/basename "$CLEAN_PATH") + DEST_PATH="$BACKUP_BASE/$REAL_FOLDER_NAME" + + if [ "$ACTION" == "Backup (System -> Toolbox)" ]; then + if [ -e "$NEW_PATH" ]; then + /usr/bin/mkdir -p "$DEST_PATH" + # Sichert in den Ordner mit dem Namen aus dem System (z.B. CrealityPrint) + /usr/bin/rsync -av --delete "$NEW_PATH/" "$DEST_PATH/" + else + $ZENITY_BIN --error --text="Quellpfad nicht gefunden:\n$NEW_PATH" + fi + elif [ "$ACTION" == "Restore (Toolbox -> System)" ]; then + if [ -d "$DEST_PATH" ]; then + # Sicherheitskopie mit Tilde (~) erstellen + if [ -e "$NEW_PATH" ]; then + TIMESTAMP=$(/usr/bin/date +%Y%m%d_%H%M%S) + BACKUP_NAME="${CLEAN_PATH}_${TIMESTAMP}~" + /usr/bin/mv "$NEW_PATH" "$BACKUP_NAME" + fi + /usr/bin/mkdir -p "$NEW_PATH" + /usr/bin/rsync -av "$DEST_PATH/" "$NEW_PATH/" + fi + fi + fi +done + +$ZENITY_BIN --info --text="Vorgang erfolgreich beendet!" --width=250 \ No newline at end of file