tar+gpg works, first steps with logging
This commit is contained in:
1 parent
b9e6da7645
commit
52759ec1e3
1 file changed
+183
-42
@@ -5,9 +5,27 @@ BACKUP_DIR=vol
|
|||||||
SOURCE=nextcloud
|
SOURCE=nextcloud
|
||||||
TARGET_DIR=/var/docker/tmp
|
TARGET_DIR=/var/docker/tmp
|
||||||
PASSPHRASE=1234567890
|
PASSPHRASE=1234567890
|
||||||
|
EXT=tgz.gpg
|
||||||
|
|
||||||
RESTORE=vol/nextcloud/data/data/nextcloud.log
|
RESTORE=vol/nextcloud/data/data/nextcloud.log
|
||||||
|
|
||||||
|
# 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 ...
|
# Ist $1 in der Liste der restlichen args $2, $3 ...
|
||||||
#
|
#
|
||||||
# zB. if is_in "foo" "foo" "bar" "foo bar" ; then ...
|
# zB. if is_in "foo" "foo" "bar" "foo bar" ; then ...
|
||||||
@@ -21,7 +39,7 @@ function is_in {
|
|||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
# alle Verzechnisnamen in einem Verzeichnis holen
|
# Alle Verzechnisnamen in einem Verzeichnis holen.
|
||||||
#
|
#
|
||||||
# $1 - Verzeichnis in dem gesucht wird als absoluter Pfad
|
# $1 - Verzeichnis in dem gesucht wird als absoluter Pfad
|
||||||
# $2 ff. - auszuschliessende Verzeichnisse (kann leer bleiben)
|
# $2 ff. - auszuschliessende Verzeichnisse (kann leer bleiben)
|
||||||
@@ -30,7 +48,7 @@ function iterate_dirs_in() {
|
|||||||
local dirname
|
local dirname
|
||||||
local root=$1
|
local root=$1
|
||||||
shift 1
|
shift 1
|
||||||
for dir in $(find "$root" -maxdepth 1 -type d \! -wholename "$root"); do
|
for dir in $(sudo find "$root" -maxdepth 1 -type d \! -wholename "$root"); do
|
||||||
dirname=$(basename $dir)
|
dirname=$(basename $dir)
|
||||||
if ! is_in "$dirname" "$@"; then
|
if ! is_in "$dirname" "$@"; then
|
||||||
echo "$dirname"
|
echo "$dirname"
|
||||||
@@ -38,58 +56,181 @@ function iterate_dirs_in() {
|
|||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
# Verzeichnise in .tgz.gpg-Dateien sichern
|
# create directory if it not exists
|
||||||
#
|
#
|
||||||
# $1 - Verzeichnis unterhalb dessen gesichert werden soll, das also nicht Teil des gespeicherten Pfads wird (z.B /var/docker)
|
# $1 - dir to check
|
||||||
# $2 - Verzeichnis, das gesichert wird: alle Verzeichnisse darunter werden einzeln als .tgz.gpg-Datei gesichert (z.B vol -> apache.tgz.gpg, etc.)
|
|
||||||
# $3 - Zielverzeichnis für .tgz.gpg-Dateien
|
|
||||||
# $4 ff. - Verzeichnisse, die nicht gesichert werden sollen (kann leer bleiben)
|
|
||||||
#
|
#
|
||||||
function backup_dir() {
|
function 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
|
||||||
|
}
|
||||||
|
|
||||||
|
# Slashes "/" im Pfadnamen durch Dashes "-" ersetzen, so dass der String als Dateiname verwendet werden kann.
|
||||||
|
#
|
||||||
|
# $1 - path
|
||||||
|
function 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)
|
||||||
|
#
|
||||||
|
function backup_all_dirs() {
|
||||||
local root=$1
|
local root=$1
|
||||||
local source=$2
|
local target=$2
|
||||||
local target=$3
|
local prefix=$(backup_file_prefix $root)
|
||||||
|
local tar_file
|
||||||
local dir
|
local dir
|
||||||
shift 3
|
shift 2
|
||||||
cd "$root"
|
|
||||||
for dir in $(iterate_dirs_in "$root/$source" "$@"); do
|
for dir in $(iterate_dirs_in "$root" "$@"); do
|
||||||
sudo tar -c -z --numeric-owner --one-file-system "$source/$dir" | sudo gpg --batch -c --passphrase $PASSPHRASE -o "$target/$dir.tgz.gpg"
|
tar_file="$target/$prefix-$dir.$EXT"
|
||||||
|
backup_dir "$root" "$tar_file" "$dir"
|
||||||
|
list "$tar_file" "$dir"
|
||||||
|
test_integrity "$tar_file"
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
#for dir in $(find "$RUN_DIR/$BACKUP_DIR" -maxdepth 1 -type d \! -wholename "$RUN_DIR/$BACKUP_DIR"); do
|
# Einzelnes Verzeichnis sichern.
|
||||||
# testfn "$dir -> $(basename $dir)"
|
#
|
||||||
#done
|
# $1 - Pfad um Verzeichnis, das gesichert werden soll
|
||||||
|
# $2 - Zielpfad und -name für das Archiv
|
||||||
|
# $2 - zu sicherndes Verzeichnis
|
||||||
|
#
|
||||||
|
function 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
|
||||||
|
}
|
||||||
|
|
||||||
echo "-----------------------"
|
# Inhalt des Archivs in eine Textdatei ausgeben.
|
||||||
date
|
#
|
||||||
echo "-----------------------"
|
# $1 - Archiv
|
||||||
backup_dir "$RUN_DIR" "$BACKUP_DIR" "$TARGET_DIR"
|
#
|
||||||
echo "-----------------------"
|
function list() {
|
||||||
date
|
local archive=$1
|
||||||
echo "-----------------------"
|
log INFO "--- List $archive"
|
||||||
|
sudo gpg --batch --decrypt --passphrase $PASSPHRASE "$archive" | sudo tar -tzv | sudo tee $archive.txt >/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
|
||||||
|
#
|
||||||
|
function 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
|
||||||
|
#
|
||||||
|
function 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
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# *** NAS Test ***
|
||||||
|
function nas_test() {
|
||||||
|
LOG_FILE="/volume1/nfs/Server/tmp/backup.log"
|
||||||
|
|
||||||
|
log INFO "*** *** Begin NAS backup (data, media/books, media/music)"
|
||||||
|
TARGET_DIR="/volume1/nfs/backups/tmp/backup.$(date +%u)"
|
||||||
|
EXCLUDE_DIRS=("@eaDir" "Temporary Items" "lost+found")
|
||||||
|
check_directory $TARGET_DIR
|
||||||
|
# data
|
||||||
|
backup_all_dirs "/volume1/data" "$TARGET_DIR" "${EXCLUDE_DIRS[@]}"
|
||||||
|
|
||||||
|
|
||||||
|
TARGET_DIR2="/volume1/nfs/backups/tmp/media"
|
||||||
|
EXCLUDE_DIRS2=("@eaDir" "Temporary Items" "lost+found" serien tmp video "video.archive")
|
||||||
|
check_directory $TARGET_DIR2
|
||||||
|
# media/books media/music
|
||||||
|
backup_all_dirs "/volume1/media" "$TARGET_DIR2" "${EXCLUDE_DIRS2[@]}"
|
||||||
|
|
||||||
|
log INFO "*** End of NAS backuip"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# *** NATHAN Test ***
|
||||||
|
function nathan_test() {
|
||||||
|
LOG_FILE=/var/docker/tmp/backup.log
|
||||||
|
|
||||||
|
log INFO "*** *** Begin nathan server backup"
|
||||||
|
TARGET_DIR=/var/docker/tmp/backup.$(date +%u)
|
||||||
|
check_directory $TARGET_DIR
|
||||||
|
|
||||||
|
backup_all_dirs "/var" "$TARGET_DIR" docker
|
||||||
|
backup_all_dirs "/var/docker" "$TARGET_DIR" vol tmp
|
||||||
|
backup_all_dirs "/var/docker/vol" "$TARGET_DIR"
|
||||||
|
|
||||||
|
log INFO "*** End of nathan server backup"
|
||||||
|
}
|
||||||
|
|
||||||
|
function test1() {
|
||||||
|
LOG_FILE=./t1.log
|
||||||
|
log INFO "error test"
|
||||||
|
}
|
||||||
|
|
||||||
|
#nas_test
|
||||||
|
#nathan_test
|
||||||
|
|
||||||
|
test1
|
||||||
|
|
||||||
|
if [ ! -z $ERROR ]; then
|
||||||
|
log ERROR "*** *** Errors occured during the progem run, see full log for details."
|
||||||
|
else
|
||||||
|
log INFO "*** *** Program ended successfully."
|
||||||
|
fi
|
||||||
|
|
||||||
exit
|
exit
|
||||||
|
|
||||||
date +%H:%M:%S.%N
|
|
||||||
echo "--- tar -c ------------------------------------------------"
|
|
||||||
|
|
||||||
cd $RUN_DIR
|
|
||||||
|
|
||||||
sudo tar -c -z --numeric-owner --one-file-system -f "$TARGET_DIR/$SOURCE.tar.gz" "$BACKUP_DIR/$SOURCE"
|
|
||||||
date +%H:%M:%S.%N
|
|
||||||
|
|
||||||
echo "--- tar -t ------------------------------------------------"
|
|
||||||
|
|
||||||
cd $TARGET_DIR
|
|
||||||
|
|
||||||
sudo tar -t -f "$TARGET_DIR/$SOURCE.tar.gz" | sudo tee tar_list.txt >/dev/null
|
|
||||||
date +%H:%M:%S.%N
|
|
||||||
|
|
||||||
echo "--- tar -x ------------------------------------------------"
|
|
||||||
|
|
||||||
sudo tar -xv -f "$TARGET_DIR/$SOURCE.tar.gz" $RESTORE >/dev/null
|
|
||||||
date +%H:%M:%S.%N
|
|
||||||
|
|
||||||
TARGET_DIR=/var/docker/tmp/two
|
TARGET_DIR=/var/docker/tmp/two
|
||||||
echo "#"
|
echo "#"
|
||||||
|
|||||||
Reference in new issue
Block a user