Forum Programmation.perl Parser / Modifier le fichier dhcpd.conf

Posté par . Licence CC by-sa
Tags : aucun
0
24
juil.
2015

Bonjour,

J'utilise le module Net::ISC::DHCPd::Config pour parser la configuration du fichier de conf dhcpd donc voici un extrait :

subnet 192.168.10.0 netmask 255.255.255.0 {
    option routers 192.168.10.1;
    range 192.168.10.100 192.168.10.200;
    host pnom {
        hardware ethernet D0:AA:12:BC:13:65;
        fixed-address pnom.domain.net
    }
    host pnom2 {
        hardware ethernet D0:AA:12:BC:13:66;
        fixed-address pnom2.domain.net
    }
}
subnet 192.168.20.0 netmask 255.255.255.0 {
    option routers 192.168.10.1;
    range 192.168.10.100 192.168.10.200;
     host pnom3 {
        hardware ethernet D0:AA:12:BC:13:67;
        fixed-address pnom.domain.net
    }
    host pnom4 {
        hardware ethernet D0:AA:12:BC:13:68;
        fixed-address pnom2.domain.net
    }
}
subnet 192.168.30.0 netmask 255.255.255.0 {
    option routers 192.168.10.1;
    range 192.168.10.100 192.168.10.200;
     host pnom5 {
        hardware ethernet D0:AA:12:BC:13:69;
        fixed-address pnom.domain.net
    }
}

et le début du script…

#! /usr/bin/perl

use sctrict; 
use warnings;
use utf8;
use Data::Dumper;

use Net::ISC::DHCPd::Config;

my $config = Net::ISC::DHCPd::Config->new(file => './dhcpd.conf');
$config->parse;

print Dumper \$config;

Jusque là tout va bien, mon fichier de conf est parfaitement bien parsé.

Maintenant je souhaite ajouté pnom6 dans le subnet 192.168.20.0:

host pnom6 {
hardware ethernet D0:AA:12:BC:13:6A;
fixed-address pnom.domain.net
}

Comment faire?

Sachant que pour ajouter un host je peux faire :

$config->add_host({
    name => 'pnom6',
)}

mais l'host ajouté n'a pas les attributs hardware ethernet et fixed-address, et il est ajouté à la racine du fichier de conf, je ne sais pas comment l'ajouter dans un subnet.

Je ne vois pas de méthodes documentées dans le CPAN me permettant de faire çà.

Ensuite pour réécrire le fichier de conf il me resterai plus qu' à faire $config->generate …

Merci d'avance pour ceux qui voudront bien apporter leur aide :)

  • # Ma tentative

    Posté par . Évalué à 3.

    En jouant un peu avec l'API et en regardant les tests du module, j'en déduit que pas mal de fonctions sont auto-générées.

        my $host = $config->subnets->[1]->add_host( {name => 'pnom6'} );
        $host->add_fixedaddress({value => 'pnom.domain.net'});
        $host->add_hardwareethernet({value => 'D0:AA:12:BC:13:6A'});
    

    A priori, on doit pouvoir ajouter directement des clés/valeurs à la création de l'host mais je ne suis pas sûr que cela soit la bonne manière de faire:

        my $host = $config->subnets->[1]->add_host( {name => 'pnom6', keyvalues => [
                { name => 'hardware ethernet', value => 'D0:AA:12:BC:13:6A'},
                { name => 'fixed-address', value => 'pnom.domain.net'}]
                           });
    

    En espérant que ça t'aide un peu…

    • [^] # Re: Ma tentative

      Posté par . Évalué à 1. Dernière modification le 27/07/15 à 10:07.

      Merci Vroum.

      J'en étais arrivé à faire un peu la même chose que toi.
      Après avoir fouillé dans le code du module je me suis retrouvé à faire quelque chose comme çà :

      my $host = Net::ISC::DHCPd::Config::Host->new(name=>'pnom6');
      my $ipadress = Net::ISC::DHCPd::Config::Host::FixedAddress->new(name=>'pnom6.domain.net');
      my $macadress = Net::ISC::DHCPd::Config::Host::HrdwareEthernet->new(name=>'D0:AA:12:BC:13:6A');
      
      $host->_add_child("Net::ISC::DHCPd::Config::Host::FixedAddress",$ipadress);
      $host->_add_child("Net::ISC::DHCPd::Config::Host::HardwareEthernet",$macadress);

      Il me reste juste à trouver comment ratacher tout çà au bon subnet.

    • [^] # Re: Ma tentative

      Posté par . Évalué à 2.

      En fait çà répond exactement à ce que je voulais.

      Au cas où, si çà peut servir à quelqu'un voici le code (à modifier pour rendre le script un peu plus utile) :

          #! /usr/bin/perl
      
          use strict;
          use warnings;
          use utf8;
          use Net::ISC::DHCPd::Config;
      
          my $ipsubnet = '192.168.20.0';
      
          my $config = Net::ISC::DHCPd::Config->new(file=>'./dhcpd.conf');
      
          my @subnets = $config->find_all_children('subnet');
      
          foreach my $subnet (@subnets) {
              if ($subnet->{address} =~ /$ipsubnet/) {
                  my $host = $subnet->add_host( {name => 'pnom6'} );
                  $host->add_fixedaddress({value => 'pnom6.domain.net'});
                  $host->add_hardwareethernet({value => 'D0:AA:12:BC:13:6A'}); 
                  last; 
              }
          }
      
          print $config->generate;

      Merci à toi Vroum

  • # probleme de copier/coller ?

    Posté par . Évalué à 2.

    tu as les memes ranges dans chacun de tes subnets ?
    j'imagine que ce n'est qu'une erreur de copier/coller ?

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.