#!/opt/SUNWstade/bin/perl -I/opt/SUNWstade/lib
require FCGI;
use Html;
use System;
use Http;
use Util::Http;

System->set_home("/opt/SUNWstade");
my($renv) = PDM::ConfigFile->read();
System->set_renv($renv);
my $MASTER = Util->isSlave();

my $start_time = time;

#
# NEW COMMAND SHOULD START WITH RUN_ , or ELSE THE rasserv.conf MUST BE CHANGED
#

while (FCGI::accept() >= 0) {
   print "Content-type: text/html\n\n";

   $q = $ENV{QUERY_STRING};
   $user_agent = $ENV{HTTP_USER_AGENT} ;  #  storade_7654
   if ($renv->{xfer_log}) {
      open(W, ">>/opt/SUNWstade/log/xfer.log");
      print W Util->get_today() . " " . $q. "\n";
      close(W);
   }
   #
   # http(s)://proxy_ip:7654|7443/?GET=RUNPROXY&IP=ipno&TO=10&URL=original_url
   #
   if (substr($q,0,12) eq "GET=RUNPROXY") {
      my %Q;
      Http::parse(substr($q,12), \%Q, 0);
      $q = \%Q;

      my $port = $ENV{SERVER_PORT} || 7654;
      my $ip   = $Q{IP};
      $ip = $MASTER if ($ip eq "_MASTER_");
      my $to   = $Q{TO} || 30;
      my $url0  = Util->decode($Q{URL});
      my $http  = $port eq "7443" ? "https" : "http";
      my $url   = "$http://$ip:$port/$url0";
      my $arg   = {password => "peer:peer"};

      if ($ENV{REQUEST_METHOD} eq "POST") {
         my $len   = $ENV{CONTENT_LENGTH};
         my $start = 0;
         my $post_data;
         while ($len > 0) {
            $re = read(STDIN, $post_data, $len, $start);
            last if (!$re);
            $start += $re;
            $len -= $re;
         }
         my($err,$data) =  Util::Http->post($url, $post_data, $to, $arg);
         if ($err) {
           print "ERROR: $err<br>";
         } else {
           print $data;
         }
 
      } else {
        my($err, $data) = Util::Http->get($url, $to, $arg);
        if ($err) {
           print "ERROR: $err<br>";
        } else {
           print $data;
        }
      }
                

# REGISTER A SLAVE WITH THE MASTER OR ANOTHER SLAVE

   } elsif (substr($q,0,9) eq "XGET=Slave") {
      my %Q;
      Http::parse($q, \%Q, 0);
      my $fun = Http::loadPackage("get_", $Q{GET});
      $q = \%Q;
      eval {
        Http->runFunction($fun, $q);
      };
      if ($@) {
          print "\n\nExecution error: $@<br>";
          &log1("Execution error: $@ \n");
      }

   } elsif (substr($q,0,13) eq "GET=Scheduler") {
      my %Q;
      Http::parse($q, \%Q, 0);
      my $fun = Http::loadPackage("get_", $Q{GET});
      $q = \%Q;
      eval {
        Http->runFunction($fun, $q);
      };
      if ($@) {
          print "\n\nExecution error: $@<br>";
          &log1("Execution error: $@ \n");
      }

   } elsif ($q =~ /GET=PROCE&file=(\d+)/) {
      $pid = $1;
      my $F = "/proc/$pid/psinfo";
      if (-f  $F) {
         my @stat = stat($F);
         print "OK atime=$stat[9], secs=" . (time - $stat[9]) . "\n";
      } else {
         print "ER Cannot find $f\n";
      }
      

   } elsif (substr($q,0,9) eq "GET=INFO1") {
      my $hostid = System->hostid();
      my $renv = PDM::ConfigFile->readEnv();
      open(O, System->get_home(). "/System/config");
      my $version = <O>; close(O);
      my $master = "master=Y";
      my $M = System->get_home() . "/DATA/MASTER";
      my $master_address;
      if (-f $M) {
         $master = "master=N";
         open(O, $M); $master_address = <O>; close(O);
      }
      my $datahost = "datahost=" . ($renv->{DATAHOST} ? "Y":"N");
      my $proxy = "proxy=" . $renv->{proxy};

      my $perl_v = $];
      my ($solution, $model, $hostname, $custno);
      open(O, System->get_home() ."/DATA/rasagent.conf");
      while ($l = <O>) {
         if ($l =~ /^solution_model=(.*)/) {
           $model    = $1;
         } elsif ($l =~ /^solution=(.*)/) {
           $solution = $1;
         } elsif ($l =~ /^cust_no=(.*)/) {
           $custno = $1;
         } elsif ($l =~ /^hostname=(.*)/) {
           $hostname = $1;
         }
      }
      close(O);
      print "$hostid | $version | $master | $perl_v | $model | $hostname | $solution | $custno | $master_address | $datahost | $proxy\n";

   } elsif (substr($q,0,15) eq "GET=EXIST&file=") {
      my $f  = substr($q,15);
      if (-f $f) {
         print "Y\n";
      } else {
         print "N\n";
      }

   } elsif (substr($q,0,15) eq "PUT=saveF&file=" ||
            substr($q,0,15) eq "PUT=saveA&file=" ) {

      my $f  = substr($q,15);
      if (substr($q,0,9) eq "PUT=saveA") {
        open(W, ">>/opt/SUNWstade/DATA/$f");
      } else {
        if (substr($f,0,5) eq "topo/") {
          open(W2, ">/opt/SUNWstade/DATA/master_topo_marker");
          close(W2);
        }
        open(W, ">/opt/SUNWstade/DATA/$f");
	chmod 0664, "/opt/SUNWstade/DATA/$f";
      }
      $len   = $ENV{CONTENT_LENGTH};
      $start = 0;
      my $post_data;
      while ($len > 0) {
          $re = read(STDIN, $post_data, $len);
          last if (!$re);
          $len -= $re;
          print W $post_data;
      }
      close(W);
      print "OK\n";

   } elsif (substr($q,0,15) eq "GET=FILEA&file=") {
      my $f = substr($q,15); 
      if (index($q, "..") >= 0) {
         print "Error\n";
         break;
      }
      my(@stats) = stat(System->get_home() . "/DATA/$f");
      print "Age=$stats[9]\n";  # TIME STAMP OF FILE.


   } elsif (substr($q,0,15) eq "GET=FILER&file=") {
      my $f = substr($q,15);
      if (index($q, "..") >= 0) {
         print "Error\n";
         break;
      }
      open(O, "/opt/SUNWstade/DATA/$f");
      while ($l = <O>) {
         print $l;
      }
      close(O);

   } elsif (substr($q,0,15) eq "GET=RUNSY&comm=") {
      my $f = substr($q,15);
      $f = Util->decode($f);

      if (index($q, "..") >= 0) {
         print "Error\n";
         break;
      }
      my $com = "/opt/SUNWstade/" . $f;
      my $ix = index($com, " ");
      my $com2 = $ix > 0 ? substr($com,0,$ix) : $com;
      
      if (-x $com2) {
        print "$com started in background\n";
        system("$com&");
      } else {
        print "$com does not exists!\n";
      }
 
   } elsif (substr($q,0,15) eq "GET=RUNSS&comm=") {
      my $f = substr($q,15);
      $f =~ s/\+/ /g;
      if (index($q, "..") >= 0) {
         print "Error\n";
         break;
      }
      my $com = &validate_com($f);
      if (!$com) {
         print "\nError: Invalid command $f\n";
         break;
      }
      open(O, "$com|");
      while ($l = <O>) {
         print $l;
      }
      close(O);

   } elsif (substr($q,0,15) eq "GET=RUNIT&comm=" ||
            substr($q,0,15) eq "GET=RUNSE&comm=") {
      my $f = substr($q,15);
      $f =~ s/\+/ /g;
      if (index($q, "..") >= 0) {
         print "Error\n";
         break;
      }
      my $com = "/opt/SUNWstade/" . $f;

      if (substr($com,-1) eq "&") {
         system($com);
         print "\nOK\n";
      } else {
         open(O, "$com 2>&1|");
         while ($l = <O>) {
           print $l;
         }
         close(O);
      }

   } elsif (substr($q,0,15) eq "GET=DELET&file=") {
      my $f = substr($q,15);
      if (index($q, "..") >= 0) {
         print "Error\n";
         break;
      }
      my $F = "/opt/SUNWstade/DATA/$f";
      if (substr($F,-1) eq "/") {
        system("/bin/rm $F/*");
      } else {
        unlink $F;
      }
      print "Y\n";


   # RENAME FILE AND SEND IT
   #
   } elsif (substr($q,0,15) eq "GET=FILED&file=") {
      my $f = substr($q,15);
      if (index($q, "..") >= 0) {
         print "Error\n";
         break;
      }
      my $F = "/opt/SUNWstade/DATA/$f";
      if (-f $F) {
         rename $F, "$F.P";
         if (open(O, "$F.P")) {
           if ($f =~ /^SLAVE/) {
             my $date = Util->get_today();
             open(W, ">>/opt/SUNWstade/log/file_transfer.log");
             print W "$date transfer $f to $ENV{REMOTE_ADDR}\n";
             close(W);
           }
           while ($l = <O>) {
             print $l;
           }
           close(O);
         }
      }
   }
   exit if (time - $start_time > 60 * 60 * 2);
}


sub validate_com {
  my($com) = @_;
  my($l);
  my($com0, $rest) = split(/\s+/, $com, 2);

  open(O, "/opt/SUNWstade/System/ras_remote.list");
  while ($l = <O>) {
     chop($l);
     if ($l =~ /$com0$/) {
        return "$l $rest";
     }
  }
  close(O);
  return 0;
}

sub log1 {
  my($l) = @_;
  open(R, ">>/tmp/xfer.log"); print R "$l\n"; close(R);
}


# QUERY_STRING = PUT=saveF&file=test_save <br>
# SERVER_ADDR = 10.10.10.10 <br>
# CONTENT_TYPE = application/x-www-form-urlencoded <br>
# SERVER_PROTOCOL = HTTP/1.0 <br>
# SERVER_SIGNATURE = <ADDRESS>Apache/1.3.27 Server at 10.10.10.10 Port 8080</ADDRESS>
#  <br>
# REMOTE_PORT = 1110 <br>
# HTTP_USER_AGENT = storade_7654 <br>
# GATEWAY_INTERFACE = CGI/1.1 <br>
# HTTP_HOST = 10.10.10.10:8080 <br>
# SERVER_SOFTWARE = Apache/1.3.27 (Unix) mod_jk/1.1.0 mod_fastcgi/2.4.0 <br>
# SERVER_ADMIN = guest@linux <br>
# REMOTE_ADDR = 10.10.10.10 <br>
# SCRIPT_NAME = / <br>
# SERVER_NAME = 10.10.10.10 <br>
# DOCUMENT_ROOT = /opt/SUNWstade/htdocs <br>
# REQUEST_URI = /?PUT=saveF&file=test_save <br>
# FCGI_ROLE = RESPONDER <br>
# CONTENT_LENGTH = 683 <br>
# SCRIPT_FILENAME = /opt/SUNWstade/fcgi/xfer <br>
# REQUEST_METHOD = POST <br>
# PATH = /usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/usr/share:/usr/bin:/sbin:/usr/sbin:/etc/bin:/usr/java/j2re/bin <br>
# SERVER_PORT = 8080 <br>
# 
