File:  [LON-CAPA] / loncom / build / make_domain_coordinator.pl
Revision 1.1: download - view: text, annotated - select for diffs
Sat Mar 2 03:49:18 2002 UTC (22 years, 2 months ago) by harris41
Branches: MAIN
CVS tags: HEAD
tested; also gives manual procedure with perldoc make_domain_coordinator.pl;
also removes author-specific steps (e.g. ~/public_html, g+rwxs, etc)

    1: #!/usr/bin/perl
    2: 
    3: =pod
    4: 
    5: =head1 NAME
    6: 
    7: make_domain_coordinator.pl - Make a domain coordinator on a LON-CAPA system
    8: 
    9: =head1 DESCRIPTION
   10: 
   11: Automates the steps for domain coordinator creation.  This
   12: program also describes a manual procedure (see below).
   13: 
   14: These are the steps that are executed on the linux operating system:
   15: 
   16: =over 4
   17: 
   18: =item * 
   19: 
   20: Tests to see if user already exists for linux system or for
   21: LON-CAPA, if so aborts
   22: 
   23: =item *
   24: 
   25: Creates a linux system user
   26: 
   27: =item *
   28: 
   29: Sets password
   30: 
   31: =item *
   32: 
   33: Creates a LON-CAPA lonUsers directory for user
   34: 
   35: =item *
   36: 
   37: Sets LON-CAPA password mechanism to be "unix"
   38: 
   39: =item *
   40: 
   41: Set roles.hist and roles.db
   42: 
   43: =back
   44: 
   45: =cut
   46: 
   47: # The LearningOnline Network
   48: # make_domain_coordinator.pl - Make a domain coordinator on a system
   49: #
   50: # $Id: make_domain_coordinator.pl,v 1.1 2002/03/02 03:49:18 harris41 Exp $
   51: #
   52: # Copyright Michigan State University Board of Trustees
   53: #
   54: # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
   55: #
   56: # LON-CAPA is free software; you can redistribute it and/or modify
   57: # it under the terms of the GNU General Public License as published by
   58: # the Free Software Foundation; either version 2 of the License, or
   59: # (at your option) any later version.
   60: #
   61: # LON-CAPA is distributed in the hope that it will be useful,
   62: # but WITHOUT ANY WARRANTY; without even the implied warranty of
   63: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   64: # GNU General Public License for more details.
   65: #
   66: # You should have received a copy of the GNU General Public License
   67: # along with LON-CAPA; if not, write to the Free Software
   68: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   69: #
   70: # /home/httpd/html/adm/gpl.txt
   71: #
   72: # http://www.lon-capa.org/
   73: #
   74: # YEAR=2002
   75: # 3/1 Scott Harrison
   76: 
   77: # NOTE: I am interspersing the manual procedure with the automation.
   78: # To see the manual procedure, do perldoc ./make_domain_coordinator.pl
   79: 
   80: # This is a standalone script.  It *could* alternatively use the
   81: # lcuseradd script, however lcuseradd relies on certain system
   82: # dependencies.  make_domain_coordinator.pl should be able
   83: # to run freely as possible irrespective of the status of a LON-CAPA
   84: # installation.
   85: 
   86: # ---------------------------------------------------- Configure general values
   87: 
   88: my %perlvar;
   89: $perlvar{'lonUsersDir'}='/home/httpd/lonUsers';
   90: 
   91: 
   92: =pod
   93: 
   94: =head1 OPTIONS
   95: 
   96: There are no flags to this script.
   97: 
   98: usage: make_domain_coordinator.pl [USERNAME] [DOMAIN] 
   99: 
  100: The password is accepted through standard input.
  101: 
  102: The first argument
  103: specifies the user name of the domain coordinator and
  104: should consist of only alphanumeric characters.
  105: 
  106: The second argument specifies the password for the domain
  107: coordinator and should only consist of printable ASCII
  108: characters and be a string of length greater than 5 characters.
  109: 
  110: =cut
  111: 
  112: # ----------------------------------------------- So, are we invoked correctly?
  113: # Two arguments or abort
  114: if (@ARGV!=2) {
  115:     die 'usage: make_domain_coordinator.pl [USERNAME] [DOMAIN] '."\n".
  116: 	'(and password through standard input)'."\n";
  117: }
  118: my ($username,$domain)=(@ARGV); shift @ARGV; shift @ARGV;
  119: unless ($username=~/^\w+$/ and $username!~/\_/) {
  120:     die 'Username '.$username.' must consist only of alphanumeric characters'.
  121: 	"\n";
  122: }
  123: unless ($domain=~/^\w+$/ and $domain!~/\_/) {
  124:     die 'Domain '.$domain.' must consist only of alphanumeric characters'.
  125: 	"\n";
  126: }
  127: 
  128: my $passwd=<>; # read in password from standard input
  129: chomp($passwd);
  130: 
  131: if (length($passwd)<6 or length($passwd)>30) {
  132:     die 'Password is an unreasonable length.'."\n";
  133: }
  134: my $pbad=0;
  135: foreach (split(//,$passwd)) {if ((ord($_)<32)||(ord($_)>126)){$pbad=1;}}
  136: if ($pbad) {
  137:     die 'Password must consist of standard ASCII characters'."\n";
  138: }
  139: 
  140: # And does user already exist
  141: 
  142: if (-d "/home/$username") {
  143:     die ($username.' is already a linux operating system user.'."\n");
  144: }
  145: my $udpath=propath($domain,$username);
  146: if (-d $udpath) {
  147:     die ($username.' is already defined as a LON-CAPA user.'."\n");
  148: }
  149: 
  150: =pod
  151: 
  152: =head1 MANUAL PROCEDURE
  153: 
  154: There are 10 steps to a manual procedure.
  155: 
  156: You need to decide on three pieces of information
  157: to create a domain coordinator.
  158: 
  159:  * USERNAME (kermit, albert, joe, etc)
  160:  * DOMAIN (should be the same as lonDefDomain in /etc/httpd/conf/access.conf)
  161:  * PASSWORD (don't tell me)
  162: 
  163: The examples in these instructions will be based
  164: on three example pieces of information:
  165: 
  166:  * USERNAME=dc103
  167:  * DOMAIN=103
  168:  * PASSWORD=sesame
  169: 
  170: You will also need to know your "root" password
  171: and your "www" password.
  172: 
  173: =over 4
  174: 
  175: =item 1.
  176: 
  177: login as root on your Linux system
  178:  [prompt %] su
  179: 
  180: =cut
  181: 
  182: # ------------------------------------------------------------ So, are we root?
  183: 
  184: if ($< != 0) {
  185:   die 'You must be root in order to generate a domain coordinator.'."\n";
  186: }
  187: 
  188: =pod
  189: 
  190: =item 2 (as root). add the user
  191: 
  192:  Command: [prompt %] /usr/sbin/useradd USERNAME
  193:  Example: [prompt %] /usr/sbin/useradd dc103
  194: 
  195: =cut
  196: 
  197: # ----------------------------------------------------------- /usr/sbin/useradd
  198: 
  199: $username=~s/\W//g; # an extra filter, just to be sure
  200: `/usr/sbin/useradd $username`;
  201: 
  202: =pod
  203: 
  204: =item 3 (as root). enter in a password
  205: 
  206:  Command: [prompt %] passwd USERNAME
  207:           New UNIX password: PASSWORD
  208:           Retype new UNIX passwd: PASSWORD
  209:  Example: [prompt %] passwd dc103
  210:           New UNIX password: sesame
  211:           Retype new UNIX passwd: sesame
  212: 
  213: =cut
  214: 
  215: $username=~s/\W//g; # an extra filter, just to be sure
  216: $pbad=0;
  217: foreach (split(//,$passwd)) {if ((ord($_)<32)||(ord($_)>126)){$pbad=1;}}
  218: if ($pbad) {
  219:     die 'Password must consist of standard ASCII characters'."\n";
  220: }
  221: open OUT,"|passwd --stdin $username";
  222: print OUT $passwd."\n";
  223: close OUT;
  224: 
  225: =pod
  226: 
  227: =cut
  228: 
  229: =pod
  230: 
  231: =item 4. login as user=www
  232: 
  233:  Command: [prompt %] su www
  234:  Password: WWWPASSWORD
  235: 
  236: =item 5. (as www). cd /home/httpd/lonUsers
  237: 
  238: =item 6. (as www) Create user directory for your new user.
  239: 
  240:  Let U equal first letter of USERNAME
  241:  Let S equal second letter of USERNAME
  242:  Let E equal third letter of USERNAME
  243:  Command: [prompt %] install -d DOMAIN/U/S/E/USERNAME
  244:  Example: [prompt %] install -d 103/d/c/1/dc103
  245: 
  246: =cut
  247: 
  248: `install -o www -g www -d $udpath`;
  249: 
  250: =pod
  251: 
  252: =item 7. (as www) Enter the newly created user directory.
  253: 
  254:  Command: [prompt %] cd DOMAIN/U/S/E/USERNAME
  255:  Example: [prompt %] cd 103/d/c/1/dc103
  256: 
  257: =item 8. (as www). Set your password mechanism to 'unix' 
  258: 
  259:  Command: [prompt %] echo "unix:" > passwd
  260: 
  261: =cut
  262: 
  263: open OUT, ">$udpath/passwd";
  264: print OUT 'unix:'."\n";
  265: close OUT;
  266: `chown www:www $udpath/passwd`;
  267: 
  268: =pod
  269: 
  270: =item 9. (as www). Run CVS:loncapa/doc/rolesmanip.pl:
  271: 
  272:  Command: [prompt %] perl rolesmanip.pl DOMAIN USERNAME
  273:  Example: [prompt %] perl rolesmanip.pl 103 dc103
  274: 
  275: =cut
  276: 
  277: use GDBM_File;
  278: my %hash;
  279:         tie(%hash,'GDBM_File',"$udpath/roles.db",
  280: 	    &GDBM_WRCREAT,0640);
  281: 
  282: $hash{'/'.$domain.'/_dc'}='dc';
  283: open OUT, ">$udpath/roles.hist";
  284: map {
  285:     print OUT $_.' : '.$hash{$_}."\n";
  286: } keys %hash;
  287: close OUT;
  288: 
  289: untie %hash;
  290: `chown www:www $udpath/roles.hist`;
  291: `chown www:www $udpath/roles.db`;
  292: 
  293: =pod
  294: 
  295: =item 10.
  296: 
  297: You may further define the domain coordinator user (i.e. dc103)
  298: by going to http://MACHINENAME/adm/createuser.
  299: 
  300: =cut
  301: 
  302: print "$username is now a domain coordinator\n";
  303: my $hostname=`hostname`; chomp $hostname;
  304: print "http://$hostname/adm/createuser will allow you to further define".
  305:       " this user.\n";
  306: 
  307: # ----------------------------------------------------------------- SUBROUTINES
  308: sub propath {
  309:     my ($udom,$uname)=@_;
  310:     $udom=~s/\W//g;
  311:     $uname=~s/\W//g;
  312:     my $subdir=$uname.'__';
  313:     $subdir =~ s/(.)(.)(.).*/$1\/$2\/$3/;
  314:     my $proname="$perlvar{'lonUsersDir'}/$udom/$subdir/$uname";
  315:     return $proname;
  316: }
  317: 
  318: =pod
  319: 
  320: AUTHOR
  321: 
  322: Scott Harrison, harris41@msu.edu
  323: 
  324: =cut

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