File:  [LON-CAPA] / doc / loncapafiles / updatequery.piml
Revision 1.20: download - view: text, annotated - select for diffs
Mon Dec 9 18:37:15 2002 UTC (21 years, 3 months ago) by albertel
Branches: MAIN
CVS tags: HEAD
- attempting to fix BUG#1034, still doesn't pick up old values from existing hosts.tab files
- doesn't actually set the value

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

<!-- $Id: updatequery.piml,v 1.20 2002/12/09 18:37:15 albertel 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;
my $domainDescription;
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";
  }
}


# get domain description
# accept if valid, if not valid, tell user and repeat
$flag=0;

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

**** Domain Description ****
String describing the domain, to be shown to users.
[Example, msu is Michigan State University]
ENTER DOMAIN DESCRIPTION:
END

  my $choice=&lt;&gt;;
  chomp($choice);
  if ($choice!~/:/) {
    open(OUT,'&gt;&gt;/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(&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) 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) 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-7 TO CHANGE, otherwise ENTER 8:
END
my $choice=&lt;&gt;;
chomp($choice);
  if ($choice==1) {
  print(&lt;&lt;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=&lt;&gt;;
    chomp($choice2);
    $perlvar{'lonDefDomain'}=$choice2;
  }
  elsif ($choice==2) {
  print(&lt;&lt;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=&lt;&gt;;
    chomp($choice2);
    $domainDescription=$choice2;
  }
  elsif ($choice==3) {
  print(&lt;&lt;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=&lt;&gt;;
    chomp($choice2);
    $perlvar{'lonHostID'}=$choice2;
  }
  elsif ($choice==4) {
  print(&lt;&lt;END);
4) System Administrator's E-mail Address: $perlvar{'lonAdmEMail'}
ENTER NEW VALUE:
END
    my $choice2=&lt;&gt;;
    chomp($choice2);
    $perlvar{'lonAdmEMail'}=$choice2;
  }
  elsif ($choice==5) {
  print(&lt;&lt;END);
5) Role: $perlvar{'lonRole'}
ENTER NEW VALUE (this should be either 'access' or 'library' 
                 if in doubt select 'library'):
END
    my $choice2=&lt;&gt;;
    chomp($choice2);
    $perlvar{'lonRole'}=$choice2;
  }
  elsif ($choice==6) {
  print(&lt;&lt;END);
6) Cache Expiration Time: $perlvar{'lonExpire'}
ENTER NEW VALUE (in seconds, 86400 is a reasonable value):
END
    my $choice2=&lt;&gt;;
    chomp($choice2);
    $perlvar{'lonExpire'}=$choice2;
  }
  elsif ($choice==7) {
  print(&lt;&lt;END);
7) Server Load: $perlvar{'lonLoadLim'}
ENTER NEW VALUE:
END
    my $choice2=&lt;&gt;;
    chomp($choice2);
    $perlvar{'lonLoadLim'}=$choice2;
  }
  elsif ($choice==8) {
    $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);
	print($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 &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>