#!/bin/sh

# KEYWORD: nojail nostart shutdown

. /etc/rc.subr

name="shelfdown"
start_cmd="${name}_start"
stop_cmd="${name}_stop"
perl_shelfdown=""


shelfdown_start () {
    
}

shelfdown_stop () {
   echo "Shutting down storage shelves"
   shelfdown_perl_interpreter=$(which perl 2> /dev/null)
   if [ -z "${shelfdown_perl_interpreter}" ]; then
       echo "perl not found"
       exit 1
   fi 
   shelfdown_tmp_script=$(mktemp -t $name)
   if [ ! -f "${shelfdown_tmp_script}" ]; then
       exit 1
   fi
   shutdown_flag=$(/bin/ps ax | /usr/bin/grep -v 'grep' | /usr/bin/grep -o  'shutdown -. .*' | awk '{print $2}')
   case ${shutdown_flag} in
       -r|-k) /usr/bin/printf "shutdown ${shutdown_flag} was called\nWe are wouldn't stop storage shelves\n";exit 0;;
       -h|-p) /usr/bin/printf "shutdown ${shutdown_flag} was called\nStop storage shelves\n";;
       *) /usr/bin/printf "Can't recognize shutdown flags\nStop storage shelves anyway\n";;
   esac

cat > ${shelfdown_tmp_script} <<"EOF"
#!/usr/bin/perl

sub v2s;

foreach $_ (`camcontrol devlist`){
    if (/DELL MD/){
        $devs++;
        /pass(\d+)/;
        push (@devs, $1);
    }
}


for $devnum (@devs){
    $dev = "/dev/pass$devnum";
    $cards = $p = $p_cards = 0;
    foreach $_ (`sg_ses -p 2 $dev`) {
        chomp;
        if (/^\s*Element \d+ status:/) {
            $cards++ unless $p;
            $p_cards++ if $p;
        }
        if (/^\s*Element type:/) {
            last if $p;
            $p = 1 if (/Power supply/);
            $cards++ unless $p;
        };
    }

    $cards++;

    $raw = `sg_ses -p 2 -r $dev`;
    $raw =~ s/^\s*//;
    @raw = split /\s+/, $raw;
    # each card is 4-bytes long
    $cards *= 4;
    # turn on overral card
    $raw[$cards] = v2s (hex ($raw[$cards]) | 0x80);

    foreach $i (1..$p_cards) {
        # turn on power control unit card
        $raw[$i*4 + $cards] = v2s (hex ($raw[$i*4 + $cards]) | 0x80);
        # turn off power
        $raw[$i*4 + 3 + $cards] = v2s (0x10);
    }

    # go-go-go
    $r = join " ", @raw;
    system ("echo $r | sg_ses -p 2 -c -d - -r $dev");
    print $r;
}
sub v2s
{
    return sprintf "%02x", $_[0];
}
EOF

${shelfdown_perl_interpreter} ${shelfdown_tmp_script} > /dev/null 2>&1
rm ${shelfdown_tmp_script}
}

load_rc_config $name
run_rc_command "$1"
