<?php
/*************************************************************************************************
    Name    : watch_firewall.php
    Acthion : バックグラウンドでfirewallをpingで監視して、
          落ちてたらリセットスイッチを繋いでやる。
          
          /etc/rc.d/rc.localに起動コマンドを追加して使う。

    Spec.   : pingを5発打って全く帰ってこなかったらRBIOでリセット。
          5分毎に確認するけど、リセット直後は10分待つ。
          自身の起動とリセット動作時にログ記録。

                                2008.07.14 Ver.0.01  Genki wrote
                                2008.07.27 Ver.0.02  Genki edit.

    仕様
    Ver.0.01    とりあえず。
    
    Ver.0.02    ログファイルに自スクリプト起動時刻と、リセット動作時刻を記録するように。

***************************************************************************************************/
//各種設定
$logfile "/home/…/…/rbio/watch_firewall.log";    //ログファイル
$timestamp date("[Y-m-d H:i:s]");    //ログファイルに書き込むタイムスタンプ

//ログファイルに起動した旨書き込む
$fp fopen($logfile,'a');
fputs($fp,"\n\n{$timestamp}\t---Start to watch firewall---\n\n");
fclose($fp);

while(
1){    //無限ループ
    //pingを5発発射する。
    
$msg =  `ping -c 5 firewall.hibi`;

    
//100%返事がなかったら死んでると思われるのでリセット。
    
if(ereg("100%",$msg)){
        
//RBIO接続
        
while(1){    //接続出来るまで何度もリトライ
            
$sock fsockopen("rbio",14000,$errorno,$errormsg,3);
            if(
$sock) break;
            
sleep(1);
        }

        
//リセットスイッチを1秒間押す。
        
fputs($sock,"PCT2010\n");    //PCTnttt:n番目のリレーをttt*100msec動作させる。
        
fgets($sock,16);
        
$res fgets($sock,16);
        
fclose($sock);    //用事が済んだらクローズ

        //ログファイルにリセットした時刻を書き込む。
        
$timestamp date("[Y-m-d H:i:s]");
        
$fp fopen($logfile,'a');
        
fputs($fp,"{$timestamp}\tReset the firewall machine.\n");
        
fclose($fp);

        
sleep(600);    //再起動中はping返ってこないので10分待機
        
continue;    //待機後whileの先頭に。
    
}

    
//100%じゃない限りは生きてると思うので何もしない。
    
sleep(300);    //5分ごとのチェックでいいかな。
}