您的位置:首页 > 运维架构

系统监控:msn在线机器人实时报警

2008-09-21 16:31 525 查看
转自:http://www.bsdlover.cn/html/88/n-1788.html
一、实际需求
在应用各种监控[/u]软件(比如:cacti[/u]nagios[/u]、sitescope等)的时候,我一般都会用到它的email阀值报警[/u]功能。如果这时候再加上一个 msn[/u]在线监控机器人为你把关,第一时间给你发出msn报警信息,是不是能让你更快的处理问题呢。以下我为大家介绍一个msn command line 的小程序来实现[/u]这个功能。
软件下载[/u]地址:

sendMsg.zip(6.54 KB)
二、运行环境
一个支持php[/u]的系统环境就可以啦,当然要能上网,不然怎么发消息呢。
我的做法是和cacti监控服务器放一起,不需要额外的设备和资源投入。
注册一个msn的帐号用于监控机器人。比如:test@test.com 密码:123456
需要收到消息的msn帐号必须加监控帐号test@test.com为好友,不然收不到消息。三、sendMsg用法
sendMsg.zip包中所有文件[/u]如下:# ls -l sendMsg/
-rw-r--r--1root[/u]root1213Jul29 2007index.php//测试页面,web中打开开始测试;很容易做。
-rw-r--r--1rootroot3894Jul29 2007msnpauth-1.1.3.php
-rw-r--r--1rootroot3372Jul29 2007msnpauth.php
-rw-r--r--1rootroot4586Jul29 2007sendMsg.php
-rw-r--r--1rootroot 223Jul29 2007simple.php
-rw-r--r--1rootroot1424Jul29 2007template.tpl该程序也是通过登录msn服务器、建立IM会话,发送消息;
基本PHP语法如下:$sendMsg=newsendMsg();
$sendMsg->login('test@test.com','123456');
//刚才建立的用于举例的msn监控机器人帐号
$sendMsg->createSession('recipient@hotmail.com');
//接受信息人的msn帐号
$sendMsg->sendMessage('message','Times New Roman','FF0000');
//第一个是具体信息内容,后面可以设定字体和颜色;
$sendMsg->sendMessage(iconv("GBK","UTF-8", 测试),'Times New Roman','008000');
//也利用iconv转换gbk到utf8来发送中文[/u]信息;效果如下:


四、实际应用
这里是我自己写的一个应用发送msn信息的php脚本:仅供参考,如果大家有更好请和我交流。#!/usr/bin/php
<?
if($argc!=3){
die("Usage: send_cndmonitor.php <msn-address> <messages>n");
}
array_shift($argv);
$msnaddr=$argv[0];
$messages=$argv[1];
include('sendMsg.php');
$sendMsg=newsendMsg();
$sendMsg->login('test@test.com','123456');
$sendMsg->createSession($msnaddr);
$sendMsg->sendMessage($messages,'Times New Roman','008000');
?>主要是为了能被其他脚本[/u]调用,用于发送一个报警信息。缺点是不能判定错误,所以实际运用中存在故障,需要网络流畅的环境下使用。我们的生产环境已经存在大量的监控系统,所以针对错误信息已经整理到数据库中,因此我只需要从数据库导出目前存在error信息的文本文件,然后根据节点位置发送给相关维护负责人即可。为了能判定和确保发送正确,我利用sendMsg中的index.php的页面和shell[/u]脚本相结合来循环发送,实在抱歉本人PHP程度有限;
脚本如下:(这是我实例中使用的一个工作脚本,仅供大家借鉴)#!/bin/sh
wget--user=monitor--password=123456http://127.0.0.1/monitor/msn.txt-O/var/www/html/sendMsg/msn.txt.1>/dev/null2>&1
#下载msn要发送的信息,因为页面都是认证的所以用了wget的user和password;
now=`date +%Y-%m-%d-%H:%M`
[-f/var/www/html/sendMsg/msn.txt]&&oldmd5=`md5sum var/www/html/sendMsg/msn.txt |awk '{print$1}' |tee /var/log/cdn_status_old.md5`||exit0
[-f/var/www/html/sendMsg/msn.txt.1]&&newmd5=`md5sum var/www/html/sendMsg/msn.txt.1 |awk '{print$1}' |tee /var/log/cdn_status_new.md5`||exit0
SA=(admin1admin2admin3admin4)
# 相关负责人列表和下载的msn信息的中的名字对应;
msnaddr=(admin1@msn.comadmin2@msn.comadmin3@msn.comadmin4@msn.com)
# 相关负责人的msn帐号和SA变量中的的名字顺序一一对应;
sendMsg()
{
num=0
while[$num-lt1];
do
wget--post-data"sender=test@test.com&password=123456&recipient=${1}&message=${2}"http://127.0.0.1/sendMsg/index.php-O/var/www/html/sendMsg/index.php.1>/dev/null2>&1
# 使用wget post-data发送post参数给index.php页面,用以发送msn信息。
if[-f/var/www/html/sendMsg/index.php.1];then
ifcat/var/www/html/sendMsg/index.php.1|grep-isuccessfully>/dev/null2>&1;then
num=1#判断信息发送成功
elifcat/var/www/html/sendMsg/index.php.1|grep-i"The user appears to be offline">/dev/null2>&1;then
num=1#判断msn接受人为是否在线状态
echo"The user is offline."
exit0
elifcat/var/www/html/sendMsg/index.php.1|grep-i"Something went wrong trying to connect to the server">/dev/null2>&1;then
num=1#判断msn 服务器存在连接问题
echo"MSN server is wrong."
exit0
else
num=0#除了以上三种情况退出循环外,其他情况重试。
fi
rm-f/var/www/html/sendMsg/index.php.1
else
num=0
fi
done
}
 
if[[$oldmd5==$newmd5]];then#校验msn的信息是否是已经发送过的,主要是为了不重复发送错误信息。
rm-f/var/www/html/sendMsg/msn.txt.1
exit0
else
mv/var/www/html/sendMsg/msn.txt/var/www/html/sendMsg/bak/msn$now.txt-f
mv/var/www/html/sendMsg/msn.txt.1/var/www/html/sendMsg/msn.txt-f
#备份已发送的msn错误信息
 
fi
 
foriin`seq 0 1 3`#根据维护人员的数量进行判断和循环
do
ifcat/var/www/html/sendMsg/msn.txt|grep-i${SA[$i]};then
messages=`cat /var/www/html/sendMsg/msn.txt |grep -i ${SA[$i]}`
sendMsg"${msnaddr[$i]}""$messages"
else
continue
fi
done加入到crontab[/u]每5分钟执行一次;考虑维护人员的上线时间(最好是24H值班msn,那就不存在这个问题)设定执行时间为每周1到5的9点到18点;*/59-18* *1-5/var/www/html/sendMsg/send_report.sh实际应用大家可以根据自己的情况进行调整,我这里只是告诉大家怎么使用sendmsg,举了一个简单的实例帮助大家理解和应用。如果懂php语言的可以把这个作为cacti的一个插件使用,那样效果就更棒啦~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: