Annotation of doc/install/fedora/install.pl, revision 1.9
1.1 matthew 1: #!/usr/bin/perl -w
2: # The LearningOnline Network
1.3 matthew 3: # Fedora installation script
1.1 matthew 4: #
1.9 ! raeburn 5: # $Id: install.pl,v 1.8 2005/06/29 04:16:54 raeburn Exp $
1.1 matthew 6: #
7: # Copyright Michigan State University Board of Trustees
8: #
9: # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
10: #
11: # LON-CAPA is free software; you can redistribute it and/or modify
12: # it under the terms of the GNU General Public License as published by
13: # the Free Software Foundation; either version 2 of the License, or
14: # (at your option) any later version.
15: #
16: # LON-CAPA is distributed in the hope that it will be useful,
17: # but WITHOUT ANY WARRANTY; without even the implied warranty of
18: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19: # GNU General Public License for more details.
20: #
21: # You should have received a copy of the GNU General Public License
22: # along with LON-CAPA; if not, write to the Free Software
23: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24: #
25: # http://www.lon-capa.org/
26: #
27:
28: use strict;
29: use File::Copy;
30: use Getopt::Long;
31:
32: my $result;
33: my $test;
34:
35: # note: The filehandle LOG is global.
36: open LOG,">>loncapa_install.log" || die "Unable to open log file.\n";
37:
1.9 ! raeburn 38: print LOG '$Id: install.pl,v 1.8 2005/06/29 04:16:54 raeburn Exp $'."\n";
1.1 matthew 39:
40: # Some friendly subroutines
41: sub die_if_nonempty {
42: my ($string,$error)=@_;
43: return if (! defined($error));
44: chomp($string);chomp($error);
45: if ($string ne '') {
46: print_and_log("$error\nHalting.\n");
47: die;
48: }
49: }
50:
51: sub make_link_or_die {
52: my ($source,$dest)=@_;
53: &die_if_nonempty
54: (`ln -fs $source $dest`,"Unable to link $source to $dest.");
55: print LOG "Link from $source to $dest made successfully\n";
56: }
57:
58: sub writelog {
59: while ($_ = shift) {
60: chomp;
61: print LOG "$_\n";
62: }
63: }
64:
65: sub print_and_log {
66: while ($_=shift) {
67: chomp;
68: print "$_\n";
69: print LOG "$_\n";
70: }
71: }
72:
73: ###############################
74: # #
75: # Define default behaviour #
76: # #
77: ###############################
78: my $make_www = 1;
79: my $install_pwauth = 1;
80: my $setup_mysql = 1;
81: my $setup_mysql_permissions = 1;
82: my $stop_services = 0;
83: my $install_httpd_conf = 1;
84: my $download_loncapa = 1;
85: my $showhelp = 0;
86:
87: ###################################
88: #
89: # Deal with command line options
90: #
91: ###################################
92: GetOptions(
93: "make_www!" => \$make_www,
94: "install_pwauth!" => \$install_pwauth,
95: "setup_mysql!" => \$setup_mysql,
96: "setup_mysql_permissions!" => \$setup_mysql_permissions,
97: "stop_services!" => \$stop_services,
98: "install_httpd_conf!" => \$install_httpd_conf,
99: "download_loncapa!" => \$download_loncapa,
100: "help" => \$showhelp,
101: );
102:
103: if ($showhelp) {
104: print <<END;
105: $0: The following options are available:
106:
107: Option Default Description
108: ---------------------------------------------
109: make_www yes Create the www user
110: install_pwauth yes Install pwauth
111: setup_mysql yes Configure MySQL
112: setup_mysql_permissions yes Configure MySQL Permissions
113: stop_services no Stop unneeded services
114: install_httpd_conf yes Install LON-CAPA provided httpd.conf
115: download_loncapa yes Download LON-CAPA sources code
116: help Show this help
117:
118: Examples:
119:
120: Default behaviour is the same as:
121:
122: $0 --make_www --install_pwauth --setup_mysql \
123: --setup_mysql_permissions --install_httpd_conf \
124: --download_loncapa
125:
126: Do everything as normal but do not configure MySQL database:
127:
128: $0 --nosetup_mysql
129:
130: END
131: exit;
132: }
133:
134: print <<"END";
135: ********************************************************************
136:
137: Welcome to LON-CAPA
138:
139: This script will configure the base software that LON-CAPA needs to
140: run properly.
141:
142: ********************************************************************
143: END
144:
145: my $instdir = `pwd`;
146: chomp($instdir);
147:
148: if ($make_www) {
149: &setup_www();
150: } else {
151: &print_and_log("Skipping creation of user 'www'.\n");
152: }
153:
154: if ($install_pwauth) {
155: &build_and_install_mod_auth_external();
156: } else {
157: &print_and_log("Skipping pwauth installation.\n");
158: }
159:
160: if ($stop_services) {
161: &kill_extra_services();
162: } else {
163: # No message as not stopping the services is the default
164: }
165:
166: if ($setup_mysql) {
167: &setup_mysql();
168: } else {
169: &print_and_log("Skipping configuration of MySQL.\n");
170: }
171:
172: ##
173: ## Set up httpd
174: ##
175: print_and_log("Setting httpd to start on boot up.\n");
176: system("/sbin/chkconfig httpd on");
177:
178: if ($install_httpd_conf) {
179: ©_httpd_conf();
180: }
181:
1.2 matthew 182: #my $lctarball = 'loncapa-current.tar.gz';
1.4 matthew 183: my $lctarball = 'loncapa-fedora-current.tar.gz';
1.1 matthew 184: if ($download_loncapa) {
185: &download_loncapa($lctarball);
186: } else {
187: print_and_log(<<"END");
188:
189: You have requested not to have the LON-CAPA source downloaded from
190: install.loncapa.org.
191:
192: LON-CAPA is not yet installed on your system.
193:
194: You may retrieve the source for LON-CAPA by executing :
195: wget http://install.loncapa.org/versions/$lctarball
196: END
197: }
198:
199: exit;
200:
201: ####################################################################
202: ####################################################################
203:
204: ###############################################
205: ###############################################
206: sub setup_www {
207: ##
208: ## Set up www
209: ##
210: print_and_log("Creating user 'www'\n");
211: $result = `/usr/sbin/useradd www`;
212: if (! (($result eq '') || ($result =~ /user www exists/))) {
213: die "Unable to add user www. Halting.\n";
214: }
215: writelog ($result);
216: }
217:
218: ###############################################
219: ###############################################
220: sub uid_of_www {
1.7 matthew 221: my ($num) = (getpwnam('www'))[2];
1.1 matthew 222: return $num;
223: }
224:
225: ###############################################
226: ##
227: ## mod_auth_external
228: ##
229: ###############################################
230: sub build_and_install_mod_auth_external {
231: my $num = &uid_of_www();
1.9 ! raeburn 232: # Patch pwauth
1.1 matthew 233: print_and_log("Building authentication system for LON-CAPA users.\n");
234: my $patch = <<"ENDPATCH";
235: 148c148
236: < #define SERVER_UIDS 99 /* user "nobody" */
237: ---
238: > #define SERVER_UIDS $num /* user "www" */
239: ENDPATCH
240:
241: if (! -e "/usr/bin/patch") {
242: print_and_log("You must install the software development tools package ".
1.9 ! raeburn 243: "when installing Fedora.\n");
1.1 matthew 244: die;
245: }
1.9 ! raeburn 246: &die_if_nonempty(`cd /tmp; tar zxf $instdir/pwauth-2.2.8.tar.gz`,
! 247: "Unable to extract pwauth\n");
! 248: my $dir = "/tmp/pwauth-2.2.8";
1.1 matthew 249: open PATCH, "| patch $dir/config.h" ||
1.9 ! raeburn 250: die "Unable to start patch for pwauth. Halting\n";
1.1 matthew 251: print PATCH $patch;
252: close PATCH;
253: print_and_log("\n");
254: ##
255: ## Compile patched pwauth
256: ##
257: print_and_log("Compiling pwauth\n");
258: $result = `cd $dir/; make`;
259: my $expected = <<"END";
260: gcc -g -c -o pwauth.o pwauth.c
261: gcc -o pwauth -g pwauth.o -lcrypt
262: END
263: if ($result ne $expected) {
264: die "Unable to compile patched pwauth. Halting.\n";
265: }
1.9 ! raeburn 266: print_and_log( "apparent success compiling pwauth:\n".$result );
1.1 matthew 267: # Install patched pwauth
268: print_and_log("Copying pwauth to /usr/local/sbin\n");
269: if (! copy "$dir/pwauth","/usr/local/sbin/pwauth") {
270: die "Unable to copy $dir/pwauth to /usr/local/sbin/pwauth.\n$!\nHalting\n";
271: }
272: if (! chmod (06755, "/usr/local/sbin/pwauth")) {
273: die "Unable to set permissions on /usr/local/sbin/pwauth.\n";
274: }
275: print_and_log("\n");
276: }
277:
278: ###############################################
279: ##
280: ## Kill some services
281: ##
282: ###############################################
283: sub kill_extra_services {
284: &print_and_log("\nKilling unneccessary services.\n");
285: foreach my $service ('cups','sendmail') {
286: &print_and_log(`/etc/init.d/$service stop`);
287: &print_and_log("removing $service from startup.\n");
288: &print_and_log(`chkconfig --del $service`);
289: }
290: }
291:
292: ###############################################
293: ##
294: ## Set up mysql
295: ##
296: ###############################################
297: sub setup_mysql {
298: print_and_log("Setting mysqld to start on boot up.\n");
299: system("/sbin/chkconfig --add mysqld");
300: system("/sbin/chkconfig mysqld on");
301: &writelog(`/sbin/chkconfig --list mysqld`);
302: #
303: writelog("mysql will start automatically on boot.\n");
304: writelog(`/etc/rc.d/init.d/mysqld start`);
305: print_and_log("Waiting for mysql daemon to start.\n");
306: sleep 5;
307: my $status = system("/etc/rc.d/init.d/mysqld status");
308: if ($status != 0) {
309: die "Unable to start mysql daemon\nHalting\n";
310: } else {
311: print_and_log("Mysql daemon is running.\n");
312: }
313: print_and_log("\n");
314: #
1.8 raeburn 315:
316: my ($mysqlinfo,$mysql_ver);
317: open(PIPE,"/usr/bin/mysql -V |");
318: $mysqlinfo = <PIPE>;
319: close(PIPE);
320: if ($mysqlinfo =~ /Distrib\s+([\d]+)\./) {
321: $mysql_ver = $1;
322: }
1.1 matthew 323: my $mysql_commands = "CREATE DATABASE loncapa;\n";
324: if ($setup_mysql_permissions) {
325: ##
326: ## Get root password for mysql client
327: ##
328: print <<END;
329: Please enter a root password for the mysql database.
330: It does not have to match your root account password, but you will need
331: to remember it.
332: END
333: my $rootpass = <>;
334: chomp $rootpass;
1.8 raeburn 335: $mysql_commands .= <<"BLOCKONE";
1.1 matthew 336: INSERT INTO user (Host, User, Password)
337: VALUES ('localhost','www',password('localhostkey'));
1.8 raeburn 338: BLOCKONE
339: if ($mysql_ver < 4) {
340: $mysql_commands .=<<"BLOCKTWO";
1.5 matthew 341: INSERT INTO db (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv,Grant_priv,References_priv,Index_priv,Alter_priv) VALUES ('localhost','loncapa','www','Y','Y','Y','Y','Y','Y','N','Y','Y','Y');
1.8 raeburn 342: BLOCKTWO
343: } else {
344: $mysql_commands .=<<"BLOCKTHREE";
345: INSERT INTO db (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv,Grant_priv,References_priv,Index_priv,Alter_priv,Create_tmp_table_priv,Lock_tables_priv) VALUES ('localhost','loncapa','www','Y','Y','Y','Y','Y','Y','N','Y','Y','Y','Y','Y');
346: BLOCKTHREE
347: }
348: $mysql_commands .=<<"END";
1.1 matthew 349: SET PASSWORD FOR root\@localhost=PASSWORD('$rootpass');
350: DELETE FROM user WHERE host<>'localhost';
351: FLUSH PRIVILEGES;
352: END
353: print_and_log("Retrieved MySQL root password.\n");
354: } else {
355: print_and_log("Skipping mysql permissions setup.\n");
356: }
357: $mysql_commands .= <<"ENDMYSQL";
358: USE loncapa;
359: CREATE TABLE IF NOT EXISTS metadata (title TEXT, author TEXT, subject TEXT, url TEXT, keywords TEXT, version TEXT, notes TEXT, abstract TEXT, mime TEXT, language TEXT, creationdate DATETIME, lastrevisiondate DATETIME, owner TEXT, copyright TEXT, FULLTEXT idx_title (title), FULLTEXT idx_author (author), FULLTEXT idx_subject (subject), FULLTEXT idx_url (url), FULLTEXT idx_keywords (keywords), FULLTEXT idx_version (version), FULLTEXT idx_notes (notes), FULLTEXT idx_abstract (abstract), FULLTEXT idx_mime (mime), FULLTEXT idx_language (language), FULLTEXT idx_owner (owner), FULLTEXT idx_copyright (copyright)) TYPE=MYISAM;
360: EXIT
361: ENDMYSQL
362: ##
363: ## Execute the MySQL commands
364: ##
365: print_and_log("Starting mysql client.\n");
366: open MYSQL, "|mysql -u root mysql" || die "Unable to start mysql\n";
367: print MYSQL $mysql_commands;
368:
369: close MYSQL;
370: print_and_log("\n");
371: }
372:
373:
374: ###############################################
375: ##
376: ## Copy our (probably lousy) httpd.conf to its rightful place
377: ##
378: ###############################################
379: sub copy_httpd_conf {
380: print_and_log("Copying our httpd.conf to /etc/httpd/conf/httpd.conf\n");
381: copy "/etc/httpd/conf/httpd.conf","/etc/httpd/conf/httpd.conf.original";
382: copy "$instdir/httpd.conf","/etc/httpd/conf/httpd.conf";
383: chmod 0444,"/etc/httpd/conf/httpd.conf";
384: print_and_log("\n");
385: }
386:
387:
388: ###############################################
389: ##
390: ## Retrieve the latest LON-CAPA release
391: ##
392: ###############################################
393: sub download_loncapa {
394: my ($lctarball) = @_;
395: if (! -e "$instdir/$lctarball") {
396: print_and_log("Retrieving LON-CAPA source files from ".
397: "http://install.loncapa.org\n");
398: system("wget http://install.loncapa.org/versions/$lctarball ".
399: "2>/dev/null 1>/dev/null");
400: if (! -e "./$lctarball") {
401: die("Unable to retrieve LON-CAPA source files from\n".
402: "http://install.loncapa.org/versions/$lctarball\n");
403: }
404: print_and_log("\n");
405: } else {
406: print_and_log(<<"END");
407: ------------------------------------------------------------------------
408:
409: You seem to have a version of loncapa-current.tar.gz in $instdir.
410: This copy will be used and a new version will NOT be downloaded.
411: If you wish, you may download a new version by executing:
412:
1.6 matthew 413: wget http://install.loncapa.org/versions/loncapa-fedora-current.tar.gz
1.1 matthew 414:
415: ------------------------------------------------------------------------
416: END
417: }
418:
419: ##
420: ## untar loncapa.tar.gz
421: ##
422: print_and_log("Extracting LON-CAPA source files\n");
1.3 matthew 423: writelog(`cd ~root; tar zxf $instdir/$lctarball`);
1.1 matthew 424: print_and_log("\n");
425: print <<"ENDMSG";
426: All of the extra files seem to have been installed correctly. It remains for
427: you to execute the following commands:
428:
429: cd /root/loncapa-N.N (N.N should correspond to a version number like '0.4')
430: ./UPDATE
431:
432: If you have any trouble, please see http://install.loncapa.org/ and
433: http://help.loncapa.org/.
434: ENDMSG
435: }
436:
437: close LOG;
438:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>