[ Index ] |
PHP Cross Reference of Unnamed Project |
[Summary view] [Print] [Text view]
1 #!/usr/bin/perl -w 2 3 # $Id: updateClasses.pl 7061 2012-04-02 09:22:45Z dbo $ 4 # Met a jour l'arborescence des partages Classes 5 # en definissant les acl basees sur les posixGroup Equipe_* et Classe_* 6 # 7 # syntaxe : updateClasses.pl -e|-c ALL|Classe|login 8 # - ALL : pour passer en revue toutes les classes (les dossiers manquant sont crees, aucun dossier n'est supprime) 9 # - NomClasse : par exemple 1-S1 pour la Classe Classe_1-S1 (si la classe n'existe pas dans l'annuaire, le rep Classe est supprime (renomme .Classe_1-S1) ) 10 # - eleve : login d'un eleve, la Classe est lue dans l'annuaire 11 # Si le dossier de l'eleve est absent il est cree ( si .eleve existe, il est restaure) 12 # Si le dossier de l'eleve existait dans une autre classe, il est deplace et renomme archive les droits sont mis à jour 13 # Si l'eleve n'est inscrit dans aucune classe, son dossier eleve est renomme .eleve s'il existait dans l'aborescence classes... 14 # D.B. Si l'eleve a un dossier dans 2 classes, il est deplace de dans la nouvelle et renomme Archive 15 # D.B. 16 # Jean Le Bail ( jean.lebail@etab.ac-caen.fr ) 10 juillet 2007 17 # Denis Bonnenfant (denis.bonnenfant@diderot.org) 7 octobre 2007 : inversion des noms et petites modifs 18 # Denis Bonnenfant (denis.bonnenfant@diderot.org) 3 septembre 2008 : Création du réeprtoire élève avant de dmigrer les dossiers de l'année d'avant 19 # 20 # renomme si necessaire les repertoires prenom.nom en nom.prenom afin de permettre une visualisation dans l'ordre des listes de classes 21 22 23 # supprime les Warnings du module Se.pm 24 BEGIN { $SIG{'__WARN__'} = sub { warn $_[0] if $DOWARN } } 25 use Se; 26 $DOWARN = 1; # Warnings actives a nouveau 27 28 # fonction qui teste le type de login et qui renvoie nom.prenom dans le cas d'un login prenom.nom, ou sinon le login 29 # si la fonction est appellée avec un login, elle cherche si il y a un répertoire à inverser 30 # sinon renvoie le login 31 32 sub Invert_Login { 33 my $login = $_[0]; 34 my @NOM = split(/\./, $login); 35 if ( @NOM == 2 ) { 36 # on inverse 37 my $eleve = @NOM[1] . "." . @NOM[0]; 38 my $res = $lcs_ldap->search(base => "$groupsDn", 39 scope => 'one', 40 filter => "(&(cn=Classe_*)(memberUid=$login))"); 41 warn $res->error if $res->code; 42 if ( ($res->entries) == 1 ) { 43 # c'est un login 44 my @REP = <$PathClasses/Classe_*/$login>; 45 if ( @REP > 0 ) { 46 foreach my $rep (@REP) { 47 my $tmpClasse = $rep; 48 $tmpClasse =~ s!^$PathClasses/Classe_(.+)/$login$!$1!; 49 print "Inversion de $login -> $eleve<br>\n"; 50 system("/bin/mv '$PathClasses/Classe_$tmpClasse/$login' '$PathClasses/Classe_$tmpClasse/$eleve'") == 0 or warn " Erreur: /bin/mv '$PathClasses/Classe_$tmpClasse/$login' '$PathClasses/Classe_$tmpClasse/$eleve'\n"; 51 print "classe : $tmpClasse\n"; 52 print "inversion de " . $PathClasses . "/Classe_" . $tmpClasse . "/" . $eleve . " avec " . $eleve . " faite<br>\n"; 53 } 54 } 55 } 56 return $eleve; 57 } else { 58 return $login; 59 } 60 } 61 62 sub Cree_Rep { 63 # fait les repertoires 64 # Recherche de l'Eleve dans les Classes 65 my $OldClasse = $_[0]; 66 my $Classe = ""; 67 my $cnClasse = ""; 68 my $res1 = $lcs_ldap->search(base => "$groupsDn", 69 scope => 'one', 70 filter => "(&(cn=Classe_*)(memberUid=$LOGIN))"); 71 warn $res1->error if $res1->code; 72 73 if ( ($res1->entries) == 1 ) { 74 $cnClasse = ($res1->entries)[0]->get_value('cn'); 75 $Classe = $cnClasse; 76 if ( ! ($Classe =~ m/^Classe_/) ) { 77 warn "Bizarre : le nom '$cnClasse' de la classe ne commence pas par 'Classe_' !\n Par prudence, pas de création du dossier de l'élève '$cnClasse/$ELEVE' !<br>\n"; 78 } else { 79 $Classe =~ s/^Classe_// ; 80 if ($OldClasse ne "") { 81 if ("Classe_$OldClasse" ne $cnClasse) { 82 print " Changement de classe de '$ELEVE' : Classe_$OldClasse -> $cnClasse.<br>\n"; 83 if (! -d "$PathClasses/$cnClasse/$ELEVE") { 84 system("/bin/mkdir '$PathClasses/$cnClasse/$ELEVE'") == 0 or warn "Erreur: /bin/mkdir '$PathClasses/$cnClasse/$ELEVE'\n"; 85 } 86 if (! -d "$PathClasses/$cnClasse/$ELEVE/Archives") { 87 system("/bin/mkdir '$PathClasses/$cnClasse/$ELEVE/Archives'") == 0 or warn "Erreur: /bin/mkdir '$PathClasses/$cnClasse/$ELEVE/Archives'\n"; 88 } 89 if (! -d "$PathClasses/$cnClasse/$ELEVE/Archives/$ELEVE") { 90 system("/bin/mv -f '$PathClasses/Classe_$OldClasse/$ELEVE' '$PathClasses/$cnClasse/$ELEVE/Archives/'") == 0 or warn "Erreur: /bin/mv -f '$PathClasses/Classe_$OldClasse/$ELEVE' '$PathClasses/$cnClasse/$ELEVE/Archives'\n";; 91 } else { 92 system("/bin/rm -fr '$PathClasses/Classe_$OldClasse/$ELEVE'") == 0 or warn " Erreur: rm -fr '$PathClasses/Classe_$OldClasse/$ELEVE'<br>\n"; 93 } 94 } 95 } 96 if (! -d "$PathClasses/$cnClasse/$ELEVE") { 97 if ( -d "$PathClasses/$cnClasse/.$ELEVE") { 98 print "Restauration du dossier '$cnClasse/.$ELEVE'.<br>\n"; 99 system("/bin/mv '$PathClasses/$cnClasse/.$ELEVE' '$PathClasses/$cnClasse/$ELEVE'") == 0 or warn " Erreur: /bin/mv '$PathClasses/$cnClasse/.$ELEVE' '$PathClasses/$cnClasse/$ELEVE'<br>\n"; 100 } else { 101 print "Création du dossier '$cnClasse/$ELEVE'.\n"; 102 system("/bin/mkdir '$PathClasses/$cnClasse/$ELEVE'") == 0 or warn " Erreur: mkdir '$PathClasses/$cnClasse/$ELEVE'<br>\n"; 103 } 104 } 105 if ( -d "$PathClasses/$cnClasse/$ELEVE") { 106 print "Mise en place des droits sur $cnClasse/$ELEVE.<br>\n"; 107 system("/usr/bin/setfacl -R -P --set user::rwx,group::---,user:$LOGIN:rwx,group:Equipe_$Classe:rwx,group:admins:rwx,mask::rwx,other::---,default:user::rwx,default:group::---,default:group:Equipe_$Classe:rwx,default:group:admins:rwx,default:mask::rwx,default:other::---,default:user:$LOGIN:rwx $PathClasses/$cnClasse/$ELEVE") == 0 or warn " Erreur: /usr/bin/setfacl -R -P --set user::rwx,group::---,user:$LOGIN:rwx,group:Equipe_$Classe:rwx,group:admins:rwx,mask::rwx,other::---,default:user::rwx,default:group::---,default:group:Equipe_$Classe:rwx,default:group:admins:rwx,default:mask::rwx,default:other::---,default:user:$LOGIN:rwx $PathClasses/$cnClasse/$ELEVE\n"; 108 # Modifie le groupe par defaut 109 system("chgrp admins $PathClasses/$cnClasse/$ELEVE"); 110 } 111 } 112 } else { 113 if (($res1->entries)[0]) { 114 warn( "<div class='error_msg'>Erreur : '$ELEVE' est inscrit dans plusieurs Classes !</div><br>\n"); 115 } else { 116 # L'eleve n'est inscrit dans aucune classe 117 if ( $OldClasse ne "" ) { 118 print "$ELEVE n'est inscrit dans aucune classe : Renommage de 'Classe_$OldClasse/$ELEVE' en 'Classe_$OldClasse/.$ELEVE'.<br>\n"; 119 system("/bin/mv '$PathClasses/Classe_$OldClasse/$ELEVE' '$PathClasses/Classe_$OldClasse/.$ELEVE'") == 0 or warn "Erreur : /bin/mv '$PathClasses/Classe_$OldClasse/$ELEVE' '$PathClasses/Classe_$OldClasse/.$ELEVE'<br>\n"; 120 } else { 121 warn( "<div class='error_msg'>Erreur : '$LOGIN' ne correspond pas à un eleve !</div><br>\n"); 122 } 123 124 } 125 } 126 return 0; 127 } 128 129 130 sub Update_Eleve { 131 $LOGIN = $_[0]; 132 $ELEVE = Invert_Login($LOGIN); 133 my $rep = ""; 134 # Recherche du dossier Eleve 135 my @REP = <$PathClasses/Classe_*/$ELEVE>; 136 if ( @REP > 0 ) { 137 foreach $rep (@REP) { 138 if ( $rep =~ m/Classe_grp_/ ) { 139 print "Ancien groupe '$rep' ignorée.<br>\n"; 140 } else { 141 if ( $rep ne "" ) { 142 if ( $rep =~ m!^$PathClasses/Classe_.+/$ELEVE$! ) { 143 $rep =~ s!^$PathClasses/Classe_(.+)/$ELEVE$!$1!; 144 } else { 145 warn "Bizarre : Le répertoire '$OldClasse' de l'ancienne classe de '$ELEVE' n'est pas de la forme '$PathClasses/Classe_*/$ELEVE' ! <br>\n"; 146 $rep = ""; # On laisse tomber la gestion de l'ancien répertoire 147 } 148 } 149 Cree_Rep($rep); 150 } 151 } 152 } else { 153 Cree_Rep(""); 154 } 155 return 0; 156 } 157 158 159 160 $PathClasses = '/var/se3/Classes'; 161 die("Syntaxe : updateClasses.pl -c|-e ALL|Classe|eleve") if ($#ARGV != 1); 162 ($option, $Classe) = @ARGV; 163 164 $lcs_ldap = Net::LDAP->new("$slapdIp"); 165 $lcs_ldap->bind( 166 dn => $adminDn, 167 password => $adminPw, 168 version => '3'); 169 170 if ($option eq '-c') { 171 if ($Classe eq 'ALL') { 172 $FILTRE = "(cn=Classe_*)"; 173 } else { 174 $FILTRE = "(cn=Classe_$Classe)"; 175 } 176 177 $res = $lcs_ldap->search(base => "$groupsDn", 178 scope => 'one', 179 filter => "$FILTRE"); 180 die $res->error if $res->code; 181 if (($res->entries)[0]) { 182 # Au moins une classe a ete trouvee 183 foreach $objClasse ($res->entries) { 184 $cnClasse = $objClasse->get_value('cn'); 185 $Classe = $cnClasse; 186 $Classe =~ s/^Classe_// ; 187 print "<b>Mise à jour du partage de la classe : $Classe</b><br>\n"; 188 #Verification l'existence du posixGroup Equipe_$Classe 189 $resProfs = $lcs_ldap->search(base => "$groupsDn", 190 scope => 'one', 191 filter => "(&(cn=Equipe_$Classe)(objectClass=posixGroup))"); 192 warn $resProfs->error if $resProfs->code; 193 if (!($resProfs->entries)[0]) { 194 warn "Erreur: Le posixGroup Equipe_$Classe n'existe pas!<br>\n"; 195 } else { 196 if (! -d "$PathClasses/$cnClasse") { 197 if (-d "$PathClasses/.$cnClasse") { 198 print("<b> restauration du repertoire de la classe $Classe</b><br>\n"); 199 system("/bin/mv $PathClasses/.$cnClasse $PathClasses/$cnClasse") == 0 or warn "Erreur: /bin/mv $PathClasses/.$cnClasse $PathClasses/$cnClasse\n"; 200 } else { 201 print("<b> Création du repertoire de la classe $Classe</b><br>\n"); 202 system("/bin/mkdir $PathClasses/$cnClasse") == 0 or warn "Erreur: /bin/mkdir $PathClasses/$cnClasse\n"; 203 } 204 } 205 if ( -d "$PathClasses/$cnClasse") { 206 $ret = system("setfacl -R -P --set user::rwx,group::---,group:Equipe_$Classe:rwx,group:admins:rwx,mask::rwx,other::---,default:user::rwx,default:group::---,default:group:Equipe_$Classe:rwx,default:group:admins:rwx,default:mask::rwx,default:other::--- $PathClasses/$cnClasse"); 207 $ret == 0 or warn "Erreur: setfacl $PathClasses/$cnClasse\n"; 208 209 # Modifie le groupe par defaut 210 system("chgrp admins $PathClasses/$cnClasse"); 211 212 print " $cnClasse/_travail<br>\n"; 213 if ( ! -d "$PathClasses/$cnClasse/_travail") { 214 system("/bin/mkdir $PathClasses/$cnClasse/_travail") == 0 or warn "Erreur: /bin/mkdir $PathClasses/$cnClasse/_travail\n"; 215 } 216 if ( -d "$PathClasses/$cnClasse/_travail") { 217 system("/usr/bin/setfacl -R -P -m group:Classe_$Classe:rx,default:group:$cnClasse:rx $PathClasses/$cnClasse/_travail") == 0 or warn "Erreur: /usr/bin/setfacl $PathClasses/$cnClasse/_travail<br>\n"; 218 # Modifie le groupe par defaut 219 system("chgrp admins $PathClasses/$cnClasse/_travail"); 220 } 221 print " $cnClasse/_profs<br>\n"; 222 if ( ! -d "$PathClasses/$cnClasse/_profs") { 223 system("/bin/mkdir $PathClasses/$cnClasse/_profs") == 0 or warn "Erreur: /bin/mkdir $PathClasses/$cnClasse/_profs<br>\n"; 224 } 225 # Modifie le groupe par defaut 226 system("chgrp admins $PathClasses/$cnClasse/_profs"); 227 228 # premiere passe : on analyse les repertoires 229 @oldeleve = <$PathClasses/$cnClasse/*>; 230 foreach $oldeleve (@oldeleve) { 231 if ( $oldeleve =~ m!^$PathClasses/$cnClasse/_! ) { 232 # print "répertoire '$oldeleve' ignoré.<br>\n"; 233 } else { 234 # D.B. On met à jour les anciens eleves de la classe 235 $oldeleve =~ s!^$PathClasses/$cnClasse/!! ; 236 $login = Invert_Login($oldeleve); 237 Update_Eleve($login) == 0 or warn " Erreur : impossible de mettre a jour pour $login<br\n>"; 238 # Modifie le groupe par defaut 239 if ( -d "$PathClasses/$cnClasse/$login") { 240 system("chgrp admins $PathClasses/$cnClasse/$login"); 241 } 242 } 243 } 244 245 # deuxieme passe : on cherche dans l'annuaire 246 @members = $objClasse->get_value('memberUid'); 247 foreach $member (@members) { 248 # D.B. On met met a jour les eleves actuels de la classe pas encore faits 249 $eleve = Invert_Login($member); 250 if ( ! -d "$PathClasses/$cnClasse/$eleve") { 251 Update_Eleve($member) == 0 or warn " Erreur : impossible de mettre a jour pour $member<br>\n>"; 252 # Modifie le groupe par defaut 253 if ( -d "$PathClasses/$cnClasse/$eleve") { 254 system("chgrp admins $PathClasses/$cnClasse/$eleve"); 255 } 256 } 257 } 258 #Retrait du droit w à Equipe_$CLASSE et ajout de rx au groupe $cnClasse (Classe_ ) sur le dossier /var/se3/Classes/$cnClasse 259 system("/usr/bin/setfacl -m group:Equipe_$Classe:rx,group:$cnClasse:rx $PathClasses/$cnClasse") == 0 or warn "Erreur: /usr/bin/setfacl $PathClasses/$cnClasse<br>\n"; 260 } 261 } 262 } 263 } elsif ( -d "$PathClasses/Classe_$Classe" ){ 264 if ( $Classe =~ m/grp_/ ) { 265 print "Ancien groupe '$rep' ignorée. utilisez le menu groupe<br>\n"; 266 } else{ 267 # le répertoire existe, mais la classe non : on renomme en .Classe_truc, au cas où 268 print("Le groupe n'existe plus : Renommage de la classe $Classe. en .Classe_$Classe<br>\n"); 269 system("/bin/mv $PathClasses/Classe_$Classe $PathClasses/.Classe_$Classe") == 0 or warn "Erreur: /bin/mv $PathClasses/Classe_$Classe $PathClasses/.Classe$Classe\n"; 270 } 271 } 272 } elsif ($option eq '-e') { 273 # on traite direct un eleve 274 Update_Eleve($Classe) == 0 or warn " Erreur : impossible de mettre à jour pour$Classe<br>\n>"; 275 } 276 exit 0 ;
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Tue Mar 17 22:47:18 2015 | Cross-referenced by PHPXref 0.7.1 |