problems parsing a DHCP.leases file.

problems parsing a DHCP.leases file.

am 27.02.2006 08:25:13 von angus

------=_NextPart_000_0023_01C63B2B.E4DF26A0
Content-Type: text/plain;
charset="us-ascii"
Content-Transfer-Encoding: 7bit

Hi all,



I am having some problems filling a variable based on the contents of a
dhcpd.leases file. All I want at this time is the hostname and ip address.
My eventual goal is to create hash of hashes with this information but for
now I just want to read in the file and see that I have defined my variables
correctly. I am able to get the IP address but the $hostname variable is
always undefined. The syntax for any given host in a leases file looks like
this:



lease 10.10.97.207 {

starts 2 2005/12/20 16:10:51;

ends 2 2005/12/20 20:10:51;

tstp 2 2005/12/20 20:10:51;

binding state free;

hardware ethernet 00:0b:97:2b:ea:fe;

uid "\001\000\013\227+\352\376";

client-hostname "HOST1";

}



Here is what I have so far.



#!/usr/bin/perl

#

use strict;

use warnings;



my $dhcp_data = "dhcpd.leases";



my %dhcpd;

my $ip;

my $hostname;



{

open (DHCPD, $dhcp_data) || die "Can't open $dhcp_data $!\n";



while (my $line = ) {

next if ($line =~ /^\s*$/ or # blank line

$line =~ /^\s*#/ );



if ($line =~ /^lease (\d+\.\d+\.\d+\.\d+)/) {

$ip = $1; }

elsif ($line =~ /^client-hostname/) {

$hostname = $1; }

else {next;};

print "I found IP:$ip\n";

print "I found Hostname: $hostname\n";

}

}



Thanks,



-angus


------=_NextPart_000_0023_01C63B2B.E4DF26A0--

Re: problems parsing a DHCP.leases file.

am 27.02.2006 09:07:42 von Jeff Pang

Hi,
here is wrong:

elsif ($line =~ /^client-hostname/) {

$hostname = $1; }

for the line like that:

client-hostname "HOST1";

I think maybe you should do:

elsif ($line =~ /^\s*client-hostname\s+\"(.*?)\"){
$hostname = $1;}


HTH.

--
Jeff Pang
NetEase AntiSpam Team
http://corp.netease.com

--
To unsubscribe, e-mail: beginners-unsubscribe@perl.org
For additional commands, e-mail: beginners-help@perl.org

Re: problems parsing a DHCP.leases file.

am 27.02.2006 09:12:57 von The Ghost

--Apple-Mail-1--487979371
Content-Transfer-Encoding: 7bit
Content-Type: text/plain;
charset=US-ASCII;
delsp=yes;
format=flowed

you need to match something.

You probably meant:

elsif ($line =~ /^client-hostname\s+"([a-z0-9\-\.]+)"/i) {

On the other hand, there is probably a module that already deals with
this and would save you even more coding time.

Ryan




On Feb 27, 2006, at 1:25 AM, Angus wrote:

> elsif ($line =~ /^client-hostname/) {
>
> $hostname = $1; }


--Apple-Mail-1--487979371--

RE: problems parsing a DHCP.leases file.

am 27.02.2006 09:26:41 von angus

Ryan,

Thanks for the tip however, in this case what I am trying to do (I think) is
find a line that starts with "client-hostname" then match my variable
$hostname to the second thing that the regex matches in that line $1. It
works for the ip address but fails for the hostname. I did try to regex
match but it still returns an undef variable...

-angus

-----Original Message-----
From: The Ghost [mailto:ghost@madisonip.com]
Sent: Monday, February 27, 2006 12:13 AM
To: Angus
Cc: beginners@perl.org
Subject: Re: problems parsing a DHCP.leases file.

you need to match something.

You probably meant:

elsif ($line =~ /^client-hostname\s+"([a-z0-9\-\.]+)"/i) {

On the other hand, there is probably a module that already deals with
this and would save you even more coding time.

Ryan




On Feb 27, 2006, at 1:25 AM, Angus wrote:

> elsif ($line =~ /^client-hostname/) {
>
> $hostname = $1; }



--
To unsubscribe, e-mail: beginners-unsubscribe@perl.org
For additional commands, e-mail: beginners-help@perl.org

Re: problems parsing a DHCP.leases file.

am 27.02.2006 09:45:38 von The Ghost

When I change to :
....
elsif ($line =~ /^\s+?client-hostname\s+"([a-z0-9\-\.]+)"/i) {
....

I found IP:10.10.97.207
I found Hostname:
I found IP:10.10.97.207
I found Hostname: HOST1

Seems you have some space there. Also, you probably want to move
your my $hostname and my $ip statements. If a hostname line wasn't
found, it would show up as the previously defined hostname (same with
IP)!


Anyway, that should help, it DOES find it - this should help you
solve the problem.

Ryan

--
To unsubscribe, e-mail: beginners-unsubscribe@perl.org
For additional commands, e-mail: beginners-help@perl.org

Re: problems parsing a DHCP.leases file.

am 27.02.2006 09:52:38 von security.department

Angus am Montag, 27. Februar 2006 08.25:
> Hi all,
>
>
>
> I am having some problems filling a variable based on the contents of a
> dhcpd.leases file. All I want at this time is the hostname and ip address.
> My eventual goal is to create hash of hashes with this information but for
> now I just want to read in the file and see that I have defined my
> variables correctly. I am able to get the IP address but the $hostname
> variable is always undefined. The syntax for any given host in a leases
> file looks like this:
>
>
>
> lease 10.10.97.207 {
>
> starts 2 2005/12/20 16:10:51;
>
> ends 2 2005/12/20 20:10:51;
>
> tstp 2 2005/12/20 20:10:51;
>
> binding state free;
>
> hardware ethernet 00:0b:97:2b:ea:fe;
>
> uid "\001\000\013\227+\352\376";
>
> client-hostname "HOST1";
>
> }
>
>
>
> Here is what I have so far.
>
>
>
> #!/usr/bin/perl
>
> #
>
> use strict;
>
> use warnings;
>
>
>
> my $dhcp_data = "dhcpd.leases";
>
>
>
> my %dhcpd;
>
> my $ip;
>
> my $hostname;
>
>
>
> {
>
> open (DHCPD, $dhcp_data) || die "Can't open $dhcp_data $!\n";
>
>
>
> while (my $line = ) {
>
> next if ($line =~ /^\s*$/ or # blank line
>
> $line =~ /^\s*#/ );
>
>
>
> if ($line =~ /^lease (\d+\.\d+\.\d+\.\d+)/) {
>
> $ip = $1; }
>
> elsif ($line =~ /^client-hostname/) {
>
> $hostname = $1; }
>
> else {next;};
>
> print "I found IP:$ip\n";
>
> print "I found Hostname: $hostname\n";
>
> }
>
> }

Here is a way to process one lease { }
after another, with the possibility to extract every field you want.

I think it is easy to read, understand, and alter.

=====
#!/usr/bin/perl
use strict;
use warnings;


local $/="}\n"; # <<<<< look here!
while (my $record=) {

#print "*** $record ***"; # for debugging record extracting

my ($lease)=$record=~/lease\s+(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1, 3})/;
my ($binding_state)=$record=~/^\s+binding\s+state\s+(\w+)/m;
my ($client_hostname)=$record=~/^\s+client-hostname\s+"([\w.-_] +)"/m;

print "lease '$lease' (host '$client_hostname') has ".
"binding state '$binding_state'\n";
}




__DATA__
lease 10.10.97.207 {

starts 2 2005/12/20 16:10:51;

ends 2 2005/12/20 20:10:51;

tstp 2 2005/12/20 20:10:51;

binding state free;

hardware ethernet 00:0b:97:2b:ea:fe;

uid "\001\000\013\227+\352\376";

client-hostname "HOST1";

}
lease 10.10.97.208 {

starts 2 2005/12/20 16:10:51;

ends 2 2005/12/20 20:10:51;

tstp 2 2005/12/20 20:10:51;

binding state free;

hardware ethernet 00:0b:97:2b:ea:fe;

uid "\001\000\013\227+\352\376";

client-hostname "HOST2";

}
=====

This prints out:

lease '10.10.97.207' (host 'HOST1') has binding state 'free'
lease '10.10.97.208' (host 'HOST2') has binding state 'free'


hth,
Hans

--
To unsubscribe, e-mail: beginners-unsubscribe@perl.org
For additional commands, e-mail: beginners-help@perl.org

RE: problems parsing a DHCP.leases file.

am 02.03.2006 09:06:55 von angus

Hans,

This script works really well but, I am a bit confused on what you are doing
with this: local $/="}\n"; I have not seen local used much as I thought it
was replaced by "my". It almost looks like you are defining the end of each
lease entry with a closing curly brace and a new line. Does the dollar sign
indicate that is the end of the input?

As for the regex matches the first two make sense to me but I am a bit
confused on the third one
my ($client_hostname)=$record=~/^\s+client-hostname\s+"([\w.-_] +)"/m

I can see that we are creating a variable called $client_hostname which is
defined by a match to $record which is feed in by the filehandle. I see
that we are searching for a line starting with one or more spaces followed
by client-hostname then one or more spaces followed by one word character
and anything else but what does the -_ do? And what does the m on the
outside do?

Thanks again for the example it is really interesting and has helped me.

-angus


-----Original Message-----
From: Hans Meier (John Doe) [mailto:security.department@tele2.ch]
Sent: Monday, February 27, 2006 12:53 AM
To: beginners@perl.org
Subject: Re: problems parsing a DHCP.leases file.

Angus am Montag, 27. Februar 2006 08.25:
> Hi all,
>
>
>
> I am having some problems filling a variable based on the contents of a
> dhcpd.leases file. All I want at this time is the hostname and ip
address.
> My eventual goal is to create hash of hashes with this information but for
> now I just want to read in the file and see that I have defined my
> variables correctly. I am able to get the IP address but the $hostname
> variable is always undefined. The syntax for any given host in a leases
> file looks like this:
>
>
>
> lease 10.10.97.207 {
>
> starts 2 2005/12/20 16:10:51;
>
> ends 2 2005/12/20 20:10:51;
>
> tstp 2 2005/12/20 20:10:51;
>
> binding state free;
>
> hardware ethernet 00:0b:97:2b:ea:fe;
>
> uid "\001\000\013\227+\352\376";
>
> client-hostname "HOST1";
>
> }
>
>
>
> Here is what I have so far.
>
>
>
> #!/usr/bin/perl
>
> #
>
> use strict;
>
> use warnings;
>
>
>
> my $dhcp_data = "dhcpd.leases";
>
>
>
> my %dhcpd;
>
> my $ip;
>
> my $hostname;
>
>
>
> {
>
> open (DHCPD, $dhcp_data) || die "Can't open $dhcp_data $!\n";
>
>
>
> while (my $line = ) {
>
> next if ($line =~ /^\s*$/ or # blank line
>
> $line =~ /^\s*#/ );
>
>
>
> if ($line =~ /^lease (\d+\.\d+\.\d+\.\d+)/) {
>
> $ip = $1; }
>
> elsif ($line =~ /^client-hostname/) {
>
> $hostname = $1; }
>
> else {next;};
>
> print "I found IP:$ip\n";
>
> print "I found Hostname: $hostname\n";
>
> }
>
> }

Here is a way to process one lease { }
after another, with the possibility to extract every field you want.

I think it is easy to read, understand, and alter.

=====
#!/usr/bin/perl
use strict;
use warnings;


local $/="}\n"; # <<<<< look here!
while (my $record=) {

#print "*** $record ***"; # for debugging record extracting

my ($lease)=$record=~/lease\s+(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1, 3})/;
my ($binding_state)=$record=~/^\s+binding\s+state\s+(\w+)/m;
my ($client_hostname)=$record=~/^\s+client-hostname\s+"([\w.-_] +)"/m;

print "lease '$lease' (host '$client_hostname') has ".
"binding state '$binding_state'\n";
}




__DATA__
lease 10.10.97.207 {

starts 2 2005/12/20 16:10:51;

ends 2 2005/12/20 20:10:51;

tstp 2 2005/12/20 20:10:51;

binding state free;

hardware ethernet 00:0b:97:2b:ea:fe;

uid "\001\000\013\227+\352\376";

client-hostname "HOST1";

}
lease 10.10.97.208 {

starts 2 2005/12/20 16:10:51;

ends 2 2005/12/20 20:10:51;

tstp 2 2005/12/20 20:10:51;

binding state free;

hardware ethernet 00:0b:97:2b:ea:fe;

uid "\001\000\013\227+\352\376";

client-hostname "HOST2";

}
=====

This prints out:

lease '10.10.97.207' (host 'HOST1') has binding state 'free'
lease '10.10.97.208' (host 'HOST2') has binding state 'free'


hth,
Hans

--
To unsubscribe, e-mail: beginners-unsubscribe@perl.org
For additional commands, e-mail: beginners-help@perl.org





--
To unsubscribe, e-mail: beginners-unsubscribe@perl.org
For additional commands, e-mail: beginners-help@perl.org

Re: problems parsing a DHCP.leases file.

am 02.03.2006 10:29:50 von krahnj

[ Please do not top-post. Please remove any quoted text that is not relevant
to your post. ]


Angus wrote:
> From: Hans Meier (John Doe)
>>
>> Here is a way to process one lease { }
>> after another, with the possibility to extract every field you want.
>>
>> I think it is easy to read, understand, and alter.
>>
>> =====
>> #!/usr/bin/perl
>> use strict;
>> use warnings;
>>
>>
>> local $/="}\n"; # <<<<< look here!
>> while (my $record=) {
>>
>> #print "*** $record ***"; # for debugging record extracting
>>
>> my ($lease)=$record=~/lease\s+(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1, 3})/;
>> my ($binding_state)=$record=~/^\s+binding\s+state\s+(\w+)/m;
>> my ($client_hostname)=$record=~/^\s+client-hostname\s+"([\w.-_] +)"/m;
>>
>> print "lease '$lease' (host '$client_hostname') has ".
>> "binding state '$binding_state'\n";
>> }
>
> This script works really well but, I am a bit confused on what you are doing
> with this: local $/="}\n";

$/ is the Input Record Separator variable.

perldoc perlvar

> I have not seen local used much as I thought it
> was replaced by "my".

It has been for user defined variables however you still have to use local for
Perl's "special" variables like $/.

> It almost looks like you are defining the end of each
> lease entry with a closing curly brace and a new line. Does the dollar sign
> indicate that is the end of the input?

No, the dollar sign indicates that / is the name of a scalar variable.

> As for the regex matches the first two make sense to me but I am a bit
> confused on the third one
> my ($client_hostname)=$record=~/^\s+client-hostname\s+"([\w.-_] +)"/m
>
> I can see that we are creating a variable called $client_hostname which is
> defined by a match to $record which is feed in by the filehandle. I see
> that we are searching for a line starting with one or more spaces followed
> by client-hostname then one or more spaces followed by one word character
> and anything else but what does the -_ do?

The hythen (-) in a character class defines a range of characters unless it is
at the beginning or end of the character class so '.-_' is the range of
characters starting at '.' and ending at '_'. That is probably a mistake but
I would have to check the RFCs to confirm that. Hans probably meant '[\w._-]'
instead?

> And what does the m on the
> outside do?

The /m option means that ^ will match at the beginning of a line inside the
string in $record instead of at the beginning of $record.



John
--
use Perl;
program
fulfillment

--
To unsubscribe, e-mail: beginners-unsubscribe@perl.org
For additional commands, e-mail: beginners-help@perl.org