--- /dev/null
+#!/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
+