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, 6 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_5_msu,
version_2_11_5,
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>