/ / $|=1; print(<<END); ********************************************* ********************************************* **** **** **** LON-CAPA SYSTEM INFORMATION REQUEST **** **** **** **** Please respond to the choices below **** **** **** ********************************************* ********************************************* END sleep(3); loncom/hosts.tab unless (-l "") { print(<<END); =============================================================================== What hosts.tab would you like to have installed? (hosts.tab is a listing of all other internet machines that a server system considers to be valid server systems on the LON-CAPA network) 1) PRODUCTION - you want to deliver courses today or sometime very soon on this machine 2) STAND-ALONE - you want this machine to run in 'stand-alone' mode and not be connected to other LON-CAPA machines for now 3) DEVELOPMENT - you want to play with or explore LON-CAPA 4) PRESERVE the existing hosts.tab (/home/httpd/lonTabs/hosts.tab) END # Option number 26 will install rawhide_hosts.tab, but # the typical user does not want to be part of an intensive # machine test cluster. # get input # if valid then process, otherwise loop $flag=0; while (!$flag) { print "ENTER 1, 2, 3, or 4:\n"; my $choice=<>; chomp($choice); if ($choice==1) { $lonCluster='production'; $flag=1; } elsif ($choice==2) { $lonCluster='standalone'; $flag=1; } elsif ($choice==3) { $lonCluster='development'; $flag=1; } elsif ($choice==4) { $lonCluster='existing'; $flag=1; if (-e '/home/httpd/lonTabs/hosts.tab') { `cp /home/httpd/lonTabs/hosts.tab ../existing_hosts.tab`; } else { print <<END; There is no existing /home/httpd/lonTabs/hosts.tab END die(''); } } elsif ($choice==26) { $lonCluster='rawhide'; $flag=1; } } } /home/httpd/lonTabs/hosts.tab $|=1; my $domainDescription; unless (-e "") { print(<<END); WELCOME TO LON-CAPA! If you have questions, please visit http://install.lon-capa.org or contact sharrison\@mail.lon-capa.org. =============================================================================== The following 4 values are needed to configure LON-CAPA: * Machine Role * LON-CAPA Domain Name * LON-CAPA Machine ID Name, and * System Administration E-mail Address. END open(OUT,'>/tmp/loncapa_updatequery.out'); close(OUT); # query for Machine Role print(<<END); **** Machine Role **** Library server (recommended if first-time installation of LON-CAPA): Servers that are repositories of authoritative educational resources. These servers also provide the construction space by which instructors assemble their classroom online material. Access server: Servers that load-balance high-traffic delivery of educational resources over the world-wide web. 1) Will this be a library server? (recommended if this is your first install) 2) Or, will this be an access server? END my $flag=0; my $r=''; my $lonRole; while (!$flag) { print "ENTER A CHOICE OF 1 or 2:\n"; my $choice=<>; chomp($choice); if ($choice==1) { open(OUT,'>>/tmp/loncapa_updatequery.out'); print(OUT 'lonRole'."\t".'library'."\n"); close(OUT); $lonRole='library'; $r='l'; $flag=1; } elsif ($choice==2) { open(OUT,'>>/tmp/loncapa_updatequery.out'); print(OUT 'lonRole'."\t".'access'."\n"); close(OUT); $lonRole='access'; $r='a'; $flag=2; } else { } } # need to recommend a machine ID name (ipdomain.l.somenumber) my $hostname=`hostname`; chomp($hostname); my $ipdomain=''; if ($hostname=~/([^\.]*)\.([^\.]*)$/) { $ipdomain=$1; } print(<<END); **** Domain **** [this does NOT need to correspond to internet address domains, examples might be "msu" or "bionet" or "vermontcc"] END # get domain name # accept if valid, if not valid, tell user and repeat $flag=0; my $lonDefDomain; while (!$flag) { if ($ipdomain) { print(<<END); ENTER LONCAPA DOMAIN [$ipdomain]: END } else { print(<<END); ENTER LONCAPA DOMAIN: END } my $choice=<>; chomp($choice); my $bad_domain_flag=0; my @bad_domain_names=('raw','userfiles','priv','adm','uploaded'); foreach my $bad (@bad_domain_names) { $bad_domain_flag=1 if $choice eq $bad; } if ($ipdomain and $choice=~/^\s*$/) { $choice=$ipdomain; open(OUT,'>>/tmp/loncapa_updatequery.out'); print(OUT 'lonDefDomain'."\t".$choice."\n"); close(OUT); $lonDefDomain=$choice; $flag=1; } elsif ($choice!~/\_/ and $choice=~/^\w+$/) { open(OUT,'>>/tmp/loncapa_updatequery.out'); print(OUT 'lonDefDomain'."\t".$choice."\n"); close(OUT); $lonDefDomain=$choice; $r='l'; $flag=1; } elsif ($bad_domain_flag) { print "Invalid input ('$choice' conflicts with LON-CAPA namespace).\n"; print "Please try something different than '$choice'\n"; } else { print "Invalid input (only alphanumeric characters supported).\n"; } } # get domain description # accept if valid, if not valid, tell user and repeat $flag=0; while (!$flag) { print(<<END); **** Domain Description **** String describing the domain, to be shown to users. [Example, msu is Michigan State University] ENTER DOMAIN DESCRIPTION: END my $choice=<>; chomp($choice); if ($choice!~/:/) { open(OUT,'>>/tmp/loncapa_updatequery.out'); print(OUT 'domainDescription'."\t".$choice."\n"); close(OUT); $domainDescription=$choice; $flag=1; } else { print "Invalid input (no ':' allowed).\n"; } } my $lonHostID; if ($lonDefDomain) { $lonHostID=$lonDefDomain.$r.int(1+rand(9)); # should be probably also detect # against the hosts.tab } print(<<END); **** Machine ID Name **** [this does NOT need to correspond to internet address names; this name MUST be unique to the whole LON-CAPA network; we recommend that you use a name based off of your institution; good examples: "msul1" or "bionetl1"; bad examples: "loncapabox" or "studentsinside"] END # get machine name # accept if valid, if not valid, tell user and repeat $flag=0; while (!$flag) { if ($ipdomain) { print(<<END); ENTER LONCAPA MACHINE ID [$lonHostID]: END } else { print(<<END); ENTER LONCAPA MACHINE ID: END } my $choice=<>; chomp($choice); if ($lonHostID and $choice=~/^\s*$/) { $choice=$lonHostID; open(OUT,'>>/tmp/loncapa_updatequery.out'); print(OUT 'lonHostID'."\t".$choice."\n"); close(OUT); $lonHostID=$choice; $flag=1; } elsif ($choice!~/\_/ and $choice=~/^\w+$/) { open(OUT,'>>/tmp/loncapa_updatequery.out'); print(OUT 'lonHostID'."\t".$choice."\n"); close(OUT); $lonHostID=$choice; $flag=1; } else { print "Invalid input (only alphanumeric characters supported).\n"; } } # get e-mail address # accept if valid, if not valid, tell user and repeat $flag=0; my $lonAdmEMail; while (!$flag) { print(<<END); **** System Administrator's E-mail **** E-mail address of the person who will manage this machine [should be in the form somebody\@somewhere] ENTER E-MAIL ADDRESS: END my $choice=<>; chomp($choice); if ($choice=~/\@/) { open(OUT,'>>/tmp/loncapa_updatequery.out'); print(OUT 'lonAdmEMail'."\t".$choice."\n"); close(OUT); $lonAdmEMail=$choice; $flag=1; } else { print "Invalid input (this needs to look like an e-mail address!).\n"; } } # update loncapa.conf my $confdir='/etc/httpd/conf/'; #my $confdir=''; my $filename='loncapa.conf'; my %perlvar; if (-e "$confdir$filename") { open(CONFIG,'<'.$confdir.$filename) or die("Can't read $confdir$filename"); while (my $configline=<CONFIG>) { if ($configline =~ /^[^\#]*PerlSetVar/) { my ($unused,$varname,$varvalue)=split(/\s+/,$configline); chomp($varvalue); $perlvar{$varname}=$varvalue if $varvalue!~/^\{\[\[\[\[/; } } close(CONFIG); } $perlvar{'lonHostID'}=$lonHostID; $perlvar{'lonDefDomain'}=$lonDefDomain; $perlvar{'lonAdmEMail'}=$lonAdmEMail; $perlvar{'lonRole'}=$lonRole; unless ($perlvar{'lonLoadLim'} and $perlvar{'lonLoadLim'}!~/\{\[\[\[\[/) { $perlvar{'lonLoadLim'}='2.00'; } unless ($perlvar{'lonUserLoadLim'} and $perlvar{'lonUserLoadLim'}!~/\{\[\[\[\[/) { $perlvar{'lonUserLoadLim'}='0'; } unless ($perlvar{'lonExpire'} and $perlvar{'lonExpire'}!~/\{\[\[\[\[/) { $perlvar{'lonExpire'}='86400'; } unless ($perlvar{'lonReceipt'} and $perlvar{'lonReceipt'}!~/\{\[\[\[\[/) { my $lonReceipt=''; srand(time ^ $$ ^ unpack "%L*", `ps axww | gzip`); my @alnum=(0..9,a..z); foreach my $i (1..20) { $lonReceipt.=$alnum[int(rand(36))]; } $perlvar{'lonReceipt'}=$lonReceipt; } open(OUT,">$confdir$filename") or die("Cannot output to $confdir$filename\n"); foreach my $key (keys %perlvar) { my $value=$perlvar{$key}; print(OUT <<END); PerlSetVar $key $value END } close(OUT); } / # read values from loncapa.conf my $confdir='/etc/httpd/conf/'; my $filename='loncapa.conf'; my %perlvar; if (-e "$confdir$filename") { open(CONFIG,'<'.$confdir.$filename) or die("Can't read $confdir$filename"); while (my $configline=<CONFIG>) { if ($configline =~ /^[^\#]*PerlSetVar/) { my ($unused,$varname,$varvalue)=split(/\s+/,$configline); chomp($varvalue); $perlvar{$varname}=$varvalue; } } close(CONFIG); } unless ($perlvar{'lonLoadLim'} and $perlvar{'lonLoadLim'}!~/\{\[\[\[\[/) { $perlvar{'lonLoadLim'}='2.00'; } unless ($perlvar{'lonUserLoadLim'} and $perlvar{'lonUserLoadLim'}!~/\{\[\[\[\[/) { $perlvar{'lonUserLoadLim'}='0'; } unless ($perlvar{'lonExpire'} and $perlvar{'lonExpire'}!~/\{\[\[\[\[/) { $perlvar{'lonExpire'}='86400'; } unless ($perlvar{'lonReceipt'} and $perlvar{'lonReceipt'}!~/\{\[\[\[\[/) { my $lonReceipt=''; srand(time ^ $$ ^ unpack "%L*", `ps axww | gzip`); my @alnum=(0..9,a..z); foreach my $i (1..20) { $lonReceipt.=$alnum[int(rand(36))]; } $perlvar{'lonReceipt'}=$lonReceipt; } my %perlvarstatic; if (-e "${confdir}loncapa_apache.conf") { open(CONFIG,'<'.$confdir.'loncapa_apache.conf') or die("Can't read ${confdir}loncapa_apache.conf"); while (my $configline=<CONFIG>) { if ($configline =~ /^[^\#]*PerlSetVar/) { my ($unused,$varname,$varvalue)=split(/\s+/,$configline); chomp($varvalue); $perlvarstatic{$varname}=$varvalue; } } close(CONFIG); } if (!$domainDescription && $lonCluster ne 'existing') { open(IN,'<../'.$lonCluster.'_hosts.tab'); while(<IN>) { if (/^$perlvar{'lonHostID'}\:/) { (undef,undef,undef,undef,undef,$domainDescription)=split(/:/,$_); chomp($domainDescription); last; } } close(IN); } if (!$domainDescription) { open(IN,'</home/httpd/lonTabs/hosts.tab'); while(<IN>) { if (/^$perlvar{'lonHostID'}\:/) { (undef,undef,undef,undef,undef,$domainDescription)=split(/:/,$_); chomp($domainDescription); last; } } close(IN); } # implement editing logic below, interactively # update loncapa.conf until 8 is entered $flag=0; while (!$flag) { print(<<END); =============================================================================== This is now the current configuration of your machine. 1) Domain Name: $perlvar{'lonDefDomain'} 2) Domain Description: $domainDescription 3) Machine Name: $perlvar{'lonHostID'} 4) System Administrator's E-mail Address: $perlvar{'lonAdmEMail'} 5) Role: $perlvar{'lonRole'} 6) Cache Expiration Time: $perlvar{'lonExpire'} 7) Server Load: $perlvar{'lonLoadLim'} 8) User Load: $perlvar{'lonUserLoadLim'} 9) Everything is correct up above END my $hbug=-1; my $dbug=-1; { my $v=$perlvar{'lonHostID'}; $hbug=0; $hbug=1 if $v=~/\W/; $hbug=1 if $v=~/\_/; } { my $v=$1; $dbug=0; $dbug=1 if $v=~/\W/; $dbug=1 if $v=~/\_/; } if ($hbug) { print "**** ERROR **** ". "Invalid lonHostID (should only be letters and/or digits)\n"; } if ($dbug) { print "**** ERROR **** ". "Invalid lonDefDomain (should only be letters and/or digits)\n"; } print(<<END); ENTER A CHOICE OF 1-8 TO CHANGE, otherwise ENTER 9: END my $choice=<>; chomp($choice); if ($choice==1) { print(<<END); 1) Domain Name: $perlvar{'lonDefDomain'} ENTER NEW VALUE (this is an internal value used to identify a group of LON-CAPA machines, it must be alphanumerical, we suggest using a part of your actual DNS domain. For example, for the machine loncapa.msu.edu, we set the Domain to msu): END my $choice2=<>; chomp($choice2); $perlvar{'lonDefDomain'}=$choice2; } elsif ($choice==2) { print(<<END); 2) Domain Description: $domainDescription ENTER NEW VALUE (this should be a string that describes your domain, spaces and punctuation are fine except for ':'): END my $choice2=<>; chomp($choice2); $domainDescription=$choice2; } elsif ($choice==3) { print(<<END); 3) Machine Name: $perlvar{'lonHostID'} ENTER NEW VALUE (this will be the name of the machine in the LON-CAPA network it cannot contain any of '_' '-' '.' or ':'. We suggest that if you are in the domain 'example' and are the first library server you enter 'examplel1') : END my $choice2=<>; chomp($choice2); $perlvar{'lonHostID'}=$choice2; } elsif ($choice==4) { print(<<END); 4) System Administrator's E-mail Address: $perlvar{'lonAdmEMail'} ENTER NEW VALUE: END my $choice2=<>; chomp($choice2); $perlvar{'lonAdmEMail'}=$choice2; } elsif ($choice==5) { print(<<END); 5) Role: $perlvar{'lonRole'} ENTER NEW VALUE (this should be either 'access' or 'library' if in doubt select 'library'): END my $choice2=<>; chomp($choice2); $perlvar{'lonRole'}=$choice2; } elsif ($choice==6) { print(<<END); 6) Cache Expiration Time: $perlvar{'lonExpire'} ENTER NEW VALUE (in seconds, 86400 is a reasonable value): END my $choice2=<>; chomp($choice2); $perlvar{'lonExpire'}=$choice2; } elsif ($choice==7) { print(<<END); 7) Server Load: $perlvar{'lonLoadLim'} ENTER NEW VALUE: END my $choice2=<>; chomp($choice2); $perlvar{'lonLoadLim'}=$choice2; } elsif ($choice==8) { print(<<END); 8) User Load: $perlvar{'lonUserLoadLim'} Numer of users that can login before machine is 'overloaded' ENTER NEW VALUE (integer value, 0 means there is no limit): END my $choice2=<>; chomp($choice2); $perlvar{'lonUserLoadLim'}=$choice2; } elsif ($choice==9) { $flag=1; } else { } } open(OUT,">$confdir$filename") or die("Cannot output to $confdir$filename\n"); foreach my $key (keys %perlvar) { my $value=$perlvar{$key}; print(OUT <<END) unless $perlvarstatic{$key}; PerlSetVar $key $value END } close(OUT); loncom/hosts.tab unless (-l "") { my $hostname=`hostname`;chomp($hostname); my $hostaddress=`hostname -i $hostname`;chomp($hostaddress); $hostaddress=~s/\s//; $date=`date -I`; chomp($date); $lonHostID=$perlvar{'lonHostID'}; $lonHostID=~s/\W//g; $lineexistflag=0; $hostidexistflag=0; $line2insert=<<END; $perlvar{'lonHostID'}:$perlvar{'lonDefDomain'}:$perlvar{'lonRole'}:$hostname:$hostaddress:$domainDescription END if ($lonCluster eq 'standalone') { open(OUT,'>../'.$lonCluster.'_hosts.tab') or die('file generation error'); print(OUT $line2insert); close(OUT); } if ($flag==1) { `rm -f ../hosts.tab`; open(IN,'<../'.$lonCluster.'_hosts.tab'); while(<IN>) { if (/^$line2insert$/) { $lineexistflag=1; } if (/^$lonHostID\:/) { $hostidexistflag=1; } } close(IN); if ($hostidexistflag and !$lineexistflag) { print <<END; WARNING: $lonHostID already exists inside loncapa/loncom/${lonCluster}_hosts.tab. The entry inside ${lonCluster}_hosts.tab does not match your settings. The entry inside ${lonCluster}_hosts.tab is being replaced with your new values. END `grep -v "$lonHostID:" ../${lonCluster}_hosts.tab > ../new_${lonCluster}_hosts.tab`; open(OUT,'>>../new_'.$lonCluster.'_hosts.tab') or die("cannot open loncom/${lonCluster}_hosts.tab for output\n"); print(OUT $line2insert); close(OUT); `ln -s new_${lonCluster}_hosts.tab ../hosts.tab`; # email appropriate message system('ping -c 1 www.lon-capa.org > /dev/null || ping -c 1 www.msu.edu > /dev/null || ping -c 1 www.mit.edu > /dev/null'); `echo "REPLACE:$lonCluster:$lonHostID:$date:$line2insert" | mail -s "REPLACE:$lonCluster:$lonHostID:$date" installrecord\@mail.lon-capa.org` unless $?; } elsif ($hostidexistflag and $lineexistflag) { print <<END; Entry exists in ${lonCluster}_hosts.tab. END `ln -s ${lonCluster}_hosts.tab ../hosts.tab`; # email appropriate message `echo "STABLEUPDATE:$lonCluster:$lonHostID:$date:$line2insert" | mail -s "STABLEUPDATE:$lonCluster:$lonHostID:$date" installrecord\@mail.lon-capa.org`; } elsif (!$hostidexistflag and !$lineexistflag) { print <<END; New entry for $lonCluster. END `cat ../${lonCluster}_hosts.tab > ../new_${lonCluster}_hosts.tab`; open(OUT,'>>../new_'.$lonCluster.'_hosts.tab') or die("cannot open loncom/new_${lonCluster}_hosts.tab for output\n"); print(OUT $line2insert); close(OUT); `ln -s new_${lonCluster}_hosts.tab ../hosts.tab`; # email appropriate message `echo "INSERT:$lonCluster:$lonHostID:$date:$line2insert" | mail -s "INSERT:$lonCluster:$lonHostID:$date" installrecord\@mail.lon-capa.org`; } } }