diff options
author | An-Cheng Huang <ancheng@vyatta.com> | 2007-12-17 14:46:33 -0800 |
---|---|---|
committer | An-Cheng Huang <ancheng@vyatta.com> | 2007-12-17 14:46:33 -0800 |
commit | 41aac6942e89fa24b938ec188a0933e52acff623 (patch) | |
tree | 0a7a4046dd0bede6fd1a7fc8c8082a068cc6fbe3 /scripts/vyatta-show-cluster.pl | |
download | vyatta-cluster-41aac6942e89fa24b938ec188a0933e52acff623.tar.gz vyatta-cluster-41aac6942e89fa24b938ec188a0933e52acff623.zip |
migrate clustering from fairfield to glendaleupstream
Diffstat (limited to 'scripts/vyatta-show-cluster.pl')
-rwxr-xr-x | scripts/vyatta-show-cluster.pl | 267 |
1 files changed, 267 insertions, 0 deletions
diff --git a/scripts/vyatta-show-cluster.pl b/scripts/vyatta-show-cluster.pl new file mode 100755 index 0000000..2ad29ce --- /dev/null +++ b/scripts/vyatta-show-cluster.pl @@ -0,0 +1,267 @@ +#!/usr/bin/perl + +use strict; +use lib "/opt/vyatta/share/perl5/"; +use VyattaClusterConfig; + +my $CL_STATUS = "/usr/bin/cl_status"; + +my $config = new VyattaClusterConfig; +$config->setupOrig("cluster"); +if ($config->isEmpty()) { + # config is empty. + print "Clustering is not configured\n"; + exit 0; +} + +my $primary = $config->primaryNode(); +my $secondary = $config->secondaryNode(); +my @monitors = $config->monitorNodes(); +my $services = $config->serviceStr(); + +my $pri_st = `$CL_STATUS nodestatus $primary 2>/dev/null`; +chomp $pri_st; +my $sec_st = `$CL_STATUS nodestatus $secondary 2>/dev/null`; +chomp $sec_st; +my %mon_st = (); +my $non_reach = 0; +foreach (@monitors) { + my $st = `$CL_STATUS nodestatus $_ 2>/dev/null`; + chomp $st; + if ($st ne "ping") { + $non_reach = 1; + } + $mon_st{$_} = $st; +} +my $res_st = `$CL_STATUS rscstatus 2>/dev/null`; +chomp $res_st; + +my $my_name = `uname -n`; +chomp $my_name; + +if ($my_name eq $primary) { + printPrimaryStatus(); + exit 0; +} elsif ($my_name eq $secondary) { + printSecondaryStatus(); + exit 0; +} else { + print "Error: this node ($my_name) is neither primary ($primary) " + . "nor secondary ($secondary)\n"; + exit 1; +} + +sub printPrimaryStatus { + my $all_reachable = 1; + foreach (keys %mon_st) { + if ($mon_st{$_} eq "dead") { + $all_reachable = 0; + last; + } + } + + print "=== Status report on primary node $my_name ===\n\n"; + print " Primary $primary (this node): "; + my $other_init = 0; + if ($pri_st eq "up") { + print "Started (waiting for secondary)"; + $other_init = 1; + } elsif (($res_st eq "all") || ($res_st eq "local")) { + print "Active"; + } elsif ($res_st eq "transition") { + print "Node status in transition"; + } elsif ($res_st eq "none") { + if ($pri_st eq "active") { + if ($all_reachable) { + # work around heartbeat state problem + print "Active (standby)"; + } else { + print "Down (at least 1 monitor not reachable)"; + } + } elsif ($pri_st eq "dead") { + # this should be unreachable + print "Down"; + } else { + print "Unknown"; + } + } else { + print "Unknown"; + } + print "\n\n"; + + print " Secondary $secondary: "; + if ($other_init) { + print "Initializing"; + } elsif ($res_st eq "all") { + if ($sec_st eq "active") { + # this could also be "Down (at least 1 monitor node not reachable)" + # we might want to just say "Unknown". + print "Active (standby)"; + } elsif ($sec_st eq "dead") { + print "Down"; + } elsif ($sec_st eq "up") { + print "Initializing"; + } else { + print "Unknown"; + } + } elsif ($res_st eq "local") { + if ($sec_st eq "active") { + print "Active (standby)"; + } else { + print "Unknown"; + } + } elsif ($res_st eq "transition") { + print "Node status in transition"; + } elsif ($res_st eq "none") { + if ($sec_st eq "active") { + print "Active"; + } else { + print "Unknown"; + } + } else { + print "Unknown"; + } + print "\n\n"; + + foreach (keys %mon_st) { + print " Monitor $_: "; + if ($other_init) { + print "Initializing"; + } elsif ($res_st eq "transition") { + print "Node status in transition"; + } elsif ($mon_st{$_} eq "ping") { + print "Reachable"; + } elsif ($mon_st{$_} eq "dead") { + print "Unreachable"; + } else { + print "Unknown"; + } + print "\n"; + } + print "\n"; + + print " Resources [$services]:\n "; + if ($other_init) { + print "Initializing"; + } elsif (($res_st eq "all") || ($res_st eq "local")) { + print "Active on primary $my_name (this node)"; + } elsif ($res_st eq "transition") { + print "Resource status in transition"; + } elsif ($res_st eq "none") { + print "Active on secondary $secondary"; + } else { + print "Unknown"; + } + print "\n\n"; +} + +sub printSecondaryStatus { + print "=== Status report on secondary node $my_name ===\n\n"; + my $other_init = 0; + if ($sec_st eq "up") { + $other_init = 1; + } + + my $all_reachable = 1; + foreach (keys %mon_st) { + if ($mon_st{$_} eq "dead") { + $all_reachable = 0; + last; + } + } + + print " Primary $primary: "; + if ($other_init) { + print "Initializing"; + } elsif ($res_st eq "all") { + if ($pri_st eq "active") { + # this could also be "Down (at least 1 monitor node not reachable)". + # we might want to just say "Unknown". + print "Active (standby)"; + } elsif ($pri_st eq "dead") { + print "Down"; + } elsif ($pri_st eq "up") { + print "Initializing"; + } else { + print "Unknown"; + } + } elsif ($res_st eq "local") { + if ($pri_st eq "active") { + print "Active"; + } else { + print "Unknown"; + } + } elsif ($res_st eq "transition") { + print "Node status in transition"; + } elsif ($res_st eq "none") { + if ($pri_st eq "active") { + print "Active"; + } else { + print "Unknown"; + } + } else { + print "Unknown"; + } + print "\n\n"; + + print " Secondary $my_name (this node): "; + if ($sec_st eq "up") { + print "Started (waiting for primary)"; + } elsif ($res_st eq "all") { + print "Active"; + } elsif ($res_st eq "local") { + print "Active (standby)"; + } elsif ($res_st eq "transition") { + print "Node status in transition"; + } elsif ($res_st eq "none") { + if ($sec_st eq "active") { + if ($all_reachable) { + # work around heartbeat state problem + print "Active (standby)"; + } else { + print "Down (at least 1 monitor not reachable)"; + } + } elsif ($sec_st eq "dead") { + # this should be unreachable + print "Down"; + } else { + print "Unknown"; + } + } else { + print "Unknown"; + } + print "\n\n"; + + foreach (keys %mon_st) { + print " Monitor $_: "; + if ($other_init) { + print "Initializing"; + } elsif ($res_st eq "transition") { + print "Node status in transition"; + } elsif ($mon_st{$_} eq "ping") { + print "Reachable"; + } elsif ($mon_st{$_} eq "dead") { + print "Unreachable"; + } else { + print "Unknown"; + } + print "\n"; + } + print "\n"; + + print " Resources [$services]:\n "; + if ($other_init) { + print "Initializing"; + } elsif ($res_st eq "all") { + print "Active on secondary $my_name (this node)"; + } elsif ($res_st eq "transition") { + print "Resource status in transition"; + } elsif (($res_st eq "none") || ($res_st eq "local")) { + print "Active on primary $primary"; + } else { + print "Unknown"; + } + print "\n\n"; +} + +exit 0; |