--- loncom/configuration/Configuration.pm 2002/05/04 00:03:29 1.2 +++ loncom/configuration/Configuration.pm 2006/09/15 20:49:27 1.13 @@ -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.13 2006/09/15 20:49:27 raeburn Exp $ # # # Copyright Michigan State University Board of Trustees @@ -27,24 +27,39 @@ # 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.13 $ =~ /(\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"); + 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"); + } + open(CONFIG,'<'.$configdir.$filename) or + die("Can't read $configdir$filename"); while (my $configline=) { if ($configline =~ /^[^\#]*PerlSetVar/) { my ($unused,$varname,$varvalue)=split(/\s+/,$configline); @@ -58,6 +73,45 @@ sub read_conf { return ($perlvarref); } +#---------------------- 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 = ) { + 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 +125,16 @@ B - 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 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 and F), 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 and F), 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 +153,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 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: + +=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 -Scott Harrison +=back + + + +=head1 AUTHORS This library is free software; you can redistribute it and/or modify it under the same terms as LON-CAPA itself.