#!/bin/bash ################################################################# # ftplicity, das c't-Wrapper-Skript fuer duplicity (c't 13/06) # # (c) 2006 Christiane Ruetten, Heise Zeitschriften Verlag # ################################################################# # Dieses Programm steht unter der GPL. # # Bitte beachten Sie beigefuegte Lizenzbedingungen. # ################################################################# # Changelog: # Stevie Hoth (stevie@weareroot.de) # 1.2 - Neue Kommandostruktur von duplicity 0.4.4 eingepflegt (NICHT ABWAERTSKOMPATIBEL) # - Parameter USESHORTNAMES eingefuehrt (nuetzlich fuer zB Windows als Zielsystem) # - Parameter SETVOLSIZE eingefuehrt (andere Volumengroesse angeben) # - Parameter SETFULLIFOLDER eingefuehrt (bei einem inkrementellen Backup doch eine volles angefertigt, # wenn das letzte aelter als die angegebene Zeit ist) # Original by c't # 1.1.1 - Bugfix: Verschluesselung reaktiviert # 1.1 - Konfigurationsverzeichnis eingefuehrt # 1.0 - erstes Release # # Wichtige Dateien ############################## ME=$(basename "$0") CONFDIR="/etc/ftplicity" CONF="$CONFDIR/main.conf" PRE="$CONFDIR/pre.sh" POST="$CONFDIR/post.sh" EXCLUDE="$CONFDIR/exclude.conf" KEYFILE="$CONFDIR/gpg.key" DUPLICITY="$(which duplicity)" GPG="$(which gpg)" ALLOW_SOURCE_MISMATCH="" # Funktionsdefinitionen ######################### function usage { # Informationen zur Syntax ausgeben cat < [ ...] Kommandos: backup: inkrementelles Backup full: vollstaendiges Backup erzwingen list: Dateien im Backup auflisten verify: Backup pruefen und Aenderungen anzeigen purge [--force]: veraltete Backup-Archive anzeigen [und loeschen] cleanup [--force]: Backup-Verzeichnis aufraeumen (nach Programmabbruch) restore []: Backup nach restaurieren [vom Stand ] fetch [] Datei/Verzeichnis einzeln restaurieren (siehe Beispiel) Beispiele: Veraltete Backup-Archive anzeigen und loeschen: $ME purge --force Vollstaendiges Backup nach /mnt zurueckspielen: $ME restore /mnt Datei /etc/passwd nach /root/pw restaurieren, Stand vor 4 Tagen: $ME fetch etc/passwd /root/pw 4D (siehe "man duplicity", Abschnitt TIME FORMATS) Dateien in $CONFDIR $(basename "$CONF") Haupt-Konfigurationsdatei $(basename "$PRE") wird vor einem Backup ausgefuehrt $(basename "$POST") wird nach einem Backup ausgefuehrt $(basename "$KEYFILE") enthaelt exportierten GPG-Schluessel $(basename "$EXCLUDE") Liste ausgeschlossener Dateien und Verzeichnisse (siehe "man duplicity", Abschnitt FILE SELECTION) USAGE } function error { echo "Es ist ein fataler Fehler aufgetreten:" echo " $@" exit -1 } function ftply { # die eigentliche Wrapper-Funktion FTP_PASSWORD="$ZIEL_PW" \ PASSPHRASE="$GPG_PW" \ TMPDIR="$TEMP_DIR" \ $DUPLICITY "$@" } function secureconf { # Konfiguration absichern chmod -R go-rwx "$CONFDIR" || error "Konnte $CONFDIR nicht absichern" } # Beginn des Skriptes ########################### # Umgebung pruefen [ -z "$DUPLICITY" ] && error "duplicity muss installiert und im Pfad verfuegbar sein." [ -z "$GPG" ] && error "gpg muss installiert und im Pfad verfuegbar sein." # Konfigurationsverzeichnis pruefen if [ ! -d "$CONFDIR" ] ; then mkdir "$CONFDIR" || error "Konnte $CONFDIR nicht erstellen." # vorläufige Config-Datei erzeugen cat <"$CONF" # Daten fuer GPG-Schluessel GPG_KEY=_KEY_ID_ GPG_PW='_GPG_PASSWORT_' # Zugangsdaten fuer FTP-Server (URL-Format) ZIEL='ftp://_USER_@_SERVER_/_VERZEICHNIS_/' ZIEL_PW='_FTP_PASSWORT_' # Basisverzeichnis fuers Backup QUELLE='/' # aeltester Wiederherstellungszeitpunkt HOECHSTALTER=3M # Ausfuehrlichkeit der Bildschirmausgaben (9 fuer Fehlersuche) VERBOSITY=1 # Verzeichnis fuer temporaere Dateien. Beim Restore muss dort # mindestens Patz fuer die groesste Datei im Backup sein TEMP_DIR=/tmp EOF secureconf # Hinweise zur Erstbenutzung cat </dev/null 2>&1 ; then if [ ! -f "$KEYFILE" ] ; then touch "$KEYFILE" && chmod 0600 "$KEYFILE" $GPG --armor --export $GPG_KEY >>"$KEYFILE" $GPG --armor --export-secret-keys $GPG_KEY >>"$KEYFILE" fi else echo "Schlüssel $GPG_KEY nicht gefunden, versuche Import aus $KEYFILE." if [ -f "$KEYFILE" ] ; then $GPG --import "$KEYFILE" if ! $GPG --list-secret-key $GPG_KEY >/dev/null 2>&1 ; then error "Schluesseldatei $KEYFILE ungueltig." fi echo ; echo "Sie muessen den Trust-Level des Schluessels noch mit" echo "dem GPG-Edit-Befehl \"trust\" auf \"ultimate\" (5) setzen." echo "Beenden Sie den Editor anschliessend mit \"quit\"." echo ; sleep 3 $GPG --edit-key $GPG_KEY else error "Schluesseldatei $KEYFILE nicht gefunden." fi fi # Exclude-Datei muss (wenn auch leer) existieren [ -f "$EXCLUDE" ] || touch "$EXCLUDE" # Hauptteil des Skriptes ######################## cmd="$1" ; shift ; case "$cmd" in backup) [ -x "$PRE" ] && sh "$PRE" ftply --exclude-globbing-filelist "$EXCLUDE" $SHORTFILENAMES $FULLIFOLDERTHAN $VOLSIZE \ --encrypt-key $GPG_KEY \ --sign-key $GPG_KEY --verbosity $VERBOSITY \ "$QUELLE" "$ZIEL" [ -x "$POST" ] && sh "$POST" ;; full) [ -x "$PRE" ] && sh "$PRE" ftply full --exclude-globbing-filelist "$EXCLUDE" $SHORTFILENAMES $VOLSIZE\ --encrypt-key $GPG_KEY \ --sign-key $GPG_KEY --verbosity $VERBOSITY \ "$QUELLE" "$ZIEL" [ -x "$POST" ] && sh "$POST" ;; verify) ftply verify --exclude-globbing-filelist "$EXCLUDE" \ --encrypt-key $GPG_KEY \ --sign-key $GPG_KEY --verbosity $VERBOSITY \ "$ZIEL" "$QUELLE" ;; list) ftply list-current-files \ --encrypt-key $GPG_KEY \ --sign-key $GPG_KEY --verbosity $VERBOSITY \ "$ZIEL" ;; status) ftply collection-status \ --encrypt-key $GPG_KEY \ --sign-key $GPG_KEY --verbosity $VERBOSITY \ "$ZIEL" ;; cleanup) ftply cleanup \ --encrypt-key $GPG_KEY \ --sign-key $GPG_KEY --verbosity $VERBOSITY \ "$@" "$ZIEL" ;; purge) ftply remove-older-than "$HOECHSTALTER" \ --encrypt-key $GPG_KEY \ --sign-key $GPG_KEY --verbosity $VERBOSITY \ "$@" "$ZIEL" ;; restore) ftply --encrypt-key $GPG_KEY \ --sign-key $GPG_KEY --verbosity $VERBOSITY \ --restore-time "${2:-now}" "$ZIEL" "$1" ;; fetch) ftply --encrypt-key $GPG_KEY \ --sign-key $GPG_KEY --verbosity $VERBOSITY \ --restore-time "${3:-now}" --file-to-restore "$1" "$ZIEL" "$2" ;; *) usage exit -1 ;; esac exit $?