#!/usr/bin/perl
$home = "/usr/users/luyer/snmp/perl";
require "$home/lib/config.pl";

@machines = ("typhaon", "enyo", "enyo2", "lethe", "tartarus", "cyllene");

# 'dynamic filehandles':
#    open("NET$machine", ...);
#    print {"NET$machine"} "...";
#    $fh = \*{"NET$machine"}; $_ = <$fh>;
# it's ugly, but it works.

sub makenew {
my $i = shift;

  close("NET$machines[$i]") if defined $isopen{$i};
  $isopen{$i} = 1;
  if($machines[$i] =~ /2$/) {
    $nmm = $machines[$i];
    $nmm =~ s/2$//;
    open("NET$machines[$i]", "-|") || exec "/usr/bin/ssh", "-x", "-a",
					 "-l", "luyer", "-i",
					 "/root/.ssh/root-id", $nmm,
                                         "cd /proc/scsi/BusLogic; perl -e ".
       "'\$|=1; for(;;) { open(X,\"<1\"); \$_=<X> while(!/Total Bytes/); <X>; ".
                         "print \$_ while((\$_=<X>) ne \"\\n\"); close(X); sleep 60; }'";
  } else {
    open("NET$machines[$i]", "-|") || exec "/usr/bin/ssh", "-x", "-a",
					 "-l", "luyer", "-i",
					 "/root/.ssh/root-id", $machines[$i],
                                         "cd /proc/scsi/BusLogic; perl -e ".
       "'\$|=1; for(;;) { open(X,\"<0\"); \$_=<X> while(!/Total Bytes/); <X>; ".
                         "print \$_ while((\$_=<X>) ne \"\\n\"); close(X); sleep 60; }'";
  }
  $fh[$i] = \*{"NET$machines[$i]"};
}

sub openit {
my $name = shift;

  return if defined $isopen{$name};
  $isopen{$name} = 1;
  open("OUT$name", ">>$name");
  select("OUT$name"); $|=1;
  select(STDOUT);
  print {"OUT$name"} "$time|-1|-1\n";
}

sub closem {
my $i = shift;

  for $file (keys %isopen) {
    if($file =~ /^$machines[$i]-/) {
      delete $isopen{$file};
      close("OUT$file");
    }
  }
}

for($i = 0; $i <= $#machines; $i++) {
  makenew($i);
}

$ttime = time();

$SIG{'CHLD'} = 'IGNORE';

$oldir = &week;
mkdir $config'outdirs{'DiskD'}."/".$oldir, 0755;
chdir $config'outdirs{'DiskD'}."/".$oldir;
open(PID,">$config'pidfile{'DiskD'}");
print PID "$$\n";
close PID;
for (;;) {
  $newdir = &week;
  if ($newdir ne $oldir) {
    $oldir = $newdir;
    mkdir "../$newdir", 0755;
    chdir "../$newdir";
    for($i = 0; $i <= $#machines; $i++) {
      closem($i);
    }
  }
  $rin = '';
  for $fh (@fh) {
    vec($rin, fileno($fh), 1) = 1;
  }
  select($rout = $rin, undef, undef, 60);
  $time = time();
  for($i = 0; $i <= $#machines; $i++) {
    if(vec($rout, fileno($fh[$i]), 1) == 1) {
      if(sysread $fh[$i], $buffer, 1024) {
	if($buffer !~ /\n$/) {
          print "Short buffer? $buffer [from $machines[$i]\n";
	}
        $last[$i] = $time;
        for $ln (split(/\n/, $buffer)) {
          @split = split(/[ \t]+/, $ln);
	  if($split[1] > 16) {
	    print "Bad interface number $split[1]: $ln [from $machines[$i]]";
	    next;
	  }
          openit "$machines[$i]-$split[1]";
          print {"OUT$machines[$i]-$split[1]"} "$time|$split[4]|$split[5]\n";
        }
        undef $buffer;
        undef $split;
      } else {
        makenew($i);
        closem($i);
      }
    }
    if(defined($last[$i])) {
      if($time - $last[$i] > 120) {
        makenew($i);
        closem($i);
	$last[$i] = $time;
      }
    } else {
      if ($time - $ttime > 120) {
        makenew($i);
        closem($i);
        $ttime = $time;
      }
    }
  }
}
