[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>"