various changes around data volumes
[distro-setup] / check-subvol-stale
1 #!/bin/bash
2
3 [[ $EUID == 0 ]] || exec sudo -E "$BASH_SOURCE" "$@"
4
5 set -eE -o pipefail
6 trap 'echo "$0:$LINENO:error: \"$BASH_COMMAND\" returned $?" >&2' ERR
7
8 shopt -s nullglob
9
10 if [[ ! $@ ]]; then
11 echo "$0: error: expected mountpoint argument"
12 fi
13
14 ret=0
15 for d; do
16 vol=${d##*/}
17 cd /mnt/root/btrbk
18 snaps=($vol.20*)
19 if [[ ! $snaps ]]; then
20 # no snapshots yet
21 continue
22 fi
23 # when a btrbk bugfix makes it into the distro,
24 # we might replace this with btrbk list latest /mnt/root/$vol | ...
25 # note: this is duplicated in mount-latest-subvol
26 last_snap=$(
27 for f in ${snaps[@]}; do
28 printf "%s %s\n" $(date -d $(sed -r 's/(.{4})(..)(.{5})(..)(.*)/\1-\2-\3:\4:\5/' <<<${f#$vol.}) +%s) $f
29 done | sort -r | head -n 1 | awk '{print $2}'
30 )
31 if [[ ! $last_snap ]]; then
32 echo "$d stale"
33 ret=1
34 continue
35 fi
36 stale=true
37 if btrfs sub show $d|sed '0,/^\t*Snapshot(s):/d;s/^\s*//' | \
38 grep -xF btrbk/$last_snap &>/dev/null; then
39 stale=false
40 else
41 last_uuid=$(btrfs sub show $last_snap| awk '$1 == "UUID:" {print $2}')
42 if btrfs sub show $d| grep "^\s*Parent UUID:\s*$last_uuid$" &>/dev/null; then
43 stale=false
44 fi
45 fi
46 stale_dir=/nocow/btrfs-stale
47 stale_file=$stale_dir/$vol
48 if $stale; then
49 mkdir -p $stale_dir
50 printf "%s\n" $last_snap > $stale_file
51 echo "$d stale"
52 ret=1
53 continue
54 else
55 rm -f $stale_file
56 fi
57 done
58 exit $ret
59