首頁  >  文章  >  後端開發  >  呼叫飛信介面實現cacti的監控通知

呼叫飛信介面實現cacti的監控通知

WBOY
WBOY原創
2016-07-25 09:01:53960瀏覽

Cacti每間隔一段時間透過snmp協定監測已新增的主機狀態,在Cacti資料庫中, host表記錄交換機的相關信息,如狀態(status),最近宕機時間),最近宕機時間( status_fail_date),最近恢復正常時間(status_rec_date)。要實現飛信監控交換器狀態,交換器down了就發短信到指定的手機號上,而且宕機的交換器資訊不能重複發。思路:判斷交換器狀態(宕機只傳送一次訊息),是否發送簡訊。在host表中新增交換器目前狀態(status_now)和預設交換器狀態(status_status_sol >兩列,其預設值皆為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列的值分別為0

0 >再次偵測交換器宕機,不重複發送簡訊; 2.最近宕機時間最近恢復時間—>交換器恢復正常—交換器恢復正常—更改記錄status=1;此時status欄位和status_default列的值分別為10>發送簡訊>發送簡訊—>更改記錄status_default=1;此時

status

此時

status此時1— >>
status

此時status

此時
status

此時status

這列和
status_default

列的值分別為1

1

1

1

1

1

1

交換器已經,不發送簡訊。 從上可以看出交換器經歷了四個狀態的改變:

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`.``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_nowstatcacti from ```cacti​​d. ``cacti fromstatus_nowstatcact.``h. ;";
  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. curl_close($ch);
  49. }else{}
  50. }
?>
複製程式碼


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn