--- /dev/null
+#!/bin/bash
+
+create_snapshots() {
+ local pattern=$1
+ for vm in $(sudo virsh list --all | awk "/${pattern}/{print \$2}"); do
+ sudo virsh shutdown "${vm}"
+ wait_for_shutoff "${vm}"
+ sudo virsh snapshot-create "${vm}"
+ sudo virsh start "${vm}"
+ done
+}
+
+delete_snapshots() {
+ local pattern=$1
+ for vm in $(sudo virsh list --all | awk "/${pattern}/{print \$2}"); do
+ for snapshot in $(sudo virsh snapshot-list "${vm}" --name); do
+ echo "deleting snapshot ${snapshot} (vm: ${vm})"
+ sudo virsh snapshot-delete "${vm}" "${snapshot}"
+ done
+ done
+}
+
+revert_snapshots() {
+ local pattern=$1
+ for vm in $(sudo virsh list --all | awk "/${pattern}/{print \$2}"); do
+ echo "restoring last snapshot for ${vm}"
+ sudo virsh snapshot-revert "${vm}" --current
+ sudo virsh start "${vm}"
+ done
+}
+
+wait_for_shutoff() {
+ local vm=$1
+ local retries=60
+ local delay=2
+
+ until test "${retries}" -eq 0
+ do
+ echo "waiting for ${vm} to be shut off... #${retries}"
+ sleep "${delay}"
+ let "retries=$retries-1"
+ local current_state=$(sudo virsh domstate "${vm}")
+ test "${current_state}" == "shut off" && return
+ done
+ echo couldnt shutoff "${vm}"
+ exit 1
+}
+
+while :; do
+ case $1 in
+ -d|--delete)
+ delete_snapshots "$2"
+ exit
+ ;;
+ -i|--interactive)
+ INTERACTIVE=TRUE
+ ;;
+ -s|--snapshot)
+ create_snapshots "$2"
+ ;;
+ -r|--revert)
+ revert_snapshots "$2"
+ ;;
+ --)
+ shift
+ break
+ ;;
+ *)
+ break
+ esac
+
+ shift
+done