#!/usr/local/bin/bash # # Hjemmesnekret script som tar backup av PVV-servere. # # orjane - 2008.11.10 # # Oppdatert av pederbs og yorinad 2017.02.04 # #for å legge til en backup jobb: # zfs create alphys-zdata/backupz/%name% # #sørg for at alphys kan logge inn som brukerene på boksen uten passord: # #ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCsCm6f5JOlKDbZMiQ6rXvU35QU4Gs/WKKlZymXtFxPhK5jBoZskQjNhfsr+peuhnZ1y+04L9qEBkN3jN0ThROaRaKSFVWfnMnij7pEB0bmJRxDmkQsHL7YsAm6tPn8116tt9m9ASPYE5RpnaDGtxTP7uXa42URvwXdvWY618tdX4z39JG9f85KYexhwRbhaBMLnSPH6JKCKu1tTBwr7oEbuhLFrFXQwqWRip/oN/6/eSxnIrwaey1GM+CdNfeGh/0OeQJ4XIUas2WbgiQRw6Dkxo32FeFS5LVaOYWRys6W3Znw9a9yOYImjJ8WUmiwSeN2bksUizNBNA1HBhoKGM5b root@alphys # echo "PVV; hjemmelaget backupscript (2017.03.16 \$Revision: 1.1 $)" echo echo $(date) # Blir brukt som navn på ZFS-snapshot og logger. snapshot=`date +%Y%m%d` if [ "x$1" = "xfull" ]; then # Fullbackupen starter før midnat, legg på en dag snapshot=`date -v +1d +%Y%m%d` fi lockfile="/backupz/backup.sh.lock" if [ -e $lockfile ]; then pid=$(cat $lockfile) # TODO: Bruk bedre metode for å finne prosess. if ps -p $pid ; then echo "Backup kjører allerede:" `cat $lockfile` exit -1 fi echo "Forrige backup ble avbrutt, rydder opp..." rm $lockfile zfs snapshot -r alphys-zdata/backupz@avbrutt_${snapshot} && \ echo "ZFS-snapshot OK." || echo "ZFS-snapshot FEILET!" # TODO: zfs rollback til forrige komplette backup. echo "Ferdig med oppryddingen." fi # Fang SIGINT, vi vil rydde opp om vi blir avbrutt. trap "rm $lockfile; echo 'Avbrutt, sletter låsfil...'; exit -2" SIGINT echo $$ > $lockfile echo "Sjekker at det er nok ledig plass på disken..." zfs get available alphys-zdata/backupz #while [ $(/bin/df /backupz/ | /usr/bin/awk '/^backupz/{print $4}' ) -lt 100000000 ] ; do while [ $( zfs get -Hp available alphys-zdata/backupz | cut -f3 ) -lt 4000000000 ] ; do echo; echo "Disken er nesten full, rydder"; echo min_backups=5 if [ $(zfs list -t snapshot | grep backupz@ | wc -l) -lt $min_backups ]; then echo; echo "Mindre enn $min_backups backups lagret, feiger ut fra sletting"; echo break; fi oldest=$(zfs list -t snapshot | grep backupz@ | head -n1 | tr @ ' ' | awk '{print $2}') echo "Kjører zfs destroy på alle disker @$oldest" for d in $(zfs list | grep ^alphys-zdata/backupz | awk '{print $1}'); do zfs destroy "$d@$oldest" done zfs get available alphys-zdata/backupz echo done echo "Starter backup..." #export RSYNC_RSH="ssh -c arcfour -v" export RSYNC_RSH="ssh -v" rsync="/usr/local/bin/rsync" rsync_flags="--archive --hard-links --delete --numeric-ids --stats --inplace --relative" logdir="/backupz/log" exclude_file="/backupz/homepvv.exclude" # Gjør selve overføringen. # Start på en liste over PID vi skal vente på. venteproc="" # Gjør "full"-backup på søndager. if [ "x$1" = "xfull" ]; then # Det er søndag echo "Det er søndag; tar «full»-backup." rsync_flags="${rsync_flags} --checksum" fi echo "Snapshot ID: $snapshot" echo echo # knakelibrak (wiki) command="${rsync} ${rsync_flags}\ wiki:/var/lib/mediawiki /backupz/wiki/" $command >${logdir}/wiki.out.$snapshot 2>&1 & venteproc="$venteproc $!" echo "Startet $!: $command" # knakelibrak (databases) command="${rsync} ${rsync_flags}\ knakelibrak:/var/backups/databases /backupz/databases/" $command >${logdir}/knakelibrak.out.$snapshot 2>&1 & venteproc="$venteproc $!" echo "Startet $!: $command" # skrotnisse command="${rsync} ${rsync_flags}\ skrotnisse:/var/www/ skrotnisse:/srv/ /backupz/skrotnisse/" $command >${logdir}/skrotnisse.out.$snapshot 2>&1 & venteproc="$venteproc $!" echo "Startet $!: $command" # dash8 command="${rsync} ${rsync_flags}\ dash8:/var/lib/bitlbee/ /backupz/dash8/" $command >${logdir}/dash8.out.$snapshot 2>&1 & venteproc="$venteproc $!" echo "Startet $!: $command" # tim (web) command="${rsync} ${rsync_flags}\ tim:/var/lib/squirrelmail /backupz/web/" $command >${logdir}/tim.out.$snapshot 2>&1 & venteproc="$venteproc $!" echo "Startet $!: $command" # homepvv command="${rsync} ${rsync_flags} --exclude-from=${exclude_file} \ --log-file=${logdir}/homepvv.log.$snapshot \ homepvv:/ /backupz/homepvv/ " $command >${logdir}/homepvv.out.$snapshot 2>&1 & venteproc="$venteproc $!" echo "Startet $!: $command" ## Andre ting som skal kopieres her... echo echo "Rsync er i gang." # Vent til rsync er ferdig. echo "Venter til rsync er ferdig: $venteproc" for i in $venteproc ; do wait $i feilkode=$? if [ $feilkode -eq 0 ]; then echo "$i: OK" else echo "$i: Rsync returnerte feil (${feilkode})." fi done echo echo "Rsync er ferdig." # Gjør hjemmemappene lesbare bare for brukeren. find /backupz/homepvv/export/home/pvv -maxdepth 2 -mindepth 2 -exec chmod 700 {} \; # Touch home slik at timestamp på snapshot blir når backup var ferdig. touch /backupz/homepvv/export/home # Ta et zfs snapshot echo "Tar ZFS-snapshot..." zfs snapshot -r alphys-zdata/backupz@${snapshot} && \ echo "ZFS-snapshot ferdig." || echo "ZFS-snapshot FEILET!" echo echo Ledig plass: $(zfs list -H -o avail alphys-zdata/backupz) echo # TODO: Slett enkelte gamle snapshots? echo "Backup ferdig: $(date)" rm $lockfile