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