[PERL] Récupération ip/mac de dhcpd.leases [RESOLU]

Récupération ip/mac de dhcpd.leases [RESOLU] [PERL] - Perl - Programmation

Marsh Posté le 15-12-2009 à 15:08:21    

Bonjour,
 
je souhaite mettre en place avec perl un moyen d'extraction de données stockées dans le fichier /var/lib/dhcp3/dhcpd.leases. Il s'agit d'un fichier issu d'un serveur dhcp sous debian qui liste les machines ayant obtenu une adresse ip auprès du serveur.
 
le contenu du fichier ressemble à ceci:
 
# The format of this file is documented in the dhcpd.leases(5) manual page.
# This lease file was written by isc-dhcp-V3.1.1
 
lease 192.168.2.203 {
  starts 4 2009/12/10 08:13:02;
  ends 5 2009/12/11 08:13:02;
  tstp 5 2009/12/11 08:13:02;
  cltt 4 2009/12/10 08:13:02;
  binding state free;
  hardware ethernet 00:11:22:33:44:55;
  uid "\001\000\"\375L\031\310";
}
lease 192.168.2.204 {
  starts 4 2009/12/10 09:00:38;
  ends 5 2009/12/11 09:00:38;
  tstp 5 2009/12/11 09:00:38;
  cltt 4 2009/12/10 09:00:38;
  binding state free;
  hardware ethernet aa:bb:cc:dd:ee:ff;
  uid "\001\000\"\373z\332\276";
}
 
Il se peut qu'une ip soit présente plusieurs fois.
 
Ce que je souhaite, c'est copier dans un nouveau fichier les lignes contenant une ip et une adresse mac afin d'avoir une correspondance adresses ip/ adresses mac; et pourquoi pas la date aussi. mais concernant la date, j'ai déjà mis en place une autre solution.
 
J'arrive à extraire par exemple "192.168.2.203" pour le copier dans un nouveau fichier mais pas son adresse mac correspondante. et si cette ip est présente plusieurs fois, elle ne se retrouve qu'une fois dans le nouveau fichier.
 
mon script perl actuel:
 
#!/usr/bin/perl
 
# ouvre le fichier A en lecture seule
open (A, '</scripts/dhcpd.leases');
 
# tant que lecture ligne fichier
 
while ($ip=<A> )
 
{
# si adresse IP dans la ligne, capture l'IP
 
 if ($ip =~ /192\.168\.2\.200/)
 {
# ouvre en écriture le fichier B (s'il n'existe pas, il est créé)
 
  open (B, '>/scripts/dhcp3/dhcp_200');
 
  print B "$ip";
 }
}
 
close A;
close B;
 
pourriez vous m'aider s'il vous plait?
 
merci


Message édité par thecoco le 16-12-2009 à 13:27:46
Reply

Marsh Posté le 15-12-2009 à 15:08:21   

Reply

Marsh Posté le 16-12-2009 à 00:32:58    

Un exemple de truc fait rapidement dont tu peux t'inspirer
J'ai remplacé tes fichiers par leases.in et leases.out pour tester

Code :
  1. #!/usr/bin/perl
  2.  
  3. use strict;
  4. use warnings;
  5.  
  6. my ($in, $out);
  7. my ($ip, $mac);
  8. my $macpattern = "(([0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2})";
  9. # ouvre le fichier $in en lecture seule
  10. open($in, "<", 'leases.in') or die "cannot open $in for reading: $!";
  11. my $inleasebloc = 0;
  12. # tant que lecture ligne fichier
  13. while (<$in> ) {
  14.    if (not $inleasebloc) {
  15.        # si adresse IP dans la ligne, capture l'IP
  16.        if (/^lease\s+(\d+\.\d+\.\d+\.\d+)\s+\{/o) {
  17.            $inleasebloc = 1;
  18.            $ip = $1;
  19.        }
  20.    }
  21.    else {
  22.        if (/hardware\s+ethernet\s+$macpattern\s*;/o) {
  23.            $mac = $1;
  24.        }
  25.        if (/^\s*\}\s*$/) {
  26.            $inleasebloc = 0;
  27.            # ouvre en écriture le fichier $out (s'il n'existe pas, il est créé)
  28.            if (not defined($out)) {
  29.                open($out, ">", 'leases.out') or die "cannot open $out for writing: $!";
  30.            }
  31.            $mac = "unknown" unless defined($mac);
  32.            print $out "IP: $ip - MAC: $mac\n";
  33.            undef $mac;
  34.        }
  35.    }
  36. }
  37. close($in);
  38. close($out) if (defined($out));


 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 16-12-2009 à 08:05:09    

merci beaucoup gilou :) je vais m'y mettre de ce pas merci

Reply

Marsh Posté le 16-12-2009 à 11:25:29    

Tiens, en le relisant ce matin, je vois qu'il manque la raison pour laquelle j'ai créé le flag inleasebloc (pour vérifier la bonne cohérence des blocs):

Code :
  1. #!/usr/bin/perl
  2.  
  3. use strict;
  4. use warnings;
  5.  
  6. my ($in, $out);
  7. my ($ip, $mac);
  8. my $macpattern = "(([0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2})";
  9. # ouvre le fichier $in en lecture seule
  10. open($in, "<", 'leases.in') or die "cannot open $in for reading: $!";
  11. my $inleasebloc = 0;
  12. # tant que lecture ligne fichier
  13. while (<$in> ) {
  14.    if (not $inleasebloc) {
  15.        # si adresse IP dans la ligne, capture l'IP
  16.        if (/^lease\s+(\d+\.\d+\.\d+\.\d+)\s+\{/o) {
  17.            $inleasebloc = 1;
  18.            $ip = $1;
  19.        }
  20.    }
  21.    else {
  22.        if (/^lease\s+(\d+\.\d+\.\d+\.\d+)\s+\{/o) {
  23.            # On pourrait émettre un message d'erreur comme quoi le bloc n'est pas fermé correctement
  24.            if (not defined($out)) {
  25.                open($out, ">", 'leases.out') or die "cannot open $out for writing: $!";
  26.            }
  27.            $mac = "unknown" unless defined($mac);
  28.            print $out "IP: $ip - MAC: $mac\n";
  29.            undef $mac;
  30.            $inleasebloc = 1;
  31.            $ip = $1;
  32.        }
  33.        if (/hardware\s+ethernet\s+$macpattern\s*;/o) {
  34.            $mac = $1;
  35.        }
  36.        if (/^\s*\}\s*$/) {
  37.            $inleasebloc = 0;
  38.            # ouvre en écriture le fichier $out (s'il n'existe pas, il est créé)
  39.            if (not defined($out)) {
  40.                open($out, ">", 'leases.out') or die "cannot open $out for writing: $!";
  41.            }
  42.            $mac = "unknown" unless defined($mac);
  43.            print $out "IP: $ip - MAC: $mac\n";
  44.            undef $mac;
  45.        }
  46.    }
  47. }
  48. close($in);
  49. close($out) if (defined($out));


A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 16-12-2009 à 13:27:17    

encore merci, ça marche impec :)
 
mais comment fais tu pour afficher du code dans un carré comme ça?

Reply

Marsh Posté le 17-12-2009 à 02:31:13    

Il faut utiliser le bbcode [code=perl]...[/code]
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Sujets relatifs:

Leave a Replay

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