Merge pull request #6 from 0ranki/dev

Dev
This commit is contained in:
Jarno Rankinen 2020-08-02 21:40:26 +03:00 committed by GitHub
commit 85fc7cd4e6
1 changed files with 49 additions and 10 deletions

59
snapsh
View File

@ -25,6 +25,7 @@ BTRFS_EXECUTABLE=$(which btrfs)
TIMESTAMP=$(date +%Y.%m.%d-%H:%M:%S) TIMESTAMP=$(date +%Y.%m.%d-%H:%M:%S)
SUBVOLUME="root" SUBVOLUME="root"
DESCRIPTION="" DESCRIPTION=""
REMOVE_TARGET=""
@ -38,10 +39,9 @@ Options:
snapshots listing. Must be used before -s, e.g. snapshots listing. Must be used before -s, e.g.
snapsh -d \"A snapshot\" -s root snapsh -d \"A snapshot\" -s root
-s SUBVOL, --snapshot SUBVOL Take a snapshot of subvolume named SUBVOL. -s SUBVOL, --snapshot SUBVOL Take a snapshot of subvolume named SUBVOL.
-l, --list List snapshots
Exit codes: -r NUMBER, --remove NUMBER Remove snapshot NUMBER. See snapshot numbers with
2 - Invalid options snapsh -l\n"
3 - Target subvolume does not exist\n"
} }
@ -60,7 +60,7 @@ snapshot() {
${BTRFS_EXECUTABLE} subvolume create ${SNAPSHOTS_LOCATION} ${BTRFS_EXECUTABLE} subvolume create ${SNAPSHOTS_LOCATION}
unset ${REPLY} unset ${REPLY}
else else
EXIT_CODE=3 EXIT_CODE=1
fi fi
else else
printf "Creating snapshot of subvolume ${SUBVOLUME} as ${SUBVOLUME}_snapshot_${TIMESTAMP}\n" printf "Creating snapshot of subvolume ${SUBVOLUME} as ${SUBVOLUME}_snapshot_${TIMESTAMP}\n"
@ -94,7 +94,7 @@ snapshot() {
list() { list() {
root_check root_check
NUM=0 NUM=1
printf "%6s %s %s %26s %s %s %6s %s %s\n" "Number" "|" "Time:" "|" "Source" "|" "Type" "|" "Description" printf "%6s %s %s %26s %s %s %6s %s %s\n" "Number" "|" "Time:" "|" "Source" "|" "Type" "|" "Description"
for snapshot in ${SNAPSHOTS_LOCATION}/*/; do for snapshot in ${SNAPSHOTS_LOCATION}/*/; do
. ${snapshot}/.snapsh . ${snapshot}/.snapsh
@ -106,11 +106,43 @@ list() {
remove() {
root_check
SNAPSHOTS=(${SNAPSHOTS_LOCATION}/*/)
let INDEX=${REMOVE_TARGET}-1
TARGET=${SNAPSHOTS[${INDEX}]}
. ${TARGET}/.snapsh
if [[ "${INDEX}" -gt "${#SNAPSHOTS[@]}" ]]; then
printf "Snapshot number ${REMOVE_TARGET} does not exist.\n"
list
exit 1
elif [[ "${REMOVE_TARGET}" -lt 1 ]]; then
printf "Number must be a positive integer.\n"
list
exit 1
fi
printf "Delete snapshot ${REMOVE_TARGET}: ${DATE}, subvolume ${SOURCE_SUBVOLUME}, ${DESCRIPTION} (y/n)? "
read -n 1
if [[ "${REPLY}" == "y" ]]; then
printf "\n"
${BTRFS_EXECUTABLE} property set ${TARGET} ro false
${BTRFS_EXECUTABLE} subvolume delete ${TARGET}
exit 0
else
printf "\nAborted by user.\n"
exit 1
fi
}
# Check for root permissions # Check for root permissions
root_check() { root_check() {
if [[ "$UID" -ne 0 ]]; then if [[ "$UID" -ne 0 ]]; then
printf "This option needs root permission.\n" printf "This option needs root permission.\n"
exit 3 exit 1
fi fi
} }
@ -119,18 +151,18 @@ root_check() {
# If no options are given, display help # If no options are given, display help
if [[ "$#" -eq 0 ]]; then if [[ "$#" -eq 0 ]]; then
help help
exit 2 exit 0
fi fi
# Options parsing: # Options parsing:
OPTIONS=$(getopt -a -n snapsh -o hs:d:l --long help,snapshot:,description:,list -- "$@") OPTIONS=$(getopt -a -n snapsh -o hs:d:lr: --long help,snapshot:,description:,list,remove: -- "$@")
# Invalid options (getopt returns nonzero) # Invalid options (getopt returns nonzero)
if [[ "$?" -ne 0 ]]; then if [[ "$?" -ne 0 ]]; then
printf "Error Parsing options\n" printf "Error Parsing options\n"
help help
exit 2 exit 1
fi fi
eval set -- "$OPTIONS" eval set -- "$OPTIONS"
@ -159,6 +191,13 @@ while true; do
shift shift
;; ;;
-r | --remove)
REMOVE_TARGET="$2"
remove
shift 2
;;
esac esac
done done