chknightlylog 5.23 KB
#! /usr/sbin/perl

######################################################################
#
# nightly.log を解析して、メールで報告するツール
#
#                            作成者   橋田貴之
#
######################################################################
#
#  $Revision: 1.1.1.2 $
#  $Date: 2002/10/29 08:05:46 $
#  $Source: /root/leakn64/depot/rf/sw/n64os20l/admin/tools/chknightlylog,v $
#
######################################################################


$root = $ENV{'ROOT'};
$tmpdir = $ENV{'TMP'} || $ENV{'TMPDIR'} || '/tmp';
$result = "${tmpdir}/tmp_result_chknightlylog";
$log_file_name = "${root}/nightly.log"; # デフォルト
$errorFlag = 0;
$nomail = 0;

#
# オプションの取得
#
$reportResultOnly = 0;
$toWhom = "";

while( @ARGV ){
    $sw = shift;

    if ( $sw =~ /^-/ ) {

	if ( $sw eq "-q" ){
	    $reportResultOnly = 1;
	} elsif ( $sw eq "-h" ){
	    &usage;
	    exit(0);
	} elsif ($sw eq "-m"){
	    $toWhom = shift;
	    &usage, exit(1) if $toWhom eq "";
	} elsif ($sw eq "-n"){
	    $nomail = 1;
	} else {
	    &usage;
	    exit(1);
	}

    } else {
	$log_file_name = $sw;
	last;
    }
}

&usage, exit(1) if $#ARGV != -1;

if ($toWhom eq ""){
    $toWhom = $ENV{'LOGNAME'};
}

#
# ログファイルのオープン
#
open(LOG, $log_file_name) || die "Can't open log file\n";
while(<LOG>){
    chop;

    if (/MAKE CLOBBER/) {
	$a = 0;
    } elsif (/CVS UPDATE/) {
	$a = 1;
    } elsif (/MAKE HEADERS/) {
	$a = 2;
    } elsif (/MAKE EXPORTS/) {
	$a = 3;
    } elsif (/MAKE INSTALL/) {
	$a = 4;
    }

    if ($a == 0) {
	push(@makeClobber, $_);
    } elsif ($a == 1) {
	push(@cvsUpdate, $_);
    } elsif ($a == 2) {
	push(@makeHeaders, $_);
    } elsif ($a == 3) {
	push(@makeExports, $_);
    } elsif ($a == 4) {
	push(@makeInstall, $_);
    }

}
close(LOG);

#
# 結果を格納するファイルをオープン
#
#open(RESULT, ">$result") || die;
#select(RESULT);
if ($nomail == 0) {
    open(RESULT, "| nkf | mail ${toWhom}@rd3") || die;
    select(RESULT);
}

print "Subject: Nightly build result\n";
print "ナイトリービルドの結果報告です。\n";
print "\n";

#
# MAKE CLOBBER
#
if (grep(/\*\*\* Error/ || ($_ =~ /line [0-9]*:/ && $_ !~ /(W|w)arning/),
	 @makeClobber)){
    print "make clobber 実行中にエラーが起きました。\n";
    $errorFlag = 1;
}


#
# CVS UPDATE
# 
foreach(@cvsUpdate){
    if (/^U (.*)$/) {
	push(@updatedFiles, $1);
    } elsif (/^C (.*)$/) {
	push(@conflictedFiles, $1);
    } elsif (/^M (.*)$/) {
	push(@modifiedFiles, $1);
    } elsif (/^A (.*)$/) {
	push(@addedFiles, $1);
    } elsif (/^R (.*)$/) {
	push(@removedFiles, $1);
    } elsif (/^\? (.*)$/) {
	push(@hatenaFiles, $1);
    } elsif (/^cvs \[update aborted\]:/) {
	print "cvs update 実行中にエラーが起きました。\n";
	$errorFlag = 1;
    } elsif (/^cvs update: warning: (.*) is not \(any longer\) pertinent/) {
	push(@deletedFiles, $1);
    }
}

#
# MAKE HEADERS
#
if (grep(/\*\*\* Error/ || ($_ =~ /line [0-9]*:/ && $_ !~ /(W|w)arning/),
	 @makeHeaders)){
    print "make headers 実行中にエラーが起きました。\n";
    $errorFlag = 1;
}


#
# MAKE EXPORTS
#
if (grep(/\*\*\* Error/ || ($_ =~ /line [0-9]*:/ && $_ !~ /(W|w)arning/),
	 @makeExports)){
    print "make exports 実行中にエラーが起きました。\n";
    $errorFlag = 1;
}

#
# MAKE INSTALL
#
if (grep(/\*\*\* Error/ || ($_ =~ /line [0-9]*:/ && $_ !~ /(W|w)arning/),
	 @makeInstall)){
    print "make install 実行中にエラーが起きました。\n";
    $errorFlag = 1;
}


#
# 総合結果報告
#
if ($errorFlag == 0){
    print "ナイトリービルドは成功しました。\n";
}

#
# cvs に関する情報詳細
#
if (!$reportResultOnly){

    print "\n--------------------------------------------------\n";
    print "以下は、cvs のログから得られたファイルの詳細情報です。\n";

    if (@conflictedFiles){
	print "\nコンフリクトの起きたファイル (管理者に相談してください):\n";
	foreach(@conflictedFiles){print "\t$_\n";}
    }

    if (@updatedFiles){
	print "\n変更された(あるいは追加された)ファイル:\n";
	foreach(@updatedFiles){print "\t$_\n";}
    }

    if (@deletedFiles){
	print "\n消去されたファイル:\n";
	foreach(@deletedFiles){print "\t$_\n";}
    }

    if (@modifiedFiles){
	print "\nローカルで変更しているファイル:\n";
	foreach(@modifiedFiles){print "\t$_\n";}
    }

    if (@addedFiles){
	print "\nadd したけど commit していないファイル (commit し忘れてませんか?):\n";
	foreach(@addedFiles){print "\t$_\n";}
    }

    if (@removedFiles){
	print "\nremove したけど commit していないファイル (commit し忘れてませんか?):\n";
	foreach(@removedFiles){print "\t$_\n";}
    }

    if (@hatenaFiles){
	print "\ncvs 管理外のファイル (気にしないでください):\n";
	foreach(@hatenaFiles){print "\t$_\n";}
    }

} # -q オプションが指定されていなかった場合

close(RESULT);


sub usage {
    print "\n";
    print "usage: chknightlylog [-h] [-q] [-m name] [-n] [logfilename]\n";
    print "\tナイトリーログを解析して、結果をメールで報告します\n\n";
    print "\t-h: このヘルプを出力します。\n";
    print "\t-q: 単にナイトリーが成功したかどうかを報告します\n";
    print "\t    デフォルトでは、ファイルの変更状況等に関する情報も報告します\n";
    print "\t-m: 結果を name@rd3 に報告します。デフォルトはログイン名を使用します。\n";
    print "\t-n: 結果をメールで報告するのではなく、標準出力に出します。\n\n";
    print "\tlogfilename を指定すると、そのファイルを解析します。\n";
    print "\tデフォルトは \$ROOT/nightly.log です。\n\n";
}