<?PHP
/*************************************************************************************************

    Name    : logrotate.php

    Acthion : 各サービスのログファイルを定期的にチェックして、
          指定サイズを超えてたら日付付きファイル名に移動して
          該当サービスを再読み込みする。
          cronで実行する。
    
    Spec.   : |---------+-------+-----------------------------------|
          |daemon   | limit | logfile                |
          |---------+-------+-----------------------------------|
          |httpd    | 256MB | /var/log/httpd/error_log        |
          |        | 256MB | /var/log/httpd/access_log        |
          |        | 256MB | /var/log/httpd/smup_error_log    |
          |        | 256MB | /var/log/httpd/smup_access_log    |
          |---------+-------+-----------------------------------|
          |syslogd  |  32MB | /var/log/messages            |
          |        |  16MB | /var/log/secure            |
          |        | 256MB | /var/log/maillog            |
          |        |  16MB | /var/log/spooler            |
          |        |  32MB | /var/log/boot.log            |
          |        |  32MB | /var/log/cron            |
          |---------+-------+-----------------------------------|
          |named    | 128MB | /var/log/named/named.log        |
          |        | 256MB | /var/log/named/queries.log    |
          |---------+-------+-----------------------------------|
          |procmail | 256MB | /var/log/procmail            |
          |---------+-------+-----------------------------------|

                                2006.09.23 Ver.0.01  Genki wrote
                                2006.09.25 Ver.0.02  Genki edit.
                                2006.09.25 Ver.0.03  Genki edit.
                                2006.09.26 Ver.0.04  Genki edit.
                                2006.09.26 Ver.0.05  Genki edit.
                                2006.09.27 Ver.0.06  Genki edit.
                                2006.09.27 Ver.0.07  Genki edit.
                                2006.09.28 Ver.0.08  Genki edit.
                                2006.10.02 Ver.0.10  Genki edit.
                                2006.11.05 Ver.0.20  Genki edit.
                                2006.11.07 Ver.0.21  Genki edit.
                                2007.03.17 Ver.0.211 Genki edit.
                                2008.04.27 Ver.0.30  Genki edit.
                                2008.12.12 Ver.0.31  Genki edit.
                                200*.**.** Ver.*.**  Genki will...

    仕様
    Ver.0.01    エラーログをバックアップする。(cronで実行)
    
    Ver.0.02    写メあぷログとアクセスログも。

    Ver.0.03    ファイルサイズをチェックして1GB超えてたときだけ移動するように変更。
            移動した場合はhttpdを再起動して報告メール発射。

    Ver.0.04    移動先ディレクトリのサイズが10GB超えたら報告メール発射。
            移動先をMyDocuments/httpd_logs/に変更
    
    Ver.0.05    いろいろ変数&繰り返し化。
        
    Ver.0.06    ファイル移動後に自分に名義変更するようにした。(FTPで扱いやすくするため)
    
    Ver.0.07    httpd再起動に失敗した場合に携帯にメール発射。
    
    Ver.0.08    HDDの残りが少なくなったら警告メール。
    
    Ver.0.10    httpd restartじゃなくてhttpd reloadにした。これでいけるっぽい。

    Ver.0.20    ファイル名をhttpd_mv_errorlog.phpからlogrotate.phpに変更。
            いろいろなログに対応。
            ログファイルを移動するリミットサイズをファイルごとに設定できるようにした。
            ログ移動先をMyDocuments/logs/に変更。

    Ver.0.21    ファイル移動してくれなかった致命的なバグを修正w

    Ver.0.211    リミットサイズ変更。
            (error_log,access_log,smup_error_log,smup_access_log,,queries.logを512MBから256MBへ)

    Ver.0.30    1日複数回実行するため、-0で始まる通し番号を付けるように修正。

    Ver.0.31    procmailを追加。

    未実装        メール発射だけじゃなくてsyslogに動作記録を。
    
***************************************************************************************************/
//各種設定
$esc_dir "/home/genkikko/MyDocuments/logs/";    //ログ移動先(最後スラッシュ)

//確認データ    "logfile",フルパスで書く            "limitsize", bytes        "daemon"
$file[] = array(logfile=>"/var/log/httpd/smup_access_log",    limitsize=>256*1024*1024,    daemon=>"httpd");
$file[] = array(logfile=>"/var/log/httpd/error_log",        limitsize=>256*1024*1024,    daemon=>"httpd");
$file[] = array(logfile=>"/var/log/httpd/access_log",        limitsize=>256*1024*1024,    daemon=>"httpd");
$file[] = array(logfile=>"/var/log/httpd/smup_error_log",    limitsize=>256*1024*1024,    daemon=>"httpd");
$file[] = array(logfile=>"/var/log/messages",            limitsize=>32*1024*1024,    daemon=>"syslogd");
$file[] = array(logfile=>"/var/log/secure",            limitsize=>16*1024*1024,    daemon=>"syslogd");
$file[] = array(logfile=>"/var/log/maillog",            limitsize=>256*1024*1024,    daemon=>"syslogd");
$file[] = array(logfile=>"/var/log/spooler",            limitsize=>16*1024*1024,    daemon=>"syslogd");
$file[] = array(logfile=>"/var/log/boot.log",            limitsize=>32*1024*1024,    daemon=>"syslogd");
$file[] = array(logfile=>"/var/log/cron",            limitsize=>32*1024*1024,    daemon=>"syslogd");
$file[] = array(logfile=>"/var/log/named/named.log",        limitsize=>128*1024*1024,    daemon=>"named");
$file[] = array(logfile=>"/var/log/named/queries.log",        limitsize=>256*1024*1024,    daemon=>"named");
$file[] = array(logfile=>"/var/log/procmail",            limitsize=>256*1024*1024,    daemon=>"procmail");

//killコマンド送るフラグの初期化
//確認データの"daemon"の中身の種類とそろえる
$kill_flag = array(httpd=>0,syslogd=>0,named=>0,procmail=>0);

$user "genkikko";    //ファイル移動後に名義変更するID
$group "admin";    //とグループ

$report_mail_address "admin@genkikko.net";    //普通のメッセージを送るアドレス
$warning_mail_address "ひみつ@?.vodafone.ne.jp";            //警告を送るアドレス

//イニシャライズ
$dat NULL;        //メール本文用変数
$date date("Ymd");    //YYYYMMDD取得



/************************************* ログファイル操作 *****************************************
動作
    それぞれのファイルサイズを取得して、
    基準サイズ超えてるのがあったら移動先に日付つきで移動して該当デーモンの$kill_flagをたてる。
    移動後のファイルの持ち主を自分のに。(sambaで扱いたいから。)

既存変数
    $kill_flag    FALSEで初期化してる。
    $esc_dir    移動先
    $file[]        移動するファイルの情報が入った配列
    $dat        メール本文に入れるあれ。空っぽに初期化されてる。
********************************************************************************************************/
for($i=0;$file[$i];$i++){                    //定義されたすべてのログファイルに対して
    
$size filesize($file[$i]['logfile']);            //それぞれのファイルのサイズを取得して
    
if($size $file[$i]['limitsize']){            //リミットと比較。超えてるものに関しては
        
$moving_file $file[$i]['logfile'];        //移動前ファイル名(フルパス)
        
$basename basename($moving_file);        //ファイル名抽出
        //移動先ファイル名の決定
        
for($n=0;;$n++){
            
$moved_file "{$esc_dir}{$basename}.bak.{$date}-{$n}";
            if(!
file_exists($moved_file)){
                
$moved_archive str_replace(".bak",null,$moved_file);
                
$moved_archive "{$moved_archive}.zip";
                if(!
file_exists($moved_archive)){
                    break;
                }
            }
        }
        
exec("mv $moving_file $moved_file");        //移動する
        
exec("chown {$user}:{$group} $moved_file");    //所有者変更
        
$kill_flag[$file[$i]['daemon']] |= TRUE;    //TRUEとの論理和を取って該当デーモンのkillフラグを立てる
        
$dat .= "\n".$moving_file;            //メール本文にファイル名を追加
    
}
}

/************************************* デーモンリロード&報告メール発射 *****************************************
動作
    $kill_flagが立ってたらそれぞれのデーモンをリロードして報告メールを発射する。
    失敗したら警告メール発射。
既存変数
    $kill_flag        立ってたら動く。
    $report_mail_address    報告メアド
    $warning_mail_address    警告メアド
********************************************************************************************************/
if($kill_flag['httpd']){
    
exec("/etc/rc.d/init.d/httpd reload",$httpd_reboot_msg);
}

if(
$kill_flag['syslogd']){
    
exec("kill -HUP `cat /var/run/syslogd.pid`");
}

if(
$kill_flag['named']){
    
exec("rndc reload");
}

if(
$kill_flag['procmail']){
    
touch("/var/log/procmail");
    
chmod("/var/log/procmail",0666);
}

if(
mb_ereg("失敗",$httpd_reboot_msg[0])){
    
mb_send_mail("$report_mail_address,$warning_mail_address",
         
'警告:httpd再起動失敗',"httpdのリロードに失敗しました。\n\nfrom:httpd_mv_errorlog.php\n\n",'from:server-master@genkikko.net');
}

//報告メール発射
if($dat){    //一回でも$kill_flagが立ってたら$datが空じゃなくなってる。
    
$body "報告$dat\nが指定サイズを超えたのでファイル移動および該当サービスをリロードしました。\n\nサービスの稼動状況を確認してください。\n\nhttp://www.genkikko.net/c_status.php\n\n";
    
mb_send_mail("$report_mail_address",'報告:デーモンリロード',$body,'from:server-master@genkikko.net');
}


/************************************* 移動先ディレクトリサイズ確認&報告 ******************************
動作
    ログファイル移動先が10GBを超えてたら警告メール発射。
既存変数
    $esc_dir        移動先ディレクトリ名
    $report_mail_address    報告メアド
    $warning_mail_address    警告メアド
********************************************************************************************************/
$res opendir($esc_dir);                //ディレクトリリソース
for($i=0;$ent[$i] = readdir($res);$i++){}        //ファイル名を配列に取り込む
for($i=2,$dir_size=0;$ent[$i];$i++){            //$i=0,1は./と../なのでパス。
    
$dir_size += filesize("{$esc_dir}{$ent[$i]}");    //ディレクトリサイズを加算。
}

$dir_size_gb round($dir_size/1073741824,2);        //1GBで割って小数点以下2桁までに四捨五入。
if($dir_size_gb >= 10){                    //10GB超えてたらメール発射。
    
$body "ログファイルディレクトリのサイズが10GBを超えました。\n現在のログディレクトリサイズは{$dir_size_gb}GBです。";
    
mb_send_mail("$report_mail_address,$warning_mail_address",'警告:ログサイズ',$body,'from:server-master@genkikko.net');
}


/************************************* メインHDD残り容量確認&報告 ******************************
動作
    メインHDDの残り容量が10GBを切ったら警告メール発射。
既存変数
    $esc_dir        移動先ディレクトリ名
    $report_mail_address    報告メアド
    $warning_mail_address    警告メアド
********************************************************************************************************/
$df = `df /dev/hda -m`;                //-m:MB単位で。
while(ereg("  ",$df)){                //2連スペースを全部
    
$df ereg_replace("  "," ",$df);    //単体スペースに変換してから
}
$df split(" ",$df);                //スペースで分けると
$df_gb round($df[8]/1024,2);            // $df[8];が空き容量(MB)になる

if($df[8]<10240){
    
$body "butagoriraの残り容量が10GBを切りました。\n現在の残り容量は{$dir_size_gb}GBです。";
    
mb_send_mail("$report_mail_addres,$warning_mail_address",'警告:残り容量',$body,'from:server-master@genkikko.net');
}

/*************************************************************************************************/



?>