| 
									
										
										
										
											2025-01-28 02:33:28 +03:00
										 |  |  | #!/usr/bin/bash
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-28 03:17:32 +03:00
										 |  |  | # XXX need: | 
					
						
							| 
									
										
										
										
											2025-01-28 18:05:34 +03:00
										 |  |  | # 	- protocol (command) to create archive root | 
					
						
							| 
									
										
										
										
											2025-02-01 20:23:52 +03:00
										 |  |  | # 		manually: | 
					
						
							|  |  |  | # 			- copy tree | 
					
						
							|  |  |  | # 			- run snapshot.sh | 
					
						
							|  |  |  | # 		script: | 
					
						
							|  |  |  | # 			XXX | 
					
						
							| 
									
										
										
										
											2025-01-28 18:05:34 +03:00
										 |  |  | # 	- protocol to create snapshots | 
					
						
							|  |  |  | # 		- sync-flash.sh ??? | 
					
						
							| 
									
										
										
										
											2025-01-28 03:17:32 +03:00
										 |  |  | # 	- 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... | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-02-09 00:51:55 +03:00
										 |  |  | usage(){ | 
					
						
							|  |  |  | 	echo "Usage:" | 
					
						
							|  |  |  | 	# XXX | 
					
						
							|  |  |  | 	echo "    $(basename "$0")" | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | printHelp(){ | 
					
						
							|  |  |  | 	usage | 
					
						
							|  |  |  | 	# XXX | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-02-05 23:41:14 +03:00
										 |  |  | # handle args... | 
					
						
							|  |  |  | for arg in "$@" ; do | 
					
						
							|  |  |  | 	case $arg in | 
					
						
							|  |  |  | 		-h|--help) | 
					
						
							| 
									
										
										
										
											2025-02-09 00:51:55 +03:00
										 |  |  | 			printHelp | 
					
						
							| 
									
										
										
										
											2025-02-05 23:41:14 +03:00
										 |  |  | 			exit | 
					
						
							|  |  |  | 			;; | 
					
						
							|  |  |  | 	esac | 
					
						
							|  |  |  | done | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-02-01 20:23:52 +03:00
										 |  |  | SNAPSHOT_DIR=.snapshots | 
					
						
							|  |  |  | SUBVOLUME_DIR=media | 
					
						
							| 
									
										
										
										
											2025-02-02 18:18:27 +03:00
										 |  |  | SNAPSHOT_COUNT=5 | 
					
						
							| 
									
										
										
										
											2025-02-01 20:23:52 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # run in script dir (not cwd)... | 
					
						
							|  |  |  | DIR=`dirname "$0"` | 
					
						
							|  |  |  | if ! [ -z "$DIR" ] ; then | 
					
						
							|  |  |  | 	cd "$DIR" | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-28 03:17:32 +03:00
										 |  |  | # check if on btrfs filesystem... | 
					
						
							|  |  |  | # XXX also check if btrfs command is available... | 
					
						
							| 
									
										
										
										
											2025-02-02 15:03:23 +03:00
										 |  |  | if ! btrfs filesystem usage . > /dev/null 2>&1 ; then | 
					
						
							| 
									
										
										
										
											2025-01-28 03:17:32 +03:00
										 |  |  | 	exit | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-28 21:17:18 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-28 03:17:32 +03:00
										 |  |  | # create ./media... | 
					
						
							| 
									
										
										
										
											2025-01-28 21:22:57 +03:00
										 |  |  | # XXX check if not a directory... | 
					
						
							| 
									
										
										
										
											2025-02-01 20:23:52 +03:00
										 |  |  | if ! [ -e "$SUBVOLUME_DIR" ] ; then | 
					
						
							|  |  |  | 	btrfs subvolume create "$SUBVOLUME_DIR" | 
					
						
							| 
									
										
										
										
											2025-01-28 02:33:28 +03:00
										 |  |  | 	# XXX build tree -- ImageGrid | 
					
						
							| 
									
										
										
										
											2025-01-28 03:17:32 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | # convert ./media to a subvolume... | 
					
						
							| 
									
										
										
										
											2025-02-02 15:03:23 +03:00
										 |  |  | elif ! [ "$(stat --format=%i "$SUBVOLUME_DIR")" == 256 ] ; then | 
					
						
							| 
									
										
										
										
											2025-01-31 22:22:39 +03:00
										 |  |  | 	mkdir bak | 
					
						
							| 
									
										
										
										
											2025-02-01 20:23:52 +03:00
										 |  |  | 	mv "$SUBVOLUME_DIR" bak/ | 
					
						
							|  |  |  | 	btrfs subvolume create "$SUBVOLUME_DIR" | 
					
						
							| 
									
										
										
										
											2025-01-28 03:17:32 +03:00
										 |  |  | 	cp --archive --one-file-system --reflink=always \
 | 
					
						
							| 
									
										
										
										
											2025-02-01 20:23:52 +03:00
										 |  |  | 		./bak/"$SUBVOLUME_DIR"/{,.}* \
 | 
					
						
							|  |  |  | 		"$SUBVOLUME_DIR"/ | 
					
						
							| 
									
										
										
										
											2025-01-28 02:33:28 +03:00
										 |  |  | fi | 
					
						
							| 
									
										
										
										
											2025-02-01 20:23:52 +03:00
										 |  |  | mkdir -p "$SNAPSHOT_DIR" | 
					
						
							| 
									
										
										
										
											2025-01-28 02:33:28 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-28 03:17:32 +03:00
										 |  |  | # XXX should this be more human readable??? | 
					
						
							|  |  |  | # 	...a date + number maybe??? | 
					
						
							| 
									
										
										
										
											2025-01-28 02:33:28 +03:00
										 |  |  | SNAPSHOT=$((  | 
					
						
							| 
									
										
										
										
											2025-02-02 18:18:27 +03:00
										 |  |  | 	$( ls "$SNAPSHOT_DIR/" \
 | 
					
						
							| 
									
										
										
										
											2025-01-28 02:33:28 +03:00
										 |  |  | 		| sort -n \
 | 
					
						
							|  |  |  | 		| tail -n 1 ) \
 | 
					
						
							|  |  |  | 	+ 1 )) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-02-02 18:18:27 +03:00
										 |  |  | #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 | 
					
						
							| 
									
										
										
										
											2025-02-01 20:23:52 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-28 02:33:28 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-02-01 20:23:52 +03:00
										 |  |  | # vim:set nowrap nospell : |