File:  [LON-CAPA] / loncom / build / system_dependencies / sqltest.pl
Revision 1.11: download - view: text, annotated - select for diffs
Mon Feb 3 18:03:52 2003 UTC (21 years, 3 months ago) by harris41
Branches: MAIN
CVS tags: version_2_9_X, version_2_9_99_0, version_2_9_1, version_2_9_0, version_2_8_X, version_2_8_99_1, version_2_8_99_0, version_2_8_2, version_2_8_1, version_2_8_0, version_2_7_X, version_2_7_99_1, version_2_7_99_0, version_2_7_1, version_2_7_0, version_2_6_X, version_2_6_99_1, version_2_6_99_0, version_2_6_3, version_2_6_2, version_2_6_1, version_2_6_0, version_2_5_X, version_2_5_99_1, version_2_5_99_0, version_2_5_2, version_2_5_1, version_2_5_0, version_2_4_X, version_2_4_99_0, version_2_4_2, version_2_4_1, version_2_4_0, version_2_3_X, version_2_3_99_0, version_2_3_2, version_2_3_1, version_2_3_0, version_2_2_X, version_2_2_99_1, version_2_2_99_0, version_2_2_2, version_2_2_1, version_2_2_0, version_2_1_X, version_2_1_99_3, version_2_1_99_2, version_2_1_99_1, version_2_1_99_0, version_2_1_3, version_2_1_2, version_2_1_1, version_2_1_0, version_2_12_X, version_2_11_X, version_2_11_4_uiuc, version_2_11_4_msu, version_2_11_4, version_2_11_3_uiuc, version_2_11_3_msu, version_2_11_3, version_2_11_2_uiuc, version_2_11_2_msu, version_2_11_2_educog, version_2_11_2, version_2_11_1, version_2_11_0_RC3, version_2_11_0_RC2, version_2_11_0_RC1, version_2_11_0, version_2_10_X, version_2_10_1, version_2_10_0_RC2, version_2_10_0_RC1, version_2_10_0, version_2_0_X, version_2_0_99_1, version_2_0_2, version_2_0_1, version_2_0_0, version_1_99_3, version_1_99_2, version_1_99_1_tmcc, version_1_99_1, version_1_99_0_tmcc, version_1_99_0, version_1_3_X, version_1_3_3, version_1_3_2, version_1_3_1, version_1_3_0, version_1_2_X, version_1_2_99_1, version_1_2_99_0, version_1_2_1, version_1_2_0, version_1_1_X, version_1_1_99_5, version_1_1_99_4, version_1_1_99_3, version_1_1_99_2, version_1_1_99_1, version_1_1_99_0, version_1_1_3, version_1_1_2, version_1_1_1, version_1_1_0, version_1_0_99_3, version_1_0_99_2, version_1_0_99_1, version_1_0_99, version_1_0_3, version_1_0_2, version_1_0_1, version_1_0_0, version_0_99_5, version_0_99_4, version_0_99_3, version_0_99_2, version_0_99_1, version_0_99_0, loncapaMITrelate_1, language_hyphenation_merge, language_hyphenation, conference_2003, bz6209-base, bz6209, bz5969, bz5610, bz2851, PRINT_INCOMPLETE_base, PRINT_INCOMPLETE, HEAD, GCI_3, GCI_2, GCI_1, BZ5971-printing-apage, BZ5434-fox, BZ4492-merge, BZ4492-feature_horizontal_radioresponse, BZ4492-feature_Support_horizontal_radioresponse, BZ4492-Support_horizontal_radioresponse
best wishes to all.

    1: #!/usr/bin/perl
    2: 
    3: # sqltest.pl - script to test MySQL database connectivity for LON-CAPA
    4: #
    5: # $Id: sqltest.pl,v 1.11 2003/02/03 18:03:52 harris41 Exp $
    6: #
    7: ###
    8: 
    9: =pod
   10: 
   11: =head1 NAME
   12: 
   13: B<sqltest.pl> - Test interoperability of the MySQL server for use by LON-CAPA
   14: 
   15: =cut
   16: 
   17: # Written to help LON-CAPA (The LearningOnline Network with CAPA)
   18: #
   19: # YEAR=2001
   20: # YEAR=2002
   21: 
   22: =pod
   23: 
   24: =head1 SYNOPSIS
   25: 
   26: perl sqltest.pl
   27: 
   28: This script is ordinarily located inside the LON-CAPA source code tree.
   29: This script is normally invoked by test-related targets inside
   30: F<loncapa/loncom/build/Makefile>.
   31: 
   32: =head1 DESCRIPTION
   33: 
   34: This program tests the status of the MySQL database needed by the LON-CAPA
   35: system.  As with the other LON-CAPA test scripts, when reasonable, I try
   36: to avoid importing functionality from other LON-CAPA modules so as to
   37: avoid indirectly testing software dependencies.
   38: 
   39: =head2 ORGANIZATION OF THIS PERL SCRIPT
   40: 
   41: The script is organized into the following sections.
   42: 
   43: =over 4
   44: 
   45: =item 1.
   46: 
   47: Process version information of this file.
   48: 
   49: =item 2.
   50: 
   51: Modules used by this script,
   52: 
   53: =item 3.
   54: 
   55: Initializations.
   56: 
   57: =item 4.
   58: 
   59: Read in current configuration.
   60: 
   61: =item 5.
   62: 
   63: Is this a library or access server?
   64: 
   65: This step in the script is both a sanity check and also allows for other
   66: future LON-CAPA server types (e.g. "admin", "backup", "firewall") to not
   67: be required to have MySQL.
   68: 
   69: =item 6.
   70: 
   71: Make sure that the database can be accessed.
   72: 
   73: If not, a variety of possible problems should be tested for, and a status
   74: report should be issued to standard output.
   75: 
   76: =item 7.
   77: 
   78: Close database connection.
   79: 
   80: This part of the script is only reached if the database was successfully
   81: connected to.
   82: 
   83: =item 8.
   84: 
   85: Subroutines.
   86: 
   87: B<configuration_scan> - look for PerlSetVar and store inside hash variable.
   88: 
   89: =back
   90: 
   91: =head1 STATUS
   92: 
   93: Ratings: 1=horrible 2=poor 3=fair 4=good 5=excellent
   94: 
   95: =over 4
   96: 
   97: =item Organization
   98: 
   99: 5
  100: 
  101: =item Functionality
  102: 
  103: 4
  104: 
  105: =item Has it been tested?
  106: 
  107: 3
  108: 
  109: =back
  110: 
  111: =head1 AUTHOR
  112: 
  113: This software is distributed under the General Public License,
  114: version 2, June 1991 (which is the same terms as LON-CAPA).
  115: 
  116: This is free software; you can redistribute it and/or modify
  117: it under the terms of the GNU General Public License as published by
  118: the Free Software Foundation; either version 2 of the License, or
  119: (at your option) any later version.
  120: 
  121: This software is distributed in the hope that it will be useful,
  122: but WITHOUT ANY WARRANTY; without even the implied warranty of
  123: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  124: GNU General Public License for more details.
  125: 
  126: You should have received a copy of the GNU General Public License
  127: along with this software; if not, write to the Free Software
  128: Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  129: 
  130: =cut
  131: 
  132: # =================================== Process version information of this file.
  133: my $VERSION = sprintf("%d.%02d", q$Revision: 1.11 $ =~ /(\d+)\.(\d+)/);
  134: 
  135: print('Running sqltest.pl, version '.$VERSION.'.'."\n");
  136: print('(Test interoperability of the MySQL server for use by LON-CAPA.)'."\n");
  137: 
  138: # ================================================ Modules used by this script.
  139: use strict;
  140: use DBI;    # Needed to interface with the database.
  141: 
  142: # ============================================================ Initializations.
  143: $|=1;
  144: print 'Probing for SQL loncapa database'."\n\n";
  145: 
  146: # ============================================== Read in current configuration.
  147: my %perlvar;
  148: 
  149: my $webconfdir='/etc/httpd/conf/';
  150: 
  151: # Scanning the standard loncapa configuration files.
  152: &configuration_scan(\%perlvar,$webconfdir.'loncapa.conf');
  153: &configuration_scan(\%perlvar,$webconfdir.'loncapa_apache.conf');
  154: # Note that the authoritative value for 'lonSqlAccess' comes from
  155: # loncapa_apache.conf; this is why loncapa_apache.conf is scanned
  156: # after loncapa.conf (in case a system administrator mistakenly
  157: # specifies lonSqlAccess inside loncapa.conf).
  158: 
  159: # ========================================== Is lonSqlAccess defined correctly?
  160: unless ($perlvar{'lonSqlAccess'} and $perlvar{'lonSqlAccess'}!~/^\{\[\[\[\[/) {
  161:     print('**** ERROR **** The lonSqlAccess variable was not defined '.
  162: 	  'correctly inside '.$webconfdir.'loncapa_apache.conf'."\n");
  163:     exit(1);
  164: }
  165: unless ($perlvar{'lonSqlAccess'} eq 'localhostkey') {
  166:     print('**** WARNING **** The lonSqlAccess variable is not set to the '.
  167: 	  'standard expected value of "localhostkey"'."\n");
  168: }
  169: 
  170: # ========================================= Is this a library or access server?
  171: unless ($perlvar{'lonRole'} eq 'library' or $perlvar{'lonRole'} eq 'access') {
  172:     print('**** NOTE **** SQL testing can only be run on a library or access '.
  173: 	  'server.  Skipping test.'."\n");
  174:     exit(0);
  175: }
  176: 
  177: # ================================ Make sure that the database can be accessed.
  178: my $dbh;
  179: {
  180:     unless (
  181: 	    $dbh = DBI->connect("DBI:mysql:loncapa","www",
  182: 				$perlvar{'lonSqlAccess'},
  183: 				{RaiseError=>0,PrintError=>0})
  184: 	    ) {
  185: 	print('Cannot connect to database!'."\n");
  186: 	# ------------------------------------ Check through possible problems.
  187: 	my $problem_flag=0;
  188: 	my $checkDBImodule=`perl pmvers DBI 2>/dev/null`;
  189: 	my $checkMYSQLmodule=`perl pmvers Mysql 2>/dev/null`;
  190: 	my $checkprocess=`/etc/rc.d/init.d/mysqld status`;
  191: 	my $process_ecode=system('/etc/rc.d/init.d/mysqld status');
  192: 
  193: 	# ---------------------------------------------- Issue a status report.
  194: 	if (!$checkDBImodule) {
  195: 	    print('**** ERROR **** SYSTEM IS MISSING THE DBI PERL '.
  196: 		  'MODULE (DBI.pm)'."\n");
  197: 	    $problem_flag=1;
  198: 	}
  199: 	if (!$checkMYSQLmodule) {
  200: 	    print('**** ERROR **** SYSTEM IS MISSING THE MYSQL PERL '.
  201: 		  'MODULE (Mysql.pm)'."\n");
  202: 	    $problem_flag=1;
  203: 	}
  204: 	if (!-e '/etc/rc.d/init.d/mysqld') {
  205: 	    print('**** ERROR **** IT APPEARS THAT THE MYSQL SERVER HAS NOT '.
  206: 		  'BEEN INSTALLED'."\n");
  207: 	    $problem_flag=1;
  208: 	}
  209: 	if ($checkprocess=~/is stopped/) {
  210: 	    print('**** ERROR **** IT APPEARS THAT THE MYSQL SERVER IS NOT '.
  211: 		  'RUNNING'."\n");
  212: 	    print(<<END);
  213: To fix temporarily, run the command:
  214:    /etc/rc.d/init.d/mysqld start
  215: 
  216: You may also want to check and see that mysqld is started on boot time.
  217: 
  218:    /sbin/chkconfig --list mysqld
  219: 
  220: This is bad output:
  221: mysqld         0:off  1:off  2:off  3:off  4:off  5:off  6:off
  222: 
  223: This is good output:
  224: mysqld         0:off  1:off  2:off  3:on   4:on   5:on   6:off
  225: 
  226: To configure mysqld to launch correctly upon system startup, type the command:
  227:    /sbin/chkconfig --level 345 mysqld on
  228: END
  229: 	    $problem_flag=1;
  230: 	}
  231: 	if ($checkprocess=~/mysqld dead but subsys locked/) {
  232: 	    print('**** ERROR **** IT APPEARS THAT THE MYSQLD PROCESSES'.
  233: 		  'WERE SOMEHOW TERMINATED'."\n");
  234: 	    print(<<END);
  235: To fix temporarily, run the command:
  236:    /etc/rc.d/init.d/mysqld restart
  237: Double-check that your mysqld processes are running by using the command:
  238:    ps auxwww | grep mysqld
  239: 
  240: Note that something really bad probably happened on your system to abnormally
  241: shutdown the mysqld processes.
  242: END
  243: 	    $problem_flag=1;
  244: 	}
  245: 	if ($process_ecode) { # The exit code for mysqld status was abnormal.
  246: 	    print('**** ERROR **** MYSQLD IS NOT AVAILABLE'."\n");
  247: 	    print(<<END);
  248: To check (and fix), try running these commands:
  249:      /etc/rc.d/init.d/mysqld start
  250:      /etc/rc.d/init.d/mysqld status
  251: 
  252: You may also want to check and see that mysqld is started on boot time.
  253:    /sbin/chkconfig --list mysqld
  254: If everything is off, you should run "/sbin/chkconfig --level 345 mysqld on".
  255: END
  256:             $problem_flag=1;
  257: 	}
  258: 	unless ($problem_flag) {
  259: 	    print('**** ERROR **** IT APPEARS THAT WWW@LOCALHOST AND/OR '.
  260: 		  'PASSWORD ARE NOT CORRECTLY ENABLED'."\n");
  261: 	    print(<<END);
  262: This is because all other known problems have been checked for.
  263: By process of elimination, the assumption is that www\@localhost
  264: must not be connecting to the database (a system administrator
  265: at your institution may want to look at other possibilities however).
  266: 
  267: To diagnose, try logging in from the command line with
  268:        mysql -u www -p mysql
  269: and use the lonSqlAccess password
  270: listed in loncapa_apache.conf (it normally is set to 'localhostkey').
  271: If logging in fails to work, one possible approach is to REMOVE the
  272: www\@localhost MySQL user.
  273: [shell]\$ mysql -u root -p mysql
  274: mysql> delete from user where user='www'
  275: And then, you will need to repeat the MySQL configuration steps described at:
  276:        http://install.lon-capa.org/docs/install/index.html
  277: 
  278: **** NOTE **** ANOTHER possibility is that you are not running
  279: a compatible set of DBI, Mysql perl modules, and MySQL server software.
  280: END
  281: 	}
  282: 	exit(1);
  283:     }
  284: }
  285: %perlvar=(); # clear memory
  286: 
  287: print('SQL loncapa database is found and is accessible'."\n");
  288: 
  289: # ================================================== Close database connection.
  290: $dbh->disconnect();
  291: 
  292: # ================================================================ Subroutines.
  293: 
  294: # --------- configuration_scan: look for PerlSetVar and store in hash variable.
  295: sub configuration_scan {
  296:     my ($storagehashref,$filename)=@_;
  297:     open(CONFIG,$filename) or
  298: 	(print("Can't read $filename\n") && exit(1));
  299:     while (my $configline=<CONFIG>) {
  300: 	if ($configline =~ /^[^\#]*PerlSetVar/) {
  301: 	    my ($dummy,$varname,$varvalue)=split(/\s+/,$configline);
  302: 	    chomp($varvalue);
  303: 	    $storagehashref->{$varname}=$varvalue;
  304: 	}
  305:     }
  306:     close(CONFIG);
  307: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>