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列的值分別為0,1—>—>發送簡訊>發送簡訊>更改記錄status_default=0;此時status列和status_default列的值分別為0 ,0———— >再次偵測交換器宕機,不重複發送簡訊;
2.最近宕機時間最近恢復時間—>交換器恢復正常—交換器恢復正常—更改記錄status=1;此時status欄位和status_default列的值分別為1,0—>發送簡訊>發送簡訊—>更改記錄status_default=1;此時 status此時 status
此時
status 此時status 此時 |
status 此時status 這列和 |
status_default 列的值分別為1 , |
1
— 1— 1 |
— 1— 1 |
— 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'])$sql2="update `cacti`.``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_nowstatcacti from ```cactid. ``cacti fromstatus_nowstatcact.``h. ;";
- $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']$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{
- curl_close($ch);
- }else{}
- }
?>
複製程式碼
|