RE: problems parsing a DHCP.leases file.

2006-03-02 Thread 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:[EMAIL PROTECTED] 
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 = DHCPD) {

 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=DATA) {

  #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: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/ http://learn.perl.org/first-response




-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/ http://learn.perl.org/first-response




Re: problems parsing a DHCP.leases file.

2006-03-02 Thread John W. Krahn
[ 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=DATA) {
 
   #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: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/ http://learn.perl.org/first-response




Re: problems parsing a DHCP.leases file.

2006-02-27 Thread 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: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/ http://learn.perl.org/first-response




Re: problems parsing a DHCP.leases file.

2006-02-27 Thread The Ghost

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; }




RE: problems parsing a DHCP.leases file.

2006-02-27 Thread 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:[EMAIL PROTECTED] 
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: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/ http://learn.perl.org/first-response




Re: problems parsing a DHCP.leases file.

2006-02-27 Thread 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: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/ http://learn.perl.org/first-response




Re: problems parsing a DHCP.leases file.

2006-02-27 Thread Hans Meier (John Doe)
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 = DHCPD) {

 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=DATA) {

  #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: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/ http://learn.perl.org/first-response