[ Index ]

PHP Cross Reference of Unnamed Project

title

Body

[close]

/se3master/usr/share/se3/scripts/ -> updateClasses.pl (source)

   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&#233;ation du dossier de l'&#233;l&#232;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&#233;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  &#224 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&#233;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&#233;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&#233;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 &#224; 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&#233;pertoire '$oldeleve' ignor&#233;.<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 &#224; 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&#233;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 ;


Generated: Tue Mar 17 22:47:18 2015 Cross-referenced by PHPXref 0.7.1