Annotation of doc/loncapafiles/updatequery.piml, revision 1.51
1.2 harris41 1: <!-- updatequery.piml -->
1.1 harris41 2:
1.51 ! albertel 3: <!-- $Id: updatequery.piml,v 1.50 2006/09/28 22:52:43 raeburn Exp $ -->
1.1 harris41 4:
5: <!--
6:
7: This file is part of the LearningOnline Network with CAPA (LON-CAPA).
8:
9: LON-CAPA is free software; you can redistribute it and/or modify
10: it under the terms of the GNU General Public License as published by
11: the Free Software Foundation; either version 2 of the License, or
12: (at your option) any later version.
13:
14: LON-CAPA is distributed in the hope that it will be useful,
15: but WITHOUT ANY WARRANTY; without even the implied warranty of
16: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17: GNU General Public License for more details.
18:
19: You should have received a copy of the GNU General Public License
20: along with LON-CAPA; if not, write to the Free Software
21: Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22:
23: /home/httpd/html/adm/gpl.txt
24:
25: http://www.lon-capa.org/
26:
27: -->
28:
29: <piml>
30: <targetroot>/</targetroot>
31: <files>
32: <file>
1.4 harris41 33: <target dist='default'>/</target>
1.1 harris41 34: <perlscript mode='fg'>
1.4 harris41 35: $|=1;
1.1 harris41 36: print(<<END);
37:
38:
39: *********************************************
40: *********************************************
41: **** ****
42: **** LON-CAPA SYSTEM INFORMATION REQUEST ****
43: **** ****
44: **** Please respond to the choices below ****
45: **** ****
46: *********************************************
47: *********************************************
48:
49: END
1.4 harris41 50: sleep(3);
1.1 harris41 51: </perlscript>
52: </file>
53: <file>
1.22 albertel 54: <target dist='default'>loncom/hosts.tab</target>
55: <perlscript mode='fg'>
56: unless (-l "<TARGET />") {
57: print(<<END);
58:
59: ===============================================================================
1.30 www 60: Which cluster option would you like to have installed?
61: IMPORTANT: to take advantage of the cluster options 1) and 3),
62: you must contact lon-capa\@lon-capa.org.
63:
64: 1) PRODUCTION - you want to eventually connect this machine to the
65: LON-CAPA content sharing network. This setting is for
66: schools, colleges, and universities, that currently
67: are running - or in the future will run - courses
1.22 albertel 68: 2) STAND-ALONE - you want this machine to run in 'stand-alone' mode and
69: not be connected to other LON-CAPA machines for now
1.30 www 70: 3) DEVELOPMENT - you want to do software (not content!) development with
71: this workstation and eventually link it with the
72: workstations of other LON-CAPA software developers.
1.40 albertel 73: 4) RUNNING YOUR OWN CLUSTER - this machine is not in the standard LON-CAPA
74: clusters and won't be in the future and you want the existing
75: hosts.tab and domain.tab files to be left alone.
76: (This choice is unlikely what you want to select.)
1.22 albertel 77: END
78: # Option number 26 will install rawhide_hosts.tab, but
79: # the typical user does not want to be part of an intensive
80: # machine test cluster.
81:
82: # get input
83: # if valid then process, otherwise loop
84: $flag=0;
85: while (!$flag) {
86: print "ENTER 1, 2, 3, or 4:\n";
87: my $choice=<>;
88: chomp($choice);
89: if ($choice==1) {
90: $lonCluster='production'; $flag=1;
91: }
92: elsif ($choice==2) {
93: $lonCluster='standalone'; $flag=1;
94: }
95: elsif ($choice==3) {
96: $lonCluster='development'; $flag=1;
97: }
98: elsif ($choice==4) {
99: $lonCluster='existing'; $flag=1;
100: if (-e '/home/httpd/lonTabs/hosts.tab') {
101: `cp /home/httpd/lonTabs/hosts.tab ../existing_hosts.tab`;
102: }
103: else {
104: print <<END;
105: There is no existing /home/httpd/lonTabs/hosts.tab
106: END
107: die('');
108: }
1.27 albertel 109: if (-e '/home/httpd/lonTabs/domain.tab') {
110: `cp /home/httpd/lonTabs/domain.tab ../existing_domain.tab`;
111: }
112: else {
113: print <<END;
114: There is no existing /home/httpd/lonTabs/domain.tab
115: END
116: die('');
117: }
1.22 albertel 118: }
119: elsif ($choice==26) {
120: $lonCluster='rawhide'; $flag=1;
121: }
122: }
123: }
124: </perlscript>
125: </file>
126: <file>
1.10 harris41 127: <target dist='default'>/home/httpd/lonTabs/hosts.tab</target>
1.1 harris41 128: <perlscript mode='fg'>
1.4 harris41 129: $|=1;
1.20 albertel 130: my $domainDescription;
1.29 albertel 131: my $domainTabExtras;
1.43 raeburn 132: my $primaryLibServer;
133: my @libservers = ();
1.1 harris41 134: unless (-e "<TARGET />") {
135: print(<<END);
136: WELCOME TO LON-CAPA!
137:
138: If you have questions, please visit http://install.lon-capa.org
1.32 raeburn 139: or contact helpdesk\@lon-capa.org.
1.1 harris41 140:
141: ===============================================================================
1.4 harris41 142: The following 4 values are needed to configure LON-CAPA:
143: * Machine Role
1.8 harris41 144: * LON-CAPA Domain Name
145: * LON-CAPA Machine ID Name, and
1.47 albertel 146: * Server Administration E-mail Address.
1.32 raeburn 147: ===============================================================================
148:
149: In addition, a Support E-mail Address can also be included. If
150: an address is included then one of the options in the LON-CAPA
151: help menu will be a link to a form that a user will complete to
152: request LON-CAPA help.
153:
1.1 harris41 154: END
1.3 harris41 155:
1.4 harris41 156: open(OUT,'>/tmp/loncapa_updatequery.out');
157: close(OUT);
158:
1.3 harris41 159: # query for Machine Role
160: print(<<END);
161: **** Machine Role ****
162: Library server (recommended if first-time installation of LON-CAPA):
163: Servers that are repositories of authoritative educational resources.
164: These servers also provide the construction space by which instructors
165: assemble their classroom online material.
166: Access server:
167: Servers that load-balance high-traffic delivery of educational resources
168: over the world-wide web.
1.4 harris41 169: 1) Will this be a library server? (recommended if this is your first install)
1.3 harris41 170: 2) Or, will this be an access server?
171: END
1.4 harris41 172: my $flag=0;
173: my $r='';
174: my $lonRole;
175: while (!$flag) {
176: print "ENTER A CHOICE OF 1 or 2:\n";
177: my $choice=<>;
178: chomp($choice);
179: if ($choice==1) {
180: open(OUT,'>>/tmp/loncapa_updatequery.out');
181: print(OUT 'lonRole'."\t".'library'."\n");
182: close(OUT);
183: $lonRole='library';
184: $r='l';
185: $flag=1;
186: }
187: elsif ($choice==2) {
188: open(OUT,'>>/tmp/loncapa_updatequery.out');
189: print(OUT 'lonRole'."\t".'access'."\n");
190: close(OUT);
191: $lonRole='access';
192: $r='a';
193: $flag=2;
194: }
195: else {
196:
197: }
198: }
1.3 harris41 199:
200: # need to recommend a machine ID name (ipdomain.l.somenumber)
1.36 albertel 201: my $hostname=`hostname -f`; chomp($hostname);
1.4 harris41 202: my $ipdomain='';
203: if ($hostname=~/([^\.]*)\.([^\.]*)$/) {
204: $ipdomain=$1;
205: }
1.1 harris41 206:
207: print(<<END);
208:
1.8 harris41 209: **** Domain ****
1.45 www 210: [This does NOT need to correspond to internet address domains.
211: Please make this name short AND descriptive of your organization.
212: Domain names are close to impossible to change later!!!
213: Good examples might be "msu" or "bionet" or "vermontcc".
214: Bad examples are "physics" (too general)
1.37 www 215: or "michiganstateuniversity" (too long)
216: or "msuedu" (internet domain, just make it "msu")
1.45 www 217: or "msuphysics" (only if there is a good reason to limit to department
218: - we don't know of one)
1.37 www 219: or "mydomain" (what is that?)
1.45 www 220: Avoid multiple domains at the same institution, even if it means that you
221: have to actually work together with your colleagues. You can still run
222: multiple library servers within the same domain.
223: If this domain is eventually going to be part of the main production
224: cluster, you MUST contact the LON-CAPA group at MSU (loncapa@loncapa.org)
225: to have a domain name assigned, and then use it exactly as given. This is
226: also true for test installs that might eventually turn into production setups.
227: Stop now if you didn't do so.]
1.1 harris41 228: END
1.8 harris41 229:
230: # get domain name
1.1 harris41 231: # accept if valid, if not valid, tell user and repeat
1.4 harris41 232: $flag=0;
1.8 harris41 233: my $lonDefDomain;
1.4 harris41 234: while (!$flag) {
235: if ($ipdomain) {
236: print(<<END);
1.8 harris41 237: ENTER LONCAPA DOMAIN [$ipdomain]:
1.4 harris41 238: END
239: }
240: else {
241: print(<<END);
1.8 harris41 242: ENTER LONCAPA DOMAIN:
1.4 harris41 243: END
244: }
245: my $choice=<>;
246: chomp($choice);
1.18 harris41 247: my $bad_domain_flag=0;
1.41 albertel 248: my @bad_domain_names=('res','raw','userfiles','priv','adm','uploaded',
249: 'editupload');
1.18 harris41 250: foreach my $bad (@bad_domain_names) {
251: $bad_domain_flag=1 if $choice eq $bad;
252: }
1.37 www 253: if ($choice=~/capa/i) {
254: $bad_domain_flag=1;
255: }
1.8 harris41 256: if ($ipdomain and $choice=~/^\s*$/) {
257: $choice=$ipdomain;
1.4 harris41 258: open(OUT,'>>/tmp/loncapa_updatequery.out');
1.8 harris41 259: print(OUT 'lonDefDomain'."\t".$choice."\n");
1.4 harris41 260: close(OUT);
1.8 harris41 261: $lonDefDomain=$choice;
1.4 harris41 262: $flag=1;
1.51 ! albertel 263: } elsif (length($choice)>35) {
1.37 www 264: print "Name too long\n";
265: } elsif (length($choice)<2) {
266: print "Name too short\n";
1.38 www 267: } elsif ($bad_domain_flag) {
268: print "Invalid input ('$choice' conflicts with LON-CAPA namespace).\n";
269: print "Please try something different than '$choice'\n";
1.51 ! albertel 270: } elsif ($choice!~/\_/ and $choice=~/^[\w\-.]+$/) {
1.4 harris41 271: open(OUT,'>>/tmp/loncapa_updatequery.out');
1.8 harris41 272: print(OUT 'lonDefDomain'."\t".$choice."\n");
1.4 harris41 273: close(OUT);
1.8 harris41 274: $lonDefDomain=$choice;
275: $r='l';
1.4 harris41 276: $flag=1;
1.37 www 277: } else {
1.51 ! albertel 278: print "Invalid input (only alphanumeric characters, '-', and '.' supported).\n";
1.4 harris41 279: }
280: }
1.1 harris41 281:
1.20 albertel 282:
283: # get domain description
284: # accept if valid, if not valid, tell user and repeat
285: $flag=0;
286:
287: while (!$flag) {
288: print(<<END);
289:
290: **** Domain Description ****
291: String describing the domain, to be shown to users.
292: [Example, msu is Michigan State University]
293: ENTER DOMAIN DESCRIPTION:
294: END
295:
296: my $choice=<>;
297: chomp($choice);
298: if ($choice!~/:/) {
299: open(OUT,'>>/tmp/loncapa_updatequery.out');
300: print(OUT 'domainDescription'."\t".$choice."\n");
301: close(OUT);
302: $domainDescription=$choice;
303: $flag=1;
304: }
305: else {
306: print "Invalid input (no ':' allowed).\n";
307: }
308: }
309:
1.8 harris41 310: my $lonHostID;
311: if ($lonDefDomain) {
312: $lonHostID=$lonDefDomain.$r.int(1+rand(9)); # should be probably also detect
313: # against the hosts.tab
314: }
315:
1.1 harris41 316: print(<<END);
317:
1.8 harris41 318: **** Machine ID Name ****
1.45 www 319: [This does NOT need to correspond to internet address names;
1.8 harris41 320: this name MUST be unique to the whole LON-CAPA network;
1.45 www 321: we recommend that you use a name based off of your institution.
322: Good examples: "msul1" or "bioneta2".
323: Bad examples: "loncapabox" or "studentsinside".
1.37 www 324: Note that machine names are very hard to change later.]
1.1 harris41 325: END
1.8 harris41 326: # get machine name
1.1 harris41 327: # accept if valid, if not valid, tell user and repeat
1.4 harris41 328: $flag=0;
329: while (!$flag) {
330: if ($ipdomain) {
331: print(<<END);
1.8 harris41 332: ENTER LONCAPA MACHINE ID [$lonHostID]:
1.4 harris41 333: END
334: }
335: else {
336: print(<<END);
1.8 harris41 337: ENTER LONCAPA MACHINE ID:
1.4 harris41 338: END
339: }
340: my $choice=<>;
341: chomp($choice);
1.37 www 342: if ($choice=~/capa/i) {
343: print "Invalid input (names containing 'capa' are reserved).\n";
344: } elsif ($lonHostID and $choice=~/^\s*$/) {
1.8 harris41 345: $choice=$lonHostID;
1.4 harris41 346: open(OUT,'>>/tmp/loncapa_updatequery.out');
1.8 harris41 347: print(OUT 'lonHostID'."\t".$choice."\n");
1.4 harris41 348: close(OUT);
1.8 harris41 349: $lonHostID=$choice;
1.4 harris41 350: $flag=1;
1.51 ! albertel 351: } elsif (length($choice)>45) {
1.37 www 352: print "Name too long\n";
353: } elsif (length($choice)<4) {
354: print "Name too short\n";
1.51 ! albertel 355: } elsif ($choice!~/\_/ and $choice=~/^[\w\-.]+$/) {
1.4 harris41 356: open(OUT,'>>/tmp/loncapa_updatequery.out');
1.8 harris41 357: print(OUT 'lonHostID'."\t".$choice."\n");
1.4 harris41 358: close(OUT);
1.8 harris41 359: $lonHostID=$choice;
1.4 harris41 360: $flag=1;
1.37 www 361: } else {
1.51 ! albertel 362: print "Invalid input (only alphanumeric characters, '-', and '.' supported).\n";
1.4 harris41 363: }
364: }
1.1 harris41 365:
1.43 raeburn 366: # get primary library server in domain
367: if ($lonRole eq 'library') {
368: if (!grep/^\Q$lonHostID\E$/,@libservers) {
369: push(@libservers,$lonHostID);
370: }
371: if (@libservers == 1) {
372: $primaryLibServer = $libservers[0];
373: }
374: }
375: while (!$flag) {
376: print(<<END);
377: **** Domain's Primary Library Server ID ****
378: This should be the LON-CAPA machine ID of a library server in your
379: domain. If you only have a single library server in your domain, then
380: the Primary Library server ID will be the machine ID of that server.
381: This server will be where domain data which are not associated with any
382: specific home library server will be stored (e.g., e-mail broadcast by
383: administrators to users in the domain).
384: END
385: if (defined($primaryLibServer)) {
386: print(<<END);
387: ENTER DOMAIN'S PRIMARY LIBRARY SERVER ID [$primaryLibServer]:
388: END
389: } elsif (@libservers > 0) {
390: print(<<END);
391: ENTER DOMAIN'S PRIMARY LIBRARY SERVER ID [$libservers[0]]
392: END
393: } else {
394: print (<<END);
395: No library servers could be identified for this domain. If you have already installed LON-CAPA on a different server (designated as a library server) in this domain, please enter the LONCAPA MACHINE ID of that server. If not, you will need to install a LON-CAPA library server. Enter the MACHINE ID of the server you plan to designate as a library server.
396: END
397: }
398:
399: my $choice=<>;
400: chomp($choice);
401: if ($primaryLibServer and $choice=~/^\s*$/) {
402: $choice=$primaryLibServer;
403: open(OUT,'>>/tmp/loncapa_updatequery.out');
404: print(OUT 'primaryLibServer'."\t".$choice."\n");
405: close(OUT);
406: $flag=1;
1.51 ! albertel 407: } elsif (length($choice)>35) {
1.43 raeburn 408: print "Name too long\n";
409: } elsif (length($choice)<4) {
410: print "Name too short\n";
1.51 ! albertel 411: } elsif ($choice!~/\_/ and $choice=~/^[\w\-.]+$/) {
1.43 raeburn 412: open(OUT,'>>/tmp/loncapa_updatequery.out');
413: print(OUT 'primaryLibServer'."\t".$choice."\n");
414: close(OUT);
415: $primaryLibServer=$choice;
416: $flag=1;
417: } else {
1.51 ! albertel 418: print "Invalid input (only alphanumeric characters, '-', and '.' supported).\n";
1.43 raeburn 419: }
420: }
421:
422:
1.32 raeburn 423: # get admin e-mail address
1.4 harris41 424: # accept if valid, if not valid, tell user and repeat
425: $flag=0;
1.9 harris41 426: my $lonAdmEMail;
1.4 harris41 427: while (!$flag) {
1.1 harris41 428: print(<<END);
429:
1.47 albertel 430: **** Server Administrator's E-mail ****
1.1 harris41 431: E-mail address of the person who will manage this machine
1.4 harris41 432: [should be in the form somebody\@somewhere]
1.32 raeburn 433: ENTER ADMIN E-MAIL ADDRESS:
1.1 harris41 434: END
435:
1.4 harris41 436: my $choice=<>;
437: chomp($choice);
438: if ($choice=~/\@/) {
439: open(OUT,'>>/tmp/loncapa_updatequery.out');
1.9 harris41 440: print(OUT 'lonAdmEMail'."\t".$choice."\n");
1.4 harris41 441: close(OUT);
1.9 harris41 442: $lonAdmEMail=$choice;
1.4 harris41 443: $flag=1;
444: }
445: else {
446: print "Invalid input (this needs to look like an e-mail address!).\n";
447: }
448: }
449:
1.32 raeburn 450:
451: # get support e-mail address
452: # accept if valid, if not valid, tell user and repeat
453: $flag=0;
454: my $lonSupportEMail;
455: while (!$flag) {
456: print(<<END);
457:
458: **** Support E-mail ****
459: E-mail address of the person who will receive
460: help requests from LON-CAPA users who access
461: the system via this server. If the address is left blank,
462: then a help support form will not be displayed
463: as part of the help menu.
464: [should be in the form somebody\@somewhere]
465: ENTER SUPPORT E-MAIL ADDRESS:
466: END
467:
468: my $choice=<>;
469: chomp($choice);
470: $choice =~ s/\s//g;
1.33 albertel 471: if ( ($choice=~/\@/) || $choice eq '') {
1.32 raeburn 472: open(OUT,'>>/tmp/loncapa_updatequery.out');
473: print(OUT 'lonSupportEMail'."\t".$choice."\n");
474: close(OUT);
475: $lonSupportEMail=$choice;
476: $flag=1;
477: }
478: else {
479: print "Invalid input (this either needs to be blank, or look like an e-mail address!).\n";
480: }
481: }
482:
483:
1.1 harris41 484: # update loncapa.conf
1.49 raeburn 485: my $confdir = '/etc/httpd/conf/';
1.50 raeburn 486: if ('<DIST />' eq 'sles10' || '<DIST />' eq 'suse10.1') {
1.49 raeburn 487: $confdir = '/etc/apache2/';
488: }
1.5 harris41 489: my $filename='loncapa.conf';
490: my %perlvar;
491: if (-e "$confdir$filename") {
492: open(CONFIG,'<'.$confdir.$filename) or die("Can't read $confdir$filename");
493: while (my $configline=<CONFIG>) {
494: if ($configline =~ /^[^\#]*PerlSetVar/) {
495: my ($unused,$varname,$varvalue)=split(/\s+/,$configline);
496: chomp($varvalue);
1.12 harris41 497: $perlvar{$varname}=$varvalue if $varvalue!~/^\{\[\[\[\[/;
1.5 harris41 498: }
499: }
500: close(CONFIG);
501: }
502: $perlvar{'lonHostID'}=$lonHostID;
503: $perlvar{'lonDefDomain'}=$lonDefDomain;
1.9 harris41 504: $perlvar{'lonAdmEMail'}=$lonAdmEMail;
1.32 raeburn 505: $perlvar{'lonSupportEMail'}=$lonSupportEMail;
1.5 harris41 506: $perlvar{'lonRole'}=$lonRole;
1.16 harris41 507: unless ($perlvar{'lonLoadLim'} and $perlvar{'lonLoadLim'}!~/\{\[\[\[\[/) {
1.5 harris41 508: $perlvar{'lonLoadLim'}='2.00';
509: }
1.25 albertel 510: unless ($perlvar{'lonUserLoadLim'} and $perlvar{'lonUserLoadLim'}!~/\{\[\[\[\[/) {
511: $perlvar{'lonUserLoadLim'}='0';
512: }
1.16 harris41 513: unless ($perlvar{'lonExpire'} and $perlvar{'lonExpire'}!~/\{\[\[\[\[/) {
1.5 harris41 514: $perlvar{'lonExpire'}='86400';
515: }
1.16 harris41 516: unless ($perlvar{'lonReceipt'} and $perlvar{'lonReceipt'}!~/\{\[\[\[\[/) {
1.5 harris41 517: my $lonReceipt='';
1.11 harris41 518: srand(time ^ $$ ^ unpack "%L*", `ps axww | gzip`);
1.5 harris41 519: my @alnum=(0..9,a..z);
520: foreach my $i (1..20) {
521: $lonReceipt.=$alnum[int(rand(36))];
522: }
523: $perlvar{'lonReceipt'}=$lonReceipt;
524: }
525: open(OUT,">$confdir$filename") or
526: die("Cannot output to $confdir$filename\n");
527: foreach my $key (keys %perlvar) {
528: my $value=$perlvar{$key};
1.49 raeburn 529: my $line = "PerlSetVar $key $value";
530: if ($value eq '') {
531: $line = '#'.$line;
532: }
1.5 harris41 533: print(OUT <<END);
1.49 raeburn 534: $line
1.5 harris41 535: END
536: }
537: close(OUT);
1.1 harris41 538: }
539: </perlscript>
540: </file>
541: <file>
1.49 raeburn 542: <target dist='default'>/etc/httpd/conf/</target>
1.50 raeburn 543: <target dist='sles10 suse10.1'>/etc/apache2/</target>
1.1 harris41 544: <perlscript mode='fg'>
1.31 albertel 545: sub securesetting {
546: my (%perlvar)=@_;
547: my $securestatus='unknown';
548: my $securenum='';
549: if ( $perlvar{'loncAllowInsecure'}&& $perlvar{'londAllowInsecure'}) {
550: $securestatus='no'; $securenum='4';
551: } elsif ( $perlvar{'loncAllowInsecure'}&& !$perlvar{'londAllowInsecure'}) {
552: $securestatus='lond'; $securenum='3';
553: } elsif (!$perlvar{'loncAllowInsecure'}&& $perlvar{'londAllowInsecure'}) {
554: $securestatus='lonc'; $securenum='2';
555: } elsif (!$perlvar{'loncAllowInsecure'}&& !$perlvar{'londAllowInsecure'}) {
556: $securestatus='yes (lond and lonc)'; $securenum='1';
557: }
558: return ($securestatus,$securenum);
559: }
1.1 harris41 560: # read values from loncapa.conf
1.49 raeburn 561: my $confdir = "<TARGET />";
1.5 harris41 562: my $filename='loncapa.conf';
563: my %perlvar;
1.31 albertel 564: my ($securestatus,$securenum);
1.5 harris41 565: if (-e "$confdir$filename") {
566: open(CONFIG,'<'.$confdir.$filename) or
567: die("Can't read $confdir$filename");
568: while (my $configline=<CONFIG>) {
569: if ($configline =~ /^[^\#]*PerlSetVar/) {
570: my ($unused,$varname,$varvalue)=split(/\s+/,$configline);
571: chomp($varvalue);
572: $perlvar{$varname}=$varvalue;
573: }
574: }
575: close(CONFIG);
576: }
1.16 harris41 577: unless ($perlvar{'lonLoadLim'} and $perlvar{'lonLoadLim'}!~/\{\[\[\[\[/) {
578: $perlvar{'lonLoadLim'}='2.00';
579: }
1.25 albertel 580: unless ($perlvar{'lonUserLoadLim'} and $perlvar{'lonUserLoadLim'}!~/\{\[\[\[\[/) {
581: $perlvar{'lonUserLoadLim'}='0';
582: }
1.16 harris41 583: unless ($perlvar{'lonExpire'} and $perlvar{'lonExpire'}!~/\{\[\[\[\[/) {
584: $perlvar{'lonExpire'}='86400';
585: }
1.31 albertel 586: unless ($perlvar{'londAllowInsecure'} and $perlvar{'londAllowInsecure'}!~/\{\[\[\[\[/) {
587: $perlvar{'londAllowInsecure'}='1';
588: }
589: unless ($perlvar{'loncAllowInsecure'} and $perlvar{'loncAllowInsecure'}!~/\{\[\[\[\[/) {
590: $perlvar{'loncAllowInsecure'}='1';
591: }
592: ($securestatus,$securenum)=&securesetting(%perlvar);
1.16 harris41 593: unless ($perlvar{'lonReceipt'} and $perlvar{'lonReceipt'}!~/\{\[\[\[\[/) {
594: my $lonReceipt='';
595: srand(time ^ $$ ^ unpack "%L*", `ps axww | gzip`);
596: my @alnum=(0..9,a..z);
597: foreach my $i (1..20) {
598: $lonReceipt.=$alnum[int(rand(36))];
599: }
600: $perlvar{'lonReceipt'}=$lonReceipt;
601: }
1.7 harris41 602: my %perlvarstatic;
603: if (-e "${confdir}loncapa_apache.conf") {
604: open(CONFIG,'<'.$confdir.'loncapa_apache.conf') or
605: die("Can't read ${confdir}loncapa_apache.conf");
606: while (my $configline=<CONFIG>) {
607: if ($configline =~ /^[^\#]*PerlSetVar/) {
608: my ($unused,$varname,$varvalue)=split(/\s+/,$configline);
609: chomp($varvalue);
610: $perlvarstatic{$varname}=$varvalue;
611: }
612: }
613: close(CONFIG);
614: }
1.23 albertel 615: if (!$domainDescription && $lonCluster ne 'existing') {
1.27 albertel 616: open(IN,'<../'.$lonCluster.'_domain.tab');
1.22 albertel 617: while(<IN>) {
1.27 albertel 618: if (/^$perlvar{'lonDefDomain'}\:/) {
1.29 albertel 619: (undef,$domainDescription,$domainTabExtras)=split(/:/,$_,3);
1.22 albertel 620: chomp($domainDescription);
1.29 albertel 621: chomp($domainTabExtras);
1.46 albertel 622: # the remianing field (primary lib server) is handled later
623: $domainTabExtras = join(':',(split(/:/,$domainTabExtras))[0..5]);
1.22 albertel 624: last;
625: }
626: }
1.23 albertel 627: close(IN);
1.22 albertel 628: }
1.23 albertel 629: if (!$domainDescription) {
1.27 albertel 630: open(IN,'</home/httpd/lonTabs/domain.tab');
1.23 albertel 631: while(<IN>) {
1.27 albertel 632: if (/^$perlvar{'lonDefDomain'}\:/) {
1.29 albertel 633: (undef,$domainDescription,$domainTabExtras)=split(/:/,$_,3);
1.23 albertel 634: chomp($domainDescription);
1.29 albertel 635: chomp($domainTabExtras);
1.46 albertel 636: # the remianing field (primary lib server) is handled later
1.48 raeburn 637: $domainTabExtras = join(':',(split(/:/,$domainTabExtras))[0..5]);
1.23 albertel 638: last;
639: }
640: }
641: close(IN);
642: }
1.43 raeburn 643: if (!$primaryLibServer and $lonCluster ne 'existing') {
644: open(IN,'<../'.$lonCluster.'_domain.tab');
645: while(<IN>) {
646: if (/^$perlvar{'lonDefDomain'}\:/) {
647: (undef,undef,undef,undef,undef,undef,undef,undef,
648: $primaryLibServer)=split(/:/,$_);
649: chomp($primaryLibServer);
650: }
651: }
652: close(IN);
653: if (!$primaryLibServer) {
654: open(IN,'<../'.$lonCluster.'_hosts.tab');
655: while(<IN>) {
656: if (/^([^\:]+)\:\Q$perlvar{'lonDefDomain'}\E\:library\:/) {
657: push(@libservers,$1);
658: }
659: }
660: close(IN);
661: if (@libservers == 1) {
662: $primaryLibServer = $libservers[0];
663: }
664: }
665: }
666: if (!$primaryLibServer) {
667: open(IN,'</home/httpd/lonTabs/domain.tab');
668: while(<IN>) {
669: if (/^$perlvar{'lonDefDomain'}\:/) {
670: (undef,undef,undef,undef,undef,undef,undef,undef,
671: $primaryLibServer)=split(/:/,$_);
672: chomp($primaryLibServer);
673: }
674: close(IN);
675: }
676: if (!$primaryLibServer) {
677: open(IN,'</home/httpd/lonTabs/hosts.tab');
678: while(<IN>) {
679: if (/^([^\:]+)\:\Q$perlvar{'lonDefDomain'}\E\:library\:/) {
680: push(@libservers,$1);
681: }
682: }
683: close(IN);
684: if (@libservers == 1) {
685: $primaryLibServer = $libservers[0];
686: }
687: }
688: }
1.23 albertel 689:
1.6 harris41 690: # implement editing logic below, interactively
1.46 albertel 691: # update loncapa.conf until 12 is entered
1.6 harris41 692:
693: $flag=0;
1.17 harris41 694:
1.6 harris41 695: while (!$flag) {
1.1 harris41 696: print(<<END);
697:
698: ===============================================================================
699: This is now the current configuration of your machine.
1.31 albertel 700: 1) Domain Name: $perlvar{'lonDefDomain'}
701: 2) Domain Description: $domainDescription
702: 3) Machine Name: $perlvar{'lonHostID'}
1.43 raeburn 703: 4) ID of primary library server for domain: $primaryLibServer
1.47 albertel 704: 5) Server Administrator's E-mail Address: $perlvar{'lonAdmEMail'}
1.43 raeburn 705: 6) Support E-mail Address: $perlvar{'lonSupportEMail'}
706: 7) Role: $perlvar{'lonRole'}
707: 8) Cache Expiration Time: $perlvar{'lonExpire'}
708: 9) Server Load: $perlvar{'lonLoadLim'}
709: 10) User Load: $perlvar{'lonUserLoadLim'}
710: 11) Allow only secure connections: $securestatus
711: 12) Everything is correct up above
1.6 harris41 712: END
1.38 www 713:
714: my $error='';
715: foreach my $v ($perlvar{'lonDefDomain'},$perlvar{'lonHostID'}) {
1.51 ! albertel 716: if (length($v)>35) { $error.="\nName $v too long"; }
1.38 www 717: if (length($v)<2) { $error.="\nName $v too short"; }
1.39 albertel 718: if ($v=~/capa/i) {
719: if ($v!~/^oucapa\d+$/ &&
720: ($v!~/^capa\d+$/ && $perlvar{'lonDefDomain'} eq 'uwsp')) {
721: $error.="\nName $v contains 'capa'";
722: }
723: }
1.41 albertel 724: foreach my $bad ('res','raw','userfiles','priv','adm','uploaded',
725: 'editupload') {
1.38 www 726: $error.="\nName $v reserved." if $v eq $bad;
727: }
1.51 ! albertel 728: if ($v=~/[^\w\-.]/) { $error.="\nName $v contains special characters"; }
1.38 www 729: }
1.42 albertel 730: if ($domainDescription!~/^[\(\)\-\w\s,]+$/) {
1.38 www 731: $error.="\nDomain Description contains special characters";
732: }
733: foreach my $v ($perlvar{'lonExpire'},$perlvar{'lonLoadLim'}) {
734: unless ($v=~/^[\d+\.]+$/) { $error.="\nNumber expected instead of $v"; }
735: }
736: unless (($perlvar{'lonRole'} eq 'library') || ($perlvar{'lonRole'} eq 'access')) {
737: $error.="\nInvalid Role";
1.17 harris41 738: }
1.43 raeburn 739:
740: if (!defined($primaryLibServer)) {
741: if (@libservers > 0) {
742: $error .= "No primary library server ID designated. Choose from: ".join(',',sort(@libservers));
743: } else {
744: $error .= "No library servers in this domain (including current server)";
745: }
746: } else {
1.51 ! albertel 747: if (length($primaryLibServer)>35) { $error.="\nPrimary Library Server ID: $primaryLibServer too long"; }
1.43 raeburn 748: if (length($primaryLibServer)<2) { $error.="\nPrimary Library Server ID: $primaryLibServer too short"; }
749: if ($primaryLibServer =~/capa/i) {
750: if ($primaryLibServer!~/^oucapa\d+$/ &&
751: ($primaryLibServer!~/^capa\d+$/ && $perlvar{'lonDefDomain'} eq 'uwsp')) {
752: $error.="\nPrimary library server ID $primaryLibServer contains 'capa'";
753: }
754: }
755: foreach my $bad ('res','raw','userfiles','priv','adm','uploaded',
756: 'editupload') {
757: $error.="\nPrimary library server ID $primaryLibServer reserved." if $primaryLibServer eq $bad;
758: }
1.51 ! albertel 759: if ($primaryLibServer=~/[^\w\-.]/) { $error.="\nPrimary library server ID $primaryLibServer contains special characters"; }
1.43 raeburn 760: }
761:
762:
1.38 www 763: if ($error) { print "\n*** ERRORS: $error\n"; }
1.6 harris41 764: print(<<END);
1.43 raeburn 765: ENTER A CHOICE OF 1-11 TO CHANGE, otherwise ENTER 12:
1.1 harris41 766: END
1.5 harris41 767: my $choice=<>;
768: chomp($choice);
1.6 harris41 769: if ($choice==1) {
770: print(<<END);
1.16 harris41 771: 1) Domain Name: $perlvar{'lonDefDomain'}
1.20 albertel 772: ENTER NEW VALUE (this is an internal value used to identify a group of
773: LON-CAPA machines, it must be alphanumerical, we suggest
774: using a part of your actual DNS domain. For example, for
775: the machine loncapa.msu.edu, we set the Domain to msu):
1.6 harris41 776: END
777: my $choice2=<>;
778: chomp($choice2);
1.8 harris41 779: $perlvar{'lonDefDomain'}=$choice2;
1.6 harris41 780: }
781: elsif ($choice==2) {
782: print(<<END);
1.20 albertel 783: 2) Domain Description: $domainDescription
784: ENTER NEW VALUE (this should be a string that describes your domain, spaces
785: and punctuation are fine except for ':'):
786: END
787: my $choice2=<>;
788: chomp($choice2);
789: $domainDescription=$choice2;
790: }
791: elsif ($choice==3) {
792: print(<<END);
793: 3) Machine Name: $perlvar{'lonHostID'}
794: ENTER NEW VALUE (this will be the name of the machine in the LON-CAPA network
795: it cannot contain any of '_' '-' '.' or ':'. We suggest that
796: if you are in the domain 'example' and are the first library
797: server you enter 'examplel1') :
1.6 harris41 798: END
799: my $choice2=<>;
800: chomp($choice2);
1.8 harris41 801: $perlvar{'lonHostID'}=$choice2;
1.6 harris41 802: }
1.20 albertel 803: elsif ($choice==4) {
1.6 harris41 804: print(<<END);
1.43 raeburn 805: 4) ID of primary library server for domain: $primaryLibServer
806: ENTER NEW VALUE (this will be the LON-CAPA Machine ID of a library server in
807: your domain; it cannot contain any of '_' '-' '.' or ':'.
808: This server will be where domain data which are not
809: associated with any specific home library server
810: will be stored (e.g., e-mail broadcast by Domain Coordinators
811: to users in the domain).
812: END
813: my $choice2=<>;
814: chomp($choice2);
815: $primaryLibServer=$choice2;
816: }
817: elsif ($choice==5) {
818: print(<<END);
1.47 albertel 819: 5) Server Administrator's E-mail Address: $perlvar{'lonAdmEMail'}
1.6 harris41 820: ENTER NEW VALUE:
821: END
822: my $choice2=<>;
823: chomp($choice2);
1.9 harris41 824: $perlvar{'lonAdmEMail'}=$choice2;
1.6 harris41 825: }
1.43 raeburn 826: elsif ($choice==6) {
1.6 harris41 827: print(<<END);
1.43 raeburn 828: 6) Support E-mail Address: $perlvar{'lonSupportEMail'}
1.32 raeburn 829: ENTER NEW VALUE:
830: END
831: my $choice2=<>;
832: chomp($choice2);
833: $perlvar{'lonSupportEMail'}=$choice2;
834: }
1.43 raeburn 835: elsif ($choice==7) {
1.32 raeburn 836: print(<<END);
1.43 raeburn 837: 7) Role: $perlvar{'lonRole'}
1.20 albertel 838: ENTER NEW VALUE (this should be either 'access' or 'library'
839: if in doubt select 'library'):
1.6 harris41 840: END
841: my $choice2=<>;
842: chomp($choice2);
843: $perlvar{'lonRole'}=$choice2;
844: }
1.43 raeburn 845: elsif ($choice==8) {
1.6 harris41 846: print(<<END);
1.43 raeburn 847: 8) Cache Expiration Time: $perlvar{'lonExpire'}
1.20 albertel 848: ENTER NEW VALUE (in seconds, 86400 is a reasonable value):
1.6 harris41 849: END
850: my $choice2=<>;
851: chomp($choice2);
852: $perlvar{'lonExpire'}=$choice2;
853: }
1.43 raeburn 854: elsif ($choice==9) {
1.6 harris41 855: print(<<END);
1.43 raeburn 856: 9) Server Load: $perlvar{'lonLoadLim'}
1.6 harris41 857: ENTER NEW VALUE:
858: END
859: my $choice2=<>;
860: chomp($choice2);
861: $perlvar{'lonLoadLim'}=$choice2;
862: }
1.43 raeburn 863: elsif ($choice==10) {
1.25 albertel 864: print(<<END);
1.43 raeburn 865: 10) User Load: $perlvar{'lonUserLoadLim'}
1.25 albertel 866: Numer of users that can login before machine is 'overloaded'
1.26 albertel 867: ENTER NEW VALUE (integer value, 0 means there is no limit):
1.25 albertel 868: END
869: my $choice2=<>;
870: chomp($choice2);
871: $perlvar{'lonUserLoadLim'}=$choice2;
872: }
1.43 raeburn 873: elsif ($choice==11) {
1.31 albertel 874: print(<<END);
1.43 raeburn 875: 11) Allow only secure connections: $securestatus
1.31 albertel 876: The Lon-CAPA communication daemons lonc and lond can be configured to
877: allow only secure connections by default.
878:
879: POSSIBLE CHOICES:
880: 1) allow only secure connections and don't connect to machines that
881: can not be connected to securely
882: 2) allow only secure connections but allow this machine to connect to
883: machines that don't support secure connections
884: 3) allow insecure connections to this machine but only allow connections
885: to machines that support secure connections
886: 4) allow insecure connections
887: ENTER NEW VALUE (currenly $securenum):
888: END
889: my $choice2=<>;
890: chomp($choice2);
891: if ($choice2 eq '1') {
892: $perlvar{'loncAllowInsecure'}=0;$perlvar{'londAllowInsecure'}=0;
893: } elsif ($choice2 eq '2') {
894: $perlvar{'loncAllowInsecure'}=0;$perlvar{'londAllowInsecure'}=1;
895: } elsif ($choice2 eq '3') {
896: $perlvar{'loncAllowInsecure'}=1;$perlvar{'londAllowInsecure'}=0;
897: } elsif ($choice2 eq '4') {
898: $perlvar{'loncAllowInsecure'}=1;$perlvar{'londAllowInsecure'}=1;
899: }
900: ($securestatus,$securenum)=&securesetting(%perlvar);
901: }
1.43 raeburn 902: elsif (($choice==12) && (!$error)) {
1.6 harris41 903: $flag=1;
904: }
905: else {
1.38 www 906: print "Invalid input.\n";
1.6 harris41 907: }
908: }
1.7 harris41 909: open(OUT,">$confdir$filename") or
910: die("Cannot output to $confdir$filename\n");
911: foreach my $key (keys %perlvar) {
912: my $value=$perlvar{$key};
1.49 raeburn 913: my $line = "PerlSetVar $key $value";
914: if ($value eq '') {
915: $line = '#'.$line;
916: }
1.8 harris41 917: print(OUT <<END) unless $perlvarstatic{$key};
1.49 raeburn 918: $line
1.7 harris41 919: END
920: }
921: close(OUT);
1.1 harris41 922: </perlscript>
923: </file>
924: <file>
925: <target dist='default'>loncom/hosts.tab</target>
926: <perlscript mode='fg'>
927: unless (-l "<TARGET />") {
1.36 albertel 928: my $hostname=`hostname -f`;chomp($hostname);
1.15 harris41 929: $date=`date -I`; chomp($date);
930: $lonHostID=$perlvar{'lonHostID'};
1.51 ! albertel 931: $lonHostID=~s/[^\w\-.]//g;
1.15 harris41 932: $lineexistflag=0;
933: $hostidexistflag=0;
1.22 albertel 934: $line2insert=<<END;
1.35 albertel 935: $perlvar{'lonHostID'}:$perlvar{'lonDefDomain'}:$perlvar{'lonRole'}:$hostname
1.15 harris41 936: END
1.43 raeburn 937: $domaininsert="$perlvar{'lonDefDomain'}:$domainDescription:$domainTabExtras:$primaryLibServer\n";
1.23 albertel 938: if ($lonCluster eq 'standalone') {
939: open(OUT,'>../'.$lonCluster.'_hosts.tab') or
940: die('file generation error');
941: print(OUT $line2insert);
942: close(OUT);
1.27 albertel 943: open(OUT,'>../'.$lonCluster.'_domain.tab') or
944: die('file generation error');
945: print(OUT $domaininsert);
946: close(OUT);
1.23 albertel 947: }
1.15 harris41 948: if ($flag==1) {
1.6 harris41 949: `rm -f ../hosts.tab`;
1.15 harris41 950: open(IN,'<../'.$lonCluster.'_hosts.tab');
1.13 harris41 951: while(<IN>) {
952: if (/^$line2insert$/) {
953: $lineexistflag=1;
954: }
1.15 harris41 955: if (/^$lonHostID\:/) {
1.13 harris41 956: $hostidexistflag=1;
957: }
958: }
959: close(IN);
960: if ($hostidexistflag and !$lineexistflag) {
961: print <<END;
962: WARNING: $lonHostID already exists inside
1.15 harris41 963: loncapa/loncom/${lonCluster}_hosts.tab. The entry inside
964: ${lonCluster}_hosts.tab does not match your settings.
965: The entry inside ${lonCluster}_hosts.tab is being replaced
1.13 harris41 966: with your new values.
967: END
1.15 harris41 968: `grep -v "$lonHostID:" ../${lonCluster}_hosts.tab > ../new_${lonCluster}_hosts.tab`;
969: open(OUT,'>>../new_'.$lonCluster.'_hosts.tab') or
970: die("cannot open loncom/${lonCluster}_hosts.tab for output\n");
1.14 harris41 971: print(OUT $line2insert);
1.13 harris41 972: close(OUT);
1.15 harris41 973: `ln -s new_${lonCluster}_hosts.tab ../hosts.tab`;
1.13 harris41 974: # email appropriate message
1.34 albertel 975: `echo "REPLACE:$lonCluster:$lonHostID:$date:$line2insert" | mail -s "REPLACE:$lonCluster:$lonHostID:$date" installrecord\@mail.lon-capa.org`;
1.13 harris41 976: }
977: elsif ($hostidexistflag and $lineexistflag) {
1.15 harris41 978: print <<END;
979: Entry exists in ${lonCluster}_hosts.tab.
980: END
981: `ln -s ${lonCluster}_hosts.tab ../hosts.tab`;
982: # email appropriate message
983: `echo "STABLEUPDATE:$lonCluster:$lonHostID:$date:$line2insert" | mail -s "STABLEUPDATE:$lonCluster:$lonHostID:$date" installrecord\@mail.lon-capa.org`;
1.13 harris41 984: }
1.15 harris41 985: elsif (!$hostidexistflag and !$lineexistflag) {
986: print <<END;
987: New entry for $lonCluster.
1.6 harris41 988: END
1.15 harris41 989: `cat ../${lonCluster}_hosts.tab > ../new_${lonCluster}_hosts.tab`;
1.21 albertel 990: open(OUT,'>>../new_'.$lonCluster.'_hosts.tab') or
991: die("cannot open loncom/new_${lonCluster}_hosts.tab for output\n");
1.15 harris41 992: print(OUT $line2insert);
993: close(OUT);
994: `ln -s new_${lonCluster}_hosts.tab ../hosts.tab`;
995: # email appropriate message
996: `echo "INSERT:$lonCluster:$lonHostID:$date:$line2insert" | mail -s "INSERT:$lonCluster:$lonHostID:$date" installrecord\@mail.lon-capa.org`;
1.27 albertel 997: }
998: }
999: $lineexistflag=0;
1000: if ($flag==1) {
1001: `rm -f ../domain.tab`;
1002: open(IN,'<../'.$lonCluster.'_domain.tab');
1003: while(<IN>) {
1004: if (/^$domaininsert$/) {
1005: $lineexistflag=1;
1006: }
1007: if (/^$perlvar{'lonDefDomain'}\:/) {
1008: $domainexistflag=1;
1009: }
1010: }
1011: close(IN);
1012: if ($domainexistflag and !$lineexistflag) {
1013: print <<END;
1014: WARNING: $perlvar{'lonDefDomain'} already exists inside
1015: loncapa/loncom/${lonCluster}_domain.tab. The entry inside
1016: ${lonCluster}_domain.tab does not match your settings.
1017: The entry inside ${lonCluster}_domain.tab is being replaced
1018: with your new values.
1019: END
1020: `grep -v "$perlvar{'lonDefDomain'}:" ../${lonCluster}_domain.tab > ../new_${lonCluster}_domain.tab`;
1021: open(OUT,'>>../new_'.$lonCluster.'_domain.tab') or
1022: die("cannot open loncom/${lonCluster}_domain.tab for output\n");
1023: print(OUT $domaininsert);
1024: close(OUT);
1025: `ln -s new_${lonCluster}_domain.tab ../domain.tab`;
1026: # email appropriate message
1.34 albertel 1027: `echo "REPLACEdom:$lonCluster:$lonHostID:$date:$domaninsert" | mail -s "REPLACEdom:$lonCluster:$lonHostID:$date" installrecord\@mail.lon-capa.org`;
1.27 albertel 1028: }
1029: elsif ($domainexistflag and $lineexistflag) {
1030: print <<END;
1031: Entry exists in ${lonCluster}_domain.tab.
1032: END
1033: `ln -s ${lonCluster}_domain.tab ../domain.tab`;
1034: # email appropriate message
1035: `echo "STABLEUPDATEdom:$lonCluster:$lonHostID:$date:$domaininsert" | mail -s "STABLEUPDATEdom:$lonCluster:$lonHostID:$date" installrecord\@mail.lon-capa.org`;
1036: }
1037: elsif (!$domainexistflag and !$lineexistflag) {
1038: print <<END;
1039: New entry for $lonCluster.
1040: END
1041: `cat ../${lonCluster}_domain.tab > ../new_${lonCluster}_domain.tab`;
1042: open(OUT,'>>../new_'.$lonCluster.'_domain.tab') or
1043: die("cannot open loncom/new_${lonCluster}_domain.tab for output\n");
1044: print(OUT $domaininsert);
1045: close(OUT);
1046: `ln -s new_${lonCluster}_domain.tab ../domain.tab`;
1047: # email appropriate message
1048: `echo "INSERTdom:$lonCluster:$lonHostID:$date:$domaininsert" | mail -s "INSERTdom:$lonCluster:$lonHostID:$date" installrecord\@mail.lon-capa.org`;
1.6 harris41 1049: }
1050: }
1.1 harris41 1051: }
1052: </perlscript>
1053: </file>
1054: </files>
1055: </piml>
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>