#!/opt/SUNWstade/bin/perl -I/opt/SUNWstade/lib
require FCGI;
use Html;
use System;
use Http;
System->set_home("/opt/SUNWstade");


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

   $q = $ENV{QUERY_STRING};
   $user_agent = $ENV{HTTP_USER_AGENT} ;  #  storade_7654

   if (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();
      open(O, System->get_home(). "/System/config");
      my $version = <O>; close(O);
      my $master = "master=Y";
      if (-f System->get_home() . "/DATA/MASTER") {
         $master = "master=N";
      }
      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\n";


   } elsif (substr($q,0,15) eq "PUT=saveF&file=") {
      my $f  = substr($q,15);
      open(W, ">/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=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=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;

      open(O, "$com 2>&1|");
      while ($l = <O>) {
         print $l;
      }
      close(O);



   } 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 (open(O, $F)) {
        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);
        rename $F, "$F.P";
      }
   }
}


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>
# 
