--- loncom/build/system_dependencies/sqltest.pl 2002/05/10 01:32:38 1.3 +++ loncom/build/system_dependencies/sqltest.pl 2003/02/03 03:57:39 1.10 @@ -1,89 +1,219 @@ #!/usr/bin/perl + +# sqltest.pl - script to test MySQL database connectivity for LON-CAPA # -# The LearningOnline Network with CAPA +# $Id: sqltest.pl,v 1.10 2003/02/03 03:57:39 harris41 Exp $ # -# Tests the MySQL layer of the metadata database. +### + +=pod + +=head1 NAME + +B - Test interoperability of the MySQL server for use by LON-CAPA + +=cut + +# Written to help LON-CAPA (The LearningOnline Network with CAPA) # # YEAR=2001 # 9/25,9/30 Scott Harrison -# +# YEAR=2002 +# 5/10,5/11 Scott Harrison +# 8/6/2002 and onwards, Scott Harrison, sharrison@users.sourceforge.net -############################################################################### -## ## -## ORGANIZATION OF THIS PERL CGI SCRIPT ## -## ## -## 1. Status of this code ## -## 2. Purpose and description of program ## -## 3. Modules used by this script ## -## 4. Print MIME Content-type and other initialization ## -## 5. Make sure database can be accessed and that this is a library server ## -## ## -############################################################################### +=pod -# --------------------------------------------------------- Status of this code -# -# 1=horrible 2=poor 3=fair 4=good 5=excellent -# Organization 5 -# Functionality 4 -# Has it been tested? 3 -# +=head1 SYNOPSIS -# ------------------------------------------ Purpose and description of program -# -# This program tests the connection to the MySQL database. +perl sqltest.pl + +This script is ordinarily located inside the LON-CAPA source code tree. +This script is normally invoked by test-related targets inside +F. + +=head1 DESCRIPTION + +This program tests the status of the MySQL database needed by the LON-CAPA +system. As with the other LON-CAPA test scripts, when reasonable, I try +to avoid importing functionality from other LON-CAPA modules so as to +avoid indirectly testing software dependencies. + +=head2 ORGANIZATION OF THIS PERL SCRIPT + +The script is organized into the following sections. + +=over 4 + +=item 1. + +Process version information of this file. + +=item 2. + +Modules used by this script, + +=item 3. + +Initializations. + +=item 4. + +Read in current configuration. + +=item 5. + +Is this a library or access server? + +This step in the script is both a sanity check and also allows for other +future LON-CAPA server types (e.g. "admin", "backup", "firewall") to not +be required to have MySQL. + +=item 6. + +Make sure that the database can be accessed. + +If not, a variety of possible problems should be tested for, and a status +report should be issued to standard output. + +=item 7. + +Close database connection. + +This part of the script is only reached if the database was successfully +connected to. + +=item 8. + +Subroutines. + +B - look for PerlSetVar and store inside hash variable. + +=back + +=head1 STATUS + +Ratings: 1=horrible 2=poor 3=fair 4=good 5=excellent + +=over 4 + +=item Organization -# ------------------------------------------------- Modules used by this script +5 + +=item Functionality + +4 + +=item Has it been tested? + +3 + +=back + +=head1 AUTHOR + +Scott Harrison, sharrison@users.sourceforge.net, 2001, 2002 + +This software is distributed under the General Public License, +version 2, June 1991 (which is the same terms as LON-CAPA). + +This 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. + +This software 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 this software; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +=cut + +# =================================== Process version information of this file. +my $VERSION = sprintf("%d.%02d", q$Revision: 1.10 $ =~ /(\d+)\.(\d+)/); + +print('Running sqltest.pl, version '.$VERSION.'.'."\n"); +print('(Test interoperability of the MySQL server for use by LON-CAPA.)'."\n"); + +# ================================================ Modules used by this script. use strict; -use DBI; +use DBI; # Needed to interface with the database. -# ---------------------------- Print MIME Content-type and other initialization +# ============================================================ Initializations. $|=1; -print 'Probing for SQL metadata database'."\n\n"; +print 'Probing for SQL loncapa database'."\n\n"; -# --- Make sure that database can be accessed and that this is a library server -# library server test +# ============================================== Read in current configuration. my %perlvar; -open (CONFIG,"/etc/httpd/conf/access.conf") || - (print "Can't read access.conf\n" && exit); -while (my $configline=) { - if ($configline =~ /PerlSetVar/) { - my ($dummy,$varname,$varvalue)=split(/\s+/,$configline); - chomp($varvalue); - $perlvar{$varname}=$varvalue; - } + +my $webconfdir='/etc/httpd/conf/'; + +# Scanning the standard loncapa configuration files. +&configuration_scan(\%perlvar,$webconfdir.'loncapa.conf'); +&configuration_scan(\%perlvar,$webconfdir.'loncapa_apache.conf'); +# Note that the authoritative value for 'lonSqlAccess' comes from +# loncapa_apache.conf; this is why loncapa_apache.conf is scanned +# after loncapa.conf (in case a system administrator mistakenly +# specifies lonSqlAccess inside loncapa.conf). + +# ========================================== Is lonSqlAccess defined correctly? +unless ($perlvar{'lonSqlAccess'} and $perlvar{'lonSqlAccess'}!~/^\{\[\[\[\[/) { + print('**** ERROR **** The lonSqlAccess variable was not defined '. + 'correctly inside '.$webconfdir.'loncapa_apache.conf'."\n"); + exit(1); } -close(CONFIG); -unless ($perlvar{'lonRole'} eq 'library') { - print "SQL testing can only be run on a library server. Skipping test..\n"; - exit 0; +unless ($perlvar{'lonSqlAccess'} eq 'localhostkey') { + print('**** WARNING **** The lonSqlAccess variable is not set to the '. + 'standard expected value of "localhostkey"'."\n"); } -# database test + +# ========================================= Is this a library or access server? +unless ($perlvar{'lonRole'} eq 'library' or $perlvar{'lonRole'} eq 'access') { + print('**** NOTE **** SQL testing can only be run on a library or access '. + 'server. Skipping test.'."\n"); + exit(0); +} + +# ================================ Make sure that the database can be accessed. my $dbh; { unless ( $dbh = DBI->connect("DBI:mysql:loncapa","www", $perlvar{'lonSqlAccess'}, - { RaiseError =>0,PrintError=>0}) - ) { - print "Cannot connect to database!\n"; + {RaiseError=>0,PrintError=>0}) + ) { + print('Cannot connect to database!'."\n"); + # ------------------------------------ Check through possible problems. + my $problem_flag=0; my $checkDBImodule=`perl pmvers DBI 2>/dev/null`; my $checkMYSQLmodule=`perl pmvers Mysql 2>/dev/null`; my $checkprocess=`/etc/rc.d/init.d/mysqld status`; + my $process_ecode=system('/etc/rc.d/init.d/mysqld status'); + + # ---------------------------------------------- Issue a status report. if (!$checkDBImodule) { - print "**** ERROR **** SYSTEM IS MISSING THE DBI PERL ". - "MODULE (DBI.pm)\n"; + print('**** ERROR **** SYSTEM IS MISSING THE DBI PERL '. + 'MODULE (DBI.pm)'."\n"); + $problem_flag=1; + } + if (!$checkMYSQLmodule) { + print('**** ERROR **** SYSTEM IS MISSING THE MYSQL PERL '. + 'MODULE (Mysql.pm)'."\n"); + $problem_flag=1; + } + if (!-e '/etc/rc.d/init.d/mysqld') { + print('**** ERROR **** IT APPEARS THAT THE MYSQL SERVER HAS NOT '. + 'BEEN INSTALLED'."\n"); + $problem_flag=1; } - elsif (!$checkMYSQLmodule) { - print "**** ERROR **** SYSTEM IS MISSING THE MYSQL PERL ". - "MODULE (Mysql.pm)\n"; - } - elsif (!-e '/etc/rc.d/init.d/mysqld') { - print "**** ERROR **** IT APPEARS THAT THE MYSQL SERVER HAS NOT ". - "BEEN INSTALLED\n"; - } - elsif ($checkprocess=~/is stopped/) { - print "**** ERROR **** IT APPEARS THAT THE MYSQL SERVER IS NOT ". - "RUNNING\n"; + if ($checkprocess=~/is stopped/) { + print('**** ERROR **** IT APPEARS THAT THE MYSQL SERVER IS NOT '. + 'RUNNING'."\n"); print(< delete from user where user='www' And then, you will need to repeat the MySQL configuration steps described at: - http://install.lon-capa.org/. + http://install.lon-capa.org/docs/install/index.html **** NOTE **** ANOTHER possibility is that you are not running -a compatible set of DBI, Mysql perl modules and MySQL server software. +a compatible set of DBI, Mysql perl modules, and MySQL server software. END } - exit 1; + exit(1); } } -%perlvar=(); # undefine it +%perlvar=(); # clear memory -print "SQL metadata database is found and is accessible\n"; +print('SQL loncapa database is found and is accessible'."\n"); -# --------------------------------------------------- Close database connection +# ================================================== Close database connection. $dbh->disconnect(); + +# ================================================================ Subroutines. + +# --------- configuration_scan: look for PerlSetVar and store in hash variable. +sub configuration_scan { + my ($storagehashref,$filename)=@_; + open(CONFIG,$filename) or + (print("Can't read $filename\n") && exit(1)); + while (my $configline=) { + if ($configline =~ /^[^\#]*PerlSetVar/) { + my ($dummy,$varname,$varvalue)=split(/\s+/,$configline); + chomp($varvalue); + $storagehashref->{$varname}=$varvalue; + } + } + close(CONFIG); +}