Création et maintenance d'un fichier de configuration.

Création et maintenance d'un fichier de configuration. - Ada - Programmation

Marsh Posté le 23-10-2010 à 19:18:30    

Bonjour.
J'ai écrit quelque lignes pour créer et maintenir un fichier de configuration dont les informations sont lus dans l'environnement à défaut de spécification particulière protégé par mot de passe contenue dans le fichier même.
Pourriez-vous, selon vos connaissances, apporter quelque critique sur ce programme, son principe, l'algorithme... Ce programme n'ayant aucun autre objet.
S'il vous plaie.
 
Voici les codes.
 
Le paquetage User fournit le type et une variable initialisé du type T_User.
 

Code :
  1. with System.Os_Lib;
  2. use System;
  3.  
  4. package Np.user is
  5.   type Env_Type is (Password, Home, Logname, Mail , Group);
  6.   type Variable is
  7.      record
  8.         Name : env_Type;
  9.         Value : Os_Lib.String_Access;
  10.      end record;
  11.   type Personality_type is array (env_Type'Range) of Variable;
  12.   type User_Type is
  13.      record
  14.         Personality : Personality_Type;
  15.      end record;
  16.   Current_User : User_Type :=
  17.     (
  18.      personality =>
  19.        (
  20.         HOME =>
  21.           (
  22.            Home,
  23.            (Os_Lib.Getenv("HOME" ))
  24.           ),
  25.         LOGNAME =>
  26.           (
  27.            Logname,
  28.            (Os_Lib.Getenv("LOGNAME" ))
  29.           ),
  30.         MAIL =>
  31.           (
  32.            Mail,
  33.            (Os_Lib.Getenv("MAIL" ))
  34.           ),
  35.         PASSWORD =>
  36.           (
  37.            Password,
  38.            (Os_Lib.Getenv("PASSWORD" ))
  39.           ),
  40.         GROUP =>
  41.           (
  42.            Group,
  43.            (Os_Lib.Getenv("GROUP" ))
  44.           )
  45.        )
  46.     );
  47. end Np.user;


 
 
Le programme principal, crée et modifie le fichier ".conf" dans le répertoire personnel de l'utilisateur.
 

Code :
  1. with System.Os_Lib;
  2. use System.Os_Lib;
  3. with Text_Io;
  4. use Text_Io;
  5. with Ada.Strings.Fixed;
  6. use Ada.Strings.Fixed;
  7. with Np, Np.User;
  8. use Np, Np.User;
  9. procedure Main  is
  10.  
  11.   function Get_Password return String_Access;
  12.   -- Saisir le mot de passe.
  13.  
  14.   function Get_Password return String_Access is
  15.      Passwd : String_Access := new String ' ("" );
  16.      Buffer : String_access := new String ' ("" );
  17.      Char : Character;
  18.   begin
  19.      loop
  20.         Get_Immediate(Char);
  21.         case Char is
  22.            when Character'Val(127) =>
  23.               if Passwd'Length  > 1 then
  24.                  Free(Buffer);
  25.                  Buffer := new String ' (Passwd(1..Passwd'Length-1));
  26.               else
  27.                  Free(Buffer);
  28.                  Buffer := new String ' ("" );
  29.               end if;
  30.            when Character'Val(10) | Character'Val(13) =>
  31.               exit;
  32.            when others =>
  33.               Free(Buffer);
  34.               Buffer := new String ' (Passwd.all & Char);
  35.         end case;
  36.         Free(Passwd);
  37.         Passwd := new String ' (Buffer.all);
  38.      end loop;
  39.      return new String ' (Digest(Passwd.all));
  40.   end Get_Password;
  41.  
  42.  
  43.   subtype T_Password is String(1..32);
  44.   File : File_Type;
  45.   Env : Env_Type;
  46.   Expr : String(1..256);
  47.   Last : Natural;
  48.   New_Value : array (Env_Type'Range) of boolean := (others => False);
  49.   Rewrite : Boolean := False;
  50. begin
  51.  
  52.   if Argument_Count /= 0 then
  53.   -- lire les arguments
  54.  
  55.      for Argv in 1..Argument_Count-1 loop
  56.         if Argument(Argv) = "-h" and then
  57.           Argument(Argv+1)'Length /= 0 then
  58.            Current_User.Personality(Home).Value :=
  59.              new String ' (Argument(Argv+1));
  60.            New_Value(Home) := True;
  61.            exit;
  62.         end if;
  63.      end loop;
  64.      for Argv in 1..Argument_Count-1 loop
  65.         if Argument(Argv) = "-l" and then
  66.           Argument(Argv+1)'Length /= 0 then
  67.            Current_User.Personality(logname).Value :=
  68.              new String ' (Argument(Argv+1));
  69.            New_Value(Logname) := True;
  70.            exit;
  71.         end if;
  72.      end loop;
  73.      for Argv in 1..Argument_Count-1 loop
  74.         if Argument(Argv) = "-m" and then
  75.           Argument(Argv+1)'Length /= 0 then
  76.            Current_User.Personality(mail).Value :=
  77.              new String ' (Argument(Argv+1));
  78.            New_Value(Mail) := True;
  79.            exit;
  80.         end if;
  81.      end loop;
  82.      for Argv in 1..Argument_Count-1 loop
  83.         if Argument(Argv) = "-g" and then
  84.           Argument(Argv+1)'Length /= 0 then
  85.            Current_User.Personality(group).Value :=
  86.              new String ' (Argument(Argv+1));
  87.            New_Value(Group) := True;
  88.            exit;
  89.         end if;
  90.      end loop;
  91.   end if;
  92.  
  93.   for Env in Env_Type'Range loop
  94.      if New_Value(Env) then
  95.         Rewrite := True;
  96.         -- réécrire le fichier de configuration;
  97.         exit;
  98.      end if;
  99.   end loop;
  100.   if Is_Regular_File(Getenv("HOME" ).all & "/.conf" ) then
  101.      -- Lire le fichier de configuration si il existe.
  102.  
  103.      Open(File, In_File, Getenv("HOME" ).all & "/.conf" );
  104.      while not End_Of_File(File) loop
  105.         Get_Line(File, Expr, Last);
  106.         if Last /= 0 then
  107.            Env := Env_Type'Value(Expr(1..Index(Expr(1..Last), "=" )- 1));
  108.            case Env is
  109.               when Home | Logname | Mail | Group =>
  110.                  if New_Value(Env) then
  111.                     Put_Line("Setting " & Env_Type'Image(Env) & " to new value." );
  112.                  else
  113.                     Current_User.Personality(Env).Value :=
  114.                       new String ' (Expr(Index(Expr(1..Last), "=" )+1..last));
  115.                  end if;
  116.               when Password =>
  117.                  Current_User.Personality(Env).Value :=
  118.                    new String ' (Expr(Index(Expr(1..Last), "=" )+1..last));
  119.                  Put("password:" );
  120.                  if Current_User.Personality(env).Value.all = Get_Password.all then
  121.                     New_Line;
  122.                  else
  123.                     Put_Line("Bad password." );
  124.                     return;
  125.                  end if;
  126.            end case;
  127.         end if;
  128.      end loop;
  129.      Close(File);
  130.   else
  131.      Rewrite := True;
  132.   end if;
  133.  
  134.   if Rewrite then
  135.      Create(File, Out_File, Getenv("HOME" ).all & "/.conf" );
  136.      -- Ecraser le fichier de configuration
  137.  
  138.      for I in User.env_Type'Range loop
  139.         if Current_User.Personality(I).Value'Length = 0 then
  140.            case I is
  141.               when Home | Logname | Mail =>
  142.                  raise Program_Error;
  143.               when Password  =>
  144.                  if Current_User.Personality(I).Value'Length = 0 then
  145.                     Put("password:" );
  146.                     Current_User.Personality(I).Value := Get_Password;
  147.                     New_Line;
  148.                  end if;
  149.                  Put("password:" );
  150.                  if Current_User.Personality(I).Value.all = Get_Password.all then
  151.                     Put_line(File, Env_Type'Image(I) & "=" & Current_User.Personality(I).Value.all);
  152.                  else
  153.                     Put_Line("Bad password." );
  154.                     Delete(File);
  155.                     return;
  156.                  end if;
  157.                  New_Line;
  158.               when Group =>
  159.                  null;
  160.            end case;
  161.         else
  162.            Put_line(File, Env_Type'Image(I) & "=" & Current_User.Personality(I).Value.all);
  163.         end if;
  164.      end loop;
  165.      Close(File);
  166.   end if;
  167.   Put_Line("Hello " & Current_User.Personality(Logname).Value.all & " !" );
  168.   -- nous disons ""Bonjour"" à l'utilisateur.
  169. end Main;


 
Peut-on faire mieux ou pire ? Merci.

Reply

Marsh Posté le 23-10-2010 à 19:18:30   

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed