Vorläufige Aufteilung auf einzelne Scripts
This commit is contained in:
1 parent
0c78fbaa4f
commit
1fcdb5669a
7 files changed
+541
No files matched your search
Executable
+222
@@ -0,0 +1,222 @@
|
||||
HOST_NAME=$(hostname)
|
||||
DAY=$(date +%u)
|
||||
|
||||
PASSPHRASE=1234567890
|
||||
EXT=tgz.gpg
|
||||
LIST_EXT=txt
|
||||
|
||||
# check if function $1 exists
|
||||
#
|
||||
# returns true/false
|
||||
#
|
||||
isFunction() { declare -Ff "$1" ; }
|
||||
|
||||
# Log-Datei schreiben.
|
||||
#
|
||||
# Die Ausgabe geht auch auf STDOUT, dadurch kann die vollständige Ausgabe,
|
||||
# einschließlich Status- und Fehlermeldungen der Programme in ein erweitertes
|
||||
# Log für die Fehlersuche umgeleitet werden.
|
||||
#
|
||||
# $1 - Typ, z.B. INFO, WARN, ERROR, etc.
|
||||
# $2 ff. - die Meldung, die ins Log geschreiben wird
|
||||
#
|
||||
log() {
|
||||
local type=$1
|
||||
if [ "$type" == "ERROR" ]; then ERROR=0; fi
|
||||
shift 1
|
||||
echo "$(date '+%d.%m.%Y %H:%M:%S') - $type $@" | sudo tee -a $LOG_FILE
|
||||
|
||||
}
|
||||
|
||||
# Ist $1 in der Liste der restlichen args $2, $3 ...
|
||||
#
|
||||
# zB. if is_in "foo" "foo" "bar" "foo bar" ; then ...
|
||||
# Leere Liste liefert immer false
|
||||
#
|
||||
is_in() {
|
||||
local search="$1"
|
||||
shift 1
|
||||
local e
|
||||
for e in "$@"; do [[ "$e" == "$search" ]] && return 0; done
|
||||
return 1
|
||||
}
|
||||
|
||||
# Alle Verzechnisnamen in einem Verzeichnis holen.
|
||||
#
|
||||
# $1 - Verzeichnis in dem gesucht wird als absoluter Pfad
|
||||
# $2 ff. - auszuschliessende Verzeichnisse (kann leer bleiben)
|
||||
#
|
||||
iterate_dirs_in() {
|
||||
local dirname
|
||||
local root=$1
|
||||
shift 1
|
||||
for dir in $(sudo find "$root" -maxdepth 1 -type d \! -wholename "$root"); do
|
||||
dirname=$(basename $dir)
|
||||
if ! is_in "$dirname" "$@"; then
|
||||
echo "$dirname"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
# create directory if it not exists
|
||||
#
|
||||
# $1 - dir to check
|
||||
#
|
||||
check_directory() {
|
||||
local dir=$1
|
||||
if [ -d "$1" ]; then
|
||||
return 0
|
||||
else
|
||||
mkdir -p "$1" && return 0
|
||||
sudo mkdir -p "$1" && return 0
|
||||
log ERROR "### could not create directory $1!"
|
||||
# no chance to recover
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Verzeichnis löschen
|
||||
#
|
||||
# Im Fehlerfall wird rc=1 zurückgegeben
|
||||
#
|
||||
# $1 - zu löschendes Verzeichnis
|
||||
#
|
||||
delete_dir() {
|
||||
local dir=$1
|
||||
sudo rm -rf "$dir" && return 0
|
||||
log ERROR "### could not delete directory $1!"
|
||||
# return error, so caller can decide what to do
|
||||
return 1
|
||||
}
|
||||
|
||||
# Slashes "/" im Pfadnamen durch Dashes "-" ersetzen, so dass der String als Dateiname verwendet werden kann.
|
||||
#
|
||||
# $1 - path
|
||||
backup_file_prefix() {
|
||||
echo "$1" | sed -E 's/^\///' | sed -E 's/\//-/g'
|
||||
}
|
||||
|
||||
# Verzeichnise in .tgz.gpg-Dateien sichern.
|
||||
#
|
||||
# $1 - Verzeichnis, das gesichert wird: alle Verzeichnisse darunter werden einzeln als .tgz.gpg-Datei gesichert
|
||||
# $2 - Zielverzeichnis für .tgz.gpg-Dateien
|
||||
# $3 ff. - Verzeichnisse, die nicht gesichert werden sollen (kann leer bleiben)
|
||||
#
|
||||
backup_all_dirs() {
|
||||
local root=$1
|
||||
local target=$2
|
||||
local prefix=$(backup_file_prefix $root)
|
||||
local tar_file
|
||||
local dir
|
||||
shift 2
|
||||
|
||||
for dir in $(iterate_dirs_in "$root" "$@"); do
|
||||
tar_file="$target/$prefix-$dir.$EXT"
|
||||
backup_dir "$root" "$tar_file" "$dir"
|
||||
create_list "$tar_file" "$dir"
|
||||
test_integrity "$tar_file"
|
||||
done
|
||||
}
|
||||
|
||||
# Einzelnes Verzeichnis sichern.
|
||||
#
|
||||
# $1 - Pfad um Verzeichnis, das gesichert werden soll
|
||||
# $2 - Zielpfad und -name für das Archiv
|
||||
# $2 - zu sicherndes Verzeichnis
|
||||
#
|
||||
backup_dir() {
|
||||
local root=$1
|
||||
local archive=$2
|
||||
local dir=$3
|
||||
log INFO "--- Backup $root/$dir -> $archive"
|
||||
sudo tar -c -z --numeric-owner --one-file-system --exclude "@eaDir" -C "$root" "$dir" | sudo gpg --batch -c --passphrase $PASSPHRASE -o "$archive"
|
||||
local rc=$?
|
||||
if [ "$rc" == "0" ] ; then
|
||||
log INFO "*** success"
|
||||
else
|
||||
log ERROR "### see full log"
|
||||
fi
|
||||
}
|
||||
|
||||
# Inhalt des Archivs in eine Textdatei ausgeben.
|
||||
#
|
||||
# $1 - Archiv
|
||||
#
|
||||
create_list() {
|
||||
local archive=$1
|
||||
log INFO "--- List $archive"
|
||||
sudo gpg --batch --decrypt --passphrase $PASSPHRASE "$archive" | sudo tar -tzv | sudo tee "$archive.$LIST_EXT" >/dev/null
|
||||
local rc=$?
|
||||
if [ "$rc" == "0" ] ; then
|
||||
log INFO "*** success"
|
||||
else
|
||||
log ERROR "### see full log"
|
||||
fi
|
||||
}
|
||||
|
||||
# Integrität des Archivs testen, indem es entschlüsselt, entpackt
|
||||
# und der Inhalt auf /dev/null ausgegeben wird.
|
||||
#
|
||||
# $1 - Archiv
|
||||
#
|
||||
test_integrity() {
|
||||
local archive=$1
|
||||
log INFO "--- Check integrity of $archive"
|
||||
sudo gpg --batch --decrypt --passphrase $PASSPHRASE "$archive" | sudo tar -xzO >/dev/null
|
||||
local rc=$?
|
||||
if [ "$rc" == "0" ] ; then
|
||||
log INFO "*** success"
|
||||
else
|
||||
log ERROR "### see full log"
|
||||
fi
|
||||
}
|
||||
|
||||
# Restore aus Archiv
|
||||
#
|
||||
# Wird nach pwd ausgegeben!
|
||||
#
|
||||
# $1 - Archiv, ggf. mit Pfad
|
||||
# $2 ff. - zurückzusichernde Dateien/Verzeichnisse
|
||||
#
|
||||
restore() {
|
||||
local archive=$1
|
||||
shift 1
|
||||
sudo gpg --batch --decrypt --passphrase $PASSPHRASE "$archive" | sudo tar -xzv $@ >/dev/null
|
||||
local rc=$?
|
||||
if [ "$rc" == "0" ] ; then
|
||||
log INFO "*** success"
|
||||
else
|
||||
log ERROR "### see full log"
|
||||
fi
|
||||
}
|
||||
|
||||
# Liste der Archives auf stdout ausgeben
|
||||
#
|
||||
# Zeigt alle Archive incl. Verzeichnis (ohne $1) an
|
||||
#
|
||||
# z.B.
|
||||
# $1 = /volume1/nfs/backups
|
||||
# ...
|
||||
# /daily/synology/backup.3/volume1-nfs-Server.tgz.gpg
|
||||
# /weekly/synology/volume1-media-books.tgz.gpg
|
||||
#
|
||||
# $1 - Verzeichnis unter dem alle Backups liegen
|
||||
#
|
||||
list_archives() {
|
||||
local target=$1
|
||||
local targ=${target//\//\\\/} # slashes escapen
|
||||
echo "#$targ#"
|
||||
sudo find "$target" -type f -name "*.$EXT" | grep "${HOST_NAME}/" | sed -E "s/^$targ//"
|
||||
}
|
||||
|
||||
# Inhalt des Archivs $2 auf stdout ausgeben
|
||||
#
|
||||
# $1 - Verzeichnis unter dem alle Backups liegen
|
||||
# $2 - Archiv-Datei mit Pfad ab $1
|
||||
#
|
||||
list_archive_content() {
|
||||
local root=$1
|
||||
local archive=$2
|
||||
|
||||
sudo cat "$root/${archive/#\//}.$LIST_EXT"
|
||||
}
|
||||
Reference in new issue
Block a user