#!/usr/bin/perl

my %disks;
my $count;
my @data;
my $value;

open(IF, "fcdRpcTest localhost devlist |");
<IF>;
<IF>;
while (<IF>){
    next if /---/;
    if (/\s+(\d+)\s+(\S+)\s+(\S+)\s+(\d+)\,\s+(\d+)\s+(\d+)\,\s+(\d+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)/){
	print "1- $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12\n";
	$disks{$1}->{Size} = $9;
	$disks{$1}->{WWN} = "$2.$3";
	$disks{$1}->{Mftr} = $10;
    } elsif (/\s+(\d+)\s+(\S+)\s+(\S+)\s+(\d+)\,\s+(\d+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)/){
	print "2- $1 $2 $3 $4 $5 $6 $7 $8 $9 $10\n";
	$disks{$1}->{Size} = $7;
	$disks{$1}->{WWN} = "$2.$3";
	$disks{$1}->{Mftr} = $8;
    }
}
close(IF);


sub GetDisk {
    my ($id) = shift;

    open(IF, "fcdRpcTest localhost stat $id |");
    @data = <IF>;
    close(IF);
    foreach $line (@data){
	$line =~ s/\s*$//;
	if ($line =~ /Disk Type : (.*)$/){
	    $disks{$id}->{Type} = $1;
	} elsif ($line =~ /Num Frames Read : (\d+)/){
	    if ($disks{$id}->{ReadF}){
		$disks{$id}->{ReadFDelta} = $1 - $disks{$id}->{ReadF};
	    }
	    $disks{$id}->{ReadF} = $1;
	} elsif ($line =~ /Num Read IOs : (\d+)/){
	    if ($disks{$id}->{ReadI}){
		$disks{$id}->{ReadIDelta} = $1 - $disks{$id}->{ReadI};
	    }
	    $disks{$id}->{ReadI} = $1;
	} elsif ($line =~ /Num Frames Write : (\d+)/){
	    if ($disks{$id}->{WriteF}){
		$disks{$id}->{WriteFDelta} = $1 - $disks{$id}->{WriteF};
	    }
	    $disks{$id}->{WriteF} = $1;
	} elsif ($line =~ /Num Write IOs : (\d+)/){
	    if ($disks{$id}->{WriteI}){
		$disks{$id}->{WriteIDelta} = $1 - $disks{$id}->{WriteI};
	    }
	    $disks{$id}->{WriteI} = $1;
	} elsif ($line =~ /^Disk ID\s*:\s*/){
	} elsif ($line =~ /^\s*$/){
	} else {
	    print "Unhandled: ($line)\n";
	}
    }
    printf("%d - %s: %s, %s, %d, %d, %.2f, %d, %d, %.2f\n",
	   $id,
	   $disks{$id}->{WWN},
	   $disks{$id}->{Mftr},
	   $disks{$id}->{Type},
	   $disks{$id}->{ReadFDelta},
	   $disks{$id}->{ReadIDelta},
	   ($disks{$id}->{ReadFDelta} && $disks{$id}->{ReadIDelta}) ? $disks{$id}->{ReadFDelta}/$disks{$id}->{ReadIDelta} : 0,
	   $disks{$id}->{WriteFDelta},
	   $disks{$id}->{WriteIDelta},
	   ($disks{$id}->{WriteFDelta} && $disks{$id}->{WriteIDelta}) ? $disks{$id}->{WriteFDelta}/$disks{$id}->{WriteIDelta} : 0,
	   );
}

my $include = shift || undef;

my @list = sort {$a <=> $b} keys %disks;
if ($include){
    my @nlist;
    foreach my $item (split(/,/, $include)){
	push(@nlist, grep(/^$item$/, @list));
    }
    @list = @nlist;
}

while (1){
    foreach my $diskid (@list){
	GetDisk($diskid);
    }
    sleep 1;
}
