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