#!/usr/bin/perl use strict; use warnings; use Data::Dumper; use Carp; use English qw( -no_match_vars ); use Getopt::Long; our $VERSION = 0.3; # root or die my $username = ( getpwuid $EUID ); croak "megacli requires root" if $username ne 'root'; # CLI arguments my $unblink = 0; GetOptions( 'u|unblink' => \$unblink, ) or croak "error in command line args"; croak "no arguments... please specify which drives to blink" unless scalar @ARGV; my @drives = @ARGV; # pull in megamap my $megamap = `./megamap`; my @maplines = split /\n/, $megamap; if ( scalar(@maplines) == 0 ) { warn "No output from megamap\n"; exit 2; } my %map; my %eid; foreach my $line (@maplines) { chomp($line); my ( $megaraid_eid, $megaraid_id, $linux_drive, $wwn ) = split( /\t/, $line ); $map{$linux_drive} = $megaraid_id; $eid{$linux_drive} = $megaraid_eid; } # blink all the drives! foreach my $drive (@drives) { $drive =~ s{^/dev/}{}x; unless ( $drive =~ /^sd[a-z][a-z]?$/x or $drive =~ /^\d+$/ ) { croak "invalid drive spec '$drive', try sdc or 13"; } my $megaraid_id; my $megaraid_eid; if ( $drive =~ /^\d+$/ ) { $megaraid_id = $drive; $megaraid_eid = 0; } else { $megaraid_eid = $eid{$drive}; $megaraid_id = $map{$drive}; } croak "no mapping for $drive" unless defined $megaraid_id; print "blinking drive $megaraid_id ($drive), "; my $gonogo = $unblink ? "stop" : "-start"; my $cmd = "/opt/MegaRAID/storcli/storcli64 -PdLocate $gonogo -physdrv[$megaraid_eid:$megaraid_id] -a0"; print "running $cmd\n"; system($cmd); }