#! /usr/bin/env perl use strict; use warnings; # use feature qw(say fc); use constant megacli=>'/opt/MegaRAID/MegaCli/MegaCli'; use Getopt::Std 'getopts'; use Pod::Usage 'pod2usage'; our(%options); getopts('A:E:S:pligchb', \%options); my(%megacli)= ( adapter=>$options{A}||=0, enclosure=>$options{E}||=0, slot=>$options{S}||=0 # 2 ); my($megacli); if(defined($options{p})) { $megacli= " @{[megacli]} -pdrbld -showprog -physdrv '[$megacli{enclosure}:$megacli{slot}]' -a$megacli{adapter} "; } elsif(defined($options{l})) { $megacli= " @{[megacli]} -pdlist -a$megacli{adapter} | less +/'Firmware state:' "; # eg. Unconfigured(good), Spun Up # look for: Slot Number: (eg. 2) } elsif(defined($options{i})) { $megacli= " @{[megacli]} -pdinfo -physdrv '[$megacli{enclosure}:$megacli{slot}]' -a$megacli{adapter} | less +/'Firmware state:' "; # narrow down (the same output as above) } elsif(defined($options{g})) { $megacli= " @{[megacli]} -pdmakegood -physdrv '[$megacli{enclosure}:$megacli{slot}]' -a$megacli{adapter} "; # make good (if not already) } elsif(defined($options{c})) { $megacli= " @{[megacli]} -cfgforeign -clear -a$megacli{adapter} "; # clear 'This Drive is Foreign' (appended at the end of output) if foreign } elsif(defined($options{h})) { $megacli= " @{[megacli]} -pdhsp -set -physdrv '[$megacli{enclosure}:$megacli{slot}]' -a$megacli{adapter} "; # set as hotspare # Adapter: 0: Set Physical Drive at EnclId-0 SlotId-2 as Hot Spare Success. (follows) } elsif(defined($options{b})) { $megacli= " @{[megacli]} -pdrbld –start –physdrv '[$megacli{enclosure}:$megacli{slot}]' –a$megacli{adapter} "; # manually start rebuild (if fails; replace drive otherwise) } else { pod2usage(); } $megacli=~s/\n/ /g; exec($megacli); =pod =head1 name megacli.pl - megaraid interface =head1 SYNOPSIS megacli.pl [-A ] [-E ] [-S ] { -p | -l | -i | -g | -c | -h | -b } =head1 description interface to lsi megaraid raid controller =head1 options =over =item -A adapter =item -E enclosure =item -S slot =item -p progress =item -l list =item -i information =item -g make good =item -c clear foreign =item -h hot spare =item -b build manually =back =head1 notes written for C tested with C =head1 see also MegaCli(8), less(1) L =head1 copyright public domain =head1 author anonymous =cut