From 88b686698498cef7317f3d2e80d31318ca3dd63b Mon Sep 17 00:00:00 2001 From: root Date: Sat, 4 Feb 2017 21:05:30 +0000 Subject: [PATCH] Tar backup av PVVs maskiner --- .gitignore | 28 +++++++++ backup.sh | 180 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 208 insertions(+) create mode 100644 .gitignore create mode 100755 backup.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..da8168b --- /dev/null +++ b/.gitignore @@ -0,0 +1,28 @@ +# CVS default ignores begin +tags +TAGS +.make.state +.nse_depinfo +*~ +\#* +.#* +,* +_$* +*$ +*.old +*.bak +*.BAK +*.orig +*.rej +.del-* +*.a +*.olb +*.o +*.obj +*.so +*.exe +*.Z +*.elc +*.ln +core +# CVS default ignores end diff --git a/backup.sh b/backup.sh new file mode 100755 index 0000000..8713f15 --- /dev/null +++ b/backup.sh @@ -0,0 +1,180 @@ +#!/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.40 $)" +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 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..." +/bin/df -h /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 ^backupz | awk '{print $1}'); do + zfs destroy "$d@$oldest" + done + /bin/df -h /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 backupz@${snapshot} && \ +echo "ZFS-snapshot ferdig." || echo "ZFS-snapshot FEILET!" +echo +echo Ledig plass: $(zfs list -H -o avail backupz) +echo + +# TODO: Slett enkelte gamle snapshots? + +echo "Backup ferdig: $(date)" +rm $lockfile