commit c25772de7c80769544d93701a534652d9f4761ec Author: Tamás Gérczei Date: Mon Apr 18 16:33:06 2016 +0200 initial import of PoC from testbed diff --git a/guesthandler-disarm.xml b/guesthandler-disarm.xml new file mode 100644 index 0000000..f3ef463 --- /dev/null +++ b/guesthandler-disarm.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + diff --git a/guesthandler.sh b/guesthandler.sh new file mode 100644 index 0000000..b95c188 --- /dev/null +++ b/guesthandler.sh @@ -0,0 +1,77 @@ +#!/usr/bin/env bash +# implement guest start-up and shutdown order to ensure proper operation +# PREREQUISITE: 'vmadm update $UUID <<< "{\"set_tags\": {\"priority\": 0}}"' where 0 means 'OFF', the rest determines ascending and descending numerical order respectively + +. /lib/svc/share/smf_include.sh + +if [ -z "$SMF_FMRI" ]; then + echo "this script can only be invoked by smf(5)" + exit $SMF_EXIT_ERR_NOSMF +fi + +ME=$(basename ${0%.sh}) + +# start-up delay between VMs +DELAY=30 + +function log { + # helper function to log arbitrary messages via syslog + logger -p daemon.notice -t $ME $@ + } + +case $1 in + start) + # determine the order of VMs by boot priority + ORDER=( $(vmadm lookup -j -o uuid,tags | json -c 'this.tags.priority > 0' -a uuid tags.priority | sort -nk2 | cut -d " " -f1) ) + # start guests + for UUID in ${ORDER[*]} + do + # invoke vmadm + vmadm start $UUID 2> /dev/null + if [ $? -eq 0 ] + then + # successful start, log and wait + log $UUID managed to $1 + sleep $DELAY + else + # failed to start guest + log $UUID failed to $1 + fi + done + ;; + + stop) + # determine the order of VMs by reverse boot priority + ORDER=( $(vmadm lookup -j -o uuid,tags state=running | json -a uuid tags.priority | sort -rnk2 | cut -d " " -f1) ) + # stop guests + for UUID in ${ORDER[*]} + do + # invoke vmadm + vmadm stop $UUID 2> /dev/null + if [ $? -eq 0 ] + then + # successful stop + log $UUID managed to $1 + else + # failed to stop guest + log $UUID failed to $1 + fi + done + ;; + + disarm) + # set the 'autoboot' attribute to 'false' for every installed guest on order to prevent automatic start-up without this script + zoneadm list -pi | while IFS=":" read ID UUID STATE remainder; do + if [[ $STATE == "installed" ]]; + then + zonecfg -z $UUID set autoboot=false + fi + done + log disarmed: set autoboot=false on all zones + ;; + + *) + exit 1; +esac + +exit $SMF_EXIT_OK diff --git a/guesthandler.xml b/guesthandler.xml new file mode 100644 index 0000000..a2a22b2 --- /dev/null +++ b/guesthandler.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + diff --git a/zones.xml b/zones.xml new file mode 100644 index 0000000..fcfea24 --- /dev/null +++ b/zones.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + +