Subversion Repositories ALCASAR

Rev

Go to most recent revision | Details | Last modification | View Log

Rev Author Line No. Line
775 stephane 1
<?php
2
/*
3
TODO :
4
- reprendre toutes les expressions régulières [ à contrôler]
5
- prise en compte de tous les types de commentaires
6
- prise en compte d'une valeurs multiligne
7
- suppressions plus rigoureuse des quote et double cote. (FAIT)
8
- correction de quelques bugs
9
- prise en charge de la lecture de section "nommée" (etc: ldap toto {...} )[fait à tester]
10
 
11
-> pas de setter pour le configreader
12
 
13
*/
14
/**
15
* Page contenant les classes <b>confItem</b>, <b>pairItem</b>, <b>sectionItem</b> et <b>configReader</b>.
16
* Ces classes permettent de parser des fichiers de configuration du même format
17
* que ceux utilisés par freeradius.
18
*/
19
 
20
/*
21
The file consists of configuration items (variable = value pairs), sections, and comments. 
22
*/
23
 
24
/**
25
* Classe abstraite <b>confItem</b>.
26
*
27
* @name confItem
28
* @author steweb57
29
* @version 0.1.0
30
*/
31
Abstract class confItem
32
{
33
	/**
34
	* Variable contenant le type d'item (pair ou section)
35
	* @var string
36
	*/
37
	protected $_type	= null;
38
	/**
39
	* Variable contenant le nom de l'item
40
	* @var string
41
	*/
42
	protected $_name	= null;
43
	/**
44
	* Variable contenant le nom de la section
45
	* @var string
46
	*/
47
	/**
48
	* Variable contenant le nom de l'instance de l'item
49
	* @var string
50
	*/
51
	protected $_instanceName	= null;
52
	/**
53
	protected $_parent	= null;
54
	/**
55
	 * Tableau contenant les parametres (items)
56
	 * @var array
57
	 */
58
	protected $_items	= array();
59
	/**
60
	 * Return the parent confItem
61
	 *
62
	 * @name getParent()()
63
	 * @return confItem
64
	 */
65
	public function getParent(){
66
		return $this->_parent;
67
	}
68
	/**
69
	 * return the type of the confItem
70
	 *
71
	 * @name getType()
72
	 * @return string
73
	 */
74
	public function getType(){
75
		return $this->_type;
76
	}
77
 
78
	public function getAll(){
79
		return $this->_items;
80
	}
81
 
82
 
83
	/**
84
	 * return the name of the confItem
85
	 *
86
	 * @name getName()
87
	 * @return string
88
	 */
89
	public function getName(){
90
		return $this->_name;
91
	}
92
	/**
93
	 * return the instance name of the confItem
94
	 *
95
	 * @name getInstanceName()
96
	 * @return string
97
	 */
98
	public function getInstanceName(){
99
		return $this->_instanceName;
100
	}
101
	/**
102
	 *
103
	 * Return the specified atribute
104
	 *
105
	 * @name __get()
106
	 * @param string $attr
107
	 * @return mixed (confitem object or string)
108
	 */
109
	public function __get($attr) {
110
		$resp=array();
111
		foreach ($this->_items as $item){
112
			if (is_object($item)){
113
				if ($item->getName() === $attr){
114
					$resp[] = $item;
115
				}
116
			} else {
117
				if (array_key_exists($attr, $this->_items))
118
					$resp[] = $this->_items[$attr];
119
			}
120
		}
121
		if (count($resp)===1){
122
			return $resp[0];
123
		} else {
124
			return $resp;// si vide, on répond par un array vide ou par false?
125
		}
126
	}
127
	/**
128
	 * Converte the object to a string
129
	 *
130
	 * @name __toString()
131
	 * @return string
132
	 */
133
	public function __toString() {
134
		return $this->_name;
135
    }
136
}
137
 
138
/**
139
* Classe <b>pairItem</b>.
140
*
141
* @name pairItem
142
* @author steweb57
143
* @version 0.1.0
144
*/
145
class pairItem extends confItem
146
{
147
	protected $_type	= 'pair';
148
	protected $_name	= '';
149
 
150
	/**
151
	 * Constructeur
152
	 *
153
	 * <p>création de l'instance de la classe</p>
154
	 *
155
	 * @name pairItem::__construct()
156
	 * @param string $attr, $value
157
	 * @return void
158
	 */
159
	public function __construct($attr,$value) {
160
		$this->_items[$attr] = $value;
161
		$this->_name = $attr;
162
	}
163
	/**
164
	 * Converte the object to a string
165
	 *
166
	 * @name __toString()
167
	 * @return string
168
	 */
169
	public function __toString() {
170
		return $this->_items[$this->_name];// ? afficher le nom de la variable ou sa valeur?
171
    }
172
	/**
173
	 * Get a pair value
174
	 *
175
	 * @name getPair()
176
	 * @param string $pairName
177
	 * @return string
178
	 */
179
	public function getPair($pairName = null){
180
		if ($pairName!==null){
181
			if (array_key_exists($pairName, $this->_items))
182
				return $this->_items[$pairName];
183
		} else {
184
			return $this->_items;
185
		}
186
	}
187
}
188
 
189
class sectionItem extends confItem
190
{
191
	protected $_type	= 'section';
192
	protected $_name	= '';
193
 
194
	public function __construct($name, sectionItem &$parent=null, $instanceName = "") {
195
		$this->_parent = $parent;
196
		$this->_name = $name;
197
		$this->_instanceName = $instanceName;
198
	}
199
	public function addSection($name, $instanceName = "") {
200
		$this->_items[] = new sectionItem($name, $this, $instanceName);
201
		return end($this->_items);
202
	}
203
	public function addPair($name, $value) {
204
		$this->_items[] = new pairItem($name, $value);
205
		return end($this->_items);
206
	}
207
	/**
208
	 * return the child instance of the confSection
209
	 *
210
	 * @name getInstance()
211
	 * @return string
212
	 */
213
	public function getInstance($instanceName=nill){
214
		if ($instanceName === null)
215
			return false;
216
		$resp = array();
217
		foreach ($this->_items as $item){
218
			if ($item->getType() !== 'section'){
219
				continue;
220
			}
221
			if ($item->getInstanceName() === $instanceName){
222
				$resp[] = $item;
223
			}
224
		}
225
		if (count($resp)===1){
226
			return $resp[0];
227
		} else {
228
			return $resp;
229
		}
230
	}
231
	public function getSectionInstance($sectionName = null, $instanceName=null){
232
 
233
		if (($sectionName === null)||($instanceName === null))
234
			return false;
235
		$resp = array();
236
 
237
		foreach ($this->_items as $item){
238
			if ($item->getType() !== 'section'){
239
				continue;
240
			}
241
			if (($item->getName() === $sectionName)&&($item->getInstanceName() === $instanceName)){
242
				$resp[] = $item;
243
			}
244
		}
245
		if (count($resp)===1){
246
			return $resp[0];
247
		} else {
248
			return $resp;
249
		}
250
	}
251
 
252
	public function getSection($sectionName = null){
253
		$resp = array();
254
		foreach ($this->_items as $item){
255
			if ($item->getType() !== 'section'){
256
				continue;
257
			}
258
			if ($sectionName === null){
259
				$resp[] = $item;
260
			} else {
261
				if ($item->getName() === $sectionName){
262
					$resp[] = $item;
263
				}
264
			}
265
		}
266
		if (count($resp)===1){
267
			return $resp[0];
268
		} else {
269
			return $resp;
270
		}
271
	}
272
	public function getPair($pairName = null){
273
		$resp = array();
274
		foreach ($this->_items as $item){
275
			if ($item->getType() !== 'pair'){
276
				continue;
277
			}
278
			if ($pairName === null){
279
				$resp[] = $item;
280
			} else {
281
				if ($item->getName() === $pairName){
282
					//return $item; //only the first answer
283
					$resp[] = $item;
284
				}
285
			}
286
		}
287
		if (count($resp)===1){
288
			return $resp[0];
289
		} else {
290
			return $resp;
291
		}
292
	}
293
}
294
/**
295
* Classe <b>configReader</b>.
296
*
297
* @name configReader
298
* @author steweb57
299
* @version 0.1.0
300
*/
301
class configReader extends sectionItem
302
{
303
	private $_file = null;
304
	private $_pt	= null;
305
	protected $_name	= "root";
306
 
307
	/**
308
	 * Constructeur
309
	 *
310
	 * <p>création de l'instance de la classe</p>
311
	 *
312
	 * @name config_file::__construct()
313
	 * @param string $filename
314
	 * @return void
315
	 */
316
	public function __construct($filename=null) {
317
 
318
		if ($filename !== null){
319
			$this->parse($filename);
320
		}
321
	}
322
	/**
323
	 * Destructeur
324
	 */
325
	public function __destruct() {
326
		$this->_file = NULL;
327
	}
328
	private function _deleteComment($line){
329
		return $line;
330
	}
331
	public function parse($filename=null){
332
		if ($filename !== null){
333
			// test is_file et file_exist à faire 
334
			$this->_file = $filename;
335
		}
336
		if ($this->_file===null) return false;
337
 
338
		$fro = fopen( $this->_file, 'r' );
339
		while( $line = fgets( $fro ) )
340
		{
341
			/*
342
			on saute les commentaires
343
			*/
344
			if (preg_match('/^[[:space:]]*#/',$line) || preg_match('/^[[:space:]]*$/',$line))
345
					continue;
346
 
347
			//test d'entrée dans une section
348
			//if (preg_match('`^([\s[:print:]]*{[\s[:print:]]*)$`',$line)){//test section
349
			if (preg_match('`^([\sa-zA-Z0-9_-]*{[\s[:print:]]*)$`',$line)){//test section
350
 
351
				/*
352
				BUG : filter = "(uid=%{Stripped-User-Name:-%{User-Name}})"
353
 
354
				*/
355
 
356
				// Nétoyage des commentaires et espaces
357
				$tmp = explode("{", $line, 2);
358
				$line = trim($tmp[0]);
359
 
360
				// test here if exist an instance name
361
				$tmpInstanceName = "";
362
				$t = explode(" ", $line, 2);
363
				$tmpSectionName = $t[0];
364
				if (count($t)>1){
365
					$tmpInstanceName = $t[1];
366
				}
367
				// end test of an instance name
368
 
369
				if ($this->_pt===null){
370
					$this->addSection($tmpSectionName, $tmpInstanceName);
371
					$this->_pt = end($this->_items);
372
				} else {
373
					$this->_pt = $this->_pt->addSection($tmpSectionName, $tmpInstanceName);
374
				}
375
			}
376
			//recherche fin de section
377
			//elseif (preg_match('`^([\s]*}[\s]*)$`',$line)){//test fin de section
378
			elseif (preg_match('`^([\s]*}[\s[:print:]]*)$`',$line)){//test fin de section
379
				$this->_pt = $this->_pt->getParent();
380
			}
381
			//test de présence d'une pair parametre/valeur
382
			elseif (preg_match('`^([\s[:print:]]*=)`',$line)){ //test pair
383
				$tmpPair = trim($line);
384
				list($pairName, $pairValue) = explode('=', $tmpPair, 2);
385
				$pairName = trim($pairName);
386
				$pairValue = trim($pairValue);
387
 
388
				/*
389
				A FAIRE : 
390
				- prendre en compte le multi-ligne
391
				*/
392
				$l = strlen($pairValue);
393
				if (strpos($pairValue, "'") === 0){ // valeur entre des quotes
394
					$pairValue = preg_replace("`^[']([[:print:]]*)[']([[:print:]]*)`","$1",$pairValue);
395
				}elseif(strpos($pairValue, '"') === 0){// valeur entre des double-quotes
396
					$pairValue = preg_replace('`^["]([[:print:]]*)["]([[:print:]]*)`','$1',$pairValue);
397
				}else{ // valeur sans quote ou double-quote
398
					//suppression des commentaires (pour un # dans la chaine, alors il faut que la chaine soit entre quote ou double-quote)
399
					$tmp = explode("#", $pairValue, 2);
400
					$pairValue = trim($tmp[0]);
401
				}
402
 
403
				if ($this->_pt===null){
404
					$this->addPair($pairName,$pairValue);
405
				} else {
406
					$this->_pt->addPair($pairName,$pairValue);
407
				}
408
			}
409
			//test de présence d'un parametre (c'est traité comme une section mais sans contenu!)
410
			elseif (preg_match('`^([\s[:print:]]*)$`',$line)) { //test value
411
				$tmpItem = trim($line);
412
				if ($this->_pt===null){
413
					$this->addSection($tmpItem);
414
				} else {
415
					$this->_pt->addSection($tmpItem);
416
				}
417
			}
418
		}
419
		fclose( $fro );
420
		$this->_pt=null;
421
	}
422
}
423
?>