The following script is designed to run on Solaris x86 or Redhat systems with LSI and Adaptec hardware controllers. It will check for degraded states of those controllers using mpt-status, arccon or raidctl depending on hardware vendor and OS. If a degraded state is found it will send an snmptrap to your snmptrap collector.
#!/usr/bin/perl ################################################################# # Script checks status of hardware raid on X86 hardware # # Supported OS's: Solaris x86, Redhat # # Supported Controller's: LSI & Adaptec # # Note: Requires mpt-status for LSI # # Note: Requires arccon for adaptec # # Note: Requires raidctl for Solaris x86 # # Sends trap if degraded state # ################################################################# use strict; my $prefix = "bs_raid_chk"; my $servicechk = "unix_traps"; my $community = "asdpublic"; my $manager = "10.66.65.23"; my $raidctl = '/usr/sbin/raidctl'; my $mptstatus = '/usr/sbin/mpt-status'; my $arcconf = '/usr/StorMan/arcconf'; my (@components,@command); my ($num,$status,$sendtrap,$volume); ### If Solaris System use this check ### if (`uname -a` =~ /SunOS/) { if ( -e $raidctl) { @command = `$raidctl -S`; foreach (@command) { chomp(); @components = split(); $num = $components[1] + 2; $status = "$components[$#components] - Controller: $components[0], RAID: $components[$num], Number of Disks: $components[1]\n"; if ($_ =~ /DEGRADED/) { system "/bin/rm /tmp/$prefix.* >/dev/null 2>&1"; system "/bin/touch /tmp/$prefix.CRITICAL"; system "/usr/sfw/bin/snmptrap -v 2c -c $community $manager '' .1.3.6.1.4.1.11.2.17.1.0.1005 .1.3.6.1.4.1.11.2.17 s \"$servicechk\" .1.3.6.1.4.1.11.2.17 s \"$status\""; exit; } elsif ($_ =~ /SYNC/) { system "/bin/rm /tmp/$prefix.* >/dev/null 2>&1"; system "/bin/touch /tmp/$prefix.WARNING"; system "/usr/sfw/bin/snmptrap -v 2c -c $community $manager '' .1.3.6.1.4.1.11.2.17.1.0.1006 .1.3.6.1.4.1.11.2.17 s \"$servicechk\" .1.3.6.1.4.1.11.2.17 s \"$status\""; exit; } elsif ($_ =~ /OPTIMAL/) { if ( !-e "/tmp/$prefix.OK" ) { system "/bin/rm /tmp/$prefix.* >/dev/null 2>&1"; system "/bin/touch /tmp/$prefix.OK"; system "/usr/sfw/bin/snmptrap -v 2c -c $community $manager '' .1.3.6.1.4.1.11.2.17.1.0.1007 .1.3.6.1.4.1.11.2.17 s \"$servicechk\" .1.3.6.1.4.1.11.2.17 s \"$status\""; } } } } } ### If Linux system use this check ### if (`uname -a` =~ /Linux/) { # If system has LSI controller, then mptstatus should be installed if (-e $mptstatus) { my $modstatus = `/sbin/lsmod |grep mptctl|wc -l`; chomp($modstatus); if ($modstatus eq "0") { my $modload = `/sbin/modprobe mptctl`; $modstatus = `/sbin/lsmod |grep mptctl|wc -l`; chomp($modstatus); if ($modstatus eq "0") { print "ABORT: Failed to load mptctl module.\n";exit;} } my $controller = `$mptstatus -p -s|grep Found`; chomp($controller); my ($id,$junk) = split(/,/,$controller); $id =~ s/Found SCSI id=//g; @command = `$mptstatus -i $id -s`; $status=""; foreach (@command) { chomp(); $status = "$status $_"; } $status = "$status"; #print "$status\n"; foreach (@command) { chomp(); if ( $_ =~ /DEGRADED/ ) { system "/bin/rm /tmp/$prefix.* >/dev/null 2>&1"; system "/bin/touch /tmp/$prefix.CRITICAL"; system "/usr/bin/snmptrap -v 2c -c $community $manager '' .1.3.6.1.4.1.11.2.17.1.0.1005 .1.3.6.1.4.1.11.2.17 s \"$servicechk\" .1.3.6.1.4.1.11.2.17 s \"$status\""; exit; } elsif ($_ =~ /SYNC/ ) { system "/bin/rm /tmp/$prefix.* >/dev/null 2>&1"; system "/bin/touch /tmp/$prefix.WARNING"; system "/usr/bin/snmptrap -v 2c -c $community $manager '' .1.3.6.1.4.1.11.2.17.1.0.1006 .1.3.6.1.4.1.11.2.17 s \"$servicechk\" .1.3.6.1.4.1.11.2.17 s \"$status\""; exit; } elsif ($_ =~ /OPTIMAL/ ) { if ( !-e "/tmp/$prefix.OK" ) { system "/bin/rm /tmp/$prefix.* >/dev/null 2>&1"; system "/bin/touch /tmp/$prefix.OK"; system "/usr/bin/snmptrap -v 2c -c $community $manager '' .1.3.6.1.4.1.11.2.17.1.0.1007 .1.3.6.1.4.1.11.2.17 s \"$servicechk\" .1.3.6.1.4.1.11.2.17 s \"$status\""; } } } } # if system has Adaptec controller then arcconf should be installed if ( -e $arcconf ) { @command = `$arcconf getconfig 1|grep Status|grep :`; foreach (@command) { if (( $_ =~ /Controller Status/ ) && ($_ !~ /Optimal/ )) { $status = "Controller not optimal"; system "/bin/rm /tmp/$prefix.* >/dev/null 2>&1"; system "/bin/touch /tmp/$prefix.CRITICAL"; system "/usr/bin/snmptrap -v 2c -c $community $manager '' .1.3.6.1.4.1.11.2.17.1.0.1005 .1.3.6.1.4.1.11.2.17 s \"$servicechk\" .1.3.6.1.4.1.11.2.17 s \"$status\""; exit; } if (( $_ =~ / Status / ) && ($_ !~ /Optimal/ )) { $status = "Battery not optimal"; system "/bin/rm /tmp/$prefix.* >/dev/null 2>&1"; system "/bin/touch /tmp/$prefix.WARNING"; system "/usr/bin/snmptrap -v 2c -c $community $manager '' .1.3.6.1.4.1.11.2.17.1.0.1006 .1.3.6.1.4.1.11.2.17 s \"$servicechk\" .1.3.6.1.4.1.11.2.17 s \"$status\""; exit; } if (( $_ =~ /Status of logical device/) && ($_ !~ /Optimal/ )) { $status = "Logical HW RAID Volume not optimal"; system "/bin/rm /tmp/$prefix.* >/dev/null 2>&1"; system "/bin/touch /tmp/$prefix.CRITICAL"; system "/usr/bin/snmptrap -v 2c -c $community $manager '' .1.3.6.1.4.1.11.2.17.1.0.1005 .1.3.6.1.4.1.11.2.17 s \"$servicechk\" .1.3.6.1.4.1.11.2.17 s \"$status\""; exit; } if ( $_ =~ /Optimal/ ) { if ( !-e "/tmp/$prefix.OK" ) { $status = "Hardware RAID - OK"; system "/bin/rm /tmp/$prefix.* >/dev/null 2>&1"; system "/bin/touch /tmp/$prefix.OK"; system "/usr/bin/snmptrap -v 2c -c $community $manager '' .1.3.6.1.4.1.11.2.17.1.0.1007 .1.3.6.1.4.1.11.2.17 s \"$servicechk\" .1.3.6.1.4.1.11.2.17 s \"$status\""; } } } } } exit;