Cacti は、snmp プロトコルを通じて追加されたホストのステータスを定期的に監視します。Cacti データベースでは、host テーブルにステータス () などのスイッチの関連情報が記録されます。 status )、最新のダウンタイム時間(status_fail_date)、最新の復旧時間(status_rec_date)。 Fetion がスイッチのステータスを監視できるようにするため、スイッチがダウンすると、指定された携帯電話番号にテキスト メッセージが送信されますが、ダウンしたスイッチに関する情報は繰り返し送信できません。アイデア: スイッチのステータス (ダウン時に情報を 1 回だけ送信) とテキスト メッセージを送信するかどうかを決定します。スイッチの現在のステータス (status_now) とデフォルトのスイッチのステータス (status_default) を host テーブルに追加します。デフォルト値は両方とも 1 です。通常。テキスト メッセージの繰り返しを避けるために、上記の 1 つのスイッチのステータス比較とともに使用されます。
コードは次のとおりです:
ALTER TABLE `ホスト`
`availability` の後に列 `status_now` char(2) NOT NULL デフォルト '1' を追加します
ALTER TABLE `ホスト`
`status_now` の後に列 `status_default` char(2) NOT NULL DEFAULT '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 列とstatus_default列の値はそれぞれ1、1—> スイッチはまだありませんSMSを送信しました。
上記から、スイッチは 4 つのステータス変化を経験したことがわかります:
status_now |
status_default |
結果 |
1 |
1 |
通常、SMS 通知なし |
0 |
1 |
ダウンタイム、SMS 通知 |
0 |
0 |
ダウンタイムが再び検出されました。SMS 通知はありません
|
1 |
0 |
通常のSMS通知に戻ります |
4 つの状態を決定し、host テーブルからスイッチの説明 (description) を取り出し、それを文字列に結合して Fetionapi に送信するだけです。
- include_once 'conn.php';
- $sql="select id,hostname,status_fail_date,status_rec_date from `cacti`.`host`;";
- $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="更新 `cacti`.`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="更新 `cacti`.`host` set `status_now`='1' where `host`.`id`=".$rs['id'] ;
- $query2=mysql_query($sql2);//交換ステータスを判断し、データベースの ststus_default 値を 1 に変更します
- }
- }
- }
- ?>
コードをコピー
- include_once "status.php";
- $sql="`cacti`.`host` から description,status_fail_date,status_rec_date,status_now,status_default を選択;";
- $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="`cacti`.`host を更新します` set `status_now`='1' where `host`.`id`=".$rs['id'];
- $query2=mysql_query($sql2);
- }
- //スイッチのステータスが異常なので、SMSを送信
- if(($rs['status_now'==0])&&($rs['status_default']==1)){
- $msg=$rs['description'].":down;";// SMS コンテンツ
- $sql3="update `cacti`.`host` set `status_default`='0' where `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='';}// テキスト メッセージコンテンツは空です
- //スイッチのような回復 通常、SMS を送信します
- else if(($rs['status_now']==1)&&($rs['status_default']==0)){
- $msg=$ rs['description'].":recover up;";//SMS コンテンツ
- $sql4="update `cacti`.`host` set `status_default`='1' where `host`.`id`=。 $rs['id'];
- $ query4=mysql_query($sql4);
- }
- $info=($info.$msg);// スイッチのステータスをテキスト メッセージにマージします
- }
- $msg=$info ;
- //Fetion インターフェースを呼び出します
- if(!empty ($msg)){
- $username = 18756064346;//送信者の携帯電話番号
- $password = *********;//送信者の 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');//キャッチ Web ページを指定します
- curl_setopt($ch, CURLOPT_HEADER, 0);//ヘッダーを設定します
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//結果が文字列を取得して画面に出力します
- curl_setopt($ch, CURLOPT_POST, 1) ;//投稿メソッド
- curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);
- $data =curl_exec($ch);//curlを実行します
- curl_close($ch);
- }else{
- echo "normal";
- }
- }
- ?>
コードをコピー
|