[ Index ]

PHP Cross Reference of Unnamed Project

title

Body

[close]

/se3master/var/www/se3/annu/ -> replica.php (source)

   1  <?php
   2  
   3  
   4     /**
   5     
   6     * Met en place la replication d'annuaire
   7     * @Version $Id: replica.php 8084 2014-03-24 22:12:01Z keyser $ 
   8     
   9     * @Projet LCS / SambaEdu 
  10     
  11     * @auteurs Philippe Chadefaux
  12  
  13     * @Licence Distribue selon les termes de la licence GPL
  14     
  15     * @note 
  16     * @sudo /usr/share/se3/scripts/mkSlapdConf.sh
  17     */
  18  
  19     /**
  20  
  21     * @Repertoire: annu
  22     * file: replica.php
  23     */
  24  
  25  
  26  
  27  
  28  require  "entete.inc.php";
  29  require  "ihm.inc.php";
  30  require "config.inc.php";
  31   
  32  require_once  ("lang.inc.php");
  33  bindtextdomain('se3-annu',"/var/www/se3/locale");
  34  textdomain ('se3-annu');
  35        
  36  if (is_admin("system_is_admin",$login)!="Y")
  37      die (gettext("Vous n'avez pas les droits suffisants pour acc&#233;der &#224; cette fonction")."</BODY></HTML>");
  38  
  39  $texte_alert=gettext("Attention vous risquez de perdre le contrôle de votre serveur. Voir la documentation avant de mettre cela en oeuvre. Etes vous sure de vouloir continuer ?");
  40  
  41  ?>
  42  <script language="JavaScript">
  43      
  44      
  45      /**
  46      * Affiche une boite de dialogue pour demander confirmation
  47      * @language Javascript
  48      * @Parametres
  49      * @return 
  50      */
  51  
  52  	function areyousure()
  53      {
  54          var messageb = "<?php echo "$texte_alert"; ?>";
  55          if (confirm(messageb))
  56              return true;
  57          else
  58              return    false;
  59      }
  60  </script>
  61  
  62  <?php
  63  // Aide
  64  $_SESSION["pageaide"]="R%C3%A9plication_d%27annuaires";
  65  
  66  echo "<h1>".gettext("R&#233;plication de l'annuaire LDAP")."</h1>";
  67  
  68  
  69  // *******************************//
  70  $action = $_POST['action'];
  71  $replica = $_POST['replica'];
  72  $ip = $_POST['ip'];
  73  $syncrepl = $_POST['syncrepl'];
  74  
  75  
  76  // ######################################################################
  77  // ################### Creation du champ manquant #########################
  78  
  79  $result=mysql_query("SELECT name from params where name='replica_status'");
  80  $num = mysql_numrows( $result);
  81  if ($num == "0" ) {
  82      $resultat=mysql_query("INSERT into params set id='NULL', name='replica_status', value='0', srv_id='0',descr='Etat du serveur de r&#233;plication',cat='4'");
  83      $resultat=mysql_query("UPDATE params set descr='Adresse du serveur Lcs ou Slis (optionnel)' where name='lcsIp'");
  84      $resultat=mysql_query("INSERT into params set id='NULL', name='replica_ip', value='', srv_id='0',descr='Adresse IP du serveur de r&#233;plication',cat='4'");
  85  
  86  }
  87  
  88  // ###################### FIN #############################################
  89  
  90  // Si replica est vide
  91  if ($action != "") {
  92      if ($replica == "") {
  93          $result=mysql_query("SELECT * from params where name='replica_status'");
  94          if ($result)
  95                  while ($r=mysql_fetch_array($result)) {
  96                         $replica=$r[2];
  97              }
  98      }
  99  }
 100  
 101  // Validation de la page
 102  if ($action == "Ok" || $replica=="0") { 
 103      // Test la connexion au serveur LDAP maitre ou esclave
 104      if ($replica == "1" || $replica == "2" || $replica == "3" || $replica == "4") {
 105          // test la validite de l'ip
 106          if (!is_string($ip)) { $ok = 0;}
 107          $ip_long = ip2long($ip);
 108          $ip_revers = long2ip($ip_long);
 109          if ($ip != $ip_revers) { $ok = 0; }
 110      
 111          $result=mysql_query("SELECT * from params where name='adminRdn'");
 112          if ($result)
 113                  while ($r=mysql_fetch_array($result)) {
 114                      $adminRdn=$r[2];
 115              }
 116      
 117          $result=mysql_query("SELECT * from params where name='adminPw'");
 118          if ($result)
 119                  while ($r=mysql_fetch_array($result)) {
 120                      $adminPw=$r[2];
 121              }
 122  
 123          $result=mysql_query("SELECT * from params where name='ldap_base_dn'");
 124          if ($result)
 125                  while ($r=mysql_fetch_array($result)) {
 126                      $basedn=$r[2];
 127              }
 128          
 129          $admin_dn="$adminRdn,$basedn";
 130  
 131          $ldapconn = ldap_connect("$ip");
 132          if ($ldapconn) {    //Connexion au serveur LDAP   
 133              $ldapbind = @ldap_bind($ldapconn, $admin_dn, $adminPw);    // Identification    
 134              if ($ldapbind) {        
 135                  $ldap_ok="1";  // Connexion LDAP reussie
 136              } else {
 137                  $ldap_ok="0"; // Connexion LDAP echouee
 138              }
 139          } else {
 140              $ldap_ok="0";
 141          }
 142      }
 143  
 144      //Si pas d'erreurs on peut modifier dans la table et lancer le script 
 145      if ($ok != "0" && $ldap_ok != "0") {
 146          
 147          //Lance le script mkslapd
 148          $resultat=mysql_query("SELECT * from params where name='ldap_server'");
 149          if ($resultat)
 150                  while ($r=mysql_fetch_array($resultat)) {
 151                      $IP_ldap=$r[2];
 152              }
 153          //On verifie l'etat anterieur avant de modifier        
 154          $result=mysql_query("SELECT * from params where name='replica_status'");
 155          if ($result)
 156                  while ($r=mysql_fetch_array($result)) {
 157                         $maitre=$r[2];
 158              }
 159          if ($maitre=="2" || $maitre=="4") { // etait en esclave avant on recupere l'adresse ip du maitre    
 160              $result=mysql_query("SELECT * from params where name='replica_ip'");
 161                 if ($result)
 162                         while ($r=mysql_fetch_array($result)) {
 163                             $ip_maitre=$r[2];
 164                  }
 165          } else { // sinon son adresse IP 
 166              $result=mysql_query("SELECT * from params where name='ldap_server'");
 167                 if ($result)
 168                  while ($r=mysql_fetch_array($result)) {
 169                          $ip_maitre=$r[2];
 170                  }
 171          }
 172              
 173          if ($replica == "0") {
 174              $ip = "";
 175              $options = "-e";
 176              $resultat=mysql_query("UPDATE params set cat='2' where name='ldap_server'");
 177              //Si on etait esclave avant on doit changer l'IP
 178  
 179              if ($maitre == $replica) {
 180                  $resultat=mysql_query("UPDATE params set value='' where name='replica_ip'");
 181  //            }
 182  //            elseif ($maitre=="1" || $maitre=="3") {
 183  //                       $resultat=mysql_query("UPDATE params set value='$ip_maitre' where name='ldap_server'");
 184  //                       $resultat=mysql_query("UPDATE params set value='$ip' where name='replica_ip'");
 185                  
 186              } else {    
 187                  $resultat=mysql_query("UPDATE params set value='$ip_maitre' where name='ldap_server'");
 188                  $resultat=mysql_query("UPDATE params set value='$ip' where name='replica_ip'");
 189              }
 190          }
 191  
 192          if ($replica == "1" || $replica == "3") {
 193              //si pas de compte indique on utilise le compte AdmRdn et le MdP AdmPw
 194              $options = "-c -m";  
 195              $resultat=mysql_query("UPDATE params set cat='4' where name='ldap_server'");
 196               if ($maitre == $replica) {
 197                  $resultat=mysql_query("UPDATE params set value='$ip' where name='replica_ip'");
 198              }
 199              elseif ($maitre=="2") {
 200                         $resultat=mysql_query("UPDATE params set value='$ip_maitre' where name='ldap_server'");
 201                     $resultat=mysql_query("UPDATE params set value='$ip' where name='replica_ip'");
 202              } else {
 203                  $resultat=mysql_query("UPDATE params set value='$ip' where name='replica_ip'");
 204                     $resultat=mysql_query("UPDATE params set value='$ip_maitre' where name='ldap_server'");
 205              }
 206          }
 207              
 208          if ($replica == "2" || $replica == "4") {    
 209              //si pas de compte indique on utilise le compte AdmRdn et le MdP AdmPw
 210              $options = "-c -s";  
 211              $resultat=mysql_query("UPDATE params set cat='4' where name='ldap_server'");
 212              if ($maitre == $replica) {
 213                  $resultat=mysql_query("UPDATE params set value='$ip' where name='ldap_server'");
 214              } else {
 215                  $resultat=mysql_query("UPDATE params set value='$ip_maitre' where name='replica_ip'");
 216                  $resultat=mysql_query("UPDATE params set value='$ip' where name='ldap_server'");
 217              }
 218          }
 219  
 220  
 221          $resultat=mysql_query("UPDATE params set value='$replica' where name='replica_status'");
 222              
 223          // Lancement des scripts
 224          exec ("/usr/bin/sudo /usr/share/se3/scripts/mkSlapdConf.sh");    
 225      } else {
 226          if ($ok == "0") {
 227                 echo "<font color=\"rouge\">".gettext("L'adresse IP n'est pas conforme ou absente")."</font><br>";
 228          }
 229          if ($ldap_ok == "0") {
 230              echo "<font color=\"rouge\">".gettext("Impossible de se connecter au serveur LDAP distant")."</font>";
 231          }
 232      }
 233  }
 234  
 235  // Interface
 236  $replica_status="$replica";
 237  if ($replica == "") {    
 238      $result=mysql_query("SELECT * from params where name='replica_status'");
 239      if ($result)
 240              while ($r=mysql_fetch_array($result)) {
 241                  $replica_status=$r[2];
 242          }
 243  }
 244  
 245  
 246  // Verification si l'annuaire est deporte
 247  $nom_se3=exec('/bin/hostname');
 248  $ip_se3=gethostbyname($nom_se3);
 249  if (($ip_se3 == $ldap_server) || ($ldap_server == "localhost") || ($ldap_server == "127.0.0.1")) {
 250  
 251      $ldap_deport = "no";
 252  } else {
 253      //cas ou il est en esclave
 254      if($replica_ip!="") {
 255          $ldap_deport = "no";
 256      } else {    
 257          $ldap_deport = "yes";
 258      }    
 259  }    
 260  
 261  ?>
 262  
 263  <H3><?php echo gettext("Mise en place de la r&#233;plication de l'annuaire"); ?></H3>
 264  
 265    <form name = "auth" action="replica.php" method="post">
 266        <table border="0" width="90%">
 267        <tbody>
 268          <tr>
 269          <td colspan=3>
 270          <font color="orange"><center><?php echo gettext("Attention, la mise en place de la r&#233;plication peut provoquer la perte de votre annuaire, <br>Il est vivement conseill&#233; de faire une sauvegarde de celui-ci avant toute modification."); ?></center></font><br><br>
 271          <?php
 272          if ($ldap_deport=="yes") {
 273          ?>
 274          <font color="orange"><center><?php echo gettext("Votre annuaire est actuellement d&#233;port&#233; sur une autre machine. Il risque donc de ne contenir aucune entr&#233;e. Vous ne pouvez pas en cons&#233;quence le placer comme serveur d'annuaire ma&#238;tre"); ?></center></font><br><br>
 275          <?php } ?>
 276          </td>
 277          </tr>
 278          <tr>
 279            <td><?php echo gettext("Etat du serveur"); ?>&nbsp; :&nbsp;</td>
 280            <td>
 281          <input type="hidden" name="action" value="SUB">
 282                  <select name="replica" onchange=submit()>
 283            <?php 
 284            // Cas ou l'annuaire est deporte
 285            if ($ldap_deport=="no") {
 286            ?>
 287                <option <?php if ($replica_status == "0") {echo "selected"; } ?> value="0"><?php echo gettext("Serveur non r&#233;pliqu&#233;"); ?></option>
 288            // Cas ou l'annuaire est deporte
 289           if ($ldap_deport=="no") {
 290          ?>
 291            <option <?php if ($replica_status == "3") {echo "selected"; } ?> value="3"><?php echo gettext("Serveur LDAP principal (m&#233;thode syncrepl)"); ?></option>
 292            <?php } ?>
 293            <option <?php if ($replica_status == "4") {echo "selected"; } ?> value="4"><?php echo gettext("Serveur LDAP secondaire (m&#233;thode syncrepl)"); ?></option>
 294          </select>
 295            </td>
 296                <td>
 297  <?php
 298  if ($ldap_deport=="no") {
 299  echo "<u onmouseover=\"this.T_SHADOWWIDTH=5;this.T_STICKY=1;return escape".gettext("('Vous pouvez choisir de mettre en place une r&#233;plication, ou de la supprimer pour votre annuaire LDAP.<br>Le but est de disposer d\'un second annuaire sur une seconde machine.<br> Pour cela vous avez quatre possibilit&#233;s :<br><br><b>Serveur LDAP principal (ou ma&#238;tre)</b><br>Cette machine dispose de l\'annuaire de r&#233;ferrence. Les autres machines, ne disposeront que d\'une r&#233;plique. Seule les modifications faites sur l\'annuaire de cette machine seront prises en compte.<br><br><b>Serveur LDAP secondaire (ou esclave)</b><br>Cette machine ne disposera que d\'une r&#233;plique de l\'annuaire du serveur principal.<br><br><b>Serveur principal (m&#233;thode syncrepl)</b><br>M&#234;me chose que pour le serveur LDAP principal, mais la m&#233;thode change. Celle-ci est plus performante que la pr&#233;c&#233;dente, mais ne peut fonctionner avec tous les serveurs. Voir la documentation.<br><br><b>Serveur secondaire (m&#233;thode syncrepl)</b><br>Idem, mais attention cette option d&#233;truit compl&#233;tement l\'annuaire local (il est sauvegard&#233; automatiquement dans /var/se3/save).<br><br><b>Attention</b><br>Toutes les entr&#233;es existant dans cet annuaire et n\'existant pas sur le ma&#238;tre seront perdues.<br><br>Si vous souhaitez d&#233;porter l\'annuaire sur une autre machine, il vous faut aller dans le mode sans &#233;chec, et indiquer l\'adresse IP du serveur disposant de votre annuaire.<br><br><b>Il est vivement conseill&#233; de faire une sauvegarde de votre annuaire avant de faire des modifications.</b> ')")."\"><img name=\"action_image2\"  src=\"../elements/images/system-help.png\"></u>\n";
 300  } else {
 301  
 302  echo "<u onmouseover=\"this.T_SHADOWWIDTH=5;this.T_STICKY=1;return escape".gettext("('Votre annuaire LDAP est actuellement d&#233;port&#233; sur un autre serveur. Il est possible qu\'il ne contienne aucune entr&#233;e. Vous ne pouvez donc pas le d&#233;finir comme ma&#238;tre, au risque d\'en perdre le contr&#244;le.<br>Pour le reconstruire compl&#233;tement &#224; partir de votre serveur LDAP actuel, placez vous en esclave m&#233;thode syncrepl et l\'autre serveur en ma&#238;tre. Il vous sera alors possible de le rebasculer en ma&#238;tre par la suite.<br><b>Attention : toute modification sur l\'annuaire peut avoir des cons&#233;quences importantes. Il est donc conseill&#233; de le sauvegarder avant.')")."\"><img name=\"action_image2\"  src=\"../elements/images/system-help.png\"></u>\n";
 303  }
 304  ?>
 305  
 306                </td>
 307          </tr>
 308     </form>    
 309     <form name="truc" action="replica.php" method="post" onSubmit="return areyousure()">
 310  
 311  <?php
 312  
 313  // Affichage si on a un esclave ou un maitre
 314  if ($replica == "1" || $replica == "2" || $replica_status=="1" || $replica_status=="2" || $replica == "3" || $replica == "4" || $replica_status == "3" || $replica_status == "4") {
 315      $resultat=mysql_query("SELECT * from params where name='replica_ip'");
 316      
 317      if ($resultat)
 318            while ($r=mysql_fetch_array($resultat)) {
 319                  $replica_ip=$r[2];
 320          }   
 321      
 322      echo "<tr>\n";
 323  
 324      // recup l'adresse IP de l'esclave dans la base sql
 325      if($replica== "1" || $replica_status=="1" || $replica == "3" || $replica_status=="3") {
 326          echo"<td>".gettext("Adresse IP du serveur esclave")." :&nbsp;</td>";
 327          $resultat=mysql_query("SELECT * from params where name='replica_ip'");
 328          if ($resultat)
 329                while ($r=mysql_fetch_array($resultat)) {
 330                          $replica_ip=$r[2];
 331              }
 332      }
 333      
 334      // recup l'adresse IP du maitre dans la base sql          
 335      if($replica== "2" || $replica_status=="2" || $replica == "4" || $replica_status == "4") {
 336          echo"<td>".gettext("Adresse IP du serveur ma&#238;tre")."  :&nbsp;</td>";
 337          $resultat=mysql_query("SELECT * from params where name='ldap_server'");
 338          if ($resultat)
 339                while ($r=mysql_fetch_array($resultat)) {
 340                          $replica_ip=$r[2];
 341              }
 342  
 343      }
 344              
 345      // Pour vider l'adresse IP en cas de re-select
 346      if ($action=="SUB") {
 347          $replica_ip="";
 348      }    
 349  ?>
 350              
 351      <td><input type="text" name="ip" value="<?php echo "$replica_ip"; ?>" size="20"></td>
 352          <td>
 353  
 354  <?php
 355      echo "<u onmouseover=\"this.T_SHADOWWIDTH=5;this.T_STICKY=1;return escape".gettext("('<b>Adresse IP du serveur ma&#238;tre</b><br>Vous devez indiquer l\'adresse IP du serveur LDAP ma&#238;tre.<br><br><b>Adresse IP du serveur esclave</b><br>Vous devez indiquer l\'adresse IP du serveur esclave.<br><br><b>Attention</b> Afin de pouvoir mettre en place la r&#233;plication, il faut que le serveur distant (ma&#238;tre ou esclve) soit joignable.')")."\"><img name=\"action_image2\"  src=\"../elements/images/system-help.png\"></u>\n";
 356      echo "</td>\n";
 357      echo "</tr>\n";
 358  
 359  
 360  ?>        
 361  
 362          <tr>
 363              <td></td>
 364                    <td align="left">
 365              <?php
 366                    echo"<input type=\"hidden\" name=\"replica\" value=\"$replica\">";
 367              ?>
 368              <input type="hidden" name="action" value="Ok">
 369              <input type="submit" value="<?php echo gettext("Modifier"); ?>">
 370                        </td>
 371                <td></td>
 372              </tr>
 373          <?php } ?>    
 374        </tbody>
 375          </table>
 376        </form>
 377  
 378      <?php
 379  
 380  //log l'etat de la replication
 381  
 382  $result=mysql_query("SELECT * from params where name='replica_status'");
 383  if ($result)
 384          while ($r=mysql_fetch_array($result))
 385              {
 386              $status=$r[2];
 387          }
 388  
 389  if ($status == "1" || $status == "2" || $status == "3" || $status == "4") {
 390      if ($status == "1" || $status == "3") { $options = "m"; }
 391      if ($status == "2" || $status == "4") { $options = "s"; }
 392  ?>
 393      <br>
 394      <H3><?php echo gettext("Contr&#244;ler et synchroniser les annuaires"); ?></H3>
 395        <form action="replica_log.php" method="post">
 396        <input type="hidden" name="ip" value=<?php echo "$replica_ip"; ?>>
 397        <input type="hidden" name="status" value=<?php echo"$options"; ?>>
 398        <input type="hidden" name="action" value="ok">
 399  
 400        <table border="0" width="70%">
 401         <tbody>
 402          <tr>
 403             <td align='left'><input type="radio" name="type" value="anonymous" checked="on"></td>
 404             <td><?php echo gettext("Comparer les deux annuaires"); ?></td>
 405          <td>
 406          <?php
 407          echo "<u onmouseover=\"this.T_SHADOWWIDTH=5;this.T_STICKY=1;return escape".gettext("('Compare les annuaires entre le serveur principal (ma&#238;tre) et le serveur secondaire (esclave).<br><br>Cette fonction ne modifie  aucun des deux annuaires. ')")."\"><img name=\"action_image2\"  src=\"../elements/images/system-help.png\"></u>\n";
 408          ?>
 409          </td>    
 410         </tr>
 411         <tr>
 412             <td align="center" colspan="3" height="51"><font color="orange"><?php echo gettext("Il est vivement conseill&#233; pour les deux autres choix de faire un export LDAP avant"); ?></font></td>
 413         <tr>
 414         
 415             <td align='left'><input type="radio" name="type" value="only_pass"></td>
 416            <td><?php echo gettext("Ajouter les entrees manquantes et synchroniser les mots de passe (par rapport au ma&#238;tre)"); ?></td>
 417          <td>
 418          <?php
 419          echo "<u onmouseover=\"this.T_SHADOWWIDTH=5;this.T_STICKY=1;return escape".gettext("('Cette option va modifier les entr&#233;es de l\'annuaire secondaire (esclave) en modifiant les entr&#233;es qui ne sont pas identiques, entre le ma&#238;tre et l\'esclave.<br> Les entr&#233;es du serveur secondaire (esclave) seront modifi&#233;es.')")."\"><img name=\"action_image2\"  src=\"../elements/images/system-help.png\"></u>\n";
 420          ?>
 421          </td>
 422         </tr>
 423         <tr>
 424  
 425             <td align='left' height="51"><input type="radio" name="type" value="full"></td>
 426             <td><?php echo gettext("Synchroniser la totalit&#233; des deux annuaires (par rapport au ma&#238;tre)"); ?></td>
 427          <td>
 428          <?php
 429          echo "<u onmouseover=\"this.T_SHADOWWIDTH=5;this.T_STICKY=1;return escape".gettext("('Cette option va modifier les entr&#233;es de l\'annuaire secondaire (esclave) en modifiant les entr&#233;es qui ne sont pas identiques entre le ma&#238;tre et l\'esclave, et en ajoutant les entr&#233;es manquantes  et en supprimant les entr&#233;es en trop dans l\'esclave.<br><br><b>Les entr&#233;es du serveur secondaire (esclave) seront modifi&#233;es, voire supprim&#233;es</b>.')")."\"><img name=\"action_image2\"  src=\"../elements/images/system-help.png\"></u>\n";
 430          ?>
 431             </td>
 432         </tr>        
 433         <tr>
 434             
 435             <td align="center" colspan='2'><input type="submit" value="<?php echo gettext("Contr&#244;ler la r&#233;plication"); ?>"><td>
 436         </tr>
 437        </tbody>
 438      </table>  
 439     </form>    
 440  <?php
 441  } 
 442    
 443  include "pdp.inc.php";
 444  ?>


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