ImageGrid/Archive/snapshot.sh
Alex A. Naanou 586e8758b4 dates...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
2025-02-09 00:51:55 +03:00

109 lines
2.3 KiB
Bash
Executable File

#!/usr/bin/bash
# XXX need:
# - protocol (command) to create archive root
# manually:
# - copy tree
# - run snapshot.sh
# script:
# XXX
# - protocol to create snapshots
# - sync-flash.sh ???
# - protocol to restore stuff -- simply copy???
# - protocol to fully delete something -- i.e. delete snapshots???
# - a way to list deleted files
# - a way to list available file versions
# - a way to restore specicifc file(s)
# - a way to maintain a set number of snapshots...
#
usage(){
echo "Usage:"
# XXX
echo " $(basename "$0")"
}
printHelp(){
usage
# XXX
}
# handle args...
for arg in "$@" ; do
case $arg in
-h|--help)
printHelp
exit
;;
esac
done
SNAPSHOT_DIR=.snapshots
SUBVOLUME_DIR=media
SNAPSHOT_COUNT=5
# run in script dir (not cwd)...
DIR=`dirname "$0"`
if ! [ -z "$DIR" ] ; then
cd "$DIR"
fi
# check if on btrfs filesystem...
# XXX also check if btrfs command is available...
if ! btrfs filesystem usage . > /dev/null 2>&1 ; then
exit
fi
# create ./media...
# XXX check if not a directory...
if ! [ -e "$SUBVOLUME_DIR" ] ; then
btrfs subvolume create "$SUBVOLUME_DIR"
# XXX build tree -- ImageGrid
# convert ./media to a subvolume...
elif ! [ "$(stat --format=%i "$SUBVOLUME_DIR")" == 256 ] ; then
mkdir bak
mv "$SUBVOLUME_DIR" bak/
btrfs subvolume create "$SUBVOLUME_DIR"
cp --archive --one-file-system --reflink=always \
./bak/"$SUBVOLUME_DIR"/{,.}* \
"$SUBVOLUME_DIR"/
fi
mkdir -p "$SNAPSHOT_DIR"
# XXX should this be more human readable???
# ...a date + number maybe???
SNAPSHOT=$((
$( ls "$SNAPSHOT_DIR/" \
| sort -n \
| tail -n 1 ) \
+ 1 ))
#btrfs subvolume snapshot -r "$SUBVOLUME_DIR" "${SNAPSHOT_DIR}/${SNAPSHOT}"
btrfs subvolume snapshot "$SUBVOLUME_DIR" "${SNAPSHOT_DIR}/${SNAPSHOT}"
if [[ $SNAPSHOT_COUNT =~ [0-9]* ]] \
&& [ "$SNAPSHOT_COUNT" != 0 ] ; then
SNAPSHOTS=($(\
ls "$SNAPSHOT_DIR/" \
| sort -n ))
remove=$(( ${#SNAPSHOTS[@]} - $SNAPSHOT_COUNT - 1 ))
while (( $remove >= 0 )) ; do
# XXX can we avoid sudo here???
# XXX is 'btrfs subvolume delete ...' the same as 'rm -rf ..'
#sudo btrfs subvolume delete -c ${SNAPSHOT_DIR}/${SNAPSHOTS[$remove]}
echo Removing snapshot: ${SNAPSHOT_DIR}/${SNAPSHOTS[$remove]}
rm -rf ${SNAPSHOT_DIR}/${SNAPSHOTS[$remove]}
remove=$(( $remove - 1 ))
done
fi
# vim:set nowrap nospell :