#!/bin/bash # Nagios Plugin to check Proxmox 1.9 Autostart VMs # © 2012 Bastian Sebode # # 2 rows are needed in /etc/sudoers for this script to work # nagios ALL = NOPASSWD: /usr/sbin/vzlist # nagios ALL = NOPASSWD: /usr/sbin/qm list # printhelp () { echo "" echo "Usage" echo " "`basename $0`" [-qemu -vz] [-s <.domain.tld>] [-i ] [-p] [-a]" echo " -qemu Should QEMU VMs be tested" echo " -openvz Should OpenVZ VMs be tested" echo " -i Important Maschines which make Status CRITICAL (separated by space). (all others result in WARNING only)" echo " -s Should the suffixes be stripped from Hostname (separated by space)" echo " -p Include QEMU Performance Data (beta)" echo " -a Print Status of all VMs (not implemented yet)" } output () { # Got no data => UNKNOWN if [ "$critical" == "" ] && [ "$warning" == "" ] && [ "$running" == "" ] && [ "$stopped" == "" ] then echo "STATUS UNKNOWN" exit 4 fi # Got data, all Autostart VMs running => OK if [ $retval -eq 0 ] then info="all Autostart VMs running!" fi # Return Information if [ "$info" ] then echo $info elif [ "$critical" -a "$warning" ] then echo -en "CRIT: $critical WARN: $warning\n" elif [ "$critical" ] then echo -en "CRIT: $critical\n" elif [ "$warning" ] then echo -en "WARN: $warning\n" fi if [ "$running" ] then echo -en "Running:\n$running" fi if [ "$stopped" ] then echo -en "Stopped:\n$stopped" fi echo -en "|$perf" exit $retval } check_qemu () { if [ "$checkall" ] then qemuvms=$(ls /etc/qemu-server/*.conf | sed -e s,/etc/qemu-server/,, -e s,.conf,, | xargs) autoboot=$(grep -l 'onboot: 1' /etc/qemu-server/*.conf | sed -e s,/etc/qemu-server/,, -e s,.conf,, | xargs) else qemuvms=$(grep -l 'onboot: 1' /etc/qemu-server/*.conf | sed -e s,/etc/qemu-server/,, -e s,.conf,, | xargs) autoboot=$qemuvms fi type="QEMU" for vm in $qemuvms; do vmname=`getname $vm` (echo $autoboot | grep -v $vm) > /dev/null boot=$? if (sudo qm list | grep -q $vm.*running) then if [ $boot -eq 0 ] then noboot=" (no Autoboot)" fi running="$running$vmname ($vm) $type$noboot\n" if [ "$perfinfo" ] then perfinfo $vm fi elif [ $boot -eq 0 ] then stopped="$stopped$vmname ($vm) $type\n" else if (echo $important | grep $vm) > /dev/null then critical="$critical $vmname ($vm) $type" retval=2 else warning="$warning $vmname ($vm) $type" if [ $retval -ne 2 ]; then retval=1 fi fi fi done } check_vz () { if [ "$checkall" ] then openvzcts=$(ls /etc/vz/conf/*.conf | sed -e s,/etc/vz/conf/,, -e s,.conf,, | xargs) autoboot=$(grep -l 'ONBOOT="yes"' /etc/vz/conf/*.conf | sed -e s,/etc/vz/conf/,, -e s,.conf,, | xargs) else openvzcts=$(grep -l 'ONBOOT="yes"' /etc/vz/conf/*.conf | sed -e s,/etc/vz/conf/,, -e s,.conf,, | xargs) autoboot=$openvzcts fi type="OpenVZ" for vm in $openvzcts; do vmname=`getname $vm` (echo $autoboot | grep -v $vm) > /dev/null boot=$? if (sudo vzlist | grep -q $vm) then if [ $boot -eq 0 ] then noboot=" (no Autoboot)" fi running="$running$vmname ($vm) $type$noboot\n" if [ "$perfinfo" ] then x=1 #perfinfo $vm fi elif [ $boot -eq 0 ] then stopped="$stopped$vmname ($vm) $type\n" else if (echo $important | grep $vm) > /dev/null then critical="$critical $vmname ($vm) $type" retval=2 else warning="$warning $vmname ($vm) $type" if [ $retval -ne 2 ]; then retval=1 fi fi fi done } getname () { if [ "$type" == "OpenVZ" ] then vmname=$(sudo vzlist -Ha | awk '$1 == "'"$1"'" {print $5}') fi if [ "$type" == "QEMU" ] then vmname=$(cat /etc/qemu-server/$vm.conf | awk '$1 == "name:" {print $2}') fi if [ "$strip_suffix" ] then for suffix in $suffixes; do vmname=$(echo $vmname | sed s/$suffix//) done fi echo $vmname } perfinfo () { pid=$(sudo qm list | awk '$1 == "'"$1"'" {print $6}') perf_tmp=`ps u $pid | grep -v % | awk '{print "Mem: "$4" CPU: "$3}'` perf="$perf($1) $perf_tmp $sep" } checkconfig () { if [ "$#" -eq 0 -o "$1" == "-h" -o "$1" == "--help" ] then printhelp exit 0 fi while [ "$1" ] do if [ "$1" == "-qemu" ] then qemu=1 last=qemu shift elif [ "$1" == "-openvz" ] then openvz=1 last=openvz shift elif [ "$1" == "-p" ] then perfinfo=1 shift elif [ "$1" == "-a" ] then checkall=1 shift elif [ "$1" == "-i" ] then shift while [ `echo $1 | grep -v ^-` ] do if [ `echo $1 | grep -v "^[0-9]*$"` ] then echo "ERROR: only numbers allowed in -i!" exit 1 fi important="$important $1" shift done elif [ "$1" == "-s" ] then shift strip_suffix=1 while [ `echo $1 | grep -v ^-` ] do suffixes="$suffixes $1" shift done else echo "ERROR: "`basename $0`" does not support '$1'. Type '"`basename $0`" --help' for additional information." printhelp exit 1 fi done if [ ! "$qemu" -a ! "$openvz" ] then echo "ERROR: At least one of -qemu and -vz needs to be specified!" printhelp exit 1 fi } retval=0 checkconfig "$@" if [ "$last" == "openvz" ] then if [ "$qemu" ]; then check_qemu; fi if [ "$openvz" ]; then check_vz; fi else if [ "$openvz" ]; then check_vz; fi if [ "$qemu" ]; then check_qemu; fi fi output