Skip to content

Instantly share code, notes, and snippets.

@mattrude
Created August 11, 2011 00:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mattrude/1138641 to your computer and use it in GitHub Desktop.
Save mattrude/1138641 to your computer and use it in GitHub Desktop.
WordPress Auto Backup Script
# /bin/bash
BKNAME=
DIR=
DBHOST=
DBNAME=
DBUSER=
DBPASS=
# Backup Varibles
BKDIR=
# Restore Variables
RSDIR=
RSARDIR=
RSUSER=
RSGROUP=
OFFSITE=
# Offsite Rsync
RSYNCHOST=
RSYNCUSERNAME=
RSYNCPASSWORD=
# Offiste SCP
SCPUSER=
SCPHOST=
SCPDIR=
if [ `date +%e` = 1 ]; then
DAY=`date +%b`
DATE=$DAY.`date +%Y-%m-%d`
else
DAY=`date +%w`
DATE=$DAY.`date +%Y-%m-%d`
fi
if [ -e $1 ]; then
source $1
CONFIGSTATUS="Using config file found at $1"
else
echo "No Config file found"
exit
fi
if [ ! -e $DB_HOST ]; then
DBHOST=`grep "DB_HOST" $DIR/wp-config.php |sed "s/define('DB_HOST', '//" |sed "s/');//"`
DBNAME=`grep "DB_NAME" $DIR/wp-config.php |sed "s/define('DB_NAME', '//" |sed "s/');//"`
DBUSER=`grep "DB_USER" $DIR/wp-config.php |sed "s/define('DB_USER', '//" |sed "s/');//"`
DBPASS=`grep "DB_PASS" $DIR/wp-config.php |sed "s/define('DB_PASSWORD', '//" |sed "s/');//"`
fi
BKDIRNAME=$BKNAME
if [ `date +%e` = 1 ]; then
ARCHIVE=1
else
if [ `date +%w` = 0 ]; then
ARCHIVE=1
else
ARCHIVE=0
fi
fi
if [ ! -e $BKDIR ];then
mkdir -p $BKDIR
fi
chown -R root:root $DIR/
chown -R apache:apache $DIR/wp-content $DIR/wp-admin/update.php
chown apache:apache $DIR
if [ -e $DIR/sitemap.xml ]; then
chown apache:apache $DIR/sitemap.xml
fi
if [ -e $DIR/sitemap.xml.gz ]; then
chown apache:apache $DIR/sitemap.xml.gz
fi
case "$2" in
restore)
rm -rf $RSARDIR/$BKNAME.$DAY.*
rm -rf $RSDIR/$BKNAME
rm -rf $DIR/$BKNAME.$DAY.*
rm -rf $DIR/$DBNAME.*
if [ ! -e $RSARDIR ]; then
mkdir -p $RSARDIR
fi
export RSYNC_PASSWORD=$RSYNCPASSWORD
rsync -rvzht --delete --stats $RSYNCUSERNAME@$RSYNCHOST::ibackup/odin/$BKNAME/$BKNAME.$DAY.* $RSARDIR/ --port=45873 >> $DIR/$BACKUPNAME.log 2>&1
cd $RSARDIR
md5sum -c $BKNAME.$DATE.tgz.md5 > /dev/null 2>&1
RESTOREMD5=`echo $(($?))`
if [ $RESTOREMD5 = 0 ]; then
cd $RSDIR/
cp $RSARDIR/$BKNAME.$DATE.tgz $RSDIR/$BKNAME.$DATE.tgz
tar -xzf $RSDIR/$BKNAME.$DATE.tgz
mv $RSDIR$DIR $RSDIR
cd $RSDIR/$BKNAME
md5sum -c $DBNAME.$DATE.sql.md5 > /dev/null 2>&1
RESTORESQLMD5=`echo $(($?))`
if [ $RESTORESQLMD5 = 0 ]; then
cd $RSDIR
mysql -u $DBUSER -p$DBPASS $DBNAME < $RSDIR/$BKNAME/$DBNAME.$DATE.sql
chown -R $RSUSER:$RSGROUP $RSDIR/$BKNAME
rm -rf $RSDIR/var
rm -rf $RSDIR/$BKNAME.$DATE.tgz
rm -rf $RSDIR/$BKNAME/$DBNAME.$DATE.sql
rm -rf $RSDIR/$BKNAME/$DBNAME.$DATE.log
else
echo "MD5 Check of the $BKNAME.$DATE.tgz SQL file failed"
echo "Exiting $BKNAME with error code 1"
rm -rf $RSDIR/$BKNAME.$DATE.tgz
exit 1
fi
else
echo "MD5 Check of the $BKNAME.$DATE.tgz file failed"
echo "Exiting $BKNAME with error code 1"
rm -rf $RSDIR/$BKNAME.$DATE.tgz
exit 1
fi
;;
backup)
rm -rf $BKDIR/$BKNAME.$DAY.*
rm -rf $DIR/$DBNAME.*
for a in `echo "show tables;" |mysql -h $DBHOST -u $DBUSER -p$DBPASS $DBNAME -N`
do
echo "OPTIMIZE TABLE $a;" |mysql -h $DBHOST -u $DBUSER -p$DBPASS $DBNAME -N >> $DIR/$BKNAME.$DATE.log 2>&1
done
mysqldump -h $DBHOST -u $DBUSER -p$DBPASS $DBNAME > $DIR/$DBNAME.$DATE.sql 2> $DIR/$BKNAME.$DATE.log
a=$?
mysqldump -h $DBHOST -u $DBUSER -p$DBPASS $DBNAME --xml > $DIR/$DBNAME.$DATE.xml 2> $DIR/$BKNAME.$DATE.log
a2=$?
cd $DIR/
md5sum $DBNAME.$DATE.sql $DBNAME.$DATE.xml > $DBNAME.$DATE.sql.md5 2>> $DIR/$BKNAME.$DATE.log
b=$?
SQLERROR=`echo $(($a+$a2+$b))`
if [ $SQLERROR != 0 ]; then
BKNAME=$BKNAME-NOSQL
echo "Exiting on SQL error"
echo "DBHOST $DBHOST"
echo "DBNAME $DBNAME"
echo "DBUSER $DBUSER"
echo "DBPASS $DBPASS"
exit 1
fi
tar -czf $BKDIR/$BKNAME.$DATE.tgz --totals $DIR >> $DIR/$BKNAME.$DATE.log 2>&1
c=$?
cd $BKDIR/
md5sum $BKNAME.$DATE.tgz > $BKNAME.$DATE.tgz.md5 2>> $DIR/$BKNAME.$DATE.log
d=$?
TOTAL=`ls -lh $BKDIR/$BKNAME.$DATE.tgz |awk '{ print $5 }'`
ERROR=`echo $(($a+$a2+$b+$c+$d))`
if [ $ERROR = 0 ]; then
STATUS=Good
else
STATUS=Failed
fi
echo "" >> $DIR/$BKNAME.$DATE.log
echo "Starting GPG encryption" >> $DIR/$BKNAME.$DATE.log
for a in $GPGKEY
do
GPGKEYD="$GPGKEYD -r $a"
done
#gpg -e -r $GPGKEY $BKDIR/$BKNAME.$DATE.tgz
echo "" >> $DIR/$BKNAME.$DATE.log
if [ $ARCHIVE = '0' ]; then
case "$OFFSITE" in
rsync|RSYNC)
export RSYNC_PASSWORD=$RSYNCPASSWORD
rsync -rvzht --delete --stats $BKDIR/ $RSYNCUSERNAME@$RSYNCHOST::ibackup/odin/$BKDIRNAME --port=45873 --exclude=Archive/ >> $DIR/$BACKUPNAME.log 2>&1
;;
scp|SCP)
echo "" >> $DIR/$BKNAME.$DATE.log
echo "Starting SCP Transmition" >> $DIR/$BKNAME.$DATE.log
ssh $SCPUSER@$SCPHOST "mkdir -p $SCPDIR"
ssh $SCPUSER@$SCPHOST "rm -f $SCPDIR/$BKNAME.$DAY.*"
scp -q $BKDIR/$BKNAME.$DATE.tgz $SCPUSER@$SCPHOST:$SCPDIR/ 2>> $DIR/$BKNAME.$DATE.log
scp -q $BKDIR/$BKNAME.$DATE.tgz.md5 $SCPUSER@$SCPHOST:$SCPDIR/ 2>> $DIR/$BKNAME.$DATE.log
#ssh $SCPUSER@$SCPHOST "chmod 666 $SCPDIR/$BKNAME.$DAY.*"
echo "" >> $DIR/$BKNAME.$DATE.log
;;
esac
fi
echo "final error status is: $ERROR" >> $DIR/$BKNAME.$DATE.log
sed '/tar: Removing leading */d' $DIR/$BKNAME.$DATE.log > $BKDIR/backuptmp.log
#echo "INSERT INTO Backup_Log ( System, Backup_Job, Label, Output, Bytes, Status, Log ) VALUES ('`hostname -s`', 'Wiki', '$DIR', '$BKNAME.$DATE', '$TOTAL', '$STATUS', '`cat $BKDIR/backuptmp.log`');" |mysql -t -h localhost -u backup Status
rm -rf $BKDIR/backuptmp.log
rm -rf $DIR/$DBNAME.$DAY.*
rm -rf $DIR/$BKNAME.$DAY.*
;;
*)
echo "The valid commands are backup & restore"
exit 1
;;
esac
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment