下面是 MRTG 中一个对输入对象的值进行判断并自动输出告警的脚本的例子
-)1、首先 MRTG 在发现某个输入对象的值小于/大于某个预定的阀值时,就会触发指定的脚本
这个脚本是由 ThreshProgI[
] 指定的,而阀值则是由 ThreshMaxI 和
ThreshMinI 指定的。
-)2、同理,输出对象也可以设定最大/小值/触发脚本,把上面的命令中的 I 改为 O 就是了
-)3、MRTG 在调用脚本的同时会附带传递若干个变量给脚本,分别是告警的 target($1)、
设定的阀值($2)、当前告警值 ($3)。
-)4、为了区分告警的严重程度,我们可以通过查询 Target 是在那个配置文件里面的,因为之前
我把所有的配置文件都按照类型进行了归类,并对每个配置文件中所包含的情况都分了一个
告警级别,所以只要查出是那个文件就可以知道是属于什么告警级别的。
-)5、为了便于存档,会每天保存1个日志
-)6、具体效果如下 :
#!/bin/bash
cd /etc/mrtg/
alert_target=$1
threshold_value=$2
current_value=$3
host_ip=`grep "\[${alert_target}\]" /etc/mrtg/target_info |cut -d ':' -f 3` >/dev/null 2>&1
cfg_file=`grep "\[${alert_target}\]" /etc/mrtg/target_info|cut -d ':' -f 1` >/dev/null 2>&1
if [ -z "${host_ip}" ] || [ -z "${cfg_file}" ];then
subject=" Unknown Target [ ${alert_target} ] Alert "
mail -s "${subject}" n7css < /dev/null >/dev/null 2>&1
exit 1;
fi
echo "告警对象 : ${alert_target}"
echo "配置文件 :${cfg_file}"
LegendI=$(grep ^LegendI ${cfg_file}|cut -d ':' -f 2)
LegendI=$(echo ${LegendI% \ \;*})
echo "监测项目1 : $LegendI"
min_input=$(grep ^ThreshMinI ${cfg_file} |cut -d ':' -f 2|tr -d '[:blank:]')
max_input=$(grep ^ThreshMaxI ${cfg_file} |cut -d ':' -f 2|tr -d '[:blank:]')
case ${threshold_value} in
${min_input}) alert_type="< ${LegendI} > 最小值告警" ;;
${max_input}) alert_type="< ${LegendI} > 最大值告警" ;;
esac
echo "告警类型 :$alert_type"
ShortLegend=$(grep ^ShortLegend ${cfg_file} |cut -d ':' -f 2) && ShortLegend=$(echo ${ShortLegend% *})
if [ -z "$ShortLegend" ];then
ShortLegend="无"
fi
echo "单位 :${ShortLegend}"
current_time=`date +"%Y-%m-%d %H:%M:%S"`
alert_id=$(date +%s)
if grep "${cfg_file}" /etc/mrtg/important_status.cfg >/dev/null 2>&1 ; then
alert_level=' !!! 严重 !!! '
alert_color='red'
elif grep "${cfg_file}" /etc/mrtg/io_perfermance.cfg >/dev/null 2>&1; then
alert_level=' !!! 紧急 !!! '
alert_color='#FF00FF'
elif grep "${cfg_file}" /etc/mrtg/normal_status.cfg >/dev/null 2>&1;then
alert_level=' !!! 注意 !!! '
alert_color='brown'
elif grep "${cfg_file}" /etc/mrtg/usage_detect.cfg > /dev/null 2>&1; then
alert_level=' !!! 注意 !!!'
alert_color='blue'
else alert_level=' !!! 注意 !!! '
alert_color='green'
fi
echo "告警等级:${alert_level}"
alert_level_string=$(echo ${alert_level#' !!! '})
alert_level_string=$(echo ${alert_level_string%' !!! '})
subject="告警对象 [ $alert_target ] 告警时间 [ ${current_time} ] 告警类型 [ ${alert_type} ]"
subject_detail="级别: ${alert_level_string} ; 对象: <${alert_target}> ; 时间: <${current_time}> ; 类型 [${alert_type}] ; 阀值: <${threshold_value}> ; 当前值: <${current_value}> ID: <${alert_id}>"
echo "${subject_detail}" >> /var/www/html/mrtg/total_alert
##########################################################################################################
# 现在开始生成 html 格式的告警历史
##########################################################################################################
echo '' > /var/www/html/mrtg/alert_subject.new
echo '告警时间 :'${current_time}'' >> /var/www/html/mrtg/alert_subject.new
echo '主 题 : '${subject}'' >> /var/www/html/mrtg/alert_subject.new
echo '告警 ID :'${alert_id}'' >> /var/www/html/mrtg/alert_subject.new
echo '告警级别 :'${alert_level}'' >> /var/www/html/mrtg/alert_subject.new
echo '告警主机 :'${host_ip}'' >> /var/www/html/mrtg/alert_subject.new
echo '告警对象 :'${alert_target}'' >> /var/www/html/mrtg/alert_subject.new
echo '告警类型 :'${alert_type}'' >> /var/www/html/mrtg/alert_subject.new
echo '告警阀值 :'${threshold_value}'' >> /var/www/html/mrtg/alert_subject.new
echo '单 位 :'$ShortLegend'' >> /var/www/html/mrtg/alert_subject.new
echo '当前数值 :'${current_value}'' >> /var/www/html/mrtg/alert_subject.new
echo ' ' >> /var/www/html/mrtg/alert_subject.new
echo '' >> /var/www/html/mrtg/alert_subject.new
cd /var/www/html/mrtg
if [ ! -e alert_subject ];then
touch alert_subject
fi
last_alert_time=$(grep -m 1 '告警 ID' alert_subject)
last_alert_time=$(echo ${last_alert_time%''*})
last_alert_time=$(echo ${last_alert_time##*:})
last_alert_date=$(date -d "1970-01-01 ${last_alert_time} sec utc" +%Y%m%d )
last_alert_day=$(date -d "1970-01-01 ${last_alert_time} sec utc" +%d)
current_day=$(date +%d)
echo "最后告警日期 : ${last_alert_day}"
echo "当前日期 :${current_day}"
if [ ${last_alert_day} -ne ${current_day} ];then
echo "现在需要清空 alert_subject"
cp alert_history.html alert_hist/alert_history_${last_alert_date}.html >/dev/null 2>&1
> alert_subject
else
echo "现在还没有过0点,不需要清空 alert_subject"
fi
rm -f /var/www/html/mrtg/alert_history.html
cat html.header alert_subject.new alert_subject html.footer > /var/www/html/mrtg/alert_history.html
content=$(tail -n +13 alert_history.html)
content=$(echo "${content%'
|