+function do_rotate() {
+ backuproot=$destdir
+ now=`date %s`
+ seconds_daily=86400
+ seconds_weekly=604800
+ seconds_monthly=2628000
+
+ ssh -o PasswordAuthentication=no $desthost -l $destuser <<EOF
+ keepdaily=$keepdaily
+ keepweekly=$keepweekly
+ keepmonthly=$keepmonthly
+
+ for rottype in daily weekly monthly; do
+ seconds=\`echo seconds_\${rottype}\`
+
+ dir="$backuproot/\$rottype"
+ if [ ! -d \$dir.1 ]; then
+ echo "Warning: \$dir.1 does not exist. This backup is missing, so we are skipping the rotation."
+ continue
+ elif [ ! -f \$dir.1/created ]; then
+ echo "Warning: \$dir.1/created does not exist. This backup may be only partially completed, so we are skipping the rotation."
+ continue
+ fi
+
+ # Rotate the current list of backups, if we can.
+ oldest=\`ls -d $\dir.* | sed 's/^.*\.//' | sort -n | tail -1\`
+ for (( i=\$oldest; i > 0; i-- )); do
+ if [ -d \$dir.\$i ]; then
+ if [ -f \$dir.\$i/rotated ]; then
+ rotated=\`tail -1 \$dir.\$i/rotated\`
+ else
+ rotated=0
+ fi
+ cutoff_time=\$(( now - (seconds*i) ))
+ if [ \$rotated -gt \$cutoff_time ]; then
+ next=\$(( i + 1 ))
+ echo "mv \$dir.\$i \$dir.\$next"
+ mv \$dir.\$i \$dir.\$next
+ date +%c%n%s > \$dir.\$next/rotated
+ else
+ echo "Info: skipping rotation of \$dir.\$i because it was already rotated within the last " \$((cutoff_time/86400)) " days."
+ fi
+ fi
+ done
+ done
+
+ max=\$((keepdaily+1))
+ if [ ( \$keepweekly -a -d $backuproot/daily.\$max ) -a ! -d $backuproot/weekly.1 ]; then
+ echo mv $backuproot/daily.\$max $backuproot/weekly.1
+ mv $backuproot/daily.\$max $backuproot/weekly.1
+ date +%c%n%s > $backuproot/weekly.1/rotated
+ fi
+
+ max=\$((keepweekly+1))
+ if [ ( \$keepmonthly -a -d $backuproot/weekly.\$max ) -a ! -d $backuproot/monthly.1 ]; then
+ echo mv $backuproot/weekly.\$max $backuproot/monthly.1
+ mv $backuproot/weekly.\$max $backuproot/monthly.1
+ date +%c%n%s > $backuproot/monthly.1/rotated
+ fi
+
+ for rottype in daily weekly monthly; do
+ max=\`echo keep\${rottype}\`
+ max=\$((max+1))
+ dir="$backuproot/\$rottype"
+ oldest=\`ls -d $\dir.* | sed 's/^.*\.//' | sort -n | tail -1\`
+
+ # if we've rotated the last backup off the stack, remove it.
+ for (( i=\$oldest; i >= \$max; i-- )); do
+ if [ -d \$dir.\$i ]; then
+ echo "Info: removing \$dir.\$i"
+ rm -rf \$dir.\$i
+ fi
+ done
+ done
+EOF
+}
+
+