From 5b1fe97ce7e51e6414925734a64185803ef65860 Mon Sep 17 00:00:00 2001 From: Giorgio Ravera Date: Wed, 9 Sep 2020 22:17:41 +0200 Subject: [PATCH] Added pve-screenshots --- pve-snapshots | 149 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100755 pve-snapshots diff --git a/pve-snapshots b/pve-snapshots new file mode 100755 index 0000000..e383e5e --- /dev/null +++ b/pve-snapshots @@ -0,0 +1,149 @@ +#!/bin/bash + +NAME="pve-snapshots" +VERSION="0.01" +SNAP_SUB_PREFIX="$(date +%Y-%m-%d_%k-%M-%S)" +SNAP_DESCRIPTION="$NAME" +#OUTPUT="/dev/null" +OUTPUT="log" +#ERROR="/dev/null" +ERROR="log" + +usage () +{ + echo "Usage: $NAME --id=VMID --prefix=PREFIX [--storage=STORAGENAME] [--keep=NUMBER]" + echo + echo "Example: $NAME --id=1 --prefix=daily --storage=ceph --keep=2" + echo " or: $NAME -i 100 -p daily -s ceph -k 1" + echo + echo "Arguments:" + echo " -i, --id=VMID Virtual Machine ID" + echo " -p, --prefix=PREFIX Prefix name to be assign to the snapshots" + echo " -s, --storage=STORAGENAME Specify the storage name for which will be used auto snapshots" + echo " (not specified will enable for all storages)" + echo " -k, --keep=NUMBER Specify the number of snapshots which should will leave, anything longer will be removed" +# echo " -D, --sleep=NUMBER Specify the modifier for sleep that would create a delay after each snapshot operation" +# echo " (calculate as: NUMBER gigabytes per minute, min 1 minute)" +# echo + exit +} + +check_vm () +{ + # Check VM existence + vm_result=$(qm list | awk {'print $1 " " $2'} | sed 1d | grep $id) + vm_id=$(echo $vm_result | awk {'print $1'}) + vm_name=$(echo $vm_result | awk {'print $2'}) + if [ -z $vm_id ]; then + echo "$NAME error: wrong VM ID ($id)" + fi +} + +create_snap_name () +{ + snap_prefix=$vm_name\_$prefix + snap_name=$snap_prefix\_$SNAP_SUB_PREFIX +} + +parse_options () +{ + # Reset options + id= + prefix= + storage= + keep= + + # Check Options + OPT=$(getopt -o i:p:s:k: --long id:,prefix:,storage:,keep: -n "$NAME parse-error" -- "$@")i + if [ $? != 0 ]; then + usage + fi + eval set -- "$OPT" + + # Parse Options + while [ $# -gt 0 ]; do + case $1 in + -i | --id ) + if [ $# -eq 1 ]; then exit; fi + id=$2 + shift; shift + ;; + -p | --prefix ) + if [ $# -eq 1 ]; then exit; fi + prefix=$2 + shift; shift + ;; + -s | --storage ) + if [ $# -eq 1 ]; then exit; fi + storage=$2 + shift; shift + ;; + -k | --keep ) + if [ $# -eq 1 ]; then exit; fi + keep=$2 + shift; shift + ;; + * ) shift ;; + esac + done + + if [ -z $id ] ; then echo -e "\nVM ID is not set\n"; usage; fi + if [ -z $prefix ] ; then echo -e "\nPrefix is not set\n"; usage; fi + + # Check if VM exists + check_vm + + # Create Snapshot Name + create_snap_name + + # Check Keep [digit only up to 99] + keep=$(echo $keep | grep -Po "\b[0-9]\d?\b") + + + echo vm_id=$vm_id, snap_name=$snap_name, storage=$storage, keep=$keep +} + +get_list_snap () +{ + #snapshots=($(qm listsnapsho $vm_id | awk {'print $2'} | sed \$d | grep $snap_prefix)) + snapshots=($(qm listsnapsho $vm_id | awk {'print $2'} | tac | sed 1d | grep $snap_prefix)) +} + +create_snap () +{ + qm snapshot $vm_id $snap_name --description $SNAP_DESCRIPTION 1>$OUTPUT 2>$ERROR + if [ $? != 0 ]; then + echo "$NAME: Failed to create snapshot." + exit 1 + else + echo "Snapshot created successfully." + fi +} + +delete_old_snap () +{ + if [ -z $keep ]; then + echo "No snapthots to be deleted" + return + else + i=0 + for snap in "${snapshots[@]}" + do + if [ $i -ge $keep ]; then + qm delsnapshot $vm_id $snap 1>$OUTPUT 2>$ERROR + echo "Snapshot $snap deleted successfully." + fi + let i++ + done + fi +} + +# Entry Point +echo $NAME $VERSION +echo "" + +parse_options $@ +get_list_snap +create_snap +delete_old_snap + -- 2.47.3