Export, Fixes, 1st production version
This commit is contained in:
1 parent
d7dd6cc92f
commit
3e21cfa0fc
9 files changed
+375
-103
No files matched your search
@@ -1,3 +1,3 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
cp *.sh ../../bin/backup
|
cp -v *.sh ../../bin/backup
|
||||||
@@ -1,22 +1,6 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
#
|
|
||||||
# Aufruf via ssh auf dem jew. Server
|
|
||||||
#
|
|
||||||
# $1 - Logfile für den Backup-Lauf
|
|
||||||
#
|
|
||||||
|
|
||||||
# cron job auf nathan
|
|
||||||
#
|
|
||||||
# je Server:
|
|
||||||
#
|
|
||||||
# ssh nathan sudo /var/srv/nas/Server/bin/backup/cron.sh /var/srv/nas/backups/log/nathan-daily-$(date '+%Y-%m-%d_%H%M').log --daily
|
|
||||||
# ssh hamiller sudo /var/srv/nas/Server/bin/backup/cron.sh /var/srv/nas/backups/log/hamiller-daily-$(date '+%Y-%m-%d_%H%M').log --daily
|
|
||||||
# ssh synology sudo /volume1/nfs/Server/bin/backup/cron.sh /volume1/nfs/backups/log/synology-daily-$(date '+%Y-%m-%d_%H%M').log --daily
|
|
||||||
# ssh synology sudo /volume1/nfs/Server/bin/backup/cron.sh /volume1/nfs/backups/log/synology-weekly-$(date '+%Y-%m-%d_%H%M').log --weekly
|
|
||||||
#
|
|
||||||
|
|
||||||
LOG="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
HERE=$(dirname "$0")
|
HERE=$(dirname "$0")
|
||||||
$HERE/main.sh "$@" >"$LOG" 2>&1 &
|
|
||||||
|
# local start
|
||||||
|
sudo sh -c "nohup $HERE/main.sh -d </dev/null &"
|
||||||
+6
-1
@@ -7,8 +7,13 @@ NAS_TARGET="$NAS_ROOT/daily/$HOST_NAME/backup.$DAY"
|
|||||||
|
|
||||||
backup_daily1() {
|
backup_daily1() {
|
||||||
BACKUP_SOURCE="/var"
|
BACKUP_SOURCE="/var"
|
||||||
BACKUP_EXCLUDE_DIRS=()
|
BACKUP_EXCLUDE_DIRS=(docker)
|
||||||
}
|
}
|
||||||
|
backup_daily2() {
|
||||||
|
BACKUP_SOURCE="/var/docker"
|
||||||
|
BACKUP_EXCLUDE_DIRS=(tmp)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
before_backup() {
|
before_backup() {
|
||||||
stop_docker
|
stop_docker
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ else
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$myip" != "$MAILSERVER_IP" ]; then
|
if [ "$myip" != "$MAILSERVER_IP" ]; then
|
||||||
SSH="ssh $MAILSERVER_IP "
|
SSH="ssh $MAILSERVER_IP"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
TO=$1
|
TO=$1
|
||||||
|
|||||||
+309
-69
@@ -1,14 +1,21 @@
|
|||||||
VER="2.0.0-beta-4"
|
HOST_NAME=$(hostname -s)
|
||||||
|
DAY=$(date +%u) # MO == 1
|
||||||
|
|
||||||
HOST_NAME=$(hostname)
|
BACKUP_MASTER_CHECK="/var/docker/vol/proxy"
|
||||||
DAY=$(date +%u)
|
|
||||||
|
NAS_HOSTNAME=synology
|
||||||
|
NAS_IP=10.4.2.20
|
||||||
|
NAS_SCRIPT=/volume1/nfs/Server/bin/backup/main.sh
|
||||||
|
|
||||||
|
WEEKLY_DAY=1 # SO->MO
|
||||||
|
|
||||||
PASSPHRASE=1234567890
|
PASSPHRASE=1234567890
|
||||||
EXT=tgz.gpg
|
EXT=tgz.gpg
|
||||||
LIST_EXT=txt
|
LIST_EXT=txt
|
||||||
|
|
||||||
LOG_RECIPIENT=hb242@pm.me
|
DOCKER="/usr/bin/docker compose -f /var/docker/run/docker-compose.yml --ansi never"
|
||||||
|
|
||||||
|
LOG_RECIPIENT=hb242@pm.me
|
||||||
INFO=INFO
|
INFO=INFO
|
||||||
WARN=WARN
|
WARN=WARN
|
||||||
ERROR=ERROR
|
ERROR=ERROR
|
||||||
@@ -20,38 +27,62 @@ ERR="###"
|
|||||||
DBG="==="
|
DBG="==="
|
||||||
|
|
||||||
dump_mariadb() {
|
dump_mariadb() {
|
||||||
# TODO
|
log $DEBUG "$DBG dump_mariadb( $@ )"
|
||||||
echo
|
local dump_dir=$1
|
||||||
|
local mysqlconnect="--user=root --password=snafu"
|
||||||
|
|
||||||
|
log $DEBUG "$DBG > \$DOCKER exec mysql /usr/bin/mariadb --silent --user=xxx --password=xxx -e \"show databases\" -B"
|
||||||
|
for db in $($DOCKER exec mysql /usr/bin/mariadb --silent $mysqlconnect -e "show databases" -B 2>>$LOG_FILE | grep -v information_schema 2>>$LOG_FILE | grep -v performance_schema 2>>$LOG_FILE | sed -e 's/\r//' 2>>$LOG_FILE); do
|
||||||
|
log $DEBUG "$DBG > \$DOCKER exec mysql /usr/bin/mariadb-dump --hex-blob --user=xxx --password=xxx --databases $db"
|
||||||
|
$DOCKER exec mysql /usr/bin/mariadb-dump --hex-blob $mysqlconnect --databases $db >$dump_dir/$db.sql 2>>$LOG_FILE
|
||||||
|
is_error $? false && return 1
|
||||||
|
done
|
||||||
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
dump_postgresql() {
|
dump_postgresql() {
|
||||||
# TODO
|
log $DEBUG "$DBG dump_postgresql( $@ )"
|
||||||
echo
|
local dump_dir=$1
|
||||||
}
|
|
||||||
|
|
||||||
# docker compose ausführen
|
# users and roles
|
||||||
#
|
log $DEBUG "$DBG > \$DOCKER exec -u=postgres postgres pg_dumpall --globals-only"
|
||||||
# $1 ff. - compose parameter, z.B. up -d
|
$DOCKER exec -u=postgres postgres pg_dumpall --globals-only > $dump_dir/_globals.sql 2>>$LOG_FILE
|
||||||
#
|
|
||||||
run_docker() {
|
|
||||||
log $DEBUG "$DBG run_docker $@"
|
|
||||||
|
|
||||||
#DEBUG ohne docker stop/start
|
log $DEBUG "$DBG \$DOCKER exec -u=postgres postgres psql -t -c \"select datname from pg_database where not datistemplate\""
|
||||||
|
for db in $($DOCKER exec -u=postgres postgres psql -t -c "select datname from pg_database where not datistemplate" 2>>$LOG_FILE); do
|
||||||
|
log $DEBUG "$DBG > \$DOCKER exec -u=postgres postgres pg_dump --create $db"
|
||||||
|
$DOCKER exec -u=postgres postgres pg_dump --create $db > $dump_dir/$db.sql 2>>$LOG_FILE
|
||||||
|
is_error $? false && return 1
|
||||||
|
done
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
log $DEBUG "$DBG > /usr/bin/docker compose -f /var/docker/run/docker-compose.yml --ansi never $@"
|
|
||||||
/usr/bin/docker compose -f /var/docker/run/docker-compose.yml --ansi never $@ >>$LOG_FILE 2>&1
|
|
||||||
return $?
|
|
||||||
}
|
}
|
||||||
|
|
||||||
start_docker() {
|
start_docker() {
|
||||||
log $DEBUG "$DBG start_docker"
|
log $DEBUG "$DBG start_docker()"
|
||||||
return $(run_docker up -d)
|
log $DEBUG "$DBG > \$DOCKER up -d"
|
||||||
|
$DOCKER up -d >>$LOG_FILE 2>&1
|
||||||
|
return $?
|
||||||
}
|
}
|
||||||
|
|
||||||
stop_docker() {
|
stop_docker() {
|
||||||
log $DEBUG "$DBG stop_docker"
|
log $DEBUG "$DBG stop_docker()"
|
||||||
return $(run_docker down)
|
log $DEBUG "$DBG > \$DOCKER down"
|
||||||
|
$DOCKER down >>$LOG_FILE 2>&1
|
||||||
|
return $?
|
||||||
|
}
|
||||||
|
|
||||||
|
# Script per ssh auf Server $1 im Hintergrund starten
|
||||||
|
#
|
||||||
|
# ssh start in background
|
||||||
|
# -> https://stackoverflow.com/questions/29142/getting-ssh-to-execute-a-command-in-the-background-on-target-machine#comment107117479_29172
|
||||||
|
#
|
||||||
|
# $1 - Server
|
||||||
|
# $@ - Script incl. Parameter
|
||||||
|
#
|
||||||
|
run_script_remote() {
|
||||||
|
local server=$1
|
||||||
|
shift
|
||||||
|
ssh $server "sudo sh -c 'nohup $@ &>/dev/null </dev/null &'"
|
||||||
}
|
}
|
||||||
|
|
||||||
# check if function $1 exists
|
# check if function $1 exists
|
||||||
@@ -94,7 +125,9 @@ mail_log() {
|
|||||||
# Reduziertes Log senden
|
# Reduziertes Log senden
|
||||||
#
|
#
|
||||||
send_mail_log() {
|
send_mail_log() {
|
||||||
log $DEBUG "$DBG > $HERE/mail.sh $LOG_RECIPIENT \"[$HOST_NAME] Nightly Backup\" $MAIL_LOG_FILE"
|
local subject="$@"
|
||||||
|
log $DEBUG "$DBG send_mail_log()"
|
||||||
|
log $DEBUG "$DBG > $HERE/mail.sh $LOG_RECIPIENT \"[$HOST_NAME] $subject\" $MAIL_LOG_FILE"
|
||||||
$HERE/mail.sh $LOG_RECIPIENT "[$HOST_NAME] Nightly Backup" $MAIL_LOG_FILE >>$LOG_FILE 2>&1
|
$HERE/mail.sh $LOG_RECIPIENT "[$HOST_NAME] Nightly Backup" $MAIL_LOG_FILE >>$LOG_FILE 2>&1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -109,7 +142,7 @@ is_error() {
|
|||||||
local rc=$1
|
local rc=$1
|
||||||
local mlog=$2
|
local mlog=$2
|
||||||
if [ $rc -eq 0 ]; then
|
if [ $rc -eq 0 ]; then
|
||||||
if [ "$mlog" ]; then
|
if [ -z "$mlog" ]; then
|
||||||
mail_log $INFO "$SUCCESS"
|
mail_log $INFO "$SUCCESS"
|
||||||
fi
|
fi
|
||||||
return 1
|
return 1
|
||||||
@@ -150,14 +183,17 @@ check_pipe_rc() {
|
|||||||
# returns return code of mv
|
# returns return code of mv
|
||||||
#
|
#
|
||||||
copy_to_nas() {
|
copy_to_nas() {
|
||||||
log $DEBUG "$DBG copy_to_nas $@"
|
log $DEBUG "$DBG copy_to_nas( $@ )"
|
||||||
local source="$1"
|
local source="$1"
|
||||||
local target="$2"
|
local target="$2"
|
||||||
delete_dir "$target"
|
delete_dir "$target"
|
||||||
if [ $(check_directory "$target") -gt 0 ]; then
|
if [ $? -ne 0 ]; then
|
||||||
log $ERROR "$ERR directory \"$target\" not found"
|
log $ERROR "$ERR directory \"$target\" could not be emptied"
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
check_directory "$target"
|
||||||
|
is_error $? true && return 1
|
||||||
|
|
||||||
log $DEBUG "$DBG > mv \"$source\"/* \"$target\""
|
log $DEBUG "$DBG > mv \"$source\"/* \"$target\""
|
||||||
mv "$source"/* "$target" >>$LOG_FILE 2>&1
|
mv "$source"/* "$target" >>$LOG_FILE 2>&1
|
||||||
return $?
|
return $?
|
||||||
@@ -200,7 +236,7 @@ iterate_dirs_in() {
|
|||||||
# returns 0 for success, 1 otherwise
|
# returns 0 for success, 1 otherwise
|
||||||
#
|
#
|
||||||
check_directory() {
|
check_directory() {
|
||||||
log $DEBUG "$DBG check_directory $@"
|
log $DEBUG "$DBG check_directory( $@ )"
|
||||||
local dir=$1
|
local dir=$1
|
||||||
if [ -d "$1" ]; then
|
if [ -d "$1" ]; then
|
||||||
return 0
|
return 0
|
||||||
@@ -221,7 +257,7 @@ check_directory() {
|
|||||||
# returns 0 for success, 1 otherwise
|
# returns 0 for success, 1 otherwise
|
||||||
#
|
#
|
||||||
delete_dir() {
|
delete_dir() {
|
||||||
log $DEBUG "$DBG delete_dir $@"
|
log $DEBUG "$DBG delete_dir( $@ )"
|
||||||
local dir=$1
|
local dir=$1
|
||||||
log $DEBUG "$DBG > rm -rf \"$dir\"/*"
|
log $DEBUG "$DBG > rm -rf \"$dir\"/*"
|
||||||
rm -rf "$dir"/* >>$LOG_FILE 2>&1 && return 0
|
rm -rf "$dir"/* >>$LOG_FILE 2>&1 && return 0
|
||||||
@@ -242,10 +278,10 @@ backup_file_prefix() {
|
|||||||
# $2 - Zielverzeichnis für .tgz.gpg-Dateien
|
# $2 - Zielverzeichnis für .tgz.gpg-Dateien
|
||||||
# $3 ff. - Verzeichnisse, die nicht gesichert werden sollen (kann leer bleiben)
|
# $3 ff. - Verzeichnisse, die nicht gesichert werden sollen (kann leer bleiben)
|
||||||
#
|
#
|
||||||
# returns 0 for success, 1 otherwise
|
# returns 0 for success, 1 otherwise (Fehlerprotokollierung muss aufrufende fn erledigen)
|
||||||
#
|
#
|
||||||
backup_all_dirs() {
|
backup_all_dirs() {
|
||||||
log $DEBUG "$DBG backup_all_dirs $@"
|
log $DEBUG "$DBG backup_all_dirs( $@ )"
|
||||||
local root=$1
|
local root=$1
|
||||||
local target=$2
|
local target=$2
|
||||||
shift 2
|
shift 2
|
||||||
@@ -255,17 +291,15 @@ backup_all_dirs() {
|
|||||||
|
|
||||||
for dir in $(iterate_dirs_in "$root" "$@"); do
|
for dir in $(iterate_dirs_in "$root" "$@"); do
|
||||||
tar_file="$target/$prefix-$dir.$EXT"
|
tar_file="$target/$prefix-$dir.$EXT"
|
||||||
mail_log $INFO "$INF directory: $root/$dir"
|
|
||||||
backup_dir "$root" "$tar_file" "$dir"
|
backup_dir "$root" "$tar_file" "$dir"
|
||||||
is_error $? false && return 1
|
if [ $? -ne 0 ]; then return 1; fi
|
||||||
|
|
||||||
#mail_log $INFO "$INF list directory"
|
|
||||||
create_list "$tar_file" "$dir"
|
create_list "$tar_file" "$dir"
|
||||||
is_error $? false && return 1
|
if [ $? -ne 0 ]; then return 1; fi
|
||||||
|
|
||||||
#mail_log $INFO "$INF test integrity of $tar_file"
|
|
||||||
test_integrity "$tar_file"
|
test_integrity "$tar_file"
|
||||||
is_error $? false && return 1
|
if [ $? -ne 0 ]; then return 1; fi
|
||||||
done
|
done
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
@@ -279,7 +313,7 @@ backup_all_dirs() {
|
|||||||
# returns 0 for success, 1 otherwise
|
# returns 0 for success, 1 otherwise
|
||||||
#
|
#
|
||||||
backup_dir() {
|
backup_dir() {
|
||||||
log $DEBUG "$DBG backup_dir $@"
|
log $DEBUG "$DBG backup_dir( $@ )"
|
||||||
local root=$1
|
local root=$1
|
||||||
local archive=$2
|
local archive=$2
|
||||||
local dir=$3
|
local dir=$3
|
||||||
@@ -300,15 +334,16 @@ backup_dir() {
|
|||||||
# returns 0 for success, 1 otherwise
|
# returns 0 for success, 1 otherwise
|
||||||
#
|
#
|
||||||
do_auto_backup() {
|
do_auto_backup() {
|
||||||
log $DEBUG "$DBG do_auto_backup $@"
|
log $DEBUG "$DBG do_auto_backup( $@ )"
|
||||||
local func=$1
|
local func=$1
|
||||||
local count=1
|
local count=1
|
||||||
local rc
|
local rc
|
||||||
|
|
||||||
if ! $func$count 2>/dev/null ; then # Seiteneffekt: $func$count wird ausgeführt
|
if ! $func$count 2>/dev/null ; then # Seiteneffekt: $func$count wird ausgeführt
|
||||||
mail_log $ERROR "$ERR keine Backup-Function $func$count() für $HOST_NAME."
|
mail_log $ERROR "$ERR keine Backup-Function $func$count() für $HOST_NAME."
|
||||||
exit 1
|
exit 1 # kein Mail-Benachrichtigung!
|
||||||
fi
|
fi
|
||||||
|
set_log_info
|
||||||
|
|
||||||
mail_log $INFO "$INF prepare backup"
|
mail_log $INFO "$INF prepare backup"
|
||||||
before_backup
|
before_backup
|
||||||
@@ -324,40 +359,60 @@ do_auto_backup() {
|
|||||||
do
|
do
|
||||||
mail_log $INFO "$INF backing up directories in $BACKUP_SOURCE"
|
mail_log $INFO "$INF backing up directories in $BACKUP_SOURCE"
|
||||||
backup_all_dirs "$BACKUP_SOURCE" "$BACKUP_TARGET" "${BACKUP_EXCLUDE_DIRS[@]}"
|
backup_all_dirs "$BACKUP_SOURCE" "$BACKUP_TARGET" "${BACKUP_EXCLUDE_DIRS[@]}"
|
||||||
rc=$?
|
is_error $? && return 1
|
||||||
# error logging in backup_all_dirs
|
|
||||||
if [ $rc -gt 0 ]; then
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
let "count += 1"
|
let "count += 1"
|
||||||
done
|
done
|
||||||
mail_log $INFO "$INF finishing backup"
|
}
|
||||||
after_backup
|
|
||||||
is_error $? && return 1
|
set_log_info() {
|
||||||
|
local targ
|
||||||
|
if [ -z "$NAS_TARGET" ]; then
|
||||||
|
targ=$BACKUP_TARGET
|
||||||
|
else
|
||||||
|
targ=$NAS_TARGET
|
||||||
|
fi
|
||||||
|
mail_log $INFO ">>> "
|
||||||
|
mail_log $INFO ">>> backup to : $targ"
|
||||||
|
mail_log $INFO ">>> log file : $LOG_FILE"
|
||||||
|
mail_log $INFO ">>> "
|
||||||
}
|
}
|
||||||
|
|
||||||
backup_daily() {
|
backup_daily() {
|
||||||
|
# "master"-Server startet Backup auf NAS
|
||||||
|
if [ -d $BACKUP_MASTER_CHECK ]; then
|
||||||
|
log $DEBUG "$DBG starting daily backup on $NAS_HOSTNAME"
|
||||||
|
run_script_remote $NAS_IP "$NAS_SCRIPT -d"
|
||||||
|
fi
|
||||||
|
|
||||||
mail_log $INFO ">>>>>>>>>> daily auto backup $VER for $HOST_NAME <<<<<<<<<<"
|
mail_log $INFO ">>>>>>>>>> daily auto backup $VER for $HOST_NAME <<<<<<<<<<"
|
||||||
|
|
||||||
do_auto_backup backup_daily
|
do_auto_backup backup_daily
|
||||||
|
|
||||||
|
# after_backup() muss immer laufen, damit ggf. docker wieder gestartet werden kann
|
||||||
|
mail_log $INFO "$INF finishing backup"
|
||||||
|
after_backup
|
||||||
|
is_error $?
|
||||||
|
|
||||||
mail_log $INFO ">>>>>>>>>> end of auto backup"
|
mail_log $INFO ">>>>>>>>>> end of auto backup"
|
||||||
send_mail_log
|
send_mail_log "Daily Backup"
|
||||||
|
|
||||||
|
# ggf. weekly backup starten (z.ZT. nur auf NAS)
|
||||||
|
if [ $HAS_WEEKLY -a $WEEKLY_DAY -eq $DAY ]; then
|
||||||
|
log $DEBUG "$DBG starting weekly backup"
|
||||||
|
nohup $THIS_SCRIPT -w &>>$LOG_FILE </dev/null &
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
backup_weekly() {
|
backup_weekly() {
|
||||||
mail_log $INFO ">>>>>>>>>> weekly auto backup $VER for $HOST_NAME <<<<<<<<<<"
|
mail_log $INFO ">>>>>>>>>> weekly auto backup $VER for $HOST_NAME <<<<<<<<<<"
|
||||||
do_auto_backuo backup_weekly
|
|
||||||
mail_log $INFO ">>>>>>>>>> end of auto backup"
|
|
||||||
send_mail_log
|
|
||||||
}
|
|
||||||
|
|
||||||
export_backups() {
|
do_auto_backup backup_weekly
|
||||||
# TODO
|
|
||||||
echo
|
mail_log $INFO "$INF finishing backup"
|
||||||
# check host (only nathan|hamiller?)
|
after_backup
|
||||||
# check USB drive
|
is_error $?
|
||||||
# del USB drive (?)
|
|
||||||
# rsync USB -> 1|2, video, serien
|
mail_log $INFO ">>>>>>>>>> end of auto backup"
|
||||||
# send_mail_log
|
send_mail_log "Weekly Backup"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Inhalt des Archivs in eine Textdatei ausgeben.
|
# Inhalt des Archivs in eine Textdatei ausgeben.
|
||||||
@@ -367,7 +422,7 @@ export_backups() {
|
|||||||
# returns 0 for success, 1 otherwise
|
# returns 0 for success, 1 otherwise
|
||||||
#
|
#
|
||||||
create_list() {
|
create_list() {
|
||||||
log $DEBUG "$DBG create_list $@"
|
log $DEBUG "$DBG create_list( $@ )"
|
||||||
local archive=$1
|
local archive=$1
|
||||||
log $DEBUG "$DBG > gpg --batch --decrypt --passphrase xxxx \"$archive\" | tar -tzv | tee \"$archive.$LIST_EXT\""
|
log $DEBUG "$DBG > gpg --batch --decrypt --passphrase xxxx \"$archive\" | tar -tzv | tee \"$archive.$LIST_EXT\""
|
||||||
gpg --batch --decrypt --passphrase $PASSPHRASE "$archive" 2>>$LOG_FILE | tar -tzv 2>>$LOG_FILE | tee "$archive.$LIST_EXT" >/dev/null 2>>$LOG_FILE
|
gpg --batch --decrypt --passphrase $PASSPHRASE "$archive" 2>>$LOG_FILE | tar -tzv 2>>$LOG_FILE | tee "$archive.$LIST_EXT" >/dev/null 2>>$LOG_FILE
|
||||||
@@ -383,7 +438,7 @@ create_list() {
|
|||||||
# returns 0 for success, 1 otherwise
|
# returns 0 for success, 1 otherwise
|
||||||
#
|
#
|
||||||
test_integrity() {
|
test_integrity() {
|
||||||
log $DEBUG "$DBG test_integrity $@"
|
log $DEBUG "$DBG test_integrity( $@ )"
|
||||||
local archive=$1
|
local archive=$1
|
||||||
log $DEBUG "$DBG > gpg --batch --decrypt --passphrase xxxx \"$archive\" | tar -xzO"
|
log $DEBUG "$DBG > gpg --batch --decrypt --passphrase xxxx \"$archive\" | tar -xzO"
|
||||||
gpg --batch --decrypt --passphrase $PASSPHRASE "$archive" 2>>$LOG_FILE | tar -xzO >/dev/null 2>>$LOG_FILE
|
gpg --batch --decrypt --passphrase $PASSPHRASE "$archive" 2>>$LOG_FILE | tar -xzO >/dev/null 2>>$LOG_FILE
|
||||||
@@ -401,7 +456,7 @@ test_integrity() {
|
|||||||
# returns 0 for success, 1 otherwise
|
# returns 0 for success, 1 otherwise
|
||||||
#
|
#
|
||||||
restore() {
|
restore() {
|
||||||
log $DEBUG "$DBG restore $@"
|
log $DEBUG "$DBG restore( $@ )"
|
||||||
local archive=$1
|
local archive=$1
|
||||||
shift 1
|
shift 1
|
||||||
log $DEBUG "$DBG > gpg --batch --decrypt --passphrase xxxx \"$archive\" | tar -xzv $@"
|
log $DEBUG "$DBG > gpg --batch --decrypt --passphrase xxxx \"$archive\" | tar -xzv $@"
|
||||||
@@ -425,7 +480,7 @@ restore() {
|
|||||||
# returns 0 for success, 1 otherwise
|
# returns 0 for success, 1 otherwise
|
||||||
#
|
#
|
||||||
list_archives() {
|
list_archives() {
|
||||||
log $DEBUG "$DBG list_archives $@"
|
log $DEBUG "$DBG list_archives( $@ )"
|
||||||
local target=$1
|
local target=$1
|
||||||
local targ=${target//\//\\\/} # slashes escapen
|
local targ=${target//\//\\\/} # slashes escapen
|
||||||
log $DEBUG "$DBG > find \"$target\" -type f -name \"*.$EXT\" | grep \"${HOST_NAME}/\" | sed -E \"s/^$targ//\""
|
log $DEBUG "$DBG > find \"$target\" -type f -name \"*.$EXT\" | grep \"${HOST_NAME}/\" | sed -E \"s/^$targ//\""
|
||||||
@@ -442,9 +497,194 @@ list_archives() {
|
|||||||
# returns 0 for success, 1 otherwise
|
# returns 0 for success, 1 otherwise
|
||||||
#
|
#
|
||||||
list_archive_content() {
|
list_archive_content() {
|
||||||
log $DEBUG "$DBG list_archive_content $@"
|
log $DEBUG "$DBG list_archive_content( $@ )"
|
||||||
local root=$1
|
local root=$1
|
||||||
local archive=$2
|
local archive=$2
|
||||||
log $DEBUG "$DBG > cat \"$root/${archive/#\//}.$LIST_EXT\""
|
log $DEBUG "$DBG > cat \"$root/${archive/#\//}.$LIST_EXT\""
|
||||||
cat "$root/${archive/#\//}.$LIST_EXT" 2>>$LOG_FILE
|
cat "$root/${archive/#\//}.$LIST_EXT" 2>>$LOG_FILE
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# --- export ---
|
||||||
|
|
||||||
|
# exfat-formatierte USB-HDD auf Linux-Server ermitteln
|
||||||
|
#
|
||||||
|
get_usb_device() {
|
||||||
|
local fstype=exfat
|
||||||
|
local lsblk="lsblk -o KNAME,TYPE,SIZE,MODEL,FSTYPE"
|
||||||
|
local device
|
||||||
|
if [ "$($lsblk 2>>$LOG_FILE | grep $fstype 2>>$LOG_FILE | wc -l 2>>$LOG_FILE)" != "1" ]; then
|
||||||
|
echo "ERROR could not query devices"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
device=$($lsblk 2>>$LOG_FILE | grep $fstype 2>>$LOG_FILE | sed -E 's/^(\S*).*$/\1/' 2>>$LOG_FILE)
|
||||||
|
if [ -z "$device" ]; then
|
||||||
|
echo "ERROR no exfat USB device found"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo $device
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# USB-HDD auf Linux-Server mounten
|
||||||
|
#
|
||||||
|
# $1 - device (ohne /dev/)
|
||||||
|
#
|
||||||
|
mount_usb_device() {
|
||||||
|
local device=$1
|
||||||
|
local mount_point=/var/mnt/backup
|
||||||
|
check_directory $mount_point
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "ERROR mount point does't exist"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
mount /dev/$device $mount_point >>$LOG_FILE 2>&1
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "ERROR mounting $device"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
echo $mount_point
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# USB-HDD auf Linux-Server unmounten
|
||||||
|
#
|
||||||
|
# $1 - mount point
|
||||||
|
#
|
||||||
|
umount_usb_device() {
|
||||||
|
local mount_point=$1
|
||||||
|
|
||||||
|
umount $mount_point >>$LOG_FILE 2>&1
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "ERROR unmounting $mount_point"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# USB-HDD suchen und Backup-Typ ermitteln
|
||||||
|
#
|
||||||
|
# Der Typ wird über eine Datei auf der USB-HDD festgelegt:
|
||||||
|
# /.backup#<typ>.tag -> z.B. /.backup#int1.tag => Typ=int1
|
||||||
|
#
|
||||||
|
# $1 - mount point
|
||||||
|
#
|
||||||
|
check_backup_device() {
|
||||||
|
log $DEBUG "$DBG check_backup_drive( $@ )"
|
||||||
|
local mount_point=$1
|
||||||
|
local tagP1=".backup#"
|
||||||
|
local tagP2=".tag"
|
||||||
|
|
||||||
|
log $DEBUG "$DBG > ls $mount_point/${tagP1}*${tagP2} | wc -l"
|
||||||
|
if [ "$(ls $mount_point/${tagP1}*${tagP2} 2>>$LOG_FILE | wc -l 2>>$LOG_FILE)" != "1" ]; then
|
||||||
|
mail_log $ERROR "$ERR no tag found on device at $mount_point"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
log $DEBUG "$DBG > ls $mount_point/${tagP1}*${tagP2} | sed -E \"s/.*$tagP1(.*)$tagP2/\1/\""
|
||||||
|
local tag=$(ls $mount_point/${tagP1}*${tagP2} 2>>$LOG_FILE | sed -E "s/.*$tagP1(.*)$tagP2/\1/" 2>>$LOG_FILE)
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
mail_log $ERROR "$ERR no tag found on device at $mount_point"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
echo $tag
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# Datei-Export auf Synology-NAS ausführen
|
||||||
|
#
|
||||||
|
# TODO mount, check, unmount muss raus -> fn macht synology + linux => if host == synology...
|
||||||
|
# fn's ausser unmount liefern string|null => if -z error
|
||||||
|
#
|
||||||
|
do_export() {
|
||||||
|
log $DEBUG "$DBG do_export ()"
|
||||||
|
mail_log $INFO "$INF checking USB device"
|
||||||
|
|
||||||
|
# get device
|
||||||
|
log $DEBUG "$DBG > /usr/syno/bin/synousbdisk -enum | grep -v devices | wc -l"
|
||||||
|
if [ "$(/usr/syno/bin/synousbdisk -enum 2>>$LOG_FILE | grep -v devices 2>>$LOG_FILE | wc -l 2>>$LOG_FILE)" != "1" ]; then
|
||||||
|
mail_log $ERROR "$ERR no USB device or too many found @$HOST_NAME."
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
log $DEBUG "$DBG > /usr/syno/bin/synousbdisk -enum | grep -v devices"
|
||||||
|
local device=$(/usr/syno/bin/synousbdisk -enum 2>>$LOG_FILE | grep -v devices 2>>$LOG_FILE)
|
||||||
|
|
||||||
|
# check if exfat
|
||||||
|
log $DEBUG "$DBG > /usr/syno/bin/synousbdisk -info $device | grep -i \"file system\" | sed -E \"s/.*:\s*(.*)\s*/\1/\""
|
||||||
|
local fs=$(/usr/syno/bin/synousbdisk -info $device 2>>$LOG_FILE | grep -i "file system" 2>>$LOG_FILE | sed -E "s/.*:\s*(.*)\s*/\1/" 2>>$LOG_FILE)
|
||||||
|
if [ "$fs" != "exfat" ]; then
|
||||||
|
mail_log $ERROR "$ERR device $device not exfat formatted"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# get mount point
|
||||||
|
log $DEBUG "$DBG > /usr/syno/bin/synousbdisk -info $device | grep -i \"mount path\" | sed -E \"s/.*:\s*(.*)\s*/\1/\""
|
||||||
|
local mount_path=$(/usr/syno/bin/synousbdisk -info $device 2>>$LOG_FILE | grep -i "mount path" 2>>$LOG_FILE | sed -E "s/.*:\s*(.*)\s*/\1/" 2>>$LOG_FILE)
|
||||||
|
if [ $? -ne 0 ] || [ ! -d $mount_path ]; then
|
||||||
|
mail_log $ERROR "$ERR mount point \"$mount_path\" does not exist."
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
local backup_type=$(check_backup_device $mount_path)
|
||||||
|
if [ -z $backup_type ]; then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
mail_log $INFO "$SUCCESS"
|
||||||
|
|
||||||
|
local source_path
|
||||||
|
case $backup_type in
|
||||||
|
int1|int2|1|2)
|
||||||
|
# daily + weekly backups -> Auslagerung 1+2, Backup 1+2
|
||||||
|
source_path="/volume1/nfs/backups"
|
||||||
|
;;
|
||||||
|
serien)
|
||||||
|
# Serien -> Auslagerung
|
||||||
|
source_path="/volume1/media/serien"
|
||||||
|
;;
|
||||||
|
video)
|
||||||
|
# Video -> Auslagerung
|
||||||
|
source_path="/volume1/media/video"
|
||||||
|
;;
|
||||||
|
?*)
|
||||||
|
echo "ERROR unknown backup type $backup_type"
|
||||||
|
return 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
mail_log $INFO ">>> "
|
||||||
|
mail_log $INFO ">>> export type : $backup_type"
|
||||||
|
mail_log $INFO ">>> export from : $source_path"
|
||||||
|
mail_log $INFO ">>> log file : $LOG_FILE"
|
||||||
|
mail_log $INFO ">>> "
|
||||||
|
|
||||||
|
mail_log $INFO "$INF exporting $source_path -> $mount_path"
|
||||||
|
log $DEBUG "$DBG rsync -rti --one-file-system --delete --stats --exclude=@eaDir $source_path $mount_path"
|
||||||
|
rsync -rti --one-file-system --delete --stats --exclude=@eaDir $source_path $mount_path >>$LOG_FILE 2>&1
|
||||||
|
is_error $?
|
||||||
|
|
||||||
|
mail_log $INFO "$INF unmounting USB device"
|
||||||
|
log $DEBUG "$DBG > /usr/syno/bin/synousbdisk -umount $device"
|
||||||
|
/usr/syno/bin/synousbdisk -umount $device >>$LOG_FILE 2>&1
|
||||||
|
is_error $?
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
# Export Backups bzw. Medien-Verzeichnisse auf USB-HDD
|
||||||
|
#
|
||||||
|
# Der Export wird nur auf der NAS ausgeführt
|
||||||
|
# (und wird ggf. dort remote gestartet)
|
||||||
|
#
|
||||||
|
export_backups() {
|
||||||
|
if [ "$HOST_NAME" != "$NAS_HOSTNAME" ]; then
|
||||||
|
run_script_remote $NAS_IP "$NAS_SCRIPT -e"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
mail_log $INFO ">>>>>>>>>> export $VER <<<<<<<<<<"
|
||||||
|
|
||||||
|
do_export
|
||||||
|
|
||||||
|
mail_log $INFO ">>>>>>>>>> end of export"
|
||||||
|
send_mail_log "Export"
|
||||||
|
}
|
||||||
@@ -3,6 +3,8 @@
|
|||||||
# entrypoint for all actions
|
# entrypoint for all actions
|
||||||
#
|
#
|
||||||
|
|
||||||
|
VER="2.0.0"
|
||||||
|
|
||||||
show_help() {
|
show_help() {
|
||||||
echo "usage: $0 options"
|
echo "usage: $0 options"
|
||||||
echo " -d, --daily start daily backup on local machine"
|
echo " -d, --daily start daily backup on local machine"
|
||||||
@@ -30,6 +32,7 @@ if [ "$(id -u)" -ne 0 ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
HERE=$(dirname "$0")
|
HERE=$(dirname "$0")
|
||||||
|
THIS_SCRIPT=$0
|
||||||
|
|
||||||
if [ -f $HERE/main.inc.sh ]; then
|
if [ -f $HERE/main.inc.sh ]; then
|
||||||
. $HERE/main.inc.sh
|
. $HERE/main.inc.sh
|
||||||
@@ -53,7 +56,7 @@ else
|
|||||||
exit 102
|
exit 102
|
||||||
fi
|
fi
|
||||||
|
|
||||||
log_file_name="$NAS_ROOT/log/$HOST_NAME-$(date '+%Y-%m-%d_%H%M')"
|
log_file_name="$(realpath $HERE/../../../log/backup/$HOST_NAME-$(date '+%Y-%m-%d_%H%M'))"
|
||||||
LOG_FILE="${log_file_name}.log"
|
LOG_FILE="${log_file_name}.log"
|
||||||
|
|
||||||
file=
|
file=
|
||||||
@@ -67,7 +70,6 @@ while :; do
|
|||||||
;;
|
;;
|
||||||
-d|--daily)
|
-d|--daily)
|
||||||
MAIL_LOG_FILE="${log_file_name}.auto.log"
|
MAIL_LOG_FILE="${log_file_name}.auto.log"
|
||||||
## copy_to_nas
|
|
||||||
backup_daily
|
backup_daily
|
||||||
break
|
break
|
||||||
;;
|
;;
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
NAS_ROOT=/var/srv/nas/backups
|
NAS_ROOT=/var/srv/nas/backups
|
||||||
BACKUP_TARGET=/var/docker/tmp
|
DOCKER_ROOT=/var/docker
|
||||||
|
BACKUP_TARGET=$DOCKER_ROOT/tmp
|
||||||
NAS_TARGET="$NAS_ROOT/daily/$HOST_NAME/backup.$DAY"
|
NAS_TARGET="$NAS_ROOT/daily/$HOST_NAME/backup.$DAY"
|
||||||
|
|
||||||
backup_daily1() {
|
backup_daily1() {
|
||||||
@@ -21,9 +22,13 @@ backup_daily3() {
|
|||||||
|
|
||||||
|
|
||||||
before_backup() {
|
before_backup() {
|
||||||
dump_mariadb
|
dump_mariadb $DOCKER_ROOT/dump/mysql
|
||||||
dump_postgresql
|
local mys=$?
|
||||||
# TODO error handling
|
dump_postgresql $DOCKER_ROOT/dump/postgresql
|
||||||
|
local pos=$?
|
||||||
|
if [ $mys -gt 0 ] || [ $pos -gt 0 ]; then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
stop_docker
|
stop_docker
|
||||||
return $?
|
return $?
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -10,7 +10,7 @@ backup_daily1() {
|
|||||||
backup_daily2() {
|
backup_daily2() {
|
||||||
BACKUP_SOURCE="/volume1/nfs"
|
BACKUP_SOURCE="/volume1/nfs"
|
||||||
BACKUP_TARGET="$NAS_ROOT/daily/$HOST_NAME/backup.$DAY"
|
BACKUP_TARGET="$NAS_ROOT/daily/$HOST_NAME/backup.$DAY"
|
||||||
BACKUP_EXCLUDE_DIRS=("@eaDir" "Temporary Items" "lost+found" backups)
|
BACKUP_EXCLUDE_DIRS=("@eaDir" "Temporary Items" "lost+found" backups log)
|
||||||
}
|
}
|
||||||
|
|
||||||
backup_weekly1() {
|
backup_weekly1() {
|
||||||
|
|||||||
@@ -1,8 +1,38 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
if [ "$(id -u)" -ne 0 ]; then
|
||||||
|
echo "**"
|
||||||
|
echo "** ERROR: script has to be run as superuser!"
|
||||||
|
echo "**"
|
||||||
|
exit 100
|
||||||
|
fi
|
||||||
|
|
||||||
HERE=$(dirname "$0")
|
HERE=$(dirname "$0")
|
||||||
|
|
||||||
. $HERE/main.inc.sh
|
if [ -f $HERE/main.inc.sh ]; then
|
||||||
|
. $HERE/main.inc.sh
|
||||||
|
else
|
||||||
|
echo "**"
|
||||||
|
echo "** ERROR: Datei \"$HERE/main.inc.sh\" nicht gefunden. "
|
||||||
|
echo "** Script wird abgebrochen"
|
||||||
|
echo "**"
|
||||||
|
show_help
|
||||||
|
exit 101
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -f $HERE/$HOST_NAME.sh ]; then
|
||||||
|
. $HERE/$HOST_NAME.sh
|
||||||
|
else
|
||||||
|
echo "**"
|
||||||
|
echo "** ERROR: Datei \"$HOST_NAME.sh\" nicht gefunden (falscher Rechner?). "
|
||||||
|
echo "** Script wird abgebrochen."
|
||||||
|
echo "**"
|
||||||
|
show_help
|
||||||
|
exit 102
|
||||||
|
fi
|
||||||
|
|
||||||
|
log_file_name="$NAS_ROOT/log/$HOST_NAME-$(date '+%Y-%m-%d_%H%M')"
|
||||||
|
LOG_FILE="${log_file_name}.log"
|
||||||
|
|
||||||
# nicht auf calvados
|
# nicht auf calvados
|
||||||
#. $HERE/$HOST_NAME
|
#. $HERE/$HOST_NAME
|
||||||
@@ -13,10 +43,16 @@ test() {
|
|||||||
|
|
||||||
isFunction() { declare -Ff "$1" ; }
|
isFunction() { declare -Ff "$1" ; }
|
||||||
|
|
||||||
#nas_test
|
if [ "$HOST_NAME" != "$NAS_HOSTNAME" ]; then
|
||||||
#nathan_test
|
run_script_remote $NAS_IP "/volume1/nfs/Server/bin/backup/test.sh -x"
|
||||||
#hamiller_test
|
#ssh 10.4.2.20 "sudo sh -c 'nohup /volume1/nfs/Server/bin/backup/main.sh -e &>/dev/null < /dev/null &'"
|
||||||
#test1
|
exit
|
||||||
|
else
|
||||||
|
echo "klappt $1" > /volume1/nfs/log/backup/remote_run.log
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
exit
|
||||||
|
|
||||||
|
|
||||||
list1() {
|
list1() {
|
||||||
|
|||||||
Reference in new issue
Block a user