#!/usr/bin/perl

# Copyright (C) 2000 NEC Corporation
# All Rights Reserved.

# RCS: $Id: wbmc_cluster_init,v 1.1 2006/12/22 05:33:58 shodai Exp $

##001226 v5.1 wbmc.confのVirtualHost IP化対応	.oku
##010111 ---- インストール時のエラーメッセージ対応（";"がなかった行に";"付加）	.oku(haramoto)
##010301 v4.0.1 WebログローテートのFailOver対応				Hori
##010305 v4.0.1 webalizer/aliases 関係のFailOver対応暫定(～3/8)		Hori
##010416 v4.0.1 Webログファイル固定対応		Hori
##010529 v4.0.2 ログローテートバグ対応		Hori
##010705 v4.1.0  \Q ～ \E 対応 S.Oku
##010726 v4.10 webalizer用 アクセスログ データマージ処理  haramoto
##011101 v4.30 システム管理者名変更機能対応  Oku
##070305 v7.0.1 ロックの解除もれに対応 sakai

require "/opt/nec/wbmc/lib/wbmc.pl";
require join ("/",$WBMC_ADM_DIR,"system/backup/date.pl");
require "/opt/nec/wbmc/domain/adm/httpd/rotate.pl";
require "/opt/nec/wbmc/domain/lib/wbmc.pl";				##010301 &getDomainConf()

#$ifconfig_prog = '/sbin/ifconfig';							## 010529 del 未使用
$ifup_prog = "/etc/sysconfig/network-scripts/ifup";
$ifdown_prog = "/etc/sysconfig/network-scripts/ifdown";
# add 20021016 matumura
if (!&readFile("/etc/sysconfig/network", "NETWORK", *line)) {
    exit(1);
}
for ($i = 0; $i <= $#line; $i++) {
    if ($line[$i] =~ /^GATEWAYDEV/) {
        @dev_line = split(/=/, $line[$i]);
        $device = $dev_line[1];
        chop($device);
    }
}
$base_if = $device;
#$base_if = 'eth0';
$alias_suffix = '201';
$base_network_script = "/etc/sysconfig/network-scripts/ifcfg-$base_if";
$mirror_vip_config_file = "/etc/opt/nec/wbmc/mirror_vip_ifcfg-$base_if:$alias_suffix";

$tag_name = "wbmc_cluster"							;#cluster add
$log_file = "/var/log/wbmc_cluster" 				;#cluster add

$wbmccluster_type_lock = "wbmcclustertype";
$wbmccluster_master_lock = "wbmcclustermaster";
$wbmccluster_type	   = "/etc/opt/nec/cluster_flg";

#
# バックアップコマンド
#
# usage: wbmc_cluster_init [-s|-r|-m on|-m off|-d|-c|-w|-k]
#		 -s 	起動時にコール
#		 -r 	自ホストの状態を返却する（リモートからコール）
#		 -m [on|off]  
#		 -d 	最終ミラーリング日付を表示（リモートからコール）
#		 -c 	コールされたサーバにファイルをコピーする（リモートからコール）
#		 -w	  	サーバ名を書き込む
#		 -k	  	共有ディスクからシステムディスクにコピーする
#		 -a     ミラーリングの場合に起動時にファイルの同期を取る。
#
# 戻り値: 成功:0
#		  失敗:1
#

require "/opt/nec/wbmc/lib/wbmc.pl";

# 引数処理
$argerr = 0;
$argerrmsg = "";
$run_type = "";
my($server_ip);
my($ret);
$ret = 0;

for ($i = 0; $i < @ARGV; $i++) {
	if ($ARGV[$i] eq "-m") {
		if ($i == $#ARGV) {
			$argerrmsg = "'$ARGV[$i]'";
			$argerr = 1;
			next;
		}
		$i++;
		if ($ARGV[$i] eq "on"){
			$run_type = "on";
		}elsif($ARGV[$i] eq "off"){
			$run_type = "off";
		}else{
			$argerrmsg = "'$ARGV[$i]'";
			$argerr = 1;
		}
	} elsif ($ARGV[$i] eq "-c") {
		$run_type = "c";
		$i++;
		if ($i != $#ARGV  ) {
			$argerrmsg = "'$ARGV[$i]'";
			$argerr = 1;
			next;
		}
		$server_ip = $ARGV[$i];
	} elsif ($ARGV[$i] eq "-w") {
		$run_type = "w";
		$i++;
		if ($i != $#ARGV  ) {
			$argerrmsg = "'$ARGV[$i]'";
			$argerr = 1;
			next;
		}
		$server_name = $ARGV[$i];
	} elsif ($ARGV[$i] eq "-r") {
		$run_type = "r";
	} elsif ($ARGV[$i] eq "-s") {
		$run_type = "s";
	} elsif ($ARGV[$i] eq "-d"){
		$run_type = "d";
	} elsif ($ARGV[$i] eq "-k"){
		$run_type = "k";
	} elsif ($ARGV[$i] eq "-a"){
		$run_type = "a";
	}else{
		$argerrmsg = "'$ARGV[$i]'";
		$argerr = 1;
	}
}
if ($argerr) {
	&writeError("invalid argment $argerrmsg", "");
	exit(1);
}

if($run_type eq "s"){
	$ret = &wbmc_up_check();
}elsif($run_type eq "on"){
	$ret = &master_flg_on();
}elsif($run_type eq "off"){
	$ret = &master_flg_off();
}elsif($run_type eq "r"){
	$ret = &remote_flg_check();
}elsif($run_type eq "d"){
	$ret = &date_get();
}elsif($run_type eq "w"){
	$ret = &write_server($server_name);
}elsif($run_type eq "c"){
	$ret = &remote_ftp_put($server_ip);
}elsif($run_type eq "k"){
	$ret = &copy_system_disk();
}elsif($run_type eq "a"){
	$ret = &copy_rsync_disk();
}


&writeLog(" wbmc_cluster_init end " . $run_type . "  " . $ret , $tag_name, $log_file);


exit($ret);


#起動後のチェック（クラスタもミラーも）
sub wbmc_up_check{
	
	my($ret);
	$ret = 0;

	$cluster_type = &cluster_typechk();
	$master = &cluster_masterchk();
	
	# スタンドアロンの場合：何もしない
	if ($cluster_type eq "") {
		goto done;
	}
	if ($cluster_type eq "cluster") {
		########### Failoverクラスタの場合：##################
		# なにもしない
		if ($master eq "master") {
			############ マスタの場合 #############3
			#スレーブに最新のファイルを送信する。
		#	$error_message = &cluster_sysfile_file_copy_all();
		#	if($error_message ne ""){
		#		&writeLog("cluster_sysfile_file_copy_all err " .$error_message , "wbmc_cluster", "/var/log/wbmc_cluster");
		#	}
		}else{
			############ スレーブの場合 #############
			#なにもしない
			#双方向フェィルオーバであれば、マスタから最新のファイルをもらう必要がある。
		}
		goto done;
	}
	if ($cluster_type ne "mirror") {
		&writeLog("cluster_type err", "wbmc_cluster", "/var/log/wbmc_cluster");
		goto done;
	}

	########### ミラーリングの場合：##################
	# ロードバランスの場合
	# 全ホストからマスタを捜す。
	@result = &wbmc_dc_rsh("/opt/nec/wbmc/bin/wbmc_cluster_init -r ");

	$master_flg = 0;
	$master_ip	= "";
	for ($i = 0; $i < @result; $i++) {
		if ($result[$i]->[2] =~ /master/) {
			$master_flg = 1;
			$master_ip	= $result[$i]->[0];
		}
		&writeLog("result ipaddres = $result[$i]->[0] status = $result[$i]->[1] message = $result[$i]->[2]",
					 "wbmc_cluster", "/var/log/wbmc_cluster");
	}

	# マスタの場合	：他のホストにマスタがいなければ、マスタになる。
	# 他にマスタがいればスレーブになる。
	
&writeLog(" wbmc_cluster_init 01 " . $master_flg , $tag_name, $log_file);
	if ($master eq "master") {
		if($master_flg){
			# 他のホストにフラグが立ってたらフラグをOFF。
			&master_flg_mod("off");
		}else{
			# 他のホストにフラグが立っていなければ自分がマスタになる。
			&master_flg_mod("on");
		}	
	}

	$ret = 1;
done:
	return($ret);
	
}

#起動後のファイルの同期
sub copy_rsync_disk{
	
	my($ret);
	$ret = 0;

	$cluster_type = &cluster_typechk();
	$master = &cluster_masterchk();

	if ($cluster_type ne "mirror") {
		goto done;
	}

       ########### ミラーリングの場合：##################
        # ロードバランスの場合
        # 全ホストからマスタを捜す。
        @result = &wbmc_dc_rsh("/opt/nec/wbmc/bin/wbmc_cluster_init -r ");

        $master_flg = 0;
        $master_ip      = "";
        for ($i = 0; $i < @result; $i++) {
                if ($result[$i]->[2] =~ /master/) {
                        $master_flg = 1;
                        $master_ip      = $result[$i]->[0];
                }
                &writeLog("result ipaddres = $result[$i]->[0] status = $result[$i]->[1] message = $result[$i]->[2]",
                                         "wbmc_cluster", "/var/log/wbmc_cluster");
        }

	if ($master eq "master") {
		############ マスタの場合 #############3
		#スレーブに最新のファイルを送信する。
		$error_message = &cluster_sysfile_file_copy_all();
		if($error_message ne ""){
			&writeLog("cluster_sysfile_file_copy_all err " .$error_message , "wbmc_cluster", "/var/log/wbmc_cluster");
		}
               $rc = system("/opt/nec/wbmc/bin/wbmc_mirroring &");
                if ($rc) {
                        &writeLog("**** mirroring failed", "wbmc_mirroring", "/var/log/wbmc_cluster");
                }
		#logrotate.d/apach の更新
		&wbmc_rotate_chk; 
	}else{
		# スレーブの場合：マスタから最新のファイルをもらう。
		############ スレーブの場合 #############
		#マスタのサーバを検索 IP をGET
		if($master_ip ne ""){
			#自分のIPをGET
			$my_ip = my_server_ip_get();
			#ミラーリング前の管理者名をGET
			&getSysAdminName(*adminname);
			$oldadminname = $adminname{'ADMIN'};
			
			if($my_ip ne ""){
				#マスタサーバにコマンドを実行
				# マスタのcluster_ftp_alldel()を実行
				$msg = "function wbmc_up_check : " . "$my_ip :  $master_ip" ;
				&writeLog($msg, "wbmc_cluster", "/var/log/wbmc_cluster");
				@result = &wbmc_dc_rsh_sigle_host("/opt/nec/wbmc/bin/wbmc_cluster_init -c $my_ip", "$master_ip", "root");
				for ($i = 0; $i < @result; $i++) {
					chomp($result[$i]->[2]);
					&writeLog("result ipaddres = $result[$i]->[0] status = $result[$i]->[1] message = $result[$i]->[2]",
								 "wbmc_cluster", "/var/log/wbmc_cluster");
				}
			}else{
				$msg = "function wbmc_up_check : my ip not found" ;
				&writeLog($msg, "wbmc_cluster", "/var/log/wbmc_cluster");
			}
			#ミラーリング後の管理者名をGET
			&getSysAdminName(*adminname);
			$newadminname = $adminname{'ADMIN'};
			if ($oldadminname ne $newadminname) {
				&chgAdminDir_cluster($oldadminname,$newadminname);
			}
		}else{
			$msg = "function wbmc_up_check : master not found" ;
			&writeLog($msg, "wbmc_cluster", "/var/log/wbmc_cluster");
		}
		
		#logrotate.d/apach の更新
		&wbmc_rotate_chk; 

                # quotacheck 実行(/home)
                system("/sbin/quotaoff /home > /dev/null 2>&1");
                system("/sbin/quotacheck -gu /home > /dev/null 2>&1");
                system("/sbin/quotaon /home > /dev/null 2>&1");

		goto done;
	}
	

	$ret = 1;
done:
	return($ret);
	
}


#
# 名前
#	master_flg_on - 自分のマスタフラグを ON にする。
# 形式
#	master_flg_on()
# 引数
#	
# 戻り値
#	成功（マスタフラグを立てた）	1
#	失敗（他のマシンにマスタがいる）0
sub master_flg_on{

	local(*LOCK);
	my($ret);
	my($lockfileflag);

	$ret = 0;
	$lockfileflag = 0;

	#ファイルをロックしておく
	#マスタフラグが立っていない状態で、他のホストをチェックする。
	#他のホストを見ている時に、他のホストからチェックされた場合
	#同時にマスタフラグを立てるのをさけるための処理。
	if (!&lockFile($wbmccluster_master_lock, $WBMC_LOCK_R_NB, *LOCK)) {
		goto done;
	}
	$lockfileflag = 1;

	#全ホストのフラグをチェック
	@result = &wbmc_dc_rsh("/opt/nec/wbmc/bin/wbmc_cluster_init -r ");
	
	for ($i = 0; $i < @result; $i++) {
		if ($result[$i]->[2] =~ /master/) {
			$master_flg = 1;
		}
		&writeLog("result ipaddres = $result[$i]->[0] status = $result[$i]->[1] message = $result[$i]->[2]",
					 "wbmc_cluster", "/var/log/wbmc_cluster");
	}
	
	# 他のホストにフラグが立ってたら失敗
	if($master_flg){
		&writeLog(" cluster_type error ", $tag_name, $log_file);
		goto done;
	}
	#フラグON
	if(!&master_flg_mod("on")){
		&writeLog(" cluster_type error ", $tag_name, $log_file);
		goto done;
	}
	
	$ret = 1;

done:
	if ($lockfileflag != 0) {
## ロックの解除もれに対応 070305
		flock(LOCK,8);
		close(LOCK);
	}

	return($ret);

}

#
# 名前
#	master_flg_off - 自分のマスタフラグを OFF にする。
# 形式
#	master_flg_off()
# 引数
#	
# 戻り値
#	成功（マスタフラグをOFFにした）    1
#	失敗							   0
#無条件にフラグをOFFにする。
sub master_flg_off{
	my($ret);
	$ret = 0;

	if(!&master_flg_mod("off")){
		&writeLog(" cluster_type error ", $tag_name, $log_file);
		goto done;
	}
	$ret = 1;
done:
	return($ret);
}

#
# 名前
#	remote_flg_check - 自サーバのフラグをチェックする。
#					   他サーバから呼ばれる。
#						自サーバがマスタ、またはマスタになろうとしている
#						場合"master" と出力
# 形式
#	remote_flg_check()
# 引数
#	
# 戻り値
#	他のマシンにマスタフラグが立っている	0
#	他のマシンにマスタフラグが立っていない	
#	マスタになっても良い					1
sub remote_flg_check{

	my($cluster_type);
	my($master);
	my($ret);
	$ret = 0;

	$cluster_type = &cluster_typechk();
	$master = &cluster_masterchk();
	# スタンドアロンの場合：何もしない
	if ($cluster_type eq "") {
		goto done;
	}
	# Failoverクラスタの場合：何もしない
	if ($cluster_type eq "cluster") {
		goto done;
	}
#&writeLog(" cluster_type error11-"  . $master  ."-  " .$cluster_type, $tag_name, $log_file);# chikita test
	if ($cluster_type ne "mirror") {
		&writeLog(" cluster_type error ", $tag_name, $log_file);
		goto done;
	}
#&writeLog(" cluster_type error121 ", $tag_name, $log_file);# chikita test
	if ($master ne "master") {
		#スレーブの場合
		#フラグをONにしているか（マスタになろうとしている）。
		if (&lockFile($wbmccluster_type_lock, $WBMC_LOCK_R_NB, *LOCK)) {
## ロックの解除もれに対応 070305
			flock(LOCK,8);
			close(LOCK);
#&writeLog(" cluster_type error12321 ".$master , $tag_name, $log_file);# chikita test
			goto done;
		}
		#フラグをONにしようとしている（マスタになろうとしている）。
	}
		
	$ret = 1;

done:
	if($ret){
		print STDOUT "master\n";
	}else{
		print STDOUT "slave\n";
	}

	return($ret);

}


#flg :	 on|off
# 戻り値
#	ok		 :1
#	ng		 :0
sub master_flg_mod{
	my($flg) = @_;
	my($ret);

	$ret = 0;

	@list = ();
	if($flg eq "on"){
		push(@list ,"master\n");
		&writeLog("** master set ** " , $tag_name, $log_file);
	}else{
		push(@list ,"slave\n");
		&writeLog("** slave set ** " , $tag_name, $log_file);
	}

	#
	# ファイル内容変更
	#
	if (!&writeFile($wbmccluster_type, $wbmccluster_type_lock, @list)) {
		&writeLog($wbmccluster_type  ." set err " , $tag_name, $log_file);
		goto done;
	}

	if($flg eq "on"){
		$fqdn = &getClusterHostName();
		&enable_mirror_vip($fqdn, "true");
	}else{
		$fqdn = &getClusterHostName();
		&disable_mirror_vip($fqdn, "true");
	}

	$ret = 1;

done:
	return($ret);

}


sub writeError {
	local($msg, $item) = @_;

	$msg =~ s/\s*$//;
	if ($item ne "") {
		$msg = "[$item]$msg";
	}
	&writeLog($msg, $tag_name, $log_file);
	print STDERR "$tag_name:$msg\n";
}

#リモートからコールされる。
sub date_get{
	
	my($last_file) = '/etc/opt/nec/wbmc_dc.last_rsync';
	my($date,$server);
	my($master);
	$master = &cluster_masterchk();
#	$cat_proc = '/bin/cat';				## 010529 del 未使用
	my($last_server) = '/etc/opt/nec/wbmc_dc.saver';

	if(-e $last_file){
		$date = &mkdatestr("/etc/opt/nec/wbmc_dc.last_rsync");
	}else{
		$date = '----' ;
	}
#	open(IN, $cat_proc . "  " . $last_server);
	open(IN, $last_server);
	while (<IN>) {
#		print $_;
		$server = $_;
		$server =~ s/\s*//;
	}
	close(IN);
	if($server  eq ""){
		$server = "----";
	}
	print STDOUT "$master , $server , $date";

}

#リモートからコールされる。
#ファイルを指定サーバにコピーする。
sub remote_ftp_put{
	my($ipaddr) = @_;
	my($err);
	
	$err =  &cluster_sysfile_file_copy($ipaddr);
        $rc = system("/opt/nec/wbmc/bin/wbmc_mirroring &");
        if ($rc) {
             &writeLog("**** mirroring failed", "wbmc_mirroring", "/var/log/wbmc_cluster");
        }
#print $err ."\n";
	return;
}

#リモートからコールされる。
#ミラーリング元のサーバ名をミラーリング先に書き込む
sub write_server{
	my($server_name) = @_;

	$server_name =~ s/\s*//;

        open(OUT, "> /etc/opt/nec/wbmc_dc.saver");
        print(OUT $server_name);
        close(OUT);
	
	return;
}

## cluster_server ファイルを読み込む
sub my_server_ip_get {
	my($file) = '/etc/opt/nec/cluster_server';
    #  格納場所）
    #         /etc/opt/nec/cluster_server
    #  形式）
    #         IPアドレス  サーバ名 [m|o]
    #         自サーバは、"m" をつける。
    #         他サーバは、"o" をつける。
    #  例）
    #         10.8.45.111       server1  o
    #         10.8.45.112       server2  m
    #         10.8.45.113       server3  o
    #         10.8.45.114       server4  o
    my @server_list = ();
    open(INFILE, $file);
    while(<INFILE>) {
		$line = $_;
		if ($line !~ /\s*[0-9]+\./) {
		    next;
		}
		@server = split(/\s/, $line, 3);
		$me_flag = $server[2];
		if ($me_flag =~ /m/) {
		    close(INFILE);
		    return $server[0];
		}
    }
    close(INFILE);
    return "";
}

#共有ディスクからシステムファイルにコピーする。
sub copy_system_disk{
##
    $cluster_type = &cluster_typechk();
    if ($cluster_type ne "cluster") {
        return ;
    }

	# /etc/cron.daily/wbmc_webalizer をすべて削除	010308 add app4.0
	&wbmc_webalizer_alldel();

	#コピー前の管理者名取得
	&getSysAdminName(*adminname);
	$oldadminname = $adminname{'ADMIN'};

	&cluster_disk_sysfile_file_copy();

	#コピー後の管理者名取得
	&getSysAdminName(*adminname);
	$newadminname = $adminname{'ADMIN'};

	if ($oldadminname ne $newadminname) {
		&chgAdminDir_cluster($oldadminname,$newadminname);
	}

	#logrotate.d/apach の更新
	&wbmc_rotate_chk();				##010301

##010305 kokokara
	#/etc/cron.daily/wbmc_webalizer_ドメイン名 のチェック
	&wbmc_webalizer_dirchk();
##010305 kokomade

##010516 reload を restart に変更
	system("/etc/rc.d/init.d/wbmchttpd restart > /dev/null 2>&1");	
	return;
}

#########################################
#  cluster mirror network setup
#########################################
sub get_mirror_vip_setup {
    my($master_fqdn) = @_;
    my $addr = (gethostbyname($master_fqdn))[4];
    $addr = sprintf("%u.%u.%u.%u", unpack("C*", $addr));
    open(BASE_CFG, $base_network_script);
    while(<BASE_CFG>) {
	if (/^NETMASK/) {
	    $base_netmask = $_;
	    $base_netmask =~ s/NETMASK\s*=\s*([0-9\.]+).*/$1/;
	    chomp($base_netmask);
	    next;
	}
	if (/^NETWORK/) {
	    $base_network = $_;
	    $base_network =~ s/NETWORK\s*=\s*([0-9\.]+).*/$1/;
	    chomp($base_network);
	    next;
	}
	if (/^BROADCAST/) {
	    $base_broadcast = $_;
	    $base_broadcast =~ s/BROADCAST\s*=\s*([0-9\.]+).*/$1/;
	    chomp($base_broadcast);
	    next;
	}
    }
    return  $addr, $base_netmask, $base_network, $base_broadcast;
}

sub write_mirror_vip_setup {
    my($addr, $netmask, $network_addr, $broadcast_addr) = @_;
    my $date = `/bin/date +%Y%m%d%H%M%S`;
    chomp($date);
    my $tmp_file = 
	$mirror_vip_config_file . '.tmp' . $date . $$;
    open(TMP_FILE, ">$tmp_file") or die 'tmp work file write error';
    print TMP_FILE "DEVICE=$base_if:$alias_suffix\n";
    print TMP_FILE "IPADDR=$addr\n";
    print TMP_FILE "NETMASK=$netmask\n";
    print TMP_FILE "NETWORK=$network_addr\n";
    print TMP_FILE "BROADCAST=$broadcast_addr\n";
    close(TMP_FILE);
    rename $tmp_file, $mirror_vip_config_file;
}

# enable_mirror_vip('full.host.name', 1);
sub enable_mirror_vip {
    my($fqdn, $update_setup) = @_;
    $SIG{INT} = $SIG{HUP} = $SIG{QUIT} = $SIG{TERM} =  $SIG{PIPE} = 'IGNORE';
    if($update_setup) {
	&write_mirror_vip_setup(&get_mirror_vip_setup($fqdn));
    }
    system("$ifup_prog $mirror_vip_config_file");
    $SIG{INT} = $SIG{HUP} = $SIG{QUIT} = $SIG{TERM} =  $SIG{PIPE} = 'DEFAULT';
}

sub disable_mirror_vip {
    my($fqdn, $update_setup) = @_;
    $SIG{INT} = $SIG{HUP} = $SIG{QUIT} = $SIG{TERM} =  $SIG{PIPE} = 'IGNORE';
    if($update_setup) {
	&write_mirror_vip_setup(&get_mirror_vip_setup($fqdn));
    }
    system("$ifdown_prog $mirror_vip_config_file");
    $SIG{INT} = $SIG{HUP} = $SIG{QUIT} = $SIG{TERM} =  $SIG{PIPE} = 'DEFAULT';
}

############################################################################
#  <名称>
#        getClusterHostName (クラスタ向けホスト名関数)
#  <仕様>
#        /etc/opt/nec/cluster_hostnameファイルよりクラスタ向けのホスト名を取得
#  <形式>
#       getClusterHostName()
#  <引数>
#        なし
#  <戻り値>
#        正常終了 :  クラスタ向けホスト名
#        異常終了 :  -1
#
############################################################################

sub getClusterHostName()
{
  local(@tmp,$fqdnname);
# $rtn_code="";				## 010529 del 未使用
  $fqdnname = -1;

  if(!open(IN, "/bin/cat /etc/opt/nec/cluster_hostname |")){
    return($fqdnname);
  }
  @tmp = <IN>;
  $fqdnname = $tmp[0];
  $fqdnname =~ s/^\s*//;
  $fqdnname =~ s/\s*$//;
  close(IN);

  return($fqdnname);
}

#############################
# 仮想ドメイン用の Web ログローテートファイルをマスタとスレーブで同期をとる。
# wbmc.conf に設定ありの場合、logrotate.d/apache ファイルに設定なしでは追加する。
# wbmc.conf に設定なしの場合、logrotate.d/apache ファイルに設定ありでは削除する。
sub wbmc_rotate_chk {
	local (@lines,@lines_sv);								##010301
	my($i);
	my(@serverport);	# = logname  010416
	my($port,$servernamed,$i_sv,$domainmode,$logfile);		##010301

	# wbmc.confを読み込む
	@lines = ();
	if (!&readFile("/etc/httpd/conf/wbmc.conf", "wbmc.conf", *lines)) {
		return(-1);
	}

	# wbmc.conf -> rotate チェック
	## VirtualHost IP化にともなう修正  001226 S.Oku
	for ($i = 0; $i <= $#lines; $i++) {
		if ($lines[$i] =~ /^\s*<VirtualHost\s+([^\s]+):([^\s]+)\s*>/i) {
			$port = $2;
			$port =~ s/^\s+//;
			$port =~ s/\s+$//;
		}
		elsif ($lines[$i] =~ /^\s*ServerName\s+([^\s]+)\s*/i) {
			$servername = $1;
			$servername =~ s/^\s+//;
			$servername =~ s/\s+$//;
		}
		elsif ($lines[$i] =~ /^\s*ErrorLog\s+\/var\/log\/httpd\/error_log.([^\s]+)\s*/i) {	##010416
			$serverport = $1;																##010416
		}
		elsif ($lines[$i] =~ /^\s*<\/VirtualHost>/i) {
#			$serverport = join("-",$servername,$port);		##010111	010416 
			##010301 kokokara
			$i_sv = $i;
			@lines_sv = @lines;
			$domainmode = &getDomainConf($servername, "MODE");
			$i = $i_sv;
			@lines = @lines_sv;
			##010301 kokomade
			if (&check_rotate($serverport) == 0 && $domainmode eq "VIRTUAL") {		##010301
				&write_rotate($serverport, $serverport);
			}
		}
	}

	# rotateファイルを読み込む
	@lines = ();
	if (!&readFile("/etc/logrotate.d/apache", "apache", *lines)) {
		return(-1);
	}

	# rotate -> wbmc.conf チェック
	for ($i = 0; $i <= $#lines; $i++) {
		if ($lines[$i] =~ /^(\s*|##WbMC#\s*)\Q\/var\/log\/httpd\/error_log.\E/) {	##010301	## 010529 rep
			@serverport = split(/error_log\./, $lines[$i]);
			@serverport = split(/\s*\{/, $serverport[1]);
#			$serverport[0] =~ s/-/:/;								##010301
			if (&check_wbmc($serverport[0]) == 0) {
#				$serverport[0] =~ s/:/-/;							##010301
				$servername = $serverport[0];	##010726
				$servername =~ s/-ssl$//;		##010726
				&write_rotate($serverport[0], "");
				# ログファイルを削除する							##010301
				while($logfile = </var/log/httpd/*>){
##010726 	if($logfile =~ /^\/var\/log\/httpd\/(error|access)_log\.\Q$serverport[0]\E(|\.\d+)$/){
# rep kokokara
					if($logfile =~ /^\/var\/log\/httpd\/(error|access)_log\.\Q$serverport[0]\E(|\.\d+)$/ ||
					   $logfile =~ /^\/var\/log\/httpd\/access_log\.\Q$servername\E\.mrg$/ ||
					   $logfile =~ /^\/var\/log\/httpd\/access_log\.\Q$servername\E\.mrg1$/ ||
					   $logfile =~ /^\/var\/log\/httpd\/access_log\.\Q$servername\E\.mrg2$/){
# rep kokomade
						unlink($logfile);
					}
				}
			}
		}
	}


	return(0);
}

#############################
# 仮想ドメインが logrotate.d/apache ファイルに存在するか否かをチェックする。
# 引数  ：$vhost：仮想ドメイン名-ポート番号
# 戻り値：-1：エラー 
#          0：存在しない
#          1：存在する
sub check_rotate {
	my($vhost) = @_;
	my($rtn_code) = 0;
	local(@lines) = ();
	my($i) = 0;

	# rotateファイルを読み込む
	if (!&readFile("/etc/logrotate.d/apache", "apache", *lines)) {
		return(-1);
	}

	for ($i = 0; $i <= $#lines; $i++) {
		if ($lines[$i] =~ /^(\s*|##WbMC#\s*)\Q\/var\/log\/httpd\/error_log.$vhost\E\s*\{\s+$/) {	##010301	## 010529 rep
			$rtn_code = 1;
			last;
		}
	}
	return ($rtn_code);		##010111
}

#############################
# 仮想ドメインが wbmc.conf ファイルに存在するか否かをチェックする。
# 引数  ：$vhost：仮想ドメイン名-ポート番号
# 戻り値：-1：エラー 
#          0：存在しない
#          1：存在する
sub check_wbmc {
	my($vhost) = @_;
	my($rtn_code) = 0;
	local(@lines) = ();
	my($i) = 0;
	my($serverport,$port,$servername);					##010301

	# wbmc.confを読み込む
	if (!&readFile("/etc/httpd/conf/wbmc.conf", "wbmc.conf", *lines)) {
		return(-1);
	}

	# wbmc.conf -> rotate チェック						##010301
	for ($i = 0; $i <= $#lines; $i++) {
		if ($lines[$i] =~ /^\s*<VirtualHost\s+([^\s]+):([^\s]+)\s*>/i) {
			$port = $2;
			$port =~ s/^\s+//;
			$port =~ s/\s+$//;
		}
		elsif ($lines[$i] =~ /^\s*ServerName\s+([^\s]+)\s*/i) {
			$servername = $1;
			$servername =~ s/^\s+//;
			$servername =~ s/\s+$//;
		}
		elsif ($lines[$i] =~ /^\s*ErrorLog\s+\/var\/log\/httpd\/error_log\.([^\s]+)\s*/i) {	##010416
			$serverport = $1;																##010416
		}
		elsif ($lines[$i] =~ /^\s*<\/VirtualHost>/i) {
#			$serverport = join("-",$servername,$port);	##010416
			if ($serverport eq $vhost) {
				$rtn_code = 1;
				last;
			}
		}
	}

	# 自ホスト名の取得									##010301
	my($hostname);
	chomp($hostname = `hostname`);
	if ($vhost eq $hostname || $vhost eq "$hostname-ssl") {		## 010529 rep
		$rtn_code = 1;
	}

	return ($rtn_code);		##010111
}

#############################
# /etc/cron.daily/wbmc_webalizer_ドメイン名 ファイルをすべて削除する。
# ↓に変更 # 20030205 matumura
# /opt/nec/wbmc/bin/webalizer.daily/wbmc_webalizer_ドメイン名 ファイルをすべて削除する。
# 仮想ドメインが対象で、実ドメインはそのまま。
# 引数  ：なし
# 戻り値：なし
sub wbmc_webalizer_alldel {
	#my($cron_dir) = "/etc/cron.daily";
	my($cron_dir) = "/opt/nec/wbmc/bin/webalizer.daily";
	my($i,$mode,$hostname,$domainname);
	local(@filelist);

	chomp($hostname = `hostname`);
	&file_get($cron_dir, *filelist);
	for ($i = 0; $i < @filelist; $i++) {
		$filelist[$i] =~ s/^\s*//;
		$filelist[$i] =~ s/\s*$//;
		# wbmc_webalizer_ドメイン名 のチェック
		if ($filelist[$i] =~ /^wbmc_webalizer_(.*)$/) {
			$domainname = $1;
		} else {
			$domainname = "";
			next;
		}
		$domainname =~ s/^\s*//;
		$domainname =~ s/\s*$//;
		# 実ドメインはそのまま
		if ($hostname eq $domainname) {
		} else {
			unlink("$cron_dir/wbmc_webalizer_$domainname");
		}
	}
}

#############################
# /home/webalizer/<ドメイン名> ディレクトリのドメイン名が
# wbmc.conf ファイルに存在するか否かをチェックし、存在しない場合削除する。
# 仮想ドメインが対象で、実ドメインはそのまま。
# 引数  ：なし
# 戻り値：なし
sub wbmc_webalizer_dirchk {
	my($webalizer_dir) = "/home/webalizer";
	my($mode,$hostname,$dir);
	local(*DIR,@dirs,);

	chomp($hostname = `hostname`);
	# ディレクトリの一覧を得る
	if (!opendir(DIR, "$webalizer_dir")) {
		return;
	}
	@dirs = readdir(DIR);
	closedir(DIR);

	foreach $dir (@dirs) {
	    if ((!-d "$webalizer_dir/$dir") || ($dir eq ".") || ($dir eq "..")) {
			next;
	    }
		# 仮想ドメイン存在チェック
		$mode = &getDomainConf("$dir","MODE");
		if($mode eq "VIRTUAL"){
			# 仮想ドメインはそのまま
		} else {
			if ($hostname eq $dir) {
				# 実ドメインはそのまま
			} else {
				system("/bin/rm -fr /home/webalizer/$dir");
			}
		}
	}
}

1;
