40 lines
1.2 KiB
Bash
40 lines
1.2 KiB
Bash
|
#!/bin/sh -e
|
||
|
#
|
||
|
# stop.sh - stops a capsul
|
||
|
# if it is already stopped, do nothing
|
||
|
|
||
|
# State Key
|
||
|
# NOSTATE: 0 - no state
|
||
|
# RUNNING: 1 - the domain is running
|
||
|
# BLOCKED: 2 - the domain is blocked on resource
|
||
|
# PAUSED: 3 - the domain is paused by user
|
||
|
# SHUTDOWN: 4 - the domain is being shut down
|
||
|
# SHUTOFF: 5 - the domain is shut off
|
||
|
# CRASHED: 6 - the domain is crashed
|
||
|
# PMSUSPENDED: 7 - the domain is suspended by guest power management
|
||
|
# LAST: 8 NB: this enum value will increase over time as new events are added to the libvirt API. It reflects the last state supported by this version of the libvirt API.
|
||
|
|
||
|
vmname="$1"
|
||
|
|
||
|
[ "$vmname" = '' ] && printf 'you must set $vmname\n' && exit 1
|
||
|
|
||
|
if printf "$vmname" | grep -vqE '^(cvm|capsul)-[a-z0-9]{10}$'; then
|
||
|
printf 'vmname %s must match ^capsul-[a-z0-9]{10}$\n' "$vmname"
|
||
|
exit 1
|
||
|
fi
|
||
|
|
||
|
state="$(virsh domstats $vmname | grep state.state | cut -d '=' -f 2)"
|
||
|
|
||
|
[ "$state" = '' ] && printf 'state was not detected. must match ^[0-8]$\n' && exit 1
|
||
|
|
||
|
if printf "$state" | grep -vqE '^[0-8]$'; then
|
||
|
printf 'state %s must match ^[0-8]$\n' "$state"
|
||
|
exit 1
|
||
|
fi
|
||
|
|
||
|
case "$state" in
|
||
|
[1-37]) virsh shutdown "$vmname" > /dev/null ;;
|
||
|
[4-6]) printf '%s is already shutting down\n' "$vmname" ;;
|
||
|
esac
|
||
|
|