欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

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

程序员文章站 2022-06-08 10:12:06
...

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