--- loncom/lonnet/perl/lonnet.pm 2007/03/28 00:05:45 1.851 +++ loncom/lonnet/perl/lonnet.pm 2007/03/28 00:12:58 1.852 @@ -1,7 +1,7 @@ # The LearningOnline Network # TCP networking package # -# $Id: lonnet.pm,v 1.851 2007/03/28 00:05:45 albertel Exp $ +# $Id: lonnet.pm,v 1.852 2007/03/28 00:12:58 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -7587,17 +7587,33 @@ BEGIN { %perlvar = (%perlvar,%{$configvars}); } +sub get_dns { + my ($url,$func) = @_; + open(my $config,"<$perlvar{'lonTabDir'}/hosts.tab"); + foreach my $dns (<$config>) { + next if ($dns !~ /^\^(\S*)/x); + $dns = $1; + my $ua=new LWP::UserAgent; + my $request=new HTTP::Request('GET',"http://$dns$url"); + my $response=$ua->request($request); + next if ($response->is_error()); + my @content = split("\n",$response->content); + &$func(\@content); + } + close($config); +} # ------------------------------------------------------------ Read domain file { + my $loaded; my %domain; - my $fh; - if (open($fh,"<".$Apache::lonnet::perlvar{'lonTabDir'}.'/domain.tab')) { - while (my $line = <$fh>) { - next if ($line =~ /^(\#|\s*$ )/); + sub parse_domain_tab { + my ($lines) = @_; + foreach my $line (@$lines) { + next if ($line =~ /^(\#|\s*$ )/x); chomp($line); - my ($name,@elements) = split(/:/,$line,9); + my ($name,@elements) = split(/:/,$line,9); my %this_domain; foreach my $field ('description', 'auth_def', 'auth_arg_def', 'lang_def', 'city', 'longi', 'lati', @@ -7605,12 +7621,24 @@ BEGIN { $this_domain{$field} = shift(@elements); } $domain{$name} = \%this_domain; -# &logthis("Domain.tab: $domain ".$domaindescription{$domain} ); + &logthis("Domain.tab: $name ".$domain{$name}{'description'} ); } } - close ($fh); + + sub load_domain_tab { + &get_dns('/adm/dns/domain',\&parse_domain_tab); + my $fh; + if (open($fh,"<".$perlvar{'lonTabDir'}.'/domain.tab')) { + my @lines = <$fh>; + &parse_domain_tab(\@lines); + } + close($fh); + $loaded = 1; + } sub domain { + &load_domain_tab() if (!$loaded); + my ($name,$what) = @_; return if ( !exists($domain{$name}) ); @@ -7627,41 +7655,65 @@ BEGIN { my %hostname; my %hostdom; my %libserv; - open(my $config,"<$perlvar{'lonTabDir'}/hosts.tab"); + my $loaded; - while (my $configline=<$config>) { - next if ($configline =~ /^(\#|\s*$)/); - chomp($configline); - my ($id,$domain,$role,$name)=split(/:/,$configline); - $name=~s/\s//g; - if ($id && $domain && $role && $name) { - $hostname{$id}=$name; - $hostdom{$id}=$domain; - if ($role eq 'library') { $libserv{$id}=$name; } - } + sub parse_hosts_tab { + my ($file) = @_; + foreach my $configline (@$file) { + next if ($configline =~ /^(\#|\s*$ )/x); + next if ($configline =~ /^\^/); + chomp($configline); + my ($id,$domain,$role,$name)=split(/:/,$configline); + $name=~s/\s//g; + if ($id && $domain && $role && $name) { + $hostname{$id}=$name; + $hostdom{$id}=$domain; + if ($role eq 'library') { $libserv{$id}=$name; } + } + &logthis("Hosts.tab: $name ".$id ); + } } - close($config); + + sub load_hosts_tab { + &get_dns('/adm/dns/hosts',\&parse_hosts_tab); + open(my $config,"<$perlvar{'lonTabDir'}/hosts.tab"); + my @config = <$config>; + &parse_hosts_tab(\@config); + close($config); + $loaded=1; + } + # FIXME: dev server don't want this, production servers _do_ want this #&get_iphost(); sub hostname { + &load_hosts_tab() if (!$loaded); + my ($lonid) = @_; return $hostname{$lonid}; } sub all_hostnames { + &load_hosts_tab() if (!$loaded); + return %hostname; } sub is_library { + &load_hosts_tab() if (!$loaded); + return exists($libserv{$_[0]}); } sub all_library { + &load_hosts_tab() if (!$loaded); + return %libserv; } sub get_servers { + &load_hosts_tab() if (!$loaded); + my ($domain,$type) = @_; my %possible_hosts = ($type eq 'library') ? %libserv : %hostname; @@ -7683,11 +7735,15 @@ BEGIN { } sub host_domain { + &load_hosts_tab() if (!$loaded); + my ($lonid) = @_; return $hostdom{$lonid}; } sub all_domains { + &load_hosts_tab() if (!$loaded); + my %seen; my @uniq = grep(!$seen{$_}++, values(%hostdom)); return @uniq;