#!/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 principal/backupz/%name% # #sørg for at principal 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 ($Id: backup.sh,v 1.16 2025/05/24 17:22:00 root Exp root $)' 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 principal/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 principal/backupz #while [ $(/bin/df /backupz/ | /usr/bin/awk '/^backupz/{print $4}' ) -lt 100000000 ] ; do while [ $( zfs get -Hp available principal/backupz | cut -f3 ) -lt 50000000000 ] ; 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 ^principal/backupz | awk '{print $1}'); do zfs destroy "$d@$oldest" done zfs get available principal/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 --one-file-system --compress --delete --numeric-ids --stats --inplace --relative --exclude=/.zfs/" logdir="/backupz/log" # Gjør selve overføringen. # Start på en liste over PID vi skal vente på. venteproc="" # Ikke kjoer med --checkum. Den er nyttig senere for aa detektere bitraate. # # 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 # ameno command="${rsync} ${rsync_flags} \ --log-file=${logdir}/ameno.log.$snapshot \ --exclude=/var/cache/ \ --exclude=/var/lib/snapd/ \ --exclude=/var/log/journal/ \ ameno:/ \ ameno:/boot/firmware \ /backupz/ameno/current/" $command >${logdir}/ameno.out.$snapshot 2>&1 & venteproc="$venteproc $!" echo "Startet $!: $command" # # 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" # # jokum (synapse) # command="${rsync} ${rsync_flags}\ # jokum:/data/synapse/ /backupz/jokum/synapse/" # $command >${logdir}/jokum.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 døde, tom tok over men har ikke squirrelmail (4.feb 2019) # 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 # Maa ha --one-file-system, ellers henger rsync pga. gvfs. command="${rsync} ${rsync_flags} \ --log-file=${logdir}/homepvv.log.$snapshot \ --exclude-from=/backupz/homepvv.exclude \ homepvv:/ \ homepvv:/boot \ homepvv:/export/home/pvv \ homepvv:/var \ /backupz/homepvv/" $command >${logdir}/homepvv.out.$snapshot 2>&1 & venteproc="$venteproc $!" echo "Startet $!: $command" # innovation # Minecraft-verden kopieres fra /var/backups/minecraft/current/ istf. # /srv/minecraft-pvv/. command="${rsync} ${rsync_flags} \ --log-file=${logdir}/innovation.log.$snapshot \ --exclude=/srv/minecraft-pvv/ \ --exclude=/var/cache/ \ --exclude=/var/db/freebsd-update/files/ \ innovation:/ \ innovation:/boot/efi \ /backupz/innovation/current/" $command >${logdir}/innovation.out.$snapshot 2>&1 & venteproc="$venteproc $!" echo "Startet $!: $command" # # lommel # command="${rsync} ${rsync_flags} --exclude-from=/backupz/lommel.exclude \ # lommel:/ /backupz/lommel/" # $command >${logdir}/lommel.out.$snapshot 2>&1 & # venteproc="$venteproc $!" # echo "Startet $!: $command" # sleipner command="${rsync} ${rsync_flags} \ --log-file=${logdir}/sleipner.log.$snapshot \ --exclude=/scratch/ \ --exclude=/var/cache/ \ sleipner:/ \ /backupz/sleipner/current/" $command >${logdir}/sleipner.out.$snapshot 2>&1 & venteproc="$venteproc $!" echo "Startet $!: $command" # # Spikkjeposche # command="${rsync} ${rsync_flags} \ # spikkjeposche:/usr/local/www \ # spikkjeposche:/usr/local/etc/lighttpd \ # spikkjeposche:/etc/ssl/private \ # /backupz/spikkjeposche/" # $command >${logdir}/spikkjeposche.out.$snapshot 2>&1 & # venteproc="$venteproc $!" # echo "Startet $!: $command" # tom command="${rsync} ${rsync_flags} \ --log-file=${logdir}/tom.log.$snapshot \ --exclude=/var/cache/ \ tom:/ \ tom:/boot/efi \ /backupz/tom/current/" $command >${logdir}/tom.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." # Behoeves ikke da principal ikke har almen brukerinnlogging. # # 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 principal/backupz@${snapshot} && \ echo "ZFS-snapshot ferdig." || echo "ZFS-snapshot FEILET!" echo echo Ledig plass: $(zfs list -H -o avail principal/backupz) echo # TODO: Slett enkelte gamle snapshots? echo "Backup ferdig: $(date)" rm $lockfile zpool status -xv principal