Files
principal-backup-script/backup.sh
root 793dc61e87 Komm. ut endel avgaatte maskiner.
La til endel nye.
La "--one-file-system --compress" til paa rsync-arg-listen.
2025-05-26 01:34:48 +00:00

270 lines
7.6 KiB
Bash
Executable File

#!/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