From 0deeb585014a684b6e5c5b3a05788a081534a900 Mon Sep 17 00:00:00 2001 From: Ralph Ronnquist Date: Fri, 5 Nov 2021 14:51:33 +1100 Subject: [PATCH] added snapshot comparison browse tool --- ssbrowse.sh | 90 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100755 ssbrowse.sh diff --git a/ssbrowse.sh b/ssbrowse.sh new file mode 100755 index 0000000..82a7b37 --- /dev/null +++ b/ssbrowse.sh @@ -0,0 +1,90 @@ +#!/bin/bash +# +# Browse snapshots of a given path and run meld to compare with +# current directory +# $1: path -- into mounted nilfs +# $2: [path] -- to compare with + +## Prepare for mounting of snapshots +MOUNT=/tmp/ssmeld-$$ +mkdir -p $MOUNT || exit 1 + +function exitbrowse() { + umount $MOUNT 2>/dev/null + rmdir -f $MOUNT + trap "" 0 +} +trap "exitbrowse" 0 2 9 15 + +DF=( $(df $1 | awk '{d=$1;p=$NF;} END {printf "%s %s", d, p;}') ) + +NILFSROOT=${DF[1]} +NILFSDEV=${DF[0]} +PTR="${1#$NILFSROOT}" +DIR0=$MOUNT$PTR +DIR1=$NILFSROOT + +function snap2iselect() { + lscp -r -s $NILFSDEV | while read CNO DATE TIME REST ; do + [ $CNO = CNO ] && continue + echo " [$CNO] ${DATE} ${TIME}" + done +} + +function dirof() { + x="${1%%|*}" + x="${x%%(*}" + echo "${x}" | sed 's/\(\S\+\s\+\)\{8\}//;s/\s*$//' +} + +function dirsdiff() { + while true ; do + LEFT="$(cd $DIR0/${1#/} && ls -l)" + RIGHT="$(cd $DIR1/${1#/} && ls -l)" + SEL="$(diff -W 500 -y --left-column <(echo "$LEFT") <(echo "$RIGHT")| \ + column -t | \ + iselect -n "($CNO ~ $DIR1)" -K -kd -kx -kz -a -t "${1-/}" )" + KEY="${SEL%%:*}" + SEL="${SEL#*:}" + [ -z "$SEL" ] && break + case "$KEY" in + RETURN|KEY_RIGHT) + ZEL="$(echo "${SEL}" | sed 's/^>\s*//;s/\s*$//')" + if [ -z "${ZEL##d*}" ] ; then + D="$(dirof "$ZEL")" + dirsdiff "$1/$D" || return 1 + else + D="$(dirof "$ZEL")" + diff -D "$CNO" -N $DIR0/${1#/}/$D $DIR1/${1#/}/$D |\ + less + + fi + ;; + d) # Find next dept-first difference + : + ;; + x) # Exit + return 1 + ;; + *) + echo "*** ${KEY}:${SEL}" + read x + ;; + esac + done +} + +N=2 +while true ; do + SNAPS="$(snap2iselect)" + CNO="$(iselect -n "($DIR1/)" \ + -t "Snapshots for $NILFSDEV=$NILFSROOT" -p $N -P \ + "Select snapshot" "$SNAPS")" + [ -z "$CNO" ] && break + N=${CNO%%:*} + CNO=${CNO#*:} + if sudo mount -t nilfs2 -oro,cp=$CNO $NILFSDEV $MOUNT ; then + dirsdiff / + sudo umount $MOUNT + fi +done -- 2.39.2