#!/usr/local/bin/perl
# Show a list of free IP addresses, within the configured ranges
require './bind8-lib.pl';
# Go through all zones to find IPs in use, and networks
$conf = &get_config();
@views = &find("view", $conf);
foreach $v (@views) {
@vz = &find("zone", $v->{'members'});
map { $view{$_} = $v } @vz;
push(@zones, @vz);
}
push(@zones, &find("zone", $conf));
foreach $z (@zones) {
$type = &find_value("type", $z->{'members'});
next if ($type ne "master");
$file = &find_value("file", $z->{'members'});
@recs = &read_zone_file($file, $z->{'value'});
foreach $r (@recs) {
if ($r->{'type'} eq 'A') {
$taken{$r->{'values'}->[0]}++;
$net = $r->{'values'}->[0];
$net =~ s/\d+$/0/;
if ($net ne "127.0.0.0") {
$nets{$net}++;
}
}
elsif ($r->{'type'} eq 'PTR') {
$taken{&arpa_to_ip($r->{'values'}->[0])}++;
}
}
}
# Use configured networks, if any
if ($config{'free_nets'}) {
@nets = split(/\s+/, $config{'free_nets'});
}
else {
@nets = keys %nets;
}
@nets = sort { $a cmp $b } @nets;
# display list of free IPs in the nets
&popup_header($text{'free_title'});
print "\n";
print &ui_columns_start([ $text{'free_ip'} ], 100);
foreach $net (@nets) {
@netip = split(/\./, $net);
if ($netip[3] eq "0") {
$start = 1;
$end = 255;
}
elsif ($netip[3] =~ /^(\d+)\-(\d+)$/) {
$start = $1;
$end = $2;
}
else {
$start = $end = $netip[3];
}
for($d=$start; $d<=$end; $d++) {
$ip = "$netip[0].$netip[1].$netip[2].$d";
if (!$taken{$ip}) {
print &ui_columns_row([ "$ip" ]);
}
}
}
print &ui_columns_end();
&popup_footer();