--- loncom/lond 2020/05/04 15:15:16 1.489.2.36 +++ loncom/lond 2021/02/10 15:05:51 1.489.2.40 @@ -2,7 +2,7 @@ # The LearningOnline Network # lond "LON Daemon" Server (port "LOND" 5663) # -# $Id: lond,v 1.489.2.36 2020/05/04 15:15:16 raeburn Exp $ +# $Id: lond,v 1.489.2.40 2021/02/10 15:05:51 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -63,7 +63,7 @@ my $DEBUG = 0; # Non zero to ena my $status=''; my $lastlog=''; -my $VERSION='$Revision: 1.489.2.36 $'; #' stupid emacs +my $VERSION='$Revision: 1.489.2.40 $'; #' stupid emacs my $remoteVERSION; my $currenthostid="default"; my $currentdomainid; @@ -4589,15 +4589,14 @@ sub course_sessions_handler { next if ($filename=~/^\./); next if ($filename=~/^publicuser_/); next if ($filename=~/^[a-f0-9]+_(linked|lti_\d+)\.id$/); - if ($filename =~ /^($LONCAPA::match_user)_\d+_($LONCAPA::match_domain)_/) { + if ($filename =~ /^($LONCAPA::match_username)_\d+_($LONCAPA::match_domain)_/) { my ($uname,$udom) = ($1,$2); - next unless (-e "$perlvar{'lonDaemons'}/$uname$dbsuffix"); + next unless (-e "$perlvar{'lonDaemons'}/tmp/$uname$dbsuffix"); my $mtime = (stat("$perlvar{'lonIDsDir'}/$filename"))[9]; - my $since=$now-$mtime; if ($lastactivity < 0) { - next if ($since <= $lastactivity); + next if ($mtime-$now > $lastactivity); } else { - next if ($since > $lastactivity); + next if ($now-$mtime > $lastactivity); } $sessions{$uname.':'.$udom} = $mtime; } @@ -4663,7 +4662,7 @@ sub put_domain_handler { # domain directory. # # Parameters: -# $cmd - Command request keyword (get). +# $cmd - Command request keyword (getdom). # $tail - Tail of the command. This is a colon separated list # consisting of the domain and the 'namespace' # which selects the gdbm file to do the lookup in, @@ -4680,28 +4679,14 @@ sub put_domain_handler { sub get_domain_handler { my ($cmd, $tail, $client) = @_; - my $userinput = "$cmd:$tail"; my ($udom,$namespace,$what)=split(/:/,$tail,3); - chomp($what); - my @queries=split(/\&/,$what); - my $qresult=''; - my $hashref = &tie_domain_hash($udom, "$namespace", &GDBM_READER()); - if ($hashref) { - for (my $i=0;$i<=$#queries;$i++) { - $qresult.="$hashref->{$queries[$i]}&"; - } - if (&untie_domain_hash($hashref)) { - $qresult=~s/\&$//; - &Reply($client, \$qresult, $userinput); - } else { - &Failure( $client, "error: ".($!+0)." untie(GDBM) Failed ". - "while attempting getdom\n",$userinput); - } + my $res = LONCAPA::Lond::get_dom($userinput); + if ($res =~ /^error:/) { + &Failure($client, \$res, $userinput); } else { - &Failure($client, "error: ".($!+0)." tie(GDBM) Failed ". - "while attempting getdom\n",$userinput); + &Reply($client, \$res, $userinput); } return 1; @@ -5224,8 +5209,65 @@ sub tmp_del_handler { ®ister_handler("tmpdel", \&tmp_del_handler, 0, 1, 0); # +# Process the updatebalcookie command. This command updates a +# cookie in the lonBalancedir directory on a load balancer node. +# +# Parameters: +# $cmd - Command that got us here. +# $tail - Tail of the request (escaped cookie: escaped current entry) +# +# $client - socket open on the client process. +# +# Returns: +# 1 - Indicating processing should continue. +# Side Effects: +# A cookie file is updated from the lonBalancedir directory +# A reply is sent to the client. +# +sub update_balcookie_handler { + my ($cmd, $tail, $client) = @_; + + my $userinput= "$cmd:$tail"; + chomp($tail); + my ($cookie,$lastentry) = map { &unescape($_) } (split(/:/,$tail)); + + my $updatedone; + if ($cookie =~ /^$LONCAPA::match_domain\_$LONCAPA::match_username\_[a-f0-9]{32}$/) { + my $execdir=$perlvar{'lonBalanceDir'}; + if (-e "$execdir/$cookie.id") { + my $doupdate; + if (open(my $fh,'<',"$execdir/$cookie.id")) { + while (my $line = <$fh>) { + chomp($line); + if ($line eq $lastentry) { + $doupdate = 1; + last; + } + } + close($fh); + } + if ($doupdate) { + if (open(my $fh,'>',"$execdir/$cookie.id")) { + print $fh $clientname; + close($fh); + $updatedone = 1; + } + } + } + } + if ($updatedone) { + &Reply($client, "ok\n", $userinput); + } else { + &Failure( $client, "error: ".($!+0)."file update failed ". + "while attempting updatebalcookie\n", $userinput); + } + return 1; +} +®ister_handler("updatebalcookie", \&update_balcookie_handler, 0, 1, 0); + +# # Process the delbalcookie command. This command deletes a balancer -# cookie in the lonBalancedir directory created by switchserver +# cookie in the lonBalancedir directory on a load balancer node. # # Parameters: # $cmd - Command that got us here. @@ -5243,6 +5285,7 @@ sub del_balcookie_handler { my $userinput= "$cmd:$cookie"; chomp($cookie); + $cookie = &unescape($cookie); my $deleted = ''; if ($cookie =~ /^$LONCAPA::match_domain\_$LONCAPA::match_username\_[a-f0-9]{32}$/) { my $execdir=$perlvar{'lonBalanceDir'};