Subversion Repositories ALCASAR

Rev

Rev 775 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log

Rev Author Line No. Line
775 stephane 1
<?php
2
/*
3
TODO :
776 stephane 4
- contrôler et tester les expressions régulières
5
- prise en compte de tous les types de commentaires "# et *"
6
- prise en compte d'une valeurs multi-lignes
775 stephane 7
 
8
-> pas de setter pour le configreader
776 stephane 9
*/
775 stephane 10
 
11
/**
12
* Page contenant les classes <b>confItem</b>, <b>pairItem</b>, <b>sectionItem</b> et <b>configReader</b>.
13
* Ces classes permettent de parser des fichiers de configuration du même format
14
* que ceux utilisés par freeradius.
15
*/
16
 
17
/**
18
* Classe abstraite <b>confItem</b>.
19
*
20
* @name confItem
21
* @author steweb57
776 stephane 22
* @version 0.2.0
775 stephane 23
*/
24
Abstract class confItem
25
{
26
	/**
27
	* Variable contenant le type d'item (pair ou section)
28
	* @var string
29
	*/
30
	protected $_type	= null;
31
	/**
32
	* Variable contenant le nom de l'item
33
	* @var string
34
	*/
35
	protected $_name	= null;
36
	/**
776 stephane 37
	* Variable contenant le nom de l'instance de l'item (section uniquement)
775 stephane 38
	* @var string
39
	*/
776 stephane 40
	protected $_instanceName	= null;
775 stephane 41
	/**
776 stephane 42
	* Variable contenant le lien vers la section parente (section uniquement???)
775 stephane 43
	* @var string
44
	*/
45
	protected $_parent	= null;
46
	/**
47
	 * Tableau contenant les parametres (items)
48
	 * @var array
49
	 */
50
	protected $_items	= array();
51
	/**
52
	 * Return the parent confItem
53
	 *
54
	 * @name getParent()()
55
	 * @return confItem
56
	 */
57
	public function getParent(){
58
		return $this->_parent;
59
	}
60
	/**
61
	 * return the type of the confItem
62
	 *
63
	 * @name getType()
64
	 * @return string
65
	 */
66
	public function getType(){
67
		return $this->_type;
68
	}
776 stephane 69
	/**
70
	 * return all items
71
	 *
72
	 * @name getAll()
73
	 * @return array()
74
	 */
775 stephane 75
	public function getAll(){
76
		return $this->_items;
77
	}
78
	/**
79
	 * return the name of the confItem
80
	 *
81
	 * @name getName()
82
	 * @return string
83
	 */
84
	public function getName(){
85
		return $this->_name;
86
	}
87
	/**
88
	 * return the instance name of the confItem
89
	 *
90
	 * @name getInstanceName()
91
	 * @return string
92
	 */
93
	public function getInstanceName(){
94
		return $this->_instanceName;
95
	}
96
	/**
97
	 *
98
	 * Return the specified atribute
99
	 *
100
	 * @name __get()
101
	 * @param string $attr
102
	 * @return mixed (confitem object or string)
103
	 */
104
	public function __get($attr) {
105
		$resp=array();
106
		foreach ($this->_items as $item){
107
			if (is_object($item)){
108
				if ($item->getName() === $attr){
109
					$resp[] = $item;
110
				}
111
			} else {
112
				if (array_key_exists($attr, $this->_items))
113
					$resp[] = $this->_items[$attr];
114
			}
115
		}
776 stephane 116
		if (count($resp)===0){
117
			return false;
118
		}elseif (count($resp)===1){
775 stephane 119
			return $resp[0];
120
		} else {
121
			return $resp;// si vide, on répond par un array vide ou par false?
122
		}
123
	}
124
	/**
125
	 * Converte the object to a string
126
	 *
127
	 * @name __toString()
128
	 * @return string
129
	 */
130
	public function __toString() {
131
		return $this->_name;
132
    }
133
}
134
 
135
/**
136
* Classe <b>pairItem</b>.
137
*
138
* @name pairItem
139
* @author steweb57
776 stephane 140
* @version 0.2.0
775 stephane 141
*/
142
class pairItem extends confItem
143
{
144
	/**
145
	 * Constructeur
146
	 *
147
	 * <p>création de l'instance de la classe</p>
148
	 *
149
	 * @name pairItem::__construct()
776 stephane 150
	 * @param string $pairName, $value
775 stephane 151
	 * @return void
152
	 */
776 stephane 153
	public function __construct($pairName,$value) {
154
		$this->_type = 'pair';
155
		$this->_items[$pairName] = $value;
156
		$this->_name = $pairName;
775 stephane 157
	}
158
	/**
159
	 * Converte the object to a string
160
	 *
161
	 * @name __toString()
162
	 * @return string
163
	 */
164
	public function __toString() {
776 stephane 165
		return $this->_items[$this->_name];// on retourne la valeur
775 stephane 166
    }
167
	/**
168
	 * Get a pair value
169
	 *
170
	 * @name getPair()
171
	 * @param string $pairName
776 stephane 172
	 * @return mixed (string or array)
775 stephane 173
	 */
174
	public function getPair($pairName = null){
175
		if ($pairName!==null){
776 stephane 176
			if (array_key_exists($pairName, $this->_items)){
177
				return $this->_items[$pairName]; // on renvoie une valeur
178
			} else {
179
				return false;
180
			}
775 stephane 181
		} else {
776 stephane 182
			return $this->_items; //on renvoie un tableau
775 stephane 183
		}
184
	}
776 stephane 185
	public function __get($pairName){
186
		return $this->getPair($pairName);
187
	}
188
	/**
189
	 * Set a pair value
190
	 *
191
	 * @name getPair()
192
	 * @param string $pairName
193
	 * @param string $value
194
	 * @return bool
195
	 */
196
	public function setPair($pairName, $value){
197
		if (array_key_exists($pairName, $this->_items)){
198
				$this->_items[$pairName] = $value;
199
				return true;
200
		} else {
201
			return false;
202
		}
203
	}
204
	public function __set($pairName, $value){
205
		return $this->setPair($pairName, $value);
206
	}
775 stephane 207
}
776 stephane 208
/**
209
* Classe <b>sectionItem</b>.
210
*
211
* @name sectionItem
212
* @author steweb57
213
* @version 0.3.6
214
*/
215
class sectionItem extends confItem //extends pairItems?????
775 stephane 216
{
776 stephane 217
	/**
218
	 * Constructeur
219
	 *
220
	 * <p>création de l'instance de la classe</p>
221
	 *
222
	 * @name sectionItem::__construct()
223
	 * @param string $name
224
	 * @param string $instanceName
225
	 * @param sectionItem $parent
226
	 * @return void
227
	 */
228
	public function __construct($name, $instanceName = "", sectionItem &$parent=null) {
229
		$this->_type = 'section';
775 stephane 230
		$this->_parent = $parent;
231
		$this->_name = $name;
232
		$this->_instanceName = $instanceName;
233
	}
776 stephane 234
	/**
235
	 * add a new child sectionItem
236
	 *
237
	 * @name addSection()
238
	 * @param string $name
239
	 * @param string $instanceName
240
	 * @return sectionItem object
241
	 */
775 stephane 242
	public function addSection($name, $instanceName = "") {
776 stephane 243
		$this->_items[] = new sectionItem($name, $instanceName, $this);
775 stephane 244
		return end($this->_items);
245
	}
776 stephane 246
	/**
247
	 * add a new child pairItem
248
	 *
249
	 * @name addPair()
250
	 * @param string $pairName
251
	 * @param string $value
252
	 * @return pairItem Object
253
	 */
254
	public function addPair($pairName, $value) {
255
		$this->_items[] = new pairItem($pairName, $value);
775 stephane 256
		return end($this->_items);
257
	}
258
	/**
776 stephane 259
	 * return the child instance of the confSection by instanceName
775 stephane 260
	 *
261
	 * @name getInstance()
776 stephane 262
	 * @param string $instanceName
263
	 * @return mixed (sectionItem object or array())
775 stephane 264
	 */
776 stephane 265
	public function getInstance($instanceName=null){
775 stephane 266
		if ($instanceName === null)
267
			return false;
268
		$resp = array();
269
		foreach ($this->_items as $item){
270
			if ($item->getType() !== 'section'){
271
				continue;
272
			}
273
			if ($item->getInstanceName() === $instanceName){
274
				$resp[] = $item;
275
			}
276
		}
776 stephane 277
		if (count($resp)===0){
278
			return false;
279
		}elseif (count($resp)===1){
775 stephane 280
			return $resp[0];
281
		} else {
282
			return $resp;
283
		}
284
	}
776 stephane 285
	/**
286
	 * return the child instance of the confSection by instanceName and sectionName
287
	 *
288
	 * @name getSectionInstance()
289
	 * @param string $sectionName
290
	 * @param string $instanceName
291
	 * @return mixed (sectionItem object or array())
292
	 */
775 stephane 293
	public function getSectionInstance($sectionName = null, $instanceName=null){
294
		if (($sectionName === null)||($instanceName === null))
295
			return false;
296
		$resp = array();
297
		foreach ($this->_items as $item){
298
			if ($item->getType() !== 'section'){
299
				continue;
300
			}
301
			if (($item->getName() === $sectionName)&&($item->getInstanceName() === $instanceName)){
302
				$resp[] = $item;
776 stephane 303
 
775 stephane 304
			}
305
		}
776 stephane 306
		if (count($resp)===0){
307
			return false;
308
		}elseif (count($resp)===1){
775 stephane 309
			return $resp[0];
310
		} else {
311
			return $resp;
312
		}
313
	}
776 stephane 314
	/**
315
	 * return child sectionItems of the sectionItem
316
	 *
317
	 * @name getSection()
318
	 * @param string $sectionName
319
	 * @return mixed (sectionItem object or array())
320
	 */
775 stephane 321
	public function getSection($sectionName = null){
322
		$resp = array();
323
		foreach ($this->_items as $item){
324
			if ($item->getType() !== 'section'){
325
				continue;
326
			}
327
			if ($sectionName === null){
328
				$resp[] = $item;
329
			} else {
330
				if ($item->getName() === $sectionName){
331
					$resp[] = $item;
332
				}
333
			}
334
		}
776 stephane 335
		if (count($resp)===0){
336
			return false;
337
		}elseif (count($resp)===1){
775 stephane 338
			return $resp[0];
339
		} else {
340
			return $resp;
341
		}
342
	}
776 stephane 343
	/**
344
	 * return child pairItems of the sectionItem
345
	 *
346
	 * @name getPair()
347
	 * @param string $pairName
348
	 * @return mixed (pairItem object or array())
349
	 */
775 stephane 350
	public function getPair($pairName = null){
351
		$resp = array();
352
		foreach ($this->_items as $item){
353
			if ($item->getType() !== 'pair'){
354
				continue;
355
			}
356
			if ($pairName === null){
357
				$resp[] = $item;
358
			} else {
359
				if ($item->getName() === $pairName){
360
					$resp[] = $item;
361
				}
362
			}
363
		}
776 stephane 364
		if (count($resp)===0){
365
			return false;
366
		}elseif (count($resp)===1){
775 stephane 367
			return $resp[0];
368
		} else {
369
			return $resp;
370
		}
371
	}
776 stephane 372
 
373
	public function __get($name){
374
		if ($this->getSection($name)!==false){
375
			return $this->getSection($name);
376
		} elseif ($this->getPair($name)!==false) {
377
			return $this->getPair($name);
378
		} elseif ($this->getInstance($name)!==false) {
379
			return $this->getInstance($name);
380
		} else {
381
			return false;
382
		}
383
	}
384
	public function setSection($sectionName, sectionItem $sectionItem){
385
		$t = false;
386
		foreach ($this->_items as $key => $item){
387
			if ($item->getType() !== 'section'){
388
				continue;
389
			}
390
			if ($item->getName() === $sectionName){
391
				$this->_items[$key] = $sectionItem;
392
				$t = true;
393
			}
394
		}
395
		return $t;
396
	}
397
 
398
	public function setInstance($instanceName, $value){
399
		foreach ($this->_items as $key => $item){
400
			if ($item->getType() !== 'section'){
401
				continue;
402
			}
403
			if ($item->getInstanceName() === $instanceName){
404
				$this->_items[$key] = $value;
405
			}
406
		}
407
		// test pour valeur de retour ?
408
	}
409
 
410
 
411
	public function setSectionInstance($sectionName, $instanceName, $value){
412
		foreach ($this->_items as $key => $item){
413
			if ($item->getType() !== 'section'){
414
				continue;
415
			}
416
			if (($item->getName() === $sectionName)&&($item->getInstanceName() === $instanceName)){
417
				$this->_items[$key] = $value;
418
			}
419
		}
420
		// test pour valeur de retour ?
421
	}
422
 
423
	public function __set($name, $value){
424
		return $this->setSection($name, $value);
425
		// use others methode width instance ?
426
		// create section if not existe?
427
	}
428
 
775 stephane 429
}
430
/**
431
* Classe <b>configReader</b>.
432
*
433
* @name configReader
434
* @author steweb57
776 stephane 435
* @version 0.4.0
775 stephane 436
*/
437
class configReader extends sectionItem
438
{
439
	private $_file = null;
440
	private $_pt	= null;
441
	protected $_name	= "root";
442
 
443
	/**
444
	 * Constructeur
445
	 *
446
	 * <p>création de l'instance de la classe</p>
447
	 *
776 stephane 448
	 * @name configReader::__construct()
775 stephane 449
	 * @param string $filename
450
	 * @return void
451
	 */
452
	public function __construct($filename=null) {
453
 
454
		if ($filename !== null){
455
			$this->parse($filename);
456
		}
457
	}
458
	/**
459
	 * Destructeur
460
	 */
461
	public function __destruct() {
462
		$this->_file = NULL;
463
	}
776 stephane 464
	/**
465
	 *
466
	 * @name configReader::_deleteComment()
467
	 * @param string $line
468
	 * @return void
469
	 */
775 stephane 470
	private function _deleteComment($line){
471
		return $line;
472
	}
776 stephane 473
	/**
474
	 * parse the configFile
475
	 *
476
	 * @name config_file::parse()
477
	 * @param file $filename
478
	 * @return void
479
	 */
775 stephane 480
	public function parse($filename=null){
481
		if ($filename !== null){
482
			// test is_file et file_exist à faire 
483
			$this->_file = $filename;
484
		}
485
		if ($this->_file===null) return false;
486
 
487
		$fro = fopen( $this->_file, 'r' );
488
		while( $line = fgets( $fro ) )
489
		{
490
			/*
491
			on saute les commentaires
492
			*/
493
			if (preg_match('/^[[:space:]]*#/',$line) || preg_match('/^[[:space:]]*$/',$line))
494
					continue;
495
 
496
			//test d'entrée dans une section
497
			if (preg_match('`^([\sa-zA-Z0-9_-]*{[\s[:print:]]*)$`',$line)){//test section
776 stephane 498
 
775 stephane 499
				// Nétoyage des commentaires et espaces
500
				$tmp = explode("{", $line, 2);
501
				$line = trim($tmp[0]);
502
 
503
				// test here if exist an instance name
504
				$tmpInstanceName = "";
505
				$t = explode(" ", $line, 2);
506
				$tmpSectionName = $t[0];
507
				if (count($t)>1){
508
					$tmpInstanceName = $t[1];
509
				}
510
				// end test of an instance name
511
 
512
				if ($this->_pt===null){
513
					$this->addSection($tmpSectionName, $tmpInstanceName);
514
					$this->_pt = end($this->_items);
515
				} else {
516
					$this->_pt = $this->_pt->addSection($tmpSectionName, $tmpInstanceName);
517
				}
518
			}
519
			//recherche fin de section
520
			elseif (preg_match('`^([\s]*}[\s[:print:]]*)$`',$line)){//test fin de section
521
				$this->_pt = $this->_pt->getParent();
522
			}
523
			//test de présence d'une pair parametre/valeur
524
			elseif (preg_match('`^([\s[:print:]]*=)`',$line)){ //test pair
525
				$tmpPair = trim($line);
526
				list($pairName, $pairValue) = explode('=', $tmpPair, 2);
527
				$pairName = trim($pairName);
528
				$pairValue = trim($pairValue);
529
 
530
				/*
531
				A FAIRE : 
532
				- prendre en compte le multi-ligne
533
				*/
534
				$l = strlen($pairValue);
535
				if (strpos($pairValue, "'") === 0){ // valeur entre des quotes
536
					$pairValue = preg_replace("`^[']([[:print:]]*)[']([[:print:]]*)`","$1",$pairValue);
537
				}elseif(strpos($pairValue, '"') === 0){// valeur entre des double-quotes
538
					$pairValue = preg_replace('`^["]([[:print:]]*)["]([[:print:]]*)`','$1',$pairValue);
539
				}else{ // valeur sans quote ou double-quote
540
					//suppression des commentaires (pour un # dans la chaine, alors il faut que la chaine soit entre quote ou double-quote)
541
					$tmp = explode("#", $pairValue, 2);
542
					$pairValue = trim($tmp[0]);
543
				}
544
 
545
				if ($this->_pt===null){
546
					$this->addPair($pairName,$pairValue);
547
				} else {
548
					$this->_pt->addPair($pairName,$pairValue);
549
				}
550
			}
551
			//test de présence d'un parametre (c'est traité comme une section mais sans contenu!)
552
			elseif (preg_match('`^([\s[:print:]]*)$`',$line)) { //test value
553
				$tmpItem = trim($line);
554
				if ($this->_pt===null){
555
					$this->addSection($tmpItem);
556
				} else {
557
					$this->_pt->addSection($tmpItem);
558
				}
559
			}
560
		}
561
		fclose( $fro );
562
		$this->_pt=null;
563
	}
564
}
565
?>