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