pixelplanet/utils/backupServer/compressBackup.sh

105 lines
4.0 KiB
Bash
Executable File

#!/bin/bash
# Should be run as daily cron job
#
# Makes backup dirs smaller, first by hardlinking duplicate files of daily backups every day
# (duplicates within the time folders (incremential backups) of the previous day,
# and the tiles folder of current day (full backups) to tiles folder of previous day within the same month)
# second by archieving full months into read-only squashfs at the 1st of the next month
# Has to be run as root for the squashfs to be able to get mounted
#
# arguments:
# NONE to take system date to decide what to do (run as daily cronjob)
# or:
# $1 = Date in format YYYYMMDD
# CHANGE THIS TO YOUR PATH
BACKUPROOT="/home/backup/pixelplanet/canvas"
# mount options of created monthly squashfs images
MOUNT_OPTIONS="ro,defaults"
# NO CHANGE PAST THIS NEEDED
if [ "$1" != "" ]
then
set -e
TODAY=`printf "%(%Y/%m/%d)T" \`date --utc --date "$1" +%s\``
YESTERDAY=`printf "%(%Y/%m/%d)T" $(( $(date --utc --date "$1" +%s) - 24*3600 ))`
set +e
else
TODAY=`printf "%(%Y/%m/%d)T" -1`
YESTERDAY=`printf "%(%Y/%m/%d)T" $(( $(printf "%(%s)T" -1) - 24*3600 ))`
fi
echo $TODAY $YESTERDAY
echo "---Resolve duplicates in incremental backups for ${YESTERDAY}---"
DIR="${BACKUPROOT}/${YESTERDAY}"
if [ -w "${DIR}" ]; then
for CAN_DIR in `ls ${DIR}`; do
echo "-Canvas ${CAN_DIR}-"
shopt -s nullglob;
TIMEDIRS=("${DIR}"/"${CAN_DIR}"/*/);
shopt -u nullglob;
CNT=$[${#TIMEDIRS[@]}-2]
IT=0
while [ $IT -lt $CNT ]; do
DIRF="${TIMEDIRS[${IT}]}"
IT=$[${IT}+1]
DIRS="${TIMEDIRS[${IT}]}"
for COL in `ls ${DIRS}`; do
if [ -d "${DIRF}${COL}" ] && [ -d "${DIRS}${COL}" ]; then
echo /usr/bin/hardlink --respect-name --ignore-time --ignore-owner --maximize "${DIRF}${COL}" "${DIRS}${COL}"
/usr/bin/hardlink --respect-name --ignore-time --ignore-owner --maximize "${DIRF}${COL}" "${DIRS}${COL}"
fi
done
done
done
fi
# if beginning of month
if [ `echo "${TODAY}" | sed 's/.*\///'` == "01" ]
then
echo "---mksquashfs previous month---"
PREV_YEAR=`echo "${YESTERDAY}" | sed 's/\/.*//'`
PREV_MONTH=`echo "${YESTERDAY}" | sed 's/[^\/]*\///' | sed 's/\/.*//'`
SQUASH_FILE="${BACKUPROOT}/${PREV_YEAR}/${PREV_MONTH}.sqsh.gz"
if [ ! -f "${SQUASH_FILE}" ]; then
echo "doing ${SQUASH_FILE}"
set -e
echo "mksquashfs ${BACKUPROOT}/${PREV_YEAR}/${PREV_MONTH} ${SQUASH_FILE} -b 8192 -no-xattrs -progress -no-exports"
/usr/sbin/mksquashfs "${BACKUPROOT}/${PREV_YEAR}/${PREV_MONTH}" ${SQUASH_FILE} -b 8192 -no-xattrs -progress -no-exports
if [ -f "${SQUASH_FILE}" ]; then
echo "Mount ${SQUASH_FILE}"
mv "${BACKUPROOT}/${PREV_YEAR}/${PREV_MONTH}" "${BACKUPROOT}/${PREV_YEAR}/rem"
mkdir "${BACKUPROOT}/${PREV_YEAR}/${PREV_MONTH}"
echo "${SQUASH_FILE} ${BACKUPROOT}/${PREV_YEAR}/${PREV_MONTH} squashfs ${MOUNT_OPTIONS} 0 0" >> /etc/fstab
/usr/bin/mount "${BACKUPROOT}/${PREV_YEAR}/${PREV_MONTH}"
echo "cleaning up old files... this might take a while"
rm -rf "${BACKUPROOT}/${PREV_YEAR}/rem"
fi
set +e
else
echo "${SQUASH_FILE} already exists. Don't do mksquashfs."
fi
else
DIR="${BACKUPROOT}/${YESTERDAY}"
PREV_DIR="${BACKUPROOT}/${TODAY}"
echo "---Resolve duplicates to full backup to previous day---"
if [ -w "${DIR}" ]; then
for CAN_DIR in `ls ${DIR}`; do
if [ -d "${DIR}/${CAN_DIR}/tiles" ] && [ -d "${PREV_DIR}/${CAN_DIR}/tiles" ]; then
for COL in `ls ${DIR}/${CAN_DIR}/tiles`; do
WDIR="${CAN_DIR}/tiles/${COL}"
echo "----${CAN_DIR} / ${COL}----"
if [ -d "${DIR}/${WDIR}" ] && [ -d "${PREV_DIR}/${WDIR}" ]; then
echo /usr/bin/hardlink --respect-name --ignore-time --ignore-owner -maximize "${DIR}/${WDIR}" "${PREV_DIR}/${WDIR}"
/usr/bin/hardlink --respect-name --ignore-time --ignore-owner --maximize "${DIR}/${WDIR}" "${PREV_DIR}/${WDIR}"
fi
done
fi
done
fi
fi
exit 0