version 1.472, 2011/05/13 02:58:02
|
version 1.497, 2012/10/05 15:19:18
|
Line 34 use strict;
|
Line 34 use strict;
|
use lib '/home/httpd/lib/perl/'; |
use lib '/home/httpd/lib/perl/'; |
use LONCAPA; |
use LONCAPA; |
use LONCAPA::Configuration; |
use LONCAPA::Configuration; |
|
use LONCAPA::Lond; |
|
|
use IO::Socket; |
use IO::Socket; |
use IO::File; |
use IO::File; |
Line 92 my %managers; # Ip -> manager names
|
Line 93 my %managers; # Ip -> manager names
|
|
|
my %perlvar; # Will have the apache conf defined perl vars. |
my %perlvar; # Will have the apache conf defined perl vars. |
|
|
|
my $dist; |
|
|
# |
# |
# The hash below is used for command dispatching, and is therefore keyed on the request keyword. |
# The hash below is used for command dispatching, and is therefore keyed on the request keyword. |
# Each element of the hash contains a reference to an array that contains: |
# Each element of the hash contains a reference to an array that contains: |
Line 421 sub ReadManagerTable {
|
Line 424 sub ReadManagerTable {
|
|
|
my $tablename = $perlvar{'lonTabDir'}."/managers.tab"; |
my $tablename = $perlvar{'lonTabDir'}."/managers.tab"; |
if (!open (MANAGERS, $tablename)) { |
if (!open (MANAGERS, $tablename)) { |
if (&loncapa_dns_server()) { |
my $hostname = &Apache::lonnet::hostname($perlvar{'lonHostID'}); |
|
if (&Apache::lonnet::is_LC_dns($hostname)) { |
&logthis('<font color="red">No manager table. Nobody can manage!!</font>'); |
&logthis('<font color="red">No manager table. Nobody can manage!!</font>'); |
} |
} |
return; |
return; |
Line 677 sub PushFile {
|
Line 681 sub PushFile {
|
return "error:$!"; |
return "error:$!"; |
} else { |
} else { |
&logthis('<font color="green"> Installed new '.$tablefile |
&logthis('<font color="green"> Installed new '.$tablefile |
."</font>"); |
." - transaction by: $clientname ($clientip)</font>"); |
my $adminmail = $perlvar{'lonAdmEMail'}; |
my $adminmail = $perlvar{'lonAdmEMail'}; |
my $admindom = &Apache::lonnet::host_domain($perlvar{'lonHostID'}); |
my $admindom = &Apache::lonnet::host_domain($perlvar{'lonHostID'}); |
if ($admindom ne '') { |
if ($admindom ne '') { |
Line 691 sub PushFile {
|
Line 695 sub PushFile {
|
} |
} |
if ($adminmail =~ /^[^\@]+\@[^\@]+$/) { |
if ($adminmail =~ /^[^\@]+\@[^\@]+$/) { |
my $msg = new Mail::Send; |
my $msg = new Mail::Send; |
my $senderaddress = $perlvar{'lonSysEMail'}; |
|
$msg->to($adminmail); |
$msg->to($adminmail); |
$msg->subject('LON-CAPA DNS update on '.$perlvar{'lonHostID'}); |
$msg->subject('LON-CAPA DNS update on '.$perlvar{'lonHostID'}); |
if ($senderaddress) { |
|
$msg->add('From',$senderaddress); |
|
} |
|
$msg->add('Content-type','text/plain; charset=UTF-8'); |
$msg->add('Content-type','text/plain; charset=UTF-8'); |
if (my $fh = $msg->open()) { |
if (my $fh = $msg->open()) { |
print $fh 'Update to '.$tablefile.' from Cluster Manager '. |
print $fh 'Update to '.$tablefile.' from Cluster Manager '. |
$client."\n"; |
"$clientname ($clientip)\n"; |
$fh->close; |
$fh->close; |
} |
} |
} |
} |
Line 712 sub PushFile {
|
Line 712 sub PushFile {
|
|
|
} |
} |
|
|
sub loncapa_dns_server { |
|
my $lonhost = &Apache::lonnet::get_host_ip($perlvar{'lonHostID'}); |
|
my $hoststable = "$perlvar{'lonTabDir'}/hosts.tab"; |
|
my $is_dns_server; |
|
if (!open(HOSTS,"<$hoststable")) { |
|
&logthis('<font color="yellow">Could not open hosts.tab to check for LON-CAPA DNS servers.</font>'); |
|
while (my $host = <HOSTS>) { |
|
chomp($host); |
|
$host =~ s/(^\s+|\s+$)//g; |
|
if ($host =~ /^\Q^$lonhost\E/) { |
|
$is_dns_server = 1; |
|
last; |
|
} |
|
} |
|
close(HOSTS); |
|
} |
|
return $is_dns_server; |
|
} |
|
|
|
# |
# |
# Called to re-init either lonc or lond. |
# Called to re-init either lonc or lond. |
# |
# |
Line 1663 sub ls3_handler {
|
Line 1644 sub ls3_handler {
|
} |
} |
®ister_handler("ls3", \&ls3_handler, 0, 1, 0); |
®ister_handler("ls3", \&ls3_handler, 0, 1, 0); |
|
|
|
sub read_lonnet_global { |
|
my ($cmd,$tail,$client) = @_; |
|
my $userinput = "$cmd:$tail"; |
|
my $requested = &Apache::lonnet::thaw_unescape($tail); |
|
my $result; |
|
my %packagevars = ( |
|
spareid => \%Apache::lonnet::spareid, |
|
perlvar => \%Apache::lonnet::perlvar, |
|
); |
|
my %limit_to = ( |
|
perlvar => { |
|
lonOtherAuthen => 1, |
|
lonBalancer => 1, |
|
lonVersion => 1, |
|
lonSysEMail => 1, |
|
lonHostID => 1, |
|
lonRole => 1, |
|
lonDefDomain => 1, |
|
lonLoadLim => 1, |
|
lonUserLoadLim => 1, |
|
} |
|
); |
|
if (ref($requested) eq 'HASH') { |
|
foreach my $what (keys(%{$requested})) { |
|
my $response; |
|
my $items = {}; |
|
if (exists($packagevars{$what})) { |
|
if (ref($limit_to{$what}) eq 'HASH') { |
|
foreach my $varname (keys(%{$packagevars{$what}})) { |
|
if ($limit_to{$what}{$varname}) { |
|
$items->{$varname} = $packagevars{$what}{$varname}; |
|
} |
|
} |
|
} else { |
|
$items = $packagevars{$what}; |
|
} |
|
if ($what eq 'perlvar') { |
|
if (!exists($packagevars{$what}{'lonBalancer'})) { |
|
if ($dist =~ /^(centos|rhes|fedora|scientific)/) { |
|
my $othervarref=LONCAPA::Configuration::read_conf('httpd.conf'); |
|
if (ref($othervarref) eq 'HASH') { |
|
$items->{'lonBalancer'} = $othervarref->{'lonBalancer'}; |
|
} |
|
} |
|
} |
|
} |
|
$response = &Apache::lonnet::freeze_escape($items); |
|
} |
|
$result .= &escape($what).'='.$response.'&'; |
|
} |
|
} |
|
$result =~ s/\&$//; |
|
&Reply($client,\$result,$userinput); |
|
return 1; |
|
} |
|
®ister_handler("readlonnetglobal", \&read_lonnet_global, 0, 1, 0); |
|
|
|
sub server_devalidatecache_handler { |
|
my ($cmd,$tail,$client) = @_; |
|
my $userinput = "$cmd:$tail"; |
|
my ($name,$id) = map { &unescape($_); } split(/:/,$tail); |
|
&Apache::lonnet::devalidate_cache_new($name,$id); |
|
my $result = 'ok'; |
|
&Reply($client,\$result,$userinput); |
|
return 1; |
|
} |
|
®ister_handler("devalidatecache", \&server_devalidatecache_handler, 0, 1, 0); |
|
|
sub server_timezone_handler { |
sub server_timezone_handler { |
my ($cmd,$tail,$client) = @_; |
my ($cmd,$tail,$client) = @_; |
my $userinput = "$cmd:$tail"; |
my $userinput = "$cmd:$tail"; |
Line 1858 sub authenticate_handler {
|
Line 1907 sub authenticate_handler {
|
if (ref($hostedsession) eq 'HASH') { |
if (ref($hostedsession) eq 'HASH') { |
$hosted = $hostedsession->{'hosted'}; |
$hosted = $hostedsession->{'hosted'}; |
} |
} |
my $loncaparev = $clientversion; |
|
if ($loncaparev eq '') { |
|
$loncaparev = $Apache::lonnet::loncaparevs{$clientname}; |
|
} |
|
$canhost = &Apache::lonnet::can_host_session($udom,$clientname, |
$canhost = &Apache::lonnet::can_host_session($udom,$clientname, |
$loncaparev, |
$clientversion, |
$remote,$hosted); |
$remote,$hosted); |
} |
} |
} |
} |
Line 2025 sub add_user_handler {
|
Line 2070 sub add_user_handler {
|
."makeuser"; |
."makeuser"; |
} |
} |
unless ($fperror) { |
unless ($fperror) { |
my $result=&make_passwd_file($uname, $umode,$npass, $passfilename); |
my $result=&make_passwd_file($uname,$udom,$umode,$npass, $passfilename); |
&Reply($client,\$result, $userinput); #BUGBUG - could be fail |
&Reply($client,\$result, $userinput); #BUGBUG - could be fail |
} else { |
} else { |
&Failure($client, \$fperror, $userinput); |
&Failure($client, \$fperror, $userinput); |
Line 2100 sub change_authentication_handler {
|
Line 2145 sub change_authentication_handler {
|
&Failure($client, \$result); |
&Failure($client, \$result); |
} |
} |
} else { |
} else { |
my $result=&make_passwd_file($uname, $umode,$npass,$passfilename); |
my $result=&make_passwd_file($uname,$udom,$umode,$npass,$passfilename); |
# |
# |
# If the current auth mode is internal, and the old auth mode was |
# If the current auth mode is internal, and the old auth mode was |
# unix, or krb*, and the user is an author for this domain, |
# unix, or krb*, and the user is an author for this domain, |
Line 2300 sub fetch_user_file_handler {
|
Line 2345 sub fetch_user_file_handler {
|
|
|
my $destname=$udir.'/'.$ufile; |
my $destname=$udir.'/'.$ufile; |
my $transname=$udir.'/'.$ufile.'.in.transit'; |
my $transname=$udir.'/'.$ufile.'.in.transit'; |
my $remoteurl='http://'.$clientip.'/userfiles/'.$fname; |
my $clientprotocol=$Apache::lonnet::protocol{$clientname}; |
|
$clientprotocol = 'http' if ($clientprotocol ne 'https'); |
|
my $clienthost = &Apache::lonnet::hostname($clientname); |
|
my $remoteurl=$clientprotocol.'://'.$clienthost.'/userfiles/'.$fname; |
my $response; |
my $response; |
Debug("Remote URL : $remoteurl Transfername $transname Destname: $destname"); |
Debug("Remote URL : $remoteurl Transfername $transname Destname: $destname"); |
alarm(120); |
alarm(120); |
Line 2322 sub fetch_user_file_handler {
|
Line 2370 sub fetch_user_file_handler {
|
unlink($transname); |
unlink($transname); |
&Failure($client, "failed\n", $userinput); |
&Failure($client, "failed\n", $userinput); |
} else { |
} else { |
|
if ($fname =~ /^default.+\.(page|sequence)$/) { |
|
my ($major,$minor) = split(/\./,$clientversion); |
|
if (($major < 2) || ($major == 2 && $minor < 11)) { |
|
my $now = time; |
|
&Apache::lonnet::do_cache_new('crschange',$udom.'_'.$uname,$now,600); |
|
my $key = &escape('internal.contentchange'); |
|
my $what = "$key=$now"; |
|
my $hashref = &tie_user_hash($udom,$uname,'environment', |
|
&GDBM_WRCREAT(),"P",$what); |
|
if ($hashref) { |
|
$hashref->{$key}=$now; |
|
if (!&untie_user_hash($hashref)) { |
|
&logthis("error: ".($!+0)." untie (GDBM) failed ". |
|
"when updating internal.contentchange"); |
|
} |
|
} |
|
} |
|
} |
&Reply($client, "ok\n", $userinput); |
&Reply($client, "ok\n", $userinput); |
} |
} |
} |
} |
Line 3128 sub get_profile_keys {
|
Line 3194 sub get_profile_keys {
|
sub dump_profile_database { |
sub dump_profile_database { |
my ($cmd, $tail, $client) = @_; |
my ($cmd, $tail, $client) = @_; |
|
|
|
my $res = LONCAPA::Lond::dump_profile_database($tail); |
|
|
|
if ($res =~ /^error:/) { |
|
Failure($client, \$res, "$cmd:$tail"); |
|
} else { |
|
Reply($client, \$res, "$cmd:$tail"); |
|
} |
|
|
|
return 1; |
|
|
|
#TODO remove |
my $userinput = "$cmd:$tail"; |
my $userinput = "$cmd:$tail"; |
|
|
my ($udom,$uname,$namespace) = split(/:/,$tail); |
my ($udom,$uname,$namespace) = split(/:/,$tail); |
Line 3194 sub dump_profile_database {
|
Line 3271 sub dump_profile_database {
|
# that is matched against |
# that is matched against |
# database keywords to do |
# database keywords to do |
# selective dumps. |
# selective dumps. |
|
# range - optional range of entries |
|
# e.g., 10-20 would return the |
|
# 10th to 19th items, etc. |
# $client - Channel open on the client. |
# $client - Channel open on the client. |
# Returns: |
# Returns: |
# 1 - Continue processing. |
# 1 - Continue processing. |
Line 3203 sub dump_profile_database {
|
Line 3283 sub dump_profile_database {
|
sub dump_with_regexp { |
sub dump_with_regexp { |
my ($cmd, $tail, $client) = @_; |
my ($cmd, $tail, $client) = @_; |
|
|
|
my $res = LONCAPA::Lond::dump_with_regexp($tail, $clientversion); |
my $userinput = "$cmd:$tail"; |
|
|
if ($res =~ /^error:/) { |
my ($udom,$uname,$namespace,$regexp,$range,$extra)=split(/:/,$tail); |
Failure($client, \$res, "$cmd:$tail"); |
if (defined($regexp)) { |
|
$regexp=&unescape($regexp); |
|
} else { |
|
$regexp='.'; |
|
} |
|
my ($start,$end); |
|
if (defined($range)) { |
|
if ($range =~/^(\d+)\-(\d+)$/) { |
|
($start,$end) = ($1,$2); |
|
} elsif ($range =~/^(\d+)$/) { |
|
($start,$end) = (0,$1); |
|
} else { |
|
undef($range); |
|
} |
|
} |
|
my $hashref = &tie_user_hash($udom, $uname, $namespace, |
|
&GDBM_READER()); |
|
my $skipcheck; |
|
if ($hashref) { |
|
my $qresult=''; |
|
my $count=0; |
|
if ($extra ne '') { |
|
$extra = &Apache::lonnet::thaw_unescape($extra); |
|
$skipcheck = $extra->{'skipcheck'}; |
|
} |
|
my @ids = &Apache::lonnet::current_machine_ids(); |
|
my (%homecourses,$major,$minor,$now); |
|
if (($namespace eq 'roles') && (!$skipcheck)) { |
|
my $loncaparev = $clientversion; |
|
if ($loncaparev eq '') { |
|
$loncaparev = $Apache::lonnet::loncaparevs{$clientname}; |
|
} |
|
if ($loncaparev =~ /^\'?(\d+)\.(\d+)\.[\w.\-]+\'?/) { |
|
$major = $1; |
|
$minor = $2; |
|
} |
|
$now = time; |
|
} |
|
while (my ($key,$value) = each(%$hashref)) { |
|
if ($namespace eq 'roles') { |
|
if ($key =~ m{^/($LONCAPA::match_domain)/($LONCAPA::match_courseid)(/?[^_]*)_(cc|co|in|ta|ep|ad|st|cr)$}) { |
|
my $cdom = $1; |
|
my $cnum = $2; |
|
unless ($skipcheck) { |
|
my ($role,$end,$start) = split(/\_/,$value); |
|
if (!$end || $end > $now) { |
|
next unless (&releasereqd_check($cnum,$cdom,$key,$value,$major, |
|
$minor,\%homecourses,\@ids)); |
|
} |
|
} |
|
} |
|
} |
|
if ($regexp eq '.') { |
|
$count++; |
|
if (defined($range) && $count >= $end) { last; } |
|
if (defined($range) && $count < $start) { next; } |
|
$qresult.=$key.'='.$value.'&'; |
|
} else { |
|
my $unescapeKey = &unescape($key); |
|
if (eval('$unescapeKey=~/$regexp/')) { |
|
$count++; |
|
if (defined($range) && $count >= $end) { last; } |
|
if (defined($range) && $count < $start) { next; } |
|
$qresult.="$key=$value&"; |
|
} |
|
} |
|
} |
|
if (&untie_user_hash($hashref)) { |
|
if (($namespace eq 'roles') && (!$skipcheck)) { |
|
if (keys(%homecourses) > 0) { |
|
$qresult .= &check_homecourses(\%homecourses,$udom,$regexp,$count, |
|
$range,$start,$end,$major,$minor); |
|
} |
|
} |
|
chop($qresult); |
|
&Reply($client, \$qresult, $userinput); |
|
} else { |
|
&Failure( $client, "error: ".($!+0)." untie(GDBM) Failed ". |
|
"while attempting dump\n", $userinput); |
|
} |
|
} else { |
} else { |
&Failure($client, "error: ".($!+0)." tie(GDBM) Failed ". |
Reply($client, \$res, "$cmd:$tail"); |
"while attempting dump\n", $userinput); |
|
} |
} |
|
|
return 1; |
return 1; |
Line 3868 sub put_course_id_hash_handler {
|
Line 3867 sub put_course_id_hash_handler {
|
# a reply is written to $client. |
# a reply is written to $client. |
sub dump_course_id_handler { |
sub dump_course_id_handler { |
my ($cmd, $tail, $client) = @_; |
my ($cmd, $tail, $client) = @_; |
|
|
|
my $res = LONCAPA::Lond::dump_course_id_handler($tail); |
|
if ($res =~ /^error:/) { |
|
Failure($client, \$res, "$cmd:$tail"); |
|
} else { |
|
Reply($client, \$res, "$cmd:$tail"); |
|
} |
|
|
|
return 1; |
|
|
|
#TODO remove |
my $userinput = "$cmd:$tail"; |
my $userinput = "$cmd:$tail"; |
|
|
my ($udom,$since,$description,$instcodefilter,$ownerfilter,$coursefilter, |
my ($udom,$since,$description,$instcodefilter,$ownerfilter,$coursefilter, |
Line 3947 sub dump_course_id_handler {
|
Line 3957 sub dump_course_id_handler {
|
$creationcontext = '.'; |
$creationcontext = '.'; |
} |
} |
my $unpack = 1; |
my $unpack = 1; |
if ($description eq '.' && $instcodefilter eq '.' && $coursefilter eq '.' && |
if ($description eq '.' && $instcodefilter eq '.' && $ownerfilter eq '.' && |
$typefilter eq '.') { |
$typefilter eq '.') { |
$unpack = 0; |
$unpack = 0; |
} |
} |
Line 6114 sub HUPSMAN { # sig
|
Line 6124 sub HUPSMAN { # sig
|
# a setuid perl script that can be root for us to do this job. |
# a setuid perl script that can be root for us to do this job. |
# |
# |
sub ReloadApache { |
sub ReloadApache { |
my $execdir = $perlvar{'lonDaemons'}; |
# --------------------------- Handle case of another apachereload process (locking) |
my $script = $execdir."/apachereload"; |
if (&LONCAPA::try_to_lock('/tmp/lock_apachereload')) { |
system($script); |
my $execdir = $perlvar{'lonDaemons'}; |
|
my $script = $execdir."/apachereload"; |
|
system($script); |
|
unlink('/tmp/lock_apachereload'); # Remove the lock file. |
|
} |
} |
} |
|
|
# |
# |
Line 6227 sub Debug {
|
Line 6241 sub Debug {
|
# reply - Text to send to client. |
# reply - Text to send to client. |
# request - Original request from client. |
# request - Original request from client. |
# |
# |
|
#NOTE $reply must be terminated by exactly *one* \n. If $reply is a reference |
|
#this is done automatically ($$reply must not contain any \n in this case). |
|
#If $reply is a string the caller has to ensure this. |
sub Reply { |
sub Reply { |
my ($fd, $reply, $request) = @_; |
my ($fd, $reply, $request) = @_; |
if (ref($reply)) { |
if (ref($reply)) { |
Line 6380 $SIG{USR2} = \&UpdateHosts;
|
Line 6397 $SIG{USR2} = \&UpdateHosts;
|
&Apache::lonnet::load_hosts_tab(); |
&Apache::lonnet::load_hosts_tab(); |
my %iphost = &Apache::lonnet::get_iphost(1); |
my %iphost = &Apache::lonnet::get_iphost(1); |
|
|
my $dist=`$perlvar{'lonDaemons'}/distprobe`; |
$dist=`$perlvar{'lonDaemons'}/distprobe`; |
|
|
my $arch = `uname -i`; |
my $arch = `uname -i`; |
|
chomp($arch); |
if ($arch eq 'unknown') { |
if ($arch eq 'unknown') { |
$arch = `uname -m`; |
$arch = `uname -m`; |
|
chomp($arch); |
} |
} |
|
|
# -------------------------------------------------------------- |
# -------------------------------------------------------------- |
Line 6471 sub make_new_child {
|
Line 6490 sub make_new_child {
|
#---------------------------------------------------- kerberos 5 initialization |
#---------------------------------------------------- kerberos 5 initialization |
&Authen::Krb5::init_context(); |
&Authen::Krb5::init_context(); |
unless (($dist eq 'fedora5') || ($dist eq 'fedora4') || |
unless (($dist eq 'fedora5') || ($dist eq 'fedora4') || |
($dist eq 'fedora6') || ($dist eq 'suse9.3')) { |
($dist eq 'fedora6') || ($dist eq 'suse9.3') || |
|
($dist eq 'suse12.2')) { |
&Authen::Krb5::init_ets(); |
&Authen::Krb5::init_ets(); |
} |
} |
|
|
Line 6516 sub make_new_child {
|
Line 6536 sub make_new_child {
|
# |
# |
# If the remote is attempting a local init... give that a try: |
# If the remote is attempting a local init... give that a try: |
# |
# |
|
logthis("remotereq: $remotereq"); |
(my $i, my $inittype, $clientversion) = split(/:/, $remotereq); |
(my $i, my $inittype, $clientversion) = split(/:/, $remotereq); |
|
# For LON-CAPA 2.9, the client session will have sent its LON-CAPA |
|
# version when initiating the connection. For LON-CAPA 2.8 and older, |
|
# the version is retrieved from the global %loncaparevs in lonnet.pm. |
|
# $clientversion contains path to keyfile if $inittype eq 'local' |
|
# it's overridden below in this case |
|
$clientversion ||= $Apache::lonnet::loncaparevs{$clientname}; |
|
|
# If the connection type is ssl, but I didn't get my |
# If the connection type is ssl, but I didn't get my |
# certificate files yet, then I'll drop back to |
# certificate files yet, then I'll drop back to |
Line 6660 sub is_author {
|
Line 6687 sub is_author {
|
|
|
# Author role should show up as a key /domain/_au |
# Author role should show up as a key /domain/_au |
|
|
my $key = "/$domain/_au"; |
|
my $value; |
my $value; |
if (defined($hashref)) { |
if ($hashref) { |
$value = $hashref->{$key}; |
|
} |
|
|
|
if(defined($value)) { |
my $key = "/$domain/_au"; |
&Debug("$user @ $domain is an author"); |
if (defined($hashref)) { |
|
$value = $hashref->{$key}; |
|
if(!untie_user_hash($hashref)) { |
|
return 'error: ' . ($!+0)." untie (GDBM) Failed"; |
|
} |
|
} |
|
|
|
if(defined($value)) { |
|
&Debug("$user @ $domain is an author"); |
|
} |
|
} else { |
|
return 'error: '.($!+0)." tie (GDBM) Failed"; |
} |
} |
|
|
return defined($value); |
return defined($value); |
} |
} |
# |
# |
# Checks to see if the input roleput request was to set |
# Checks to see if the input roleput request was to set |
# an author role. If so, invokes the lchtmldir script to set |
# an author role. If so, creates construction space |
# up a correct public_html |
|
# Parameters: |
# Parameters: |
# request - The request sent to the rolesput subchunk. |
# request - The request sent to the rolesput subchunk. |
# We're looking for /domain/_au |
# We're looking for /domain/_au |
Line 6685 sub is_author {
|
Line 6719 sub is_author {
|
# |
# |
sub manage_permissions { |
sub manage_permissions { |
my ($request, $domain, $user, $authtype) = @_; |
my ($request, $domain, $user, $authtype) = @_; |
|
|
&Debug("manage_permissions: $request $domain $user $authtype"); |
|
|
|
# See if the request is of the form /$domain/_au |
# See if the request is of the form /$domain/_au |
if($request =~ /^(\/\Q$domain\E\/_au)$/) { # It's an author rolesput... |
if($request =~ /^(\/\Q$domain\E\/_au)$/) { # It's an author rolesput... |
my $execdir = $perlvar{'lonDaemons'}; |
my $path=$perlvar{'lonDocRoot'}."/priv/$domain"; |
my $userhome= "/home/$user" ; |
unless (-e $path) { |
&logthis("system $execdir/lchtmldir $userhome $user $authtype"); |
mkdir($path); |
&Debug("Setting homedir permissions for $userhome"); |
} |
system("$execdir/lchtmldir $userhome $user $authtype"); |
unless (-e $path.'/'.$user) { |
|
mkdir($path.'/'.$user); |
|
} |
} |
} |
} |
} |
|
|
Line 7183 sub subscribe {
|
Line 7216 sub subscribe {
|
# the metadata |
# the metadata |
unless ($fname=~/\.meta$/) { &unsub("$fname.meta",$clientip); } |
unless ($fname=~/\.meta$/) { &unsub("$fname.meta",$clientip); } |
$fname=~s/\/home\/httpd\/html\/res/raw/; |
$fname=~s/\/home\/httpd\/html\/res/raw/; |
$fname="http://".&Apache::lonnet::hostname($perlvar{'lonHostID'})."/".$fname; |
my $protocol = $Apache::lonnet::protocol{$perlvar{'lonHostID'}}; |
|
$protocol = 'http' if ($protocol ne 'https'); |
|
$fname=$protocol.'://'.&Apache::lonnet::hostname($perlvar{'lonHostID'})."/".$fname; |
$result="$fname\n"; |
$result="$fname\n"; |
} |
} |
} else { |
} else { |
Line 7225 sub change_unix_password {
|
Line 7260 sub change_unix_password {
|
|
|
|
|
sub make_passwd_file { |
sub make_passwd_file { |
my ($uname, $umode,$npass,$passfilename)=@_; |
my ($uname,$udom,$umode,$npass,$passfilename)=@_; |
my $result="ok"; |
my $result="ok"; |
if ($umode eq 'krb4' or $umode eq 'krb5') { |
if ($umode eq 'krb4' or $umode eq 'krb5') { |
{ |
{ |
Line 7266 sub make_passwd_file {
|
Line 7301 sub make_passwd_file {
|
# |
# |
my $uid = getpwnam($uname); |
my $uid = getpwnam($uname); |
if((defined $uid) && ($uid == 0)) { |
if((defined $uid) && ($uid == 0)) { |
&logthis(">>>Attempted to create privilged account blocked"); |
&logthis(">>>Attempt to create privileged account blocked"); |
return "no_priv_account_error\n"; |
return "no_priv_account_error\n"; |
} |
} |
|
|
Line 7278 sub make_passwd_file {
|
Line 7313 sub make_passwd_file {
|
&Debug("user = ".$uname.", Password =". $npass); |
&Debug("user = ".$uname.", Password =". $npass); |
my $se = IO::File->new("|$execpath > $perlvar{'lonDaemons'}/logs/lcuseradd.log"); |
my $se = IO::File->new("|$execpath > $perlvar{'lonDaemons'}/logs/lcuseradd.log"); |
print $se "$uname\n"; |
print $se "$uname\n"; |
|
print $se "$udom\n"; |
print $se "$npass\n"; |
print $se "$npass\n"; |
print $se "$npass\n"; |
print $se "$npass\n"; |
print $se "$lc_error_file\n"; # Status -> unique file. |
print $se "$lc_error_file\n"; # Status -> unique file. |
Line 7371 sub get_usersession_config {
|
Line 7407 sub get_usersession_config {
|
return; |
return; |
} |
} |
|
|
sub releasereqd_check { |
|
my ($cnum,$cdom,$key,$value,$major,$minor,$homecourses,$ids) = @_; |
|
my $home = &Apache::lonnet::homeserver($cnum,$cdom); |
|
return if ($home eq 'no_host'); |
|
my ($reqdmajor,$reqdminor,$displayrole); |
|
if ($cnum =~ /$LONCAPA::match_community/) { |
|
if ($major eq '' && $minor eq '') { |
|
return unless ((ref($ids) eq 'ARRAY') && |
|
(grep(/^\Q$home\E$/,@{$ids}))); |
|
} else { |
|
$reqdmajor = 2; |
|
$reqdminor = 9; |
|
return unless (&useable_role($reqdmajor,$reqdminor,$major,$minor)); |
|
} |
|
} |
|
my $hashid = $cdom.':'.$cnum; |
|
my ($courseinfo,$cached) = |
|
&Apache::lonnet::is_cached_new('courseinfo',$hashid); |
|
if (defined($cached)) { |
|
if (ref($courseinfo) eq 'HASH') { |
|
if (exists($courseinfo->{'releaserequired'})) { |
|
my ($reqdmajor,$reqdminor) = split(/\./,$courseinfo->{'releaserequired'}); |
|
return unless (&useable_role($reqdmajor,$reqdminor,$major,$minor)); |
|
} |
|
} |
|
} else { |
|
if (ref($ids) eq 'ARRAY') { |
|
if (grep(/^\Q$home\E$/,@{$ids})) { |
|
if (ref($homecourses) eq 'HASH') { |
|
if (ref($homecourses->{$hashid}) eq 'ARRAY') { |
|
push(@{$homecourses->{$hashid}},{$key=>$value}); |
|
} else { |
|
$homecourses->{$hashid} = [{$key=>$value}]; |
|
} |
|
} |
|
return; |
|
} |
|
} |
|
my $courseinfo = &get_courseinfo_hash($cnum,$cdom,$home); |
|
if (ref($courseinfo) eq 'HASH') { |
|
if (exists($courseinfo->{'releaserequired'})) { |
|
my ($reqdmajor,$reqdminor) = split(/\./,$courseinfo->{'releaserequired'}); |
|
return unless (&useable_role($reqdmajor,$reqdminor,$major,$minor)); |
|
} |
|
} else { |
|
return; |
|
} |
|
} |
|
return 1; |
|
} |
|
|
|
sub get_courseinfo_hash { |
|
my ($cnum,$cdom,$home) = @_; |
|
my %info; |
|
eval { |
|
local($SIG{ALRM}) = sub { die "timeout\n"; }; |
|
local($SIG{__DIE__})='DEFAULT'; |
|
alarm(3); |
|
%info = &Apache::lonnet::courseiddump($cdom,'.',1,'.','.',$cnum,1,[$home],'.'); |
|
alarm(0); |
|
}; |
|
if ($@) { |
|
if ($@ eq "timeout\n") { |
|
&logthis("<font color='blue'>WARNING courseiddump for $cnum:$cdom from $home timedout</font>"); |
|
} else { |
|
&logthis("<font color='yellow'>WARNING unexpected error during eval of call for courseiddump from $home</font>"); |
|
} |
|
} else { |
|
if (ref($info{$cdom.'_'.$cnum}) eq 'HASH') { |
|
my $hashid = $cdom.':'.$cnum; |
|
return &Apache::lonnet::do_cache_new('courseinfo',$hashid,$info{$cdom.'_'.$cnum},600); |
|
} |
|
} |
|
return; |
|
} |
|
|
|
sub check_homecourses { |
|
my ($homecourses,$udom,$regexp,$count,$range,$start,$end,$major,$minor) = @_; |
|
my ($result,%addtocache); |
|
my $yesterday = time - 24*3600; |
|
if (ref($homecourses) eq 'HASH') { |
|
my (%okcourses,%courseinfo,%recent); |
|
my $hashref = &tie_domain_hash($udom, "nohist_courseids", &GDBM_WRCREAT()); |
|
if ($hashref) { |
|
while (my ($key,$value) = each(%$hashref)) { |
|
my $unesc_key = &unescape($key); |
|
if ($unesc_key =~ /^lasttime:(\w+)$/) { |
|
my $cid = $1; |
|
$cid =~ s/_/:/; |
|
if ($value > $yesterday ) { |
|
$recent{$cid} = 1; |
|
} |
|
next; |
|
} |
|
my $items = &Apache::lonnet::thaw_unescape($value); |
|
if (ref($items) eq 'HASH') { |
|
my $hashid = $unesc_key; |
|
$hashid =~ s/_/:/; |
|
$courseinfo{$hashid} = $items; |
|
if (ref($homecourses->{$hashid}) eq 'ARRAY') { |
|
my ($reqdmajor,$reqdminor) = split(/\./,$items->{'releaserequired'}); |
|
if (&useable_role($reqdmajor,$reqdminor,$major,$minor)) { |
|
$okcourses{$hashid} = 1; |
|
} |
|
} |
|
} |
|
} |
|
unless (&untie_domain_hash($hashref)) { |
|
&logthis('Failed to untie tied hash for nohist_courseids.db'); |
|
} |
|
} else { |
|
&logthis('Failed to tie hash for nohist_courseids.db'); |
|
return; |
|
} |
|
foreach my $hashid (keys(%recent)) { |
|
my ($result,$cached)=&Apache::lonnet::is_cached_new('courseinfo',$hashid); |
|
unless ($cached) { |
|
&Apache::lonnet::do_cache_new('courseinfo',$hashid,$courseinfo{$hashid},600); |
|
} |
|
} |
|
foreach my $hashid (keys(%{$homecourses})) { |
|
next if ($recent{$hashid}); |
|
&Apache::lonnet::do_cache_new('courseinfo',$hashid,$courseinfo{$hashid},600); |
|
} |
|
foreach my $hashid (keys(%okcourses)) { |
|
if (ref($homecourses->{$hashid}) eq 'ARRAY') { |
|
foreach my $role (@{$homecourses->{$hashid}}) { |
|
if (ref($role) eq 'HASH') { |
|
while (my ($key,$value) = each(%{$role})) { |
|
if ($regexp eq '.') { |
|
$count++; |
|
if (defined($range) && $count >= $end) { last; } |
|
if (defined($range) && $count < $start) { next; } |
|
$result.=$key.'='.$value.'&'; |
|
} else { |
|
my $unescapeKey = &unescape($key); |
|
if (eval('$unescapeKey=~/$regexp/')) { |
|
$count++; |
|
if (defined($range) && $count >= $end) { last; } |
|
if (defined($range) && $count < $start) { next; } |
|
$result.="$key=$value&"; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
return $result; |
|
} |
|
|
|
sub useable_role { |
|
my ($reqdmajor,$reqdminor,$major,$minor) = @_; |
|
if ($reqdmajor ne '' && $reqdminor ne '') { |
|
return if (($major eq '' && $minor eq '') || |
|
($major < $reqdmajor) || |
|
(($major == $reqdmajor) && ($minor < $reqdminor))); |
|
} |
|
return 1; |
|
} |
|
|
|
sub distro_and_arch { |
sub distro_and_arch { |
return $dist.':'.$arch; |
return $dist.':'.$arch; |
Line 7744 Place in B<logs/lond.log>
|
Line 7621 Place in B<logs/lond.log>
|
|
|
stores hash in namespace |
stores hash in namespace |
|
|
=item rolesputy |
=item rolesput |
|
|
put a role into a user's environment |
put a role into a user's environment |
|
|
Line 7861 Authen::Krb5
|
Line 7738 Authen::Krb5
|
|
|
=head1 COREQUISITES |
=head1 COREQUISITES |
|
|
|
none |
|
|
=head1 OSNAMES |
=head1 OSNAMES |
|
|
linux |
linux |
Line 7948 or the CA's certificate in the call to l
|
Line 7827 or the CA's certificate in the call to l
|
<error> is the textual reason this failed. Usual reasons: |
<error> is the textual reason this failed. Usual reasons: |
|
|
=over 2 |
=over 2 |
|
|
=item Apache config file for loncapa incorrect: |
=item Apache config file for loncapa incorrect: |
|
|
one of the variables |
one of the variables |
lonCertificateDirectory, lonnetCertificateAuthority, or lonnetCertificate |
lonCertificateDirectory, lonnetCertificateAuthority, or lonnetCertificate |
undefined or incorrect |
undefined or incorrect |
Line 8069 Could not rewrite the
|
Line 7948 Could not rewrite the
|
internal password file for a user |
internal password file for a user |
|
|
=item Result of password change for <user> : <result> |
=item Result of password change for <user> : <result> |
|
|
A unix password change for <user> was attempted |
A unix password change for <user> was attempted |
and the pipe returned <result> |
and the pipe returned <result> |
|
|
Line 8098 lond has been asked to exit by its clien
|
Line 7977 lond has been asked to exit by its clien
|
client systemand <input> is the full exit command sent to the server. |
client systemand <input> is the full exit command sent to the server. |
|
|
=item Red CRITICAL: ABNORMAL EXIT. child <pid> for server <hostname> died through a crass with this error->[<message>]. |
=item Red CRITICAL: ABNORMAL EXIT. child <pid> for server <hostname> died through a crass with this error->[<message>]. |
|
|
A lond child terminated. NOte that this termination can also occur when the |
A lond child terminated. NOte that this termination can also occur when the |
child receives the QUIT or DIE signals. <pid> is the process id of the child, |
child receives the QUIT or DIE signals. <pid> is the process id of the child, |
<hostname> the host lond is working for, and <message> the reason the child died |
<hostname> the host lond is working for, and <message> the reason the child died |
Line 8182 file when sent it's USR1 signal. That p
|
Line 8061 file when sent it's USR1 signal. That p
|
assumed to be hung in some un-fixable way. |
assumed to be hung in some un-fixable way. |
|
|
=item Finished checking children |
=item Finished checking children |
|
|
Master processs's USR1 processing is cojmplete. |
Master processs's USR1 processing is cojmplete. |
|
|
=item (Red) CRITICAL: ------- Starting ------ |
=item (Red) CRITICAL: ------- Starting ------ |
Line 8196 Started a new child process for <client>
|
Line 8075 Started a new child process for <client>
|
connected to the child. This was as a result of a TCP/IP connection from a client. |
connected to the child. This was as a result of a TCP/IP connection from a client. |
|
|
=item Unable to determine who caller was, getpeername returned nothing |
=item Unable to determine who caller was, getpeername returned nothing |
|
|
In child process initialization. either getpeername returned undef or |
In child process initialization. either getpeername returned undef or |
a zero sized object was returned. Processing continues, but in my opinion, |
a zero sized object was returned. Processing continues, but in my opinion, |
this should be cause for the child to exit. |
this should be cause for the child to exit. |
Line 8207 In child process initialization. The pe
|
Line 8086 In child process initialization. The pe
|
The client address is stored as "Unavailable" and processing continues. |
The client address is stored as "Unavailable" and processing continues. |
|
|
=item (Yellow) INFO: Connection <ip> <name> connection type = <type> |
=item (Yellow) INFO: Connection <ip> <name> connection type = <type> |
|
|
In child initialization. A good connectionw as received from <ip>. |
In child initialization. A good connectionw as received from <ip>. |
|
|
=over 2 |
=over 2 |
Line 8257 The client (<client> is the peer's name
|
Line 8136 The client (<client> is the peer's name
|
negotiated an SSL connection with this child process. |
negotiated an SSL connection with this child process. |
|
|
=item (Green) Successful insecure authentication with <client> |
=item (Green) Successful insecure authentication with <client> |
|
|
|
|
The client has successfully negotiated an insecure connection withthe child process. |
The client has successfully negotiated an insecure connection withthe child process. |
|
|