backup.sh: bli kvitt litt declare støy

This commit is contained in:
2026-01-28 18:11:27 +09:00
parent 49faba4353
commit 75b2c7395c

View File

@@ -24,7 +24,7 @@ date
# === Sjekk at nødvendige verktøy er installert. ===
declare -ra required_tools=(
required_tools=(
rsync
ssh
zfs
@@ -44,8 +44,8 @@ if [ "$(id -u)" -ne 0 ]; then
fi
# 5.1 er minimum pga. wait '-p' flagget.
declare -r minimum_bash_major_version="5"
declare -r minimum_bash_minor_version="1"
minimum_bash_major_version="5"
minimum_bash_minor_version="1"
if [ \
"${BASH_VERSINFO[0]}" -lt "$minimum_bash_major_version" ] || \
{ [ "${BASH_VERSINFO[0]}" -eq "$minimum_bash_major_version" ] && \
@@ -58,15 +58,15 @@ fi
# === Sjekk for pågående backup eller avbrutt backup, sett låsfil og signalhåndtering. ===
# Blir brukt som navn på ZFS-snapshot og logger.
declare -r snapshot_date="$(date +%Y%m%d)"
snapshot_date="$(date +%Y%m%d)"
if [ "$1" = "full" ]; then # Fullbackupen starter før midnatt, legg på en dag
declare -r snapshot_date=$(date -v +1d +%Y%m%d)
snapshot_date=$(date -v +1d +%Y%m%d)
fi
# Sjekk om en annen backup kjører eller om forrige backup ble avbrutt.
declare -r lockfile="/backupz/backup.sh.lock"
lockfile="/backupz/backup.sh.lock"
if [ -e $lockfile ]; then
declare -r existing_pid="$(cat $lockfile)"
existing_pid="$(cat $lockfile)"
# TODO: Bruk bedre metode for å finne prosess.
if ps -p "$existing_pid"; then
@@ -102,13 +102,13 @@ echo "Sjekker at det er nok ledig plass på disken..."
zfs get available principal/backupz
# Dette tilsvarer 50 GB, juster etter behov.
declare -r min_free_space=50000000000
min_free_space=50000000000
while [ "$(zfs get -Hp available principal/backupz | cut -f3)" -lt "$min_free_space" ] ; do
echo;
echo "Disken er nesten full, rydder";
echo
declare -ri min_backups=5
min_backups=5
if [ "$(zfs list -t snapshot | grep -c "backupz@")" -lt "$min_backups" ]; then
echo;
echo "Mindre enn $min_backups backups lagret, feiger ut fra sletting";
@@ -116,10 +116,10 @@ while [ "$(zfs get -Hp available principal/backupz | cut -f3)" -lt "$min_free_sp
break;
fi
declare -r oldest=$(zfs list -t snapshot | grep backupz@ | head -n1 | tr @ ' ' | awk '{print $2}')
echo "Kjører zfs destroy på alle disker @$oldest"
oldest_snapshot=$(zfs list -t snapshot | grep backupz@ | head -n1 | tr @ ' ' | awk '{print $2}')
echo "Kjører zfs destroy på alle disker @$oldest_snapshot"
for d in $(zfs list | grep ^principal/backupz | awk '{print $1}'); do
zfs destroy "$d@$oldest"
zfs destroy "$d@$oldest_snapshot"
done
zfs get available principal/backupz
@@ -143,11 +143,11 @@ declare -A hosts_output_dir=()
# ameno
hosts+=("ameno")
declare -ra ameno_includes=(
ameno_includes=(
"/"
"/boot/firmware"
)
declare -ra ameno_excludes=(
ameno_excludes=(
"/var/cache/"
"/var/lib/snapd/"
"/var/log/journal/"
@@ -155,13 +155,13 @@ declare -ra ameno_excludes=(
# microbel (hjemmeområder)
hosts+=("homepvv")
declare -ra homepvv_includes=(
homepvv_includes=(
"/"
"/boot"
"/export/home/pvv"
"/var"
)
declare -ra homepvv_excludes=(
homepvv_excludes=(
# Se ./homepvv.exclude - den skal bli plukket opp automatisk
)
@@ -169,11 +169,11 @@ declare -ra homepvv_excludes=(
# Minecraft-verden kopieres fra /var/backups/minecraft/current/ istf.
# /srv/minecraft-pvv/.
hosts+=("innovation")
declare -ra innovation_includes=(
innovation_includes=(
"/"
"/boot/efi"
)
declare -ra innovation_excludes=(
innovation_excludes=(
"/srv/minecraft-pvv/"
"/var/cache/"
"/var/db/freebsd-update/files/"
@@ -181,21 +181,21 @@ declare -ra innovation_excludes=(
# sleipner
hosts+=("sleipner")
declare -ra sleipner_includes=(
sleipner_includes=(
"/"
)
declare -ra sleipner_excludes=(
sleipner_excludes=(
"/scratch/"
"/var/cache/"
)
# tom
hosts+=("tom")
declare -ra tom_includes=(
tom_includes=(
"/"
"/boot/efi"
)
declare -ra tom_excludes=(
tom_excludes=(
"/var/cache/"
)
@@ -203,8 +203,8 @@ declare -ra tom_excludes=(
# === Sjekk at alle backup-kataloger har tilhørende datasett, og at datasettene er montert. ===
for host in "${hosts[@]}"; do
declare katalog="/backupz/${hosts_output_dir[$host]:-$host}"
declare dataset="principal/backupz/${hosts_output_dir[$host]:-$host}"
katalog="/backupz/${hosts_output_dir[$host]:-$host}"
dataset="principal/backupz/${hosts_output_dir[$host]:-$host}"
# Sjekk at ZFS-datasettet finnes
if ! zfs list "$dataset" >/dev/null 2>&1; then
@@ -220,8 +220,8 @@ for host in "${hosts[@]}"; do
fi
# Sjekk at datasettet er montert, og forsøk å mounte om nødvendig
declare mounted_val="$(zfs get -H -o value mounted "$dataset" 2>/dev/null || echo "no")"
if [ "${mounted_val:-no}" != "yes" ]; then
is_mounted="$(zfs get -H -o value mounted "$dataset" 2>/dev/null || echo "no")"
if [ "${is_mounted:-no}" != "yes" ]; then
echo "Datasettet '$dataset' er ikke montert på '$katalog'. Forsøker å mounte..."
if ! zfs mount "$dataset" >/dev/null 2>&1; then
echo "Kunne ikke mounte '$dataset'. Avbryter." >&2
@@ -238,9 +238,9 @@ echo "Starter backup..."
echo "Snapshot ID: $snapshot_date"
echo
declare -ri start_time="$(date +%s)"
declare -r rsync="/usr/local/bin/rsync"
declare -ra rsync_flags=(
start_time="$(date +%s)"
rsync="/usr/local/bin/rsync"
rsync_flags=(
--archive
--hard-links
--compress
@@ -253,20 +253,20 @@ declare -ra rsync_flags=(
--inplace
--exclude=/.zfs/
)
declare -r logdir="/backupz/log"
logdir="/backupz/log"
declare -A venteproc=()
echo "Starter rsync for følgende verter: ${hosts[*]}"
echo
for host in "${hosts[@]}"; do
declare -a command=(
command=(
"$rsync"
"${rsync_flags[@]}"
"--log-file=${logdir}/${host}.log.$snapshot_date"
)
declare exclude_paths_var="${host}_excludes[@]"
declare -a exclude_paths=("${!exclude_paths_var}")
exclude_paths_var="${host}_excludes[@]"
exclude_paths=("${!exclude_paths_var}")
for exclude in "${exclude_paths[@]}"; do
command+=("--exclude=${exclude}")
done
@@ -275,8 +275,8 @@ for host in "${hosts[@]}"; do
command+=("--exclude-from=/backupz/${host}.exclude")
fi
declare include_paths_var="${host}_includes[@]"
declare -a include_paths=("${!include_paths_var}")
include_paths_var="${host}_includes[@]"
include_paths=("${!include_paths_var}")
if [ "${#include_paths[@]}" -eq 0 ]; then
echo "Ingen inkluderingsstier for vert $host, hopper over."
continue
@@ -295,7 +295,7 @@ for host in "${hosts[@]}"; do
echo "${command[0]} \\"
# Ikke print de første rsync-flagga i kommandoen
echo " # ...standard rsync-flagg... \\"
declare -i start_index=$((1 + ${#rsync_flags[@]}))
start_index="$((1 + ${#rsync_flags[@]}))"
for ((i="$start_index"; i<${#command[@]}-1; i++)); do
echo " ${command[i]} \\"
done
@@ -332,8 +332,8 @@ echo "Rsync er ferdig."
# === Oppsummering, ta ZFS-snapshot og avslutt ===
declare -ri end_time="$(date +%s)"
declare -ri elapsed_time="$((end_time - start_time))"
end_time="$(date +%s)"
elapsed_time="$((end_time - start_time))"
printf 'Tid brukt på rsync: %03d:%02d:%02d\n' $((elapsed_time/3600)) $(((elapsed_time/60)%60)) $((elapsed_time%60))
# Touch home slik at timestamp på snapshot blir når backup var ferdig.