#!/bin/bash

# Dit script maakt dagelijks een backup van de windows directories
# /Cdos /Spel-W98 naar /WindowsBackup. Door gebruik te maken van rsync,
# is van elke dag waarvan de backup beschikbaar is een volledige
# directory boom van die dag beschikbaar.

# /WindowsBackup is normaal niet gemount. Voor het uitvoeren van de 
# backup wordt deze partitie tijdelijk gemount.

# Elke dag wordt een dagcopie gemaakt middels rsync.
# rsync -a -v --delete --link-dest=OUDE_BACKUP /DIR/  NIEUWE_BACKUP/
# Ik gebruik hiervoor /root/work/rsync-2.6.3/rsync 
# omdat deze versie van rsync de optie --link-dest begrijpt.

# De copie van de voorgaande week wordt verwijderd.

# Eens per week is de dagbackup tevens de weekbackup.
# Die wordt na 4 weken verwijderd

# Eens per 4 weken is de backup tevens maandbackup
# Die wordt na 1 jaar verwijderd

date

RSYNC=/root/work/rsync-2.6.3/rsync
RSYNC="/usr/bin/rsync --modify-window=3601 "

# Bij de overgang van/naar DST worden alle files plotseling een uur
# nieuwer of ouder. Dit ontstaat door de code 
#    secs += sys_tz.tz_minuteswest*60;
# in de functie date_dos2unix van /usr/src/linux/fs/fat/misc.c
# Deze code is nodig omdat het FAT-filesysteem de tijd in localtime
# opslaat. Bij het terugrekenen naar unixtime, zou je rekening moeten
# houden met de tijdzone van het moment waarop de file aangemaakt was.
# Voor een deel kan dat niet (er zijn namelijk 2 tijden 2:30) en voor
# een deel is dat te moeijlijk (Olson bibliotheek wil je niet in de
# kernel gebruiken). Daarom heel lomp die regel vervangen door 
# secs -= 3600; en de bijpassende regel in fat_date_unix2dos
# vervangen door  unix_date += 3600;
# Nu gaat de tijd in ieder geval niet meer bij elke overgang zwabberen.
# (Maar is de tijd helaas inconsistent tussen Linux en Windows.)

# date --help zegt
# %w   day of week (0..6);  0 represents Sunday
# %V   week number of year with Monday as first day of week (01..53)
DATUM=`date +'%w %V'` 

WEEKDAG=`echo $DATUM|cut -f 1 -d ' '`
GISTEREN=$[ ($WEEKDAG+6) % 7 ]
WEEKNUMMER=`echo $DATUM|cut -f 2 -d ' '`
# WEEKNUMMER, zoals date die geeft, bestaat altijd uit 2 cijfers
# de voorloop-nul, zoals in 08, zorgt dat WEEKNUMMER octaal
# geinterpreteerd wordt en dan moppert die dat dat niet kan :(
WEEKNUMMER=$[10#$WEEKNUMMER]
VORIGEMAAND=$[ (53+$WEEKNUMMER-4) % 53 ]

if [ -z $1 ] 
then BRONDIR=Cdos
else BRONDIR=$1
fi

BACKUPDIR=/WindowsBackup/$BRONDIR/daily/$WEEKDAG
LINKDIR=/WindowsBackup/$BRONDIR/daily/$GISTEREN
WEEKBACKUP=/WindowsBackup/$BRONDIR/weekly/$WEEKNUMMER
VORIGEMAAND=/WindowsBackup/$BRONDIR/weekly/$VORIGEMAAND
MAANDBACKUP=/WindowsBackup/$BRONDIR/monthly/$WEEKNUMMER

lockfile /var/lock/WindowsBackup
mount /WindowsBackup

mkdir -p /WindowsBackup/$BRONDIR/daily/
mkdir -p /WindowsBackup/$BRONDIR/weekly/
mkdir -p /WindowsBackup/$BRONDIR/monthly/

if [ -z `find $BACKUPDIR -maxdepth 0 -ctime -1 ` ]
then # eerste aanroep van vandaag, de oude informatie wissen
     rm -rf $BACKUPDIR 
     $RSYNC -v -a --delete --link-dest=$LINKDIR /$BRONDIR/ $BACKUPDIR/ \
            > $BACKUPDIR.list
else # reeds eerder een aaroep geweest vadaag, voeg de nieuwe informatie toe
     $RSYNC -v -a --delete --link-dest=$LINKDIR /$BRONDIR/ $BACKUPDIR/ >> $BACKUPDIR.list
fi
touch $BACKUPDIR

if [ $WEEKDAG -eq 5 ]
then 
     rm -rf $VORIGEMAAND
     rm -rf $VORIGEMAAND.list
     cp -al $BACKUPDIR $WEEKBACKUP 
     cp -af $BACKUPDIR.list $WEEKBACKUP.list 

     if [ $[ $WEEKNUMMER % 4 ] -eq 0 ]  
     then rm -rf $MAANDBACKUP 
          rm -rf $MAANDBACKUP.list
          cp -al $BACKUPDIR $MAANDBACKUP
          cp -af $BACKUPDIR.list $MAANDBACKUP.list
     fi
fi

df /WindowsBackup | grep WindowsBackup
umount /WindowsBackup
rm -f /var/lock/WindowsBackup
date
