Gitweb:
http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=...
Commit: 539acade6590f0d1046ec67f51303473dccb5f08
Parent: 5ffb95ad7a8013fc37145146ee3b815f6fbe311a
Author: Ryan O'Hara <rohara(a)redhat.com>
AuthorDate: Tue Mar 1 14:08:48 2011 -0600
Committer: Ryan O'Hara <rohara(a)redhat.com>
CommitterDate: Tue Mar 1 14:08:48 2011 -0600
fence_scsi_check: watchdog script for fence_scsi
This fence_scsi_check watchdog script will check to see is the local
node's key is registered with any devices. If the key is registered with
at least one device, the script will return 0. If none of the devices
have the node's key registered (ie. it has been fenced), the script will
return 2 and node will reboot via watchdog.
Signed-off-by: Ryan O'Hara <rohara(a)redhat.com>
Reviewed-by: Fabio M. Di Nitto <fdinitto(a)redhat.com>
---
fence/agents/scsi/fence_scsi_check.pl | 170 +++++++++++++++++++++++++++++++++
1 files changed, 170 insertions(+), 0 deletions(-)
diff --git a/fence/agents/scsi/fence_scsi_check.pl
b/fence/agents/scsi/fence_scsi_check.pl
new file mode 100644
index 0000000..9ecd7a5
--- /dev/null
+++ b/fence/agents/scsi/fence_scsi_check.pl
@@ -0,0 +1,170 @@
+#!/usr/bin/perl
+
+use POSIX;
+
+################################################################################
+
+my $dev_file = "/var/run/cluster/fence_scsi.dev";
+my $key_file = "/var/run/cluster/fence_scsi.key";
+
+################################################################################
+
+sub log_debug ($)
+{
+ my $time = strftime ("%b %e %T", localtime);
+ my $msg = shift;
+
+ print STDOUT "$time [$0] debug: $msg\n" if ($verbose);
+
+ return;
+}
+
+sub log_error ($)
+{
+ my $time = strftime ("%b %e %T", localtime);
+ my $msg = shift;
+
+ print STDERR "$time [$0] error: $msg\n";
+
+ return;
+}
+
+sub do_reset ($)
+{
+ my $dev = shift;
+
+ my $cmd = "sg_turs $dev";
+ my @out = qx { $cmd 2> /dev/null };
+
+ return;
+}
+
+sub get_registration_keys ($)
+{
+ my $dev = shift;
+ my @keys = ();
+
+ do_reset ($dev);
+
+ my $cmd = "sg_persist -n -i -k -d $dev";
+ my @out = qx { $cmd 2> /dev/null };
+
+ if ($?>>8 != 0) {
+ log_error ("$cmd");
+ exit (0);
+ }
+
+ foreach (@out) {
+ chomp;
+ if (s/^\s+0x//i) {
+ push (@keys, $_);
+ }
+ }
+
+ return (@keys);
+}
+
+sub get_reservation_keys ($)
+{
+ my $dev = shift;
+ my @keys = ();
+
+ do_reset ($dev);
+
+ my $cmd = "sg_persist -n -i -r -d $dev";
+ my @out = qx { $cmd 2> /dev/null };
+
+ if ($?>>8 != 0) {
+ log_error ("$cmd");
+ exit (0);
+ }
+
+ foreach (@out) {
+ chomp;
+ if (s/^\s+key=0x//i) {
+ push (@keys, $_);
+ }
+ }
+
+ return (@keys);
+}
+
+sub get_verbose ()
+{
+ open (\*FILE, "</etc/sysconfig/watchdog") or return;
+ chomp (my @opt = <FILE>);
+ close (FILE);
+
+ foreach (@opt) {
+ next if (/^#/);
+ next unless ($_);
+
+ if (/^verbose=yes$/i) {
+ return (1);
+ }
+ }
+
+ return (0);
+}
+
+sub key_read ()
+{
+ open (\*FILE, "<$key_file") or exit (0);
+ chomp (my $key = <FILE>);
+ close (FILE);
+
+ return ($key);
+}
+
+sub dev_read ()
+{
+ open (\*FILE, "<$dev_file") or exit (0);
+ chomp (my @dev = <FILE>);
+ close (FILE);
+
+ return (@dev);
+}
+
+################################################################################
+
+if ($ARGV[0] =~ /^repair$/i) {
+ exit ($ARGV[1]);
+}
+
+if (-e "/etc/sysconfig/watchdog") {
+ $verbose = get_verbose ();
+}
+
+if (! -e $dev_file) {
+ log_debug ("$dev_file does not exit");
+ exit (0);
+} elsif (-z $dev_file) {
+ log_debug ("$dev_file is empty");
+ exit (0);
+}
+
+if (! -e $key_file) {
+ log_debug ("$key_file does not exist");
+ exit (0);
+} elsif (-z $key_file) {
+ log_debug ("$key_file is empty");
+ exit (0);
+}
+
+my $key = key_read ();
+my @dev = dev_read ();
+
+foreach (@dev) {
+ my @keys = grep { /^$key$/i } get_registration_keys ($_);
+
+ if (scalar (@keys) != 0) {
+ log_debug ("key $key registered with device $_");
+ exit (0);
+ } else {
+ log_debug ("key $key not registered with device $_");
+ }
+}
+
+log_debug ("key $key not registered with any devices");
+
+exit (2);