File:  [LON-CAPA] / doc / loncapafiles / updatequery.piml
Revision 1.18: download - view: text, annotated - select for diffs
Sat Aug 17 19:05:03 2002 UTC (21 years, 7 months ago) by harris41
Branches: MAIN
CVS tags: HEAD
BUG 649 FIX; This prevents a system administrator from ever specifying
'adm','userfiles','raw','uploaded', or 'priv' to be the lonDefDomain
for the machine.  (The goal is to avoid conflicting with namespace
underneath DocumentRoot which is necessary for emerging LON-CAPA
functionality.)

<!-- updatequery.piml -->
<!-- Scott Harrison -->

<!-- $Id: updatequery.piml,v 1.18 2002/08/17 19:05:03 harris41 Exp $ -->

<!--

This file is part of the LearningOnline Network with CAPA (LON-CAPA).

LON-CAPA is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

LON-CAPA is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with LON-CAPA; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

/home/httpd/html/adm/gpl.txt

http://www.lon-capa.org/

-->

<piml>
<targetroot>/</targetroot>
<files>
<file>
<target dist='default'>/</target>
<perlscript mode='fg'>
$|=1;
  print(&lt;&lt;END);


*********************************************
*********************************************
****                                     ****
**** LON-CAPA SYSTEM INFORMATION REQUEST ****
****                                     ****
**** Please respond to the choices below ****
****                                     ****
*********************************************
*********************************************

END
sleep(3);
</perlscript>
</file>
<file>
<target dist='default'>/home/httpd/lonTabs/hosts.tab</target>
<perlscript mode='fg'>
$|=1;
unless (-e "<TARGET />") {
  print(&lt;&lt;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,'&gt;/tmp/loncapa_updatequery.out');
close(OUT);

# query for Machine Role
  print(&lt;&lt;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=&lt;&gt;;
  chomp($choice);
  if ($choice==1) {
    open(OUT,'&gt;&gt;/tmp/loncapa_updatequery.out');
    print(OUT 'lonRole'."\t".'library'."\n");
    close(OUT);
    $lonRole='library';
    $r='l';
    $flag=1;
  }
  elsif ($choice==2) {
    open(OUT,'&gt;&gt;/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(&lt;&lt;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(&lt;&lt;END);
ENTER LONCAPA DOMAIN [$ipdomain]:
END
}
else {
  print(&lt;&lt;END);
ENTER LONCAPA DOMAIN:
END
}
  my $choice=&lt;&gt;;
  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,'&gt;&gt;/tmp/loncapa_updatequery.out');
    print(OUT 'lonDefDomain'."\t".$choice."\n");
    close(OUT);
    $lonDefDomain=$choice;
    $flag=1;
  }
  elsif ($choice!~/\_/ and $choice=~/^\w+$/) {
    open(OUT,'&gt;&gt;/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";
  }
}

my $lonHostID;
if ($lonDefDomain) {
  $lonHostID=$lonDefDomain.$r.int(1+rand(9)); # should be probably also detect
                                              # against the hosts.tab
}

  print(&lt;&lt;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(&lt;&lt;END);
ENTER LONCAPA MACHINE ID [$lonHostID]:
END
}
else {
  print(&lt;&lt;END);
ENTER LONCAPA MACHINE ID:
END
}
  my $choice=&lt;&gt;;
  chomp($choice);
  if ($lonHostID and $choice=~/^\s*$/) {
    $choice=$lonHostID;
    open(OUT,'&gt;&gt;/tmp/loncapa_updatequery.out');
    print(OUT 'lonHostID'."\t".$choice."\n");
    close(OUT);
    $lonHostID=$choice;
    $flag=1;
  }
  elsif ($choice!~/\_/ and $choice=~/^\w+$/) {
    open(OUT,'&gt;&gt;/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(&lt;&lt;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=&lt;&gt;;
  chomp($choice);
  if ($choice=~/\@/) {
    open(OUT,'&gt;&gt;/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,'&lt;'.$confdir.$filename) or die("Can't read $confdir$filename");
	while (my $configline=&lt;CONFIG&gt;) {
	    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{'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,"&gt;$confdir$filename") or
      die("Cannot output to $confdir$filename\n");
    foreach my $key (keys %perlvar) {
      my $value=$perlvar{$key};
      print(OUT &lt;&lt;END);
PerlSetVar     $key      $value
END
    }
    close(OUT);
}
</perlscript>
</file>
<file>
<target dist='default'>/</target>
<perlscript mode='fg'>
# read values from loncapa.conf
my $confdir='/etc/httpd/conf/';
my $filename='loncapa.conf';
my %perlvar;
    if (-e "$confdir$filename") {
	open(CONFIG,'&lt;'.$confdir.$filename) or 
          die("Can't read $confdir$filename");
	while (my $configline=&lt;CONFIG&gt;) {
	    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{'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,'&lt;'.$confdir.'loncapa_apache.conf') or 
          die("Can't read ${confdir}loncapa_apache.conf");
	while (my $configline=&lt;CONFIG&gt;) {
	    if ($configline =~ /^[^\#]*PerlSetVar/) {
		my ($unused,$varname,$varvalue)=split(/\s+/,$configline);
		chomp($varvalue);
		$perlvarstatic{$varname}=$varvalue;
	    }
	}
	close(CONFIG);
    }
# implement editing logic below, interactively
# update loncapa.conf until 7 is entered

$flag=0;

while (!$flag) {
  print(&lt;&lt;END);

===============================================================================
This is now the current configuration of your machine.
1) Domain Name: $perlvar{'lonDefDomain'}
2) Machine Name: $perlvar{'lonHostID'}
3) System Administrator's E-mail Address: $perlvar{'lonAdmEMail'}
4) Role: $perlvar{'lonRole'}
5) Cache Expiration Time: $perlvar{'lonExpire'}
6) Server Load: $perlvar{'lonLoadLim'}
7) 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(&lt;&lt;END);
ENTER A CHOICE OF 1-6 TO CHANGE, otherwise ENTER 7:
END
my $choice=&lt;&gt;;
chomp($choice);
  if ($choice==1) {
  print(&lt;&lt;END);
1) Domain Name: $perlvar{'lonDefDomain'}
ENTER NEW VALUE:
END
    my $choice2=&lt;&gt;;
    chomp($choice2);
    $perlvar{'lonDefDomain'}=$choice2;
  }
  elsif ($choice==2) {
  print(&lt;&lt;END);
2) Machine Name: $perlvar{'lonHostID'}
ENTER NEW VALUE:
END
    my $choice2=&lt;&gt;;
    chomp($choice2);
    $perlvar{'lonHostID'}=$choice2;
  }
  elsif ($choice==3) {
  print(&lt;&lt;END);
3) System Administrator's E-mail Address: $perlvar{'lonAdmEMail'}
ENTER NEW VALUE:
END
    my $choice2=&lt;&gt;;
    chomp($choice2);
    $perlvar{'lonAdmEMail'}=$choice2;
  }
  elsif ($choice==4) {
  print(&lt;&lt;END);
4) Role: $perlvar{'lonRole'}
ENTER NEW VALUE:
END
    my $choice2=&lt;&gt;;
    chomp($choice2);
    $perlvar{'lonRole'}=$choice2;
  }
  elsif ($choice==5) {
  print(&lt;&lt;END);
5) Cache Expiration Time: $perlvar{'lonExpire'}
ENTER NEW VALUE:
END
    my $choice2=&lt;&gt;;
    chomp($choice2);
    $perlvar{'lonExpire'}=$choice2;
  }
  elsif ($choice==6) {
  print(&lt;&lt;END);
6) Server Load: $perlvar{'lonLoadLim'}
ENTER NEW VALUE:
END
    my $choice2=&lt;&gt;;
    chomp($choice2);
    $perlvar{'lonLoadLim'}=$choice2;
  }
  elsif ($choice==7) {
    $flag=1;
  }
  else {

  }
}
    open(OUT,"&gt;$confdir$filename") or
      die("Cannot output to $confdir$filename\n");
    foreach my $key (keys %perlvar) {
      my $value=$perlvar{$key};
      print(OUT &lt;&lt;END) unless $perlvarstatic{$key};
PerlSetVar     $key      $value
END
    }
    close(OUT);
</perlscript>
</file>
<file>
<target dist='default'>loncom/hosts.tab</target>
<perlscript mode='fg'>
unless (-l "<TARGET />") {
  print(&lt;&lt;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
my $hostname=`hostname`;chomp($hostname);
my $hostaddress=`hostname -i $hostname`;chomp($hostaddress);
$flag=0;
while (!$flag) {
  print "ENTER 1, 2, 3, or 4:\n";
  my $choice=&lt;&gt;;
  chomp($choice);
  $line2insert=&lt;&lt;END;
$perlvar{'lonHostID'}:$perlvar{'lonDefDomain'}:$perlvar{'lonRole'}:$hostname:$hostaddress
END
  $date=`date -I`; chomp($date);
  $lonHostID=$perlvar{'lonHostID'};
  $lonHostID=~s/\W//g;
  $lineexistflag=0;
  $hostidexistflag=0;
  if ($choice==1) {
    $lonCluster='production'; $flag=1;
  }
  elsif ($choice==2) {
    $lonCluster='standalone'; $flag=1;
    open(OUT,'&gt;../'.$lonCluster.'_hosts.tab') or
      die('file generation error');
      print(OUT $line2insert);
    close(OUT);
  }
  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 &lt;&lt;END;
There is no existing /home/httpd/lonTabs/hosts.tab
END
      die('');
    }
  }
  elsif ($choice==26) {
    $lonCluster='rawhide'; $flag=1;
  }
  if ($flag==1) {
    `rm -f ../hosts.tab`;
    open(IN,'&lt;../'.$lonCluster.'_hosts.tab');
    while(&lt;IN&gt;) {
      if (/^$line2insert$/) {
        $lineexistflag=1;
      }
      if (/^$lonHostID\:/) {
        $hostidexistflag=1;
      }
    }
    close(IN);
    if ($hostidexistflag and !$lineexistflag) {
      print &lt;&lt;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 &gt; ../new_${lonCluster}_hosts.tab`;
       open(OUT,'&gt;&gt;../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
      `echo "REPLACE:$lonCluster:$lonHostID:$date:$line2insert" | mail -s "REPLACE:$lonCluster:$lonHostID:$date" installrecord\@mail.lon-capa.org`;
    }
    elsif ($hostidexistflag and $lineexistflag) {
      print &lt;&lt;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 &lt;&lt;END;
New entry for $lonCluster.
END
      `cat ../${lonCluster}_hosts.tab &gt; ../new_${lonCluster}_hosts.tab`;
       open(OUT,'&gt;../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
      `echo "INSERT:$lonCluster:$lonHostID:$date:$line2insert" | mail -s "INSERT:$lonCluster:$lonHostID:$date" installrecord\@mail.lon-capa.org`;
    }
  }
}

}
</perlscript>
</file>
</files>
</piml>

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>