--- loncom/lonsql 2001/11/29 13:53:56 1.39 +++ loncom/lonsql 2002/05/17 14:03:04 1.43 @@ -1,7 +1,31 @@ #!/usr/bin/perl # The LearningOnline Network -# lonsql - LON TCP-MySQL-Server +# lonsql - LON TCP-MySQL-Server Daemon for handling database requests. +# +# $Id: lonsql,v 1.43 2002/05/17 14:03:04 matthew Exp $ +# +# Copyright Michigan State University Board of Trustees +# +# This file is part of the LearningOnline Network with CAPA (LON-CAPA). +# +# LON-CAPA is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# LON-CAPA is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with LON-CAPA; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# /home/httpd/html/adm/gpl.txt +# +# http://www.lon-capa.org/ # # YEAR=2000 # lonsql-based on the preforker:harsha jagasia:date:5/10/00 @@ -11,11 +35,27 @@ # many different dates Scott Harrison # 03/22/2001 Scott Harrison # 8/30 Gerd Kortemeyer -# 10/17,11/28,11/29 Scott Harrison +# 10/17,11/28,11/29,12/20 Scott Harrison +# YEAR=2001 +# 5/11 Scott Harrison # -# $Id: lonsql,v 1.39 2001/11/29 13:53:56 harris41 Exp $ ### +############################################################################### +## ## +## ORGANIZATION OF THIS PERL SCRIPT ## +## 1. Modules used ## +## 2. Enable find subroutine ## +## 3. Read httpd config files and get variables ## +## 4. Make sure that database can be accessed ## +## 5. Make sure this process is running from user=www ## +## 6. Check if other instance is running ## +## 7. POD (plain old documentation, CPAN style) ## +## ## +############################################################################### + +use lib '/home/httpd/lib/perl/'; +use LONCAPA::Configuration; use IO::Socket; use Symbol; @@ -40,17 +80,10 @@ sub wanted { $childmaxattempts=10; $run =0;#running counter to generate the query-id -# ------------------------------------ Read httpd access.conf and get variables -open (CONFIG,"/etc/httpd/conf/access.conf") || die "Can't read access.conf"; - -while ($configline=) { - if ($configline =~ /PerlSetVar/) { - my ($dummy,$varname,$varvalue)=split(/\s+/,$configline); - chomp($varvalue); - $perlvar{$varname}=$varvalue; - } -} -close(CONFIG); +# -------------------------------- Read loncapa_apache.conf and loncapa.conf +my $perlvarref=LONCAPA::Configuration::read_conf('loncapa_apache.conf', + 'loncapa.conf'); +my %perlvar=%{$perlvarref}; # ------------------------------------- Make sure that database can be accessed { @@ -273,11 +306,11 @@ sub make_new_child { else { my $r1=$sth->fetchall_arrayref; my @r2; - map {my $a=$_; + foreach (@$r1) {my $a=$_; my @b=map {escape($_)} @$a; push @files,@{$a}[3]; push @r2,join(",", @b) - } (@$r1); + } $result=join("&",@r2); } } @@ -325,11 +358,11 @@ sub make_new_child { my $sth = $dbh->prepare($q2); $sth->execute(); my $r1=$sth->fetchall_arrayref; - map {my $a=$_; + foreach (@$r1) {my $a=$_; my @b=map {escape($_)} @$a; push @files,@{$a}[3]; push @r2,join(",", @b) - } (@$r1); + } } # &logthis("found: $stuff"); $customresult.='&custom='.escape($m2).','.escape($stuff); @@ -436,3 +469,75 @@ sub propath { my $proname="$perlvar{'lonUsersDir'}/$udom/$subdir/$uname"; return $proname; } + +# ----------------------------------- POD (plain old documentation, CPAN style) + +=head1 NAME + +lonsql - LON TCP-MySQL-Server Daemon for handling database requests. + +=head1 SYNOPSIS + +This script should be run as user=www. The following is an example invocation +from the loncron script. Note that a lonsql.pid file contains the pid of +the parent process. + + if (-e $lonsqlfile) { + my $lfh=IO::File->new("$lonsqlfile"); + my $lonsqlpid=<$lfh>; + chomp($lonsqlpid); + if (kill 0 => $lonsqlpid) { + print $fh "

lonsql at pid $lonsqlpid responding

"; + $restartflag=0; + } else { + $errors++; $errors++; + print $fh "

lonsql at pid $lonsqlpid not responding

"; + $restartflag=1; + print $fh + "

Decided to clean up stale .pid file and restart lonsql

"; + } + } + if ($restartflag==1) { + $errors++; + print $fh '
Killall lonsql: '. + system('killall lonsql').' - '; + sleep 60; + print $fh unlink($lonsqlfile).' - '. + system('killall -9 lonsql'). + '
'; + print $fh "

lonsql not running, trying to start

"; + system( + "$perlvar{'lonDaemons'}/lonsql 2>>$perlvar{'lonDaemons'}/logs/lonsql_errors"); + sleep 10; + +=head1 DESCRIPTION + +Not yet written. + +=head1 README + +Not yet written. + +=head1 PREREQUISITES + +IO::Socket +Symbol +POSIX +IO::Select +IO::File +Socket +Fcntl +Tie::RefHash +DBI + +=head1 COREQUISITES + +=head1 OSNAMES + +linux + +=head1 SCRIPT CATEGORIES + +Server/Process + +=cut