/
usr
/
lib
/
raider
/
Raider
/
Jobs
/
File Upload :
llllll
Current File: //usr/lib/raider/Raider/Jobs/FusionMPTSAS2.pm
use strict; use warnings; package Raider::Jobs::FusionMPTSAS2; use base qw( Raider::Jobs ); use Raider::Notification::API; use Raider::Notification::Email; =head1 NAME Raider::Jobs::FusionMPTSAS2 - FusionMPTSAS2 specific tasks for checking raid health =head1 DESCRIPTION Checks raid health for FusionMPTSAS2 cards. =head1 USAGE use Raider::Jobs::FusionMPTSAS2; my jobsFusionMPTSAS2 = Raider::Jobs::FusionMPTSAS2->new(); =head1 METHODS =head2 run_job Takes all needed actions for checking raid health. =head2 get_controller_list() Returns a list of controllers. =head2 get_array_list(\%args) Returns a list of arrays. =head2 array_is_ok(\%args) Returns true if array is healthy. =cut # The FusionMPT SAS2 is a low-end card from LSI. It replaces the Fusion MPT # cards. It only supports RAID0 and RAID1 and can usually be found in many 1U # rackmount servers which have only two disks drives. my $icmd = '/usr/bin/sas2ircu'; sub run_job { my $self = shift; $self->icmd_in_path({ icmd => $icmd }); my $controller_list_ref = $self->get_controller_list(); my @controller_list = @$controller_list_ref; my $output; my $raid_bad = 0; for my $controller ( @controller_list ) { my $cntrl_disp = `$icmd $controller display`; my $array_list_ref = $self->get_array_list({ c => $controller, cntrl_disp => $cntrl_disp }); my @array_list = @$array_list_ref; for my $u ( @array_list ) { unless ( $self->array_is_ok({ cntrl_disp => $cntrl_disp, u => $u }) ) { $output .= "root ~ # $icmd $controller display\n"; $output .= $cntrl_disp; $output .= "root ~ #\n"; $raid_bad = 1; } }; }; my $notifEmail = Raider::Notification::Email->new(); my $notifAPI = Raider::Notification::API->new(); if ( $raid_bad ) { if ( $notifAPI->can_alert({ notify_type => 'FusionMPTSAS2' }) ) { $self->logger({ cat => 'w', msg => 'FusionMPTSAS2 Hardware RAID Alarm Detected' }); my $notify_msg = "FusionMPTSAS2 Hardware RAID Alarm Detected on [$Raider::Base::base_conf{'hostname'}] at [$self->{uniq_id}]\nDetails:\n $output"; if ( $notifAPI->can_api() ) { $notifAPI->send_notification({ message => $notify_msg }); } else { $notifEmail->send_notification({ subject => "RAID Controller Alarm on $Raider::Base::base_conf{'hostname'}", message => $notify_msg }); } $notifAPI->place_alert({notify_type => 'FusionMPTSAS2'}); } else { $self->logger({ cat => 'w', msg => 'Notification for FusionMPTSAS2 suppressed, alert file for today already exists.' }); } } else { # health is ok, clear alerts for device $notifAPI->clear_alerts_for_device('FusionMPTSAS2'); } } sub get_controller_list { my $self = shift; my @controller_list; for my $line ( split /^/, `$icmd list` ) { ## START SAMPLE OUTPUT ## # Index Adapter Type Vendor DevID Pci Address VenID DevID # ----- ------------ ------ ------ ----------------- ----- ----- # 0 SAS2008 1000h 72h 00h:01h:00h:00h 1028h 1f1dh # 1f1dh #SAS2IRCU: Utility Completed Successfully. # ## END SAMPLE OUTPUT ## if ( $line =~ /^\s+(\d+)\s+SAS\S+\s+/i ) { push(@controller_list, $1); } } return \@controller_list; } sub get_array_list { my $self = shift; my $opts = shift; my @array_list; # It's common for these types of cards to not support RAID. Weed these out. if ( $opts->{cntrl_disp} =~ /RAID\s+Support(\s+)?:\s+No/ ) { $self->logger({ cat => 'i', msg => "FusionMPTSAS2 controller #[$opts->{c}] does not support RAID. Skipping jobs health check routine..." }); } else { ## START SAMPLE OUTPUT ## # #------------------------------------------------------------------------ #IR Volume information #------------------------------------------------------------------------ #IR volume 1 # Volume ID : 79 # Status of volume : Okay (OKY) # RAID level : RAID1 # Size (in MB) : 1800000 # Boot : Primary # Physical hard disks : # PHY[0] Enclosure#/Slot# : 1:0 # PHY[1] Enclosure#/Slot# : 1:1 # ## END SAMPLE OUTPUT ## for my $line ( split /^/, $opts->{cntrl_disp} ) { if ( $line =~ /IR\s+volume\s+(\d+)/i ) { push(@array_list, $1); } } } return \@array_list; } sub array_is_ok { my $self = shift; my $opts = shift; my $the_array_to_check = 0; for my $line ( split /^/, $opts->{cntrl_disp} ) { if ( $line =~ /IR\s+volume\s+$opts->{u}/i ) { $the_array_to_check = 1; } if ( $line =~ /IR\s+volume\s+(\d+)/i ) { if ( $1 != $opts->{u} ) { $the_array_to_check = 0; } } if ( $the_array_to_check ) { if ( $line =~ /Status\s+of\s+volume(\s+)?:(\.+)/i ) { if ( $2 =~ /Okay/i ) { return 1; } } } } return 0; } 1;
Copyright ©2k19 -
Hexid
|
Tex7ure