#!/usr/bin/perl

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

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

##011101 v4.30 システム管理者名変更機能対応  Oku

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

{
	
	local($domain_conf) = "$WBMC_CONF_DIR/domain.conf";
	local($domain_conf_lock) = "domain.conf";
	local($i,$j,$get_flg,$set_flg);
	local(@conf,@mount,@mountchk);

    #システム管理者名get
    &getSysAdminName(*adminname);
    $admin = $adminname{'ADMIN'};

	# ドメインファイルを読み込む
	@conf = ();
	if (!&readFile($domain_conf, $domain_conf_lock, *conf)) {
		&writeLog("read domain.conf failed", "wbmc_mirroring", "/var/log/wbmc_cluster");
		exit(1);
	}

	# ドメイン名取得
	$get_flg = 0;
	@mountchk = ();
	for ($i = 0; $i < @conf; $i++) {
		if ($conf[$i] =~ /^\s*#/) {
			next;
		}
		
		if ($conf[$i] =~ /^\s*<DOMAINNAME\s*(.*)>\s*$/) {
			if ($get_flg eq 0) {
				$get_flg = 1;
			} else {
				&writeLog("format error (DOMAINNAME)", "wbmc_mirroring", "/var/log/wbmc_cluster");
				exit(1);
			}
		}
		if ($conf[$i] =~ /^\s*WEB_PART\s*(.*)\s*$/) {
			if ($get_flg eq 1) {
				$get_flg = 0;
				if ($1 eq "") {
					next;
				}
				@mount = split(/:/, "$1");
				$set_flg = 0;
				for ($j = 0;$j < @mountchk; $j++) {
					if ($mountchk[$j] eq $mount[1]) {
						$set_flg = 1;
					}
				}
				if ($set_flg eq 1) {
					next;
				} else {
					push(@mountchk, $mount[1]);
				}
				$rc = system("/opt/nec/wbmc/bin/wbmc_dc_rsync --dir $mount[1]/web");
				if ($rc) {
					&writeLog("mirroring $mount[1]/web failed", "wbmc_mirroring", "/var/log/wbmc_cluster");
					exit(1);
				}

                $rc = system("/opt/nec/wbmc/bin/wbmc_dc_rsync --dir $mount[1]/.wbmc");
                if ($rc) {
                &writeLog("mirroring $mount[1]/.wbmc failed", "wbmc_mirroring", "/var/log/wbmc_cluster");
                    exit(1);
                }

			} else {
				&writeLog("format error (WEB_PART)", "wbmc_mirroring", "/var/log/wbmc_cluster");
				exit(1);
			}
		}
	
	}
#	exit(0);

	$rc = system("/opt/nec/wbmc/bin/wbmc_dc_rsync --dir /home/users/$admin");
	if ($rc) {
	&writeLog("mirroring /home/users/$admin failed", "wbmc_mirroring", "/var/log/wbmc_cluster");
		exit(1);
	}

	my($touch_prog)  = '/bin/touch';
	my($last_file)   = '/etc/opt/nec/wbmc_dc.last_rsync';
	my($last_server) = '/etc/opt/nec/wbmc_dc.saver';
	my($echo_prog)   = '/bin/echo';
	my($setver_list) = '/etc/opt/nec/cluster_server';

	system("$touch_prog $last_file ");
	$server = my_server_get($setver_list);
	&writeLog("mirroring server $server", "wbmc_mirroring", "/var/log/wbmc_cluster");

	$cmd = "/opt/nec/wbmc/bin/wbmc_cluster_init -w $server" ;
	$cmd2 = "$echo_prog  $server > $last_server";
	system($cmd);
	#print wbmc_dc_rsh("$cmd" );

	&writeLog("wbmc_dc_rsh  $cmd","wbmc_cluster", "/var/log/wbmc_cluster");
	
	@result = &wbmc_dc_rsh($cmd);
#	@result = &wbmc_dc_rsh($cmd2);
	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");
	}

}

## cluster_server ファイルを読み込む
sub my_server_get {
    my($file) = @_;
    #  格納場所）
    #         /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[1]";
        }
    }
    close(INFILE);
    return "";
}

1;

