IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

Ajout/Supression de blocs dans fichier de conf


Sujet :

Langage Perl

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Ajout/Supression de blocs dans fichier de conf
    Bonjour,

    Je suis actuellement en train d'essayer de faire fonctionner system-tools-backends sur la distribution Gentoo. N'y connaissant rien en perl, ça m'a permit de découvrir un peu la chose. J'ai réussi a rendre le tout presque fonctionnel, mais la je bloque sur un truc, je ne vois pas du tout comment procédé.

    Je vous détail un peu la chose :

    Tout d'abord un exemple de fichier de conf :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    config_eth0=("dhcp")
    config_ppp0=("ppp")
    plugins_ppp0=("pppoe")
    config_eth1=("null")
    link_ppp0=("eth1")
    depend_ppp0 () {
         need net.eth1
    }
    username_ppp0='********'
    password_ppp0='********'
    Le bloc que je voudrai pouvoir Ajouter/Modifier/Supprimer au fichier de conf est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    depend_ppp0 () {
         need net.eth1
    }
    mais aurait pu être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    depend_ppp1 () {
         need net.eth0
    }
    Il pourrait même y avoir les deux blocs dans le fichier, histoire de compliquer la chose

    Donc, en résumé, je pense avoir besoin de 3 variables :
    $file => le nom du fichier de conf
    $dev => pour identifier le bloc (depend_$dev)
    $needed => pour le need (net.$needed)

    Ce que ma fonction devra faire :
    - Si a l'appel de la fonction $needed n'est pas défini, le bloc correspondant a $dev devra être supprimé de $file
    - Si le bloc correspondant a $dev n'existe pas dans $file, il faut l'ajouter
    - Si le bloc correspondant a $dev existe, mais que $needed ne correspond pas, effectuer la modification

    Voilà, où j'en suis maintenant (pas très loin ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    sub ma_fonction
    {
      my ($file, $dev, $needed) = @_;
      my ($contents);
     
      $contents = &Utils::File::load_buffer ($file);
     
      return &Utils::File::save_buffer ($contents, $file);
    }
    Les fonctions, load_buffer et save_buffer sont des fonctions internes a system-tools-backends. Et load_buffer retourne un tableau contenant les lignes du fichier passer en arguments.

    Et voilà, c'est là que je bloque, je ne sait pas du tout par où commencer pour le traitement de $contents du fait qu'il y ait plusieur ligne à modifier, si quelqu'un pourrait me mettre sur la voie, ça serait bien cool !! (me mettre sur la voie, hein, pas faire le travail, j'aime bien comprendre ce que je fais )

    Merci beaucoup d'avance !

    debotux

  2. #2
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      my ($contents);
     
      $contents = &Utils::File::load_buffer ($file);
    Tu peux directement écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      my $contents = &Utils::File::load_buffer ($file);
    Et load_buffer retourne un tableau contenant les lignes du fichier passer en arguments.
    Ici, $contents n'est pas un tableau, au mieux c'est la référence d'un tableau.

    Voila comment on pourrait faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    sub load_buffer{
     
    	my $file = shift;
     
    	open FILE, $file or die $!;
    	my @tab = <FILE>;
    	close FILE;
     
    	return \@tab;
    }

    Sinon pour le reste, tu peux t'inspirer de ce qui suit pour écrire ton code
    1) crée un nouveau fichier de sortie dans lequel tu recopie le premier
    2) lit ton fichier et utilise les expressions régulières afin d'analyser son contenu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    my $needed = 0;
    my $dev = 'ppp1';
     
     
     
     
    # on recopie les modifications dans un nouveau fichier
    my $out_file = FileHandle->new('>P:/Perl/scripts2/Test/test_traitement.txt');
     
     
    # Si le bloc correspondant a $dev existe, mais que $needed ne correspond pas, effectuer la modification
    if(defined $needed){
     
    	open FILE, 'P:/Perl/scripts2/Test/test.txt' or die $!;
     
    	# lecture ligne par ligne
    	while (my $line = <FILE>){
     
    		# si on tombe sur un des 2 numéros, on les vérifie
    		# le if($1 ne $dev) n'est même pas nécessaire
    		# vu qu'on écrit d'office $dev que $1 y corresponde ou non
    		if($line =~ /depend_(\w+)/){
    			if($1 ne $dev){
    				print $out_file "depend_$dev () {\n";
    			}
    		}
    		elsif($line =~ /need net.eth(\d+)/){
    			if($1 ne $needed){
    				print $out_file "need net.eth$needed\n";
    			}
    		}
    		# toutes les autres lignes sont laissées telles quelles
    		else{
    			print $out_file $line;
    		}
     
    	}
    	close FILE;	
    }

    Peut-être pourrais-tu également traiter ton fichier comme un seul bloc dans lequel rechercher directement tes 3 lignes d'un coup.
    -- Jasmine --

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Merci de m'avoir donné quelques pistes, j'ai réussi a faire ce que je voulais, voilà la fonction qui marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    sub set_confd_depend
    {
      my ($file, $dev, $needed) = @_;
      my ($contents, $found, $begin, $end, $i);
     
      $contents = &Utils::File::load_buffer ($file);
     
      for ($i = 0; $i <= scalar (@$contents); $i++)
      {
        if ($$contents[$i] =~ /^depend_$dev[ \t]*\([ \t]*\)[ \t]*{/)
        {
          $found = 1;
          $begin = $i;
     
          for ($i ; $i <= scalar (@$contents); $i++)
          {
            if ($$contents[$i] =~ /\}/)
            {
              $end = $i;
            }
            last if $end;
          }
        }
        last if $begin;
      }
     
      if ($needed eq undef)
      {
        for ($i = $begin; $i <= $end; $i++)
        {
          $$contents[$i] = "";
        }
      }
      elsif (!$found)
      {
        push @$contents, "depend_$dev () {\n\t need net.$needed\n}";
      }
      else
      {
        for ($i = $begin; $i <= $end; $i++)
        {
          if ($$contents[$i] =~ /[ \t]*need[ \t]*net\.(\w+)/)
          {
            $$contents[$i] =~ s/$1/$needed/;
          }
        }
      }
     
      return &Utils::File::save_buffer ($contents, $file);
    }
    Y'a surement quelques amélioration possible, mais pour le moment ça fonctionne niquel et c'est tout ce que je demandait

    ++'ll

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 12/04/2010, 12h08
  2. ajout de plusieurs DNS dans /etc/resolv.conf
    Par Ohemeg dans le forum Unix
    Réponses: 3
    Dernier message: 13/11/2008, 15h18
  3. Réponses: 6
    Dernier message: 14/06/2008, 17h10
  4. Ajout/Supression d'input dans un formulaire.
    Par ddelec24 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 25/09/2007, 17h56
  5. ajouter un nouvel element dans fichier XML
    Par bgcode dans le forum VB.NET
    Réponses: 5
    Dernier message: 09/07/2007, 16h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo