[LON-CAPA-cvs] cvs: loncom / lond

foxr lon-capa-cvs@mail.lon-capa.org
Mon, 29 Sep 2003 10:09:18 -0000


foxr		Mon Sep 29 06:09:18 2003 EDT

  Modified files:              
    /loncom	lond 
  Log:
  Put in logic to reinit lond itself (except for apache reload).  I don't believe
  this logic works correctly yet, however lond still does everything it used to doso I'll do the commit anyway.
  
  
  
Index: loncom/lond
diff -u loncom/lond:1.147 loncom/lond:1.148
--- loncom/lond:1.147	Tue Sep 23 07:23:31 2003
+++ loncom/lond	Mon Sep 29 06:09:18 2003
@@ -2,7 +2,7 @@
 # The LearningOnline Network
 # lond "LON Daemon" Server (port "LOND" 5663)
 #
-# $Id: lond,v 1.147 2003/09/23 11:23:31 foxr Exp $
+# $Id: lond,v 1.148 2003/09/29 10:09:18 foxr Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -60,6 +60,10 @@
 # 09/08/2003 Ron Fox:  Told lond to take care of change logging so we
 #      don't have to remember it:
 # $Log: lond,v $
+# Revision 1.148  2003/09/29 10:09:18  foxr
+# Put in logic to reinit lond itself (except for apache reload).  I don't believe
+# this logic works correctly yet, however lond still does everything it used to doso I'll do the commit anyway.
+#
 # Revision 1.147  2003/09/23 11:23:31  foxr
 # Comlplete implementation of reinit functionality.  Must still implement
 # the actual initialization functionality, but the process can now
@@ -116,7 +120,7 @@
 my $status='';
 my $lastlog='';
 
-my $VERSION='$Revision: 1.147 $'; #' stupid emacs
+my $VERSION='$Revision: 1.148 $'; #' stupid emacs
 my $remoteVERSION;
 my $currenthostid;
 my $currentdomainid;
@@ -492,17 +496,7 @@
 
 # ------------------------------------------------------------- Read hosts file
 
-open (CONFIG,"$perlvar{'lonTabDir'}/hosts.tab") || die "Can't read host file";
 
-while (my $configline=<CONFIG>) {
-    my ($id,$domain,$role,$name,$ip)=split(/:/,$configline);
-    chomp($ip); $ip=~s/\D+$//;
-    $hostid{$ip}=$id;
-    $hostdom{$id}=$domain;
-    $hostip{$id}=$ip;
-    if ($id eq $perlvar{'lonHostID'}) { $thisserver=$name; }
-}
-close(CONFIG);
 
 # establish SERVER socket, bind and listen.
 $server = IO::Socket::INET->new(LocalPort => $perlvar{'londPort'},
@@ -552,6 +546,48 @@
 }
 
 #
+#    Kill off hashes that describe the host table prior to re-reading it.
+#    Hashes affected are:
+#       %hostid, %hostdom %hostip
+#
+sub KillHostHashes {
+    foreach my $key (keys %hostid) {
+	delete $hostid{$key};
+    }
+    foreach my $key (keys %hostdom) {
+	delete $hostdom{$key};
+    }
+    foreach my $key (keys %hostip) {
+	delete $hostip{$key};
+    }
+}
+#
+#   Read in the host table from file and distribute it into the various hashes:
+#
+#    - %hostid  -  Indexed by IP, the loncapa hostname.
+#    - %hostdom -  Indexed by  loncapa hostname, the domain.
+#    - %hostip  -  Indexed by hostid, the Ip address of the host.
+sub ReadHostTable {
+
+    open (CONFIG,"$perlvar{'lonTabDir'}/hosts.tab") || die "Can't read host file";
+    
+    while (my $configline=<CONFIG>) {
+	my ($id,$domain,$role,$name,$ip)=split(/:/,$configline);
+	chomp($ip); $ip=~s/\D+$//;
+	$hostid{$ip}=$id;
+	$hostdom{$id}=$domain;
+	$hostip{$id}=$ip;
+	if ($id eq $perlvar{'lonHostID'}) { $thisserver=$name; }
+    }
+    close(CONFIG);
+}
+#
+#  Reload the Apache daemon's state.
+#
+sub ReloadApache {
+}
+
+#
 #   Called in response to a USR2 signal.
 #   - Reread hosts.tab
 #   - All children connected to hosts that were removed from hosts.tab
@@ -563,8 +599,27 @@
 #
 sub UpdateHosts {
     logthis('<font color="blue"> Updating connections </font>');
+    #
+    #  The %children hash has the set of IP's we currently have children
+    #  on.  These need to be matched against records in the hosts.tab
+    #  Any ip's no longer in the table get killed off they correspond to
+    #  either dropped or changed hosts.  Note that the re-read of the table
+    #  will take care of new and changed hosts as connections come into being.
+
+
+    KillHostHashes;
+    ReadHostTable;
+
+    foreach my $child (keys %children) {
+	my $childip = $children{$child};
+	if(!$hostid{$childip}) {
+	    kill('INT', $child);
+	}
+    }
+    ReloadApache;
 }
 
+
 sub checkchildren {
     &initnewstatus();
     &logstatus();
@@ -809,6 +864,9 @@
 $SIG{USR1} = \&checkchildren;
 $SIG{USR2} = \&UpdateHosts;
 
+#  Read the host hashes:
+
+ReadHostTable;
 
 # --------------------------------------------------------------
 #   Accept connections.  When a connection comes in, it is validated
@@ -833,12 +891,23 @@
         or die "Can't block SIGINT for fork: $!\n";
 
     die "fork: $!" unless defined ($pid = fork);
+
+    $client->sockopt(SO_KEEPALIVE, 1); # Enable monitoring of
+	                               # connection liveness.
+
+    #
+    #  Figure out who we're talking to so we can record the peer in 
+    #  the pid hash.
+    #
+    my $caller = getpeername($client);
+    my ($port,$iaddr)=unpack_sockaddr_in($caller);
+    $clientip=inet_ntoa($iaddr);
     
     if ($pid) {
         # Parent records the child's birth and returns.
         sigprocmask(SIG_UNBLOCK, $sigset)
             or die "Can't unblock SIGINT for fork: $!\n";
-        $children{$pid} = 1;
+        $children{$pid} = $clientip;
         $children++;
         &status('Started child '.$pid);
         return;
@@ -865,12 +934,8 @@
 # =============================================================================
             # do something with the connection
 # -----------------------------------------------------------------------------
-	    $client->sockopt(SO_KEEPALIVE, 1);# Enable monitoring of
-	                                      # connection liveness.
-            # see if we know client and check for spoof IP by challenge
-		my $caller = getpeername($client);
-            my ($port,$iaddr)=unpack_sockaddr_in($caller);
-            $clientip=inet_ntoa($iaddr);
+	# see if we know client and check for spoof IP by challenge
+
             my $clientrec=($hostid{$clientip} ne undef);
             &logthis(
 "<font color=yellow>INFO: Connection, $clientip ($hostid{$clientip})</font>"