Diff for /loncom/Attic/lonManage between versions 1.20 and 1.24

version 1.20, 2003/11/03 10:24:49 version 1.24, 2003/11/04 11:36:04
Line 63  use lib "."; Line 63  use lib ".";
 use strict; # Because it's good practice.  use strict; # Because it's good practice.
 use English; # Cause I like meaningful names.  use English; # Cause I like meaningful names.
 use Getopt::Long;  use Getopt::Long;
 use IO::Socket::UNIX; # To communicate with lonc.  
 use LondConnection;  use LondConnection;
   use IO::Poll qw(POLLRDNORM POLLWRNORM POLLIN POLLHUP POLLOUT);
   
 # File scoped variables:  # File scoped variables:
   
Line 74  my %hostshash;   # Host table as a host Line 74  my %hostshash;   # Host table as a host
 my $MyHost=""; # Host name to use as me.  my $MyHost=""; # Host name to use as me.
 my $ForeignHostTab=""; # Name of foreign hosts table.  my $ForeignHostTab=""; # Name of foreign hosts table.
   
   my $DefaultServerPort =  5663; # Default server port if standalone.
   my $ServerPort; # Port used to connect to lond.
   
   my $TransitionTimeout = 5; # Poll timeout in seconds.
   
   
   # LondConnection::SetDebug(10);
   
   
 #  #
 #   prints out utility's command usage info.  #   prints out utility's command usage info.
 #  #
Line 110  USAGE Line 119  USAGE
   
   
 }  }
   
   #
   #  Make a direct connection to the lond in 'host'.  The port is 
   #  gotten from the global variable:  ServerPort.
   #  Returns:
   #    The connection or undef if one could not be formed.
   #
   sub MakeLondConnection {
       my $host = shift;
   
       my $Connection = LondConnection->new($host, $ServerPort);
       return return $Connection;
   }
 #  #
 #   Lifted from lonnet.pm - and we need to figure out a way to get it back in.  #    This function runs through the section of the connection
 #   Performas a transaction with lond via the lonc proxy server.  #   state machine that has to do with negotiating the startup 
   #   sequence with lond.  The general strategy is to loop
   #   until the connection state becomes idle or disconnected.
   #   Disconnected indicates an error or rejection of the
   #   connection at some point in the negotiation.
   #   idle indicates a connection ready for a request.
   #   The main loop consults the object to determine if it
   #   wants to be writeable or readable, waits for that
   #   condition on the socket (with timeout) and  then issues
   #   the appropriate LondConnection call. Note that
   #   LondConnection is capable of doing everything necessary
   #   to get to the initial idle state.
   # 
   #
   #  Parameters:
   #     connection - A connection that has been created with
   #                  the remote lond.  This connection should
   #                  be in the Connected state ready to send
   #                  the init sequence.
   #
   sub NegotiateStartup {
       my $connection = shift;
       my $returnstatus = "ok"; # Optimistic!!.
   
       my $state      = $connection->GetState;
       if($state ne "Connected") {
    print "Error: Initial lond connection state: $state should be Connected\n";
    return "error";
       }
       my $Socket     = $connection->GetSocket; # This is a IO:Socket::INET object.
   
       #  Ready now to enter the main loop:
       #
       my $error = 0;
       while (($connection->GetState ne "Idle") && (!$error)) {
    #
    #   Wait for the socket to get into the appropriate state:
    #
    my $wantread = $connection->WantReadable; 
    my $poll     = new IO::Poll;
    $poll->mask($Socket => $wantread ? POLLIN : POLLOUT);
    $poll->poll($TransitionTimeout);
    my $done     = $poll->handles();
    if(scalar($done) == 0) {                       # Timeout!!!
       print "Error: Timeout in state : $state negotiating connection\n";
       $returnstatus = "error";
       $error = 1;
    } else {
       my $status;
       $status = $wantread ? $connection->Readable : $connection->Writable;
       if ($status != 0) {
    print "Error: I/O failed in state : $state negotiating connection\n";
    $returnstatus = "error";
    $error = 1;
       }
    }
       }
   
       
       return $returnstatus;
   }
   #
   #   Perform a transaction with the remote lond.
   #   Paramters:
   #      connection - the connection object that represents
   #                   a LondConnection to the remote lond.
   #      command    - The request to send to the remote system.
   #   Returns:
   #       The 'reaction' of the lond to this command.
   #       However if the connection to lond is lost during the transaction
   #       or some other error occurs, the text "error:con_lost" is returned.
   #    
   sub PerformTransaction {
       my $connection  = shift;
       my $command     = shift;
       my $retval;                          # What we'll returnl.
      
       #  Set up the connection to do the transaction then
       #  do the I/O until idle or error.
       #
       $connection->InitiateTransaction($command);
       my $error      = 0;
       my $Socket    = $connection->GetSocket;
       my $state;
   
       while (($connection->GetState ne "Idle") && (!$error)) {
    #
    #   Wait for the socket to get into the appropriate state:
    #
    my $wantread = $connection->WantReadable; 
    my $poll     = new IO::Poll;
    $poll->mask($Socket => $wantread ? POLLIN : POLLOUT);
    $poll->poll($TransitionTimeout);
    my $done     = $poll->handles();
    if(scalar($done) == 0) {                       # Timeout!!!
       print "Error: Timeout in state : $state negotiating connection\n";
       $retval = "error";
       $error = 1;
    } else {
       my $status;
       $status = $wantread ? $connection->Readable : $connection->Writable;
       if ($status != 0) {
    print "Error: I/O failed in state : $state negotiating connection\n";
    $retval = "error";
    $error = 1;
       }
    }
       }
       #
       #  Fetch the reply from the transaction
       #
       if(! $error) {
    $retval = $connection->GetReply;
       }
   
       return $retval;
   }
   #
   # Performs a transaction direct to a remote lond.
 #   Parameter:  #   Parameter:
 #      cmd  - The text of the request.  #      cmd  - The text of the request.
 #      host - The host to which the request ultimately goes.  #      host - The host to which the request ultimately goes.
Line 121  USAGE Line 261  USAGE
 #      lond/lonc etc.  #      lond/lonc etc.
 #  #
 sub subreply {  sub subreply {
     my ($cmd,$server)=@_;      my $cmd = shift;
     my $peerfile="$perlvar{'lonSockDir'}/$server";      my $host = shift;
     my $client=IO::Socket::UNIX->new(Peer    =>"$peerfile",  
                                      Type    => SOCK_STREAM,  
                                      Timeout => 10)      my $connection  = MakeLondConnection($host);
        or return "con_lost";      if ($connection eq undef) {
     print $client "$cmd\n";   return "Connect Failed";
     my $answer=<$client>;      }
     if (!$answer) { $answer="con_lost"; }      my $reply = NegotiateStartup($connection);
     chomp($answer);      if($reply ne "ok") {
     return $answer;   return "connection negotiation failed";
       }
       print "Connection negotiated\n";
       my $reply =  PerformTransaction($connection, $cmd);
       return $reply;
   
   
        #    my ($cmd,$server)=@_;
        #    my $peerfile="$perlvar{'lonSockDir'}/$server";
        #    my $client=IO::Socket::UNIX->new(Peer    =>"$peerfile",
        #                                     Type    => SOCK_STREAM,
        #                                     Timeout => 10)
        #       or return "con_lost";
        #    print $client "$cmd\n";
        #    my $answer=<$client>;
        #    if (!$answer) { $answer="con_lost"; }
        #    chomp($answer);
        #    return $answer;
 }  }
 #   >>> BUGBUG <<<   #   >>> BUGBUG <<< 
 #  #
Line 242  sub ReadConfig { Line 399  sub ReadConfig {
     "$perlvar{'lonTabDir'}/hosts.tab");      "$perlvar{'lonTabDir'}/hosts.tab");
  %hostshash     = %{$hoststab};   %hostshash     = %{$hoststab};
  $MyHost        = $perlvar{lonHostID}; # Set hostname from vars.   $MyHost        = $perlvar{lonHostID}; # Set hostname from vars.
    $ServerPort    = $perlvar{londPort};
     } else {      } else {
  my $hoststab   = LondConnection::read_hosts($ForeignHostTab);  
  %hostshash     = %{$hoststab};   LondConnection::ReadForeignConfig($MyHost, $ForeignHostTab);
  $perlvar{londPort}   = 5663;    my $hoststab = LondConnection::read_hosts($ForeignHostTab); #  we need to know too.
  $perlvar{lonSockDir} = "/home/httpd/sockets";    %hostshash   = %{$hoststab};
     }    $ServerPort    = $DefaultServerPort;
         }
       
 }  }
 #  #
 #  Determine if the target host is valid.  #  Determine if the target host is valid.

Removed from v.1.20  
changed lines
  Added in v.1.24


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>