[ Index ]

PHP Cross Reference of Unnamed Project

title

Body

[close]

/se3master/var/www/se3/partages/ -> create_folders_classes.php (source)

   1  <?php
   2  
   3  
   4     /**
   5     
   6     * Permet de creer les partages Classe
   7     * @Version $Id: create_folders_classes.php 6176 2011-02-27 23:00:23Z dbo $ 
   8     
   9     * @Projet LCS / SambaEdu 
  10     
  11     * @auteurs  jLCF >:>  jean-luc.chretien@tice.ac-caen.fr
  12     * @auteurs Equipe TICE Crdp de Caen
  13     * @auteurs Olivier LECLUSE
  14  
  15     * @Licence Distribue selon les termes de la licence GPL
  16     
  17     * @note Ce script est conserve pour le cas d'un serveur esclave avec repertoires classes deportes (utilise admind)
  18     * @note Remplace par rep_classe.php 
  19     */
  20  
  21     /**
  22  
  23     * @Repertoire: partages/
  24     * file: synchro_folders_classes.php
  25  
  26    */    
  27    
  28    
  29    include  "entete.inc.php";
  30    include  "ldap.inc.php";
  31    include  "ihm.inc.php";
  32  
  33    require_once  ("lang.inc.php");
  34    bindtextdomain('se3-partages',"/var/www/se3/locale");
  35    textdomain ('se3-partages');
  36  
  37  
  38    if (is_admin("se3_is_admin",$login)=="Y") {
  39      // Aide en ligne
  40        $titre=gettext("Aide en ligne");
  41        $texte=gettext("Vous &#234tes administrateur du serveur SE3.<BR>Avec le menu ci-dessous, vous pouvez cr&#233er des ressources pour chacune des  classes de votre annuaire.<BR>Une ressource classe, se pr&#233sente comme un sous dossier du partage Classes (H:).Dans le sous dossier d'une classe, vous trouverez :\n<ul><li>un sous dossier par eleve de la classe,<li>un sous dossier «_profs» &#224 usage des membres de l'&#233quipe p&#233dagogique de cette classe,<li>un sous dossier «_travail» qui est un espace d'&#233change entre les professeurs et les &#233;l&#232;ves de la classe.</ul><p>Droits d'acc&#232;s aux sous dossiers :<ul><li> <u>Les &#233;l&#232;ves acc&#232;dent </u> :<ul><li> En rw- a leur sous dossier personnel,<li> En r-- au dossier travail,</ul><li> <u>Les &#233;l&#232;ves n'acc&#233;dent pas</u> :<ul><li>Aux sous-dossiers des autres &#233;l&#232;ves de la classe.<li>Aux sous-dossiers «_profs» des professeurs.</ul></ul><ul><li> <u>Les professeurs acc&#232;dent </u> :  en rw- sur l'ensemble de l'arborescence de leurs classes.</ul>");
  42        mkhelp($titre,$texte);
  43       // Fin Aide en ligne
  44  
  45  echo "<h1>".gettext("Cr&#233;ation des r&#233;pertoires classes")."</h1>";
  46  
  47  // Definition des messages d'alerte
  48      $alerte_1="<div class='error_msg'>".gettext("Votre demande de cr&#233ation de nouvelles ressources classes n'a pas &#233;t&#233; prise en compte car une t&#226;che d'administration est en cours sur le serveur")." <b>";
  49      $alerte_2="</b>,".gettext(" veuillez r&#233;it&#233;rer votre demande plus tard. Si le probl&#232;me persiste, veuillez contacter le super-utilisateur du serveur SE3.")."</div><BR>\n";
  50      $alerte_3="<div class='error_msg'>".gettext("Votre demande de cr&#233;ation de nouvelles ressources classes a &#233;chou&#233;e. Si le probl&#232;me persiste, veuillez contacter le super-utilisateur du serveur SE3.")."</div><BR>\n";
  51       // Definition des messages d'info
  52      $info_1 = gettext("Cette t&#226;che est ordonnanc&#233e, vous recevrez un mail de confirmation de cr&#233;ation dans quelques instants...");
  53  
  54      #------------------------------------------
  55      // Prepositionnement variables
  56      $mono_srv = false;
  57      $multi_srv = false;
  58      // Recherche de la nature mono ou multi serveur de la plateforme SE3
  59      $master=search_machines ("(l=maitre)", "computers");
  60      $slaves= search_machines ("(l=esclave)", "computers");
  61      if ( count($master) == 0 ) {
  62        echo "<P>".gettext("ERREUR : Il n'y a pas de serveur maitre d&#233clar&#233 dans l'annuaire ! <BR>Veuillez contacter le super utilisateur du serveur SE3.")."</P>";
  63      } elseif (  count($master) == 1  && count($slaves) == 0 ) {
  64         // Plateforme mono-serveur
  65         $mono_srv = true;
  66      } elseif (  count($master) == 1  && count($slaves) > 0  ) {
  67         $multi_srv = true;
  68      }
  69      // Fin Recherche de la nature mono ou multi serveur de la plateforme SE3
  70      if ( $mono_srv ) {
  71        // configuration mono serveur  : determination des parametres du serveur
  72        $serveur=search_machines ("(l=maitre)", "computers");
  73        $cn_srv= $serveur[0]["cn"];
  74        $stat_srv = $serveur[0]["l"];
  75        $ipHostNumber =  $serveur[0]["ipHostNumber"];
  76      } elseif ($multi_srv) {
  77        // configuration multi-serveurs : presentation d'un form de selection du serveur
  78        if ( !$selected_srv && !$create_folders_classes) {
  79          echo "<H3>".gettext("S&#233lection du serveur ou vous souhaitez cr&#233er des ressources classes:")." </H3>";
  80          $servers=search_computers ("(|(l=esclave)(l=maitre))");
  81          echo "<form action=\"create_folders_classes.php\" method=\"post\">\n";
  82          for ($loop=0; $loop < count($servers); $loop++) {
  83            echo $servers[$loop]["description"]." ".$servers[$loop]["cn"]."&nbsp;<input type=\"radio\" name=\"cn_srv\" value =\"".$servers[$loop]["cn"]."\"";
  84            if ($loop==0) echo "checked";
  85              echo "><BR>\n";
  86          }
  87          $form="<input type=\"reset\" value=\"".gettext("R&#233initialiser la s&#233lection")."\">\n";
  88          $form ="<input type=\"hidden\" name=\"selected_srv\" value=\"true\">\n";
  89          $form.="<input type=\"submit\" value=\"".gettext("Valider")."\">\n";
  90          $form.="</form>\n";
  91          echo $form;
  92        } elseif ( $selected_srv && $multi_srv) {
  93          // configuration multi serveurs  : determination des parametres du serveur
  94          $serveur=search_machines ("(cn=$cn_srv)", "computers");
  95          $stat_srv = $serveur[0]["l"];
  96          $ipHostNumber =  $serveur[0]["ipHostNumber"];
  97        }
  98      }
  99      // Fin selection et recherche des caracteristiques du serveur
 100  
 101      if ( (!$create_folders_classes &&  ($stat_srv == "maitre" || $stat_srv == "esclave")  ) || ( $create_folders_classes && count($new_folders_classes)==0 ) ) {
 102        // Recherche de la liste des classes dans l'annuaire
 103         $list_classes=search_groups("cn=Classe_*");
 104        // Recherche des sous dossiers classes deja existant sur le serveur selectionne
 105        // Si serveur maitre
 106        if ($stat_srv == "maitre" ) {
 107          // Constitution d'un tableau avec les ressources deja existantes
 108          $dirClasses = dir ("/var/se3/Classes");
 109          $indice=0;
 110          while ( $Entry = $dirClasses ->read() ) {
 111            if ( preg_match("/^Classe_/", $Entry) ) {
 112              $RessourcesClasses[$indice] = $Entry;
 113              $indice++;
 114            }
 115          }
 116        } else {
 117        // Si serveur esclave
 118          exec ("ssh -l remote_adm $ipHostNumber 'ls /var/se3/Classes'", $RessourcesClasses, $ReturnValue);
 119        }
 120        // Creation d'un tableau des nouvelles ressources a creer  par
 121        // elimination des ressources deja existantes
 122        $k=0;
 123        for ($i=0; $i < count($list_classes); $i++ ) {
 124          for ($j=0; $j < count($RessourcesClasses); $j++ ) {
 125            if (  $list_classes[$i]["cn"] ==  $RessourcesClasses[$j])  {
 126              $exist = true;
 127              break;
 128            } else { $exist = false; }
 129          }
 130          if (!$exist) {
 131            $list_new_classes[$k]["cn"]= $list_classes[$i]["cn"];
 132            $k++;
 133          }
 134        }
 135        // Affichage menu de selection des sous-dossiers classes a creer
 136        if   ( count($list_new_classes)>10) $size=10; else $size=count($list_new_classes);
 137        if ( count($list_new_classes)>0) {
 138          echo "<form action=\"create_folders_classes.php\" method=\"post\">\n";
 139          echo "<h3>".gettext("Cr&#233ation de ressources Classes sur")." $cn_srv : </h3>\n";
 140          echo "<p>".gettext("S&#233lectionnez les ressources classes &#224 cr&#233er :")."</p>\n";
 141          echo "<select size=\"".$size."\" name=\"new_folders_classes[]\" multiple=\"multiple\">\n";
 142          for ($loop=0; $loop < count($list_new_classes); $loop++) {
 143            echo "<option value=".$list_new_classes[$loop]["cn"].">".$list_new_classes[$loop]["cn"]."\n";
 144          }
 145          echo "</select><br>\n";
 146          echo "<input type=\"hidden\" name=\"create_folders_classes\" value=\"true\">\n";
 147          echo "<input type=\"hidden\" name=\"cn_srv\" value=\"$cn_srv\">\n";
 148          echo "<input type=\"hidden\" name=\"stat_srv\" value=\"$stat_srv\">\n";
 149          echo "<input type=\"hidden\" name=\"ipHostNumber\" value=\"$ipHostNumber\">\n";
 150          echo "<input type=\"reset\" value=\"".gettext("R&#233initialiser la s&#233lection")."\">\n";
 151          echo "<input type=\"submit\" value=\"".gettext("Valider")."\">\n";
 152          echo "</form>\n";
 153          // Verification selection d'au moins une classe
 154          if ( $create_folders_classes && count($new_folders_classes)==0 ) {
 155            echo "<div class='error_msg'>".gettext("Vous devez s&#233lectionner au moins une classe !")."</div>\n";
 156          }
 157        } else {
 158            echo "<div class='error_msg'>".gettext("Il n'y a pas de nouvelles classes &#224 ajouter !")."</div>\n";
 159        }
 160      } elseif ($create_folders_classes) {
 161        // Creation du script bash
 162        echo "<H3>".gettext("Vous avez s&#233lectionn&#233 "). count($new_folders_classes).gettext(" classe(s)  &#224 cr&#233er sur le serveur")." $stat_srv <b>$cn_srv</b></H3>\n";
 163        // Construction du script admin.sh
 164        $commandes = "#!/bin/bash\n";
 165        for ($loop=0; $loop < count($new_folders_classes); $loop++) {
 166          $classe=$new_folders_classes[$loop];
 167          $folder_classe="/var/se3/Classes/".$new_folders_classes[$loop];
 168          // Creation du repertoire Classe
 169          $commandes .="#".gettext("Creation du repertoire Classe")." $classe\n";
 170          $commandes .="mkdir $folder_classe\n";
 171          $commandes.="chown admin:nogroup $folder_classe\n";
 172          $commandes.="chmod 700 $folder_classe\n";
 173  
 174          // Application des acl posix pour le groupe de cette classe
 175          $commandes.="#".gettext("Application des acl posix pour le groupe")." $classe\n";
 176          $commandes.="setfacl -m d:m::rwx $folder_classe\n";
 177          $commandes.="setfacl -m m::rwx $folder_classe\n";
 178          $commandes.="setfacl -m g:$classe:rx $folder_classe\n";
 179  
 180          // Application acl posix pour le groupe admins
 181          $commandes.="\n#".gettext("Application des acl posix pour le groupe admins SE3 sur l'ensemble de l'arborescence")."\n";
 182          $commandes.="setfacl -m d:g:admins:rwx $folder_classe\n";
 183          $commandes.="setfacl -m g:admins:rwx $folder_classe\n";
 184  
 185          // Application acl posix pour le groupe Equipe_ de cette classe
 186          $equipe = preg_replace("/Classe_/","Equipe_",$classe);
 187          $commandes.="#".gettext("Application des acl posix pour le groupe")." $equipe\n";
 188          $commandes.="setfacl -m d:g:$equipe:rwx $folder_classe\n";
 189          $commandes.="setfacl -m g:$equipe:rx $folder_classe\n";
 190  
 191          // Recherche des eleves de cette classe
 192          $uids = search_uids ("(cn=".$classe.")", "half");
 193          $commandes.="#Creation des sous dossiers eleves\n";
 194          for  ($i=0; $i < count($uids); $i++) {
 195            $eleve = $uids[$i]["uid"];
 196            $commandes.="mkdir $folder_classe/$eleve\n";
 197            $commandes.="chown admin:nogroup $folder_classe/$eleve\n";
 198            $commandes.="chmod 700 $folder_classe/$eleve\n";
 199            $commandes.="setfacl -m u:$eleve:rwx $folder_classe/$eleve\n";
 200            $commandes.="setfacl -m d:u:$eleve:rwx $folder_classe/$eleve\n";
 201            $commandes.="setfacl -m m::rwx $folder_classe/$eleve\n";
 202            $commandes.="\n";
 203          }
 204          // Creation du sous dossier Profs
 205          $commandes.="#".gettext("Creation du sous dossier professeurs")."\n";
 206          $commandes.="mkdir $folder_classe/_profs\n";
 207          $commandes.="chown admin:nogroup $folder_classe/_profs\n";
 208          $commandes.="chmod 700 $folder_classe/_profs\n";
 209          $commandes.="setfacl -m m::rwx $folder_classe/_profs\n";
 210  
 211          $commandes.="\n";
 212          // Creation du sous dossier travail
 213          $commandes.="#".gettext("Creation du sous dossier travail")."\n";
 214          $commandes.="mkdir $folder_classe/_travail\n";
 215          $commandes.="chown admin:nogroup $folder_classe/_travail\n";
 216          $commandes.="chmod 700 $folder_classe/_travail\n";
 217          $commandes.="setfacl -m d:g:$classe:rx $folder_classe/_travail\n";
 218          $commandes.="setfacl -m g:$classe:rx $folder_classe/_travail \n";
 219          $commandes.="setfacl -m m::rwx $folder_classe/_travail\n";
 220          $commandes.="\n";
 221        }
 222        // mel CR de creation ressources Classes
 223        $Subject=gettext("[SE3 T&#226;che d'administration] Cr&#233ation de ressources Classes")."\n";
 224        list($user,$groups)=people_get_variables("admin", true);
 225        $mel_adm=$user["email"];
 226  
 227        $commandes.="\n#".gettext("Mel CR creation ressources Classes")."\n";
 228        $commandes.="cat > /tmp/admind.tmp <<-EOF\n";
 229        $commandes.= gettext("La cr&#233;ation des ressources Classes suivantes :")."\n";
 230        for ($loop=0; $loop < count($new_folders_classes); $loop++) {
 231          $commandes.=$new_folders_classes[$loop]."\n";
 232        }
 233        $commandes.= gettext("sur le serveur")." $cn_srv ".gettext("a &#233;t&#233; effectu&#233e avec succ&#232;s.")."\n";
 234        $commandes.= "\n";
 235        $commandes.= "EOF\n";
 236        $commandes.= "mail -s \"$Subject\" $mel_adm < /tmp/admind.tmp\n";
 237  //leb
 238        $commandes1 = $commandes;
 239        #echo "<tt>".str_replace("\n", "<br>\n",$commandes1)."</tt>";
 240  //leb
 241        // Creation du script tmp_$stat_srv.sh sur le serveur maitre
 242        $fp=@fopen("/var/remote_adm/tmp_".$stat_srv.".sh","w");
 243        if($fp) {
 244          fputs($fp,$commandes."\n");
 245          fclose($fp);
 246          chmod ("/var/remote_adm/tmp_$stat_srv.sh", 0600);
 247          // Si creation sur le maitre
 248          if ( $stat_srv == "maitre" ) {
 249            // Si pas de presence de admin.sh
 250            if ( !is_file("/var/remote_adm/admin.sh") ) {
 251              // Renommage et chmod +x du script sur le maitre
 252              rename ("/var/remote_adm/tmp_".$stat_srv.".sh", "/var/remote_adm/admin.sh");
 253              chmod ("/var/remote_adm/admin.sh", 0750);
 254              if (file_exists("/var/remote_adm/admin.sh"))
 255                  echo $info_1;
 256              else echo $alerte_3;
 257            }  else {
 258              // Message d'alerte  : Presence d'un admin.sh !!
 259              echo $alerte_1.$stat_srv."&nbsp;".$cn_srv.$alerte_2;
 260            }
 261          // Si creation sur un esclave  copie du maitre vers l'esclave
 262          } elseif ( $stat_srv == "esclave" ) {
 263             //  Recherche de la presence d'un admin.sh sur le serveur esclave
 264             exec ("ssh -v -l remote_adm $ipHostNumber 'ls /var/remote_adm/admin.sh'", $AllOutput, $ReturnValue);
 265             // Si pas de presence de admin.sh sur l'esclave
 266             if (! $AllOutput[0]) {
 267               // Copie du script sur l'esclave avec scp
 268               exec ("/usr/bin/scp /var/remote_adm/tmp_$stat_srv.sh remote_adm@$ipHostNumber:tmp_$stat_srv.sh", $AllOutput, $ReturnValue);
 269               // chmod +x , renommage du script bash
 270               exec ("ssh -l remote_adm  $ipHostNumber 'chmod +x /var/remote_adm/tmp_$stat_srv.sh;mv  /var/remote_adm/tmp_$stat_srv.sh /var/remote_adm/admin.sh'", $AllOutput, $ReturnValue);
 271               if ($ReturnValue==0) {
 272                   // Effacement de tmp_esclave.sh cree sur le maitre
 273                  unlink ("/var/remote_adm/tmp_esclave.sh");
 274                   echo $info_1;
 275               } else echo $alerte_3;
 276             } else {
 277               // Message d'alerte : Presence d'un admin_esclave.sh !!
 278               echo $alerte_1.$stat_srv."&nbsp;".$cn_srv.$alerte_2;
 279             }
 280          }
 281        } else {
 282          echo "<div  class='error_msg'>".gettext("ERREUR : Impossible de cr&#233er le fichier d'ordonnancement de cr&#233ation de ressources classes !"). "</div>\n";
 283        }
 284      } // Fin creation du script bash
 285    } // Fin if is_admin
 286    include ("pdp.inc.php");
 287  ?>


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