Subversion Repositories ALCASAR

Rev

Rev 776 | 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
	}
777 stephane 384
	public function deleteSection($sectionName, $instanceName=null){
385
		$t = false;
386
		foreach ($this->_items as $key => $item){
387
			if ($item->getType() !== 'section'){
388
				continue;
389
			}
390
			if ($item->getName() === $sectionName){
391
				if ($instanceName!==null){
392
					if ($item->getInstanceName() === $instanceName){
393
						unset($this->_items[$key]);
394
						$t = true;
395
					}
396
				} else {
397
					unset($this->_items[$key]);
398
					$t = true;
399
				}
400
			}
401
		}
402
		return $t;
403
	}
776 stephane 404
	public function setSection($sectionName, sectionItem $sectionItem){
405
		$t = false;
406
		foreach ($this->_items as $key => $item){
407
			if ($item->getType() !== 'section'){
408
				continue;
409
			}
410
			if ($item->getName() === $sectionName){
411
				$this->_items[$key] = $sectionItem;
412
				$t = true;
413
			}
414
		}
415
		return $t;
416
	}
417
 
418
	public function setInstance($instanceName, $value){
419
		foreach ($this->_items as $key => $item){
420
			if ($item->getType() !== 'section'){
421
				continue;
422
			}
423
			if ($item->getInstanceName() === $instanceName){
424
				$this->_items[$key] = $value;
425
			}
426
		}
427
		// test pour valeur de retour ?
428
	}
429
 
430
 
431
	public function setSectionInstance($sectionName, $instanceName, $value){
432
		foreach ($this->_items as $key => $item){
433
			if ($item->getType() !== 'section'){
434
				continue;
435
			}
436
			if (($item->getName() === $sectionName)&&($item->getInstanceName() === $instanceName)){
437
				$this->_items[$key] = $value;
438
			}
439
		}
440
		// test pour valeur de retour ?
441
	}
442
 
443
	public function __set($name, $value){
444
		return $this->setSection($name, $value);
445
		// use others methode width instance ?
446
		// create section if not existe?
447
	}
448
 
775 stephane 449
}
450
/**
451
* Classe <b>configReader</b>.
452
*
453
* @name configReader
454
* @author steweb57
776 stephane 455
* @version 0.4.0
775 stephane 456
*/
457
class configReader extends sectionItem
458
{
459
	private $_file = null;
460
	private $_pt	= null;
461
	protected $_name	= "root";
462
 
463
	/**
464
	 * Constructeur
465
	 *
466
	 * <p>création de l'instance de la classe</p>
467
	 *
776 stephane 468
	 * @name configReader::__construct()
775 stephane 469
	 * @param string $filename
470
	 * @return void
471
	 */
472
	public function __construct($filename=null) {
473
 
474
		if ($filename !== null){
475
			$this->parse($filename);
476
		}
477
	}
478
	/**
479
	 * Destructeur
480
	 */
481
	public function __destruct() {
482
		$this->_file = NULL;
483
	}
776 stephane 484
	/**
485
	 *
486
	 * @name configReader::_deleteComment()
487
	 * @param string $line
488
	 * @return void
489
	 */
775 stephane 490
	private function _deleteComment($line){
491
		return $line;
492
	}
776 stephane 493
	/**
494
	 * parse the configFile
495
	 *
496
	 * @name config_file::parse()
497
	 * @param file $filename
498
	 * @return void
499
	 */
775 stephane 500
	public function parse($filename=null){
501
		if ($filename !== null){
502
			// test is_file et file_exist à faire 
503
			$this->_file = $filename;
504
		}
505
		if ($this->_file===null) return false;
506
 
507
		$fro = fopen( $this->_file, 'r' );
508
		while( $line = fgets( $fro ) )
509
		{
510
			/*
511
			on saute les commentaires
512
			*/
513
			if (preg_match('/^[[:space:]]*#/',$line) || preg_match('/^[[:space:]]*$/',$line))
514
					continue;
515
 
516
			//test d'entrée dans une section
517
			if (preg_match('`^([\sa-zA-Z0-9_-]*{[\s[:print:]]*)$`',$line)){//test section
776 stephane 518
 
775 stephane 519
				// Nétoyage des commentaires et espaces
520
				$tmp = explode("{", $line, 2);
521
				$line = trim($tmp[0]);
522
 
523
				// test here if exist an instance name
524
				$tmpInstanceName = "";
525
				$t = explode(" ", $line, 2);
526
				$tmpSectionName = $t[0];
527
				if (count($t)>1){
528
					$tmpInstanceName = $t[1];
529
				}
530
				// end test of an instance name
531
 
532
				if ($this->_pt===null){
533
					$this->addSection($tmpSectionName, $tmpInstanceName);
534
					$this->_pt = end($this->_items);
535
				} else {
536
					$this->_pt = $this->_pt->addSection($tmpSectionName, $tmpInstanceName);
537
				}
538
			}
539
			//recherche fin de section
540
			elseif (preg_match('`^([\s]*}[\s[:print:]]*)$`',$line)){//test fin de section
541
				$this->_pt = $this->_pt->getParent();
542
			}
543
			//test de présence d'une pair parametre/valeur
544
			elseif (preg_match('`^([\s[:print:]]*=)`',$line)){ //test pair
545
				$tmpPair = trim($line);
546
				list($pairName, $pairValue) = explode('=', $tmpPair, 2);
547
				$pairName = trim($pairName);
548
				$pairValue = trim($pairValue);
549
 
550
				/*
551
				A FAIRE : 
552
				- prendre en compte le multi-ligne
553
				*/
554
				$l = strlen($pairValue);
555
				if (strpos($pairValue, "'") === 0){ // valeur entre des quotes
556
					$pairValue = preg_replace("`^[']([[:print:]]*)[']([[:print:]]*)`","$1",$pairValue);
557
				}elseif(strpos($pairValue, '"') === 0){// valeur entre des double-quotes
558
					$pairValue = preg_replace('`^["]([[:print:]]*)["]([[:print:]]*)`','$1',$pairValue);
559
				}else{ // valeur sans quote ou double-quote
560
					//suppression des commentaires (pour un # dans la chaine, alors il faut que la chaine soit entre quote ou double-quote)
561
					$tmp = explode("#", $pairValue, 2);
562
					$pairValue = trim($tmp[0]);
563
				}
564
 
565
				if ($this->_pt===null){
566
					$this->addPair($pairName,$pairValue);
567
				} else {
568
					$this->_pt->addPair($pairName,$pairValue);
569
				}
570
			}
571
			//test de présence d'un parametre (c'est traité comme une section mais sans contenu!)
572
			elseif (preg_match('`^([\s[:print:]]*)$`',$line)) { //test value
573
				$tmpItem = trim($line);
574
				if ($this->_pt===null){
575
					$this->addSection($tmpItem);
576
				} else {
577
					$this->_pt->addSection($tmpItem);
578
				}
579
			}
580
		}
581
		fclose( $fro );
582
		$this->_pt=null;
583
	}
584
}
585
?>