Gestion d'un fichier de configuration Apache

Présentation

Le serveur web Apache conserve ses paramètres de configuration dans un fichier nommé httpd.conf situé dans le sous-répertoire conf du répertoire apache. Si l'on veut modifier certains paramètres, il faut éditer ce fichier et modifier les valeurs des paramètres. Ce travail peut-être fastidieux et demeure peu convivial ; aussi nous allons créer une petite application qui doit permettre de simplifier cette tâche.

1) Cas d'utilisation

Ce logiciel ne comporte qu'un seul cas d'utilisation.

Cas d'utilisation : gestion du fichier de configuration

Acteur : l'administrateur d'apache

Fréquence : si besoin de modifier ou visualiser la configuration

Scénario nominal

         1) L'administrateur demande le fichier de configuration

         2) Le système fournit le fichier

         3) L'administrateur visualise les paramètres et les modifie éventuellement

         4) Le système enregistre les modifications. Fin

2) Analyse de l'existant.

Voici un extrait du fichier :

fig 1 extrait du fichier httpd.conf

Commentaires :

3) Eléments de conception

L'application sera découpée en trois parties -couches- bien distinctes :

  1. Une classe se chargera de communiquer avec le fichier et se chargera des sauvegardes, c'est la classe PersisteConf
  2. Une classe se chargera de l'interface utilisateur (un formulaire en C#) : IUConf (Interface Utilisateur )
  3. Une classe assurera le lien entre les deux couches 1 et 2, c'est une classe "contrôleur" : CtrlConf

Cette architecture permet de rendre indépendants le code fonctionnel et la présentation ; ceci permet ainsi de conserver les couches 1 et 3 si l'on change d'interface (par exemple en restant en mode console). Ceci facilite grandement la réutilisation du code.

fig 2 diagramme de classe de conception

A) La classe PersisteConf

Responsabilités.

  1. Lire un fichier et mettre chacune de ses lignes dans une Collection -ArrayList-
  2. Sauvegarder la collection dans un fichier
  3. Retourner la collection

Travail à faire

Question 1 Dessiner le diagramme de la classe PersisteConf

Solution

On vous fournit le code suivant :

       StreamReader sr = new StreamReader(nomFichier);
       lesLignes = new ArrayList();
       string ligne=sr.ReadLine();
       while(ligne !=null)
       {
              lesLignes.Add(ligne);
              ligne=sr.ReadLine();
       }
       sr.Close();

Travail à faire.

Question 2. En utilisant l'aide, commenter chaque ligne du code fourni

Solution

Travail à faire.

Question 3. Créer un nouveau projet dans VisualStudio, ajouter une nouvelle classe PersisteConf.

Question 4. Ecrire la méthode chargeLesLignes qui remplit une ArrayList à partir d'un fichier. N'oubliez pas de faire un using de System.Collections pour pouvoir utiliser la classe ArrayList ; ainsi que using System.IO pour la gesion de fichier

Question 5. Ecrire le constructeur qui valorise l'attribut nomFichier et appelle chargeLesLignes.

Question 6. Ecrire l'accesseur GetLesLignes qui retourne l'ArrayList

Pour tester la classe PersisteConf :

Travail à faire : question 7

     public class Test
     {
           public static void Run()
          {
                  PersisteConf pc = new PersisteConf("httpdTest.conf");
                  ArrayList ar = pc.GetLesLignes();
                  System.Console.WriteLine((string)ar[15]);
         }
    }

Vérifier que vous obtenez bien la 16ième ligne du fichier :

fig 3 sortie console

Travail à faire : question 8

Cette classe devra assurer le principal des traitements :

fig 4 classe CtrlConf

Commentaires :

Annexe : gestion des expressions régulières.

Il sera nécessaire de parcourir chaque ligne et de vérifier son format et ainsi vérifier si cette ligne contient un début de commentaire ou un paramètre. Nous avons remarqué qu'un commentaire avait le format suivant :

#<nom du paramètre>:
lignes de commentaires
...
<nom du commentaire> <valeur>

Ainsi, nous devons rechercher un format. Pour cela les langages de programmation propose des classes (ou des fonctions) qui permettent de faire des vérification de chaînes en fonction d'un format fourni. Une expression régulière est le format de l'expression recherchée. La définition d'une expression régulière suit une syntaxe particulière mais commune à tous les langages ; ainsi par exemple pour contrôler qu'une chaîne est un code postal, l'expression régulière associée est "[0-9]{5,5}" : un code postal contient exactement 5 chiffres. Pour vérifier qu'un numéro d'immatriculation est valide il faudrait définir l'expression régulière "[1-9]{1,4}[A-Z]{2,2}[0-9]{2,2}" pour un numéro comportant 2 lettres.

En C#, deux classes vont être utilisées : la classe Regex et la classe Match (using System.Text.RegularExpressions;)

Exemple : recherche d'un numéro d'immatriculation dans une chaîne,

string format ="[1-9]{1,4}[A-Z]{2,2}[0-9]{2,2}";          // format pour un numéro d'immatriculation à deux lettres
Regex rx = new Regex(format);                                       // création d'un objet à partir du format
Match m= rx.Match("4412453FR3489");                       // un objet Match est retourné
if (m.Success)                                                                 // l'objet Match est testé
          Console.WriteLine("ok");
else
          Console.WriteLine("pas ok");

La sortie écran affichera "ok"

On peut également demander d'extraire la chaîne valide 2453FR34 grâce à m.Value

 Console.WriteLine(m.Value);         // affiche 2453FR34

Travail à faire Question 9

Question 9.1 Ajouter une nouvelle classe CtrlConf au projet

Question 9.2 Ecrire le constructeur public CtrlConf(string nomFichier) qui construira une instance de la classe PersisteConf et valorisera l'objet ArrayList.

Question 9.3 Ecrire la méthode suivant qui doit :

Question 9.4 Tester après avoir écrit les accesseurs nécessaires :

      public class Test
     {
              public static void Run()
              {
                      CtrlConf ctr = new CtrlConf("httpdTest.conf");
                      ctr.suivant();
                      ctr.suivant();
                      Console.WriteLine(ctr.GetNomParam());
                      Console.WriteLine(ctr.GetCommentaire());
                      Console.WriteLine(ctr.GetValeur());


Ce qui doit produire :

fig 5 sortie console

 

Question 9.4 Ecrire les deux méthodes sauvegarder et setValeur ainsi que les accesseur ; tester en ajoutant au code précédent :
      ctr.SetValeur("modif");
      ctr.Sauvegarder();
      Console.WriteLine("nouvelle valeur :{0}",ctr.GetValeur());

Ouvrir le fichier et vérifier la mise à jour

C) Gestion de l'interface, la classe IUConf

Le formulaire proposé aura la forme suivante :

fig 6 interface utilisateur de l'aplication

Le code à mettre en oeuvre est minimal, tout a déjà été réalisé, vous utiliserez un composant permettant d'ouvrir une boite de dialogue de sélection d'un fichier, OpenFileDialog (son utilisation est des plus simple). C'est le click sur le bouton "sélectionner un fichier" qui créera une instance du contrôleur, à partir du fichier sélectionné.

Travail à faire Question 10

Réaliser l'interface, tester.