Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
<?php
session_start();
$fichier = 'ldap_entities';
echo "... CHARGEMENT DU FICHIER DE CONFIGURATION ...\n";
if( !isset($argv) ){
exit(htmlentities("Ce script ne peut-etre appelé qu'en PHP CLI"));
}
else if( isset($argv) && count($argv) < 2){
exit("/!\ Erreur de Syntaxe !\nLa syntaxe est $argv[0] <fichier de conf xml> <xml de sortie>\n\n");
}else if(!file_exists($argv[1])){
exit("/!\ Le fichier de configuration n'existe pas!\n\n");
}
else
{
$ldap_conf_file = trim($argv[1]);
echo "Fichier OK !\n\n";
}
//Extraction de /root/config dans le fichier de conf
$ldap_conf = new DomDocument();
try
{
$ldap_conf->load($ldap_conf_file);
}
catch(Exception $e)
{
exit("/!\ Impossible de charger le document : ".$ldap_conf_file."\n
Erreur : ".$e.getMessage."\n\n");
}
//**********************************//
// FILTER AND DNs //
//**********************************//
$i=0;
$xp_ldap_conf = new domxpath($ldap_conf);
foreach( $xp_ldap_conf->query("/root/filter/dn/@id") as $dn)
{
$type = $xp_ldap_conf->query("/root/filter/dn[@id= '".$dn->nodeValue."']/@type")->item(0)->nodeValue; //echo "for each filter ok\n";
//$dn_and_filter[$i][$dn->nodeName] = $dn->nodeValue;
//echo "nodename : ".$dn_and_filter[$i][$dn->nodeName]."\n";
if($type=='entities'){
$dn_and_filter[$i]['id'] = $dn->nodeValue;
}
}
$xp_ldap_conf->query("/root/filter/dn/@id");
unset($i);
$DnsEntities=array();
foreach ($dn_and_filter as $key => $value) {
$DnsEntities[]=$value['id'];
}
//print_r($DnsEntities);
//Arguments
//on charge le fichier config.xml pour pouvoir récupérer les données de connexion à la base de données.
$xml = simplexml_load_file($ldap_conf_file);
$host = $xml->config_base->databaseserver;
$dbname = $xml->config_base->databasename;
$user= $xml->config_base->databaseuser;
$password = $xml->config_base->databasepassword;
//echo 'host : '.$host;echo "\n";
//echo 'dbname :'.$dbname;echo "\n";
//echo 'user : '.$user;echo "\n";
//echo 'password :'.$password;echo "\n";
echo "... CONNEXION A LA BASE DE DONNEES MAARCH ...\n";
// Connexion, sélection de la base de données
try {
$db = new PDO("pgsql:host=$host;dbname=$dbname", "$user", "$password");
echo 'Connexion OK'."\n\n";
//exit;
}
catch(PDOException $e) {
$db = null;
echo '/!\ Erreur de connexion: ' . $e->getMessage()."\n\n";
exit;
}
//exit;
/**
Les Fonctions
*/
/*
Fonction qui permet de récupérer l'information de la balise concernée dans le fichier xml
**/
function infoBalise($description, $balise)
{
if($description == NULL) {
return $contenu = '';}
else{
$contenu = NULL;
$contenubalise = $description ->getElementsByTagName($balise);
foreach($contenubalise as $contenu)
$contenu = $contenu->firstChild->nodeValue . "";
return $contenu ;
}
}
function insertThisEntity($entityId, $entity_label,$xml_ldap_id, $db){
$short_label = substr($entity_label, 0, 49);
$qry = $db->prepare("INSERT into entities (entity_id, entity_label, short_label,entity_type,ldap_id, enabled) values (?,?,?,?,?,?) ");
$qry->execute(array($entityId,$entity_label,$short_label,'Direction',$xml_ldap_id,'Y'));
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
$result = $qry->fetchAll();
if($result==null){
echo "/!\ Error : L'entité $entity_label n'a pas été insérée !\n";
}else{
echo "... L'entité $entity_label a été insérée ...\n";
}
}
function seekLdapId($xml_ldap_id,$db){
$qry = $db->prepare("SELECT ldap_id from entities where ldap_id = ?");
$qry->execute(array($xml_ldap_id));
while($row = $qry->fetch()){
$info = $row['ldap_id'];
}
return $info;
}
function seekEntityId($xml_ldap_id,$db){
$qry = $db->prepare("SELECT entity_id from entities where ldap_id = ?");
$qry->execute(array($xml_ldap_id));
while($row = $qry->fetch()){
$info = $row['entity_id'];
}
return $info;
}
function updateEntity($entityId, $xml_entity_label, $xml_entity_ldap_id, $xml_parent_entity_id, $db){
$short_label = substr($xml_entity_label, 0, 49);
if($xml_parent_entity_id != ''){
//echo "UPDATE entities SET (entity_label,parent_entity_id) VALUES ('$xml_entity_label','$xml_parent_entity_id') WHERE entity_id = '$entityId'";
$qry = $db->prepare("UPDATE entities SET entity_label = ?, short_label = ?, parent_entity_id = ? WHERE entity_id = ?");
$qry->execute(array($xml_entity_label,$short_label,$xml_parent_entity_id,$entityId));
}else{
//echo "UPDATE entities SET entity_label ='$xml_entity_label' WHERE entity_id = '$entityId'";
$qry = $db->prepare("UPDATE entities SET entity_label = ?, short_label = ? WHERE entity_id = ?");
$qry->execute(array($xml_entity_label,$short_label,$entityId));
}
$result = $qry->fetchAll();
//print_r($qry->errorInfo());
if(!$qry){
echo "/!\ Error : les donnees n'ont pas ete mis a jour ! \n";
print_r($qry->errorInfo());
}else{
echo "... les donnees ont ete mis a jour ...\n";
}
}
function deleteOldEntities($tableau, $db)
{
//print_r($tableau);
$entitiesXml= "'".implode("','",$tableau)."'";
//echo $entitiesXml;
$select = "update entities set enabled = 'N' where ldap_id not in ($entitiesXml)";
//print_r($select);
$qry= $db->prepare($select);
$qry->execute(array());
}
function seekLastInsertId($db)
{
$info = null;
$qry = $db->prepare("SELECT max(cast(substring(entity_id,5) as integer)) as id from entities order by id asc");
$qry->execute(array());
while($row = $qry->fetch()){
$info = $row['id'];
}
if($info == null){return 100;}else{return $info;}
}
/**
Chargement du fichier xml
*/
$xp_ldap_conf = new domxpath($ldap_conf);
foreach($xp_ldap_conf->query("/root/config/ldap/*") as $cf)
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
${$cf->nodeName} = $cf->nodeValue;
//Si une class custom est définie
echo "type ldap : ".$type_ldap."\n";
if( file_exists(dirname($ldap_conf_file)."/../class/class_".$type_ldap.".php") )
include(dirname($ldap_conf_file)."/../class/class_".$type_ldap.".php");
//Sinon si la class est définie pour le module
else if( file_exists(dirname($ldap_conf_file)."/../../../../../modules/ldap/class/class_".$type_ldap.".php") )
include(dirname($ldap_conf_file)."/../../../../../modules/ldap/class/class_".$type_ldap.".php");
//Sinon
else
exit("Impossible de charger class_".$type_ldap.".php\n");
//**********************************//
// LDAP CONNECTION //
//**********************************//
echo "... CONNEXION A L'ANNUAIRE $type_ldap ...\n";
//Try to create a new ldap instance
try
{
if($prefix_login != ''){
$login_admin =$prefix_login."\\".$login_admin;
}
$ad = new LDAP($domain,$login_admin,$pass,false);
echo "Connexion Ldap ok\n\n";
}
catch(Exception $con_failure)
{
exit("/!\ Impossible de se connecter à l'annuaire\n
Erreur : ".$con_failure->getMessage()."\n\n");
}
/*Lecture du fichier xml des entités pour remplir la table entities*/
$dom = new DomDocument();
$dom->load('../xml/'.$fichier.'.xml');
//$tableau=array();
echo "... TRAITEMENT du fichier $fichier ...\n";
/*On compte le nombre d'item dans le fichier xml. Ceci est réalisé car le nom de la balise est item suivi d'un chiffre*/
for($m = 0; ; $m++)
{
$nomItem = 'item_'.$m;
$list = $dom->getElementsByTagName("ldap_info")->item(0);
$listItem = $list->getElementsByTagName($nomItem)->item(0);
if($listItem == NULL){break;}
}
/**
Lecture du fichier ldap.xml des entités pour mise à jours des données de la table entities
*/
/*Boucle qui permet de travailler sur les données contenues dans le fichier xml. On récupère les données puis on les insère dans la table entities en parcourant le fichier ldap.xml*/
//$ldapEntityId = 1000;
$array_ldap_id = array();
{
$valeurLastInsert = seekLastInsertId($db);
$entityId = $valeurLastInsert;
$nomItemGroups = 'item_'.$k;
$list = $dom->getElementsByTagName("ldap_info")->item(0);
$listItem = $list->getElementsByTagName($nomItemGroups)->item(0);
$xml_ldap_id = infoBalise($listItem, 'xml_ldap_id');
$xml_entity_label = infoBalise($listItem, 'xml_entity_label');
echo("=============== $xml_entity_label ===============\n");
echo("-------------Informations-------------\n");
echo "+ xml : $nomItemGroups\n";
echo "+ ldap_id : $xml_ldap_id\n";
echo "+ entity_label : $xml_entity_label\n";
echo("--------------------------------------\n\n");
$db_ldap_id = seekLdapId($xml_ldap_id,$db);
if($db_ldap_id == '' || $db_ldap_id == NULL){
$entityId++;
$entityId = 'ldap'.$entityId;
echo "L'entite entity_label n'existe pas ...";
echo "... generation de l'entity_id ... valeur ... $entityId\n";
echo "... insertion de l'entité ...\n";
insertThisEntity($entityId, $xml_entity_label, $xml_ldap_id, $db);
}else{
echo "L'entite existe deja ...\n";
$entityId = seekEntityId($xml_ldap_id,$db);
echo "... entity_id : $entityId ...\n";
echo "... mise à jour ...\n";
updateEntity($entityId, $xml_entity_label, $xml_ldap_id,'', $db);
}
$array_ldap_id[]= $xml_ldap_id;
//Recuperation de la branche des parent_entity
$listsParent = $listItem->getElementsByTagName("xml_parent_entity")->item(0);
/*On compte le nombre d'item xml dans la balise xml_user_entity. Ceci est réalisé car le nom de la balise est item suivi d'un chiffre*/
//$nb_parents = $listsParent->lastChild->previousSibling->tagName;
$nb_parents = $listsParent->lastChild->tagName;
//exit('NOMBRE PARENTS : '.$nb_parents);
if($nb_parents != ''){
$nb_parents = explode('_', $nb_parents);
$nb_parents = $nb_parents[1];
echo("\n-------------Entite Parente de $xml_entity_label-------------\n");
for($q=0; $q<=$nb_parents; $q++){
$nomXml = 'xml_'.$q;
$parent_entityDn = infoBalise($listsParent, 'xml_'.$q);
//echo $parent_entityDn."\n";
if (preg_match('/'.$DnsEntities[0].'/', $parent_entityDn)) {
$xml_parent_entity_ldap_id = $ad->group_info($parent_entityDn,array('objectguid'),$DnsEntities[0]);
$xml_parent_entity_label = $ad->group_info($parent_entityDn,array('samaccountname'),$DnsEntities[0]);
if(empty($xml_entity_label) || empty($xml_parent_entity_ldap_id)){
echo "Entité non trouvé dans l'AD!";
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
break;
}
$xml_parent_entity_ldap_id=$xml_parent_entity_ldap_id['objectguid'];
$xml_parent_entity_label=$xml_parent_entity_label['samaccountname'];
echo "+ xml : $nomXml\n";
echo "+ DN : $parent_entityDn\n";
echo "+ ldap_id : $xml_parent_entity_ldap_id\n";
echo "+ entity_label : $xml_parent_entity_label\n\n";
$db_parent_ldap_id = seekLdapId($xml_parent_entity_ldap_id,$db);
if($db_parent_ldap_id == null){
$parentEntityId = $entityId;
$parentEntityId=explode('ldap', $parentEntityId);
$parentEntityId[1]++;
$parentEntityId = 'ldap'.$parentEntityId[1];
echo "L'entite $xml_parent_entity_label, parente de $xml_entity_label, n'existe pas\n";
echo "... insertion ...\n";
//ajouter function d'insertion de cette entite
insertThisEntity($parentEntityId, $xml_parent_entity_label, $xml_parent_entity_ldap_id, $db);
//echo "Mise à jour de l'entité $xml_entity_label, fille de $xml_parent_entity_label\n";
echo "... liaison de $xml_entity_label à $xml_parent_entity_label ...\n";
updateEntity($entityId, $xml_entity_label, $xml_ldap_id,$parentEntityId, $db);
}else{
echo "L'entite $xml_parent_entity_label, parente de $xml_entity_label existe deja\n";
echo "... mise a jour ...\n";
$parentEntityId = seekEntityId($xml_parent_entity_ldap_id,$db);
updateEntity($parentEntityId, $xml_parent_entity_label, $xml_parent_entity_ldap_id, '', $db);
echo "... liaison de $xml_entity_label à $xml_parent_entity_label ...\n";
updateEntity($entityId, $xml_entity_label, $xml_ldap_id,$parentEntityId, $db);
}
echo "-------------------------------------------\n";
}
echo("==========================================\n\n");
}
deleteOldEntities($array_ldap_id, $db);
?>