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即可。
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`.`host` set `status_now`='1' where `host`.`id`=.$rs['id'];$query2=mysql_query($sql2);//判断交换状态正常更改数据库ststus_default值为1}}}?>
复制代码
$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();//初始化curlcurl_setopt($ch,curlopt_url,'http://3.ibtf.sinaapp.com/f.php');//抓取指定网页curl_setopt($ch, curlopt_header, 0);//设置headercurl_setopt($ch, curlopt_returntransfer, 1);//要求结果为字符串且输出到屏幕上curl_setopt($ch, curlopt_post, 1);//post提交方式curl_setopt($ch, curlopt_postfields, $curlpost);$data = curl_exec($ch);//运行curlcurl_close($ch);}else{ echo 正常;}}?>
复制代码