Compare commits

...

3 Commits

3 changed files with 96 additions and 8 deletions

67
Files/Sync.sh Executable file
View File

@ -0,0 +1,67 @@
#!/bin/bash
# === IMPORTS ===
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/../Utility/Lock.sh"
source "$SCRIPT_DIR/../Utility/Log.sh"
# === Hilfe-Seite ===
if [[ "$*" == *"-h"* ]] || [[ "$#" -ne 3 ]]; then
echo "Benutzung: $0 <SYNC_NAME> <DIR1> <DIR2>"
echo
echo "Optionen:"
echo " -h Zeigt diese Hilfenachricht an"
echo " SYNC_NAME Der Name dieser Synchronisation"
echo " DIR1 Der absolute Dateipfad eines Synchronisationsordners"
echo " DIR2 Der absolute Dateipfad eines Synchronisationsordners"
echo
echo "Folgende Pakete müssen installiert sein: unison"
echo
echo "Dieses Skript synchronisiert zwei Ordner miteinander."
exit 0
fi
# === Variablen ===
SYNC_NAME="$1"
DIR1="$2"
DIR2="$3"
# === TRAP EINRICHTEN ===
# Signalbehandlung einrichten, um Lock-Datei bei Abbruch zu entfernen
trap "trap_remove_lock '$SYNC_NAME'" SIGINT SIGTERM
# === LOCK-FILE ERSTELLEN ===
# Lock-Datei erstellen, um parallele Ausführungen zu verhindern
create_lock "$SYNC_NAME"
# Prüfen, ob Unison installiert ist, und es bei Bedarf installieren
if ! command -v unison &>/dev/null; then
echo "Unison ist nicht installiert. Installiere..."
sudo apt update && sudo apt install -y unison |& while IFS= read -r line; do log "$line"; done
fi
# === Hauptskript ===
# Synchronisationsdatei nur erstellen, wenn sie noch nicht existiert
SYNC_FILE="$HOME/.unison/$SYNC_NAME.prf"
if [[ ! -f "$SYNC_FILE" ]]; then
echo "Erstelle Standard-Unison-Profil..."
mkdir -p "$(dirname "$SYNC_FILE")"
cat <<EOF >"$SYNC_FILE"
root = $DIR1
root = $DIR2
auto = true
batch = true
EOF
else
echo "Unison-Profil existiert bereits: $SYNC_FILE"
fi
# Unison ausführen, um die Synchronisation durchzuführen
echo "Starte Synchronisation mit Unison..."
unison $SYNC_NAME |& while IFS= read -r line; do log "$line"; done
# === LOCK-FILE ENTFERNEN ===
# Lock-Datei entfernen, um die Ausführung freizugeben
remove_lock "$SYNC_NAME"

View File

@ -5,21 +5,37 @@ if [[ ! -w "$LOCK_DIR" ]]; then
LOCK_DIR="/tmp" # Fallback für benutzerspezifische Locks
fi
LOCK_FILE="$LOCK_DIR/$(basename "$0").lock"
# Funktion zur Erstellung des Lock-Dateinamens
get_lock_file() {
local suffix="$1"
if [[ -n "$suffix" ]]; then
echo "$LOCK_DIR/$(basename "$0")_$suffix.lock"
else
echo "$LOCK_DIR/$(basename "$0").lock"
fi
}
create_lock() {
if [[ -e "$LOCK_FILE" ]]; then
log "Ein anderer Prozess läuft bereits. Lock-File gefunden: $LOCK_FILE"
local suffix="$1"
local lock_file
lock_file=$(get_lock_file "$suffix")
if [[ -e "$lock_file" ]]; then
log "Ein anderer Prozess läuft bereits. Lock-File gefunden: $lock_file"
exit 1
fi
touch "$LOCK_FILE"
log "Lock-File erstellt: $LOCK_FILE"
touch "$lock_file"
log "Lock-File erstellt: $lock_file"
}
remove_lock() {
if [[ -e "$LOCK_FILE" ]]; then
rm -f "$LOCK_FILE"
log "Lock-File entfernt: $LOCK_FILE"
local suffix="$1"
local lock_file
lock_file=$(get_lock_file "$suffix")
if [[ -e "$lock_file" ]]; then
rm -f "$lock_file"
log "Lock-File entfernt: $lock_file"
fi
}

View File

@ -17,6 +17,11 @@ log() {
touch "$LOGFILE"
fi
# Prüfen, ob der Benutzer der Besitzer des Verzeichnisses ist
if [ -d "$LOGDIR" ] && [ -O "$LOGDIR" ]; then
chmod -R 777 "$LOGDIR"
fi
if is_interactive; then
# Interaktive Shell
echo "$(date +'%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOGFILE" >/dev/tty