From 66ffcb70549cfc184afa226cf79cd2bfd2ef11aa Mon Sep 17 00:00:00 2001 From: MrUnknownDE Date: Tue, 25 Jun 2024 09:12:36 +0200 Subject: [PATCH 1/5] code tidied up --- backuptool.sh | 287 +++++++++++++++++++++++--------------------------- 1 file changed, 131 insertions(+), 156 deletions(-) diff --git a/backuptool.sh b/backuptool.sh index 572cb94..3abbc62 100644 --- a/backuptool.sh +++ b/backuptool.sh @@ -10,198 +10,173 @@ # ################# CONFIG ##################### -backupdir=/data/backup # Verzeichniss wo die Backups abgelegt werden, es werden automatisch unterordner "mysql" und "files" erstellt. -datenbank=(dbname dbnam2) # Datenbanken welche gesichert werden sollen -datadir=(/path/to/webdir1 /path/to/webdir2) # Welche Ordner sollen gesichert werden -dbuser=DBUSER # Datenbank User -dbpass=DBPASS # Datenbank Passwort -date1=$(date +%a) # Datumsformat welches an die Dateien angehangen wird -hostname=$(hostname -f) # Hostname -mailsubject="MYSQL-Backup - $hostname" # Mail Betreff -mailtext=/tmp/mailtext.txt # Mailtext zum Versand -email=EMAIL@ADRESSE # Empfaenger der Status Mails -date2=$(date +%A" "%d.%m.%Y) # Datum für E-Mail +backupdir=/data/backup # Verzeichniss wo die Backups abgelegt werden, es werden automatisch unterordner "mysql" und "files" erstellt. +datenbank=(dbname dbnam2) # Datenbanken welche gesichert werden sollen +datadir=(/path/to/webdir1 /path/to/webdir2) # Welche Ordner sollen gesichert werden +dbuser=DBUSER # Datenbank User +dbpass=DBPASS # Datenbank Passwort +date1=$(date +%a) # Datumsformat welches an die Dateien angehangen wird +hostname=$(hostname -f) # Hostname +mailsubject="MYSQL-Backup - $hostname" # Mail Betreff +mailtext=/tmp/mailtext.txt # Mailtext zum Versand +email=EMAIL@ADRESSE # Empfaenger der Status Mails +date2=$(date +%A" "%d.%m.%Y) # Datum für E-Mail ################# CONFIG END ################# -#Clear mailtext +# Set PATH +export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin +# Clear mailtext echo " " > $mailtext; -#Aktuelles Datum +# Aktuelles Datum echo "#############################################################" >> $mailtext echo "MYSQL Backup Script from $hostname - "$date2 >> $mailtext echo "#############################################################" >> $mailtext echo "" >> $mailtext # Check Backupdir -if test -d $backupdir -then - echo ""; +if test -d $backupdir; then + echo ""; else - echo -n "Create Backupdirectory ... " >> $mailtext - mkdir $backupdir - if test -d $backupdir - then - echo -n "done" >> $mailtext - echo "\n" >> $mailtext - else - echo -n "Error - Cant create backupdirectory" >> $mailtext - exit 1; - fi - + echo -n "Create Backupdirectory ... " >> $mailtext + mkdir -p $backupdir + if test -d $backupdir; then + echo "done" >> $mailtext + echo "" >> $mailtext + else + echo "Error - Can't create backup directory" >> $mailtext + exit 1; + fi fi + # Check Backupdir for mysql -if test -d $backupdir/mysql -then - echo ""; +if test -d $backupdir/mysql; then + echo ""; else - echo -n "Create Backupdirectory for mysql ... " >> $mailtext - mkdir $backupdir/mysql - if test -d $backupdir/mysql - then - echo -n "done" >> $mailtext - echo "\n" >> $mailtext - else - echo -n "Error - Cant create backupdirectory for mysql" >> $mailtext - exit 1; - fi - + echo -n "Create Backupdirectory for mysql ... " >> $mailtext + mkdir -p $backupdir/mysql + if test -d $backupdir/mysql; then + echo "done" >> $mailtext + echo "" >> $mailtext + else + echo "Error - Can't create backup directory for mysql" >> $mailtext + exit 1; + fi fi # Check Backupdir for files -if test -d $backupdir/files -then - echo ""; +if test -d $backupdir/files; then + echo ""; else - echo -n "Create Backupdirectory for files ... " >> $mailtext - mkdir $backupdir/files - if test -d $backupdir/files - then - echo -n "done" >> $mailtext - echo "\n" >> $mailtext - else - echo -n "Error - Cant create backupdirectory for files" >> $mailtext - exit 1; - fi - + echo -n "Create Backupdirectory for files ... " >> $mailtext + mkdir -p $backupdir/files + if test -d $backupdir/files; then + echo "done" >> $mailtext + echo "" >> $mailtext + else + echo "Error - Can't create backup directory for files" >> $mailtext + exit 1; + fi fi ###################### # Start Files backup # ###################### -#count datadir's from config -countdir=${#datadir[*]}; - -for (( j=0; j<$countdir; j++ )) -do - #reset Error Variable TODO Error handling - error="0"; - filesdir=${datadir[$j]} - #echo ""; - #make backup from files dir - name=$(basename $filesdir) - echo -n "make backup from $filesdir ..." >> $mailtext - tar -Pczf $backupdir/files/$name'_'$date1.tar.gz $filesdir - if [ $? == "0" ] - then - echo -n " done" >> $mailtext - echo "\n" >> $mailtext - else - echo -n " error" >> $mailtext - echo "\n" >> $mailtext - fi +# count datadir's from config +countdir=${#datadir[*]} + +for (( j=0; j<$countdir; j++ )); do + # reset Error Variable TODO Error handling + error="0" + filesdir=${datadir[$j]} + # make backup from files dir + name=$(basename $filesdir) + echo -n "make backup from $filesdir ..." >> $mailtext + tar -Pczf $backupdir/files/$name'_'$date1.tar.gz $filesdir + if [ $? -eq 0 ]; then + echo "done" >> $mailtext + echo "" >> $mailtext + else + echo "error" >> $mailtext + echo "" >> $mailtext + fi done - ###################### # Start MYSQL Backup # ###################### -#clear mysql checkfile +# clear mysql checkfile echo "" > /tmp/mysqlcheck -#count databaeses from config -count=${#datenbank[*]}; - -for (( i=0; i<$count; i++ )) -do - #reset Error Variable - dumperror="0"; - - db=${datenbank[$i]} - echo " "; - # Check MYSQL DB - echo -n "Check Mysql Database: \"$db\" ... " >> $mailtext - mysqlcheck -s -u$dbuser -p$dbpass $db >> /tmp/mysqlcheck - - if [ $? == "0" ] - then - mysqlcheck=$(cat /tmp/mysqlcheck) - if [ -n "$mysqlcheck" ]; - then - echo -n " Error -> Details am Ende der Mail" >> $mailtext - echo "" >> $mailtext - else - echo -n " OK" >> $mailtext - echo "" >> $mailtext - fi - else - echo -n " Error " >> $mailtext - echo "" >> $mailtext - fi - - # Dump MYSQL DB - echo -n "create dump for db: \"$db\" ... " >> $mailtext - mysqldump -u$dbuser -p$dbpass --opt $db > $backupdir/mysql/$db'_'$date1.sql - if [ $? == "0" ] - then - echo -n " done " >> $mailtext - sqlfile=$backupdir/mysql/$db'_'$date1.sql - echo " " >> $mailtext - else - echo -n " Error " >> $mailtext - dumperror="1"; - echo " " >> $mailtext - fi - - # Gzip MYSQL Dump - echo -n "gzip dump for db: \"$db\" ... " >> $mailtext - if [ $dumperror == "0" ] - then - gzip -f -9 $sqlfile - if [ $? == "0" ] - then - echo -n " done " >> $mailtext - echo " " >> $mailtext - else - echo -n " Error " >> $mailtext - echo " " >> $mailtext - fi - else - echo -n " Error " >> $mailtext - echo " " >> $mailtext - fi - - - - -if [ -n "$mysqlcheck" ]; -then - - echo " " >> $mailtext - echo "##############################################################" >> $mailtext - echo "Mysql Check Details: " >> $mailtext - echo "##############################################################" >> $mailtext - echo "" >> $mailtext - cat /tmp/mysqlcheck >> $mailtext -fi - +# count databases from config +count=${#datenbank[*]} + +for (( i=0; i<$count; i++ )); do + # reset Error Variable + dumperror="0" + db=${datenbank[$i]} + # Check MYSQL DB + echo -n "Check Mysql Database: \"$db\" ... " >> $mailtext + mysqlcheck -s -u$dbuser -p$dbpass $db >> /tmp/mysqlcheck + + if [ $? -eq 0 ]; then + mysqlcheck=$(cat /tmp/mysqlcheck) + if [ -n "$mysqlcheck" ]; then + echo "Error -> Details am Ende der Mail" >> $mailtext + echo "" >> $mailtext + else + echo "OK" >> $mailtext + echo "" >> $mailtext + fi + else + echo "Error" >> $mailtext + echo "" >> $mailtext + fi + + # Dump MYSQL DB + echo -n "create dump for db: \"$db\" ... " >> $mailtext + mysqldump -u$dbuser -p$dbpass --opt $db > $backupdir/mysql/$db'_'$date1.sql + if [ $? -eq 0 ]; then + echo "done" >> $mailtext + sqlfile=$backupdir/mysql/$db'_'$date1.sql + echo "" >> $mailtext + else + echo "Error" >> $mailtext + dumperror="1" + echo "" >> $mailtext + fi + + # Gzip MYSQL Dump + echo -n "gzip dump for db: \"$db\" ... " >> $mailtext + if [ $dumperror -eq 0 ]; then + gzip -f -9 $sqlfile + if [ $? -eq 0 ]; then + echo "done" >> $mailtext + echo "" >> $mailtext + else + echo "Error" >> $mailtext + echo "" >> $mailtext + fi + else + echo "Error" >> $mailtext + echo "" >> $mailtext + fi + + if [ -n "$mysqlcheck" ]; then + echo "" >> $mailtext + echo "##############################################################" >> $mailtext + echo "Mysql Check Details: " >> $mailtext + echo "##############################################################" >> $mailtext + echo "" >> $mailtext + cat /tmp/mysqlcheck >> $mailtext + fi done # Mailversand - cat $mailtext | mail -s "$mailsubject" $email -exit 0; +exit 0 From a2efadf6479bb47a215310478e29732f6798b0b6 Mon Sep 17 00:00:00 2001 From: MrUnknownDE Date: Tue, 25 Jun 2024 09:18:14 +0200 Subject: [PATCH 2/5] add nfs-check and code tidied up --- backupfiles_to_nfs.sh | 228 ++++++++++++++++++++---------------------- 1 file changed, 107 insertions(+), 121 deletions(-) diff --git a/backupfiles_to_nfs.sh b/backupfiles_to_nfs.sh index 0b61f54..9f1f499 100644 --- a/backupfiles_to_nfs.sh +++ b/backupfiles_to_nfs.sh @@ -8,163 +8,149 @@ # ################# CONFIG ##################### -backupdir="$nfsmountdir/$hostname" # Verzeichniss wo die Backups abgelegt werden, es werden automatisch unterordner "mysql" und "files" erstellt. -datadir=(/path/to/files /path/to/files/2 ) # Welche Ordner sollen gesichert werden -datenbank=(dbname dbnam2) # Datenbanken welche gesichert werden sollen -date1=$(date +%a) # Datumsformat welches an die Dateien angehangen wird -hostname=$(hostname -f) # Hostname -dbuser=DBUSER # Datenbank User -dbpass=DBPASS # Datenbank Passwort -mailsubject="Backup - $hostname" # Mail Betreff -mailtext=/tmp/mailtext.txt # Mailtext zum Versand -email=monitor@example.com # Empfaenger der Status Mails -date2=$(date +%A" "%d.%m.%Y) # Datum für E-Mail -nfsmount="192.168.0.1:/backupshare" # NFS server + mount mount -nfsmountdir=/path/to/backup/ # Ordner fuer NFS-Share +backupdir="$nfsmountdir/$hostname" # Verzeichniss wo die Backups abgelegt werden, es werden automatisch unterordner "mysql" und "files" erstellt. +datadir=(/path/to/files /path/to/files/2 ) # Welche Ordner sollen gesichert werden +datenbank=(dbname dbnam2) # Datenbanken welche gesichert werden sollen +date1=$(date +%a) # Datumsformat welches an die Dateien angehangen wird +hostname=$(hostname -f) # Hostname +dbuser=DBUSER # Datenbank User +dbpass=DBPASS # Datenbank Passwort +mailsubject="Backup - $hostname" # Mail Betreff +mailtext=/tmp/mailtext.txt # Mailtext zum Versand +email=monitor@example.com # Empfaenger der Status Mails +date2=$(date +%A" "%d.%m.%Y) # Datum für E-Mail +nfsmount="192.168.0.1:/backupshare" # NFS server + mount mount +nfsmountdir=/path/to/backup/ # Ordner fuer NFS-Share ################# CONFIG END ################# -#reset Error Variable -error="0"; +# Function to check if NFS packages are installed +check_nfs_packages() { + if ! dpkg -l | grep -q nfs-common; then + echo "NFS packages not installed. Installing..." + sudo apt-get update + sudo apt-get install -y nfs-common + if [ $? -ne 0 ]; then + echo "Failed to install NFS packages. Exiting..." + exit 1 + fi + fi +} + +# Run the NFS package check function +check_nfs_packages -#Clear mailtext +# Reset Error Variable +error="0" -echo " " > $mailtext; +# Clear mailtext +echo " " > $mailtext -#Aktuelles Datum +# Aktuelles Datum echo "#############################################################" >> $mailtext -echo "Backup Script from $hostname - "$date2 >> $mailtext +echo "Backup Script from $hostname - $date2" >> $mailtext echo "#############################################################" >> $mailtext echo "" >> $mailtext # Check Backupdir -if test -d $nfsmountdir -then - echo ""; -else - echo -n "Create Backupdirectory ... " >> $mailtext - mkdir -p $nfsmountdir - if test -d $nfsmountdir - then - echo -n "done" >> $mailtext - echo "\n" >> $mailtext - else - echo -n "Error - Cant create nfs directory" >> $mailtext - # send mail on Error - cat $mailtext | mail -s "$mailsubject" $email - exit 1; - fi - +if [ ! -d $nfsmountdir ]; then + echo -n "Create Backupdirectory ... " >> $mailtext + mkdir -p $nfsmountdir + if [ ! -d $nfsmountdir ]; then + echo -n "Error - Cant create nfs directory" >> $mailtext + # send mail on Error + cat $mailtext | mail -s "$mailsubject" $email + exit 1 + fi + echo -n "done" >> $mailtext + echo "\n" >> $mailtext fi -#mount NFS to backupdir -echo -n "mount nfs share $nfsmount ... " >> $mailtext; +# Mount NFS to backupdir +echo -n "mount nfs share $nfsmount ... " >> $mailtext mount $nfsmount $nfsmountdir -if [ $? == "0" ] -then - echo -n " done" >> $mailtext - echo "\n" >> $mailtext -else - echo -n " error" >> $mailtext - echo "\n" >> $mailtext - # send mail on Error - cat $mailtext | mail -s "$mailsubject" $email - exit 1; +if [ $? -ne 0 ]; then + echo -n " error" >> $mailtext + echo "\n" >> $mailtext + # send mail on Error + cat $mailtext | mail -s "$mailsubject" $email + exit 1 fi +echo -n " done" >> $mailtext +echo "\n" >> $mailtext # Check Backupdir -if test -d $backupdir -then - echo ""; -else - echo -n "Create Backupdirectory ... " >> $mailtext - mkdir -p $backupdir - if test -d $backupdir - then - echo -n "done" >> $mailtext - echo "\n" >> $mailtext - else - echo -n "Error - Cant create backupdirectory" >> $mailtext - # send mail on Error - cat $mailtext | mail -s "$mailsubject" $email - exit 1; - fi - +if [ ! -d $backupdir ]; then + echo -n "Create Backupdirectory ... " >> $mailtext + mkdir -p $backupdir + if [ ! -d $backupdir ]; then + echo -n "Error - Cant create backupdirectory" >> $mailtext + # send mail on Error + cat $mailtext | mail -s "$mailsubject" $email + exit 1 + fi + echo -n "done" >> $mailtext + echo "\n" >> $mailtext fi # Check Backupdir for mysql -if test -d $backupdir/mysql -then - echo ""; -else - echo -n "Create Backupdirectory for mysql ... " >> $mailtext - mkdir $backupdir/mysql - if test -d $backupdir/mysql - then - echo -n "done" >> $mailtext - echo "\n" >> $mailtext - else - echo -n "Error - Cant create backupdirectory for mysql" >> $mailtext - # send mail on Error - cat $mailtext | mail -s "$mailsubject" $email - exit 1; - fi - +if [ ! -d $backupdir/mysql ]; then + echo -n "Create Backupdirectory for mysql ... " >> $mailtext + mkdir -p $backupdir/mysql + if [ ! -d $backupdir/mysql ]; then + echo -n "Error - Cant create backupdirectory for mysql" >> $mailtext + # send mail on Error + cat $mailtext | mail -s "$mailsubject" $email + exit 1 + fi + echo -n "done" >> $mailtext + echo "\n" >> $mailtext fi # Check Backupdir for files -if test -d $backupdir/files -then - echo ""; -else - echo -n "Create Backupdirectory for files ... " >> $mailtext - mkdir -p $backupdir/files - if test -d $backupdir/files - then - echo -n "done" >> $mailtext - echo "\n" >> $mailtext - else - echo -n "Error - Cant create backupdirectory for files" >> $mailtext - # send mail on Error - cat $mailtext | mail -s "$mailsubject" $email - exit 1; - fi - +if [ ! -d $backupdir/files ]; then + echo -n "Create Backupdirectory for files ... " >> $mailtext + mkdir -p $backupdir/files + if [ ! -d $backupdir/files ]; then + echo -n "Error - Cant create backupdirectory for files" >> $mailtext + # send mail on Error + cat $mailtext | mail -s "$mailsubject" $email + exit 1 + fi + echo -n "done" >> $mailtext + echo "\n" >> $mailtext fi ###################### # Start Files backup # ###################### -#count datadir's from config -countdir=${#datadir[*]}; +# Count datadir's from config +countdir=${#datadir[*]} for (( j=0; j<$countdir; j++ )) do - filesdir=${datadir[$j]} - #echo ""; - #make backup from files dir - name=$(basename $filesdir) - echo -n "make backup from $filesdir ..." >> $mailtext - tar -Pczf $backupdir/files/$name'_'$date1.tar.gz $filesdir - if [ $? == "0" ] - then - echo -n " done" >> $mailtext - echo "\n" >> $mailtext - else - echo -n " error" >> $mailtext - echo "\n" >> $mailtext - # send mail on Error - cat $mailtext | mail -s "$mailsubject" $email - exit 1; - fi + filesdir=${datadir[$j]} + # echo ""; + # Make backup from files dir + name=$(basename $filesdir) + echo -n "make backup from $filesdir ..." >> $mailtext + tar -Pczf $backupdir/files/${name}_$date1.tar.gz $filesdir + if [ $? -ne 0 ]; then + echo -n " error" >> $mailtext + echo "\n" >> $mailtext + # send mail on Error + cat $mailtext | mail -s "$mailsubject" $email + exit 1 + fi + echo -n " done" >> $mailtext + echo "\n" >> $mailtext done -#umount NFS share +# Umount NFS share umount $nfsmountdir # Mailversand - # cat $mailtext | mail -s "$mailsubject" $email -exit 0; +exit 0 From da761a9773734b4ad8b3a038b1630a7eed0da89d Mon Sep 17 00:00:00 2001 From: MrUnknownDE Date: Mon, 15 Jul 2024 12:30:27 +0200 Subject: [PATCH 3/5] test msmtp --- .msmtprc | 17 +++++++++++++++++ backupfiles_to_nfs.sh | 14 +++++++++++++- backuptool.sh | 13 ++++++++++++- 3 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 .msmtprc diff --git a/.msmtprc b/.msmtprc new file mode 100644 index 0000000..4e390f6 --- /dev/null +++ b/.msmtprc @@ -0,0 +1,17 @@ +# Default settings for msmtp +defaults +auth on +tls on +tls_trust_file /etc/ssl/certs/ca-certificates.crt +logfile ~/.msmtp.log + +# Account settings +account monitor-netstack +host maildb01.netstack.de +port 587 +from xxx@netstack.de +user xxx@netstack.de +password xxx + +# Set a default account +account default : monitor-netstack \ No newline at end of file diff --git a/backupfiles_to_nfs.sh b/backupfiles_to_nfs.sh index 9f1f499..edb7e35 100644 --- a/backupfiles_to_nfs.sh +++ b/backupfiles_to_nfs.sh @@ -151,6 +151,18 @@ done umount $nfsmountdir # Mailversand -# cat $mailtext | mail -s "$mailsubject" $email +check_ssmtp_packages() { + if ! dpkg -l | grep -q msmtp; then + echo "msmtp packages not installed. Installing..." + sudo apt-get update + sudo apt-get install -y msmtp + if [ $? -ne 0 ]; then + echo "Failed to install msmtp packages. Exiting..." + exit 1 + fi + fi +} + +echo -e "Subject: $mailsubject\n\n$mailtext" | msmtp -t email exit 0 diff --git a/backuptool.sh b/backuptool.sh index 3abbc62..5bfc35e 100644 --- a/backuptool.sh +++ b/backuptool.sh @@ -177,6 +177,17 @@ for (( i=0; i<$count; i++ )); do done # Mailversand -cat $mailtext | mail -s "$mailsubject" $email +check_ssmtp_packages() { + if ! dpkg -l | grep -q msmtp; then + echo "msmtp packages not installed. Installing..." + sudo apt-get update + sudo apt-get install -y msmtp + if [ $? -ne 0 ]; then + echo "Failed to install msmtp packages. Exiting..." + exit 1 + fi + fi +} +echo -e "Subject: $mailsubject\n\n$mailtext" | msmtp -t email exit 0 From 49f65d8df0af23cb51644acc8d24c88d8a87c238 Mon Sep 17 00:00:00 2001 From: MrUnknownDE Date: Mon, 15 Jul 2024 14:34:01 +0200 Subject: [PATCH 4/5] edit mail-command --- backuptool.sh | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/backuptool.sh b/backuptool.sh index 5bfc35e..a358b53 100644 --- a/backuptool.sh +++ b/backuptool.sh @@ -189,5 +189,12 @@ check_ssmtp_packages() { fi } -echo -e "Subject: $mailsubject\n\n$mailtext" | msmtp -t email +( + echo "To: $email" + echo "Subject: $mailsubject" + echo "Content-Type: text/plain" + echo + cat $mailtext +) | msmtp $email + exit 0 From 1b2d503f4f4f97b7ad4636436f3b97cae875b74c Mon Sep 17 00:00:00 2001 From: MrUnknownDE Date: Fri, 20 Dec 2024 12:06:40 +0100 Subject: [PATCH 5/5] optimize backuptool --- backupfiles_to_nfs.sh | 270 ++++++++++++++++++---------------------- backuptool.sh | 280 +++++++++++++++--------------------------- 2 files changed, 219 insertions(+), 331 deletions(-) diff --git a/backupfiles_to_nfs.sh b/backupfiles_to_nfs.sh index edb7e35..d9a001a 100644 --- a/backupfiles_to_nfs.sh +++ b/backupfiles_to_nfs.sh @@ -1,168 +1,138 @@ #!/bin/bash -# -# BackupNFS Tool 0.2 -# -# Programm von Netstack GmbH written by Andreas Pfeiffer -# -# Dieses Programm führt Datei Backups zu einem NFS Share durch -# +# BackupNFS Tool 0.3 - NFS-Sicherung +# Programm von Netstack GmbH + ################# CONFIG ##################### +nfsmount="192.168.0.1:/backupshare" +nfsmountdir="/data/nfs_backup" +hostname="$(hostname -f)" +backupdir="$nfsmountdir/$hostname" +datadir=(/path/to/files /path/to/files/2) +datenbank=(dbname dbname2) +date1="$(date +%a)" +date2="$(date +%A %d.%m.%Y)" +dbuser="DBUSER" +dbpass="DBPASS" +email="monitor@example.com" +mailsubject="Backup - $hostname" +mailtext="/tmp/mailtext.txt" + +################# FUNCTIONS ##################### + +log_message() { + echo -e "$1" | tee -a "$mailtext" +} + +send_mail() { + ( + echo "To: $email" + echo "Subject: $mailsubject" + echo "Content-Type: text/plain" + echo + cat $mailtext + ) | msmtp $email +} -backupdir="$nfsmountdir/$hostname" # Verzeichniss wo die Backups abgelegt werden, es werden automatisch unterordner "mysql" und "files" erstellt. -datadir=(/path/to/files /path/to/files/2 ) # Welche Ordner sollen gesichert werden -datenbank=(dbname dbnam2) # Datenbanken welche gesichert werden sollen -date1=$(date +%a) # Datumsformat welches an die Dateien angehangen wird -hostname=$(hostname -f) # Hostname -dbuser=DBUSER # Datenbank User -dbpass=DBPASS # Datenbank Passwort -mailsubject="Backup - $hostname" # Mail Betreff -mailtext=/tmp/mailtext.txt # Mailtext zum Versand -email=monitor@example.com # Empfaenger der Status Mails -date2=$(date +%A" "%d.%m.%Y) # Datum für E-Mail -nfsmount="192.168.0.1:/backupshare" # NFS server + mount mount -nfsmountdir=/path/to/backup/ # Ordner fuer NFS-Share - -################# CONFIG END ################# - -# Function to check if NFS packages are installed -check_nfs_packages() { - if ! dpkg -l | grep -q nfs-common; then - echo "NFS packages not installed. Installing..." - sudo apt-get update - sudo apt-get install -y nfs-common +check_and_install_package() { + local pkg="$1" + if ! dpkg -l | grep -q "$pkg"; then + log_message "Installing $pkg..." + sudo apt-get update && sudo apt-get install -y "$pkg" if [ $? -ne 0 ]; then - echo "Failed to install NFS packages. Exiting..." + log_message "Failed to install $pkg. Exiting..." + send_mail exit 1 fi fi } -# Run the NFS package check function -check_nfs_packages - -# Reset Error Variable -error="0" - -# Clear mailtext -echo " " > $mailtext - -# Aktuelles Datum -echo "#############################################################" >> $mailtext -echo "Backup Script from $hostname - $date2" >> $mailtext -echo "#############################################################" >> $mailtext -echo "" >> $mailtext - -# Check Backupdir -if [ ! -d $nfsmountdir ]; then - echo -n "Create Backupdirectory ... " >> $mailtext - mkdir -p $nfsmountdir - if [ ! -d $nfsmountdir ]; then - echo -n "Error - Cant create nfs directory" >> $mailtext - # send mail on Error - cat $mailtext | mail -s "$mailsubject" $email - exit 1 - fi - echo -n "done" >> $mailtext - echo "\n" >> $mailtext -fi - -# Mount NFS to backupdir -echo -n "mount nfs share $nfsmount ... " >> $mailtext -mount $nfsmount $nfsmountdir -if [ $? -ne 0 ]; then - echo -n " error" >> $mailtext - echo "\n" >> $mailtext - # send mail on Error - cat $mailtext | mail -s "$mailsubject" $email - exit 1 -fi -echo -n " done" >> $mailtext -echo "\n" >> $mailtext - -# Check Backupdir -if [ ! -d $backupdir ]; then - echo -n "Create Backupdirectory ... " >> $mailtext - mkdir -p $backupdir - if [ ! -d $backupdir ]; then - echo -n "Error - Cant create backupdirectory" >> $mailtext - # send mail on Error - cat $mailtext | mail -s "$mailsubject" $email - exit 1 - fi - echo -n "done" >> $mailtext - echo "\n" >> $mailtext -fi - -# Check Backupdir for mysql -if [ ! -d $backupdir/mysql ]; then - echo -n "Create Backupdirectory for mysql ... " >> $mailtext - mkdir -p $backupdir/mysql - if [ ! -d $backupdir/mysql ]; then - echo -n "Error - Cant create backupdirectory for mysql" >> $mailtext - # send mail on Error - cat $mailtext | mail -s "$mailsubject" $email - exit 1 - fi - echo -n "done" >> $mailtext - echo "\n" >> $mailtext -fi - -# Check Backupdir for files -if [ ! -d $backupdir/files ]; then - echo -n "Create Backupdirectory for files ... " >> $mailtext - mkdir -p $backupdir/files - if [ ! -d $backupdir/files ]; then - echo -n "Error - Cant create backupdirectory for files" >> $mailtext - # send mail on Error - cat $mailtext | mail -s "$mailsubject" $email - exit 1 +create_directory() { + local dir="$1" + if [ ! -d "$dir" ]; then + mkdir -p "$dir" + if [ $? -ne 0 ]; then + log_message "Error creating directory: $dir" + send_mail + exit 1 + fi fi - echo -n "done" >> $mailtext - echo "\n" >> $mailtext -fi - -###################### -# Start Files backup # -###################### - -# Count datadir's from config -countdir=${#datadir[*]} - -for (( j=0; j<$countdir; j++ )) -do - filesdir=${datadir[$j]} - # echo ""; - # Make backup from files dir - name=$(basename $filesdir) - echo -n "make backup from $filesdir ..." >> $mailtext - tar -Pczf $backupdir/files/${name}_$date1.tar.gz $filesdir +} + +mount_nfs() { + mount | grep -q "$nfsmountdir" if [ $? -ne 0 ]; then - echo -n " error" >> $mailtext - echo "\n" >> $mailtext - # send mail on Error - cat $mailtext | mail -s "$mailsubject" $email - exit 1 - fi - echo -n " done" >> $mailtext - echo "\n" >> $mailtext -done - -# Umount NFS share -umount $nfsmountdir - -# Mailversand -check_ssmtp_packages() { - if ! dpkg -l | grep -q msmtp; then - echo "msmtp packages not installed. Installing..." - sudo apt-get update - sudo apt-get install -y msmtp + log_message "Mounting NFS share $nfsmount to $nfsmountdir..." + mount "$nfsmount" "$nfsmountdir" if [ $? -ne 0 ]; then - echo "Failed to install msmtp packages. Exiting..." + log_message "Error mounting NFS share. Exiting..." + send_mail exit 1 fi fi } -echo -e "Subject: $mailsubject\n\n$mailtext" | msmtp -t email +backup_files() { + for dir in "${datadir[@]}"; do + if [ -d "$dir" ]; then + local sanitized_dir="${dir%/}" # Entfernt abschließenden Slash + local name="$(basename "$sanitized_dir")" # Extrahiert den Ordnernamen + if [ -z "$name" ]; then + log_message "Error: Unable to extract directory name for path $dir." + send_mail + exit 1 + fi + log_message "Backing up directory $dir to $backupdir/files/${name}_$date1.tar.gz..." + tar -Pczf "$backupdir/files/${name}_$date1.tar.gz" "$dir" --ignore-failed-read --warning=no-file-changed + if [ $? -ne 0 ]; then + log_message "Error backing up $dir. Exiting..." + send_mail + exit 1 + fi + else + log_message "Error: Directory $dir does not exist. Skipping..." + fi + done +} + + +backup_mysql() { + for db in "${datenbank[@]}"; do + local dump_file="$backupdir/mysql/${db}_$date1.sql" + log_message "Creating MySQL dump for database $db..." + mysqldump -u"$dbuser" -p"$dbpass" --opt "$db" > "$dump_file" + if [ $? -ne 0 ]; then + log_message "Error creating MySQL dump for $db. Exiting..." + send_mail + exit 1 + fi + log_message "Compressing dump file $dump_file..." + gzip -f -9 "$dump_file" + if [ $? -ne 0 ]; then + log_message "Error compressing $dump_file. Exiting..." + send_mail + exit 1 + fi + done +} + +################# MAIN SCRIPT ##################### + +>"$mailtext" # Clear mail text +log_message "Starting backup script for $hostname on $date2" + +check_and_install_package "nfs-common" +check_and_install_package "msmtp" + +create_directory "$nfsmountdir" +mount_nfs +create_directory "$backupdir" +create_directory "$backupdir/mysql" +create_directory "$backupdir/files" + +backup_files +backup_mysql -exit 0 +umount "$nfsmountdir" +log_message "Backup completed successfully." +send_mail +exit 0 \ No newline at end of file diff --git a/backuptool.sh b/backuptool.sh index 80693d1..318d338 100644 --- a/backuptool.sh +++ b/backuptool.sh @@ -1,200 +1,118 @@ #!/bin/bash -# -# Backup Tool 2.0 -# -# Programm von Netstack GmbH written by Andreas Pfeiffer -# -# Dieses Programm wurde für Datenbank backups mehrerer Datenbanken vorgesehen! -# Ab Version 1.2 gibt es auch MYSQL-Checks -# Ab Version 2.0 sind auch Ordnerbackups moeglich -# -################# CONFIG ##################### - -backupdir=/data/backup # Verzeichniss wo die Backups abgelegt werden, es werden automatisch unterordner "mysql" und "files" erstellt. -datenbank=(dbname dbnam2) # Datenbanken welche gesichert werden sollen -datadir=(/path/to/webdir1 /path/to/webdir2) # Welche Ordner sollen gesichert werden -dbuser=DBUSER # Datenbank User -dbpass=DBPASS # Datenbank Passwort -date1=$(date +%a) # Datumsformat welches an die Dateien angehangen wird -hostname=$(hostname -f) # Hostname -mailsubject="MYSQL-Backup - $hostname" # Mail Betreff -mailtext=/tmp/mailtext.txt # Mailtext zum Versand -email=EMAIL@ADRESSE # Empfaenger der Status Mails -date2=$(date +%A" "%d.%m.%Y) # Datum für E-Mail - -################# CONFIG END ################# - -# Set PATH -export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin - -# Clear mailtext -echo " " > $mailtext; - -# Aktuelles Datum -echo "#############################################################" >> $mailtext -echo "MYSQL Backup Script from $hostname - "$date2 >> $mailtext -echo "#############################################################" >> $mailtext -echo "" >> $mailtext +# Backup Tool 0.3 - Lokale Speicherung +# Programm von Netstack GmbH -# Check Backupdir -if test -d $backupdir; then - echo ""; -else - echo -n "Create Backupdirectory ... " >> $mailtext - mkdir -p $backupdir - if test -d $backupdir; then - echo "done" >> $mailtext - echo "" >> $mailtext - else - echo "Error - Can't create backup directory" >> $mailtext - exit 1; - fi -fi - -# Check Backupdir for mysql -if test -d $backupdir/mysql; then - echo ""; -else - echo -n "Create Backupdirectory for mysql ... " >> $mailtext - mkdir -p $backupdir/mysql - if test -d $backupdir/mysql; then - echo "done" >> $mailtext - echo "" >> $mailtext - else - echo "Error - Can't create backup directory for mysql" >> $mailtext - exit 1; - fi -fi - -# Check Backupdir for files -if test -d $backupdir/files; then - echo ""; -else - echo -n "Create Backupdirectory for files ... " >> $mailtext - mkdir -p $backupdir/files - if test -d $backupdir/files; then - echo "done" >> $mailtext - echo "" >> $mailtext - else - echo "Error - Can't create backup directory for files" >> $mailtext - exit 1; - fi -fi - -###################### -# Start Files backup # -###################### - -# count datadir's from config -countdir=${#datadir[*]} - -for (( j=0; j<$countdir; j++ )); do - # reset Error Variable TODO Error handling - error="0" - filesdir=${datadir[$j]} - # make backup from files dir - name=$(basename $filesdir) - echo -n "make backup from $filesdir ..." >> $mailtext - tar -Pczf $backupdir/files/$name'_'$date1.tar.gz $filesdir - if [ $? -eq 0 ]; then - echo "done" >> $mailtext - echo "" >> $mailtext - else - echo "error" >> $mailtext - echo "" >> $mailtext - fi -done - -###################### -# Start MYSQL Backup # -###################### - -# clear mysql checkfile -echo "" > /tmp/mysqlcheck - -# count databases from config -count=${#datenbank[*]} +################# CONFIG ##################### +hostname="$(hostname -f)" +backupdir="/local_backup/$hostname" +datadir=(/path/to/files /path/to/files/2) +datenbank=(dbname dbname2) +date1="$(date +%a)" +date2="$(date +%A %d.%m.%Y)" +dbuser="DBUSER" +dbpass="DBPASS" +email="monitor@example.com" +mailsubject="Backup - $hostname" +mailtext="/tmp/mailtext.txt" + +################# FUNCTIONS ##################### + +log_message() { + echo -e "$1" | tee -a "$mailtext" +} -for (( i=0; i<$count; i++ )); do - # reset Error Variable - dumperror="0" - db=${datenbank[$i]} - # Check MYSQL DB - echo -n "Check Mysql Database: \"$db\" ... " >> $mailtext - mysqlcheck -s -u$dbuser -p$dbpass $db >> /tmp/mysqlcheck +send_mail() { + ( + echo "To: $email" + echo "Subject: $mailsubject" + echo "Content-Type: text/plain" + echo + cat $mailtext + ) | msmtp $email +} - if [ $? -eq 0 ]; then - mysqlcheck=$(cat /tmp/mysqlcheck) - if [ -n "$mysqlcheck" ]; then - echo "Error -> Details am Ende der Mail" >> $mailtext - echo "" >> $mailtext - else - echo "OK" >> $mailtext - echo "" >> $mailtext +check_and_install_package() { + local pkg="$1" + if ! dpkg -l | grep -q "$pkg"; then + log_message "Installing $pkg..." + sudo apt-get update && sudo apt-get install -y "$pkg" + if [ $? -ne 0 ]; then + log_message "Failed to install $pkg. Exiting..." + send_mail + exit 1 fi - else - echo "Error" >> $mailtext - echo "" >> $mailtext fi +} - # Dump MYSQL DB - echo -n "create dump for db: \"$db\" ... " >> $mailtext - mysqldump -u$dbuser -p$dbpass --opt $db > $backupdir/mysql/$db'_'$date1.sql - if [ $? -eq 0 ]; then - echo "done" >> $mailtext - sqlfile=$backupdir/mysql/$db'_'$date1.sql - echo "" >> $mailtext - else - echo "Error" >> $mailtext - dumperror="1" - echo "" >> $mailtext +create_directory() { + local dir="$1" + if [ ! -d "$dir" ]; then + mkdir -p "$dir" + if [ $? -ne 0 ]; then + log_message "Error creating directory: $dir" + send_mail + exit 1 + fi fi +} - # Gzip MYSQL Dump - echo -n "gzip dump for db: \"$db\" ... " >> $mailtext - if [ $dumperror -eq 0 ]; then - gzip -f -9 $sqlfile - if [ $? -eq 0 ]; then - echo "done" >> $mailtext - echo "" >> $mailtext +backup_files() { + for dir in "${datadir[@]}"; do + if [ -d "$dir" ]; then + local sanitized_dir="${dir%/}" # Entfernt abschließenden Slash + local name="$(basename "$sanitized_dir")" # Extrahiert den Ordnernamen + if [ -z "$name" ]; then + log_message "Error: Unable to extract directory name for path $dir." + send_mail + exit 1 + fi + log_message "Backing up directory $dir to $backupdir/files/${name}_$date1.tar.gz..." + tar -Pczf "$backupdir/files/${name}_$date1.tar.gz" "$dir" --ignore-failed-read --warning=no-file-changed + if [ $? -ne 0 ]; then + log_message "Error backing up $dir. Exiting..." + send_mail + exit 1 + fi else - echo "Error" >> $mailtext - echo "" >> $mailtext + log_message "Error: Directory $dir does not exist. Skipping..." fi - else - echo "Error" >> $mailtext - echo "" >> $mailtext - fi - - if [ -n "$mysqlcheck" ]; then - echo "" >> $mailtext - echo "##############################################################" >> $mailtext - echo "Mysql Check Details: " >> $mailtext - echo "##############################################################" >> $mailtext - echo "" >> $mailtext - cat /tmp/mysqlcheck >> $mailtext - fi -done + done +} -# Mailversand -check_ssmtp_packages() { - if ! dpkg -l | grep -q msmtp; then - echo "msmtp packages not installed. Installing..." - sudo apt-get update - sudo apt-get install -y msmtp +backup_mysql() { + for db in "${datenbank[@]}"; do + local dump_file="$backupdir/mysql/${db}_$date1.sql" + log_message "Creating MySQL dump for database $db..." + mysqldump -u"$dbuser" -p"$dbpass" --opt "$db" > "$dump_file" if [ $? -ne 0 ]; then - echo "Failed to install msmtp packages. Exiting..." + log_message "Error creating MySQL dump for $db. Exiting..." + send_mail exit 1 fi - fi + log_message "Compressing dump file $dump_file..." + gzip -f -9 "$dump_file" + if [ $? -ne 0 ]; then + log_message "Error compressing $dump_file. Exiting..." + send_mail + exit 1 + fi + done } -( - echo "To: $email" - echo "Subject: $mailsubject" - echo "Content-Type: text/plain" - echo - cat $mailtext -) | msmtp $email +################# MAIN SCRIPT ##################### + +>"$mailtext" # Clear mail text +log_message "Starting backup script for $hostname on $date2" + +check_and_install_package "msmtp" + +create_directory "$backupdir" +create_directory "$backupdir/mysql" +create_directory "$backupdir/files" + +backup_files +backup_mysql +log_message "Backup completed successfully." +send_mail exit 0