#!/usr/bin/perl

# 正常動作には、CLUSTERPRO LE for Linux Ver3.1 がインストールされていること。

$w_type = "";
$w_group = "";
$ret = 0;
$cmd_err ="command error\n**** error ****\n";

# 引数チェック
for($i=0; $i<=$#ARGV; $i++){
    if($ARGV[$i] eq "-t"){
        $i++;
        if($#ARGV < $i){
            print "$cmd_err";
            exit(0);
        }
        $w_type = $ARGV[$i];
    }
    elsif($ARGV[$i] eq "-g"){
        $i++;
        if($#ARGV < $i){
            print "$cmd_err";
            exit(0);
        }
        $w_group = $ARGV[$i];
    }
    else{
        print "$cmd_err";
        exit(0);
    }
}

# ディスパッチ
if($w_type eq "server"){
    $ret = show_server_list();
}
elsif($w_type eq "group"){
    $ret = show_group_list();
}
elsif($w_type eq "groupmyserver"){
    $ret = show_groupmyserver_list();
}
elsif($w_type eq "ip"){
    $ret = show_ip_list($w_group);
}
elsif($w_type eq "ndrlx"){
    $ret = show_ndrlx_list($w_group);
}
elsif($w_type eq "disk"){
    $ret = show_disk_list($w_group);
}
else{
    print "$cmd_err";
    exit(0);
}

if($ret == 0){
    print "**** error ****\n";
}
else{
    print "**** normal ****\n";
}

#-------------------------------------------------------

# 名前
#   show_server_list - サーバリストの表示
# 形式
#   show_server_list()
# 戻り値
#  成功 : 1
#  失敗 : 0
#
sub show_server_list {

    my($cmd) = "/usr/sbin/clpstat --sv | ";

    if(!open(IN, $cmd)){
        return 0;
    }
    while(<IN>){
        if($_ =~ /\[Server.*\s*:\s*(.*)\]/){
            print "$1\n";
        }
    }
    close(IN);
    return 1;
}

# 名前
#   show_group_list - グループリストの表示
# 形式
#   show_group_list()
# 戻り値
#  成功 : 1
#  失敗 : 0
#
sub show_group_list {

    my($cmd) = "/usr/sbin/clpstat --grp | ";

    if(!open(IN, $cmd)){
        return 0;
    }
    while(<IN>){
        if($_ =~ /\[Group.*\s*:\s*(.*)\]/){
            print "$1\n";
        }
    }
    close(IN);
    return 1;
}

# 名前
#   show_groupmyserver_list - 自サーバのフェィルオーバグループの表示
#                             稼動系時に、有効になっているグループリストと自ホスト名を表示する。
#                             稼動系時の判定は/dev/NMP1がマウントされているかで行なう。
# 形式
#   show_groupmyserver_list()
# 戻り値
#  成功 : 1
#  失敗 : 0
#
sub show_groupmyserver_list {

    my($mnt_flg) = 0;
    my($cmd1) = "/bin/mount | ";
    my($cmd2) = "/usr/sbin/clpstat -g | ";

    if(!open(IN, $cmd1)){
        return 0;
    }
    while(<IN>){
        if($_ =~ /^\/dev\/NMP1\s/){
            $mnt_flg = 1;
            last;
        }
    }
    if($mnt_flg == 0){ # /dev/NMP1 がマウントされてなければ何もしない。
        return 1;
    }
    close(IN);
    if(!open(IN, $cmd2)){
        return 0;
    }
    while(<IN>){
        if($_ =~ /\s*\*(server.*)\s*:\s*(.*)/){
            $server = $1;
            $hostname = $2;
            next;
        }
        if($server && ($_ =~ /\s*\Q$server\E\s*\[/)){
            @tmp = split;
            last;
        }
    }
    close(IN);
    for($i=3;$i<=$#tmp;$i++){
        if($tmp[$i] =~ /(.*)\[/){
            print "$1\n";
        }
    }
    print "$hostname\n";
    return 1;
}

# 名前
#   show_ip_list - フェィルオーバグループのIPアドレスの表示
# 形式
#   show_ip_list($group)
# 引数
#   $group - グループ名
# 戻り値
#  成功 : 1
#  失敗 : 0
#
sub show_ip_list{

    my($group) = @_;
    my($fip_flg) = "0";
    my($cmd) = "/usr/sbin/clpstat --grp $group --rsc | ";

    if(!open(IN, $cmd)){
        return 0;
    }
    while(<IN>){
        if($_ =~ /\s*Type\s*:\s*fip/){
            $fip_flg = 1;
            next;
        }
        if(($_ =~ /\s*IP\s*Address\s*:\s*(.*)/) && $fip_flg == 1){
            print "$1\n";
            $fip_flg = 0;
            next;
        }
    }
    close(IN);
    return 1;
}

# 名前
#   show_ndrlx_list - 共有ミラーディスクのマウントポイントを表示
# 形式
#   show_ndrlx_list($group)
# 引数
#   $group - グループ名
# 戻り値
#  成功 : 1
#  失敗 : 0
#
sub show_ndrlx_list {

    my($group) = @_;
    my($md_flg) = "0";
    my($cmd) = "/usr/sbin/clpstat --grp $group --rsc | ";

    if(!open(IN, $cmd)){
        return 0;
    }
    while(<IN>){
        if($_ =~ /\s*Type\s*:\s*md/){
            $md_flg = 1;
            next;
        }
        if(($_ =~ /\s*Mount\s*Point\s*:\s*(.*)/) && $md_flg == 1){
            print "$1\n";
            $md_flg = 0;
            next;
        }
    }
    close(IN);
    return 1;
}

# 名前
#   show_disk_list - 共有ミラーディスクのマウントポイントを表示
#                    実体は、show_ndrlx_list()
#                    旧 wbmc_cluster_cmd -t disk -g $group の代わりに使用。
# 形式
#   show_disk_list($group)
# 引数
#   $group - グループ名
# 戻り値
#  成功 : 1
#  失敗 : 0
#
sub show_disk_list {

    my($group) = @_;
    if(!show_ndrlx_list($group)){
        return 0;
    }
    return 1;
}

