Export, Fixes, 1st production version

This commit is contained in:
Hartmut Bauer committed 2025-04-10 22:26:32 +02:00
1 parent d7dd6cc92f
commit 3e21cfa0fc
9 files changed
+376 -104

No files matched your search

+1 -1
View File
@@ -1,3 +1,3 @@
#!/usr/bin/env bash #!/usr/bin/env bash
cp *.sh ../../bin/backup cp -v *.sh ../../bin/backup
+3 -19
View File
@@ -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
View File
@@ -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
+1 -1
View File
@@ -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
+310 -70
View File
@@ -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
}
# users and roles
log $DEBUG "$DBG > \$DOCKER exec -u=postgres postgres pg_dumpall --globals-only"
$DOCKER exec -u=postgres postgres pg_dumpall --globals-only > $dump_dir/_globals.sql 2>>$LOG_FILE
# docker compose ausführen 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
# $1 ff. - compose parameter, z.B. up -d 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
run_docker() { is_error $? false && return 1
log $DEBUG "$DBG run_docker $@" done
#DEBUG ohne docker stop/start
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"
}
+4 -2
View File
@@ -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
;; ;;
+9 -4
View File
@@ -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
View File
@@ -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() {
+41 -5
View File
@@ -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() {