Diff for /loncom/Attic/lonManage between versions 1.17 and 1.23

version 1.17, 2003/10/28 11:28:35 version 1.23, 2003/11/04 11:23:37
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:
   
 my %perlvar; # Perl variable defs from apache config.  my %perlvar; # Perl variable defs from apache config.
 my %hostshash; # Host table as a host indexed hash.  my %hostshash; # Host table as a host indexed hash.
   
   my $MyHost=""; # Host name to use as me.
   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.
 #  #
 sub Usage  {  sub Usage  {
     print "Usage:";      print "Usage:";
     print <<USAGE;      print <<USAGE;
     lonManage  --push=<tablename>  newfile  [host]   lonManage  [--myname=host --hosts=table] --push=<tablename>  newfile  [host]
         Push <tablename> to the lonTabs directory.  Note that          Push <tablename> to the lonTabs directory.  Note that
         <tablename> must be one of:          <tablename> must be one of:
            host  (hosts.tab)             host  (hosts.tab)
            domain (domain.tab)             domain (domain.tab)
   
     lonManage  --reinit=lonc [host]   lonManage [--myname=host --hosts=table] --reinit=lonc [host]
        Causes lonc in the remote system to reread hosts.tab and         Causes lonc in the remote system to reread hosts.tab and
        adjust the set of clients that are being maintained to match         adjust the set of clients that are being maintained to match
        the new file.         the new file.
                 
   
     lonManage  --reinit=lond [host]   lonManage [--myname=host --hosts=table] --reinit=lond [host]
        Causes lond in the remote system to reread the hosts.tab file         Causes lond in the remote system to reread the hosts.tab file
        and adjust the set of servers to match changes in that file.         and adjust the set of servers to match changes in that file.
   
Line 99  sub Usage  { Line 111  sub Usage  {
     If [host] is omitted, all hosts in the hosts.tab file are iterated      If [host] is omitted, all hosts in the hosts.tab file are iterated
     over.      over.
   
    For all of the above syntaxes if --myname=host and --hosts=table are
    supplied (both must be present), the utility runs in standalone mode
    presenting itself to the world as 'host' and using the hosts.tab file
    specified in the --hosts switch.
 USAGE  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;
   }
   #
   #    This function runs through the section of the connection
   #   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;
   }
   sub PerformTransaction {
       my $connection  = shift;
       my $command     = shift;
   
       return "ok";
   }
 #  #
 #   Lifted from lonnet.pm - and we need to figure out a way to get it back in.  # Performs a transaction direct to a remote lond.
 #   Performas a transaction with lond via the lonc proxy server.  
 #   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 114  USAGE Line 211  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 150  sub subreply { Line 264  sub subreply {
 #   returns an empty list if the parse fails.  #   returns an empty list if the parse fails.
 #  #
   
   
 sub ParseArgs {  sub ParseArgs {
     my $pushing   = '';      my $pushing   = '';
     my $reinitting = '';      my $reinitting = '';
   
     if(!GetOptions('push=s'    => \$pushing,      if(!GetOptions('push=s'    => \$pushing,
            'reinit=s'  => \$reinitting)) {             'reinit=s'  => \$reinitting,
      'myname=s' => \$MyHost,
      'hosts=s' => \$ForeignHostTab)) {
    return ();
       }
       #  The --myname and --hosts switch must have values and
       #  most both appear if either appears:
   
       if(($MyHost ne "") && ($ForeignHostTab eq "")) {
    return ();
       }
       if(($ForeignHostTab ne "") && ($MyHost eq "")) {
  return ();   return ();
     }      }
   
Line 208  sub ParseArgs { Line 334  sub ParseArgs {
     return @result;      return @result;
 }  }
 #  #
 #  Read the loncapa configuration stuff.  #  Read the loncapa configuration stuff.  If ForeignHostTab is empty,
   #  assume we are part of a loncapa cluster and read the hosts.tab
   #  file from the config directory.  Otherwise, ForeignHossTab
   #  is the name of an alternate configuration file to read in 
   #  standalone mode.
 #  #
 sub ReadConfig {  sub ReadConfig {
     my $perlvarref = LondConnection::read_conf('loncapa.conf');  
     %perlvar       = %{$perlvarref};  
     my $hoststab   = LondConnection::read_hosts(  
  "$perlvar{'lonTabDir'}/hosts.tab");  
     %hostshash     = %{$hoststab};  
   
       if($ForeignHostTab eq "") {
    my $perlvarref = LondConnection::read_conf('loncapa.conf');
    %perlvar       = %{$perlvarref};
    my $hoststab   = LondConnection::read_hosts(
       "$perlvar{'lonTabDir'}/hosts.tab");
    %hostshash     = %{$hoststab};
    $MyHost        = $perlvar{lonHostID}; # Set hostname from vars.
    $ServerPort    = $perlvar{londPort};
       } else {
   
    LondConnection::ReadForeignConfig($MyHost, $ForeignHostTab);
     my $hoststab = LondConnection::read_hosts($ForeignHostTab); #  we need to know too.
     %hostshash   = %{$hoststab};
     $ServerPort    = $DefaultServerPort;
         }
       
 }  }
 #  #
 #  Determine if the target host is valid.  #  Determine if the target host is valid.
Line 369  sub ReinitProcess { Line 510  sub ReinitProcess {
 }  }
 #--------------------------- Entry point: --------------------------  #--------------------------- Entry point: --------------------------
   
 ReadConfig; # Read the configuration info (incl.hosts).  
   
   
 #  Parse the parameters  #  Parse the parameters
Line 389  if ($EUID != 0) { Line 529  if ($EUID != 0) {
     die "ENOPRIV - No privilege for requested operation"      die "ENOPRIV - No privilege for requested operation"
 }  }
   
   #
   #   Read the configuration file.
   #   
   
   ReadConfig; # Read the configuration info (incl.hosts).
   
 #   Based on the operation requested invoke the appropriate function:  #   Based on the operation requested invoke the appropriate function:
   

Removed from v.1.17  
changed lines
  Added in v.1.23


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