Cleanup leases?

Jeff A. Earickson jaearick at colby.edu
Wed Sep 27 12:24:50 UTC 2006


On Wed, 27 Sep 2006, Glenn Satchell wrote:

> Date: Wed, 27 Sep 2006 22:08:19 +1000 (EST)
> From: Glenn Satchell <Glenn.Satchell at uniq.com.au>
> Reply-To: dhcp-users at isc.org
> To: dhcp-users at isc.org
> Subject: RE: Cleanup leases?
> 
> The list software strips attachments. Jeff, you need to post the script
> in the body of the email.
>
> regards,
> -glenn
> --
> Glenn Satchell     mailto:glenn.satchell at uniq.com.au | Some days we are
> Uniq Advances Pty Ltd         http://www.uniq.com.au | the flies;  some
> PO Box 70 Paddington NSW Australia 2021              | days we  are the
> tel:0409-458-580  tel:02-9380-6360  fax:02-9380-6416 | windscreens...
>
>> From: "Atiqur Rahman Mohammed" <amohammed at velankani.com>
>>
>> Still did not find the attachment.
>>
>> Regards,
>>
>> Atiqur Rahman Mohammed
>> Software Engineer

Glenn,

I wondered what was going on...  Here it is (round 3):

---snip---snip---snip
#!/usr/bin/perl
#
#---script to remove leases for a given subnet from your DHCP lease file.
#---Removes free leases only in default mode (not really useful), or
#---"force clean" mode (-f) which will clean every free AND active
#---lease in the subnet EXCEPT for machines which answer a ping.

#--- Jeff Earickson, Colby College (jaearick at colby.edu), 6/18/2004

use Getopt::Std;	# for command line parsing
use Net::Ping;		# for pinging hosts

###################
###--- subroutines
###################
sub usage
{
 	print STDERR "Usage: clean_leases.pl [-f] -i input -o output string\n";
 	print STDERR "\t-f\tremove ALL leases in a subnet, active or not\n";
 	print STDERR "\t\tEXCEPT machines that can be pinged\n";
 	print STDERR "\n";
 	print STDERR "\t-N\tNuke ALL leases in a subnet, active or not\n";
 	print STDERR "\t\tno questions asked.\n";
 	print STDERR "\n";
 	print STDERR "\"input\" is the existing dhcpd.leases file\n";
 	print STDERR "\"output\" is the new (cleaned) dhcpd.leases file\n";
 	print STDERR "\"string\" is a IP number string, eg subnet, that\n";
 	print STDERR "\tyou want to clean up, like 137.146.209\n";
 	print STDERR "\n";
 	print STDERR "Stop dhcp, run this program on dhcpd.leases, copy the old\n";
 	print STDERR "lease file to dhcpd.leases.last, put the new (cleaned)\n";
 	print STDERR "lease file in place, restart dhcp.\n";
 	exit 1;
}

###################
###--- main routine
###################

#---parse the command-line
getopts('fi:No:') || &usage;

#---input and output files
open(FOO,"< $opt_i") || die "cannot open $opt_i";
open(BAR,"> $opt_o");

if($opt_f)
{
 	print "Force cleaning $ARGV[0].  This requires pinging every\n";
 	print "machine in $ARGV[0], which is slow, please be patient...\n";
}

if($opt_N)
{
 	print "NUCLEAR cleaning $ARGV[0].  ALL leases in this subnet REMOVED.\n";
}

$cleanit = 0;
$freestate = 0;
$ncleaned = 0;
$fcleaned = 0;
$nsaved = 0;
$nunmatched = 0;
$buf="";
$lease = "";
while(<FOO>)
{
 	#---found a match on the IP string
 	if ($_ =~ /^lease $ARGV[0]/)
 	{
 		$ipnumber = $1 if /^lease (\S+) {/;
 		$cleanit = 1;
 		$lease = $_;
 	}

 	#---lease state is free
 	if ($_ =~ /  binding state free;/ )
 	{
 		$freestate = 1;
 	}

 	#---append info to the buffer if not end-of-lease marker
 	if ($_ ne "}\n" )
 	{
 		$buf .= $_;
 	}
 	#---end of the lease info.  Write to output or ignore?
 	else
 	{
 		#---matches IP string we are interested in
 		if($cleanit == 1)
 		{
 			#---zap all leases, except machines that ping
 			if($opt_f)
 			{
 				#---ping with ping timeout of one second
 				$p = Net::Ping->new();
 				if($p->ping($ipnumber,1))
 				{
 					print "lease $ipnumber answered ping, leaving alone.\n";
 					print BAR $buf."}\n";
 					$nsaved++;
 				}
 				else
 				{
 					#print "force cleaning lease in $ARGV[0]\n";
 					$fcleaned++;
 				}
 				$p->close();
 			}
 			#--- Nuclear cleaning option, even live machines
 			elsif($opt_N)
 			{
 				#print "Nuclear cleaning lease in $ARGV[0]\n";
 				$fcleaned++;
 			}
 			#---only zap free leases (default)
 			else
 			{
 				#---free state so do NOT save the lease info
 				if($freestate == 1)
 				{
 					#print "cleaning free lease in $ARGV[0]\n";
 					$ncleaned++;
 				}
 				#---active lease: save info to output file
 				else
 				{
 					#print "saving active lease in $ARGV[0]\n";
 					print BAR $buf."}\n";
 					$nsaved++;
 				}
 			}
 		}
 		#---no match to IP string, save info to output file
 		else
 		{
 			print BAR $buf."}\n";
 			$buf="";
 			$nunmatched++;
 		}
 		$cleanit=0;
 		$freestate=0;
 		$buf="";
 		$lease = "";
 	}
}
if($fcleaned > 0)
{
 	print "force cleaned $fcleaned leases in $ARGV[0], $nsaved saved\n";
}
else
{
 	print "$ncleaned leases in $ARGV[0] cleaned, $nsaved saved\n";
}
print "$nunmatched leases unmatched\n";
---snip---snip---snip

Jeff Earickson
Colby College



More information about the dhcp-users mailing list