) {
- if ($configline !~ /^\s*\#/ && $configline !~ /^\s*$/ ) {
- my ($id,$domain,$role,$name)=split(/:/,$configline);
- $name=~s/\s//g;
- my $ip;
- if (!exists($name_to_ip{$name})) {
- $ip = gethostbyname($name);
- if (!$ip || length($ip) ne 4) {
- &logthis("Skipping host $id name $name no IP found\n");
- next;
- }
- $ip=inet_ntoa($ip);
- $name_to_ip{$name} = $ip;
- } else {
- $ip = $name_to_ip{$name};
- }
- $hostid{$ip}=$id; # LonCAPA name of host by IP.
- $hostdom{$id}=$domain; # LonCAPA domain name of host.
- $hostip{$id}=$ip; # IP address of host.
- $hostdns{$name} = $id; # LonCAPA name of host by DNS.
-
- if ($id eq $perlvar{'lonHostID'}) {
- Debug("Found me in the host table: $name");
- $thisserver=$name;
- }
- }
- }
- close(CONFIG);
-}
-#
# Reload the Apache daemon's state.
# This is done by invoking /home/httpd/perl/apachereload
# a setuid perl script that can be root for us to do this job.
@@ -4895,13 +5068,12 @@ sub UpdateHosts {
# either dropped or changed hosts. Note that the re-read of the table
# will take care of new and changed hosts as connections come into being.
+ &Apache::lonnet::reset_hosts_info();
- KillHostHashes;
- ReadHostTable;
-
- foreach my $child (keys %children) {
+ foreach my $child (keys(%children)) {
my $childip = $children{$child};
- if(!$hostid{$childip}) {
+ if ($childip ne '127.0.0.1'
+ && !defined(&Apache::lonnet::get_hosts_from_ip($childip))) {
logthis(' UpdateHosts killing child '
." $child for ip $childip ");
kill('INT', $child);
@@ -5061,79 +5233,6 @@ sub status {
$0='lond: '.$what.' '.$local;
}
-# -------------------------------------------------------- Escape Special Chars
-
-sub escape {
- my $str=shift;
- $str =~ s/(\W)/"%".unpack('H2',$1)/eg;
- return $str;
-}
-
-# ----------------------------------------------------- Un-Escape Special Chars
-
-sub unescape {
- my $str=shift;
- $str =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
- return $str;
-}
-
-# ----------------------------------------------------------- Send USR1 to lonc
-
-sub reconlonc {
- my $peerfile=shift;
- &logthis("Trying to reconnect for $peerfile");
- my $loncfile="$perlvar{'lonDaemons'}/logs/lonc.pid";
- if (my $fh=IO::File->new("$loncfile")) {
- my $loncpid=<$fh>;
- chomp($loncpid);
- if (kill 0 => $loncpid) {
- &logthis("lonc at pid $loncpid responding, sending USR1");
- kill USR1 => $loncpid;
- } else {
- &logthis(
- "CRITICAL: "
- ."lonc at pid $loncpid not responding, giving up");
- }
- } else {
- &logthis('CRITICAL: lonc not running, giving up');
- }
-}
-
-# -------------------------------------------------- Non-critical communication
-
-sub subreply {
- my ($cmd,$server)=@_;
- my $peerfile="$perlvar{'lonSockDir'}/$server";
- my $sclient=IO::Socket::UNIX->new(Peer =>"$peerfile",
- Type => SOCK_STREAM,
- Timeout => 10)
- or return "con_lost";
- print $sclient "$cmd\n";
- my $answer=<$sclient>;
- chomp($answer);
- if (!$answer) { $answer="con_lost"; }
- return $answer;
-}
-
-sub reply {
- my ($cmd,$server)=@_;
- my $answer;
- if ($server ne $currenthostid) {
- $answer=subreply($cmd,$server);
- if ($answer eq 'con_lost') {
- $answer=subreply("ping",$server);
- if ($answer ne $server) {
- &logthis("sub reply: answer != server answer is $answer, server is $server");
- &reconlonc("$perlvar{'lonSockDir'}/$server");
- }
- $answer=subreply($cmd,$server);
- }
- } else {
- $answer='self_reply';
- }
- return $answer;
-}
-
# -------------------------------------------------------------- Talk to lonsql
sub sql_reply {
@@ -5158,18 +5257,6 @@ sub sub_sql_reply {
return $answer;
}
-# -------------------------------------------- Return path to profile directory
-
-sub propath {
- my ($udom,$uname)=@_;
- $udom=~s/\W//g;
- $uname=~s/\W//g;
- my $subdir=$uname.'__';
- $subdir =~ s/(.)(.)(.).*/$1\/$2\/$3/;
- my $proname="$perlvar{'lonUsersDir'}/$udom/$subdir/$uname";
- return $proname;
-}
-
# --------------------------------------- Is this the home server of an author?
sub ishome {
@@ -5214,8 +5301,7 @@ $SIG{USR1} = \&checkchildren;
$SIG{USR2} = \&UpdateHosts;
# Read the host hashes:
-
-ReadHostTable;
+&Apache::lonnet::load_hosts_tab();
my $dist=`$perlvar{'lonDaemons'}/distprobe`;
@@ -5294,7 +5380,8 @@ sub make_new_child {
# my $tmpsnum=0; # Now global
#---------------------------------------------------- kerberos 5 initialization
&Authen::Krb5::init_context();
- unless (($dist eq 'fedora4') || ($dist eq 'suse9.3')) {
+ unless (($dist eq 'fedora5') || ($dist eq 'fedora4') ||
+ ($dist eq 'fedora6') || ($dist eq 'suse9.3')) {
&Authen::Krb5::init_ets();
}
@@ -5304,19 +5391,17 @@ sub make_new_child {
# -----------------------------------------------------------------------------
# see if we know client and 'check' for spoof IP by ineffective challenge
- ReadManagerTable; # May also be a manager!!
-
my $outsideip=$clientip;
if ($clientip eq '127.0.0.1') {
- $outsideip=$hostip{$perlvar{'lonHostID'}};
+ $outsideip=&Apache::lonnet::get_host_ip($perlvar{'lonHostID'});
}
- my $clientrec=($hostid{$outsideip} ne undef);
+ my $clientrec=defined(&Apache::lonnet::get_hosts_from_ip($outsideip));
my $ismanager=($managers{$outsideip} ne undef);
$clientname = "[unknonwn]";
if($clientrec) { # Establish client type.
$ConnectionType = "client";
- $clientname = $hostid{$outsideip};
+ $clientname = (&Apache::lonnet::get_hosts_from_ip($outsideip))[-1];
if($ismanager) {
$ConnectionType = "both";
}
@@ -5335,7 +5420,7 @@ sub make_new_child {
my $remotereq=<$client>;
chomp($remotereq);
Debug("Got init: $remotereq");
- my $inikeyword = split(/:/, $remotereq);
+
if ($remotereq =~ /^init/) {
&sethost("sethost:$perlvar{'lonHostID'}");
#
@@ -5423,14 +5508,9 @@ sub make_new_child {
if ($clientok) {
# ---------------- New known client connecting, could mean machine online again
-
- foreach my $id (keys(%hostip)) {
- if ($hostip{$id} ne $clientip ||
- $hostip{$currenthostid} eq $clientip) {
- # no need to try to do recon's to myself
- next;
- }
- &reconlonc("$perlvar{'lonSockDir'}/$id");
+ if (&Apache::lonnet::get_host_ip($currenthostid) ne $clientip
+ && $clientip ne '127.0.0.1') {
+ &Apache::lonnet::reconlonc($clientname);
}
&logthis("Established connection: $clientname");
&status('Will listen to '.$clientname);
@@ -5486,8 +5566,11 @@ sub is_author {
# Author role should show up as a key /domain/_au
- my $key = "/$domain/_au";
- my $value = $hashref->{$key};
+ my $key = "/$domain/_au";
+ my $value;
+ if (defined($hashref)) {
+ $value = $hashref->{$key};
+ }
if(defined($value)) {
&Debug("$user @ $domain is an author");
@@ -5704,7 +5787,8 @@ sub validate_user {
my $krbservice = "krbtgt/".$contentpwd."\@".$contentpwd;
my $krbserver = &Authen::Krb5::parse_name($krbservice);
my $credentials= &Authen::Krb5::cc_default();
- $credentials->initialize($krbclient);
+ $credentials->initialize(&Authen::Krb5::parse_name($user.'@'
+ .$contentpwd));
my $krbreturn = &Authen::Krb5::get_in_tkt_with_password($krbclient,
$krbserver,
$password,
@@ -5717,7 +5801,12 @@ sub validate_user {
# Authenticate via installation specific authentcation method:
$validated = &localauth::localauth($user,
$password,
- $contentpwd);
+ $contentpwd,
+ $domain);
+ if ($validated < 0) {
+ &logthis("localauth for $contentpwd $user:$domain returned a $validated");
+ $validated = 0;
+ }
} else { # Unrecognized auth is also bad.
$validated = 0;
}
@@ -5743,8 +5832,7 @@ sub addline {
my ($fname,$hostid,$ip,$newline)=@_;
my $contents;
my $found=0;
- my $expr='^'.$hostid.':'.$ip.':';
- $expr =~ s/\./\\\./g;
+ my $expr='^'.quotemeta($hostid).':'.quotemeta($ip).':';
my $sh;
if ($sh=IO::File->new("$fname.subscription")) {
while (my $subline=<$sh>) {
@@ -5760,10 +5848,16 @@ sub addline {
}
sub get_chat {
- my ($cdom,$cname,$udom,$uname)=@_;
+ my ($cdom,$cname,$udom,$uname,$group)=@_;
my @entries=();
- my $hashref = &tie_user_hash($cdom, $cname, 'nohist_chatroom',
+ my $namespace = 'nohist_chatroom';
+ my $namespace_inroom = 'nohist_inchatroom';
+ if ($group ne '') {
+ $namespace .= '_'.$group;
+ $namespace_inroom .= '_'.$group;
+ }
+ my $hashref = &tie_user_hash($cdom, $cname, $namespace,
&GDBM_READER());
if ($hashref) {
@entries=map { $_.':'.$hashref->{$_} } sort(keys(%$hashref));
@@ -5771,7 +5865,7 @@ sub get_chat {
}
my @participants=();
my $cutoff=time-60;
- $hashref = &tie_user_hash($cdom, $cname, 'nohist_inchatroom',
+ $hashref = &tie_user_hash($cdom, $cname, $namespace_inroom,
&GDBM_WRCREAT());
if ($hashref) {
$hashref->{$uname.':'.$udom}=time;
@@ -5786,10 +5880,16 @@ sub get_chat {
}
sub chat_add {
- my ($cdom,$cname,$newchat)=@_;
+ my ($cdom,$cname,$newchat,$group)=@_;
my @entries=();
my $time=time;
- my $hashref = &tie_user_hash($cdom, $cname, 'nohist_chatroom',
+ my $namespace = 'nohist_chatroom';
+ my $logfile = 'chatroom.log';
+ if ($group ne '') {
+ $namespace .= '_'.$group;
+ $logfile = 'chatroom_'.$group.'.log';
+ }
+ my $hashref = &tie_user_hash($cdom, $cname, $namespace,
&GDBM_WRCREAT());
if ($hashref) {
@entries=map { $_.':'.$hashref->{$_} } sort(keys(%$hashref));
@@ -5812,7 +5912,7 @@ sub chat_add {
}
{
my $proname=&propath($cdom,$cname);
- if (open(CHATLOG,">>$proname/chatroom.log")) {
+ if (open(CHATLOG,">>$proname/$logfile")) {
print CHATLOG ("$time:".&unescape($newchat)."\n");
}
close(CHATLOG);
@@ -5939,7 +6039,7 @@ sub subscribe {
# the metadata
unless ($fname=~/\.meta$/) { &unsub("$fname.meta",$clientip); }
$fname=~s/\/home\/httpd\/html\/res/raw/;
- $fname="http://$thisserver/".$fname;
+ $fname="http://".&Apache::lonnet::hostname($perlvar{'lonHostID'})."/".$fname;
$result="$fname\n";
}
} else {
@@ -6087,10 +6187,16 @@ sub convert_photo {
sub sethost {
my ($remotereq) = @_;
my (undef,$hostid)=split(/:/,$remotereq);
+ # ignore sethost if we are already correct
+ if ($hostid eq $currenthostid) {
+ return 'ok';
+ }
+
if (!defined($hostid)) { $hostid=$perlvar{'lonHostID'}; }
- if ($hostip{$perlvar{'lonHostID'}} eq $hostip{$hostid}) {
+ if (&Apache::lonnet::get_host_ip($perlvar{'lonHostID'})
+ eq &Apache::lonnet::get_host_ip($hostid)) {
$currenthostid =$hostid;
- $currentdomainid=$hostdom{$hostid};
+ $currentdomainid=&Apache::lonnet::host_domain($hostid);
&logthis("Setting hostid to $hostid, and domain to $currentdomainid");
} else {
&logthis("Requested host id $hostid not an alias of ".
@@ -6106,96 +6212,6 @@ sub version {
return "version:$VERSION";
}
-#There is a copy of this in lonnet.pm
-sub userload {
- my $numusers=0;
- {
- opendir(LONIDS,$perlvar{'lonIDsDir'});
- my $filename;
- my $curtime=time;
- while ($filename=readdir(LONIDS)) {
- if ($filename eq '.' || $filename eq '..') {next;}
- my ($mtime)=(stat($perlvar{'lonIDsDir'}.'/'.$filename))[9];
- if ($curtime-$mtime < 1800) { $numusers++; }
- }
- closedir(LONIDS);
- }
- my $userloadpercent=0;
- my $maxuserload=$perlvar{'lonUserLoadLim'};
- if ($maxuserload) {
- $userloadpercent=100*$numusers/$maxuserload;
- }
- $userloadpercent=sprintf("%.2f",$userloadpercent);
- return $userloadpercent;
-}
-
-# Routines for serializing arrays and hashes (copies from lonnet)
-
-sub array2str {
- my (@array) = @_;
- my $result=&arrayref2str(\@array);
- $result=~s/^__ARRAY_REF__//;
- $result=~s/__END_ARRAY_REF__$//;
- return $result;
-}
-
-sub arrayref2str {
- my ($arrayref) = @_;
- my $result='__ARRAY_REF__';
- foreach my $elem (@$arrayref) {
- if(ref($elem) eq 'ARRAY') {
- $result.=&arrayref2str($elem).'&';
- } elsif(ref($elem) eq 'HASH') {
- $result.=&hashref2str($elem).'&';
- } elsif(ref($elem)) {
- #print("Got a ref of ".(ref($elem))." skipping.");
- } else {
- $result.=&escape($elem).'&';
- }
- }
- $result=~s/\&$//;
- $result .= '__END_ARRAY_REF__';
- return $result;
-}
-
-sub hash2str {
- my (%hash) = @_;
- my $result=&hashref2str(\%hash);
- $result=~s/^__HASH_REF__//;
- $result=~s/__END_HASH_REF__$//;
- return $result;
-}
-
-sub hashref2str {
- my ($hashref)=@_;
- my $result='__HASH_REF__';
- foreach (sort(keys(%$hashref))) {
- if (ref($_) eq 'ARRAY') {
- $result.=&arrayref2str($_).'=';
- } elsif (ref($_) eq 'HASH') {
- $result.=&hashref2str($_).'=';
- } elsif (ref($_)) {
- $result.='=';
- #print("Got a ref of ".(ref($_))." skipping.");
- } else {
- if ($_) {$result.=&escape($_).'=';} else { last; }
- }
-
- if(ref($hashref->{$_}) eq 'ARRAY') {
- $result.=&arrayref2str($hashref->{$_}).'&';
- } elsif(ref($hashref->{$_}) eq 'HASH') {
- $result.=&hashref2str($hashref->{$_}).'&';
- } elsif(ref($hashref->{$_})) {
- $result.='&';
- #print("Got a ref of ".(ref($hashref->{$_}))." skipping.");
- } else {
- $result.=&escape($hashref->{$_}).'&';
- }
- }
- $result=~s/\&$//;
- $result .= '__END_HASH_REF__';
- return $result;
-}
# ----------------------------------- POD (plain old documentation, CPAN style)
@@ -6512,7 +6528,6 @@ to the client, and the connection is clo
IO::Socket
IO::File
Apache::File
-Symbol
POSIX
Crypt::IDEA
LWP::UserAgent()
500 Internal Server Error
Internal Server Error
The server encountered an internal error or
misconfiguration and was unable to complete
your request.
Please contact the server administrator at
root@localhost to inform them of the time this error occurred,
and the actions you performed just before this error.
More information about this error may be available
in the server error log.