fence-agents: master - fence_scsi_check: watchdog script for fence_scsi

rohara rohara at fedoraproject.org
Tue Mar 1 21:02:43 UTC 2011


Gitweb:        http://git.fedorahosted.org/git/fence-agents.git?p=fence-agents.git;a=commitdiff;h=06548cfda4ec1476e210e2f0b2690a08e39ad6d6
Commit:        06548cfda4ec1476e210e2f0b2690a08e39ad6d6
Parent:        078934a262d5516c234b65c1b3912789f035ebaf
Author:        Ryan O'Hara <rohara at redhat.com>
AuthorDate:    Tue Mar 1 14:08:48 2011 -0600
Committer:     Ryan O'Hara <rohara at redhat.com>
CommitterDate: Tue Mar 1 15:02:34 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 at redhat.com>
Reviewed-by: Fabio M. Di Nitto <fdinitto at 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);


More information about the cluster-commits mailing list