Gitweb:
http://git.fedorahosted.org/git/fence-agents.git?p=fence-agents.git;a=com...
Commit: 06548cfda4ec1476e210e2f0b2690a08e39ad6d6
Parent: 078934a262d5516c234b65c1b3912789f035ebaf
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 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(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);