[LON-CAPA-cvs] cvs: loncom /build/system_dependencies sqltest.pl
harris41
lon-capa-cvs@mail.lon-capa.org
Tue, 06 Aug 2002 23:18:25 -0000
This is a MIME encoded message
--harris411028675905
Content-Type: text/plain
harris41 Tue Aug 6 19:18:25 2002 EDT
Modified files:
/loncom/build/system_dependencies sqltest.pl
Log:
BUG 627 FIX; testing for other mysqld operability issues; also checking
multiple problem scenarios and releasing a more comprehensive status report;
POD documenting; significant reorganization/modularization -Scott
--harris411028675905
Content-Type: text/plain
Content-Disposition: attachment; filename="harris41-20020806191825.txt"
Index: loncom/build/system_dependencies/sqltest.pl
diff -u loncom/build/system_dependencies/sqltest.pl:1.5 loncom/build/system_dependencies/sqltest.pl:1.6
--- loncom/build/system_dependencies/sqltest.pl:1.5 Thu May 16 15:03:56 2002
+++ loncom/build/system_dependencies/sqltest.pl Tue Aug 6 19:18:25 2002
@@ -1,110 +1,211 @@
#!/usr/bin/perl
+
+# sqltest.pl - script to test MySQL database connectivity for LON-CAPA
#
-# The LearningOnline Network with CAPA
+# $Id: sqltest.pl,v 1.6 2002/08/06 23:18:25 harris41 Exp $
#
-# Tests the MySQL layer of the metadata database.
+###
+
+=pod
+
+=head1 NAME
+
+B<sqltest.pl> - 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<loncapa/loncom/build/Makefile>.
+
+=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.
+
+Modules used by this script,
+
+=item 2.
+
+Initializations.
+
+=item 3.
+
+Read in current configuration.
+
+=item 4.
+
+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 5.
+
+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 6.
+
+Close database connection.
+
+This part of the script is only reached if the database was successfully
+connected to.
+
+=item 7.
+
+Subroutines.
+
+B<configuration_scan> - look for PerlSetVar and store inside hash variable.
+
+=back
+
+=head1 STATUS
+
+Ratings: 1=horrible 2=poor 3=fair 4=good 5=excellent
+
+=over 4
-# ------------------------------------------------- Modules used by this script
+=item Organization
+
+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
+
+# ================================================ 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";
-# --- 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=<CONFIG>) {
- if ($configline =~ /^[^\#]*PerlSetVar/) {
- my ($dummy,$varname,$varvalue)=split(/\s+/,$configline);
- chomp($varvalue);
- $perlvar{$varname}=$varvalue;
- }
-}
-close(CONFIG);
-open (CONFIG,"/etc/httpd/conf/loncapa.conf") ||
- (print "Can't read loncapa.conf\n" && exit);
-while (my $configline=<CONFIG>) {
- if ($configline =~ /^[^\#]*PerlSetVar/) {
- my ($dummy,$varname,$varvalue)=split(/\s+/,$configline);
- chomp($varvalue);
- $perlvar{$varname}=$varvalue;
- }
+
+my $webconfdir='/etc/httpd/conf/';
+
+# NOTE: DEPRECATED scanning of access.conf
+&configuration_scan(\%perlvar,$webconfdir.'access.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);
-open (CONFIG,"/etc/httpd/conf/loncapa_apache.conf") ||
- (print "Can't read loncapa_apache.conf\n" && exit);
-while (my $configline=<CONFIG>) {
- if ($configline =~ /^[^\#]*PerlSetVar/) {
- my ($dummy,$varname,$varvalue)=split(/\s+/,$configline);
- chomp($varvalue);
- $perlvar{$varname}=$varvalue;
- }
+unless ($perlvar{'lonSqlAccess'} eq 'localhostkey') {
+ print('**** WARNING **** The lonSqlAccess variable is not set to the '.
+ 'standard expected value of "localhostkey"'."\n");
}
-close(CONFIG);
-unless ($perlvar{'lonRole'} eq 'library') {
- print "SQL testing can only be run on a library server. Skipping test..\n";
- exit 0;
+
+# ========================================= 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);
}
-# database test
+
+# ================================ 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`;
+
+ # ---------------------------------------------- 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;
}
- 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 (!$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;
+ }
+ if ($checkprocess=~/is stopped/) {
+ print('**** ERROR **** IT APPEARS THAT THE MYSQL SERVER IS NOT '.
+ 'RUNNING'."\n");
print(<<END);
To fix temporarily, run the command:
/etc/rc.d/init.d/mysqld start
@@ -122,31 +223,69 @@
To configure mysqld to launch correctly upon system startup, type the command:
/sbin/chkconfig --level 345 mysqld on
END
+ $problem_flag=1;
+ }
+ if ($checkprocess=~/mysqld dead but subsys locked/) {
+ print('**** ERROR **** IT APPEARS THAT THE MYSQLD PROCESSES'.
+ 'WERE SOMEHOW TERMINATED'."\n");
+ print(<<END);
+To fix temporarily, run the command:
+ /etc/rc.d/init.d/mysqld restart
+Double-check that your mysqld processes are running by using the command:
+ ps auxwww | grep mysqld
+
+Note that something really bad probably happened on your system to abnormally
+shutdown the mysqld processes.
+END
+ $problem_flag=1;
}
- else {
- print "**** ERROR **** IT APPEARS THAT WWW\@LOCALHOST AND/OR ".
- "PASSWORD ARE NOT CORRECTLY ENABLED\n";
+ unless ($problem_flag) {
+ print('**** ERROR **** IT APPEARS THAT WWW@LOCALHOST AND/OR '.
+ 'PASSWORD ARE NOT CORRECTLY ENABLED'."\n");
print(<<END);
+This is because all other known problems have been checked for.
+By process of elimination, the assumption is that www\@localhost
+must not be connecting to the database (a system administrator
+at your institution may want to look at other possibilities however).
+
To diagnose, try logging in from the command line with
mysql -u www -p mysql
and use the lonSqlAccess password
-listed in loncapa.conf (PerlSetVar lonSqlAccess ....).
-If this does not work, you may need to REMOVE the www\@localhost MySQL user.
-mysql -u root -p mysql
+listed in loncapa_apache.conf (it normally is set to 'localhostkey').
+If logging in fails to work, one possible approach is to REMOVE the
+www\@localhost MySQL user.
+[shell]\$ mysql -u root -p mysql
mysql> 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 metadata 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) ||
+ (print "Can't read $filename\n" && exit);
+ while (my $configline=<CONFIG>) {
+ if ($configline =~ /^[^\#]*PerlSetVar/) {
+ my ($dummy,$varname,$varvalue)=split(/\s+/,$configline);
+ chomp($varvalue);
+ $storagehashref->{$varname}=$varvalue;
+ }
+ }
+ close(CONFIG);
+}
--harris411028675905--