RE: problems parsing a DHCP.leases file.
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.
[ 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.
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.
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.
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.
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.
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
problems parsing a DHCP.leases file.
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; } } Thanks, -angus