调用飞信接口实现cacti的监控通知
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即可。
<?php 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 } } } ?>
2. [代码]message.php 跳至 [1] [2] [全屏预览]
<?php 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 "正常"; } } ?>
- 上一篇:数组分类显示
- 下一篇:三个实用PHP消息函数