Diff for /loncom/build/make_domain_coordinator.pl between versions 1.10 and 1.17

version 1.10, 2006/08/11 20:09:02 version 1.17, 2009/07/17 22:23:59
Line 91  Set roles.hist and roles.db Line 91  Set roles.hist and roles.db
   
 use lib '/home/httpd/lib/perl/';  use lib '/home/httpd/lib/perl/';
 use LONCAPA;  use LONCAPA;
   use LONCAPA::lonmetadata;
   use DBI;
   
 =pod  =pod
   
Line 113  For example, "dcmsu" or "dcumich" would Line 115  For example, "dcmsu" or "dcumich" would
 USERNAMEs for places like Mich State Univ, etc.  USERNAMEs for places like Mich State Univ, etc.
   
 The second argument specifies the domain of the computer  The second argument specifies the domain of the computer
 coordinator and should consist of only alphanumeric characters.  coordinator.
   
 =cut  =cut
   
Line 128  if (@ARGV!=2) { Line 130  if (@ARGV!=2) {
  "\n".'USERNAMEs for places like Mich State Univ, etc.'."\n");   "\n".'USERNAMEs for places like Mich State Univ, etc.'."\n");
 }  }
 my ($username,$domain)=(@ARGV); shift @ARGV; shift @ARGV;  my ($username,$domain)=(@ARGV); shift @ARGV; shift @ARGV;
 unless ($username=~/^\w+$/ and $username!~/\_/) {  if ($username=~/$LONCAPA::not_username_re/) {
     die('**** ERROR **** '.      die('**** ERROR **** '.
  'Username '.$username.' must consist only of alphanumeric characters'.   'Username '.$username.' must consist only of - . and alphanumeric characters'.
  "\n");   "\n");
 }  }
 unless ($domain=~/^\w+$/ and $domain!~/\_/) {  if ($domain=~/$LONCAPA::not_domain_re/) {
     die('**** ERROR **** '.      die('**** ERROR **** '.
  'Domain '.$domain.' must consist only of alphanumeric characters'.   'Domain '.$domain.' must consist only of - . and alphanumeric charaters and '.
  "\n");   "\n");
 }  }
   
Line 229  if ($< != 0) { # Am I root? Line 231  if ($< != 0) { # Am I root?
   
 =cut  =cut
   
   # ----------------------------------------------------------- /usr/sbin/groupadd
   # -- Add group
   $username=~s/\W//g; # an extra filter, just to be sure
   
   print "adding group: $username \n";
   my $status = system('/usr/sbin/groupadd', $username);
   if ($status) {
       die "Error.  Something went wrong with the addition of group ".
             "\"$username\".\n";
   }
   my $gid = getgrnam($username);
   
 # ----------------------------------------------------------- /usr/sbin/useradd  # ----------------------------------------------------------- /usr/sbin/useradd
   # -- Add user
   
 $username=~s/\W//g; # an extra filter, just to be sure  print "adding user: $username \n";
 `/usr/sbin/useradd $username`; # Add the user with the 'useradd' command.  my $status = system('/usr/sbin/useradd','-c','LON-CAPA user','-g',$gid,$username);
   if ($status) {
       system("/usr/sbin/groupdel $username");
       die "Error.  Something went wrong with the addition of user ".
             "\"$username\".\n";
   }
   
   print "Done adding user\n";
   # Make www a member of that user group.
   my $groups=`/usr/bin/groups www`;
   # untaint
   my ($safegroups)=($groups=~/:\s*([\s\w]+)/);
   $groups=$safegroups;
   chomp $groups; $groups=~s/^\S+\s+\:\s+//;
   my @grouplist=split(/\s+/,$groups);
   my @ugrouplist=grep {!/www|$username/} @grouplist;
   my $gl=join(',',(@ugrouplist,$username));
   print "Putting www in user's group\n";
   if (system('/usr/sbin/usermod','-G',$gl,'www')) {
       die "Error. Could not make www a member of the group ".
             "\"$username\".\n";
   }
   
   # Check if home directory exists for user
   # If not, create one.
   if (!-e "/home/$username") {
       if (!mkdir("/home/$username",0710)) {
           print "Error. Could not add home directory for ".
             "\"$username\".\n";
       }
   }
   
   if (-d "/home/$username") {
       system('/bin/chown',"$username:$username","/home/$username");
       system('/bin/chmod','-R','0660',"/home/$username");
       system('/bin/chmod','0710',"/home/$username");
   }
 =pod  =pod
   
 =item 3 (as root). enter in a password  =item 3 (as root). enter in a password
Line 254  foreach (split(//,$passwd)) {if ((ord($_ Line 304  foreach (split(//,$passwd)) {if ((ord($_
 if ($pbad) {  if ($pbad) {
     die('Password must consist of standard ASCII characters'."\n");      die('Password must consist of standard ASCII characters'."\n");
 }  }
 open(OUT,"|passwd --stdin $username");   
 print(OUT $passwd."\n");  my $distro;
 close(OUT);  if (open(PIPE,"perl distprobe|")) {
       $distro = <PIPE>;
       close(PIPE);
   }
   if ($distro =~ /^ubuntu|debian/) {
       open(OUT,"|usermod -p `mkpasswd $passwd` $username");
       close(OUT);
   } else {
       open(OUT,"|passwd --stdin $username");
       print(OUT $passwd."\n");
       close(OUT);
   }
   
 =pod  =pod
   
Line 307  close(OUT); Line 368  close(OUT);
 open(OUT, ">$udpath/passwd");  open(OUT, ">$udpath/passwd");
 print(OUT 'unix:'."\n");  print(OUT 'unix:'."\n");
 close(OUT);  close(OUT);
 `chown www:www $udpath/passwd`; # Must be writeable by httpd process.  
   # Get permissions correct on udpath
   
    print "Setting permissions on user data directories. This may take a moment, please be patient ...\n";
   `chown -R www:www /home/httpd/lonUsers/$domain` ; # Must be writeable by httpd process.
   
 =pod  =pod
   
Line 324  my $rolesref=&LONCAPA::locking_hash_tie( Line 389  my $rolesref=&LONCAPA::locking_hash_tie(
 if (!$rolesref) {  if (!$rolesref) {
     die('unable to tie roles db: '."$udpath/roles.db");      die('unable to tie roles db: '."$udpath/roles.db");
 }  }
 $rolesref->{'/'.$domain.'/_dc'}='dc'; # Set the domain coordinator role.  my $now = time;
   $rolesref->{'/'.$domain.'/_dc'}='dc_0_'.$now; # Set the domain coordinator role.
 open(OUT, ">$udpath/roles.hist"); # roles.hist is the synchronous plain text.  open(OUT, ">$udpath/roles.hist"); # roles.hist is the synchronous plain text.
 foreach my $key (keys(%{$rolesref})) {  foreach my $key (keys(%{$rolesref})) {
     print(OUT $key.' : '.$rolesref->{$key}."\n");      print(OUT $key.' : '.$rolesref->{$key}."\n");
Line 336  close(OUT); Line 402  close(OUT);
 `chown www:www $udpath/roles.hist`; # Must be writeable by httpd process.  `chown www:www $udpath/roles.hist`; # Must be writeable by httpd process.
 `chown www:www $udpath/roles.db`; # Must be writeable by httpd process.  `chown www:www $udpath/roles.db`; # Must be writeable by httpd process.
   
   my %perlvar = %{&LONCAPA::Configuration::read_conf('loncapa.conf')};
   my $dompath = $perlvar{'lonUsersDir'}.'/'.$domain;
   my $domrolesref = &LONCAPA::locking_hash_tie("$dompath/nohist_domainroles.db",&GDBM_WRCREAT());
   
   if (!$domrolesref) {
       die('unable to tie nohist_domainroles db: '."$dompath/nohist_domainroles.db");
   }
   
   # Store in nohist_domainroles.db
   my $domkey=&LONCAPA::escape('dc:'.$username.':'.$domain.'::'.$domain.':');
   $domrolesref->{$domkey}= &LONCAPA::escape('0:'.$now);
   &LONCAPA::locking_hash_untie($domrolesref);
   
    system('/bin/chown',"www:www","$dompath/nohist_domainroles.db"); # Must be writeable by httpd process.
    system('/bin/chown',"www:www","$dompath/nohist_domainroles.db.lock");
   
   #Update allusers MySQL table
   
   print "Adding new user to allusers table\n";
   &allusers_update($username,$domain,\%perlvar);
   
 =pod  =pod
   
 =item 10.  =item 10.
Line 346  by going to http://MACHINENAME/adm/creat Line 433  by going to http://MACHINENAME/adm/creat
 =cut  =cut
   
 # Output success message, and inform sysadmin about how to further proceed.  # Output success message, and inform sysadmin about how to further proceed.
 print("$username is now a domain coordinator\n"); # Output success message.  print("\n$username is now a domain coordinator\n"); # Output success message.
 my $hostname=`hostname`; chomp($hostname); # Read in hostname.  my $hostname=`hostname`; chomp($hostname); # Read in hostname.
 print("http://$hostname/adm/createuser will allow you to further define".  print("\n".'Once LON-CAPA is running, you should log-in and use: '."\n".
       " this user.\n"); # Output a suggested URL.        'http://'.$hostname.'/adm/createuser to further define this user.'."\n\n".
         'From the user management menu, click the link: "Add/Modify a User" '."\n".
         'to search for the user and to provide additional information (last name, first name etc.).'."\n");
   # Output a suggested URL.
   
   sub allusers_update {
       my ($username,$domain,$perlvar) = @_;
       my %tablenames = (
                          'allusers'   => 'allusers',
                        );
       my $dbh;
       unless ($dbh = DBI->connect("DBI:mysql:loncapa","www",
                               $perlvar->{'lonSqlAccess'},
                               { RaiseError =>0,PrintError=>0})) {
           print "Cannot connect to database!\n";
           return;
       }
       my $tablechk = &allusers_table_exists($dbh);
       if ($tablechk == 0) {
           my $request =
      &LONCAPA::lonmetadata::create_metadata_storage('allusers','allusers');
           $dbh->do($request);
           if ($dbh->err) {
                print "Failed to crate allusers table\n";
                return;
           }
       }
       my %userdata =  (
                   username => $username,
                   domain   => $domain,
       );
       my %loghash =
           &LONCAPA::lonmetadata::process_allusers_data($dbh,undef,
               \%tablenames,$username,$domain,\%userdata,'update');
       foreach my $key (keys(%loghash)) {
           print $loghash{$key}."\n";
       }
       return;
   }
   
   sub allusers_table_exists {
       my ($dbh) = @_;
       my $sth=$dbh->prepare('SHOW TABLES');
       $sth->execute();
       my $aref = $sth->fetchall_arrayref;
       $sth->finish();
       if ($sth->err()) {
           return undef;
       }
       my $result = 0;
       foreach my $table (@{$aref}) {
           if ($table->[0] eq 'allusers') {
               $result = 1;
               last;
           }
       }
       return $result;
   }
   
 =pod  =pod
   
Line 358  print("http://$hostname/adm/createuser w Line 502  print("http://$hostname/adm/createuser w
 Written to help the LON-CAPA project.  Written to help the LON-CAPA project.
   
 =cut  =cut
   

Removed from v.1.10  
changed lines
  Added in v.1.17


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