系统监控:msn在线机器人实时报警阅读: 35 评论: 0 作者: lonelybyte 发表于 2010-02-08 17:40 原文链接 一、实际需求 二、运行环境 三、sendMsg用法 下载: code.txt # ls -l sendMsg/ -rw-r--r-- 1 root root 1213 Jul 29 2007 index.php //测试页面,web中打开开始测试;很容易做。 -rw-r--r-- 1 root root 3894 Jul 29 2007 msnpauth-1.1.3.php -rw-r--r-- 1 root root 3372 Jul 29 2007 msnpauth.php -rw-r--r-- 1 root root 4586 Jul 29 2007 sendMsg.php -rw-r--r-- 1 root root 223 Jul 29 2007 simple.php -rw-r--r-- 1 root root 1424 Jul 29 2007 template.tpl 该程序也是通过登录msn服务器、建立IM会话,发送消息; 下载: code.txt $sendMsg = new sendMsg(); $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来发送中文信息; 四、实际应用 下载: code.txt #!/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 = new sendMsg(); $sendMsg->login('test@test.com', '123456'); $sendMsg->createSession($msnaddr); $sendMsg->sendMessage($messages, 'Times New Roman', '008000'); ?> 主要是为了能被其他脚本调用,用于发送一个报警信息。缺点是不能判定错误,所以实际运用中存在故障,需要网络流畅的环境下使用。 我们的生产环境已经存在大量的监控系统,所以针对错误信息已经整理到数据库中,因此我只需要从数据库导出目前存在error信息的文本文件,然后根 据节点位置发送给相关维护负责人即可。 为了能判定和确保发送正确,我利用sendMsg中的index.php的页面和shell脚本相结合来循环发送,实在抱歉本人PHP程度有限; 下载: code.txt #!/bin/sh wget --user=monitor --password=123456 http://127.0.0.1/monitor/msn.txt -O /var/www/html/sendMsg/msn.txt.1 >/dev/null 2>&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` || exit 0 [ -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` || exit 0 SA=(admin1 admin2 admin3 admin4) # 相关负责人列表和下载的msn信息的中的名字对应; msnaddr=(admin1@msn.com admin2@msn.com admin3@msn.com admin4@msn.com) # 相关负责人的msn帐号和SA变量中的的名字顺序一一对应; sendMsg() { num=0 while [ $num -lt 1 ]; 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/null 2>&1 # 使用wget post-data发送post参数给index.php页面,用以发送msn信息。 if [ -f /var/www/html/sendMsg/index.php.1 ]; then if cat /var/www/html/sendMsg/index.php.1 |grep -i successfully >/dev/null 2>&1;then num=1 #判断 信息发送成功 elif cat /var/www/html/sendMsg/index.php.1 |grep -i "The user appears to be offline" >/dev/null 2>&1;then num=1 #判断msn接受人为是否在线状态 echo "The user is offline." exit 0 elif cat /var/www/html/sendMsg/index.php.1 |grep -i "Something went wrong trying to connect to the server" >/dev/null 2>&1;then num=1 #判断 msn 服务器存在连接问题 echo "MSN server is wrong." exit 0 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 exit 0 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 for i in `seq 0 1 3` #根据维 护人员的数量进行判断和循环 do if cat /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每5分钟执行一次;考虑维护人员的上线时间(最好是24H值班msn,那就不存在这个问题)设定执行时间为每周1到5的9点到 18点; 下载: code.txt */5 9-18 * * 1-5 /var/www/html/sendMsg/send_report.sh 实际应用大家可以根据自己的情况进行调整,我这里只是告诉大家怎么使用sendmsg,举了一个简单的实例帮助大家理解和应用。 如果懂php语言的可以把这个作为cacti的一个插件使用,那样效果就更棒啦~ 最新新闻: 编辑推荐:Visual Studio 2010 and .NET Framework 4.0 RC发布 网站导航:博客园首页 个人主页 新闻 闪存 小组 博问 社区 知识库 注意,“系统监控:msn在线机器人实时报警”出自:http://www.cnblogs.com/lonelybyte/archive/2010/02/08/1666037.html
|