[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)) {