0,0 → 1,423 |
<?php |
/* |
TODO : |
- reprendre toutes les expressions régulières [ à contrôler] |
- prise en compte de tous les types de commentaires |
- prise en compte d'une valeurs multiligne |
- suppressions plus rigoureuse des quote et double cote. (FAIT) |
- correction de quelques bugs |
- prise en charge de la lecture de section "nommée" (etc: ldap toto {...} )[fait à tester] |
|
-> pas de setter pour le configreader |
|
*/ |
/** |
* Page contenant les classes <b>confItem</b>, <b>pairItem</b>, <b>sectionItem</b> et <b>configReader</b>. |
* Ces classes permettent de parser des fichiers de configuration du même format |
* que ceux utilisés par freeradius. |
*/ |
|
/* |
The file consists of configuration items (variable = value pairs), sections, and comments. |
*/ |
|
/** |
* Classe abstraite <b>confItem</b>. |
* |
* @name confItem |
* @author steweb57 |
* @version 0.1.0 |
*/ |
Abstract class confItem |
{ |
/** |
* Variable contenant le type d'item (pair ou section) |
* @var string |
*/ |
protected $_type = null; |
/** |
* Variable contenant le nom de l'item |
* @var string |
*/ |
protected $_name = null; |
/** |
* Variable contenant le nom de la section |
* @var string |
*/ |
/** |
* Variable contenant le nom de l'instance de l'item |
* @var string |
*/ |
protected $_instanceName = null; |
/** |
protected $_parent = null; |
/** |
* Tableau contenant les parametres (items) |
* @var array |
*/ |
protected $_items = array(); |
/** |
* Return the parent confItem |
* |
* @name getParent()() |
* @return confItem |
*/ |
public function getParent(){ |
return $this->_parent; |
} |
/** |
* return the type of the confItem |
* |
* @name getType() |
* @return string |
*/ |
public function getType(){ |
return $this->_type; |
} |
|
public function getAll(){ |
return $this->_items; |
} |
|
|
/** |
* return the name of the confItem |
* |
* @name getName() |
* @return string |
*/ |
public function getName(){ |
return $this->_name; |
} |
/** |
* return the instance name of the confItem |
* |
* @name getInstanceName() |
* @return string |
*/ |
public function getInstanceName(){ |
return $this->_instanceName; |
} |
/** |
* |
* Return the specified atribute |
* |
* @name __get() |
* @param string $attr |
* @return mixed (confitem object or string) |
*/ |
public function __get($attr) { |
$resp=array(); |
foreach ($this->_items as $item){ |
if (is_object($item)){ |
if ($item->getName() === $attr){ |
$resp[] = $item; |
} |
} else { |
if (array_key_exists($attr, $this->_items)) |
$resp[] = $this->_items[$attr]; |
} |
} |
if (count($resp)===1){ |
return $resp[0]; |
} else { |
return $resp;// si vide, on répond par un array vide ou par false? |
} |
} |
/** |
* Converte the object to a string |
* |
* @name __toString() |
* @return string |
*/ |
public function __toString() { |
return $this->_name; |
} |
} |
|
/** |
* Classe <b>pairItem</b>. |
* |
* @name pairItem |
* @author steweb57 |
* @version 0.1.0 |
*/ |
class pairItem extends confItem |
{ |
protected $_type = 'pair'; |
protected $_name = ''; |
|
/** |
* Constructeur |
* |
* <p>création de l'instance de la classe</p> |
* |
* @name pairItem::__construct() |
* @param string $attr, $value |
* @return void |
*/ |
public function __construct($attr,$value) { |
$this->_items[$attr] = $value; |
$this->_name = $attr; |
} |
/** |
* Converte the object to a string |
* |
* @name __toString() |
* @return string |
*/ |
public function __toString() { |
return $this->_items[$this->_name];// ? afficher le nom de la variable ou sa valeur? |
} |
/** |
* Get a pair value |
* |
* @name getPair() |
* @param string $pairName |
* @return string |
*/ |
public function getPair($pairName = null){ |
if ($pairName!==null){ |
if (array_key_exists($pairName, $this->_items)) |
return $this->_items[$pairName]; |
} else { |
return $this->_items; |
} |
} |
} |
|
class sectionItem extends confItem |
{ |
protected $_type = 'section'; |
protected $_name = ''; |
|
public function __construct($name, sectionItem &$parent=null, $instanceName = "") { |
$this->_parent = $parent; |
$this->_name = $name; |
$this->_instanceName = $instanceName; |
} |
public function addSection($name, $instanceName = "") { |
$this->_items[] = new sectionItem($name, $this, $instanceName); |
return end($this->_items); |
} |
public function addPair($name, $value) { |
$this->_items[] = new pairItem($name, $value); |
return end($this->_items); |
} |
/** |
* return the child instance of the confSection |
* |
* @name getInstance() |
* @return string |
*/ |
public function getInstance($instanceName=nill){ |
if ($instanceName === null) |
return false; |
$resp = array(); |
foreach ($this->_items as $item){ |
if ($item->getType() !== 'section'){ |
continue; |
} |
if ($item->getInstanceName() === $instanceName){ |
$resp[] = $item; |
} |
} |
if (count($resp)===1){ |
return $resp[0]; |
} else { |
return $resp; |
} |
} |
public function getSectionInstance($sectionName = null, $instanceName=null){ |
|
if (($sectionName === null)||($instanceName === null)) |
return false; |
$resp = array(); |
|
foreach ($this->_items as $item){ |
if ($item->getType() !== 'section'){ |
continue; |
} |
if (($item->getName() === $sectionName)&&($item->getInstanceName() === $instanceName)){ |
$resp[] = $item; |
} |
} |
if (count($resp)===1){ |
return $resp[0]; |
} else { |
return $resp; |
} |
} |
|
public function getSection($sectionName = null){ |
$resp = array(); |
foreach ($this->_items as $item){ |
if ($item->getType() !== 'section'){ |
continue; |
} |
if ($sectionName === null){ |
$resp[] = $item; |
} else { |
if ($item->getName() === $sectionName){ |
$resp[] = $item; |
} |
} |
} |
if (count($resp)===1){ |
return $resp[0]; |
} else { |
return $resp; |
} |
} |
public function getPair($pairName = null){ |
$resp = array(); |
foreach ($this->_items as $item){ |
if ($item->getType() !== 'pair'){ |
continue; |
} |
if ($pairName === null){ |
$resp[] = $item; |
} else { |
if ($item->getName() === $pairName){ |
//return $item; //only the first answer |
$resp[] = $item; |
} |
} |
} |
if (count($resp)===1){ |
return $resp[0]; |
} else { |
return $resp; |
} |
} |
} |
/** |
* Classe <b>configReader</b>. |
* |
* @name configReader |
* @author steweb57 |
* @version 0.1.0 |
*/ |
class configReader extends sectionItem |
{ |
private $_file = null; |
private $_pt = null; |
protected $_name = "root"; |
|
/** |
* Constructeur |
* |
* <p>création de l'instance de la classe</p> |
* |
* @name config_file::__construct() |
* @param string $filename |
* @return void |
*/ |
public function __construct($filename=null) { |
|
if ($filename !== null){ |
$this->parse($filename); |
} |
} |
/** |
* Destructeur |
*/ |
public function __destruct() { |
$this->_file = NULL; |
} |
private function _deleteComment($line){ |
return $line; |
} |
public function parse($filename=null){ |
if ($filename !== null){ |
// test is_file et file_exist à faire |
$this->_file = $filename; |
} |
if ($this->_file===null) return false; |
|
$fro = fopen( $this->_file, 'r' ); |
while( $line = fgets( $fro ) ) |
{ |
/* |
on saute les commentaires |
*/ |
if (preg_match('/^[[:space:]]*#/',$line) || preg_match('/^[[:space:]]*$/',$line)) |
continue; |
|
//test d'entrée dans une section |
//if (preg_match('`^([\s[:print:]]*{[\s[:print:]]*)$`',$line)){//test section |
if (preg_match('`^([\sa-zA-Z0-9_-]*{[\s[:print:]]*)$`',$line)){//test section |
|
/* |
BUG : filter = "(uid=%{Stripped-User-Name:-%{User-Name}})" |
|
*/ |
|
// Nétoyage des commentaires et espaces |
$tmp = explode("{", $line, 2); |
$line = trim($tmp[0]); |
|
// test here if exist an instance name |
$tmpInstanceName = ""; |
$t = explode(" ", $line, 2); |
$tmpSectionName = $t[0]; |
if (count($t)>1){ |
$tmpInstanceName = $t[1]; |
} |
// end test of an instance name |
|
if ($this->_pt===null){ |
$this->addSection($tmpSectionName, $tmpInstanceName); |
$this->_pt = end($this->_items); |
} else { |
$this->_pt = $this->_pt->addSection($tmpSectionName, $tmpInstanceName); |
} |
} |
//recherche fin de section |
//elseif (preg_match('`^([\s]*}[\s]*)$`',$line)){//test fin de section |
elseif (preg_match('`^([\s]*}[\s[:print:]]*)$`',$line)){//test fin de section |
$this->_pt = $this->_pt->getParent(); |
} |
//test de présence d'une pair parametre/valeur |
elseif (preg_match('`^([\s[:print:]]*=)`',$line)){ //test pair |
$tmpPair = trim($line); |
list($pairName, $pairValue) = explode('=', $tmpPair, 2); |
$pairName = trim($pairName); |
$pairValue = trim($pairValue); |
|
/* |
A FAIRE : |
- prendre en compte le multi-ligne |
*/ |
$l = strlen($pairValue); |
if (strpos($pairValue, "'") === 0){ // valeur entre des quotes |
$pairValue = preg_replace("`^[']([[:print:]]*)[']([[:print:]]*)`","$1",$pairValue); |
}elseif(strpos($pairValue, '"') === 0){// valeur entre des double-quotes |
$pairValue = preg_replace('`^["]([[:print:]]*)["]([[:print:]]*)`','$1',$pairValue); |
}else{ // valeur sans quote ou double-quote |
//suppression des commentaires (pour un # dans la chaine, alors il faut que la chaine soit entre quote ou double-quote) |
$tmp = explode("#", $pairValue, 2); |
$pairValue = trim($tmp[0]); |
} |
|
if ($this->_pt===null){ |
$this->addPair($pairName,$pairValue); |
} else { |
$this->_pt->addPair($pairName,$pairValue); |
} |
} |
//test de présence d'un parametre (c'est traité comme une section mais sans contenu!) |
elseif (preg_match('`^([\s[:print:]]*)$`',$line)) { //test value |
$tmpItem = trim($line); |
if ($this->_pt===null){ |
$this->addSection($tmpItem); |
} else { |
$this->_pt->addSection($tmpItem); |
} |
} |
} |
fclose( $fro ); |
$this->_pt=null; |
} |
} |
?> |