Parser de fichier de configuration de type freeradius

Description

Deux classes qui permmet de parser un fichier de configuration tel que ceux utilisé par freeradius (radiusd.conf).
Le format du fichier de configuration contient les éléments suivants:
- des parametre simples (appelé "item" dans la classe)
- des couples parametre = valeur (appelé "pair" dans la classe)
- des sections pouvant contenir des parametres simples, des couples "parametre = valeur" ou d'autre sous sections

exemple d'utilisation de la source :
<?php
include('configManager.php');
$test = new configManager('monfichier_de_conf');
$test->parse();
$test->dump();
?>

Source / Exemple :


<?php
/**

  • Page contenant les classes <b>configSection</b> et <b>configManager</b>.
  • Ces classes permettent de parser des fichiers de configuration du même format
  • que ceux utilisés par freeradius.
  • /
/**
  • Classe <b>configSection</b> contenant une section de configuration
  • et de tous les paramettres propres à cette section
*
  • @name configSection
  • @author steweb57
  • @version 0.0.1
  • /
class configSection{ /**
  • Variable contenant le nom de la section
  • @var string
  • /
private $sectionName; /**
  • Tableau contenant les sections enfants
  • @var array
  • /
private $subSections = Array(); /**
  • Tableau contenant les couples parametres/valeurs (pair)
  • @var array
  • /
private $pairs = Array(); /**
  • Tableau contenant les parametres simples (item)
  • @var array
  • /
private $items = Array(); /**
  • Constructeur
*
  • <p>création de l'instance de la classe</p>
*
  • @name configSection::__construct()
  • @param string $sectionName
  • @return void
  • /
function __construct($sectionName){ $this->sectionName = $sectionName; } /**
  • Retourne une représentation de l'objet
*
  • @name dump()
  • @return void
  • /
public function dump(){ echo "<pre>"; print_r($this); echo "</pre>"; } /**
  • Retourne 1 objet configSection ou un tableau
  • contenant plusieurs objets configSection
*
  • @name section()
  • @param string $sectionName
  • @return array
  • /
public function section($sectionName = null) { if ($sectionName != null) { return $this->subSections[$sectionName]; } else { return $this->subSections; } } /**
  • Retourne la valeur d'une pair ou un tableau de pair
*
  • @name pair()
  • @param string $pairName optional
  • @return array
  • /
public function pair($pairName = null){ if ($pairName != null) { return $this->pairs[$pairName]; } else { return $this->pairs; } } /**
  • Retourne 1 item ou un tableau d'item
*
  • @name item()
  • @param string $itemName optional
  • @return array
  • /
public function item($itemName = null){ if ($itemName != null) { return $this->items[$itemName]; } else { return $this->items; } } /**
  • Ajoute une section enfant
*
  • @name addSection()
  • @param string $sectionName
  • @return void
  • /
public function addSection($sectionName = null) { if ($sectionName != null) { $this->subSections[$sectionName] = new configSection($sectionName); } } /**
  • Ajoute une pair (parametre = valeur)
*
  • @name addpair()
  • @param string $pair
  • @return void
  • /
public function addpair($pair = null) { if ($pair != null) { list($pairName, $pairValue) = split('=', $pair); $pairName = trim($pairName); $pairValue = trim($pairValue); $this->pairs[$pairName] = $pairValue; } } /**
  • Ajoute un item (parametre)
*
  • @name addpair()
  • @param string $item
  • @return void
  • /
public function addItem($item = null) { if ($item != null) { $this->items[$item] = $item; } } } /**
  • Classe <b>configManager</b> contenant une section de configuration
  • et de tous les paramettres propres à cette section
*
  • @name configManager
  • @author steweb57
  • @version 0.0.1
  • /
class configManager { /**
  • Tableau déterminant le niveau de la section courante
  • @var array
  • /
private $currentSection = Array("/"); /**
  • Tableau contenant le fichier à parser
  • @var array
  • /
private $afile = Array(); /**
  • Tableau contenant les sections situé à la racine du fichiers de configuration
  • @var array
  • /
private $sections = Array(); /**
  • Tableau contenant les couples parametres/valeurs (pair)
  • @var array
  • /
private $pairs = Array(); /**
  • Tableau contenant les parametres simples (item)
  • @var array
  • /
private $items = Array(); /**
  • Fonction privé de lecture du fichier
*
  • @name readFile()
  • @param file $file
  • @return void
  • /
private function readFile($file = null) { if ((!empty($file) and file_exists($file) and is_readable($file))) { $this->afile=file($file); } } /**
  • Constructeur
*
  • <p>création de l'instance de la classe</p>
*
  • @name configManager::__construct()
  • @param file $file
  • @return void
  • /
public function __construct($file = null) { $this->readFile($file); } /**
  • Parse le fichier en paramettre ou $afile
*
  • @name parse()
  • @param file $file optional
  • @return void
  • /
public function parse($file = null){ if ($file != null) { $this->readFile($file); } $max = count($this->afile); for ($i = 0; $i < $max; $i++) { $line = $this->afile[$i]; //test d'entrée dans une section if (preg_match('`^([\sa-zA-Z-]*{(\s*))$`',$line)){//test section $tmpSectionName = str_replace("{","",$line); $tmpSectionName = trim($tmpSectionName); $this->addSection($tmpSectionName); } //recherche fin de section elseif (preg_match('`^([\s]*}[\s]*)$`',$line)){//test fin de section if (end($this->currentSection) !== "/") { array_pop($this->currentSection); } } //test de présence d'une pair parametre/valeur elseif (preg_match('`^([\sa-zA-Z]*=)`',$line)){ //test pair $tmpPair = trim($line); $this->addPair($tmpPair); } //test de présence d'un parametre elseif (preg_match('`^([\sa-zA-Z]*)$`',$line)) { //test value $tmpItem = trim($line); $this->addItem($tmpItem); } //tout le reste est commentaire } } /**
  • Ajoute une section enfant
*
  • @name addSection()
  • @param string $sectionName
  • @return void
  • /
public function addSection($sectionName = null) { if ($sectionName != null) { if (end($this->currentSection) == "/") { $this->sections[$sectionName] = new configSection($sectionName); } else { $this->sections[end($this->currentSection)]->addSection($sectionName); } $this->currentSection[] = $sectionName; } } /**
  • Ajoute une pair (parametre = valeur)
*
  • @name addpair()
  • @param string $pair
  • @return void
  • /
public function addPair($pair = null) { if ($pair != null) { list($pairName, $pairValue) = split('=', $pair); $pairName = trim($pairName); $pairValue = trim($pairValue); if (end($this->currentSection) == "/") { $this->pairs[$pairName] = $pairValue; } else { $this->sections[end($this->currentSection)]->addPair($pair); } } } /**
  • Ajoute un item (parametre)
*
  • @name addpair()
  • @param string $item
  • @return void
  • /
public function addItem($item = null) { if ($item != null) { if (end($this->currentSection) == "/") { $this->items[$item] = $item; } else { $this->sections[end($this->currentSection)]->addItem($item); } } } /**
  • Retourne 1 objet configSection ou un tableau
  • contenant plusieurs objets configSection
*
  • @name section()
  • @param string $sectionName
  • @return array
  • /
public function section($sectionName = null) { if ($sectionName != null) { return $this->sections[$sectionName]; } else { return $this->sections; } } /**
  • Retourne la valeur d'une pair ou un tableau de pair
*
  • @name pair()
  • @param string $pairName optional
  • @return array
  • /
public function pair($pairName = null){ if ($pairName != null) { return $this->pairs[$pairName]; } else { return $this->pairs; } } /**
  • Retourne 1 item ou un tableau d'item
*
  • @name item()
  • @param string $itemName optional
  • @return array
  • /
public function item($itemName = null){ if ($itemName != null) { return $this->items[$itemName]; } else { return $this->items; } } /**
  • Retourne une représentation de l'objet
*
  • @name dump()
  • @return void
  • /
public function dump(){ echo "<pre>"; print_r($this); echo "</pre>"; } /**
  • Destructeur
  • /
public function __destruct() { $afile = NULL; } } ?>

Conclusion :


C'est ma première souce POO. La finalité étant à terme est de pouvoir gérer la configuration complète d'un serveur freeradius en PHP.

Ce code est pour le moment limité à deux niveaux de section, au dela il y a une erreur.
Si qu'elle qu'un sait comment enlever cette limitation je suis preneur.

Prochaine étape : des méthodes supplémentaires pour faciliter la manipulation des paramètres et la possibilité d'enregistrer les modifications dans le fichier de configuration.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.