http://www.perlmonks.org?node_id=1067125

varalaxmibbnl has asked for the wisdom of the Perl Monks concerning the following question:

hi monks i have a dhcp client to which server will be providing ip's which will be stored in /var/lib/dhcp3/dhcpd.leases file ...i need to grep all the ip's and client-hostname which are entering into that file and put into a database..can you please help me out to know is there any perl module to work on that...which makes my work easier and simple program to understand that module..thanks in advance...

Replies are listed 'Best First'.
Re: grep ip address from dhcpd.leases file
by ww (Archbishop) on Dec 14, 2013 at 11:54 UTC
    Native function: perldoc -f grep
Re: grep ip address from dhcpd.leases file
by roboticus (Chancellor) on Dec 14, 2013 at 15:16 UTC

    varalaxmibbnl:

    ww already pointed you to the grep function, but as to the database functionality, I'd suggest AnyDBM_File if you just need to lookup records based on their IP, or DBI (along with a suitable DBD backend suitable for the database you may be using) if you need more advanced lookup/update/etc. capabilities.

    ...roboticus

    When your only tool is a hammer, all problems look like your thumb.

Re: grep ip address from dhcpd.leases file
by Kenosis (Priest) on Dec 14, 2013 at 17:19 UTC

    A lease record may not contain a client-hostname, so your file parsing should accommodate that. DB suggestions have been provided. Perhaps the following parsing option, which would read the file in lease-record 'chunks' (via local $/ = 'lease';), will be a helpful start:

    use strict; use warnings; local $/ = 'lease'; while (<DATA>) { my ($ip) = /\s+(\S+)\s+/ or next; my $client = /client-hostname\s+(".+")/ ? $1 : ''; print "$ip,$client\n"; } __DATA__ lease 192.168.20.4 { starts 6 2009/06/27 00:40:00; ends 6 2009/06/27 12:40:00; hardware ethernet 00:00:00:00:00:00; uid 00:00:00:00:00:00; client-hostname "examle-workstation1"; } lease 192.168.20.5 { starts 6 2009/06/27 00:40:00; ends 6 2009/06/27 12:40:00; hardware ethernet 00:00:00:00:00:00; } lease 192.168.20.6 { starts 6 2009/06/27 00:40:00; ends 6 2009/06/27 12:40:00; hardware ethernet 00:00:00:00:00:01; uid 00:00:00:00:00:01; client-hostname "examle-workstation2"; } lease 192.168.20.7 { starts 6 2009/06/27 00:40:00; ends 6 2009/06/27 12:40:00; hardware ethernet 01:00:00:00:00:00; }

    Output:

    192.168.20.4,"examle-workstation1" 192.168.20.5, 192.168.20.6,"examle-workstation2" 192.168.20.7,
      thanks for the reply..if i want to take the present ip address which are entering into that dhcp.leases then is there any module to do that...thanks in advance..

        Provided you have read permissions for dhcp.leases, just use that file as your data source in the above script:

        use strict; use warnings; local $/ = 'lease'; my $leaseFile = '/var/lib/dhcp3/dhcpd.leases'; open my $fh, '<', $leaseFile or die $!; while (<$fh>) { my ($ip) = /\s+(\S+)\s+/ or next; my $client = /client-hostname\s+(".+")/ ? $1 : ''; print "$ip,$client\n"; } close $fh;