#!SHEBANGPATH=/opt/bin:/opt/local/bin:/opt/sbin:/opt/local/sbin/:/bin:/sbin:/usr/bin:/usr/sbin:/usr/syno/binSOURCE="SOURCELINE"TARGET="TARGETLINE"NAME=NAMELINECOMPRESS=COMPRESSLINEEXPIRE=EXPIRELINECHGOWN=CHOWNLINEPORT=PORTLINEDATE=$(which date)RSYNC=$(which rsync)NICE=$(which nice)FIND=$(which find)TMPFILE=/tmp/back_$$.logCURRENT="$TARGET/backup.current"INCOMPLETE="$TARGET/backup.incomplete"out(){ if [ -z "$1" ]; then e=127; else e="$1"; fi URL="http://server.org/backup.php?b=$NAME&e=$e" WGET=$(which curl); if [ -x "$WGET" ]; then $WGET $URL >/dev/null 2>&1 exit $e fi WGET=$(which wget); if [ -x "$WGET" ]; then $WGET -O /dev/null $URL >/dev/null 2>&1 exit $e fi exit $e} if [ "$COMPRESS" == "1" ]; then Z=z fi if [ -z "$RSYNC" ]; then out -1 fi if [ -z "$DATE" ]; then out -2 fi if [ -z "$NICE" ]; then out -3 fi if [ -z "$FIND" ]; then out -4 fi mkdir -p "$TARGET" || out -5 cd "$TARGET" || out -6 if [ -L "$CURRENT" ]; then # we have a successful backup. Use it as link-dst linkdst="--link-dest=$CURRENT" else # search for an old backup OLDB=$($FIND . -maxdepth 1 -type d -name '[0-9]*' | sort -n | tail -n1) if [ ! -z "$OLDB" ] && [ -d "$OLDB" ]; then ln -s "$OLDB" "$CURRENT" linkdst="--link-dest=$CURRENT" fi fi if [ ! -z "$CHGOWN" ]; then perm='--no-owner --no-group --no-perms' fi if [ ! -f "$TARGET/.rsync-exclude" ]; then touch "$TARGET/.rsync-exclude" fi if [ -f "$TARGET/.rsync-filter" ]; then RF=$($FIND $TARGET/.rsync-filter -maxdepth 1 -size 5c | wc -l) if [ $RF -eq 1 ]; then rm "$TARGET/.rsync-filter" else FILTER="--filter=merge $TARGET/.rsync-filter" fi fi if [ -r /etc/rsync.secrets ]; then secrets="--password-file=/etc/rsync.secrets" fi if [ ! -z "$PORT" ]; then port="--port=$PORT" fi EXCLUDE="--exclude-from=$TARGET/.rsync-exclude" OPTS="--ignore-errors --delete --timeout=1200 --numeric-ids ${linkdst} ${secrets} ${port} -a${Z}vSXH ${perm}" if [ -z "$FILTER" ]; then $RSYNC "$EXCLUDE" $OPTS "${SOURCE}/" "${INCOMPLETE}" > $TMPFILE 2>&1 else $RSYNC "${FILTER}" "$EXCLUDE" $OPTS "${SOURCE}/" "${INCOMPLETE}" > $TMPFILE 2>&1 fi retval=$? if [ "$retval" -eq "12" ]; then rm $TMPFILE OPTS="--ignore-errors --delete --timeout=1200 --numeric-ids ${linkdst} ${secrets} ${port} -a${Z}vSH ${perm}" if [ -z "$FILTER" ]; then $RSYNC "$EXCLUDE" $OPTS "${SOURCE}/" "${INCOMPLETE}" > $TMPFILE 2>&1 else $RSYNC "${FILTER}" "$EXCLUDE" $OPTS "${SOURCE}/" "${INCOMPLETE}" > $TMPFILE 2>&1 fi retval=$? fi if [ "$retval" -eq "0" ]; then # we have a valid and successful new backup NEWB=$TARGET/$($DATE +%Y%m%d.%H%M%S) mv "$INCOMPLETE" "$NEWB" || out -7 if [ -L "$TARGET/backup.current" ]; then rm "$CURRENT" || out -8 fi ln -s "$NEWB" "$CURRENT" || out -9 if [ ! -z "$CHGOWN" ]; then chmod -R 777 ${NEWB} 2>/dev/null chown -R "$CHGOWN" ${NEWB} fi rm -f $TMPFILE || out -11 # Purging old backups cd $TARGET || out -10 ANZ=$($FIND . -maxdepth 1 -name '[0-9]*' -type d | sort -n | wc -l) if [ $EXPIRE -lt 1 ]; then EXPIRE=1 fi if [ -z "$ANZ" ]; then ANZ=0 fi SKIP=0 while [ $ANZ -gt $EXPIRE ] && [ $SKIP -le 10 ]; do # TARGET=/foo/bar/ # TOPURGE=./20111018122112 TOPURGE=$($FIND . -maxdepth 1 -type d -name '[0-9]*' | sort -n | head -n1) if [ -d "$TOPURGE" ]; then CUR=$(pwd) cd "$TOPURGE" || exit -12 FULLTOPURGE=$(pwd -P) cd "$CUR" if [ "$NEWB" != "$FULLTOPURGE" ]; then rm -rf "$FULLTOPURGE" fi fi let ANZ-- let SKIP++ done fi out $retval