当前位置:Gxlcms > PHP教程 > 调用飞信接口实现cacti的监控通知

调用飞信接口实现cacti的监控通知

时间:2021-07-01 10:21:17 帮助过:23人阅读

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列的值分别为01>发送短信—>更改记录status_default=0;此时status列和status_default列的值分别为00>再次检测交换机宕机,不重复发短信;

2.最近宕机时间<=最近恢复时间—>交换机恢复正常—>更改记录status=1;此时status列和status_default列的值分别为10>发送短信—>更改记录status_default=1;此时status列和status_default列的值分别为11>交换机已经,不发送短信。

从上可以看出交换机经历了四个状态的改变:

status_now

status_default

结果

1

1

正常,无短信通知

0

1

宕机,短信通知

0

0

再次检测宕机,无短信通知

1

0

恢复正常,短信通知

我们只要判断四种状态然后从host表中取出交换机描述(description)组合成字符串提交给飞信api即可。

  1. include_once 'conn.php';
  2. $sql="select id,hostname,status_fail_date,status_rec_date from `cacti`.`host`;";
  3. $query=mysql_query($sql) or die(mysql_error());
  4. $nums=mysql_num_rows($query);
  5. if($nums!=0){
  6. while($rs=mysql_fetch_array($query)){
  7. if(strtotime($rs['status_fail_date'])>strtotime($rs['status_rec_date'])){
  8. $sql1="update `cacti`.`host` set `status_now`='0' where `host`.`id`=".$rs['id'];
  9. $query1=mysql_query($sql1);//判断交换状态宕机更改数据库ststus_now值为0
  10. }
  11. if(strtotime($rs['status_fail_date'])<=strtotime($rs['status_rec_date'])){
  12. $sql2="update `cacti`.`host` set `status_now`='1' where `host`.`id`=".$rs['id'];
  13. $query2=mysql_query($sql2);//判断交换状态正常更改数据库ststus_default值为1
  14. }
  15. }
  16. }
  17. ?>
  1. include_once "status.php";
  2. $sql="select description,status_fail_date,status_rec_date,status_now,status_default from `cacti`.`host`;";
  3. $query=mysql_query($sql) or die(mysql_error());
  4. $nums=mysql_num_rows($query);
  5. if($nums!=0){
  6. while($rs=mysql_fetch_array($query)){
  7. if($rs['status_fail_date']>$rs['status_rec_date']){
  8. $sql1="update `cacti`.`host` set `status_now`='0' where `host`.`id`=".$rs['id'];
  9. $query1=mysql_query($sql1);
  10. }
  11. else if($rs['status_fail_date']<=$rs['status_rec_date']){
  12. $sql2="update `cacti`.`host` set `status_now`='1' where `host`.`id`=".$rs['id'];
  13. $query2=mysql_query($sql2);
  14. }
  15. //交换机状态不正常,发送短信
  16. if(($rs['status_now'==0])&&($rs['status_default']==1)){
  17. $msg=$rs['description'].":down;";//短信内容
  18. $sql3="update `cacti`.`host` set `status_default`='0' where `host`.`id`=".$rs['id'];
  19. $query3=mysql_query($sql3);
  20. }
  21. //再次检测交换机状态不正常或交换机已经恢复正常,不发送短信
  22. else if(($rs['status_now']==1)&($rs['status_default']==1)||($rs['status_now']==0)&&($rs['status_default']==0)){
  23. $msg='';}//短信内容为空
  24. //交换机状恢复正常,发送短信
  25. else if(($rs['status_now']==1)&&($rs['status_default']==0)){
  26. $msg=$rs['description'].":recover up;";//短信内容
  27. $sql4="update `cacti`.`host` set `status_default`='1' where `host`.`id`=".$rs['id'];
  28. $query4=mysql_query($sql4);
  29. }
  30. $info=($info.$msg);//合并交换机状态为一条短信
  31. }
  32. $msg=$info;
  33. //调用飞信接口
  34. if(!empty($msg)){
  35. $username = 18756064346;//发送人手机号
  36. $password = *********;//发送人飞信密码
  37. $sendto = 18756064346;//飞信接收人手机号
  38. $curlPost = 'phone='.urlencode($username).'&pwd='.urlencode($password).'&to='.urlencode($sendto).'&msg='.$msg.'&type=0';
  39. echo $curlPost;
  40. $ch = curl_init();//初始化curl
  41. curl_setopt($ch,CURLOPT_URL,'http://3.ibtf.sinaapp.com/f.php');//抓取指定网页
  42. curl_setopt($ch, CURLOPT_HEADER, 0);//设置header
  43. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//要求结果为字符串且输出到屏幕上
  44. curl_setopt($ch, CURLOPT_POST, 1);//post提交方式
  45. curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);
  46. $data = curl_exec($ch);//运行curl
  47. curl_close($ch);
  48. }else{
  49. echo "正常";
  50. }
  51. }
  52. ?>

人气教程排行