[ Index ]

PHP Cross Reference of Unnamed Project

title

Body

[close]

/se3master/usr/lib/perl5/ -> Se.pm (source)

   1  #!/usr/bin/perl
   2  #
   3  # $Id: Se.pm 8300 2014-12-06 15:20:12Z dbo $ #
   4  #
   5  
   6  use CGI qw(:standard :html3);
   7  use Encode::compat;
   8  use Encode qw(encode decode);
   9  use Text::Unaccent;
  10  use Net::LDAP;
  11  use Net::Domain;
  12  use CGI::Cookie;
  13  use DBI;
  14  
  15  #$domain = Net::Domain::hostdomain();
  16  #$hostname = Net::Domain::hostfqdn();
  17  
  18  require '/etc/SeConfig.ph';
  19  
  20  # Pour stoker les UID transmis par le fichier f_uid.txt
  21  %Admin_UID = ();
  22  
  23  # Définition des formats DBF
  24  # --------------------------
  25  %format = (
  26         'f_ele'  => 'A5A25A25xA8A1x163A5',
  27         'f_men'  => 'x6A5x3A8x16A10',
  28         'f_div'  => 'xA5A20x7A10',
  29         'f_gro'  => 'xA8A20',
  30         'f_eag'  => 'A5A8',
  31         'f_tmt'  => 'x6A5x20A40',
  32         'f_wind' => 'xA10x16A20A15x20A8x2A1',
  33           'a_ind'  => 'xA10x16A20A15x20A8x2A1'
  34        );
  35  %verif =  (
  36         'f_ele'  => '4802,598',
  37         'f_men'  => '546,88',
  38         'f_div'  => '322,45',
  39         'f_gro'  => '290,38',
  40         'f_eag'  => '98,14',
  41         'f_tmt'  => '290,77',
  42         'f_wind' => '1058,306',
  43           'a_ind'  => '706,251'
  44        );
  45  
  46  # Définition des formats TXT
  47  # --------------------------
  48  %formatTxt = (
  49         'f_ele'  => '6',
  50         'f_men'  => '3',
  51         'f_div'  => '3',
  52         'f_wind' => '5'
  53        );
  54  
  55  
  56  # Fonction d'écriture de l'entête HTML
  57  # ====================================
  58  sub entete {
  59    $handle = shift(@_);
  60    print $handle header(-type=>'text/html') if $handle eq 'STDOUT';
  61    print $handle
  62     start_html(-title  => 'Importation de données dans l\'annuaire LDAP',
  63             -author => 'olivier.le_monnier@tice.ac-caen.fr',
  64             -style  => {-src=>"/gepcgi/style/style.css"}),
  65      h1("<a style=\"color: #404044; text-decoration: none\" href=\"/$webDir/result.$pid.html\">Importation</a> de données dans l\'annuaire LDAP"),
  66      hr();
  67  }
  68  
  69  # Fonction d'écriture du pied de page HTML
  70  # ========================================
  71  sub pdp {
  72    $handle = shift(@_);
  73    print $handle
  74      "<hr>\n",
  75      "<div style=\"font-size: xx-small; text-align: right\">\n",
  76      "<address><a href=\"mailto:LcsDevTeam\@tice.ac-caen.fr\">&lt; LcsDevTeam\@tice.ac-caen.fr &gt;</a></address>\n",
  77      "Mis à jour : le 5 juillet 2004",
  78      "</div>\n",
  79      end_html();
  80  }
  81  
  82  sub dbf2txt {
  83    my $fichier = shift;
  84    open ( FICHTMP ,"</tmp/ApacheCgi.temp");
  85    seek FICHTMP, 4, 0;
  86    # Séparation entête/corps
  87    read( FICHTMP, $header, 8);
  88    @param = unpack 'LSS', $header;
  89    ($nb_enreg, $h_size, $l_enreg) = @param;
  90    # Vérification des tailles de l'entête et d'un enregistrement
  91    # -----------------------------------------------------------
  92    if ($verif{$fichier} ne "$h_size".","."$l_enreg") {
  93      $res = "$h_size,$l_enreg,$verif{$fichier}";
  94    } else {
  95      $res = 0;
  96      # Écriture du fichier nettoyé
  97      # ---------------------------
  98      open DATA, ">/tmp/$fichier.temp";
  99      seek FICHTMP, $h_size+1, 0;
 100      while ( $nb_enreg ) {
 101        read( FICHTMP, $record, $l_enreg);
 102        #print "<tt>$format{$fichier}</tt> : $record<br>\n";
 103        $data = join '|', (unpack $format{$fichier}, $record);
 104        print DATA encode("utf8", decode("cp850", $data)), "\n";
 105        $nb_enreg--;
 106      }
 107    }
 108    close DATA;
 109    close FICHTMP;
 110    unlink '/tmp/ApacheCgi.temp';
 111    # Renvoie 0 ou les valeurs comparées
 112    # ----------------------------------
 113    return $res;
 114  }
 115  
 116  sub txtVerif {
 117    my $fichier = shift;
 118    open ( FICHTMP ,"</tmp/ApacheCgi.temp");
 119    open DATA, ">/tmp/$fichier.temp";
 120    $res = 0;
 121    while (<FICHTMP>) {
 122      #leb Ajout
 123      chomp($ligne = $_); 
 124      $ligne =~ s/\r//g;
 125      $ligne =~ s/\s+$//;
 126      $_ = encode("utf8", decode("cp1252", $ligne))."\n";
 127      #leb Fin Ajout
 128      $format = split /\|/, $_;
 129      if ($format ne $formatTxt{$fichier}) {
 130        close DATA;
 131        unlink "/tmp/$fichier.temp";
 132        $res = 1;
 133        last;
 134      }
 135      print DATA;
 136    }
 137    # Renvoie 0 ou 1
 138    # --------------
 139    close DATA;
 140    close FICHTMP;
 141    unlink '/tmp/ApacheCgi.temp';
 142    return $res;
 143  }
 144  
 145  sub mkUid {
 146  
 147    my ( $prenom, $nom ) = @_;
 148  
 149    # Génération de l'UID suivant la politique
 150    # définie dans le fichier de conf commun
 151  
 152    if (($uidPolicy == 0) || ($uidPolicy == 1)) {
 153      $uid = $prenom . "." . $nom;
 154    } elsif (($uidPolicy == 2) || ($uidPolicy == 3)) {
 155      $prenom =~ /^(\w)/;
 156      $uid = $1 . $nom;
 157    } elsif ($uidPolicy == 5) {
 158      $uid = $nom . $prenom;
 159      $uid =~ s/[\s-_]//;
 160      if (length($uid) > 18) {
 161          $uid =~ /^(.{18})/;
 162      $uid = $1;
 163      }        
 164    } elsif ($uidPolicy == 4) {
 165      $uid = $nom;
 166      if (length($nom) > 6) {
 167        $uid =~ /^(.{7})/;
 168        $uid = $1;
 169      }
 170      $prenom =~ /^(\w)/;
 171      $uid .= $1;
 172    }
 173    if ((($uidPolicy == 1) || ($uidPolicy == 2)) && (length($uid) > 19)) {
 174      $uid =~ /^(.{19})/;
 175      $uid = $1;
 176    } elsif (($uidPolicy == 3) && (length($uid) > 8)) {
 177      $uid =~ /^(.{8})/;
 178      $uid = $1;
 179    }
 180    return(lc($uid));
 181  }
 182  
 183  sub sambaAttrs {
 184  
 185    use Crypt::SmbHash;
 186  
 187    my ( $uidNumber, $gid, $password ) = @_;
 188    $rid = 2 * $uidNumber + 1000;
 189    $pgrid = 513;
 190    ( $lmPassword, $ntPassword ) = ntlmgen $password;
 191    return ( $rid, $pgrid, $lmPassword, $ntPassword );
 192  
 193  }
 194  
 195  sub getFirstFreeUid {
 196          my $FFuidNumber = 1001; # n° à partir duquel la recherche est lancée
 197          my $increment = 1024; # doit etre une puissance de 2
 198          if (defined(getpwuid($FFuidNumber))) {
 199                  do {
 200                          $FFuidNumber += $increment;
 201                  } while (defined(getpwuid($FFuidNumber)));
 202                  
 203                  $increment = int($increment / 2); 
 204                  $FFuidNumber -= $increment;
 205                  do {
 206                          $increment = int($increment / 2); 
 207                          if (defined(getpwuid($FFuidNumber))) {
 208                                  $FFuidNumber += $increment;
 209                          } else {
 210                                  $FFuidNumber -= $increment;
 211                          }
 212                  } while $increment > 1;
 213                  # la boucle suivante est normalement exécutée au plus une fois
 214                  while (defined(getpwuid($FFuidNumber))) {
 215                          $FFuidNumber++;
 216                  }
 217          }
 218          return $FFuidNumber;
 219  }
 220  
 221  sub getFirstFreeGid {
 222          my $FFgidNumber = 2000; # n° à partir duquel la recherche est lancée
 223          my $increment = 1024; # doit etre une puissance de 2
 224          if (defined(getgrgid($FFgidNumber))) {
 225                  do {
 226                          $FFgidNumber += $increment;
 227                  } while (defined(getgrgid($FFgidNumber)));
 228                  
 229                  $increment = int($increment / 2); 
 230                  $FFgidNumber -= $increment;
 231                  do {
 232                          $increment = int($increment / 2); 
 233                          if (defined(getgrgid($FFgidNumber))) {
 234                                  $FFgidNumber += $increment;
 235                          } else {
 236                                  $FFgidNumber -= $increment;
 237                          }
 238                  } while $increment > 1;
 239                  # la boucle suivante est normalement exécutée au plus une fois
 240                  while (defined(getgrgid($FFgidNumber))) {
 241                          $FFgidNumber++;
 242                  }
 243          }
 244          
 245          return $FFgidNumber;
 246  }
 247  
 248  sub incrementUidInit {
 249    while (@data = getpwent()) {
 250      $increment{$data[0]} = 1;
 251    }
 252    return %increment;
 253  }
 254  
 255  sub processGepUser {
 256  
 257    my ( $uniqueNumber, $nom, $prenom, $date, $sexe, $password ) = @_;
 258    if ($password eq 'undef') { $password = $date }
 259    ( $uid, $cn, $givenName, $sn, $crypt, $gecos ) = gep2posixAccount( $prenom, $nom, $password, $date, $sexe );
 260    # S'il existe un UID issu du fichier f_uid on le prend
 261    $uid = $Admin_UID{$uniqueNumber} || $uid;
 262    # Recherche EMPLOYEENUMBER correspondant dans l'annuaire
 263    if ($uniqueNumber =~ /^P(.*)$/) {
 264      $searchString = $1;
 265    } else {
 266      $searchString = $uniqueNumber;
 267    }
 268    $res = $lcs_ldap->search(base     => "$peopleDn",
 269                 scope    => 'one',
 270                 filter   => "(|(employeeNumber=$searchString)(employeeNumber=$uniqueNumber))");
 271    warn $res->error if $res->code;
 272    if (($res->entries)[0] and $uniqueNumber ne 'undef') {
 273      # S'il existe : actualisation des entrées CN et SN et employeeNumber
 274      $uid = (($res->entries)[0])->get_value('uid');
 275      updateUserCSn();
 276      $cn = encode('latin1', decode('utf8', $cn));
 277      return ("<tr><td>Entrée <strong>$cn :</strong></td><td>compte $uniqueNumber déjà présent dans l'annuaire : <tt><strong>$uid</strong></tt>.</td></tr>\n");
 278    } else {
 279      $id = 1;
 280      if(($uid eq 'prof')||($uid eq 'docs')||($uid eq 'progs')||($uid eq 'netlogon')||($uid eq 'classes')||($uid eq 'homes')||($uid eq 'admhomes')||($uid eq 'profiles')) {
 281          #$uid=substr($uid, 0, length($uid)-1)."1";
 282          $uid=substr($uid, 0, length($uid)-1).++$id;
 283      }
 284    DOUBLONS: while (1) {
 285        if($uid eq 'admse3') {
 286            if($id<=3) {$id=4;}
 287            $uid=substr($uid, 0, length($uid)-1).++$id;
 288        }
 289        # Recherche d'un uid correspondant dans l'annuaire
 290        $res = $lcs_ldap->search(base     => "$peopleDn",
 291                                                               scope    => 'one',
 292                                                               filter   => "uid=$uid");
 293        warn $res->error if $res->code;
 294        if (($res->entries)[0]) {
 295                      # S'il existe : vérification de la présence de l'EMPLOYEENUMBER
 296                      $employeeNumber = (($res->entries)[0])->get_value('employeeNumber');
 297                      if (! $employeeNumber and $uniqueNumber ne 'undef') {
 298                              # En l'absence : Comparaison des CN
 299                              $cnLdap = unac_string('utf8', (($res->entries)[0])->get_value('cn'));
 300                              $cnTemp = unac_string('utf8', $cn);
 301                              if ($cnLdap eq $cnTemp) {
 302                                      $ldapUid = (($res->entries)[0])->get_value('uid');
 303                                      updateUserEntry();
 304                                      $cn = encode('latin1', decode('utf8', $cn));
 305                                      return ("<tr><td>Entrée <strong>$cn :</strong></td><td>Mise à jour du 'numéro unique', compte <tt><strong>$ldapUid</strong></tt>.</td></tr>\n");
 306                              } else {
 307                                      # traitement des déchets...
 308                                      $cn = encode('latin1', decode('utf8', $cn));
 309                                      return ("<tr><td>Entrée <strong>$cn :</strong></td><td>Risque de conflits, entrée non traitée</td></tr>\n");
 310                              }
 311                      } else {
 312                              # Sinon Gestion des doublons
 313                              if ($uid =~ /^(.*)$id}$/) {
 314                                      $uid = $1 . ++$id;
 315                              } else {
 316                                      chop($uid) if ((length($uid)>= 8) && ($uidPolicy == 4));
 317                                      $uid .= ++$id;
 318                              }
 319                              next DOUBLONS;
 320                      }
 321        } else {
 322      # Création de l'entrée
 323      addUserEntry($uid, $password);
 324      $cn = encode('latin1', decode('utf8', $cn));
 325          my $ValRetour =  "<tr><td>Entrée <strong>$cn :</strong></td><td>Création du compte <tt><strong>$uid</strong></tt>";
 326          $ValRetour .= " fourni par f_uid" if $Admin_UID{$uniqueNumber} ;
 327          $ValRetour .= "</td></tr>\n";
 328          return ($ValRetour);
 329      last DOUBLONS;
 330        }
 331      }
 332    }
 333  }
 334  
 335  sub updateUserCSn {
 336  
 337    $res = $lcs_ldap->modify( "uid=$uid,$peopleDn",
 338                  replace => {
 339                         cn             => $cn,
 340                         sn             => $sn,
 341                         employeeNumber => $uniqueNumber
 342                        } );
 343    warn $res->error if $res->code;
 344  
 345  }
 346  
 347  sub updateUserEntry {
 348  
 349    $res = $lcs_ldap->modify( "uid=$uid,$peopleDn",
 350                  add => {
 351                      employeeNumber => $uniqueNumber
 352                     } );
 353    warn $res->error if $res->code;
 354  
 355  }
 356  
 357  sub addUserEntry {
 358  
 359    ($uid, $password) = @_;
 360  
 361    my $uidNumber = getFirstFreeUid($uidNumber);
 362  
 363    my ( $rid, $pgrid, $lmPassword, $ntPassword ) = sambaAttrs( $uidNumber, $gid, $password );
 364    if ($smbversion eq "samba3") {
 365    @entry = (
 366          'uid',            $uid,
 367          'cn',             $cn,
 368          'givenname',      $givenName,
 369          'sn',             $sn,
 370              'initials',       $initials,
 371          'mail',           "$uid\@$domain",
 372          'objectClass',    'top',
 373          'objectClass',    'posixAccount',
 374          'objectClass',    'shadowAccount',
 375          'objectClass',    'person',
 376          'objectClass',    'inetOrgPerson',
 377          'objectClass',    'sambaSamAccount',
 378          'loginShell',     $loginShell,
 379          'uidNumber',      $uidNumber,
 380          'gidNumber',      $gid,
 381          'homeDirectory',  "/home/$uid",
 382          'userPassword',   $crypt,
 383          'gecos',          $gecos,
 384          'sambaSID',      "$domainsid-$rid",
 385          'sambaPrimaryGroupSID', "$domainsid-513",
 386          'sambaLMPassword',     $lmPassword,
 387          'sambaNTPassword',     $ntPassword,
 388          'sambaPwdMustChange',  '2147483647',
 389              'sambaPwdLastSet',     '1',
 390          'sambaAcctFlags',      '[U          ]',
 391              'shadowLastChange',    time
 392  
 393         );
 394    } else {
 395    @entry = (
 396          'uid',            $uid,
 397          'cn',             $cn,
 398          'givenname',      $givenName,
 399              'initials',        $initials,
 400          'sn',             $sn,
 401          'mail',           "$uid\@$domain",
 402          'objectClass',    'top',
 403          'objectClass',    'posixAccount',
 404          'objectClass',    'shadowAccount',
 405          'objectClass',    'person',
 406          'objectClass',    'inetOrgPerson',
 407          'objectClass',    'sambaAccount',
 408          'loginShell',     $loginShell,
 409          'uidNumber',      $uidNumber,
 410          'gidNumber',      $gid,
 411          'homeDirectory',  "/home/$uid",
 412          'userPassword',   $crypt,
 413          'gecos',          $gecos,
 414          'rid',            $rid,
 415          'primaryGroupId', $pgrid,
 416          'lmPassword',     $lmPassword,
 417          'ntPassword',     $ntPassword,
 418          'pwdMustChange',  '2147483647',
 419          'acctFlags',      '[U          ]'
 420         );
 421    }
 422    push @entry, ('employeeNumber', $uniqueNumber) if $uniqueNumber;
 423  
 424    $res = $lcs_ldap->add( "uid=$uid,$peopleDn",
 425               attrs => \@entry );
 426    warn $res->error if $res->code;
 427  
 428  }
 429  
 430  sub normalize {
 431    $toNormalize = shift;
 432    $howMuch = shift;
 433    if ($toNormalize =~ /\s/ and length($toNormalize) > $howMuch) {
 434      my @elements = split / /, $toNormalize;
 435      $normalized = '';
 436      foreach $element (@elements) {
 437        if (length($element) > $howMuch) {
 438      $element = lc($element);
 439      $element = ucfirst($element);
 440        }
 441        $normalized .= "$element ";
 442      }
 443      chop $normalized;
 444      return $normalized
 445    } elsif (length($toNormalize)> $howMuch) {
 446      $normalized = lc($toNormalize);
 447      $normalized = ucfirst($normalized);
 448    }
 449  }
 450  
 451  sub isAdmin {
 452  
 453    # Identification de l'utilisateur
 454    # ===============================
 455    # Récupération du cookie
 456      $isAdmin = "Y";
 457      %cookies = fetch CGI::Cookie;
 458      $session = $cookies{'SambaEdu3'}->value;
 459      # Connexion MySql
 460      $lcs_db = DBI->connect("DBI:mysql:$connexionDb", $mysqlServerUsername, $mysqlServerPw);
 461      $requete = $lcs_db->prepare("select id, login from sessions where (sess = '$session')");
 462      $requete->execute();
 463      ( $id, $login ) = $requete->fetchrow_array;
 464      $lcs_db->disconnect;
 465      # Validation
 466      $admindn = 'uid=' . $login .",". $peopleDn;
 467      @attrs = ('cn');
 468      $lcs_ldap = Net::LDAP->new("$ldap_server");
 469      $lcs_ldap->bind(dn       => "$adminDn",
 470                      password => "$adminPw");
 471      $res = $lcs_ldap->search(base     => "cn=se3_is_admin,$droitsDn",
 472                               scope    => 'subtree',
 473                               attrs    => \@attrs,
 474                               filter   => "(member=$admindn)");
 475      foreach $entry ($res->entries) {
 476        @cn  = $entry->get('cn');
 477      }
 478      if ($cn[0] ne 'se3_is_admin') {
 479          $isAdmin = "N";
 480      }
 481      $lcs_ldap->unbind();
 482    return $isAdmin;
 483  }
 484  
 485  sub annuelle {
 486    # Préparation d'une importation annuelle
 487    # --------------------------------------
 488    print RES "<h2>Préparation à l'importation annuelle</h2>\n";
 489    # Connexion LDAP
 490    $lcs_ldap = Net::LDAP->new("$slapdIp");
 491    $lcs_ldap->bind(
 492            dn       => $adminDn,
 493            password => $adminPw,
 494            version  => '3'
 495           );
 496    # 1.  Suppression des groupes 'Cours', 'Equipe', 'Classe' et 'Matiere'
 497    $res = $lcs_ldap->search(base     => "$groupsDn",
 498                 scope    => 'one',
 499                 filter   => "(|(cn=Classe_*)(cn=Equipe_*)(cn=Cours_*)(cn=Matiere_*))");
 500    warn $res->error if $res->code;
 501    if (($res->entries)[0]) {
 502      foreach $entry ($res->entries) {
 503        $cn = $entry->get_value('cn');
 504        $res = $lcs_ldap->delete("cn=$cn,$groupsDn");
 505        print RES "Suppression du groupe <tt><strong>$cn</strong></tt>.<br>\n" if $debug > 1;
 506        warn $res->error if $res->code;
 507      }
 508    }
 509    # 2.  Modification du DN des groupes Eleves, Profs et Administratifs
 510    $res = $lcs_ldap->search(base     => "$groupsDn",
 511                 scope    => 'one',
 512                 filter   => 'cn=Eleves');
 513    warn $res->error if $res->code;
 514    $elevesGid = (($res->entries)[0])->get_value('gidNumber');
 515    $res = $lcs_ldap->moddn( $elevesDn,
 516                 newrdn => "$elevesRdn}Old" );
 517    warn $res->error if $res->code;
 518    $elevesRdn =~ /cn=(.+)$/;
 519    @elevesEntry = (
 520            'cn',          "$1",
 521            'objectClass', 'top',
 522            'objectClass', 'posixGroup',
 523            'gidNumber',   $elevesGid,
 524           );
 525    $res = $lcs_ldap->add( "$elevesDn",
 526               attrs => \@elevesEntry );
 527    warn $res->error if $res->code;
 528    $res = $lcs_ldap->search(base     => "$groupsDn",
 529                 scope    => 'one',
 530                 filter   => 'cn=Profs');
 531    warn $res->error if $res->code;
 532    $profsGid = (($res->entries)[0])->get_value('gidNumber');
 533    $res = $lcs_ldap->moddn( $profsDn,
 534                 newrdn => "$profsRdn}Old" );
 535    warn $res->error if $res->code;
 536    $profsRdn =~ /cn=(.+)$/;
 537    @profsEntry = (
 538           'cn',          "$1",
 539           'objectClass', 'top',
 540           'objectClass', 'posixGroup',
 541           'gidNumber',   $profsGid,
 542          );
 543    $res = $lcs_ldap->add( "$profsDn",
 544               attrs => \@profsEntry );
 545    warn $res->error if $res->code;
 546    $res = $lcs_ldap->search(base     => "$groupsDn",
 547                 scope    => 'one',
 548                 filter   => 'cn=Administratifs');
 549    warn $res->error if $res->code;
 550    $adminsGid = (($res->entries)[0])->get_value('gidNumber');
 551    $res = $lcs_ldap->moddn( "cn=Administratifs,$groupsDn",
 552                 newrdn => 'cn=AdministratifsOld' ); #leb ajout de 'cn='
 553    warn $res->error if $res->code;
 554    @adminsEntry = (
 555            'cn',          'Administratifs',
 556            'objectClass', 'top',
 557            'objectClass', 'posixGroup',
 558            'gidNumber',   $adminsGid,
 559           );
 560    #leb Ajout
 561    $res = $lcs_ldap->add( "cn=Administratifs,$groupsDn",
 562         attrs => \@adminsEntry );
 563    warn $res->error if $res->code;
 564    #leb Fin Ajout
 565    
 566    # 3.  Recopie des member de ElevesOld, ProfsOld et AdministratifsOld dont
 567    #     l'employeeNumber est vide vers les branches renouvellées
 568    $res = $lcs_ldap->search(base     => "$peopleDn",
 569                 scope    => 'one',
 570                 filter   => "(!(employeeNumber=*))");
 571    foreach $entry ($res->entries) {
 572      $uid = $entry->get_value('uid');
 573      $res2 = $lcs_ldap->search(base     => "$elevesRdn}Old,$groupsDn",
 574                    scope    => 'base',
 575                    filter   => "memberUid=$uid");
 576      if (($res2->entries)[0]) {
 577        $res2 = $lcs_ldap->modify( $elevesDn,
 578                   add => { 'memberUid' => $uid } );
 579        warn $res2->error if $res->code;
 580        next;
 581      } else {
 582        $res2 = $lcs_ldap->search(base     => "$profsRdn}Old,$groupsDn",
 583                      scope    => 'base',
 584                       filter   => "memberUid=$uid");
 585        if (($res2->entries)[0]) {
 586          $res2 = $lcs_ldap->modify( $profsDn,
 587                     add => { 'memberUid' => $uid } );
 588          warn $res2->error if $res->code;
 589      next;
 590        } else {
 591          $res2 = $lcs_ldap->search(base     => "cn=AdministratifsOld,$groupsDn",
 592                        scope    => 'base',
 593                        filter   => "memberUid=$uid");
 594          if (($res2->entries)[0]) {
 595            $res2 = $lcs_ldap->modify( "cn=Administratifs,$groupsDn",
 596                       add => { 'memberUid' => $uid } );
 597            warn $res2->error if $res->code;
 598      }
 599        }
 600      }
 601    }
 602    # 4.  Suppression des branches OLD
 603    $res = $lcs_ldap->delete("$profsRdn}Old,$groupsDn");
 604    $res = $lcs_ldap->delete("$elevesRdn}Old,$groupsDn");
 605    $res = $lcs_ldap->delete("cn=AdministratifsOld,$groupsDn");
 606  }
 607  sub gep2posixAccount {
 608    
 609    my ( $prenom, $nom, $password, $date, $sexe ) = @_;
 610  
 611    @noms = ();
 612    $sn = '';
 613  
 614    # « Minusculisation » et nettoyage du nom et du prénom
 615    # $nom =~ tr/A-Z/a-z/;
 616    $nom = lc($nom);
 617    $nom =~ s/'//; #';
 618    if ($nom =~ /\s/) {
 619      @noms = (split / /,$nom);
 620      $nom1 = $noms[0];
 621      if (length($noms[0]) < 4) {
 622        $nom1 .= "_" . $noms[1];
 623        $separator = ' ';
 624      } else {
 625        $separator = '-';
 626      }
 627      foreach $nom_partiel (@noms) {
 628        $sn .= ucfirst($nom_partiel) . $separator;
 629      }
 630      chop $sn;
 631    } else {
 632      $nom1 = $nom;
 633      $sn = ucfirst($nom);
 634    }
 635    $nom =~ /^(\w)(.*)/;
 636    $firstletter_nom = $1;
 637    $firstletter_nom = uc($firstletter_nom);
 638  
 639    $prenom =~ /^(\S*)/;
 640    $prenom1 = $1;
 641    $prenom1 = lc($prenom1);
 642    $prenom1 =~ s/'//; #';
 643    $prenom1 =~ s/\.//; #';
 644  
 645    $uid = mkUid(unac_string('utf8', ($prenom1)), unac_string('utf8', ($nom1)));
 646  
 647    # Génération du mot de passe crypté
 648  #  $salt  = chr (rand(75) + 48);
 649  #  $salt .= chr (rand(75) + 48);
 650  #  $crypt = crypt $password, $salt;
 651    $crypt = `/usr/sbin/slappasswd -h {MD5} -s '$password'`;
 652  
 653    # Génération de cn, givenName et sn
 654    $cn = ucfirst($prenom1);
 655    $cn = "$cn $sn";  
 656    $givenName = $prenom1;
 657    $initials = $prenom1 . $firstletter_nom;
 658  
 659    # Génération du gecos
 660    if ($sexe eq '1') { $sexe = 'M' }
 661    if ($sexe eq '2') { $sexe = 'F' }
 662  
 663    $unacn = unac_string('utf8', ($cn));
 664    $gecos = "$unacn,$date,$sexe,N";
 665  
 666    @data = ( $uid, $cn, $givenName, $sn, $crypt, $gecos );
 667    return @data;
 668  }


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