#!/bin/bash # by Sebastian Clanzett < sebastian[at]clanzett[DOT]de # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty # of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # Revision: # - 20/10/2006: initial release # - 20/10/2006: added domU check # - 24/10/2006: lsof must be executed with sudo # - 29/06/2007: check for sudo access and command # - 29/06/2007: added /etc/sudoers example # - 29/10/2007: added small patch submitted by Tony Whitmore for better DomU checking # - 12/03/2008: fixed some bugs with xm command VERSION=0.9.1 # set this to 0 tol disable check for Relocation,- and HTTP-Server by the lsof command. if enabeld you need to allow the nagios user # sudo access to the lsof command e.g: # # nagios ALL=NOPASSWD: /usr/bin/lsof # nagios ALL=NOPASSWD: /usr/sbin/xm # CHK_PORTS=1 # Port to check for relocation server RELOC_PORT=8002 # Port to check for XEN-HTTP server HTTPD_PORT=8000 # find xm command :: you can also specify the exact path here XM_CMD=`which xm` function check_domU { DOMU=$1 # if not root user then check for sudo access if [ $UID -ne 0 ]; then sudo -l | grep $XM_CMD 1>/dev/null if [ $? -ne 0 ]; then echo "UNKNOWN: Perhaps no sudo acces to xm-command ?!?" exit 3 fi fi # check if lsof is installed which lsof 1>/dev/null if [ $? -ne 0 ]; then echo "UNKNOWN: Cant find lsof" exit 3 fi # check if sudo is installed which sudo 1>/dev/null if [ $? -ne 0 ]; then echo "UNKNOWN: Cant find sudo" exit 3 fi sudo $XM_CMD list | grep $DOMU 1>/dev/null if [ $? -ne 0 ]; then echo "CRITICAL: The domU $DOMU seems to be down!" exit 2 else TIME=`sudo $XM_CMD list | grep $DOMU | awk '{ print $6 }'` VCPU=`sudo $XM_CMD list | grep $DOMU | awk '{print $4}'` MEM=`sudo $XM_CMD list | grep $DOMU | awk '{print $3}'` STATE=`sudo $XM_CMD list | grep $DOMU | awk '{print $5}' | sed 's/-//g'` if [ $STATE == "d" ]; then echo "WARNING: $DOMU seems to be dying (Time=$TIME) (MEM=$MEM) (VCPU=$VCPU) (STATE=$STATE)"; elif [ $STATE == "p" ]; then echo "WARNING: $DOMU seems to be paused (Time=$TIME) (MEM=$MEM) (VCPU=$VCPU) (STATE=$STATE)"; elif [ $STATE == "c" ]; then echo "CRITICAL: $DOMU seems to be crashed (Time=$TIME) (MEM=$MEM) (VCPU=$VCPU) (STATE=$STATE)"; else echo "OK: $DOMU seems to be up (Time=$TIME) (MEM=$MEM) (VCPU=$VCPU) (STATE=$STATE)" fi exit 0 fi } function check_dom0 { # check if lsof is installed which lsof 1>/dev/null if [ $? -ne 0 ]; then echo "UNKNOWN: Cant find lsof" exit 3 fi # check if sudo is installed which sudo 1>/dev/null if [ $? -ne 0 ]; then echo "UNKNOWN: Cant find sudo" exit 3 fi # if not root user then check for sudo access if [ $UID -ne 0 ]; then sudo -l | grep /usr/bin/lsof 1>/dev/null if [ $? -ne 0 ]; then echo "UNKNOWN: Perhaps no sudo acces to lsof-command ?!?" exit 3 fi fi # check if relocation-server is necessary if [ $1 == "reloc=y" ]; then CHK_RELOC=1 elif [ $1 == "reloc=n" ]; then CHK_RELOC=0 else echo "" echo " >> SYNTAX ERROR << " echo "" print_usage exit 3 fi # check if xen-httpd is necessary if [ $2 == "httpd=y" ]; then CHK_HTTPD=1 elif [ $2 == "httpd=n" ]; then CHK_HTTPD=0 else echo "" echo ">> SYNTAX ERROR << " echo "" print_usage exit 3 fi # check for XEN Daemon ps aux --cols 1024 | grep [x]end 1>/dev/null if [ $? -ne 0 ]; then XEND="not running" else XEND="OK" fi # if check for networking is enabled if [ $CHK_PORTS -eq 1 ]; then # check for relocation Server sudo lsof -i | grep $RELOC_PORT 1>/dev/null if [ $? -ne 0 ]; then RELOC="is not running ($RELOC_PORT)" if [ $CHK_RELOC -eq 1 ]; then echo "CRITICAL: Xen Relocation Server is not running" exit 2 fi else RELOC="OK ($RELOC_PORT)" fi #check for xend-http sudo lsof -i | grep $HTTPD_PORT 1>/dev/null if [ $? -ne 0 ]; then HTTPD="is not running ($HTTPD_PORT)" if [ $CHK_HTTPD -eq 1 ]; then echo "CRITICAL: Xen HTTPD Server is not running" exit 2 fi else HTTPD="OK ($HTTPD_PORT)" fi echo "STATUS>> XEND: $XEND; Relocation-Server: $RELOC; Xen-Httpd: $HTTPD" exit 0 fi echo "STATUS>> XEND: $XEND" exit 0 } function print_usage { echo "" echo "" echo " USAGE: $0 (dom0|domU)" echo "" echo "" echo " dom0 ( reloc=(y|n) httpd=(y|n) )-> checks Status of dom0" echo " Example: $0 dom0 reloc=y httpd=y -> check dom0; Relocation Server must be running; Xen-HTTPD must be running" echo " Example: $0 dom0 reloc=n httpd=y -> check dom0; Relocation Server is not necessary; Xen-HTTPD must be running" echo "" echo "" echo " domU -> needs sudo permissions to the 'xm' command !!" echo " Example: $0 domU Webserver1 -> checks if domU Webserver1 is running" echo "" echo " Version: $VERSION by Sebastian Clanzett " echo " Important: There is a flag (requiretty) on RedHat and CentOS systems in /etc/sudoers which prevents remote processes from using sudo." echo " You have to remove this flag to let e.g nrpe use sudo." echo "" } case $1 in dom0) RELOC=$2 HTTPD=$3 if [ -z $2 ] ; then RELOC="reloc=n" fi if [ -z $3 ]; then HTTPD="httpd=n" fi check_dom0 $RELOC $HTTPD ;; domU) DOMU=$2 if [ -z $2 ] ; then echo "" echo "You must specify a domU to check" echo "" exit 3 fi check_domU $DOMU ;; *) print_usage ;; esac