version 1.22, 2003/11/03 10:48:18
|
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: |
|
|
Line 73 my %hostshash; # Host table as a host
|
Line 73 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 $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 112 USAGE
|
Line 120 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 { |
sub MakeLondConnection { |
my $host = shift; |
my $host = shift; |
|
|
my $Connection = LondConnection->new($host, $ServerPort); |
my $Connection = LondConnection->new($host, $ServerPort); |
return return $Connection; |
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 { |
sub NegotiateStartup { |
my $connection = shift; |
my $connection = shift; |
|
my $returnstatus = "ok"; # Optimistic!!. |
|
|
return "ok"; |
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 { |
sub PerformTransaction { |
my $connection = shift; |
my $connection = shift; |
Line 149 sub subreply {
|
Line 220 sub subreply {
|
return "Connect Failed"; |
return "Connect Failed"; |
} |
} |
my $reply = NegotiateStartup($connection); |
my $reply = NegotiateStartup($connection); |
if($reply != "ok") { |
if($reply ne "ok") { |
return "connection negotiation failed"; |
return "connection negotiation failed"; |
} |
} |
|
print "Connection negotiated\n"; |
my $reply = PerformTransaction($connection, $cmd); |
my $reply = PerformTransaction($connection, $cmd); |
return $reply; |
return $reply; |
|
|
Line 279 sub ReadConfig {
|
Line 351 sub ReadConfig {
|
$MyHost = $perlvar{lonHostID}; # Set hostname from vars. |
$MyHost = $perlvar{lonHostID}; # Set hostname from vars. |
$ServerPort = $perlvar{londPort}; |
$ServerPort = $perlvar{londPort}; |
} else { |
} else { |
my $hoststab = LondConnection::read_hosts($ForeignHostTab); |
|
%hostshash = %{$hoststab}; |
LondConnection::ReadForeignConfig($MyHost, $ForeignHostTab); |
$ServerPort = 5663; |
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. |