水曜日, 9月 20, 2006

[program] HTTPサーバの状態チェック

ちょっとしたメモ。
HTTPサーバの状態チェック用 Perlプログラム。
SNMP Trapを送信するぞ。
------- hpc.pl ここから -------------
#!/usr/bin/perl

#
# HTTP Port Cheker for Perl
# Rev 1.0
# Auther: Myutaka
# Date: 2006/9/20
#

use Socket;

#
# 日付の取得
# フォーマット例:Mar 23 10:10:34
#
$DATETIME = `date`;
chop( $DATETIME );


# $MANAGER_NAME : SNMPマネージャの ホスト名 or IP-Address
$MANAGER_NAME = "192.168.1.1";

# snmptrapコマンドの設定
$SNMPTRAPCMD="/usr/bin/snmptrap";

# TRAP送信時のコミュニティ名の設定
$SNMPCOMMUNITY="public";

# 引数のチェック


if ( @ARGV == 0 ){
$HOSTNAME = "localhost";
$SOCKNUM = "80";
}elsif ( @ARGV == 1 ){
$HOSTNAME = $ARGV[0];
$SOCKNUM = "80";
} elsif ( @ARGV == 2 ) {
$HOSTNAME = "$ARGV[0]";
$SOCKNUM = "$ARGV[1]";
} else {
die "Usage : $myName hostName SocketNumber \n" ;
}


socket(SH, PF_INET, SOCK_STREAM, getprotobyname('tcp')) or die "fail\n";

my $HOSTIP = inet_aton($HOSTNAME) or die "$HOSTNAMEが見つかりません";
my $HOSTIPString = inet_ntoa($HOSTIP) or die "$HOSTNAMEがみつかりません";

my $sock = sockaddr_in ( $SOCKNUM, $HOSTIP);

eval {
connect (SH, $sock) || die "fail\n";
};
if ($@) {
$CMDLOG = `$SNMPTRAPCMD -v 1 -c $SNMPCOMMUNITY $MANAGER_NAME enterprises.26343 $HOSTIPString 6 1 '' .1.3.6.1.4.1.26343.1.1.1.2.1.1.$HOSTIPString.$SOCKNUM a $HOSTIPString .1.3.6.1.4.1.26343.1.1.1.2.1.2.$HOSTIPString.$SOCKNUM i $SOCKNUM .1.3.6.1.4.1.26343.1.1.1.2.1.3.$HOSTIPString.$SOCKNUM i 2`;
print "$DATETIME error, cannnot socket open";
exit(0);
};

$data = "HEAD / HTTP/1.0\n\n";
send(SH,$data,0);

$RCVSTAT = recv(SH,$bufbuf,255,MSG_PEEK);

shutdown(SH, 2);

#print "$bufbuf \n\n";

if ($bufbuf =~ /200 OK/){
print "$DATETIME success\n";
$CMDLOG=`$SNMPTRAPCMD -v 1 -c $SNMPCOMMUNITY $MANAGER_NAME enterprises.26343 $HOSTIPString 6 2 '' .1.3.6.1.4.1.26343.1.1.1.2.1.1.$HOSTIPString.$SOCKNUM a $HOSTIPString .1.3.6.1.4.1.26343.1.1.1.2.1.2.$HOSTIPString.$SOCKNUM i $SOCKNUM .1.3.6.1.4.1.26343.1.1.1.2.1.3.$HOSTIPString.$SOCKNUM i 3`;

}else{
print "$DATETIME onlySocketOK\n";
$CMDLOG=`$SNMPTRAPCMD -v 1 -c $SNMPCOMMUNITY $MANAGER_NAME enterprises.26343 $HOSTIPString 6 3 '' .1.3.6.1.4.1.26343.1.1.1.2.1.1.$HOSTIPString.$SOCKNUM a $HOSTIPString .1.3.6.1.4.1.26343.1.1.1.2.1.2.$HOSTIPString.$SOCKNUM i $SOCKNUM .1.3.6.1.4.1.26343.1.1.1.2.1.3.$HOSTIPString.$SOCKNUM i 1`;
}

exit(0);


-------------- ここまで ---------------------------