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

foxr lon-capa-cvs@mail.lon-capa.org
Tue, 14 Oct 2003 10:15:27 -0000


foxr		Tue Oct 14 06:15:27 2003 EDT

  Modified files:              
    /loncom	lond 
  Log:
  Supported rewrite of hosts.tab on the fly so that the local host's ip
  can be correct if it's hiding behind a masquerading network device such as a
  firewall.
  
  
Index: loncom/lond
diff -u loncom/lond:1.156 loncom/lond:1.157
--- loncom/lond:1.156	Mon Oct 13 04:49:54 2003
+++ loncom/lond	Tue Oct 14 06:15:27 2003
@@ -2,7 +2,7 @@
 # The LearningOnline Network
 # lond "LON Daemon" Server (port "LOND" 5663)
 #
-# $Id: lond,v 1.156 2003/10/13 08:49:54 foxr Exp $
+# $Id: lond,v 1.157 2003/10/14 10:15:27 foxr Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -85,7 +85,7 @@
 my $status='';
 my $lastlog='';
 
-my $VERSION='$Revision: 1.156 $'; #' stupid emacs
+my $VERSION='$Revision: 1.157 $'; #' stupid emacs
 my $remoteVERSION;
 my $currenthostid;
 my $currentdomainid;
@@ -268,7 +268,66 @@
 	return 0;
     }
 }
-
+#
+#  Host files are passed out with externally visible host IPs.
+#  If, for example, we are behind a fire-wall or NAT host, our 
+#  internally visible IP may be different than the externally
+#  visible IP.  Therefore, we always adjust the contents of the
+#  host file so that the entry for ME is the IP that we believe
+#  we have.  At present, this is defined as the entry that
+#  DNS has for us.  If by some chance we are not able to get a
+#  DNS translation for us, then we assume that the host.tab file
+#  is correct.  
+#    BUGBUGBUG - in the future, we really should see if we can
+#       easily query the interface(s) instead.
+# Parameter(s):
+#     contents    - The contents of the host.tab to check.
+# Returns:
+#     newcontents - The adjusted contents.
+#
+#
+sub AdjustHostContents {
+    my $contents  = shift;
+    my $adjusted;
+    my $me        = $perlvar{'lonHostID'};
+
+    foreach my $line (split(/\n/,$contents)) {
+	if(!(($line eq "") || ($line =~ /^ *\#/) || ($line =~ /^ *$/))) {
+	    chomp($line);
+	    my ($id,$domain,$role,$name,$ip,$maxcon,$idleto,$mincon)=split(/:/,$line);
+	    if ($id eq $me) {
+		open(PIPE, " /usr/bin/host $name |") || die "Cant' make host pipeline";
+		my $hostinfo = <PIPE>;
+		close PIPE;
+		
+		my ($hostname, $has, $address, $ipnew) = split(/ /,$hostinfo);
+		&logthis('<font color="green">'.
+			 "hostname = $hostname me = $me, name = $name   actual ip = $ipnew </font>");
+		
+		if ($hostname eq $name) { # Lookup succeeded..
+		    &logthis('<font color="green"> look up ok <font>');
+		    $ip = $ipnew;
+		} else {
+		    &logthis('<font color="green"> Lookup failed: '
+			     .$hostname." ne $name </font>");
+		}
+		#  Reconstruct the host line and append to adjusted:
+		
+		my $newline = "$id:$domain:$role:$name:$ip";
+		if($maxcon ne "") { # Not all hosts have loncnew tuning params
+		    $newline .= ":$maxcon:$idleto:$mincon";
+		}
+		$adjusted .= $newline."\n";
+		
+	    } else {		# Not me, pass unmodified.
+		$adjusted .= $line."\n";
+	    }
+	} else {                  # Blank or comment never re-written.
+	    $adjusted .= $line."\n";	# Pass blanks and comments as is.
+	}
+    }
+    return $adjusted;
+}
 #
 #   InstallFile: Called to install an administrative file:
 #       - The file is created with <name>.tmp
@@ -361,6 +420,16 @@
     &logthis('<font color="green"> Pushfile: backed up '
 	    .$tablefile." to $backupfile</font>");
     
+    #  If the file being pushed is the host file, we adjust the entry for ourself so that the
+    #  IP will be our current IP as looked up in dns.  Note this is only 99% good as it's possible
+    #  to conceive of conditions where we don't have a DNS entry locally.  This is possible in a 
+    #  network sense but it doesn't make much sense in a LonCAPA sense so we ignore (for now)
+    #  that possibilty.
+
+    if($filename eq "host") {
+	$contents = AdjustHostContents($contents);
+    }
+
     #  Install the new file:
 
     if(!InstallFile($tablefile, $contents)) {