#!/bin/bash
###########################################################################################
# #
# Simple secure automatic backup script by Gothi[c] #
#
http://www.donationcoder.com #
# #
# Takes 1 argument: settings file #
# #
# Settings file can have the following directives: #
# #
# - backup (which folder to back up) #
# - scphostname (scp remote machine host name) #
# - scpusername (scp username on remote machine) #
# - scpdestdir (scp destination folder on remote machine)(optional) #
# - except files (which files to exclude from the backup) (can have multiple directives) #
# - logfile (where to log events) #
# - scpdestfile (optional filename on remote server, if not specified one will be #
# generated based on the current date) #
# - enable scp (whether or not to enable scp upload of backups) #
# - enable email (whether or not to enable emailing backups) #
# - email (email address to send backups to, if enabled) #
# - sendmail (optional)(path to the sendmail program, used to send email) #
# #
# Requires following GNU utilities to be installed (these are present on about any GNU #
# system): cat,sed,grep,tar,bzip2 #
# #
# Requires following GNU utilities to be installed for scp uploading: scp (openssh) #
# #
# Requires following GNU utilities to be installed for emailing: sendmail, uuencode #
# #
###########################################################################################
#### first check the sanity of our user. ####
if [ ! -n "$1" ]; then
echo "ERROR: Missing settings file argument."
echo "Usage: $0 settingsfile".
exit $E_BADARGS
fi
#### check if settings file is readable ####
if [ ! -r "$1" ]; then
echo "ERROR: Could not read provided settings file: $1."
echo "Please ensure the file exists and that you have read permissions to it."
exit $E_BADARGS
fi
#### init variables ####
SETTINGS_FILE=$1
LOCAL_SRC_FOLDER=`cat $SETTINGS_FILE | grep "backup:" | sed -e 's/backup:\( \)\?//g' | sed -e 's/\( \)\+//'`
ARCHIVE_FILENAME=`basename $LOCAL_SRC_FOLDER`-`date +%F`.tar.bz2
REMOTE_HOSTNAME=`cat $SETTINGS_FILE | grep "scphostname:" | sed -e 's/scphostname:\( \)\?//g' | sed -e 's/\( \)\+//'`
REMOTE_USERNAME=`cat $SETTINGS_FILE | grep "scpusername:" | sed -e 's/scpusername:\( \)\?//g' | sed -e 's/\( \)\+//'`
REMOTE_DIRECTORY=`cat $SETTINGS_FILE | grep "scpdestdir:" | sed -e 's/scpdestdir:\( \)\?//g' | sed -e 's/\( \)\+//'`
REMOTE_FILENAME=`cat $SETTINGS_FILE | grep "scpdestfile:" | sed -e 's/scpdestfile:\( \)\?//g' | sed -e 's/\( \)\+//'`
LOG_FILE=`cat $SETTINGS_FILE | grep "logfile:" | sed -e 's/logfile:\( \)\?//g' | sed -e 's/\( \)\+//'`
EXCEPTIONS=( `cat $SETTINGS_FILE | grep "except files:" | sed -e 's/except files:\( \)\?//g' | sed -e 's/\( \)\+//' | sed ':a;N;$!ba;$s/\(.*\)\n/\1 /'` )
EMAIL=`cat $SETTINGS_FILE | grep "email:" | sed -e 's/email:\( \)\?//g' | sed -e 's/\( \)\+//'`
SCP_ENABLED=`cat $SETTINGS_FILE | grep "enable scp:" | sed -e 's/enable scp:\( \)\?//g' | sed -e 's/\( \)\+//'`
EMAIL_ENABLED=`cat $SETTINGS_FILE | grep "enable email:" | sed -e 's/enable email:\( \)\?//g' | sed -e 's/\( \)\+//'`
PROG_SENDMAIL=`cat $SETTINGS_FILE | grep "sendmail:" | sed -e 's/sendmail:\( \)\?//g' | sed -e 's/\( \)\+//'`
#### create archive ####
TAR_COMMAND="-cvjf /tmp/$ARCHIVE_FILENAME $LOCAL_SRC_FOLDER"
for exception in $(seq 0 $((${#EXCEPTIONS[@]} - 1))); do
TAR_COMMAND="$TAR_COMMAND --exclude ${EXCEPTIONS[$exception]}"
done
tar $TAR_COMMAND &> /dev/null
#### scp upload ####
if test "$SCP_ENABLED" != ""; then
if test "$REMOTE_FILENAME" = ""; then
SCP_REMOTE_FILE="."
else
SCP_REMOTE_FILE=$REMOTE_FILENAME
fi
SCP_COMMAND="/tmp/$ARCHIVE_FILENAME $REMOTE_USERNAME@$REMOTE_HOSTNAME:.$REMOTE_DIRECTORY/$SCP_REMOTE_FILE"
scp $SCP_COMMAND &> /dev/null
fi
#### email upload ####
echo "email enabled = $EMAIL_ENABLED"
if test "$EMAIL_ENABLED" != ""; then
echo "email enabled"
if test "$PROG_SENDMAIL" = ""; then
PROG_SENDMAIL="sendmail"
fi
if test "$EMAIL" != ""; then
cat /tmp/$ARCHIVE_FILENAME | uuencode /tmp/$ARCHIVE_FILENAME | ${PROG_SENDMAIL} $EMAIL
echo "email sent"
fi
fi
#### delete temporary archive file ####
rm /tmp/$ARCHIVE_FILENAME
#### logging ####
if test "$LOG_FILE" != ""; then
touch $LOG_FILE
if [ -w $LOG_FILE ]; then
THE_DATE=`date +%F`
THE_TIME=`date +%T`
echo "[$THE_DATE] ($THE_TIME): Completed backup for $SETTINGS_FILE." >> $LOG_FILE
fi
fi
exit 0