#!/usr/bin/perl -w # use strict; my $MDADM='/sbin/mdadm'; my $TAB='/tmp/usb_raid_tab'; my $MD='md0'; my $ACTION=$ARGV[0]; my $PHYSDEVPATH=$ENV{'PHYSDEVPATH'}; #Debug(); #exit(0); if($ACTION eq 'add') { Add(); } elsif($ACTION eq 'remove') { Remove(); } exit(0); sub Add { Log("adding $ENV{'DEVNAME'} as $PHYSDEVPATH to db"); open(TAB,">>$TAB"); print TAB "$ENV{'DEVNAME'} $PHYSDEVPATH\n"; close(TAB); my @mdstat; open(MDSTAT,'/proc/mdstat'); while() { chomp; push(@mdstat,$_); } close(MDSTAT); if($mdstat[1]=~m/$MD \: active/) { # RAID aktiv, Device adden Log("RAID active, re-adding $ENV{'DEVNAME'}"); raid_add($ENV{'DEVNAME'}); return 1; } elsif($mdstat[1]=~m/$MD \: inactive/) { Log("RAID inactive, trying to assemble..."); } elsif(scalar(@mdstat)<3) { Log("RAID not initialised yet, assembling..."); raid_assemble($ENV{'DEVNAME'}); } } sub Remove { if(-e $TAB) { open(TAB,$TAB); my @raidtab=(); while() { chomp; push(@raidtab,$_); } close(TAB); if(scalar(@raidtab)<2) { raid_stop(); unlink($TAB); return 1; } open(TAB,">$TAB"); foreach(@raidtab) { my($dn,$pdp)=split(/ /,$_,2); if($pdp eq $PHYSDEVPATH) { Log("$PHYSDEVPATH recognised as $dn"); raid_remove($dn); } else { print TAB "$dn $pdp\n"; } } close(TAB); } } sub raid_assemble { my $dev=shift; my $cmd="$MDADM --assemble /dev/$MD --run --auto=yes $dev"; my $out=readpipe($cmd); my $ret=$? >> 8; Log("$cmd\: ($ret) $out"); } sub raid_add { my $dev=shift; my $cmd="$MDADM /dev/$MD --add $dev"; my $out=readpipe($cmd); my $ret=$? >> 8; Log("$cmd\: ($ret) $out"); } sub raid_remove { my $dev=shift; my $cmd="$MDADM /dev/$MD --fail $dev --remove $dev"; my $out=readpipe($cmd); my $ret=$? >> 8; Log("$cmd\: ($ret) $out"); } sub raid_stop { #my $dev=shift; my $cmd="$MDADM -S /dev/$MD"; my $out=readpipe($cmd); my $ret=$? >> 8; Log("$cmd\: ($ret) $out"); } sub Log { my $msg=shift; system('logger',$msg); return 1; } sub Debug { Log($ACTION); my $str=''; map {$str.="$_=$ENV{$_}\n"} keys(%ENV); Log($str); }