--- loncom/LondConnection.pm 2004/09/14 11:46:29 1.34 +++ loncom/LondConnection.pm 2006/01/27 20:37:12 1.39 @@ -1,7 +1,7 @@ # This module defines and implements a class that represents # a connection to a lond daemon. # -# $Id: LondConnection.pm,v 1.34 2004/09/14 11:46:29 foxr Exp $ +# $Id: LondConnection.pm,v 1.39 2006/01/27 20:37:12 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -154,14 +154,18 @@ Dump the internal state of the object: F sub Dump { my $self = shift; my $level = shift; + my $now = time; + my $local = localtime($now); - if ($level <= $DebugLevel) { + if ($level >= $DebugLevel) { return; } + my $key; my $value; - print STDERR "Dumping LondConnectionObject:\n"; + print STDERR "[ $local ] Dumping LondConnectionObject:\n"; + print STDERR join(':',caller(1))."\n"; while(($key, $value) = each %$self) { print STDERR "$key -> $value\n"; } @@ -209,14 +213,13 @@ host the remote lond is on. This host is =cut sub new { - - my ($class, $Hostname, $Port) = @_; + my ($class, $DnsName, $Port) = @_; if (!$ConfigRead) { ReadConfig(); $ConfigRead = 1; } - &Debug(4,$class."::new( ".$Hostname.",".$Port.")\n"); + &Debug(4,$class."::new( ".$DnsName.",".$Port.")\n"); # The host must map to an entry in the hosts table: # We connect to the dns host that corresponds to that @@ -224,13 +227,16 @@ sub new { # negotion. In the objec these become the Host and # LoncapaHim fields of the object respectively. # - if (!exists $hostshash{$Hostname}) { - &Debug(8, "No Such host $Hostname"); + if (!exists $hostshash{$DnsName}) { + &Debug(8, "No Such host $DnsName"); return undef; # No such host!!! } - my @ConfigLine = @{$hostshash{$Hostname}}; - my $DnsName = $ConfigLine[3]; # 4'th item is dns of host. + my @ConfigLine = @{$hostshash{$DnsName}}; + my $Hostname = $ConfigLine[0]; # 0'th item is the msu id of host. Debug(5, "Connecting to ".$DnsName); + # if it is me use loopback for connection + if ($DnsName eq $LocalDns) { $DnsName="127.0.0.1"; } + Debug(8, "Connecting to $DnsName I am $LocalDns"); # Now create the object... my $self = { Host => $DnsName, LoncapaHim => $Hostname, @@ -239,6 +245,7 @@ sub new { AuthenticationMode => "", TransactionRequest => "", TransactionReply => "", + NextRequest => "", InformReadable => 0, InformWritable => 0, TimeoutCallback => undef, @@ -256,16 +263,16 @@ sub new { Type => SOCK_STREAM, Proto => "tcp", Timeout => 3)) { + Debug(8, "Error? \n$@ \n$!"); return undef; # Inidicates the socket could not be made. } my $socket = $self->{Socket}; # For local use only. # If we are local, we'll first try local auth mode, otherwise, we'll try # the ssl auth mode: - Debug(8, "Connecting to $DnsName I am $LocalDns"); my $key; my $keyfile; - if ($DnsName eq $LocalDns) { + if ($DnsName eq '127.0.0.1') { $self->{AuthenticationMode} = "local"; ($key, $keyfile) = lonlocal::CreateKeyFile(); Debug(8, "Local key: $key, stored in $keyfile"); @@ -501,7 +508,8 @@ sub Readable { return 0; } elsif ($self->{State} eq "ReadingVersionString") { - $self->{LondVersion} = chomp($self->{TransactionReply}); + chomp($self->{TransactionReply}); + $self->{LondVersion} = $self->{TransactionReply}; $self->Transition("SetHost"); $self->{InformReadable} = 0; $self->{InformWritable} = 1; @@ -554,11 +562,23 @@ sub Readable { $answer = $self->Decrypt($answer); $self->{TransactionReply} = "$answer\n"; } - + # if we have a NextRequest do it immeadiately + if ($self->{NextRequest}) { + $self->{TransactionRequest} = $self->{NextRequest}; + undef( $self->{NextRequest} ); + $self->{TransactionReply} = ""; + $self->{InformWritable} = 1; + $self->{InformReadable} = 0; + $self->{Timeoutable} = 1; + $self->{TimeoutRemaining} = $self->{TimeoutValue}; + $self->Transition("SendingRequest"); + return 0; + } else { # finish the transaction - $self->ToIdle(); - return 0; + $self->ToIdle(); + return 0; + } } elsif ($self->{State} eq "Disconnected") { # No connection. return -1; } else { # Internal error: Invalid state. @@ -710,14 +730,25 @@ sub InitiateTransaction { return -1; # Error indicator. } # if the transaction is to be encrypted encrypt the data: + (my $sethost, my $server,$data)=split(/:/,$data,3); if($data =~ /^encrypt\:/) { $data = $self->Encrypt($data); } # Setup the trasaction - - $self->{TransactionRequest} = $data; + # currently no version of lond supports inlining the sethost + if ($self->PeerVersion() <= 10000000) { + if ($server ne $self->{LoncapaHim}) { + $self->{NextRequest} = $data; + $self->{TransactionRequest} = "$sethost:$server\n"; + $self->{LoncapaHim} = $server; + } else { + $self->{TransactionRequest} = $data; + } + } else { + $self->{TransactionRequest} = "$sethost:$server:$data"; + } $self->{TransactionReply} = ""; $self->{InformWritable} = 1; $self->{InformReadable} = 0; @@ -1182,7 +1213,7 @@ sub read_conf #---------------------- Subroutine read_hosts: Read a LON-CAPA hosts.tab # formatted configuration file. # -my $RequiredCount = 5; # Required item count in hosts.tab. +my $RequiredCount = 4; # Required item count in hosts.tab. my $DefaultMaxCon = 5; # Default value for maximum connections. my $DefaultIdle = 1000; # Default connection idle time in seconds. my $DefaultMinCon = 0; # Default value for minimum connections. @@ -1191,9 +1222,10 @@ sub read_hosts { my $Filename = shift; my %HostsTab; - open(CONFIG,'<'.$Filename) or die("Can't read $Filename"); + open(CONFIG,'<'.$Filename) or die("Can't read $Filename"); while (my $line = ) { - if (!($line =~ /^\s*\#/)) { + if ($line !~ /^\s*\#/) { + $line=~s/\s*$//; my @items = split(/:/, $line); if(scalar @items >= $RequiredCount) { if (scalar @items == $RequiredCount) { # Only required items: @@ -1208,7 +1240,7 @@ sub read_hosts { { my @list = @items; # probably not needed but I'm unsure of # about the scope of item so... - $HostsTab{$list[0]} = \@list; + $HostsTab{$list[3]} = \@list; } } } @@ -1225,7 +1257,7 @@ sub read_hosts { # sub PeerVersion { my $self = shift; - + my ($version) = ($self->{LondVersion} =~ /Revision 1\.(\d+)/); return $self->{LondVersion}; } 500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.