#!/usr/bin/perl

#被監視サーバプログラム：

require "/opt/nec/wbmc/adm/z99msv/plurservers.pl";

use Socket;

# プロセスＩＤを持つ

if(!-e "$WBMC_MSVD_PID"){
	system("/bin/touch $WBMC_MSVD_PID");
	system("/bin/chown root:root $WBMC_MSVD_PID");
	system("/bin/chmod 755 $WBMC_MSVD_PID");
}

open(DATA, "> $WBMC_MSVD_PID") 
			or die("Can't open wbmcmsvd.pid:$!\n");

print DATA $$;
close (DATA);

# コマンドラインからポート番号を得る。

$port = shift || 50100;

# プロトコル番号を得る。

$proto=getprotobyname('tcp');

# listenするソケットをオープンする。

socket(ListenSock,PF_INET,SOCK_STREAM,$proto)
        or die("socket error$!\n");

# bindする

bind(ListenSock,sockaddr_in($port,INADDR_ANY))
   or die("bins error：$!\n");

# listenする

listen(ListenSock,SOMAXCON);

# 待機し、接続要求があればデータを返す

#print "ポート番号：$port で待機開始\n";

# 接続があった場合接続先のホスト名を返す

while($sockaddr=accept(ConnectSock,ListenSock)){
   select(ConnectSock); $|=1; select(STDOUT);

# 監視サーバからのメッセージを受け取りメッセージの内容解析

	$transmsg = "";
	while (<ConnectSock>){
		$_ =~ s/\s+//g;
		if($_ eq "getdata"){
			$transmsg = "OK\n";
			last;
		}
		else{
			$transmsg = "NG\n";
			$transmsg .= "getdata以外のメッセージを受け取りました。\n";
			goto SEND;
		}
	}

# サーバ運用形態のチェック

	$server = "";
	$server = &server_TypeChk();

	if($server eq "NG"){
		$transmsg = "";
		$transmsg .= "NG\n";
		$transmsg .= "servertypeの取得に失敗しました\n";
		goto SEND;
	}

	$transmsg .= "<SERVER>\n";

	if($server eq "Standalone"){
		$transmsg .= "10\n";
	}elsif($server eq "MailCluster"){
		if(&cluster_MasterChk() =~ /master/){
			$transmsg .= "20\n";
		}elsif(&cluster_MasterChk() =~ /slave/){
			$transmsg .= "21\n";
		}
		$transmsg .= &server_IP();
	}elsif($server eq "WebLoadbalance"){
		if(&cluster_MasterChk() =~ /master/){
			$transmsg .= "30\n";
		}elsif(&cluster_MasterChk() =~ /slave/){
			$transmsg .= "31\n";
		}
		$transmsg .= &server_IP();
	}

	$transmsg .= "</SERVER>\n";

# webserverのport番号取得

	$transmsg .= "<PORT>\n";

	#if(&cluster_MasterChk() =~ /master/){ #RH7.3対応 20030320 m
	#	if(!(&readDataFile("/etc/httpd/conf/shadow_wbmc.conf", *line))){
	#		$transmsg = "";
	#		$transmsg .= "NG\n";
	#		$transmsg .= "webserverのport番号取得に失敗しました\n";
	#		goto SEND;
	#	}
	#} else {
		if(!(&readDataFile("/etc/httpd/conf/wbmc.conf", *line))){
			if($server ne "MailCluster") {
				$transmsg = "";
				$transmsg .= "NG\n";
				$transmsg .= "webserverのport番号取得に失敗しました\n";
				goto SEND;
			}
			else {
				push(@line, "Listen 0.0.0.0:0000\n");
			}
        	}
	#}
	
 	for ($i = 0; $i < @line; $i++) {
		if($line[$i] =~ /^Listen/){
			$transmsg .= $line[$i];
		}
	}

# mailserverのport番号取得

	if(!(&readDataFile("/opt/nec/mail/mail.conf", *line))){
		if($server ne "MailCluster") {
			$transmsg = "";
			$transmsg .= "NG\n";
			$transmsg .= "mailserverのport番号取得に失敗しました\n";
			goto SEND;
		}
		else {
			push(@line, "pop_port=0000\n");
			push(@line, "pop_sport=0000\n");
			push(@line, "imap_port=0000\n");
			push(@line, "imap_port=0000\n");
		}
	}

	for ($i = 0; $i < @line; $i++) {
		if($line[$i] =~ /^imap_port/ || $line[$i] =~ /^imap_sport/ || $line[$i] =~ /^pop_port/ || $line[$i] =~ /^pop_sport/){
				$transmsg .= "$line[$i]";
		}
	} 

# mail-httpdserverのport番号取得
#
#	if(!(&readDataFile("/opt/nec/mail/httpd.conf", *line))){
#		$transmsg = "";
#		$transmsg .= "NG\n";
#		$transmsg .= "mail-httpdserverのport番号取得に失敗しました\n";
#		goto SEND;
#	}
#
#	for ($i = 0; $i < @line; $i++) {
#		if($line[$i] =~ /^http_port/ || $line[$i] =~ /^http_sport/){
#			$transmsg .= "$line[$i]";
#		}
#	} 

# webmail-httpdserverのport番号取得
        if(!(&readDataFile("/etc/opt/nec/webmail-httpd/conf/webmail-httpd.conf", *line))){
                if($server ne "MailCluster") {
                        $transmsg = "";
                        $transmsg .= "NG\n";
                        $transmsg .= "webmail serverのport番号取得に失敗しました\n";
                        goto SEND;
                }
                else {
                        push(@line, "Listen 0.0.0.0:0000\n");
                }
        }

        #$transmsg .= "<PORT>\n";
        for ($i = 0; $i < @line; $i++) {
                if($line[$i] =~ /^Listen\s+([\d]+)/){
                        $transmsg .= "webmail-httpd=$1\n";
                }
        }

	$transmsg .= "</PORT>\n";

# netstatの実行結果

	if(!open(DATA, "/bin/netstat -autn |")){
		$transmsg = "";
		$transmsg .= "NG\n";
		$transmsg .= "netstat 失敗\n";
		goto SEND;
	}
	
	$transmsg .= "<NETSTAT>\n";

	while(<DATA>){
		@file = ();
		@file = split(/\s+/,$_);
		if($file[0] eq "tcp" && $file[5] eq "LISTEN"){
			$transmsg .= $_;
		}elsif($file[0] eq "udp"){
			$transmsg .= $_;
		}
	}
	close(DATA);

	$transmsg .= "</NETSTAT>\n";

# systemstat その他のサービス(chksvc等)状態を取得

	# chksvcの状態
	if(!open(STAT, "/opt/nec/wbmc/adm/service/97chksvc/upcheck.sh |")){
		$transmsg = "";
		$transmsg .= "NG\n";
		$transmsg .= "systemstat 失敗\n";
		goto SEND;
	}

	$transmsg .= "<SYSTEMSTAT>\n";

	while(<STAT>){
		$transmsg .= "chksvc:";
		if ($_  =~ /^up/) {
			$transmsg .= "on\n";
		} else {
			$transmsg .= "off\n";
		}
	}
	close(STAT);

	$transmsg .= "</SYSTEMSTAT>\n";

	SEND:

	print ConnectSock "$transmsg\n";
	print ConnectSock "last_data";

	close(ConnectSock);
}

# 終了
close(ListenSock);
exit;
