Cacti는 snmp 프로토콜을 통해 주기적으로 추가된 호스트의 상태를 모니터링합니다. Cacti 데이터베이스에는 호스트 테이블에는 상태(상태), 최신 다운타임 ( status_fail_date),최근 정상 복귀(status_rec_date). Fetion이 스위치 상태를 모니터링할 수 있도록 스위치가 다운되면 지정된 휴대폰 번호로 문자 메시지가 전송되며, 다운된 스위치에 대한 정보는 반복해서 보낼 수 없습니다. . 아이디어: 스위치 상태(다운될 때 한 번만 정보 전송)와 문자 메시지 전송 여부를 결정합니다. 호스트status_now)와 기본 스위치 상태(status_default) table >두 열의 기본값은 1은 정상을 의미하며 문자 메시지를 반복해서 보내지 않도록 마지막 스위치 상태와 비교하는 데 사용됩니다.
코드는 다음과 같습니다.
ALTER TABLE `호스트`
`status_now` 열 추가 char(2) `availability` 뒤에 NULL 기본값 '1';
ALTER TABLE `호스트`
`status_default` 열 추가 char(2) `status_now` 뒤에 NULL이 아닌 기본값 '1';
1. 최근 다운타임 >최근 복구 시간—>스위치 다운—> 기록 변경status=0;이때 status 열과 status_default열의 값은 0, 1—>입니다. SMS 보내기— >기록 변경status_default=0;현재상태 열 및 status_default 열 값은 0, 0— >스위치가 다시 내려진 것을 감지하고 문자 메시지를 반복해서 보내지 마세요;
2. 최근 다운타임 최근 복구 시간—>스위치가 정상으로 돌아옴—>기록 변경status=1;현재status 열과 status_default 열의 값은 1, 0—>SMS 보내기 —>기록 변경status_default=1;현재상태열과status_default 열의 값은 1, 1—>스위치가 닫혀 있고 문자 메시지가 전송되지 않습니다.
위에서 보면 스위치의 상태가 4번 변경되었음을 알 수 있습니다. :
상태_현재
상태_기본값
|
결과
|
1 |
1
|
정상, SMS 알림 없음
|
0 |
1
|
다운타임, SMS 알림
|
0 |
0
|
다운타임이 다시 감지되고 SMS 알림이 전송되지 않습니다
| |
1 |
0 |
정상 복귀, SMS 알림 |
네 가지 상태를 결정한 다음 host 테이블에서 스위치 설명(설명)을 꺼내서 다음과 같이 결합하면 됩니다. 문자열을 문자열로 만들어 Fetionapi에 제출하면 됩니다.
- include_once 'conn.php';
- $sql="`cacti`.`host`에서 id,hostname,status_fail_date,status_rec_date를 선택하세요. ";
- $query=mysql_query($sql) 또는 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="`선인장` 업데이트 .`host` set `status_now`='0' where `host`.`id`=".$rs['id'];
- $query1=mysql_query($sql1);//교환 상태 다운타임 확인 데이터베이스 ststus_now 값을 0으로 변경
- }
- if(strtotime($rs['status_fail_date'])<=strtotime($rs['status_rec_date'])){
- $sql2="update ` cacti `.`host` set `status_now`='1' where `host`.`id`=".$rs['id'];
- $query2=mysql_query($sql2);//교환 결정 상태가 정상입니다 데이터베이스 ststus_default 값을 1로 변경
- }
- }
- }
- ?>
코드 복사
- include_once "status.php";
- $sql="`cacti`에서 설명,status_fail_date,status_rec_date,status_now,status_default를 선택하세요.`host `;";
- $query=mysql_query($sql) 또는 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="`cacti`.`host` 업데이트 set `status_now`='0' where `host`.`id`=".$rs['id'];
- $query1=mysql_query($sql1);
- }
- else if($ rs['status_fail_date']<=$rs['status_rec_date']){
- $sql2="update `cacti`.`host` set `status_now`='1' 여기서 `host`.`id`= ".$rs['id'];
- $query2=mysql_query($sql2);
- }
- //스위치 상태가 비정상입니다. 문자 메시지를 보내주세요
- if(($rs[ 'status_now' ==0])&&($rs['status_default']==1)){
- $msg=$rs['description'].":down;";//SMS 콘텐츠
- $sql3= "`cacti`.`host` 업데이트 `status_default`='0' 설정, 여기서 `host`.`id`=".$rs['id'];
- $query3=mysql_query($sql3) ;
- }
- //스위치 상태가 비정상인지 스위치가 정상으로 돌아왔는지 다시 확인하고 SMS가 전송되지 않습니다
- 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'].":복구;";//SMS 콘텐츠
- $sql4="update `cacti`.`host` set `status_default` ='1' 여기서 `host`.`id`= ".$rs['id'];
- $query4=mysql_query($sql4);
- }
- $info=($info.$ msg);//스위치 상태를 문자 메시지로 병합
- }
- $msg=$info;
- //Fetion 인터페이스 호출
- if(!empty($msg)){
- $username = 18756064346;//발신자 휴대전화번호
- $ 비밀번호 = *********;//발송자 Fetion 비밀번호
- $sendto = 18756064346;//Fetion 수신자 휴대전화번호
- $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);//헤더 설정
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//결과가 문자열이어야 하고 다음으로 출력합니다. 화면
- curl_setopt($ch, CURLOPT_POST, 1);//post 제출 방법
- curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);
- $data = cur_exec($ch);//curl 실행
- curl_close($ch);
- }else{
- echo "normal";
- }
- }
- ?>
코드 복사
|