summaryrefslogtreecommitdiff
path: root/scripts/vyatta-show-cluster.pl
diff options
context:
space:
mode:
authorAn-Cheng Huang <ancheng@vyatta.com>2007-12-17 14:46:33 -0800
committerAn-Cheng Huang <ancheng@vyatta.com>2007-12-17 14:46:33 -0800
commit41aac6942e89fa24b938ec188a0933e52acff623 (patch)
tree0a7a4046dd0bede6fd1a7fc8c8082a068cc6fbe3 /scripts/vyatta-show-cluster.pl
downloadvyatta-cluster-41aac6942e89fa24b938ec188a0933e52acff623.tar.gz
vyatta-cluster-41aac6942e89fa24b938ec188a0933e52acff623.zip
migrate clustering from fairfield to glendaleupstream
Diffstat (limited to 'scripts/vyatta-show-cluster.pl')
-rwxr-xr-xscripts/vyatta-show-cluster.pl267
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;