:> jean-luc.chretien@tice.ac-caen.fr * @auteurs Equipe TICE Crdp de Caen * @auteurs Olivier LECLUSE * @Licence Distribue selon les termes de la licence GPL * @note Ce script est conserve pour le cas d'un serveur esclave avec repertoires classes deportes (utilise admind) * @note Remplace par rep_classe.php */ /** * @Repertoire: partages/ * file: synchro_folders_classes.php */ include "entete.inc.php"; include "ldap.inc.php"; include "ihm.inc.php"; require_once ("lang.inc.php"); bindtextdomain('se3-partages',"/var/www/se3/locale"); textdomain ('se3-partages'); $DEBUG = false; if (is_admin("se3_is_admin",$login)=="Y") { // Aide en ligne $titre=gettext("Aide en ligne"); $texte=gettext("

Vous êtes administrateur du serveur SE3.
Avec le menu ci-dessous, vous pouvez synchroniser les sous répertoires Classes avec la base des utilisateurs de votre annuaire.

Contexte d'usage :

  • Vous avez créé des ressources classes à partir du menu «Créer partages classes».
  • Vous avez ultérieurement créé des membres dans les groupes classes de votre annuaire.
  • Avec le menu «synchronisation répertoire classes» vous programmez un opération de synchrornisation entre le contenu des groupes Classes de l'annuaire et les sous répertoires de chaque classe, c'est à dire qu'il y aura création des sous-répertoires des nouveaux membres des groupes Classes et application des droits nécessaires aux membres des Equipes.

    La procédure de synchronisation se déroulera en deux phases :

  • 1çre phase : Recherche des ressources à synchroniser,
  • 2çme phase : Synchronisation des ressources.
  • Nota : Le processus de synchronisation (en particulier) dans le cas d'un serveur esclave peut être assez long, fin de synchronisation un compte rendu s'affichera dans votre navigateur et vous recevrez un mail.


    "); mkhelp($titre,$texte); // Fin Aide en ligne echo "

    ".gettext("Rafraichissement des classes")."

    "; #------------------------------------------ // Definition des messages d'alerte $alerte_1="
    ".gettext("Votre demande de synchronisation des ressources classes n'a pas été prise en compte car une tâche d'administration est en cours sur le serveur "); $alerte_2=gettext(", veuillez réitérer votre demande plus tard. Si le problçme persiste, veuillez contacter le super-utilisateur du serveur SE3.")."

    \n"; $alerte_3="
    ".gettext("Votre demande de synchronisation des ressources classes a échouée.  Si le problçme persiste, veuillez contacter le super-utilisateur du serveur SE3.")."

    \n"; $alerte_4="
    ".gettext("La recherche des ressources a synchroniser à échouée ! Si le problçme persiste, veuillez contacter le super-utilisateur du serveur SE3.")."

    \n"; $alerte_5="
    ".gettext("ERREUR : Impossible de créer le fichier d'ordonnancement (phase 2) de synchronisation des ressources classes !")."

    \n"; $alerte_6="
    ".gettext("ERREUR : Impossible de créer le fichier d'ordonnancement (phase 1) de recherche de synchronisation des ressources classes !")."
    \n"; // Definition des messages d'info $info_1 = gettext("[phase 1] Une tâche de recherche des ressources classe à synchroniser est ordonnancée...
    "); $info_2 = gettext("[phase 2] Une tâche de synchronisation est ordonnancée...
    Vous recevrez un mèl de compte rendu de synchronisation dans quelques instants..."); $info_3 = gettext("[phase 2] Il n'y a pas de ressources Classes à synchroniser sur le serveur "); // Prepositionnement variables $Verif_Empty = true; if ( mono_srv() ) { // configuration mono serveur : determination des parametres du serveur $serveur=search_machines ("(l=maitre)", "computers"); $cn_srv= $serveur[0]["cn"]; $stat_srv = $serveur[0]["l"]; $ipHostNumber = $serveur[0]["ipHostNumber"]; } else { // configuration multi-serveurs : presentation d'un form de selection du serveur if ( !$selected_srv && !$End_ph1) { echo "

    ".gettext("Sélection du serveur ou vous souhaitez créer la ressource classe :")."

    \n"; $servers=search_computers ("(|(l=esclave)(l=maitre))"); echo "
    \n"; for ($loop=0; $loop < count($servers); $loop++) { echo $servers[$loop]["description"]." ".$servers[$loop]["cn"]." 
    \n"; } $form="\n"; $form ="\n"; $form.="\n"; $form.="
    \n"; echo $form; } else { // Determination des parametres du serveur cible dans le cas d'une conf multi-serveurs $serveur=search_machines ("(cn=$cn_srv)", "computers"); $stat_srv = $serveur[0]["l"]; $ipHostNumber = $serveur[0]["ipHostNumber"]; } } // Fin selection et recherche des caracteristiques du serveur // Debut procedure de synchro if ( $stat_srv) { // [Phase 1] Synchronisation echo "

    ".gettext("Synchronisation en cours sur les classes :")."

    "; // Fabrication du script admin.shProfesseurs pour obtenir la liste des sous rep Classes_N // ainsi que les acl des professeurs $commandes = "#!/bin/bash\n"; $commandes .="#".gettext("Recherche des ressources classes présentes sur le serveur")." $stat_srv $cn_srv\n"; $commandes .="cd /var/se3/Classes\n"; $commandes .="for rep in *; do\n"; $commandes .=" echo Membres:\$rep:>> /tmp/synchro.txt\n"; $commandes .=" ls \$rep -I _travail -I _profs >> /tmp/synchro.txt\n"; #$commandes .=" echo Equipe:\$rep:>> /tmp/synchro.txt\n"; #$commandes .=" getfacl -d --omit-header \$rep | grep user >> /tmp/synchro.txt\n"; $commandes .="done\n"; $commandes.="touch /tmp/end_synchro\n"; if ( $stat_srv=="maitre") {$commandes.="chown www-se3:$defaultgid /tmp/synchro.txt /tmp/end_synchro\n";} else {$commandes.="chown remote_adm:lcs-users /tmp/synchro.txt /tmp/end_synchro\n";} $commandes.="chmod 666 /tmp/synchro.txt /tmp/end_synchro\n"; // Depot du script tmp_$stat_srv.sh sur le serveur maitre $fp=@fopen("/var/remote_adm/tmp_".$stat_srv.".sh","w"); if($fp) { fputs($fp,$commandes."\n"); fclose($fp); chmod ("/var/remote_adm/tmp_$stat_srv.sh", 0600); // Si serveur maitre renommage du script tmp_master.sh en admin.sh if ($stat_srv == "maitre" ) { // Si pas de presence de admin.sh if ( !is_file("/var/remote_adm/admin.sh") ) { // Renommage et chmod +x du script sur le maitre rename ("/var/remote_adm/tmp_".$stat_srv.".sh", "/var/remote_adm/admin.sh"); chmod ("/var/remote_adm/admin.sh", 0750); if (file_exists("/var/remote_adm/admin.sh")) { echo $info_1; $flag_sync = true; } else { echo $alerte_3; // Dans ce cas la procedure de synchronisation est interrompue exit; } } else { // Message d'alerte : Presence d'un admin.sh !! echo $alerte_1.$stat_srv." ".$cn_srv.$alerte_2; // Dans ce cas la procedure de synchronisation est interrompue exit; } } elseif ( $stat_srv == "esclave" ) { // Si serveur esclave : scp de admin.sh // Recherche de la presence d'un admin.sh sur le serveur esclave exec ("ssh -l remote_adm $ipHostNumber 'ls /var/remote_adm/admin.sh'", $AllOutput, $ReturnValue); // Si pas de presence de admin.sh sur l'esclave if (! $AllOutput[0]) { // Copie du script sur l'esclave avec scp exec ("/usr/bin/scp /var/remote_adm/tmp_$stat_srv.sh remote_adm@$ipHostNumber:tmp_$stat_srv.sh", $AllOutput, $ReturnValue); // chmod +x , renommage du script bash 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); if ($ReturnValue==0) { echo $info_1; $flag_sync = true; } else { echo $alerte_3; // Dans ce cas la procedure de synchronisation est interrompue exit; } } else { // Message d'alerte : Presence d'un admin_esclave.sh !! echo $alerte_1.$stat_srv." ".$cn_srv.$alerte_2; // Dans ce cas la procedure de synchronisation est interrompue exit; } } // Attente de synchro.txt et traitement du contenu dans le cas de srv esclave if ($stat_srv == "esclave" && $flag_sync ) { // Attente et transfert sur le srv maitre de synchro.txt dans le cas du srv esclave for ($wait=0; $wait<5; $wait++) { if ( is_file("/tmp/end_synchro") ) { break; } sleep (2); exec ("scp remote_adm@$ipHostNumber:/tmp/synchro.txt /tmp", $AllOutput, $ReturnValue); } // Effacement de synchro.txt et end_synchro sur srv esclave exec ("ssh -l remote_adm $ipHostNumber 'rm /tmp/end_synchro;rm /tmp/synchro.txt' ", $AllOutput, $ReturnValue); system("touch /tmp/end_synchro"); } // Attente de synchro.txt sur srv maitre if ($flag_sync ) { // Attente de synchro.txt $loop=0; while ( $loop < 1000000 && !is_file("/tmp/end_synchro") ) { $loop++; } } // Interpretation de synchro.txt si il est present dans le cas contraire : Msg d'alerte n°4 ! if ( is_file( "/tmp/synchro.txt" ) ) { // Interpretation de synchro.txt ##DEBUG1 if ($DEBUG) { echo gettext("interpretation")." synchro.txt
    "; } ## Fin DEBUG1 $loop=0; $loop1=0;$loop2=0; // Lecture du fichier de synchro et initialisation du tableau $T_Ressources : $file_synchro = @fopen ("/tmp/synchro.txt", "r") ; if ($file_synchro ) { while (!feof ( $file_synchro)) { // Chargement d'un tableau groupe et memberUid $res = fgets( $file_synchro, 50); if (preg_split("/^Membres:Classe_/", $res)) { $tmp = preg_split ("/[\:\]/",$res,3); $T_Classes[$loop]=$tmp[1]; $loop++; $loop1=0; $loop2=0; } elseif ( !preg_match("/^user:/", $res) && !preg_match("^Equipe:Classe", $res) && $res!="") { $T_Ressources[$T_Classes[$loop-1]]["memberUid"][$loop1]=$res; $loop1++; } /* elseif (preg_match("/^user:/",$res) && !preg_match("/user::rwx/",$res) && $res!="") { // elimination du bruit $tmp = preg_split ("/[\:\]/",$res,3); $T_Ressources[$T_Classes[$loop-1]]["member"][$loop2]=$tmp[1]; $loop2++; } */ } } // Effacer synchro.txt et le marqueur end_synchro exec (" rm /tmp/synchro.txt; rm /tmp/end_synchro"); ## DEBUG if ($DEBUG) { echo "/var/se3 => ".gettext("Nbr Rep Ressources :") .count ($T_Classes)."

    "; for ($loop=0; $loop"; echo gettext("Nbr Membres Classe: ").count ($T_Ressources[$T_Classes[$loop]]["memberUid"])."
    "; echo "
    "; for ($loop1=0; $loop1"; } echo "
    "; /* echo gettext("Nbr Membres Equipe: ").count ($T_Ressources[$T_Classes[$loop]]["member"])."
    "; echo "
    "; for ($loop2=0; $loop2"; } echo "
    "; */ } } ## Fin DEBUG // Recherche des membres des ressources dans l'annuaire et initialisation du tableau $T_Annuaire : for ($loop=0; $loop".gettext("Annuaire")." => ".gettext("Nbr Rep Ressources : ").count ($T_Classes)."

    "; for ($loop=0; $loop"; echo gettext("Nbr Membres Classe: ").count ($T_Annu[$T_Classes[$loop]]["memberUid"])."
    "; echo "
    "; for ($loop1=0; $loop1"; } /* echo "
    "; echo gettext("Nbr Membres Equipe: ").count ($T_Annu[$T_Classes[$loop]]["member"])."
    "; echo "
    "; for ($loop2=0; $loop2"; } echo "
    "; */ } } ## Fin DEBUG // Calcul d'un tableau differentiel de synchronisation for ($loop=0; $loop"; for ($loop1=0;$loop1"; for ($loop1=0;$loop1> ".count ($T_diff[$T_Classes[$loop]]["member"])."
    "; // Fin Calcul du tableau differentiel de synchronisation // Verification si il y a necessite d'une synchro for ($loop=0; $loop 0 # || count ($T_diff[$T_Classes[$loop]]["member"]) > 0 ) { $synchro=true; } else $synchro=false; if ($synchro) break; } // [Phase 2] Synchronisation if ($synchro) { // Affichage du contenu du tableau differentiel de synchronisation echo "

    ".gettext("Une opération de synchronisation est nécessaire sur")." :

    "; for ($loop=0; $loop 0 || count ($T_diff[$T_Classes[$loop]]["member"]) > 0 ) { echo "\n\n\n\n\n\n\n"; if ( count ($T_diff[$T_Classes[$loop]]["memberUid"]) > 0 ) { echo ""; } else echo ""; /* if ( count ($T_diff[$T_Classes[$loop]]["member"]) > 0 ) { echo ""; } else echo ""; */ echo "
    \n

    "; echo $T_Classes[$loop]."

    \n
    \n".gettext("Création des répertoire éleves pour :")."
    "; for ($loop1=0; $loop1"; } echo "".gettext("Pas d'élèves à ajouter").""; for ($loop2=0; $loop2"; } echo "".gettext("Pas de professeurs à ajouter")."

    "; } } // Fin Affichage du tableau differentiel de synchronisation // Fabrication du script admin.sh pour synchroniser les partages $commandes = "#!/bin/bash\n"; $commandes .= "#".gettext("Script de synchronisation des partages Classes\n"); # $commandes.="\n#".gettext("Application des acl posix pour les professeurs de l'equipe pedagogique\n"); for ($loop=0; $loop0) $commandes.="#".gettext("Creation des sous dossiers eleves\n"); for ($loop1=0; $loop1 0 || count ($T_diff[$T_Classes[$loop]]["member"]) > 0 ) $commandes.=$T_Classes[$loop]."\n"; } $commandes.= gettext("sur le serveur")." $stat_srv $cn_srv ".gettext("a été effectuée avec succès.\n"); $commandes.= "\n"; $commandes.= "EOF\n"; $commandes.= "mail -s \"$Subject\" $mel_adm < /tmp/admind.tmp\n"; // Fin Fabrication du script admin.sh pour synchroniser les partages ## DEBUG // Affichage du script admin.sh de synchro if ($DEBUG) { $tmp=$commandes; $tmp=preg_replace("/\n/","
    ",$tmp); echo $tmp."
    "; }## Fin DEBUG // Depot du script admin.sh sur le maitre $fp=@fopen("/var/remote_adm/tmp_".$stat_srv.".sh","w"); if($fp) { fputs($fp,$commandes."\n"); fclose($fp); chmod ("/var/remote_adm/tmp_$stat_srv.sh", 0600); // Si serveur maitre renommage du script tmp_master.sh en admin.sh if ($stat_srv == "maitre" ) { sleep (2); // Si pas de presence de admin.sh if ( !is_file("/var/remote_adm/admin.sh") ) { // Renommage et chmod +x du script sur le maitre rename ("/var/remote_adm/tmp_".$stat_srv.".sh", "/var/remote_adm/admin.sh"); chmod ("/var/remote_adm/admin.sh", 0750); if (file_exists("/var/remote_adm/admin.sh")) { echo $info_2; } else { echo $alerte_3; // Dans ce cas la procedure de synchronisation est interrompue exit; } } else { // Message d'alerte : Presence d'un admin.sh !! echo $alerte_1.$stat_srv." ".$cn_srv.$alerte_2; // Dans ce cas la procedure de synchronisation est interrompue exit; } } else { // Si serveur esclave : scp de admin.sh sur le srv esclave // Recherche de la presence d'un admin.sh sur le serveur esclave exec ("ssh -l remote_adm $ipHostNumber 'ls /var/remote_adm/admin.sh'", $AllOutput, $ReturnValue); // Si pas de presence de admin.sh sur l'esclave if (! $AllOutput[0]) { // Copie du script sur l'esclave avec scp exec ("scp /var/remote_adm/tmp_$stat_srv.sh remote_adm@$ipHostNumber:tmp_$stat_srv.sh", $AllOutput, $ReturnValue); // chmod +x , renommage du script bash 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); if ($ReturnValue==0) { echo $info_2; // Effacement de tmp_esclave.sh créé sur le maitre unlink ("/var/remote_adm/tmp_esclave.sh"); } else { echo $alerte_3; // Dans ce cas la procedure de synchronisation est interrompue exit; } } else { // Message d'alerte : Presence d'un admin_esclave.sh !! echo $alerte_1.$stat_srv." ".$cn_srv.$alerte_2; // Dans ce cas la procedure de synchronisation est interrompue exit; } } } else { echo $alerte_5; } } else { echo $info_3.$stat_srv." ".$cn_srv."."; } } else { echo $alerte_4; } } else { echo $alerte_6; } } } // Fin is_admin include ("pdp.inc.php"); ?>