#!/usr/bin/perl -w
use Se;
# Algorythme global
# =================
if (!defined ($pid = fork)) {
die "Impossible de « forker » : $!\n";
} elsif (! $pid) {
&traitement_fond;
exit(0);
} else {
&traitement;
exit(0);
}
sub traitement {
open ENCOURS, '>/tmp/EnCours.temp';
print ENCOURS '1';
close ENCOURS;
# Initialisation des variables
# ----------------------------
# Uid de départ
$uidNumber = getFirstFreeUid(1001);
# Gid de départ
$gidNumber = getFirstFreeGid(2000);
&entete(STDOUT);
if (isAdmin() ne 'Y') {
print
"
Erreur : vous n'avez pas les droits nécessaires",
" pour effectuer l'importation !
";
&pdp(STDOUT);
exit(0);
}
# Récupération, Capitalisation et modification du préfixe
$prefix = param('prefix') or $prefix = '';
$prefix =~ tr/a-z/A-Z/;
$prefix .= '_' unless ($prefix eq '');
# Récupération de la valeur du flag ANNUELLE
$annuelle = param('annuelle');
open INT, '>/tmp/gepInterface.temp' or warn 'Impossible d\'écrire dans /tmp !';
print INT "$prefix:$annuelle";
close INT;
# Écriture des fichiers dans /tmp
# ===============================
foreach $fichier (keys(%formatTxt)) {
# Vérification du passage d'un fichier
# ------------------------------------
$nom = param("$fichier");
if ($nom eq '') {
print STDOUT "Pas de fichier fourni pour ",
"$fichier !
\n" if ($debug > 1);
$atLeastOneNotOk = 1;
} else {
$fileHandle = upload("$fichier");
open ( FICHTMP ,">/tmp/ApacheCgi.temp");
while (<$fileHandle>) {
print FICHTMP;
}
close FICHTMP;
# Appel de la fonction d'ecriture du fichier vérifié et nettoyé (utf8)
# --------------------------------------------------------------------
$res = txtVerif($fichier);
$atLeastOneNotOk = 1 if $res;
print "Format du fichier $fichier erroné
\n" if $res;
unless ($res) {
$ok{$fichier} = 1;
$atLeastOneOk = 1;
}
}
}
# Rapport concernant la validité des fichiers
# ===========================================
unless ($atLeastOneOk) {
print "Aucun fichier valide n'a été fourni !\n";
pdp(STDOUT);
exit 0;
}
if ($debug > 1 && $atLeastOneOk) {
print
"Fichiers fournis et valides
\n",
"\n";
foreach $fichier (keys(%formatTxt)) {
print "- $fichier
\n" if $ok{$fichier};
}
print "
\n";
}
if ($debug > 1 && $atLeastOneNotOk) {
print
"Fichiers non fournis ou invalides
\n",
"\n";
foreach $fichier (keys(%formatTxt)) {
print
"- ",
"$fichier
\n" unless $ok{$fichier};
}
print "
\n";
}
# Suppression des pages html résultats antérieures
# ------------------------------------------------
unlink <$documentRoot/$webDir/result*>
or warn "Le serveur Web n'a pas les droits suffisants",
"sur le répertoire '$documentRoot/$webDir/result*'.";
# Écriture du fichier html provisoire de résultat final
# -----------------------------------------------------
open (RES, ">$documentRoot/$webDir/result.$pid.html")
or die "Le serveur Web n'a pas les droits suffisants sur le répertoire '$documentRoot/$webDir/result*'.";
&entete(RES);
print RES
p('Traitement en cours...');
&pdp(RES);
close RES;
print "Création des entrées ldap suivantes
\n" if $debug;
if ($ok{'f_ele'} or $ok{'f_wind'}) {
print
"Comptes utilisateur :\n",
"\n" if $debug;
if ($ok{'f_ele'}) {
print "- Élèves
\n" if $debug;
$createEleves = 1;
}
if ($ok{'f_wind'}) {
print "- Profs
\n" if $debug;
$createProfs = 1;
}
print "
\n";
}
if ($ok{'f_div'} or $ok{'f_ele'} or $ok{'f_men'}) {
print
"Groupes :\n",
"\n" if $debug;
if ($ok{'f_div'} or $ok{'f_ele'}) {
print "- Classes
\n" if $debug;
print "- Équipes
\n" if $debug;
$createClasses = 1; $createEquipes = 1;
}
if ($ok{'f_men'}) {
print
"- Cours
\n",
"- Matières
\n" if $debug;
$createCours = 1; $createMatieres = 1;
}
print "
\n";
}
if ($atLeastOneNotOk) {
print "Problèmes liés à l'absence ou à l'invalidité de certains fichiers
\n" if $debug;
if (! $ok{'f_ele'} or ! $ok{'f_wind'}) {
print
"Pas de création des comptes utilisateur :\n",
"\n" if $debug;
print "- Élèves
\n"
if (! $ok{'f_ele'} and $debug);
print "- Profs
\n"
if (! $ok{'f_wind'} and $debug);
print "
\n";
}
if (! $ok{'f_div'} or ! $ok{'f_ele'} or ! $ok{'f_men'}) {
print
"Pas de création des groupes :\n",
"\n" if $debug;
print "- Classes
\n",
"- Équipes
\n"
if (! $ok{'f_div'} and ! $ok{'f_ele'} and $debug);
print
"- Cours
\n",
"- Matières
\n"
if (! $ok{'f_men'} and $debug);
print "
\n";
}
if ((! $ok{'f_div'} and ($createClasses or $createEquipes)))
# or (! $ok{'f_tmt'} and $createMatieres)
# or (! $ok{'f_gro'} and $createCours))
{
print
"Pas de description disponible pour les groupes ",
"(utilisation du mnémonique) :\n",
"\n" if $debug;
if (! $ok{'f_div'}) {
print "- Classes
\n"
if ($createClasses and $debug);
print "- Équipes
\n"
if ($createEquipes and $debug);
}
print
"- Matières
\n",
" (limitation due à l'importation texte)."
if ($createMatieres and $debug);
print
"- Cours
\n",
" (limitation due à l'importation texte)."
if ($createCours and $debug);
print "
\n";
}
if (($createCours and ! $ok{'f_ele'}) or ($createClasses and ! $ok{'f_ele'})) {
print
"Pas de membres pour les groupes :\n",
"\n" if $debug;
print
"- Cours
\n"
if ($createCours and $ok{'f_ele'} and $debug);
print
"- Équipes
\n"
if ($createEquipes and ! $ok{'f_wind'} and $debug);
print "
\n";
}
}
print
"Le traitement pouvant être particulièrement long,",
" il va maintenant continuer en tâche de fond.
\n",
'Le rapport final d\'importation sera accessible à l\'adresse :
',
"
\n",
"Une fois le traitement terminé, utilisez l'annuaire pour vérifier la validité des résultats.",
"
\n";
&pdp(STDOUT);
unlink('/tmp/EnCours.temp');
}
sub traitement_fond {
# Attente de fin du traitement préparatoire
sleep(3);
$inc=0;
while (1) {
sleep 1;
$inc++;
if ($inc == 30) {
# Fermeture des entrées/sorties standard
close(STDIN); close(STDOUT);
open RES, ">$documentRoot/$webDir/result.$$.html";
&entete(RES);
print RES
"Le traitement préparatoire des fichiers texte semble avoir été interrompu.
",
"Le traitement des fichiers prêts va tout de même se poursuivre.
",
"ATTENTION : votre importation risque de ne pas être complète...
";
last;
}
if (! -f '/tmp/EnCours.temp') {
# Fermeture des entrées/sorties standard
close(STDIN); close(STDOUT);
open RES, ">$documentRoot/$webDir/result.$$.html";
&entete(RES);
print RES
"Le traitement préparatoire s'est terminé avec succès.
";
last;
}
}
open INT, ';
($prefix, $annuelle) = split /:/, $ligne;
close INT;
$prefix = '' unless $prefix;
annuelle() if ($annuelle);
# Création des entrées
# ====================
# Initialisation des variables
# ----------------------------
# Uid de départ
$uidNumber = getFirstFreeUid(1001);
# Gid de départ
$gidNumber = getFirstFreeGid(2000);
# Gid des utilisateurs LCS/SE3
$gid = $defaultgid;
unless
(-f '/tmp/f_ele.temp'
or -f '/tmp/f_wind.temp'
or -f '/tmp/f_men.temp'
or -f '/tmp/f_div.temp') {
exit 0;
}
# Connexion LDAP
# ==============
$lcs_ldap = Net::LDAP->new("$slapdIp");
$lcs_ldap->bind(
dn => $adminDn,
password => $adminPw,
version => '3'
);
# Profs
# -----
if (-f '/tmp/f_wind.temp') {
print RES "Création des comptes 'Profs'
\n\n";
open PROFS, ') {
chomp($ligne = $_);
($numind, $nom, $prenom, $date, $sexe) = (split /\|/, $ligne);
$uniqueNumber = $numind;
$res = processGepUser( $uniqueNumber, $nom, $prenom, $date, $sexe, 'undef' );
print RES $res if ($res =~ /Cr/ or ($debug > 1 and $res !~ /Cr/));
unless ($res =~ /conflits/) {
# Ajoût de l'uid au groupe Profs
$res = $lcs_ldap->search(base => "$profsDn",
scope => 'base',
filter => "memberUid=$uid");
unless (($res->entries)[0]) {
$res = $lcs_ldap->modify( $profsDn,
add => { 'memberUid' => $uid } );
warn $res->error if $res->code;
}
}
}
print RES "
\n";
close PROFS;
}
# Classes
# -------
if (-f '/tmp/f_div.temp') {
print RES "Création des groupes 'Classe' et 'Equipe'
\n\n";
open DIV, ') {
chomp($ligne = $_);
($divcod, $divlib, $profUniqueNumber) = (split/\|/, $ligne);
$divcod =~ s/\s/_/;
$divlib = normalize($divlib,4);
$libelle{$divcod} = $divlib;
$res = $lcs_ldap->search(base => "$peopleDn",
scope => 'one',
filter => "employeeNumber=$profUniqueNumber");
$profPrincUid = '';
if (($res->entries)[0]) {
$profPrincUid = (($res->entries)[0])->get_value('uid');
}
# Recherche de l'existence de la classe
$res = $lcs_ldap->search(base => "cn=Classe_$prefix$divcod,$groupsDn",
scope => 'base',
filter => "cn=*");
if (($res->entries)[0]) {
if (! (($res->entries)[0])->get_value('description') and $divlib) {
print RES "$divcod : | Mise à jour de la description du groupe 'Classe' : $divlib |
\n" if $debug > 1;
$res2 = $lcs_ldap->modify( "cn=Classe_$prefix$divcod,$groupsDn",
add => { description => $divlib } );
warn $res2->error if $res2->code;
}
} else {
$gidNumber = getFirstFreeGid($gidNumber);
@classEntry = (
'cn', "Classe_$prefix$divcod",
'objectClass', 'top',
'objectClass', 'posixGroup',
'gidNumber', $gidNumber,
);
push @classEntry, ('description', $divlib) if $divlib;
$res = $lcs_ldap->add( "cn=Classe_$prefix$divcod,$groupsDn",
attrs => \@classEntry );
warn $res->error if $res->code;
print RES "$divcod : | Création du groupe 'Classe' $divlib |
\n" if $debug;
}
# Recherche de l'existence de l'équipe
$res = $lcs_ldap->search(base => "cn=Equipe_$prefix$divcod,$groupsDn",
scope => 'base',
filter => "cn=*");
if (($res->entries)[0]) {
if (! (($res->entries)[0])->get_value('description') and $divlib) {
print RES "$divcod : | Mise à jour de la description du groupe 'Equipe' : $divlib |
\n" if $debug > 1;
$res2 = $lcs_ldap->modify( "cn=Equipe_$prefix$divcod,$groupsDn",
add => { description => $divlib } );
warn $res2->error if $res2->code;
}
if (! (($res->entries)[0])->get_value('owner') and $profPrincUid) {
print RES "$divcod : | Mise à jour du propriétaire du groupe 'Equipe' : $divlib |
\n" if $debug > 1;
$res2 = $lcs_ldap->modify( "cn=Equipe_$prefix$divcod,$groupsDn",
add => { owner => "uid=$profPrincUid,$peopleDn" } );
warn $res2->error if $res2->code;
}
next;
} else {
$gidNumber = getFirstFreeGid($gidNumber);
@equipeEntry = (
'cn', "Equipe_$prefix$divcod",
'objectClass', 'top',
'objectClass', 'posixGroup',
'gidNumber', $gidNumber,
);
push @equipeEntry, ('description', $divlib) if $divlib;
#push @equipeEntry, ('owner', "uid=$profPrincUid,$peopleDn") if $profPrincUid;
$res = $lcs_ldap->add( "cn=Equipe_$prefix$divcod,$groupsDn",
attrs => \@equipeEntry );
warn $res->error if $res->code;
print RES "$divcod : | Création du groupe 'Equipe' $divlib |
\n" if $debug > 1;
}
}
print RES "
\n";
}
# Eleves
# -----
if (-f '/tmp/f_ele.temp') {
print RES "Création des comptes 'Eleves'";
print RES " (et des groupes 'Classes' et 'Equipes' associés)"
unless (-f '/tmp/f_div.temp');
print RES "
\n\n";
open ELEVES, ') {
chomp($ligne = $_);
($uniqueNumber, $nom, $prenom, $date, $sexe, $divcod) = (split /\|/, $ligne);
$divcod =~ s/\s/_/g;
next if $divcod eq '';
unless (-f '/tmp/f_div.temp') {
# Création des classes
$res = $lcs_ldap->search(base => "cn=Classe_$prefix$divcod,$groupsDn",
scope => 'base',
filter => "cn=*");
unless (($res->entries)[0]) {
$gidNumber = getFirstFreeGid($gidNumber);
@classEntry = (
'cn', "Classe_$prefix$divcod",
'objectClass', 'top',
'objectClass', 'posixGroup',
'gidNumber', $gidNumber,
);
$res = $lcs_ldap->add( "cn=Classe_$prefix$divcod,$groupsDn",
attrs => \@classEntry );
warn $res->error if $res->code;
}
# Création des Équipes
$res = $lcs_ldap->search(base => "cn=Equipe_$prefix$divcod,$groupsDn",
scope => 'base',
filter => "cn=*");
unless (($res->entries)[0]) {
@equipeEntry = (
'cn', "Equipe_$prefix$divcod",
'objectClass', 'top',
'objectClass', 'PosixGroup', );
# 'objectClass', 'groupOfNames', );
#leb 'member', '' );
$res = $lcs_ldap->add( "cn=Equipe_$prefix$divcod,$groupsDn",
attrs => \@equipeEntry );
warn $res->error if $res->code;
}
}
$res = processGepUser($uniqueNumber, $nom, $prenom, $date, $sexe, 'undef');
print RES $res if ($res =~ /Cr/ or ($debug > 1 and $res !~ /Cr/));
unless ($res =~ /conflits/) {
# Ajoût de l'uid au groupe Eleves
$res = $lcs_ldap->search(base => "$elevesDn",
scope => 'base',
filter => "memberUid=$uid");
unless (($res->entries)[0]) {
$res = $lcs_ldap->modify(
$elevesDn,
add => { 'memberUid' => $uid }
);
warn $res->error if $res->code;
}
# Remplissage des classes
$res = $lcs_ldap->search(base => "cn=Classe_$prefix$divcod,$groupsDn",
scope => 'base',
filter => "memberUid=$uid");
unless (($res->entries)[0]) {
$res = $lcs_ldap->modify(
"cn=Classe_$prefix$divcod,$groupsDn",
add => { 'memberUid' => $uid }
);
warn $res->error if $res->code;
}
}
}
print RES "
";
close ELEVES;
}
# Analyse du fichier F_MEN
# ------------------------
if (-f '/tmp/f_men.temp') {
open F_MEN, "Création des groupes 'Cours' et 'Matiere'\n\n";
while () {
chomp ($ligne = $_);
($matimn, $elstco, $uniqueNumber) = (split/\|/, $ligne);
$matimn =~ s/\s/_/g;
$elstco =~ s/\s/_/g;
# Génération du nom du cours (mnémoniqueMatière_codeGroupe)
$cours = $matimn . '_' . $elstco;
if ($uniqueNumber) {
$res = $lcs_ldap->search(base => "$peopleDn",
scope => 'one',
filter => "employeeNumber=$uniqueNumber");
if (($res->entries)[0]) {
$profUid = (($res->entries)[0])->get_value('uid');
} else {
$profUid = '';
}
} else {
$profUid = '';
}
$description = $matimn;
if ($libelle{$elstco}) {
$description .= " / " . $libelle{$elstco};
} else {
$description .= " / " . $elstco;
}
$res = $lcs_ldap->search(base => "cn=Cours_$prefix$cours,$groupsDn",
scope => 'base',
filter => "objectClass=*");
if (($res->entries)[0]) {
# Mise à jour le cas échéant de la description
if (($res->entries)[0]->get_value('description') =~ /$elstco/ and $description !~ /$elstco/) {
$res2 = $lcs_ldap->modify( "cn=Cours_$prefix$cours,$groupsDn",
replace => { description => $description } );
warn $res2->error if $res2->code;
print RES "Cours gep $cours : | Mise à jour de la description du groupe 'Cours' |
\n" if $debug > 1;
}
} else {
$gidNumber = getFirstFreeGid($gidNumber);
@coursEntry = (
'cn', "Cours_$prefix$cours",
'objectClass', 'top',
'objectClass', 'posixGroup',
'gidNumber', $gidNumber,
'description', $description,
);
push @coursEntry, ('memberUid', $profUid) if $profUid;
$res = $lcs_ldap->add( "cn=Cours_$prefix$cours,$groupsDn",
attrs => \@coursEntry );
warn $res->error if $res->code;
print RES "Cours $cours : | Création du groupe 'Cours' |
\n" if $debug;
}
# Ajout du prof le cas échéant
if ($profUid) {
$res = $lcs_ldap->search(base => "cn=Cours_$prefix$cours,$groupsDn",
scope => 'base',
filter => "memberUid=$profUid");
if (! ($res->entries)[0]) {
$res = $lcs_ldap->modify( "cn=Cours_$prefix$cours,$groupsDn",
add => { memberUid => $profUid } );
warn $res->error if $res->code;
}
}
# Ajout des autres membres du cours
#leb $res = $lcs_ldap->search(base => "cn=Classe_$prefix$elstco,$groupsDn",
#leb scope => 'base',
#leb filter => "cn=*");
#leb if ($member{$elstco}) {
#leb # Cas d'un groupe
#leb chop($members = $member{$elstco});
#leb foreach $member (split / /, $members) {
#leb $res = $lcs_ldap->search(base => "cn=Cours_$prefix$cours,$groupsDn",
#leb scope => 'base',
#leb filter => "memberUid=$member");
#leb if (! ($res->entries)[0]) {
#leb $res = $lcs_ldap->modify( "cn=Cours_$prefix$cours,$groupsDn",
#leb add => { memberUid => $member } );
#leb warn $res->error if $res->code;
#leb }
#leb print RES "Cours $cours : | Ajoût des élèves du groupe |
\n" if $debug > 1;
#leb }
#leb } else {
#leb # cas d'une classe. C'EST TOUJOURS LE CAS D'UNE CLASSE !
$res = $lcs_ldap->search(base => "cn=Classe_$prefix$elstco,$groupsDn",
scope => 'base',
filter => "objectClass=posixGroup"); #leb à la place de : filter => "objectClass=*");
if (($res->entries)[0]) {
@members = ($res->entries)[0]->get_value('memberUid');
foreach $member (@members) {
$res = $lcs_ldap->search(base => "cn=Cours_$prefix$cours,$groupsDn",
scope => 'base',
filter => "memberUid=$member");
if (! ($res->entries)[0]) {
$res = $lcs_ldap->modify( "cn=Cours_$prefix$cours,$groupsDn",
add => { memberUid => $member } );
warn $res->error if $res->code;
}
}
}
#leb }
if ($profUid) {
# Remplissage de l'équipe pédagogique de la classe
$res = $lcs_ldap->search(base => "cn=Equipe_$prefix$elstco,$groupsDn",
scope => 'base',
filter => "objectClass=posixGroup");
# filter => "objectClass=*");
if (($res->entries)[0]) {
$res = $lcs_ldap->search(base => "cn=Equipe_$prefix$elstco,$groupsDn",
scope => 'base',
filter => "memberUid=$profUid");
# filter => "member=uid=$profUid,$peopleDn");
unless (($res->entries)[0]) {
$res = $lcs_ldap->modify( "cn=Equipe_$prefix$elstco,$groupsDn",
add => { memberUid => $profUid } );
# add => { member => "uid=$profUid,$peopleDn" } );
warn $res->error if $res->code;
}
}
# Remplissage et/ou création du GroupOfNames Matiere
# Si la matière n'existe pas encore
$res = $lcs_ldap->search(base => "cn=Matiere_$prefix$matimn,$groupsDn",
scope => 'base',
filter => "objectClass=posixGroup");
# filter => "objectClass=*");
if (! ($res->entries)[0]) {
$gidNumber = getFirstFreeGid($gidNumber);
@matiereEntry = (
'cn', "Matiere_$prefix$matimn",
'objectClass', 'top',
'objectClass', 'posixGroup',
'gidNumber', $gidNumber);
# 'objectClass', 'groupOfNames' );
#leb 'member', '', );
$res = $lcs_ldap->add( "cn=Matiere_$prefix$matimn,$groupsDn",
attrs => \@matiereEntry );
}
# Avec ses membres
$res = $lcs_ldap->search(base => "cn=Matiere_$prefix$elstco,$groupsDn",
scope => 'base',
filter => "memberUid=$profUid");
# filter => "member=uid=$profUid,$peopleDn");
unless (($res->entries)[0]) {
$res = $lcs_ldap->modify( "cn=Matiere_$prefix$matimn,$groupsDn",
add => { memberUid => $profUid } );
# add => { member => "uid=$profUid,$peopleDn" } );
}
}
}
print RES "
\n";
close F_MEN;
}
unlink ;
$lcs_ldap->unbind;
&pdp(RES);
close RES;
system ("/usr/bin/lynx --dump $documentRoot/$webDir/result.$$.html | mail $melsavadmin -s 'Importation Texte'");
}