原贴:http://www.hiadmin.com/tag/sendmsg/
系统监控:msn在线机器人实时报警
七月 23rd, 2008 |
|
Posted in 系统监控 < by Michael Field >
一、实际需求
在应用各种监控软件(比如:cacti、nagios、sitescope等)的时候,我一般都会用到它的email阀值报警功能。如果这时候再加上一个 msn在线监控机器人为你把关,第一时间给你发出msn报警信息,是不是能让你更快的处理问题呢。以下我为大家介绍一个msn command line 的小程序来实现这个功能。
软件下载地址:sendMsg
二、运行环境
一个支持php的系统环境就可以啦,当然要能上网,不然怎么发消息呢。
我的做法是和cacti监控服务器放一起,不需要额外的设备和资源投入。
注册一个msn的帐号用于监控机器人。比如:[email protected] 密码:123456
需要收到消息的msn帐号必须加监控帐号[email protected]为好友,不然收不到消息。
三、sendMsg用法
sendMsg.zip包中所有文件如下:
# 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会话,发送消息;
基本PHP语法如下:
$sendMsg
=
new
sendMsg
()
;
$sendMsg
->
login
(
'
[email protected]
'
,
'
123456
'
)
;
//刚才建立的用于举例的
msn
监控机器人帐号
$sendMsg
->
createSession
(
'
[email protected]
'
)
;
//接受信息人的
msn
帐号
$sendMsg
->
sendMessage
(
'
message
'
,
'
Times New Roman
'
,
'
FF0000
'
)
;
//第一个是具体信息内容,后面可以设定字体和颜色;
$sendMsg
->
sendMessage
(
iconv
(
"
GBK
"
,
"
UTF-8
"
, 测试
)
,
'
Times New Roman
'
,
'
008000
'
)
;
//也利用
iconv
转换
gbk
到
utf8
来发送中文信息;
效果如下:
四、实际应用
这里是我自己写的一个应用发送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
=
new
sendMsg
()
;
$sendMsg
->
login
(
'
[email protected]
'
,
'
123456
'
)
;
$sendMsg
->
createSession
(
$msnaddr
)
;
$sendMsg
->
sendMessage
(
$messages
,
'
Times New Roman
'
,
'
008000
'
)
;
?>
主要是为了能被其他脚本调用,用于发送一个报警信息。缺点是不能判定错误,所以实际运用中存在故障,需要网络流畅的环境下使用。
我们的生产环境已经存在大量的监控系统,所以针对错误信息已经整理到数据库中,因此我只需要从数据库导出目前存在error信息的文本文件,然后根据节点位置发送给相关维护负责人即可。
为了能判定和确保发送正确,我利用sendMsg中的index.php的页面和shell脚本相结合来循环发送,实在抱歉本人PHP程度有限;
脚本如下:(这是我实例中使用的一个工作脚本,仅供大家借鉴)
#!/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
"
[email protected]&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点;
*/
5
9
-
18
* *
1
-
5
/
var
/
www
/
html
/
sendMsg
/
send_report
.
sh
实际应用大家可以根据自己的情况进行调整,我这里只是告诉大家怎么使用sendmsg,举了一个简单的实例帮助大家理解和应用。
如果懂php语言的可以把这个作为cacti的一个插件使用,那样效果就更棒啦~
系统监控:msn在线机器人实时报警
七月 23rd, 2008 |
|
Posted in 系统监控 < by Michael Field >
一、实际需求
在应用各种监控软件(比如:cacti、nagios、sitescope等)的时候,我一般都会用到它的email阀值报警功能。如果这时候再加上一个 msn在线监控机器人为你把关,第一时间给你发出msn报警信息,是不是能让你更快的处理问题呢。以下我为大家介绍一个msn command line 的小程序来实现这个功能。
软件下载地址:sendMsg
二、运行环境
一个支持php的系统环境就可以啦,当然要能上网,不然怎么发消息呢。
我的做法是和cacti监控服务器放一起,不需要额外的设备和资源投入。
注册一个msn的帐号用于监控机器人。比如:[email protected] 密码:123456
需要收到消息的msn帐号必须加监控帐号[email protected]为好友,不然收不到消息。
三、sendMsg用法
sendMsg.zip包中所有文件如下:
# 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会话,发送消息;
基本PHP语法如下:
$sendMsg
=
new
sendMsg
()
;
$sendMsg
->
login
(
'
[email protected]
'
,
'
123456
'
)
;
//刚才建立的用于举例的
msn
监控机器人帐号
$sendMsg
->
createSession
(
'
[email protected]
'
)
;
//接受信息人的
msn
帐号
$sendMsg
->
sendMessage
(
'
message
'
,
'
Times New Roman
'
,
'
FF0000
'
)
;
//第一个是具体信息内容,后面可以设定字体和颜色;
$sendMsg
->
sendMessage
(
iconv
(
"
GBK
"
,
"
UTF-8
"
, 测试
)
,
'
Times New Roman
'
,
'
008000
'
)
;
//也利用
iconv
转换
gbk
到
utf8
来发送中文信息;
效果如下:
四、实际应用
这里是我自己写的一个应用发送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
=
new
sendMsg
()
;
$sendMsg
->
login
(
'
[email protected]
'
,
'
123456
'
)
;
$sendMsg
->
createSession
(
$msnaddr
)
;
$sendMsg
->
sendMessage
(
$messages
,
'
Times New Roman
'
,
'
008000
'
)
;
?>
主要是为了能被其他脚本调用,用于发送一个报警信息。缺点是不能判定错误,所以实际运用中存在故障,需要网络流畅的环境下使用。
我们的生产环境已经存在大量的监控系统,所以针对错误信息已经整理到数据库中,因此我只需要从数据库导出目前存在error信息的文本文件,然后根据节点位置发送给相关维护负责人即可。
为了能判定和确保发送正确,我利用sendMsg中的index.php的页面和shell脚本相结合来循环发送,实在抱歉本人PHP程度有限;
脚本如下:(这是我实例中使用的一个工作脚本,仅供大家借鉴)
#!/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
"
[email protected]&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点;
*/
5
9
-
18
* *
1
-
5
/
var
/
www
/
html
/
sendMsg
/
send_report
.
sh
实际应用大家可以根据自己的情况进行调整,我这里只是告诉大家怎么使用sendmsg,举了一个简单的实例帮助大家理解和应用。
如果懂php语言的可以把这个作为cacti的一个插件使用,那样效果就更棒啦~