version 1.862, 2007/04/04 00:07:07
|
version 1.876, 2007/05/14 17:35:08
|
Line 31 package Apache::lonnet;
|
Line 31 package Apache::lonnet;
|
|
|
use strict; |
use strict; |
use LWP::UserAgent(); |
use LWP::UserAgent(); |
use HTTP::Headers; |
|
use HTTP::Date; |
use HTTP::Date; |
# use Date::Parse; |
# use Date::Parse; |
use vars |
use vars qw(%perlvar %spareid %pr %prp $memcache %packagetab $tmpdir |
qw(%perlvar %badServerCache %spareid |
$_64bit %env); |
%pr %prp $memcache %packagetab |
|
%courselogs %accesshash %userrolehash %domainrolehash $processmarker $dumpcount |
my (%badServerCache, $memcache, %courselogs, %accesshash, %domainrolehash, |
%coursedombuf %coursenumbuf %coursehombuf %coursedescrbuf %courseinstcodebuf %courseownerbuf %coursetypebuf |
%userrolehash, $processmarker, $dumpcount, %coursedombuf, |
$tmpdir $_64bit %env); |
%coursenumbuf, %coursehombuf, %coursedescrbuf, %courseinstcodebuf, |
|
%courseownerbuf, %coursetypebuf); |
|
|
use IO::Socket; |
use IO::Socket; |
use GDBM_File; |
use GDBM_File; |
use HTML::LCParser; |
use HTML::LCParser; |
use HTML::Parser; |
|
use Fcntl qw(:flock); |
use Fcntl qw(:flock); |
use Storable qw(lock_store lock_nstore lock_retrieve freeze thaw nfreeze); |
use Storable qw(thaw nfreeze); |
use Time::HiRes qw( gettimeofday tv_interval ); |
use Time::HiRes qw( gettimeofday tv_interval ); |
use Cache::Memcached; |
use Cache::Memcached; |
use Digest::MD5; |
use Digest::MD5; |
Line 182 sub subreply {
|
Line 181 sub subreply {
|
$client=IO::Socket::UNIX->new(Peer =>"$peerfile", |
$client=IO::Socket::UNIX->new(Peer =>"$peerfile", |
Type => SOCK_STREAM, |
Type => SOCK_STREAM, |
Timeout => 10); |
Timeout => 10); |
if($client) { |
if ($client) { |
last; # Connected! |
last; # Connected! |
} else { |
} else { |
&create_connection(&hostname($server),$server); |
&create_connection(&hostname($server),$server); |
Line 671 sub homeserver {
|
Line 670 sub homeserver {
|
return 'no_host'; |
return 'no_host'; |
} |
} |
|
|
# ---------------------- Get domain configuration for a domain |
|
sub get_domainconf { |
|
my ($udom) = @_; |
|
my $cachetime=1800; |
|
my ($result,$cached)=&is_cached_new('domainconfig',$udom); |
|
if (defined($cached)) { return %{$result}; } |
|
|
|
if ($udom eq '') { |
|
$udom = &Apache::loncommon::determinedomain(); |
|
} |
|
my %domconfig = &get_dom('configuration',['login','rolecolors'],$udom); |
|
my %designhash; |
|
if (keys(%domconfig) > 0) { |
|
if (ref($domconfig{'login'}) eq 'HASH') { |
|
foreach my $key (keys(%{$domconfig{'login'}})) { |
|
$designhash{$udom.'.login.'.$key}=$domconfig{'login'}{$key}; |
|
} |
|
} |
|
if (ref($domconfig{'rolecolors'}) eq 'HASH') { |
|
foreach my $role (keys(%{$domconfig{'rolecolors'}})) { |
|
if (ref($domconfig{'rolecolors'}{$role}) eq 'HASH') { |
|
foreach my $item (keys(%{$domconfig{'rolecolors'}{$role}})) { |
|
$designhash{$udom.'.'.$role.'.'.$item}=$domconfig{'rolecolors'}{$role}{$item}; |
|
} |
|
} |
|
} |
|
} |
|
} else { |
|
my $designdir=$perlvar{'lonTabDir'}.'/lonDomColors'; |
|
my $designfile = $designdir.'/'.$udom.'.tab'; |
|
if (-e $designfile) { |
|
if ( open (my $fh,"<$designfile") ) { |
|
while (my $line = <$fh>) { |
|
next if ($line =~ /^\#/); |
|
chomp($line); |
|
my ($key,$val)=(split(/\=/,$line)); |
|
if ($val) { $designhash{$udom.'.'.$key}=$val; } |
|
} |
|
close($fh); |
|
} |
|
} |
|
if (-e '/home/httpd/html/adm/lonDomLogos/'.$udom.'.gif') { |
|
$designhash{$udom.'.login.domlogo'} = |
|
&lonhttpdurl("/adm/lonDomLogos/$udom.gif"); |
|
} |
|
} |
|
&do_cache_new('domainconfig',$udom,\%designhash,$cachetime); |
|
return %designhash; |
|
} |
|
|
|
sub devalidate_domconfig_cache { |
|
my ($udom)=@_; |
|
&devalidate_cache_new('domainconfig',$udom); |
|
} |
|
|
|
# ------------------------------------- Find the usernames behind a list of IDs |
# ------------------------------------- Find the usernames behind a list of IDs |
|
|
sub idget { |
sub idget { |
Line 800 sub get_dom {
|
Line 744 sub get_dom {
|
if (defined(&domain($udom,'primary'))) { |
if (defined(&domain($udom,'primary'))) { |
$uhome=&domain($udom,'primary'); |
$uhome=&domain($udom,'primary'); |
} else { |
} else { |
$uhome eq ''; |
undef($uhome); |
} |
} |
} else { |
} else { |
if (!$uhome) { |
if (!$uhome) { |
Line 811 sub get_dom {
|
Line 755 sub get_dom {
|
} |
} |
if ($udom && $uhome && ($uhome ne 'no_host')) { |
if ($udom && $uhome && ($uhome ne 'no_host')) { |
my $rep=&reply("getdom:$udom:$namespace:$items",$uhome); |
my $rep=&reply("getdom:$udom:$namespace:$items",$uhome); |
|
my %returnhash; |
|
if ($rep eq '' || $rep =~ /^error: 2 /) { |
|
return %returnhash; |
|
} |
my @pairs=split(/\&/,$rep); |
my @pairs=split(/\&/,$rep); |
if ( $#pairs==0 && $pairs[0] =~ /^(con_lost|error|no_such_host)/i) { |
if ( $#pairs==0 && $pairs[0] =~ /^(con_lost|error|no_such_host)/i) { |
return @pairs; |
return @pairs; |
} |
} |
my %returnhash=(); |
|
my $i=0; |
my $i=0; |
foreach my $item (@$storearr) { |
foreach my $item (@$storearr) { |
$returnhash{$item}=&thaw_unescape($pairs[$i]); |
$returnhash{$item}=&thaw_unescape($pairs[$i]); |
Line 836 sub put_dom {
|
Line 783 sub put_dom {
|
if (defined(&domain($udom,'primary'))) { |
if (defined(&domain($udom,'primary'))) { |
$uhome=&domain($udom,'primary'); |
$uhome=&domain($udom,'primary'); |
} else { |
} else { |
$uhome eq ''; |
undef($uhome); |
} |
} |
} else { |
} else { |
if (!$uhome) { |
if (!$uhome) { |
Line 881 sub retrieve_inst_usertypes {
|
Line 828 sub retrieve_inst_usertypes {
|
return (\%returnhash,\@order); |
return (\%returnhash,\@order); |
} |
} |
|
|
|
sub is_domainimage { |
|
my ($url) = @_; |
|
if ($url=~m-^/+res/+($match_domain)/+\1\-domainconfig/+(img|logo|domlogo)/+-) { |
|
if (&domain($1) ne '') { |
|
return '1'; |
|
} |
|
} |
|
return; |
|
} |
|
|
# --------------------------------------------------- Assign a key to a student |
# --------------------------------------------------- Assign a key to a student |
|
|
sub assign_access_key { |
sub assign_access_key { |
Line 1107 my $kicks=0;
|
Line 1064 my $kicks=0;
|
my $hits=0; |
my $hits=0; |
sub make_key { |
sub make_key { |
my ($name,$id) = @_; |
my ($name,$id) = @_; |
if (length($id) > 200) { $id=length($id).':'.&Digest::MD5::md5_hex($id); } |
if (length($id) > 65 |
|
&& length(&escape($id)) > 200) { |
|
$id=length($id).':'.&Digest::MD5::md5_hex($id); |
|
} |
return &escape($name.':'.$id); |
return &escape($name.':'.$id); |
} |
} |
|
|
Line 1154 sub do_cache_new {
|
Line 1114 sub do_cache_new {
|
$time=600; |
$time=600; |
} |
} |
if ($debug) { &Apache::lonnet::logthis("Setting $id to $value"); } |
if ($debug) { &Apache::lonnet::logthis("Setting $id to $value"); } |
$memcache->set($id,$setvalue,$time); |
if (!($memcache->set($id,$setvalue,$time))) { |
|
&logthis("caching of id -> $id failed"); |
|
} |
# need to make a copy of $value |
# need to make a copy of $value |
#&make_room($id,$value,$debug); |
#&make_room($id,$value,$debug); |
return $value; |
return $value; |
Line 2188 sub get_my_roles {
|
Line 2150 sub get_my_roles {
|
my %returnhash=(); |
my %returnhash=(); |
my $now=time; |
my $now=time; |
foreach my $entry (keys(%dumphash)) { |
foreach my $entry (keys(%dumphash)) { |
my ($tend,$tstart)=split(/\:/,$dumphash{$entry}); |
my ($role,$tend,$tstart); |
|
if ($context eq 'userroles') { |
|
($role,$tend,$tstart)=split(/_/,$dumphash{$entry}); |
|
} else { |
|
($tend,$tstart)=split(/\:/,$dumphash{$entry}); |
|
} |
if (($tstart) && ($tstart<0)) { next; } |
if (($tstart) && ($tstart<0)) { next; } |
my $status = 'active'; |
my $status = 'active'; |
if (($tend) && ($tend<$now)) { |
if (($tend) && ($tend<$now)) { |
Line 2206 sub get_my_roles {
|
Line 2173 sub get_my_roles {
|
next; |
next; |
} |
} |
} |
} |
my ($role,$username,$domain,$section)=split(/\:/,$entry); |
my ($rolecode,$username,$domain,$section,$area); |
|
if ($context eq 'userroles') { |
|
($area,$rolecode) = split(/_/,$entry); |
|
(undef,$domain,$username,$section) = split(/\//,$area); |
|
} else { |
|
($role,$username,$domain,$section) = split(/\:/,$entry); |
|
} |
if (ref($roledoms) eq 'ARRAY') { |
if (ref($roledoms) eq 'ARRAY') { |
if (!grep(/^\Q$domain\E$/,@{$roledoms})) { |
if (!grep(/^\Q$domain\E$/,@{$roledoms})) { |
next; |
next; |
Line 2216 sub get_my_roles {
|
Line 2189 sub get_my_roles {
|
if (!grep(/^\Q$role\E$/,@{$roles})) { |
if (!grep(/^\Q$role\E$/,@{$roles})) { |
next; |
next; |
} |
} |
} |
} |
$returnhash{$username.':'.$domain.':'.$role}=$tstart.':'.$tend; |
$returnhash{$username.':'.$domain.':'.$role}=$tstart.':'.$tend; |
} |
} |
return %returnhash; |
return %returnhash; |
Line 3641 sub get_portfolio_access {
|
Line 3614 sub get_portfolio_access {
|
} |
} |
if (@users > 0) { |
if (@users > 0) { |
foreach my $userkey (@users) { |
foreach my $userkey (@users) { |
if (exists($access_hash->{$userkey}{'users'}{$env{'user.name'}.':'.$env{'user.domain'}})) { |
if (ref($access_hash->{$userkey}{'users'}) eq 'ARRAY') { |
return 'ok'; |
foreach my $item (@{$access_hash->{$userkey}{'users'}}) { |
} |
if (ref($item) eq 'HASH') { |
|
if (($item->{'uname'} eq $env{'user.name'}) && |
|
($item->{'udom'} eq $env{'user.domain'})) { |
|
return 'ok'; |
|
} |
|
} |
|
} |
|
} |
} |
} |
} |
} |
my %roleshash; |
my %roleshash; |
Line 4474 sub userlog_query {
|
Line 4454 sub userlog_query {
|
|
|
sub auto_run { |
sub auto_run { |
my ($cnum,$cdom) = @_; |
my ($cnum,$cdom) = @_; |
my $homeserver = &homeserver($cnum,$cdom); |
my $response = 0; |
my $response = &reply('autorun:'.$cdom,$homeserver); |
my $settings; |
|
my %domconfig = &get_dom('configuration',['autoenroll'],$cdom); |
|
if (ref($domconfig{'autoenroll'}) eq 'HASH') { |
|
$settings = $domconfig{'autoenroll'}; |
|
if ($settings->{'run'} eq '1') { |
|
$response = 1; |
|
} |
|
} else { |
|
my $homeserver = &homeserver($cnum,$cdom); |
|
$response = &reply('autorun:'.$cdom,$homeserver); |
|
} |
return $response; |
return $response; |
} |
} |
|
|
Line 4505 sub auto_validate_courseID {
|
Line 4495 sub auto_validate_courseID {
|
} |
} |
|
|
sub auto_create_password { |
sub auto_create_password { |
my ($cnum,$cdom,$authparam) = @_; |
my ($cnum,$cdom,$authparam,$udom) = @_; |
my $homeserver = &homeserver($cnum,$cdom); |
my ($homeserver,$response); |
my $create_passwd = 0; |
my $create_passwd = 0; |
my $authchk = ''; |
my $authchk = ''; |
my $response=&unescape(&reply('autocreatepassword:'.$authparam.':'.$cdom,$homeserver)); |
if ($udom =~ /^$match_domain$/) { |
if ($response eq 'refused') { |
$homeserver = &domain($udom,'primary'); |
$authchk = 'refused'; |
} |
|
if ($homeserver eq '') { |
|
if (($cdom =~ /^$match_domain$/) && ($cnum =~ /^$match_courseid$/)) { |
|
$homeserver = &homeserver($cnum,$cdom); |
|
} |
|
} |
|
if ($homeserver eq '') { |
|
$authchk = 'nodomain'; |
} else { |
} else { |
($authparam,$create_passwd,$authchk) = split/:/,$response; |
$response=&unescape(&reply('autocreatepassword:'.$authparam.':'.$cdom,$homeserver)); |
|
if ($response eq 'refused') { |
|
$authchk = 'refused'; |
|
} else { |
|
($authparam,$create_passwd,$authchk) = split/:/,$response; |
|
} |
} |
} |
return ($authparam,$create_passwd,$authchk); |
return ($authparam,$create_passwd,$authchk); |
} |
} |
Line 5318 sub save_selected_files {
|
Line 5320 sub save_selected_files {
|
my ($user, $path, @files) = @_; |
my ($user, $path, @files) = @_; |
my $filename = $user."savedfiles"; |
my $filename = $user."savedfiles"; |
my @other_files = &files_not_in_path($user, $path); |
my @other_files = &files_not_in_path($user, $path); |
open (OUT, '>'.$Apache::lonnet::perlvar{'lonDaemons'}.'/tmp/'.$filename); |
open (OUT, '>'.$tmpdir.$filename); |
foreach my $file (@files) { |
foreach my $file (@files) { |
print (OUT $env{'form.currentpath'}.$file."\n"); |
print (OUT $env{'form.currentpath'}.$file."\n"); |
} |
} |
Line 7686 sub correct_line_ends {
|
Line 7688 sub correct_line_ends {
|
sub goodbye { |
sub goodbye { |
&logthis("Starting Shut down"); |
&logthis("Starting Shut down"); |
#not converted to using infrastruture and probably shouldn't be |
#not converted to using infrastruture and probably shouldn't be |
&logthis(sprintf("%-20s is %s",'%badServerCache',length(&freeze(\%badServerCache)))); |
&logthis(sprintf("%-20s is %s",'%badServerCache',length(&nfreeze(\%badServerCache)))); |
#converted |
#converted |
# &logthis(sprintf("%-20s is %s",'%metacache',scalar(%metacache))); |
# &logthis(sprintf("%-20s is %s",'%metacache',scalar(%metacache))); |
&logthis(sprintf("%-20s is %s",'%homecache',length(&freeze(\%homecache)))); |
&logthis(sprintf("%-20s is %s",'%homecache',length(&nfreeze(\%homecache)))); |
# &logthis(sprintf("%-20s is %s",'%titlecache',length(&freeze(\%titlecache)))); |
# &logthis(sprintf("%-20s is %s",'%titlecache',length(&nfreeze(\%titlecache)))); |
# &logthis(sprintf("%-20s is %s",'%courseresdatacache',length(&freeze(\%courseresdatacache)))); |
# &logthis(sprintf("%-20s is %s",'%courseresdatacache',length(&nfreeze(\%courseresdatacache)))); |
#1.1 only |
#1.1 only |
# &logthis(sprintf("%-20s is %s",'%userresdatacache',length(&freeze(\%userresdatacache)))); |
# &logthis(sprintf("%-20s is %s",'%userresdatacache',length(&nfreeze(\%userresdatacache)))); |
# &logthis(sprintf("%-20s is %s",'%getsectioncache',length(&freeze(\%getsectioncache)))); |
# &logthis(sprintf("%-20s is %s",'%getsectioncache',length(&nfreeze(\%getsectioncache)))); |
# &logthis(sprintf("%-20s is %s",'%courseresversioncache',length(&freeze(\%courseresversioncache)))); |
# &logthis(sprintf("%-20s is %s",'%courseresversioncache',length(&nfreeze(\%courseresversioncache)))); |
# &logthis(sprintf("%-20s is %s",'%resversioncache',length(&freeze(\%resversioncache)))); |
# &logthis(sprintf("%-20s is %s",'%resversioncache',length(&nfreeze(\%resversioncache)))); |
&logthis(sprintf("%-20s is %s",'%remembered',length(&freeze(\%remembered)))); |
&logthis(sprintf("%-20s is %s",'%remembered',length(&nfreeze(\%remembered)))); |
&logthis(sprintf("%-20s is %s",'kicks',$kicks)); |
&logthis(sprintf("%-20s is %s",'kicks',$kicks)); |
&logthis(sprintf("%-20s is %s",'hits',$hits)); |
&logthis(sprintf("%-20s is %s",'hits',$hits)); |
&flushcourselogs(); |
&flushcourselogs(); |
Line 7705 sub goodbye {
|
Line 7707 sub goodbye {
|
} |
} |
|
|
sub get_dns { |
sub get_dns { |
my ($url,$func) = @_; |
my ($url,$func,$ignore_cache) = @_; |
|
if (!$ignore_cache) { |
|
my ($content,$cached)= |
|
&Apache::lonnet::is_cached_new('dns',$url); |
|
if ($cached) { |
|
&$func($content); |
|
return; |
|
} |
|
} |
|
|
|
my %alldns; |
open(my $config,"<$perlvar{'lonTabDir'}/hosts.tab"); |
open(my $config,"<$perlvar{'lonTabDir'}/hosts.tab"); |
foreach my $dns (<$config>) { |
foreach my $dns (<$config>) { |
next if ($dns !~ /^\^(\S*)/x); |
next if ($dns !~ /^\^(\S*)/x); |
$dns = $1; |
$alldns{$1} = 1; |
|
} |
|
while (%alldns) { |
|
my ($dns) = keys(%alldns); |
|
delete($alldns{$dns}); |
my $ua=new LWP::UserAgent; |
my $ua=new LWP::UserAgent; |
my $request=new HTTP::Request('GET',"http://$dns$url"); |
my $request=new HTTP::Request('GET',"http://$dns$url"); |
my $response=$ua->request($request); |
my $response=$ua->request($request); |
next if ($response->is_error()); |
next if ($response->is_error()); |
my @content = split("\n",$response->content); |
my @content = split("\n",$response->content); |
|
&Apache::lonnet::do_cache_new('dns',$url,\@content,30*24*60*60); |
&$func(\@content); |
&$func(\@content); |
|
return; |
} |
} |
close($config); |
close($config); |
|
my $which = (split('/',$url))[3]; |
|
&logthis("unable to contact DNS defaulting to on disk file dns_$which.tab\n"); |
|
open($config,"<$perlvar{'lonTabDir'}/dns_$which.tab"); |
|
my @content = <$config>; |
|
&$func(\@content); |
|
return; |
} |
} |
# ------------------------------------------------------------ Read domain file |
# ------------------------------------------------------------ Read domain file |
{ |
{ |
Line 7740 sub get_dns {
|
Line 7764 sub get_dns {
|
$domain{$name} = \%this_domain; |
$domain{$name} = \%this_domain; |
} |
} |
} |
} |
|
|
|
sub reset_domain_info { |
|
undef($loaded); |
|
undef(%domain); |
|
} |
|
|
sub load_domain_tab { |
sub load_domain_tab { |
&get_dns('/adm/dns/domain',\&parse_domain_tab); |
my ($ignore_cache) = @_; |
|
&get_dns('/adm/dns/domain',\&parse_domain_tab,$ignore_cache); |
my $fh; |
my $fh; |
if (open($fh,"<".$perlvar{'lonTabDir'}.'/domain.tab')) { |
if (open($fh,"<".$perlvar{'lonTabDir'}.'/domain.tab')) { |
my @lines = <$fh>; |
my @lines = <$fh>; |
Line 7788 sub get_dns {
|
Line 7818 sub get_dns {
|
} |
} |
} |
} |
} |
} |
|
|
|
sub reset_hosts_info { |
|
&reset_domain_info(); |
|
&reset_hosts_ip_info(); |
|
undef(%hostname); |
|
undef(%hostdom); |
|
undef(%libserv); |
|
undef($loaded); |
|
} |
|
|
sub load_hosts_tab { |
sub load_hosts_tab { |
&get_dns('/adm/dns/hosts',\&parse_hosts_tab); |
my ($ignore_cache) = @_; |
|
&get_dns('/adm/dns/hosts',\&parse_hosts_tab,$ignore_cache); |
open(my $config,"<$perlvar{'lonTabDir'}/hosts.tab"); |
open(my $config,"<$perlvar{'lonTabDir'}/hosts.tab"); |
my @config = <$config>; |
my @config = <$config>; |
&parse_hosts_tab(\@config); |
&parse_hosts_tab(\@config); |
Line 7866 sub get_dns {
|
Line 7906 sub get_dns {
|
my %iphost; |
my %iphost; |
my %name_to_ip; |
my %name_to_ip; |
my %lonid_to_ip; |
my %lonid_to_ip; |
|
|
|
my %valid_ip; |
|
sub valid_ip { |
|
my ($ip) = @_; |
|
if (exists($iphost{$ip}) || exists($valid_ip{$ip})) { |
|
return 1; |
|
} |
|
my $name = gethostbyip($ip); |
|
my $lonid = &hostname($name); |
|
if (defined($lonid)) { |
|
$valid_ip{$ip} = $lonid; |
|
return 1; |
|
} |
|
my %iphosts = &get_iphost(); |
|
if (ref($iphost{$ip})) { |
|
return 1; |
|
} |
|
} |
|
|
sub get_hosts_from_ip { |
sub get_hosts_from_ip { |
my ($ip) = @_; |
my ($ip) = @_; |
my %iphosts = &get_iphost(); |
my %iphosts = &get_iphost(); |
Line 7874 sub get_dns {
|
Line 7933 sub get_dns {
|
} |
} |
return; |
return; |
} |
} |
|
|
|
sub reset_hosts_ip_info { |
|
undef(%iphost); |
|
undef(%name_to_ip); |
|
undef(%lonid_to_ip); |
|
} |
|
|
sub get_host_ip { |
sub get_host_ip { |
my ($lonid) = @_; |
my ($lonid) = @_; |
Line 7890 sub get_dns {
|
Line 7955 sub get_dns {
|
} |
} |
|
|
sub get_iphost { |
sub get_iphost { |
if (%iphost) { return %iphost; } |
my ($ignore_cache) = @_; |
|
if (!$ignore_cache) { |
|
if (%iphost) { |
|
return %iphost; |
|
} |
|
my ($ip_info,$cached)= |
|
&Apache::lonnet::is_cached_new('iphost','iphost'); |
|
if ($cached) { |
|
%iphost = %{$ip_info->[0]}; |
|
%name_to_ip = %{$ip_info->[1]}; |
|
%lonid_to_ip = %{$ip_info->[2]}; |
|
return %iphost; |
|
} |
|
} |
my %hostname = &all_hostnames(); |
my %hostname = &all_hostnames(); |
foreach my $id (keys(%hostname)) { |
foreach my $id (keys(%hostname)) { |
my $name=$hostname{$id}; |
my $name=&hostname($id); |
my $ip; |
my $ip; |
if (!exists($name_to_ip{$name})) { |
if (!exists($name_to_ip{$name})) { |
$ip = gethostbyname($name); |
$ip = gethostbyname($name); |
Line 7909 sub get_dns {
|
Line 7987 sub get_dns {
|
$lonid_to_ip{$id} = $ip; |
$lonid_to_ip{$id} = $ip; |
push(@{$iphost{$ip}},$id); |
push(@{$iphost{$ip}},$id); |
} |
} |
|
&Apache::lonnet::do_cache_new('iphost','iphost', |
|
[\%iphost,\%name_to_ip,\%lonid_to_ip], |
|
24*60*60); |
|
|
return %iphost; |
return %iphost; |
} |
} |
} |
} |