[1449] in Moira

home help back first fref pref prev next nref lref last post

grouper.pl

daemon@ATHENA.MIT.EDU (Garry Zacheiss)
Wed Mar 15 17:32:43 2000

Message-Id: <200003152232.RAA08719@sweet-transvestite.mit.edu>
To: moiradev@MIT.EDU
Date: Wed, 15 Mar 2000 17:32:39 -0500
From: Garry Zacheiss <zacheiss@MIT.EDU>

	To be committed into moira/regtape.  

Index: grouper.pl
===================================================================
RCS file: grouper.pl
diff -N grouper.pl
*** /dev/null	Wed Mar 15 17:14:38 2000
--- grouper.pl	Wed Mar 15 17:19:28 2000
***************
*** 0 ****
--- 1,143 ----
+ #!/moira/bin/perl -Tw
+ # $Id: $
+ 
+ die "Usage: $0 password\n" unless ($#ARGV == 0);
+ $whpassword = $ARGV[0];
+ $db = "";
+ $mrtest = "mrtest";
+ $ENV{'PATH'} = "/moira/bin";
+ use DBI;
+ 
+ $warehouse = DBI->connect("dbi:Oracle:warehouse", "moira", $whpassword,
+ 			  { RaiseError => 1 });
+ $moira = DBI->connect("dbi:Oracle:moira", "moira", "moira",
+ 		      { RaiseError => 1});
+ 
+ # Get the current term
+ ($term) = $warehouse->selectrow_array("SELECT term_code ".
+ 				    "FROM wareuser.whsis_academic_terms ".
+ 				    "WHERE is_current_term='Y'");
+ # Convert from "2000FA" to "FA00"
+ $term =~ s/\d\d(\d\d)(..)/$2$1/;
+ 
+ # Get list of current classes
+ $classes =
+     $warehouse->selectcol_arrayref("SELECT UNIQUE master_subject ".
+ 				   "FROM wareuser.subject_enrollment_moira ".
+ 				   "WHERE term = '$term'");
+ 
+ # Get names of current Grouper lists
+ $sth = $moira->prepare("SELECT name FROM list");
+ $sth->execute;
+ while (($name) = $sth->fetchrow_array) {
+     next if $name !~ /^(fa|sp|su|ja)\d\d-/;
+     $lists{$name} = $name;
+ }
+ 
+ $lists{"registrar"} = "registrar";
+ 
+ # And MIT ID to username mappings
+ $sth = $moira->prepare("SELECT login, clearid FROM users ".
+ 		       "WHERE status = 1 OR status = 2");
+ $sth->execute;
+ while (($user, $mitid) = $sth->fetchrow_array) {
+     $users{$mitid} = $user;
+ }
+ 
+ ($root_id) = $moira->selectrow_array("SELECT users_id FROM users ".
+ 				   "WHERE login = 'root'");
+ 
+ open(MRTEST, "|$mrtest");
+ print MRTEST "connect $db\n";
+ print MRTEST "auth\n";
+ 
+ # Create any lists that don't already exist in Moira
+ foreach $class (@$classes) {
+      $base = "\L$term-$class";
+      $staff = "$base-staff";
+ 
+      # check_list(name, owner, export, parent, desc)
+ 
+      &check_list($base, "registrar", 1, "",
+  		"Automatically-created class participants list for $class");
+      &check_list("$base-reg", "registrar", 0, $base,
+  		"Automatically-generated registered students list for $class");
+      &check_list($staff, $staff, 0, $base,
+  		"Automatically-created teaching staff list for $class");
+      &check_list("$base-others", $staff, 0, $base,
+  		"Automatically-created non-registered students and miscellaneous people list for $class");
+ }
+ 
+ # Now fill in -reg lists
+ foreach $class (@$classes) {
+     $changed = 0;
+     $clist = "\L$term-$class-reg";
+ 
+     # Get current list membership in Moira
+     %mstudents = ();
+     $sth = $moira->prepare("SELECT login FROM users WHERE users_id in ".
+ 			   "(SELECT member_id FROM imembers WHERE list_id ".
+ 			   "= (SELECT list_id FROM list WHERE name='$clist') ".
+ 			   "AND direct=1 AND member_type='USER')");
+     $sth->execute;
+     while (($login) = $sth->fetchrow_array) {
+ 	$mstudents{$login} = $login;
+     }
+ 
+     $wstudents = $warehouse->selectcol_arrayref("SELECT UNIQUE mit_id ".
+ 			     "FROM wareuser.subject_enrollment_moira ".
+ 			     "WHERE term = '$term' ".
+ 			     "AND master_subject = '$class'");
+ 
+     foreach $mitid (@$wstudents) {
+ 	$login = $users{$mitid};
+ 	next if !$login;
+ 	if (!$mstudents{$login}) {
+ 	    print "Adding $login to $clist\n";
+ 	    &add_member($login, USER, $clist);
+ 	    $changed = 1;
+ 	} else {
+ 	    delete $mstudents{$login};
+ 	}
+     }
+ 
+     # Everyone in wstudents will have been removed from mstudents
+     # now, so delete the remaining users since they don't belong
+     foreach $login (keys(%mstudents)) {
+ 	print "Deleting $login from $clist\n";
+ 	&del_member($login, USER, $clist);
+ 	$changed = 1;
+     }
+ 
+     if ($changed) {
+ 	$moira->do("UPDATE list SET modtime = SYSDATE, modby = $root_id, ".
+ 		   "modwith = 'grouper' WHERE name = '$clist'");
+ 	$moira->commit;
+     }
+ }
+ 
+ print MRTEST "quit\n";
+ close(MRTEST);
+ 
+ exit 0;
+ 
+ sub check_list {
+     my ( $name, $owner, $export, $parent, $desc ) = @_;
+     if (!$lists{$name}) {
+ 	print "Creating $name\n";
+ 	print MRTEST "qy alis $name 1 0 1 $export $export \"create unique GID\" LIST $owner \"$desc\"\n";
+         if ($parent) {
+ 	    &add_member($name, LIST, $parent);
+ 	}
+     }
+ }
+ 
+ sub add_member {
+     my ( $user, $type, $list ) = @_;
+     print MRTEST "qy amtl $list $type $user\n";
+ }
+ 
+ sub del_member {
+     my ( $user, $type, $list ) = @_;
+     print MRTEST "qy dmfl $list $type $user\n";
+ }

home help back first fref pref prev next nref lref last post