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