Subversion Repositories ALCASAR

Rev

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

<?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;
        }
}
?>

Generated by GNU Enscript 1.6.6.