#!/bin/bash # voor documentatie, zie # http://blog.xlshosting.nl/algemeen/rolling-backups-met-rsync/ # set -x # configuratie hier VERSION="1.6" TEMPLOG=/tmp/temprsynclog # Configfile if [ -f /etc/backups/brand.conf ]; then source /etc/backups/brand.conf source /etc/backups/"$SHORTBRANDNAME"backup.conf else echo "De configfile is niet gevonden, run de installer om deze aan te laten maken." exit fi # Controleren of notificaties gedefinieerd zijn in de configfile en zoniet, toevoegen. if [ -z "$NOTIFICATIONS" ]; then chattr -i /etc/backups/"$SHORTBRANDNAME"backup.conf echo -e "NOTIFICATIONS=Y" >> /etc/backups/"$SHORTBRANDNAME"backup.conf chattr +i /etc/backups/"$SHORTBRANDNAME"backup.conf NOTIFICATIONS=Y fi if [ -z "$LOGGING" ]; then chattr -i /etc/backups/"$SHORTBRANDNAME"backup.conf echo -e "LOGGING=Y" >> /etc/backups/"$SHORTBRANDNAME"backup.conf echo -e "MAILLOG=Y" >> /etc/backups/"$SHORTBRANDNAME"backup.conf echo -e "LOGPATH=--log-file=/var/log/"$SHORTBRANDNAME"backup/" >> /etc/backups/"$SHORTBRANDNAME"backup.conf chattr +i /etc/backups/"$SHORTBRANDNAME"backup.conf LOGGING=Y MAILLOG=N fi if [ "$LOGGING" = "Y" ]; then if ! [ -d /var/log/"$SHORTBRANDNAME"backup ]; then mkdir /var/log/"$SHORTBRANDNAME"backup fi fi # Korte quota controle of er nog voldoende ruimte beschikbaar is om verder te kunnen gaan # en tevens wat quotagegevens opvragen: QUOTAUSE=$(ssh -i $PRIVKEY $BUSER@$BSERVER 2>/dev/null | grep home | awk '{print $4}' | tr -d %) QUOTATOTALSIZE=$(ssh -i $PRIVKEY $BUSER@$BSERVER 2>/dev/null | grep home | awk '{print $1}' | tr -d G) QUOTASTARTFREE=$(ssh -i $PRIVKEY $BUSER@$BSERVER 2>/dev/null | grep home | awk '{print $3}' | tr -d G) # Wanneer het gebruik tussen de 90% en 99% is, doorgaan en waarschuwing mailen if [ "$NOTIFICATIONS" = 'Y' ]; then if [ $QUOTAUSE -ge 90 -a $QUOTAUSE -le 99 ]; then mail -s 'WAARSCHUWING! Backupaccount voor '$BUSER' is bijna vol!' $OLDRSYNCMAIL < $MYSQLBACKUPDIR/$db.gz done ls -hl $MYSQLBACKUPDIR echo "MySQL Backup geslaagd." else echo "MySQL backupmap bestaat niet, aanmaken..." mkdir $MYSQLBACKUPDIR; chmod 700 $MYSQLBACKUPDIR echo "MySQL backupmap met succes aangemaakt in $MYSQLBACKUPDIR! Dump volgt alsnog." . /usr/local/directadmin/conf/mysql.conf; databases=`mysql --user=$user --password=$passwd -e 'SHOW DATABASES;' | grep -Ev '(Database|information_schema)'` for db in $databases; do mysqldump --opt --hex-blob --force --user=$user --password=$passwd $db | gzip > $MYSQLBACKUPDIR/$db.gz done ls -hl $MYSQLBACKUPDIR echo "MySQL backup geslaagd." fi else echo "MySQL Backups zijn uitgeschakeld." fi echo "" echo "De backup zal nu gestart worden..." echo -ne "mkdir $H-daily\nmkdir $H-weekly\nmkdir $H-monthly\nmkdir $DIR\n" | sftp -oPort=$SSHPORT -o 'IdentityFile '$PRIVKEY $BUSER@$BSERVER:$REMOTEPATH > /dev/null 2> /dev/null rsync --log-file="$TEMPLOG"`date '+%d-%m-%Y'`.log -e 'ssh -p '$SSHPORT' -i '$PRIVKEY --bwlimit=$XFERSPEED --link-dest=$PREVDIR --delete -apSH $EXCLUDES $BACKUPROOT $BUSER@$BSERVER:$REMOTEPATH$DIR 2>&1 echo -e "Backup geslaagd!\n" # Plesk elif [ -d /usr/local/psa/ ]; then if [ $MYSQLBACKUP = 0 ]; then MYSQLPW=$(tail /etc/psa/.psa.shadow) echo "MySQL Backups zijn ingeschakeld, dump volgt nu." if [ -d $MYSQLBACKUPDIR ]; then databases=`mysql --user=admin --password=$MYSQLPW -e 'SHOW DATABASES;' | grep -Ev '(Database|information_schema)'` for db in $databases; do mysqldump --opt --hex-blob --force --user=admin --password=$MYSQLPW $db | gzip > $MYSQLBACKUPDIR/$db.gz done ls -hl $MYSQLBACKUPDIR echo "MySQL Backup geslaagd." else echo "MySQL backupmap bestaat niet, aanmaken..." mkdir $MYSQLBACKUPDIR; chmod 700 $MYSQLBACKUPDIR echo "MySQL backupmap met succes aangemaakt in $MYSQLBACKUPDIR! Dump volgt alsnog." databases=`mysql --user=admin --password=$MYSQLPW -e 'SHOW DATABASES;' | grep -Ev '(Database|information_schema)'` for db in $databases; do mysqldump --opt --hex-blob --force --user=admin --password=$MYSQLPW $db | gzip > $MYSQLBACKUPDIR/$db.gz done ls -hl $MYSQLBACKUPDIR echo "MySQL backup geslaagd." fi else echo "MySQL Backups zijn uitgeschakeld en worden derhalve niet gemaakt." fi echo "" echo "De backup zal nu gestart worden..." echo -ne "mkdir $H-daily\nmkdir $H-weekly\nmkdir $H-monthly\nmkdir $DIR\n" | sftp -oPort=$SSHPORT -o 'IdentityFile '$PRIVKEY $BUSER@$BSERVER:$REMOTEPATH > /dev/null 2> /dev/null rsync --log-file="$TEMPLOG"`date '+%d-%m-%Y'`.log -e 'ssh -p '$SSHPORT' -i '$PRIVKEY --bwlimit=$XFERSPEED --link-dest=$PREVDIR --delete -apSH --exclude /usr/local/psa/admin/sbin/ $EXCLUDES $BACKUPROOT $BUSER@$BSERVER:$REMOTEPATH$DIR 2>&1 echo -e "Backup geslaagd!\n" # cPanel / WHM elif [ -d /usr/local/cpanel/ ]; then if [ $MYSQLBACKUP = 0 ]; then echo "MySQL Backups zijn ingeschakeld, dump volgt nu." if [ -d $MYSQLBACKUPDIR ]; then databases=`mysql --user=root -e 'SHOW DATABASES;' | grep -Ev '(Database|information_schema)'` for db in $databases; do mysqldump --opt --hex-blob --force --user=$user $db | gzip > $MYSQLBACKUPDIR/$db.gz done ls -hl $MYSQLBACKUPDIR echo "MySQL Backup geslaagd." else echo "MySQL backupmap bestaat niet, aanmaken..." mkdir $MYSQLBACKUPDIR; chmod 700 $MYSQLBACKUPDIR echo "MySQL backupmap met succes aangemaakt in $MYSQLBACKUPDIR! Dump volgt alsnog." databases=`mysql --user=root -e 'SHOW DATABASES;' | grep -Ev '(Database|information_schema)'` for db in $databases; do mysqldump --opt --hex-blob --force --user=$user $db | gzip > $MYSQLBACKUPDIR/$db.gz done ls -hl $MYSQLBACKUPDIR echo "MySQL backup geslaagd.":40 fi else echo "MySQL Backups zijn uitgeschakeld en worden derhalve niet gemaakt." fi echo "" echo "De backup zal nu gestart worden..." echo -ne "mkdir $H-daily\nmkdir $H-weekly\nmkdir $H-monthly\nmkdir $DIR\n" | sftp -oPort=$SSHPORT -o 'IdentityFile '$PRIVKEY $BUSER@$BSERVER:$REMOTEPATH > /dev/null 2> /dev/null rsync --log-file="$TEMPLOG"`date '+%d-%m-%Y'`.log -e 'ssh -p '$SSHPORT' -i '$PRIVKEY --bwlimit=$XFERSPEED --link-dest=$PREVDIR --delete -apSH --exclude /backup/cpbackup/ --exclude /home/virtfs/ --exclude /usr/local/cpanel/3rdparty/mailman/cgi-bin/ --exclude /usr/local/apache/ --exclude /etc/exim/ $EXCLUDES $BACKUPROOT $BUSER@$BSERVER:$REMOTEPATH$DIR 2>&1 echo -e "Backup geslaagd!\n" # OpenPanel elif [ -d /etc/openpanel/ ]; then if [ $MYSQLBACKUP = 0 ]; then echo "MySQL Backups zijn ingeschakeld, dump volgt nu." if [ -d $MYSQLBACKUPDIR ]; then databases=`mysql --defaults-file=/etc/mysql/debian.cnf -e 'SHOW DATABASES;' | grep -Ev '(Database|information_schema)'` for db in $databases; do mysqldump --defaults-file=/etc/mysql/debian.cnf --opt --hex-blob --force $db | gzip > $MYSQLBACKUPDIR/$db.gz done ls -hl $MYSQLBACKUPDIR echo "MySQL Backup geslaagd." else echo "MySQL backupmap bestaat niet, aanmaken..." mkdir $MYSQLBACKUPDIR; chmod 700 $MYSQLBACKUPDIR echo "MySQL backupmap met succes aangemaakt in $MYSQLBACKUPDIR! Dump volgt alsnog." databases=`mysql --defaults-file=/etc/mysql/debian.cnf -e 'SHOW DATABASES;' | grep -Ev '(Database|information_schema)'` for db in $databases; do mysqldump --defaults-file=/etc/mysql/debian.cnf --opt --hex-blob --force $db | gzip > $MYSQLBACKUPDIR/$db.gz done ls -hl $MYSQLBACKUPDIR echo "MySQL backup geslaagd." fi else echo "MySQL Backups zijn uitgeschakeld." fi echo "" echo "De backup zal nu gestart worden..." echo -ne "mkdir $H-daily\nmkdir $H-weekly\nmkdir $H-monthly\nmkdir $DIR\n" | sftp -oPort=$SSHPORT -o 'IdentityFile '$PRIVKEY $BUSER@$BSERVER:$REMOTEPATH > /dev/null 2> /dev/null rsync --log-file="$TEMPLOG"`date '+%d-%m-%Y'`.log -e 'ssh -p '$SSHPORT' -i '$PRIVKEY --bwlimit=$XFERSPEED --link-dest=$PREVDIR --delete -apSH --exclude /etc/exim/ $EXCLUDES $BACKUPROOT $BUSER@$BSERVER:$REMOTEPATH$DIR 2>&1 echo -e "Backup geslaagd!\n" else if [ $MYSQLBACKUP = 0 ]; then echo "MySQL Backups zijn ingeschakeld, dump volgt nu." if [ -d $MYSQLBACKUPDIR ]; then databases=`mysql --user=$MYSQLUSER --password=$MYSQLPASS -e 'SHOW DATABASES;' | grep -Ev '(Database|information_schema)'` for db in $databases; do mysqldump --opt --hex-blob --force --user=$MYSQLUSER --password=$MYSQLPASS $db | gzip > $MYSQLBACKUPDIR/$db.gz done ls -hl $MYSQLBACKUPDIR echo "MySQL Backup geslaagd." else echo "MySQL backupmap bestaat niet, aanmaken..." mkdir $MYSQLBACKUPDIR; chmod 700 $MYSQLBACKUPDIR echo "MySQL backupmap met succes aangemaakt in $MYSQLBACKUPDIR! Dump volgt alsnog." databases=`mysql --user=$MYSQLUSER --password=$MYSQLPASS -e 'SHOW DATABASES;' | grep -Ev '(Database|information_schema)'` for db in $databases; do mysqldump --opt --hex-blob --force --user=$MYSQLUSER --password=$MYSQLPASS $db | gzip > $MYSQLBACKUPDIR/$db.gz done ls -hl $MYSQLBACKUPDIR echo "MySQL backup geslaagd." fi else echo "MySQL Backups zijn uitgeschakeld." fi echo "" echo "De backup zal nu gestart worden..." echo -ne "mkdir $H-daily\nmkdir $H-weekly\nmkdir $H-monthly\nmkdir $DIR\n" | sftp -oPort=$SSHPORT -o 'IdentityFile '$PRIVKEY $BUSER@$BSERVER:$REMOTEPATH > /dev/null 2> /dev/null rsync --log-file="$TEMPLOG"`date '+%d-%m-%Y'`.log -e 'ssh -p '$SSHPORT' -i '$PRIVKEY --bwlimit=$XFERSPEED --link-dest=$PREVDIR --delete -apSH --exclude /usr/local/cpanel/3rdparty/mailman/cgi-bin/ --exclude /usr/local/apache/ --exclude /etc/exim/ $EXCLUDES $BACKUPROOT $BUSER@$BSERVER:$REMOTEPATH$DIR 2>&1 echo -e "Backup geslaagd!\n" fi # Quota opvragen en berekenen: QUOTAPERCENTSTART=$QUOTAUSE QUOTAPERCENTFINISH=$(ssh -i $PRIVKEY $BUSER@$BSERVER 2>/dev/null | grep home | awk '{print $4}' | tr -d %) QUOTAPERCENTDIFF=$(($QUOTAPERCENTFINISH-$QUOTAUSE)) QUOTAPERCENTFREE=$((100-$QUOTAPERCENTFINISH)) QUOTAENDFREE=$(ssh -i $PRIVKEY $BUSER@$BSERVER 2>/dev/null | grep home | awk '{print $3}' | tr -d G) QUOTADIFF=$(echo $QUOTASTARTFREE-$QUOTAENDFREE | bc) # Quota een mooie format geven en tonen: echo "Ruimterapportage:" echo "- Het account is $QUOTATOTALSIZE Gb en er is nog $QUOTAENDFREE Gb ($QUOTAPERCENTFREE%) beschikbaar." echo "- De laatste backupsessie heeft $QUOTADIFF Gb ($QUOTAPERCENTDIFF%) ruimte gekost." # Tijdelijke logfile parsen en opslaan: cat "$TEMPLOG"`date '+%d-%m-%Y'`.log | while read -r line do set -- $line if [[ $4 == *..* ]] then # Als een het een dir is en timestamp changed if [[ $4 == '.d..t......' ]] then echo "$5" >> /tmp/dt.log; fi # Als een het een file is en timestamp / grootte changed if [[ $4 == '> /tmp/fst.log; fi # Als een het een file is en timestamp changed if [[ $4 == '> /tmp/ft.log; fi fi done # Meuk samenvoegen tot 1 rapport: if [ -f /tmp/dt.log ]; then echo -e "Hieronder volgt de lijst met mappen welke qua tijdstempel gewijzigd zijn.\nDit houd in dat er bewerkingen in of aan de map zijn geweest sinds de laatste backupsessie:\n" >> /var/log/"$SHORTBRANDNAME"backup/`date '+%d-%m-%Y'`.report cat /tmp/dt.log >> /var/log/"$SHORTBRANDNAME"backup/`date '+%d-%m-%Y'`.report rm /tmp/dt.log > /dev/null 2> /dev/null fi if [ -f /tmp/fst.log ]; then echo -e "\nHieronder volgt de lijst met bestanden welke qua grootte en tijdstempel gewijzigd zijn.\nDit houd in dat de genoemde bestanden gewijzigd zijn sinds de laatste backupsessie en dat deze van grootte veranderd zijn:\n" >> /var/log/"$SHORTBRANDNAME"backup/`date '+%d-%m-%Y'`.report cat /tmp/fst.log >> /var/log/"$SHORTBRANDNAME"backup/`date '+%d-%m-%Y'`.report rm /tmp/fst.log > /dev/null 2> /dev/null fi if [ -f /tmp/ft.log ]; then echo -e "\nHieronder volgt de lijst met bestanden welke qua grootte en tijdstempel gewijzigd zijn.\nDit houd in dat de genoemde bestanden gewijzigd zijn sinds de laatste backupsessie:\n" >> /var/log/"$SHORTBRANDNAME"backup/`date '+%d-%m-%Y'`.report cat /tmp/ft.log >> /var/log/"$SHORTBRANDNAME"backup/`date '+%d-%m-%Y'`.report rm /tmp/ft.log > /dev/null 2> /dev/null fi rm "$TEMPLOG"`date '+%d-%m-%Y'`.log > /dev/null 2> /dev/null # Wanneer verzocht, rapport mailen: if [ "$MAILLOG" = "Y" ]; then cat /var/log/"$SHORTBRANDNAME"backup/`date '+%d-%m-%Y'`.report | mail -s "Backuprapport van `hostname` (`date '+%d-%m-%Y'`)" "$OLDRSYNCMAIL" fi echo -e "\n----=[ Backup is afgerond op `date '+%d-%m-%Y'` om `date '+%H:%M:%S'` ]=----" rm /var/run/"$SHORTBRANDNAME"backup