File:  [LON-CAPA] / loncom / build / make_domain_coordinator.pl
Revision 1.2: download - view: text, annotated - select for diffs
Mon Mar 4 05:06:00 2002 UTC (22 years, 2 months ago) by harris41
Branches: MAIN
CVS tags: stable_2002_spring, HEAD
fix commenting

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

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