--- loncom/configuration/Configuration.pm	2002/05/04 00:03:29	1.2
+++ loncom/configuration/Configuration.pm	2007/08/30 20:19:35	1.14
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Configuration file reader
 #
-# $Id: Configuration.pm,v 1.2 2002/05/04 00:03:29 harris41 Exp $
+# $Id: Configuration.pm,v 1.14 2007/08/30 20:19:35 albertel Exp $
 #
 #
 # Copyright Michigan State University Board of Trustees
@@ -27,37 +27,105 @@
 # http://www.lon-capa.org/
 #
 # YEAR=2002
-# 05/03 Scott Harrison
 #
 ###
 
+# POD documentation is at the end of this short module.
+
 package LONCAPA::Configuration;
 
-$VERSION = sprintf("%d.%02d", q$Revision: 1.2 $ =~ /(\d+)\.(\d+)/);
+$VERSION = sprintf("%d.%02d", q$Revision: 1.14 $ =~ /(\d+)\.(\d+)/);
 
 use strict;
 
-my $confdir='/etc/httpd/conf/';
+my @confdirs=('/etc/httpd/conf/','/etc/apache2/');
 
-# ------------------------------------ read_conf: read LON-CAPA server configuration, especially PerlSetVar values
+# ------------------- Subroutine read_conf: read LON-CAPA server configuration.
+# This subroutine reads PerlSetVar values out of specified web server
+# configuration files.
 sub read_conf {
     my (@conf_files)=@_;
-    my %perlvar;
-    foreach my $filename (@conf_files) {
-	open(CONFIG,'<'.$confdir.$filename) or die("Can't read $filename");
-	while (my $configline=<CONFIG>) {
-	    if ($configline =~ /^[^\#]*PerlSetVar/) {
-		my ($unused,$varname,$varvalue)=split(/\s+/,$configline);
-		chomp($varvalue);
-		$perlvar{$varname}=$varvalue;
+    my (%perlvar,%configdirs);
+    foreach my $filename (@conf_files,'loncapa_apache.conf') {
+        my $configdir = '';
+        $configdirs{$filename} = [@confdirs];
+        while ($configdir eq '' && @{$configdirs{$filename}} > 0) {
+            my $testdir = shift(@{$configdirs{$filename}});
+            if (-e $testdir.$filename) {
+                $configdir = $testdir;
+            }
+        }
+        if ($configdir eq '') {
+            die("Couldn't find a directory containing $filename");
+        }
+	&process_file($configdir.$filename,\%perlvar);
+	if ($filename eq 'loncapa_apache.conf') {
+	    my @files = glob($configdir.'loncapa_apache_local*.conf');
+	    foreach my $file (@files) {
+		&process_file($file,\%perlvar);
 	    }
 	}
-	close(CONFIG);
     }
-    my $perlvarref=\%perlvar;
-    return ($perlvarref);
+    return (\%perlvar);
 }
 
+# --------------- Subroutine process_file: helper routine 
+# This subroutine does the actual file reading and reads PerlSetVar discovery
+# specified file, arguments are the filename and a ref to a hash to
+# place the values in
+sub process_file {
+    my ($file,$perlvar) = @_;
+    open(my $config,'<',$file) or
+	die("Can't read $file");
+    while (my $configline=<$config>) {
+	if ($configline =~ /^[^\#]*PerlSetVar/) {
+	    my ($unused,$varname,$varvalue)=split(/\s+/,$configline);
+	    chomp($varvalue);
+	    $perlvar->{$varname}=$varvalue;
+	}
+    }
+    close($config);
+}
+
+#---------------------- Subroutine read_hosts: Read a LON-CAPA hosts.tab
+# formatted configuration file.
+#
+my $RequiredCount = 5;		# 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.
+sub read_hosts {
+    my $Filename = shift;
+    my %HostsTab;
+    
+    open(CONFIG,'<'.$Filename) or die("Can't read $Filename");
+    while (my $line = <CONFIG>) {
+	if (!($line =~ /^\s*\#/)) {
+	    my @items = split(/:/, $line);
+	    if(scalar @items >= $RequiredCount) {
+		if (scalar @items == $RequiredCount) { # Only required items:
+		    $items[$RequiredCount] = $DefaultMaxCon;
+		}
+		if(scalar @items == $RequiredCount + 1) { # up through maxcon.
+		    $items[$RequiredCount+1] = $DefaultIdle;
+		}
+		if(scalar @items == $RequiredCount + 2) { # up through idle.
+		    $items[$RequiredCount+2] = $DefaultMinCon;
+		}
+		{
+		    my @list = @items; # probably not needed but I'm unsure of 
+		    # about the scope of item so...
+		    $HostsTab{$list[0]} = \@list; 
+		}
+	    }
+	}
+    }
+    close(CONFIG);
+    my $hostref = \%HostsTab;
+    return ($hostref);
+}
+
+1;
 __END__
 
 =pod
@@ -71,21 +139,16 @@ B<LONCAPA::Configuration> - configuratio
  use lib '/home/httpd/lib/perl/';
  use LONCAPA::Configuration;
 
- LONCAPA::Configuration::read_conf('access.conf','loncapa.conf');
-
-In the future, standard invocation of the command will be:
-
  LONCAPA::Configuration::read_conf('loncapa.conf');
-
-F<access.conf> is slowly becoming deprecated.  (We are currently
-trying to support backwards compatibility.)
+ LONCAPA::Configuration::read_hosts(filename);
 
 =head1 DESCRIPTION
 
-Many different parts of the LON-CAPA software need to read in the machine-specific
-configuration information.  These included scripts controlling the TCP/IP layer
-(e.g. F<lonc> and F<lond>), testing scripts (e.g. test_weblayer.pl and sqltest.pl),
-and utility scripts (e.g. clusterstatus.pl and metadata_keywords.pl).
+Many different parts of the LON-CAPA software need to reads in the
+machine-specific configuration information.  These included scripts
+controlling the TCP/IP layer (e.g. F<lonc> and F<lond>), testing scripts
+(e.g. test_weblayer.pl and sqltest.pl), and utility scripts
+(e.g. clusterstatus.pl and metadata_keywords.pl).
 
 The following methods are available:
 
@@ -104,13 +167,51 @@ have been initialized from the configura
 in the arguments.
 
 If multiple file names define the same hash key, then priority is
-given toward the last file name processed.
+given toward the B<last> file name processed.
 
 =back
 
-=head1 AUTHORS
+=over 4
+=item $hostinfo = LONCAPA::Configuration::read_hosts(filename);
+
+  The parameter is the name of a file in hosts.tab form.  The file is read and
+parsed.  The return value is a reference to a hash.   The hash is indexed by
+host and each element of the has is in turn a reference to an anonymous list
+containing:
 
-Scott Harrison
+=over 4
+=item host
+   The loncapa hostname of the system. (This may be different than the 
+   network hostname, see below).
+=item domain
+   The loncapa domain in which the host lives.
+=item role
+    The role of the system, currently allowed values are access for an
+    access server and library for a library server.
+=item dns
+    The DNS hostname of the system. 
+=item ip
+    The IP address corresponding to the dns hostname of the system.
+=item maxconn 
+    The maximum number of connections this system should hold to the
+    target system's lond.  If the file has no value, a default is supplied
+    here by the function.
+=item idle
+    The number of seconds the oldest idle connection can be idle before it
+    should be adaptively dropped.  If the file has no value, a default
+    is supplied by the function.
+=item mincon
+    The minimum number of connections this system should hold to the
+    target system's lond.  If the file has no value, a default is supplied by
+    the funciton.
+
+=back
+
+=back
+
+
+
+=head1 AUTHORS
 
 This library is free software; you can redistribute it and/or
 modify it under the same terms as LON-CAPA itself.