#!/usr/bin/perl -w

use config;
use strict;

my @CMD = 
  (
   # hostname, login, command

   # video gateway
   "$hostVGW", "dance", "cd $LIBRA_PATH/videogateway ; LIBRA_PATH=$LIBRA_PATH ./run_gw >& /usr/tmp/log.vgw", "run_gw|gccg",

   #moviesource:
   "$hostCMUmovie", "$useraccount", "cd $LIBRA_PATH/libra/bin/; LIBRA_PATH=$LIBRA_PATH ./ex_compnode 45300", "ex_compnode|rtpplay",

   "$hostDANCEmovie", "dance", "cd $LIBRA_PATH/libra/bin/; LIBRA_PATH=$LIBRA_PATH ./ex_compnode 45300", "ex_compnode|rtpplay",

   #HHproxy:
   "$hostHHproxy", "$useraccount", "cd $LIBRA_PATH/libra/bin/; LIBRA_PATH=$LIBRA_PATH ./ex_compnode 60000 >& /usr/tmp/log.hhproxy", "ex_compnode|hhproxy",

   #ESMproxy for DANCE movie:
   "$hostDANCEmovie", "dance", "cd $LIBRA_PATH/libra/bin/; LIBRA_PATH=$LIBRA_PATH LIBRA_VIEWERARGS=\\\"$viewerArgList\\\" LIBRA_PROXYARGS=\\\"$proxyArgList\\\" ./ex_esmproxy1 40000 1.1.1.1 0 > /usr/tmp/log.esmproxy", "ex_esmproxy1|proxy",

   #ESMproxy for VGW:
   "$hostVGW", "dance", "cd $LIBRA_PATH/libra/bin/; LIBRA_PATH=$LIBRA_PATH LIBRA_VIEWERARGS=\\\"$viewerArgList\\\" LIBRA_PROXYARGS=\\\"$proxyArgList\\\" ./ex_esmproxy1 40000 1.1.1.1 0 > /usr/tmp/log.esmproxy", "ex_esmproxy1|proxy",

   #ESMproxy for CMU:
   "$hostCMUESMproxy", "$useraccount", "cd $LIBRA_PATH/libra/bin/; LIBRA_PATH=$LIBRA_PATH LIBRA_VIEWERARGS=\\\"$viewerArgList\\\" LIBRA_PROXYARGS=\\\"$proxyArgList\\\" ./ex_esmproxy1 40000 1.1.1.1 1 > /usr/tmp/log.esmproxy", "ex_esmproxy1|proxy",

   #ESMproxy for non-multicast VIC:
   "$hostNoMulticastVIC", "$useraccount", "cd $LIBRA_PATH/libra/bin/; LIBRA_PATH=$LIBRA_PATH LIBRA_VIEWERARGS=\\\"$viewerArgList\\\" LIBRA_PROXYARGS=\\\"$proxyArgList\\\" ./ex_esmproxy1 40000 1.1.1.1 0 > /usr/tmp/log.esmproxy", "ex_esmproxy1|proxy",

   #ESMproxy for HHproxy:
   "$hostHHproxy", "$useraccount", "cd $LIBRA_PATH/libra/bin/; LIBRA_PATH=$LIBRA_PATH LIBRA_VIEWERARGS=\\\"$viewerArgList\\\" LIBRA_PROXYARGS=\\\"$proxyArgList\\\" ./ex_esmproxy1 40000 1.1.1.1 0 > /usr/tmp/log.esmproxy", "ex_esmproxy1|proxy",

   # ipmz
   "$hostCTRL", "$useraccount", "cd $LIBRA_PATH/libra/bin/; LIBRA_PATH=$LIBRA_PATH ./ipmz 30001", "ipmz"
  );


#StartABoneProcess("aspinwall.cmcl.cs.cmu.edu");
#KillABoneProcess("aspinwall.cmcl.cs.cmu.edu");
#exit(0);

if (!defined($ARGV[0])) {
  Usage();
}

while (defined($ARGV[0])) {
  my $flag = shift(@ARGV);

  if ($flag eq "kill") { 
    DoKill();
    next;
  } 

  if ($flag eq "demo") { 
    DoDemo();
    next;
  }

  if ($flag eq "killabone") { 
    my $nd;
    foreach $nd (@abonenodes) {
        KillABoneProcess($nd);
    }
    next;
  }

  die "unknown flag $flag\n";
}


sub DoKill {
  while (1) {
    my $hostName = shift(@CMD);
    if (!defined($hostName)) { last; }
    
    my $user = shift(@CMD);
    my $cmd = shift(@CMD);
    my $binStr = shift(@CMD);
    my @BinArr = split(/\|/, $binStr);
    
    my $binName; foreach $binName (@BinArr) {
      #System("ssh -1 -f -l $user $hostName kill -9 `ps -auxww | grep $binName | grep -v grep | awk '{print \$2}'`");
      my $FOO = "kill -9 \\\`ps -auxww | grep $binName | grep -v grep | awk '{print \\\$2}'\\\`";
      System("export FOO=\"$FOO\" ; ssh -1 -f -l $user $hostName \$FOO");
    }
  }
}


sub KillABoneProcess {
  my ($host) = @_;

  # ABone command KILL (save this)
  #open(LOG, "$ANETD_BIN $ANETD_ARGLIST $host QUERY |");
  #my $line; while (defined($line=<LOG>)) {
  #  #print "$line";
  #  
  #  if (! ($line =~ "pid")) {next;}
  #
  #  #print "try to kill\n";
  #  my $pid = GetTokenAfter("pid", $line);
  #  if ($pid eq "") { next; }
  #  chop $pid;  # trailing \,
  #  
  #  System("$ANETD_BIN $ANETD_ARGLIST $host KILL $pid");
  #}  
  #close(LOG);

  
  # viewer system call to get ps and kill
  my $psOutFile = "Out.Kill";
  my $argList = ABoneArgList("-t $hostNTP ps auxww");
  my $programNameToKill = "proxy";

  System("$ANETD_BIN $ANETD_ARGLIST $host LOAD X=http://infocom.cmcl.cs.cmu.edu/executables/viewer $argList O=$psOutFile");

  System("sleep 15");

  my $GetPSCmdStr = "$ANETD_BIN $ANETD_ARGLIST $host GET $psOutFile";
  # print $GetPSCmdStr."\n";
  open(LOG, "$GetPSCmdStr |");
  my $line; while (defined($line=<LOG>)) {
    #print $line;
    if ((! ($line =~ $programNameToKill)) &&
        (! ($line =~ m/hwb/))) {
        next;
    }

    my @TokenArr = split(/\s+/, $line);
    my $pid = $TokenArr[1];

    #System("$ANETD_BIN $ANETD_ARGLIST $host KILL $pid");
    $argList = ABoneArgList("-t $hostNTP kill -9 $pid");
    System("$ANETD_BIN $ANETD_ARGLIST $host LOAD X=http://infocom.cmcl.cs.cmu.edu/executables/viewer $argList");
  }
  close(LOG);
}


sub StartABoneProcess {
  my ($host) = @_;
  
  System("$ANETD_BIN $ANETD_ARGLIST $host LOAD X=http://infocom.cmcl.cs.cmu.edu/executables/proxy S=-z R=err O=out C=\"CMU-NARADA\"");
}


sub ABoneArgList {
  my ($inputList) = @_;
  my $aboneList = "";

  my @ArgArr = split(/ /, $inputList);
  my $arg; foreach $arg (@ArgArr) {
    $aboneList = "$aboneList S=$arg";
  }
  return $aboneList;
}


sub Usage {
  print STDERR "\nusage: libra.pl [demo | kill | killabone]\n";
}


sub DoDemo {
  while (1) {
    my $hostName = shift(@CMD);
    if (!defined($hostName)) { last; }
    
    my $user = shift(@CMD);
    my $cmd = shift(@CMD);
    my $binName = shift(@CMD);
    
    #System("ssh -f -l $user $hostName \"bash -c '$cmd 1>&2'\"");
    System("ssh -1 -f -l $user $hostName \"bash -c '$cmd'\"");
  }
}



sub System {
    my($cmd) = $_[0];
    if ($DISABLE_SYSTEM) {
        print STDOUT "would execute $cmd\n";
    } else {
        print STDOUT "execute $cmd\n";
        system($cmd);
    }
}


