-
-
Save mattpascoe/4348991 to your computer and use it in GitHub Desktop.
| #!/usr/bin/perl | |
| # | |
| # Update the path to your lease file below | |
| use strict; | |
| use File::Copy; | |
| #use DateTime; | |
| #always parse a copy not the live file | |
| #my $leasefile = '/var/lib/dhcpd/dhcpd.leases'; | |
| my $leasefile = '/var/lib/dhcp/db/dhcpd.leases'; | |
| my $tempfile = '/tmp/dhcpd.leases'; | |
| copy($leasefile,$tempfile) or die "Copy failed: $!"; | |
| #my $LocalTZ = DateTime::TimeZone->new( name => 'local' ); | |
| my $LocalTZ = ''; | |
| open LEASES, "< $tempfile" or die $!; | |
| my @lines = <LEASES>; | |
| close LEASES; | |
| #Get the state of each server | |
| my $readit; | |
| my $line; | |
| #valid failover states | |
| #unknown-state, partner-down, normal, communications-interrupted, resolution-interrupted, potential-conflict, recover, recover-done, shutdown, paused, and startup | |
| # seems like I want the last failover statement | |
| my $my_state="cant determine"; | |
| my $my_state_time="cant determine"; | |
| my $peer_state="cant determine"; | |
| my $peer_state_time="cant determine"; | |
| my $failover = 0; | |
| foreach $line (@lines){ | |
| if ($line=~/failover peer .*? state {/){ | |
| $readit = 1; | |
| $failover = 1; | |
| } | |
| if ($readit){ | |
| if ($line=~/my\sstate\s(.*?)\sat\s\d\s(.*?)\;/){ | |
| $my_state = $1; | |
| $my_state_time = $2; | |
| } | |
| if ($line=~/partner\sstate\s(.*?)\sat\s\d\s(.*?)\;/){ | |
| $peer_state = $1; | |
| $peer_state_time = $2; | |
| } | |
| } | |
| if ($readit && $line=~/^}/){ | |
| $readit = 0; | |
| } | |
| } | |
| if ($failover){ | |
| $my_state_time = localize($my_state_time); | |
| my ($mdate, $mtime) = split (/T/,$my_state_time); | |
| $peer_state_time = localize($peer_state_time); | |
| my ($pdate, $ptime) = split (/T/,$peer_state_time); | |
| print "My state is $my_state at $mtime on $mdate\nPartner state is $peer_state at $ptime on $pdate\n"; | |
| }else{ | |
| print "This appears to be a stand alone server\n" | |
| } | |
| #Get the leases and their states | |
| my @lease_states; | |
| my $active = 0; | |
| my $lease = 0; | |
| my $ip; | |
| my $mac=' '; | |
| my $end_date_time; | |
| my $start_date_time; | |
| my $start_time; | |
| my $start_date; | |
| my $name; | |
| my $state; | |
| foreach $line (@lines){ | |
| if ($line=~/lease\s(\d+\.\d+\.\d+\.\d+)/){ | |
| $ip=$1; | |
| $readit = 1; | |
| $lease++; | |
| $name=""; | |
| } | |
| if ($readit && $line=~/starts\s\d\s(\d+\/\d+\/\d+\s\d+:\d+:\d+)\;/){ | |
| $start_date_time =$1; | |
| } | |
| if ($readit && $line=~/ends\s\d\s(\d+\/\d+\/\d+\s\d+:\d+:\d+)\;/){ | |
| $end_date_time =$1; | |
| #print $start_date_time; | |
| # $start_date_time = localize($start_date_time); | |
| # ($start_date, $start_time) = split (/T/,$start_date_time); | |
| } | |
| if ($readit && $line =~/hardware\sethernet\s(.*?)\;/){ | |
| $mac=$1; | |
| } | |
| if ($readit && $line =~/client-hostname\s"(.*?)"\;/){ | |
| $name=$1; | |
| } | |
| if ($readit){ | |
| if ($line=~/^\s+binding\sstate\s(.*?)\;/){ | |
| $state = $1; | |
| if ($state eq 'active'){ | |
| $active++; | |
| } | |
| } | |
| } | |
| if ($readit && $line=~/^}/){ | |
| push (@lease_states,"$ip\t$start_date_time\t$end_date_time\t$mac\t$state\t\t$name\n"); | |
| $readit = 0; | |
| } | |
| } | |
| @lease_states=sort (@lease_states); | |
| my $header=("IP\t\tSTART TIME\t\tEND TIME\t\tMAC\t\t\tSTATE\t\tHOSTNAME\n"); | |
| print $header; | |
| print @lease_states; | |
| print "Total leases: $lease\n"; | |
| print "Total active leases: $active\n"; | |
| sub localize{ | |
| # in format 2010/06/01 22:10:01 | |
| my $datetime=shift; | |
| my ($date, $time) = split (/ /,$datetime); | |
| my ($hr, $min, $sec) = split (/:/,$time); | |
| my ($yr, $mo, $day)= split (/\//,$date); | |
| #my $dt = DateTime->new( | |
| # year => $yr, | |
| # month => $mo, | |
| # day => $day, | |
| # hour => $hr, | |
| # minute => $min, | |
| # second => $sec, | |
| # time_zone =>'UTC' ); | |
| # $dt->set_time_zone($LocalTZ); | |
| # return $dt->datetime; | |
| return $datetime; | |
| # use this to split the out | |
| # ($date, $time) = split (/T/,$dt->datetime); | |
| } |
Good call.. I've updated the gist.
Nice and useful script! I get many duplicates:
192.168.2.122 2014/11/19 09:11:02 2014/11/19 09:41:02 58:a2:b5:d5:1b:bc active android-92aca921526b52f0
192.168.2.122 2014/11/19 09:25:27 2014/11/19 09:55:27 58:a2:b5:d5:1b:bc active android-92aca921526b52f0
Thanks for the script - in a similar vein to the first post by awfki I had to add in $mac=""; below line 87 to reset the mac address otherwise it looked like one mac address was using all of the spare ip addresses.
@mattpascoe Script works as advertised. Thanks for that! Are you aware of the Text::DHCPLeases module?
@merentitis You have a LG Electronics device. Interesting 😉 To preserve your privacy you should always use a random MAC address based on MAC addresses reserved for documentation as defined by RFC7042. Example: 00:00:5E:00:53:23. You can be targeted using your MAC address as selector!
Love it, and it saved me having to write my own, but I'd suggest adding $name=""; below line 87 to reset the name for leases where it wasn't set. I have a lot of those.
Thanks