Subversion Repositories ALCASAR

Rev

Rev 775 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log

Rev 775 Rev 776
Line 1... Line 1...
1
<?php
1
<?php
2
/*
2
/*
3
TODO :
3
TODO :
4
- reprendre toutes les expressions régulières [ à contrôler]
4
- contrôler et tester les expressions régulières
5
- prise en compte de tous les types de commentaires
5
- prise en compte de tous les types de commentaires "# et *"
6
- prise en compte d'une valeurs multiligne
6
- prise en compte d'une valeurs multi-lignes
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
 
7
 
11
-> pas de setter pour le configreader
8
-> pas de setter pour le configreader
12
 
-
 
13
*/
9
*/
-
 
10
 
14
/**
11
/**
15
* Page contenant les classes <b>confItem</b>, <b>pairItem</b>, <b>sectionItem</b> et <b>configReader</b>.
12
* 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
13
* Ces classes permettent de parser des fichiers de configuration du même format
17
* que ceux utilisés par freeradius.
14
* que ceux utilisés par freeradius.
18
*/
15
*/
19
 
16
 
20
/*
-
 
21
The file consists of configuration items (variable = value pairs), sections, and comments. 
-
 
22
*/
-
 
23
 
-
 
24
/**
17
/**
25
* Classe abstraite <b>confItem</b>.
18
* Classe abstraite <b>confItem</b>.
26
*
19
*
27
* @name confItem
20
* @name confItem
28
* @author steweb57
21
* @author steweb57
29
* @version 0.1.0
22
* @version 0.2.0
30
*/
23
*/
31
Abstract class confItem
24
Abstract class confItem
32
{
25
{
33
	/**
26
	/**
34
	* Variable contenant le type d'item (pair ou section)
27
	* Variable contenant le type d'item (pair ou section)
Line 39... Line 32...
39
	* Variable contenant le nom de l'item
32
	* Variable contenant le nom de l'item
40
	* @var string
33
	* @var string
41
	*/
34
	*/
42
	protected $_name	= null;
35
	protected $_name	= null;
43
	/**
36
	/**
44
	* Variable contenant le nom de la section
37
	* Variable contenant le nom de l'instance de l'item (section uniquement)
45
	* @var string
38
	* @var string
46
	*/
39
	*/
-
 
40
	protected $_instanceName	= null;
47
	/**
41
	/**
48
	* Variable contenant le nom de l'instance de l'item
42
	* Variable contenant le lien vers la section parente (section uniquement???)
49
	* @var string
43
	* @var string
50
	*/
44
	*/
51
	protected $_instanceName	= null;
-
 
52
	/**
-
 
53
	protected $_parent	= null;
45
	protected $_parent	= null;
54
	/**
46
	/**
55
	 * Tableau contenant les parametres (items)
47
	 * Tableau contenant les parametres (items)
56
	 * @var array
48
	 * @var array
57
	 */
49
	 */
Line 72... Line 64...
72
	 * @return string
64
	 * @return string
73
	 */
65
	 */
74
	public function getType(){
66
	public function getType(){
75
		return $this->_type;
67
		return $this->_type;
76
	}
68
	}
-
 
69
	/**
-
 
70
	 * return all items
77
	
71
	 *
-
 
72
	 * @name getAll()
-
 
73
	 * @return array()
-
 
74
	 */
78
	public function getAll(){
75
	public function getAll(){
79
		return $this->_items;
76
		return $this->_items;
80
	}
77
	}
81
	
-
 
82
	
-
 
83
	/**
78
	/**
84
	 * return the name of the confItem
79
	 * return the name of the confItem
85
	 *
80
	 *
86
	 * @name getName()
81
	 * @name getName()
87
	 * @return string
82
	 * @return string
Line 116... Line 111...
116
			} else {
111
			} else {
117
				if (array_key_exists($attr, $this->_items))
112
				if (array_key_exists($attr, $this->_items))
118
					$resp[] = $this->_items[$attr];
113
					$resp[] = $this->_items[$attr];
119
			}
114
			}
120
		}
115
		}
121
		if (count($resp)===1){
116
		if (count($resp)===0){
-
 
117
			return false;
-
 
118
		}elseif (count($resp)===1){
122
			return $resp[0];
119
			return $resp[0];
123
		} else {
120
		} else {
124
			return $resp;// si vide, on répond par un array vide ou par false?
121
			return $resp;// si vide, on répond par un array vide ou par false?
125
		}
122
		}
126
	}
123
	}
Line 138... Line 135...
138
/**
135
/**
139
* Classe <b>pairItem</b>.
136
* Classe <b>pairItem</b>.
140
*
137
*
141
* @name pairItem
138
* @name pairItem
142
* @author steweb57
139
* @author steweb57
143
* @version 0.1.0
140
* @version 0.2.0
144
*/
141
*/
145
class pairItem extends confItem
142
class pairItem extends confItem
146
{
143
{
147
	protected $_type	= 'pair';
-
 
148
	protected $_name	= '';
-
 
149
	
-
 
150
	/**
144
	/**
151
	 * Constructeur
145
	 * Constructeur
152
	 *
146
	 *
153
	 * <p>création de l'instance de la classe</p>
147
	 * <p>création de l'instance de la classe</p>
154
	 *
148
	 *
155
	 * @name pairItem::__construct()
149
	 * @name pairItem::__construct()
156
	 * @param string $attr, $value
150
	 * @param string $pairName, $value
157
	 * @return void
151
	 * @return void
158
	 */
152
	 */
159
	public function __construct($attr,$value) {
153
	public function __construct($pairName,$value) {
-
 
154
		$this->_type = 'pair';
160
		$this->_items[$attr] = $value;
155
		$this->_items[$pairName] = $value;
161
		$this->_name = $attr;
156
		$this->_name = $pairName;
162
	}
157
	}
163
	/**
158
	/**
164
	 * Converte the object to a string
159
	 * Converte the object to a string
165
	 *
160
	 *
166
	 * @name __toString()
161
	 * @name __toString()
167
	 * @return string
162
	 * @return string
168
	 */
163
	 */
169
	public function __toString() {
164
	public function __toString() {
170
		return $this->_items[$this->_name];// ? afficher le nom de la variable ou sa valeur?
165
		return $this->_items[$this->_name];// on retourne la valeur
171
    }
166
    }
172
	/**
167
	/**
173
	 * Get a pair value
168
	 * Get a pair value
174
	 *
169
	 *
175
	 * @name getPair()
170
	 * @name getPair()
176
	 * @param string $pairName
171
	 * @param string $pairName
177
	 * @return string
172
	 * @return mixed (string or array)
178
	 */
173
	 */
179
	public function getPair($pairName = null){
174
	public function getPair($pairName = null){
180
		if ($pairName!==null){
175
		if ($pairName!==null){
181
			if (array_key_exists($pairName, $this->_items))
176
			if (array_key_exists($pairName, $this->_items)){
-
 
177
				return $this->_items[$pairName]; // on renvoie une valeur
-
 
178
			} else {
-
 
179
				return false;
-
 
180
			}
-
 
181
		} else {
-
 
182
			return $this->_items; //on renvoie un tableau
-
 
183
		}
-
 
184
	}
-
 
185
	public function __get($pairName){
182
				return $this->_items[$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;
183
		} else {
200
		} else {
184
			return $this->_items;
201
			return false;
185
		}
202
		}
186
	}
203
	}
-
 
204
	public function __set($pairName, $value){
-
 
205
		return $this->setPair($pairName, $value);
-
 
206
	}
187
}
207
}
-
 
208
/**
-
 
209
* Classe <b>sectionItem</b>.
188
 
210
*
-
 
211
* @name sectionItem
-
 
212
* @author steweb57
-
 
213
* @version 0.3.6
-
 
214
*/
189
class sectionItem extends confItem
215
class sectionItem extends confItem //extends pairItems?????
190
{
216
{
-
 
217
	/**
-
 
218
	 * Constructeur
-
 
219
	 *
-
 
220
	 * <p>création de l'instance de la classe</p>
-
 
221
	 *
191
	protected $_type	= 'section';
222
	 * @name sectionItem::__construct()
192
	protected $_name	= '';
223
	 * @param string $name
-
 
224
	 * @param string $instanceName
-
 
225
	 * @param sectionItem $parent
-
 
226
	 * @return void
193
 
227
	 */
194
	public function __construct($name, sectionItem &$parent=null, $instanceName = "") {
228
	public function __construct($name, $instanceName = "", sectionItem &$parent=null) {
-
 
229
		$this->_type = 'section';
195
		$this->_parent = $parent;
230
		$this->_parent = $parent;
196
		$this->_name = $name;
231
		$this->_name = $name;
197
		$this->_instanceName = $instanceName;
232
		$this->_instanceName = $instanceName;
198
	}
233
	}
-
 
234
	/**
-
 
235
	 * add a new child sectionItem
-
 
236
	 *
-
 
237
	 * @name addSection()
-
 
238
	 * @param string $name
-
 
239
	 * @param string $instanceName
-
 
240
	 * @return sectionItem object
-
 
241
	 */
199
	public function addSection($name, $instanceName = "") {
242
	public function addSection($name, $instanceName = "") {
200
		$this->_items[] = new sectionItem($name, $this, $instanceName);
243
		$this->_items[] = new sectionItem($name, $instanceName, $this);
201
		return end($this->_items);
244
		return end($this->_items);
202
	}
245
	}
-
 
246
	/**
-
 
247
	 * add a new child pairItem
-
 
248
	 *
-
 
249
	 * @name addPair()
-
 
250
	 * @param string $pairName
-
 
251
	 * @param string $value
-
 
252
	 * @return pairItem Object
-
 
253
	 */
203
	public function addPair($name, $value) {
254
	public function addPair($pairName, $value) {
204
		$this->_items[] = new pairItem($name, $value);
255
		$this->_items[] = new pairItem($pairName, $value);
205
		return end($this->_items);
256
		return end($this->_items);
206
	}
257
	}
207
	/**
258
	/**
208
	 * return the child instance of the confSection
259
	 * return the child instance of the confSection by instanceName
209
	 *
260
	 *
210
	 * @name getInstance()
261
	 * @name getInstance()
211
	 * @return string
262
	 * @param string $instanceName
-
 
263
	 * @return mixed (sectionItem object or array())
212
	 */
264
	 */
213
	public function getInstance($instanceName=nill){
265
	public function getInstance($instanceName=null){
214
		if ($instanceName === null)
266
		if ($instanceName === null)
215
			return false;
267
			return false;
216
		$resp = array();
268
		$resp = array();
217
		foreach ($this->_items as $item){
269
		foreach ($this->_items as $item){
218
			if ($item->getType() !== 'section'){
270
			if ($item->getType() !== 'section'){
Line 220... Line 272...
220
			}
272
			}
221
			if ($item->getInstanceName() === $instanceName){
273
			if ($item->getInstanceName() === $instanceName){
222
				$resp[] = $item;
274
				$resp[] = $item;
223
			}
275
			}
224
		}
276
		}
225
		if (count($resp)===1){
277
		if (count($resp)===0){
-
 
278
			return false;
-
 
279
		}elseif (count($resp)===1){
226
			return $resp[0];
280
			return $resp[0];
227
		} else {
281
		} else {
228
			return $resp;
282
			return $resp;
229
		}
283
		}
230
	}
284
	}
-
 
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
	 */
231
	public function getSectionInstance($sectionName = null, $instanceName=null){
293
	public function getSectionInstance($sectionName = null, $instanceName=null){
232
		
-
 
233
		if (($sectionName === null)||($instanceName === null))
294
		if (($sectionName === null)||($instanceName === null))
234
			return false;
295
			return false;
235
		$resp = array();
296
		$resp = array();
236
		
-
 
237
		foreach ($this->_items as $item){
297
		foreach ($this->_items as $item){
238
			if ($item->getType() !== 'section'){
298
			if ($item->getType() !== 'section'){
239
				continue;
299
				continue;
240
			}
300
			}
241
			if (($item->getName() === $sectionName)&&($item->getInstanceName() === $instanceName)){
301
			if (($item->getName() === $sectionName)&&($item->getInstanceName() === $instanceName)){
242
				$resp[] = $item;
302
				$resp[] = $item;
-
 
303
				
243
			}
304
			}
244
		}
305
		}
245
		if (count($resp)===1){
306
		if (count($resp)===0){
-
 
307
			return false;
-
 
308
		}elseif (count($resp)===1){
246
			return $resp[0];
309
			return $resp[0];
247
		} else {
310
		} else {
248
			return $resp;
311
			return $resp;
249
		}
312
		}
250
	}
313
	}
-
 
314
	/**
-
 
315
	 * return child sectionItems of the sectionItem
251
	
316
	 *
-
 
317
	 * @name getSection()
-
 
318
	 * @param string $sectionName
-
 
319
	 * @return mixed (sectionItem object or array())
-
 
320
	 */
252
	public function getSection($sectionName = null){
321
	public function getSection($sectionName = null){
253
		$resp = array();
322
		$resp = array();
254
		foreach ($this->_items as $item){
323
		foreach ($this->_items as $item){
255
			if ($item->getType() !== 'section'){
324
			if ($item->getType() !== 'section'){
256
				continue;
325
				continue;
Line 261... Line 330...
261
				if ($item->getName() === $sectionName){
330
				if ($item->getName() === $sectionName){
262
					$resp[] = $item;
331
					$resp[] = $item;
263
				}
332
				}
264
			}
333
			}
265
		}
334
		}
266
		if (count($resp)===1){
335
		if (count($resp)===0){
-
 
336
			return false;
-
 
337
		}elseif (count($resp)===1){
267
			return $resp[0];
338
			return $resp[0];
268
		} else {
339
		} else {
269
			return $resp;
340
			return $resp;
270
		}
341
		}
271
	}
342
	}
-
 
343
	/**
-
 
344
	 * return child pairItems of the sectionItem
-
 
345
	 *
-
 
346
	 * @name getPair()
-
 
347
	 * @param string $pairName
-
 
348
	 * @return mixed (pairItem object or array())
-
 
349
	 */
272
	public function getPair($pairName = null){
350
	public function getPair($pairName = null){
273
		$resp = array();
351
		$resp = array();
274
		foreach ($this->_items as $item){
352
		foreach ($this->_items as $item){
275
			if ($item->getType() !== 'pair'){
353
			if ($item->getType() !== 'pair'){
276
				continue;
354
				continue;
277
			}
355
			}
278
			if ($pairName === null){
356
			if ($pairName === null){
279
				$resp[] = $item;
357
				$resp[] = $item;
280
			} else {
358
			} else {
281
				if ($item->getName() === $pairName){
359
				if ($item->getName() === $pairName){
282
					//return $item; //only the first answer
-
 
283
					$resp[] = $item;
360
					$resp[] = $item;
284
				}
361
				}
285
			}
362
			}
286
		}
363
		}
287
		if (count($resp)===1){
364
		if (count($resp)===0){
-
 
365
			return false;
-
 
366
		}elseif (count($resp)===1){
288
			return $resp[0];
367
			return $resp[0];
289
		} else {
368
		} else {
290
			return $resp;
369
			return $resp;
291
		}
370
		}
292
	}
371
	}
-
 
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
	
293
}
429
}
294
/**
430
/**
295
* Classe <b>configReader</b>.
431
* Classe <b>configReader</b>.
296
*
432
*
297
* @name configReader
433
* @name configReader
298
* @author steweb57
434
* @author steweb57
299
* @version 0.1.0
435
* @version 0.4.0
300
*/
436
*/
301
class configReader extends sectionItem
437
class configReader extends sectionItem
302
{
438
{
303
	private $_file = null;
439
	private $_file = null;
304
	private $_pt	= null;
440
	private $_pt	= null;
Line 307... Line 443...
307
	/**
443
	/**
308
	 * Constructeur
444
	 * Constructeur
309
	 *
445
	 *
310
	 * <p>création de l'instance de la classe</p>
446
	 * <p>création de l'instance de la classe</p>
311
	 *
447
	 *
312
	 * @name config_file::__construct()
448
	 * @name configReader::__construct()
313
	 * @param string $filename
449
	 * @param string $filename
314
	 * @return void
450
	 * @return void
315
	 */
451
	 */
316
	public function __construct($filename=null) {
452
	public function __construct($filename=null) {
317
 
453
 
Line 323... Line 459...
323
	 * Destructeur
459
	 * Destructeur
324
	 */
460
	 */
325
	public function __destruct() {
461
	public function __destruct() {
326
		$this->_file = NULL;
462
		$this->_file = NULL;
327
	}
463
	}
-
 
464
	/**
-
 
465
	 *
-
 
466
	 * @name configReader::_deleteComment()
-
 
467
	 * @param string $line
-
 
468
	 * @return void
-
 
469
	 */
328
	private function _deleteComment($line){
470
	private function _deleteComment($line){
329
		return $line;
471
		return $line;
330
	}
472
	}
-
 
473
	/**
-
 
474
	 * parse the configFile
-
 
475
	 *
-
 
476
	 * @name config_file::parse()
-
 
477
	 * @param file $filename
-
 
478
	 * @return void
-
 
479
	 */
331
	public function parse($filename=null){
480
	public function parse($filename=null){
332
		if ($filename !== null){
481
		if ($filename !== null){
333
			// test is_file et file_exist à faire 
482
			// test is_file et file_exist à faire 
334
			$this->_file = $filename;
483
			$this->_file = $filename;
335
		}
484
		}
Line 343... Line 492...
343
			*/
492
			*/
344
			if (preg_match('/^[[:space:]]*#/',$line) || preg_match('/^[[:space:]]*$/',$line))
493
			if (preg_match('/^[[:space:]]*#/',$line) || preg_match('/^[[:space:]]*$/',$line))
345
					continue;
494
					continue;
346
					
495
					
347
			//test d'entrée dans une section
496
			//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
497
			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
				*/
498
							
355
				
-
 
356
				// Nétoyage des commentaires et espaces
499
				// Nétoyage des commentaires et espaces
357
				$tmp = explode("{", $line, 2);
500
				$tmp = explode("{", $line, 2);
358
				$line = trim($tmp[0]);
501
				$line = trim($tmp[0]);
359
											
502
											
360
				// test here if exist an instance name
503
				// test here if exist an instance name
Line 372... Line 515...
372
				} else {
515
				} else {
373
					$this->_pt = $this->_pt->addSection($tmpSectionName, $tmpInstanceName);
516
					$this->_pt = $this->_pt->addSection($tmpSectionName, $tmpInstanceName);
374
				}
517
				}
375
			}
518
			}
376
			//recherche fin de section
519
			//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
520
			elseif (preg_match('`^([\s]*}[\s[:print:]]*)$`',$line)){//test fin de section
379
				$this->_pt = $this->_pt->getParent();
521
				$this->_pt = $this->_pt->getParent();
380
			}
522
			}
381
			//test de présence d'une pair parametre/valeur
523
			//test de présence d'une pair parametre/valeur
382
			elseif (preg_match('`^([\s[:print:]]*=)`',$line)){ //test pair
524
			elseif (preg_match('`^([\s[:print:]]*=)`',$line)){ //test pair