Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1793973
  • 博文数量: 184
  • 博客积分: 10122
  • 博客等级: 上将
  • 技术积分: 5566
  • 用 户 组: 普通用户
  • 注册时间: 2005-12-08 12:32
文章存档

2011年(1)

2008年(183)

我的朋友

分类: LINUX

2008-03-03 11:52:27

下面是 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% \&nbsp\;*})
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%' '*}")
echo "$content" > alert_subject
mail -s "${subject}" n7css << EOF

*******************************************************

告警时间 : < ${current_time} >

告警主机 :< ${host_ip} >

告警对象 :< ${alert_target} >

告警类型 : ${alert_type}

告警阀值 :< ${threshold_value} >

单 位 :< $ShortLegend >

当前数值 :< ${current_value} >

*******************************************************

阅读(1394) | 评论(1) | 转发(1) |
给主人留下些什么吧!~~

chinaunix网友2008-04-27 11:32:21

有一些基本问题不是很明白,请问怎么和您联系一下?