#!/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(<MDSTAT>)
	{
	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(<TAB>)
		{
		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);
}

