155 lines
4.5 KiB
Bash
Executable File
155 lines
4.5 KiB
Bash
Executable File
#!/bin/bash
|
|
#====================================================================
|
|
# Reads free diskspace on remote hosts via snmp.
|
|
#
|
|
# Requires Net-SNMP: http://net-snmp.sourceforge.net/
|
|
#
|
|
# Jonathan Baxter jbaxter@panscient.com 20080426
|
|
#
|
|
# Copyright (C) 2008, Jonathan Baxter
|
|
#
|
|
# 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.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software
|
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
#
|
|
#====================================================================
|
|
|
|
function usage() {
|
|
echo
|
|
echo "Usage: $0 [-cp] host [host...]";
|
|
echo "Print fixed disks on the specified host(s) with free space below threshold"
|
|
echo
|
|
echo " -c snmp community string (default: \"public\")"
|
|
echo " -p percent free threshold (default: 10%)"
|
|
echo
|
|
echo "Report bugs to jbaxter@panscient.com"
|
|
echo
|
|
}
|
|
|
|
#===================
|
|
# Process options
|
|
#===================
|
|
while getopts ":c:p:" option; do
|
|
case $option in
|
|
c ) community="$OPTARG"; shift $((OPTIND-1)); OPTIND=1;;
|
|
p ) percent_free_threshold="$OPTARG"; shift $((OPTIND-1)); OPTIND=1;;
|
|
h ) usage; exit 0;;
|
|
\? ) usage; exit 1;;
|
|
* ) usage; exit 1;;
|
|
esac
|
|
done
|
|
community=${community-public}
|
|
percent_free_threshold=${percent_free_threshold-10}
|
|
snmp_ver="1"
|
|
|
|
if [ "$1" = "" ]; then
|
|
echo $usage
|
|
exit 1
|
|
fi
|
|
|
|
#=============================================================================
|
|
# Reads the free space on fixed disks on the specified host
|
|
#
|
|
# $1: host
|
|
# return: line for each fixed disk: <name> <size MB> <used MB> <percent free>
|
|
#=============================================================================
|
|
function read_fixed_diskspace()
|
|
{
|
|
local data host type desc au size used
|
|
host=$1
|
|
data="$(snmpwalk -c public -v 1 -OqUes $host hrStorage 2>&1)"
|
|
if [ "$?" != "0" ]; then
|
|
echo -e "$data"
|
|
return 1;
|
|
fi
|
|
while read nameid value junk; do
|
|
name=${nameid%%.*}
|
|
#echo $name
|
|
id=${nameid/$name.}
|
|
lastid=$id
|
|
case "$name" in
|
|
"hrStorageType" ) type[$id]=$value;;
|
|
"hrStorageDescr" ) desc[$id]=$value;;
|
|
"hrStorageAllocationUnits" ) au[$id]=$value;;
|
|
"hrStorageSize" ) size[$id]=$value;;
|
|
"hrStorageUsed" ) used[$id]=$value;;
|
|
* ) ;;
|
|
esac
|
|
done < <(echo -e "$data")
|
|
|
|
i="0"
|
|
while [[ i -lt ${lastid} ]]; do
|
|
if [[ ("${type[$i]}" = "hrStorageFixedDisk") &&
|
|
("${size[$i]-0}" != "0") &&
|
|
("${au[$i]-0}" != "0") ]]; then
|
|
sizeMB=$(( (${au[$i]} * (${size[$i]} / 1024) / 1024) ))
|
|
usedMB=$(( (${au[$i]} * (${used[$i]} / 1024) / 1024) ))
|
|
percent_free=$((100 * ( $sizeMB - $usedMB ) / $sizeMB))
|
|
echo "${desc[$i]} ${sizeMB} ${usedMB} $percent_free\n"
|
|
fi
|
|
let i=i+1;
|
|
done
|
|
}
|
|
|
|
#============================================
|
|
# Insert commas as appropriate into integers
|
|
# $1: integer, eg: 5555555
|
|
# return: commaized integer, eg: 5,555,555
|
|
#============================================
|
|
function commaize() {
|
|
echo $1 | sed ':a;s/\B[0-9]\{3\}\>/,&/;ta'
|
|
}
|
|
|
|
#======================================
|
|
# Process the hosts on the commandline
|
|
#======================================
|
|
n="0"
|
|
num_bad_hosts="0"
|
|
for host in "$@"; do
|
|
data="$(read_fixed_diskspace $host)"
|
|
if [ "$?" != "0" ]; then
|
|
bad_hosts[$num_bad_hosts]=$host
|
|
last_bad_host=$host
|
|
let num_bad_hosts+=1
|
|
message[$n]="$host: $data"
|
|
let n+=1
|
|
else
|
|
while read desc size used percent_free junk; do
|
|
if [[ ("$percent_free" != "") &&
|
|
($percent_free -lt $percent_free_threshold) ]]; then
|
|
if [ "$host" != "$last_bad_host" ]; then
|
|
bad_hosts[$num_bad_hosts]=$host
|
|
last_bad_host=$host
|
|
let num_bad_hosts+=1
|
|
fi
|
|
message[$n]="$host:$desc is $(( 100 - $percent_free ))% full - \
|
|
$(commaize $used)M used out of $(commaize $size)M total"
|
|
let n+=1
|
|
fi
|
|
done < <(echo -e "$data")
|
|
fi
|
|
done
|
|
|
|
if [ "$num_bad_hosts" -gt "0" ]; then
|
|
# summary line: all bad hosts
|
|
echo "${bad_hosts[*]}"
|
|
|
|
# messages
|
|
lastn=$(( $n-1 ))
|
|
for i in $(seq 0 $lastn); do
|
|
echo ${message[$i]}
|
|
done
|
|
exit 1;
|
|
fi
|
|
|
|
exit 0; |