####################### # THE BACKUP FUNCTION # ####################### function backup() { POSIT=() while [[ $# -gt 0 ]]; do KEY="$1" case $KEY in -n|--no-compress) NOCOMPRESS="yes" ;; -d|--delete-old) DELETEOLD="yes" ;; -s|--skip-uploads) SKIPUPLOADS="yes" ;; -p|--path) DESTDIR="$2" ; shift ;; *) echo "$1 not implemented" ; POSIT+=("$1") ;; esac shift done set -- "${POSIT[@]}" DELETEOLD="${DELETEOLD:-no}" SKIPUPLOADS="${SKIPUPLOADS:-no}" DESTDIR="${DESTDIR:-`pwd`}" [ -f ${DESTDIR}/wp-config.php ] || echo "this isn't a wordpress installation" [ -f ${DESTDIR}/wp-config.php ] || exit 1 local DATETIME=`date +%Y%m%d.%H%M` echo "==WPM BACKUP CALLED ON $DATETIME WITH VERSION $WPMVERSION==" | tee -a $LOGFILE echo "==UNIQUE IDENTIFIER $INSTANCEID==" | tee -a $LOGFILE echo "==$INSTANCEID==Executing backup on $DESTDIR" >> $LOGFILE cd $DESTDIR local NAME=`echo $DESTDIR | rev | cut -d '/' -f 1 | rev` if [ "$NAME" == "" ] || [ ${#NAME} -lt 3 ] || [ "$NAME" == "html" ]; then NAME=`hostname -f` fi echo "==$INSTANCEID==The name is ${NAME}" | tee -a $LOGFILE local DBNAME=`grep DB_NAME wp-config.php | awk -F "'" '{print $4}'` echo "==$INSTANCEID==The DB name is ${DBNAME}" | tee -a $LOGFILE if mysql "${DBNAME}" >/dev/null 2>&1 $TEMPDIR/${DBNAME}.${DATETIME}.sql echo "==$INSTANCEID==The database dump is complete." | tee -a $LOGFILE if [ "$BACKUPPATH" == "PARENTOFGIVEN" ]; then BACKUPPATH=`dirname $DESTDIR` DELETEOLD="no" fi if [ "$DELETEOLD" == "yes" ]; then try find $BACKUPPATH -mtime +1 -type f -exec rm -fv '{}' \;; echo "==$INSTANCEID==removed old backups" | tee -a $LOGFILE; fi if [[ "${SKIPUPLOADS}" == "no" ]]; then local SF=`echo $(($(stat -f --format="%a*%S" .)))`; local SN=`du -sb .|awk '{print $1}'`; local SB=${SN} local SN=`echo $(($SN + $SN))`; if [ $SF -gt $SN ]; then echo "==$INSTANCEID==Adequate free space detected" | tee -a $LOGFILE else echo "==$INSTANCEID==Insufficient space available. Terminating" | tee -a $LOGFILE exit 1 fi fi echo "==$INSTANCEID==Starting archive creation" | tee -a $LOGFILE [ `which xz` ] && COMPRESSOR="xz" [ `which pv` ] && PROGRESS="pv" if [ "$PROGRESS" == "pv" ]; then TAROPTIONS="cf" INTERPRED="pv -per -s${SB} |" else TAROPTIONS="cfv" INTERPRED="" fi if [ "$SKIPUPLOADS" == "yes" ]; then EXCLUDES="--exclude-tag=tagfile --exclude-vcs --exclude-backups" else EXCLUDES="--exclude-vcs --exclude-backups" fi if [ -d $DESTDIR/wp-content/uploads ]; then touch $DESTDIR/wp-content/uploads/tagfile fi MEMORY=$( echo $((`cat /proc/meminfo | grep MemTotal | awk '{print $2}'`/1024)) ) if [[ $MEMORY -lt 1152 ]]; then NOCOMPRESS="yes" else NOCOMPRESS="${NOCOMPRESS:-no}" fi if [ "$NOCOMPRESS" == "yes" ]; then if [ "$COMPRESSOR" == "xz" ]; then PRED="xz -0 > $BACKUPPATH/$NAME.$DATETIME.tar.xz" else PRED="gzip -1 > $BACKUPPATH/$NAME.$DATETIME.tar.gz" fi else if [ "$COMPRESSOR" == "xz" ]; then PRED="xz -9 > $BACKUPPATH/$NAME.$DATETIME.tar.xz" else PRED="gzip -9 > $BACKUPPATH/$NAME.$DATETIME.tar.gz" fi fi [ `which getfacl` ] && getfacl -R `pwd` > .permissions_backup.${DATETIME} [ `which getfacl` ] && echo "==$INSTANCEID==Permissions backup completed." | tee -a $LOGFILE [ `which getfacl` ] && echo "==$INSTANCEID==Restore with setfacl --restore=${DESTDIR}/.permissions_backup.${DATETIME}" | tee -a $LOGFILE CMD="try tar $TAROPTIONS - $EXCLUDES --transform=\"flags=r;s|^|$DATETIME/|\" --show-transformed * $TEMPDIR/$DBNAME.$DATETIME.sql | $INTERPRED $PRED" eval $CMD rm -f $TEMPDIR/$DBNAME.$DATETIME.sql if [ -f $DESTDIR/wp-content/uploads/tagfile ]; then rm -f $DESTDIR/wp-content/uploads/tagfile fi echo "==$INSTANCEID==The archive is available at $BACKUPPATH/$NAME.$DATETIME.tar.xz" } # END BACKUP