Skip to content

Instantly share code, notes, and snippets.

@marklindhout
Last active December 12, 2015 09:18
Show Gist options
  • Save marklindhout/4749944 to your computer and use it in GitHub Desktop.
Save marklindhout/4749944 to your computer and use it in GitHub Desktop.
#!/bin/bash
# Author: Mark P. Lindhout
# Date: 2013-02-10
# Remarks:
# This file can be used for backing up servers to an RSYNC server. It assumes:
# 1. The existence of the /var/mysqldumps/ and /var/installed-packages/ folders
# 2. An SSH key already exchanged with the $REMOTE_HOST
# 3. Existing folders on the $REMOTE_HOST for each daily, weekly and monthly backups.
# 4. The possibility to do mysql and mysqldump commands without needing a password.
# See: http://www.techiecorner.com/1619/how-to-setup-mysqldump-without-password-in-cronjob/
# Set all kinds of neat variables
REMOTE_USER="username" # Username (no spaces)
REMOTE_HOST="server.domain.tld" # Server URL (no spaces)
REMOTE_HOME="/home/$REMOTE_USER/" # Path based on username
KEYFILE="/root/.ssh/${REMOTE_HOST}_rsa" # Keyfile is based on host
BACKUP_START=`date +%s`
# Provide general info on this backup
echo ""
echo "[Backup Overview]"
echo " - Backup start ....: `date -d @${BACKUP_START}`"
echo " - Server ..........: $REMOTE_HOST"
echo " - Username ........: $REMOTE_USER"
echo " - Key file ........: $KEYFILE"
# Decide what do do per backup type
echo ""
echo "[Backup Type]"
# Check that the type of backup is given, otherwise assume daily
if [ $1 ]
then
BACKUP_TYPE="$1" # from the command line: daily, weekly, monthly
else
BACKUP_TYPE="daily"
echo " - No backup type selected. Assuming 'daily'"
fi
# Handle command line arguments
case $BACKUP_TYPE in
daily)
echo " - Backup type .....: $BACKUP_TYPE"
;;
weekly)
echo " - Backup type .....: $BACKUP_TYPE"
;;
monthly)
echo " - Backup type .....: $BACKUP_TYPE"
;;
*)
echo " * [Error] Unknown backup type or wrong arguments provided."
exit
;;
esac
# and now GO!
# MYSQL
# ----------------------------------------------------------------------------
echo ""
echo "[MySQL]"
MYSQL_DUMP_PATH="/var/mysqldumps"
DATABASES=`mysql --user=root -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema|phpmyadmin|mysql)"`
for db in $DATABASES;
do
mysqldump --force --opt --user=root --databases $db > "$MYSQL_DUMP_PATH/$db.sql"
echo " - Exporting: $MYSQL_DUMP_PATH/$db.sql"
done
# PACKAGES
# ----------------------------------------------------------------------------
echo ""
echo "[Packages]"
DPKG_DUMP_PATH="/var/installed-packages/installed-packages.txt"
dpkg --get-selections > $DPKG_DUMP_PATH
echo " - Installed packages list exported to: $DPKG_DUMP_PATH"
# RSYNC
# ----------------------------------------------------------------------------
# First we build the complete path from above variables and the local hostname
REMOTE_PATH="${REMOTE_HOME}`hostname`-${BACKUP_TYPE}"
echo ""
echo "[Rsync]"
echo " - Path for backups : $REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH"
echo " - Keyfile used ....: $KEYFILE"
echo " - Remote path .....: $REMOTE_PATH"
# Define the paths we want to backup
# Loop through them and sync
for p in "/var" "/etc" "/usr" "/home";
do
rsync -a -e "ssh -i $KEYFILE" ${p} ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_PATH}
echo " - Sync done .......: $p"
done
function show_duration () {
num=$1
min=0
hour=0
day=0
if((num>59));then
((sec=num%60))
((num=num/60))
if((num>59));then
((min=num%60))
((num=num/60))
if((num>23));then
((hour=num%24))
else
((hour=num))
fi
else
((min=num))
fi
else
((sec=num))
fi
echo "${hour}:${min}:${sec}"
}
# Info about duration
echo ""
echo "[Backup Duration]"
BACKUP_END=`date +%s`
BACKUP_DURATION=`expr $BACKUP_END - $BACKUP_START`
echo " - Backup start ....: `date -d @${BACKUP_START}`"
echo " - Backup end ......: `date -d @${BACKUP_START}`"
echo " - Backup duration .: $(show_duration $BACKUP_DURATION)"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment