Im Folgenden ist ein kurzes Batch-Script aufgeführt, dass eine USV zyklisch via SNMP abfragt und bei niedrigem Akkustand alle Virtuelle Boxen herunterfährt
#!/bin/bash
####################################################################
#
# Script um Server über USV SNMP-Protokoll runterzufahren
#
# Autor: D.Schunk
# Datum: 2018.11.10
#
####################################################################
# IP-Adresse der USV
IpAdress="192.168.13.60"
# Timoeut wenn nicht all VMS runterfahren
timeoutVms=120 # sek
#Benutzer, mit dem virtuelle boxen gestartet wurden
user="server01"
#XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
echo "-------------------------------------------------------------" >> UsvScript.log
echo "$(date "+%Y-%m-%d %T"): script gestartet" >> UsvScript.log
echo "$(date "+%Y-%m-%d %T"): Benutzer: $(whoami) X VM-User: $user" >> UsvScript.log
#Init
state=0
runS=true
Log=true
while ($runS)
do
case $state in
0) #Init
zaehler=0
state=10
;;
10) #Abfrage
#upsBatteryStatus
# unknown(1)
# batteryNormal(2) - UP
# battteryLow(3)
# batteryDepleted(4)
statusUsv=$(snmpwalk -v1 -c public $IpAdress iso.3.6.1.2.1.33.1.2.1 -O v 2>&1) # Trick stdout und stderr ausgebend
#echo "Status USV: $statusUsv\n"
case $statusUsv in
"INTEGER: 2") # batteryNormal(2) - UP
if [ $Log ]
then
echo "$(date "+%Y-%m-%d %T"): Batterizustand OK: $statusUsv" >> UsvScript.log
#echo "$(date "+%Y-%m-%d %T"): Batterizustand OK: $statusUsv"
Log=""
fi
state=20
;;
"INTEGER: 3"|"INTEGER: 4") # battteryLow(3)
echo "$(date "+%Y-%m-%d %T"): Batteriezustand gering !!!: $statusUsv" >> UsvScript.log
#echo "$(date "+%Y-%m-%d %T"): Batteriezustand gering !!!: $statusUsv"
Log=true
state=100
;;
Timeout*)
echo "$(date "+%Y-%m-%d %T"): Keine Antwort von USV: $statusUsv" >> UsvScript.log
#echo "$(date "+%Y-%m-%d %T"): Keine Antwort von USV: $statusUsv"
Log=true
sleep 120
state=20
;;
*) # Unbekannte Antwort
echo "$(date "+%Y-%m-%d %T"): Unbekannte Antwort: $statusUsv" >> UsvScript.log
#echo "$(date "+%Y-%m-%d %T"): Unbekannte Antwort: $statusUsv"
Log=true
sleep 120
state=20
;;
esac
;;
20) #Wartezeit
sleep 15
state=10
;;
100) #Laufende VMS ermitteln
vms=`su $user -c "VBoxManage list runningvms"`
echo "$(date "+%Y-%m-%d %T"): Running VMS: $vms" >> UsvScript.log
#echo "$(date "+%Y-%m-%d %T"): Running VMS: $vms"
state=110
;;
110) #VMs beenden - Prüfe ob noch welche laufen
vms=`su $user -c "VBoxManage list runningvms"`
for vm in $vms
do
vmOZ=${vm%\"} # Anführungzeichen entfernen
vmOZ=${vmOZ#\"} # Anführungzeichen entfernen
echo "$(date "+%Y-%m-%d %T"): Beende VM $vmOZ" >> UsvScript.log
#sudo -u $user VBoxManage controlvm $vmOZ acpipowerbutton
su $user -c "VBoxManage controlvm $vmOZ acpipowerbutton"
done
echo "$(date "+%Y-%m-%d %T"): Restzeit: $(($timeoutVms-$zaehler))s" >> UsvScript.log
#echo "$(date "+%Y-%m-%d %T"): Restzeit: $(($timeoutVms-$zaehler))s"
if [ -z "$vms" ]
then
echo "$(date "+%Y-%m-%d %T"): Alle VMs beendet" >> UsvScript.log
state=200
else
if [ $zaehler -ge $timeoutVms ]
then
echo "$(date "+%Y-%m-%d %T"): TimeOut (nicht alle VMs runtergefahren)" >> UsvScript.log
state=200
else
zaehler=$(($zaehler+10))
state=120
fi
fi
;;
120) #Wartezeit
sleep 10
state=110
;;
200) #Rechner runterfahren
echo "$(date "+%Y-%m-%d %T"): shutdown" >> UsvScript.log
#echo "$(date "+%Y-%m-%d %T"): shutdown"
shutdown now
runS=false
;;
esac
done
exit 0