[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--