Cacti每间隔一段时间通过snmp协议监测已添加的主机状态,在Cacti数据库中,host表记录着交换机的相关信息,如状态(status),最近宕机时间(status_fail_date),最近恢复正常时间(status_rec_date)。要实现飞信监控交换机状态,交换机down了就发短信到指定的手机号上,而且宕机的交换机信息不能重复发。思路:判断交换机状态(宕机只发送一次信息),是否发送短信。在host表中添加交换机当前状态(status_now)和默认交换机状态(status_default)两列,其默认值都为1表示正常,用于与上一次交换机状态比对从而不重复发短信。
代码如下:
ALTER TABLE `host`
ADD COLUMN `status_now` char(2) NOT NULL DEFAULT '1' AFTER `availability`;
ALTER TABLE `host`
ADD COLUMN `status_default` char(2) NOT NULL DEFAULT '1' AFTER `status_now`;
1.最近宕机时间>最近恢复时间—>交换机宕机—>更改记录status=0;此时status列和status_default列的值分别为0,1—>发送短信—>更改记录status_default=0;此时status列和status_default列的值分别为0,0—>再次检测交换机宕机,不重复发短信;
2.最近宕机时间<=最近恢复时间—>交换机恢复正常—>更改记录status=1;此时status列和status_default列的值分别为1,0—>发送短信—>更改记录status_default=1;此时status列和status_default列的值分别为1,1—>交换机已经,不发送短信。
从上可以看出交换机经历了四个状态的改变:
status_now |
status_default |
结果 |
1 |
1 |
正常,无短信通知 |
0 |
1 |
宕机,短信通知 |
0 |
0 |
再次检测宕机,无短信通知 |
1 |
0 |
恢复正常,短信通知 |
我们只要判断四种状态然后从host表中取出交换机描述(description)组合成字符串提交给飞信api即可。
- include_once 'conn.php';
- $sql="select id,hostname,status_fail_date,status_rec_date from `cacti`.`host`;";
- $query=mysql_query($sql) or die(mysql_error());
- $nums=mysql_num_rows($query);
- if($nums!=0){
- while($rs=mysql_fetch_array($query)){
- if(strtotime($rs['status_fail_date'])>strtotime($rs['status_rec_date'])){
- $sql1="update `cacti`.`host` set `status_now`='0' where `host`.`id`=".$rs['id'];
- $query1=mysql_query($sql1);//判断交换状态宕机更改数据库ststus_now值为0
- }
- if(strtotime($rs['status_fail_date'])<=strtotime($rs['status_rec_date'])){
- $sql2="update `cacti`.`host` set `status_now`='1' where `host`.`id`=".$rs['id'];
- $query2=mysql_query($sql2);//判断交换状态正常更改数据库ststus_default值为1
- }
- }
- }
- ?>
- include_once "status.php";
- $sql="select description,status_fail_date,status_rec_date,status_now,status_default from `cacti`.`host`;";
- $query=mysql_query($sql) or die(mysql_error());
- $nums=mysql_num_rows($query);
- if($nums!=0){
- while($rs=mysql_fetch_array($query)){
- if($rs['status_fail_date']>$rs['status_rec_date']){
- $sql1="update `cacti`.`host` set `status_now`='0' where `host`.`id`=".$rs['id'];
- $query1=mysql_query($sql1);
- }
- else if($rs['status_fail_date']<=$rs['status_rec_date']){
- $sql2="update `cacti`.`host` set `status_now`='1' where `host`.`id`=".$rs['id'];
- $query2=mysql_query($sql2);
- }
- //交换机状态不正常,发送短信
- if(($rs['status_now'==0])&&($rs['status_default']==1)){
- $msg=$rs['description'].":down;";//短信内容
- $sql3="update `cacti`.`host` set `status_default`='0' where `host`.`id`=".$rs['id'];
- $query3=mysql_query($sql3);
- }
- //再次检测交换机状态不正常或交换机已经恢复正常,不发送短信
- else if(($rs['status_now']==1)&($rs['status_default']==1)||($rs['status_now']==0)&&($rs['status_default']==0)){
- $msg='';}//短信内容为空
- //交换机状恢复正常,发送短信
- else if(($rs['status_now']==1)&&($rs['status_default']==0)){
- $msg=$rs['description'].":recover up;";//短信内容
- $sql4="update `cacti`.`host` set `status_default`='1' where `host`.`id`=".$rs['id'];
- $query4=mysql_query($sql4);
- }
- $info=($info.$msg);//合并交换机状态为一条短信
- }
- $msg=$info;
- //调用飞信接口
- if(!empty($msg)){
- $username = 18756064346;//发送人手机号
- $password = *********;//发送人飞信密码
- $sendto = 18756064346;//飞信接收人手机号
- $curlPost = 'phone='.urlencode($username).'&pwd='.urlencode($password).'&to='.urlencode($sendto).'&msg='.$msg.'&type=0';
- echo $curlPost;
- $ch = curl_init();//初始化curl
- curl_setopt($ch,CURLOPT_URL,'http://3.ibtf.sinaapp.com/f.php');//抓取指定网页
- curl_setopt($ch, CURLOPT_HEADER, 0);//设置header
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//要求结果为字符串且输出到屏幕上
- curl_setopt($ch, CURLOPT_POST, 1);//post提交方式
- curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);
- $data = curl_exec($ch);//运行curl
- curl_close($ch);
- }else{
- echo "正常";
- }
- }
- ?>
|