foreach $d (@d) {
($host) = grep { $_->{'values'}->[0] eq $d } @hosts;
if ($host) {
+ $fixed = &dhcpd::find("fixed-address", $host->{'members'});
&dhcpd::save_directive($host->{'parent'}, [ $host ], [ ], $indent);
}
+ else {
+ $fixed = undef;
+ }
($fn, $recs) = &get_dns_zone();
($old) = grep { lc($_->{'name'}) eq lc($d).'.' } @$recs;
if ($old) {
&bind8::delete_record($fn, $old);
&bind8::bump_soa_record($fn, $recs);
}
+ if ($fixed) {
+ ($rfn, $rrecs, $arpa, $rzone) = &get_reverse_dns_zone(
+ $fixed->{'values'}->[0]);
+ if ($rfn) {
+ ($old) = grep { $_->{'name'} eq $arpa."." } @$rrecs;
+ if ($old) {
+ &bind8::delete_record($rfn, $old);
+ &bind8::bump_soa_record($rfn, $rrecs);
+ }
+ }
+ }
}
# Apply config
return ( $fn, \@recs );
}
+# get_reverse_dns_zone(ip)
+# Returns the records file and list of records for the domain for some IP
+sub get_reverse_dns_zone
+{
+local ($ip) = @_;
+local $conf = &bind8::get_config();
+local @zones = &bind8::find("zone", $conf);
+foreach my $v (&bind8::find("view", $conf)) {
+ push(@zones, &bind8::find("zone", $v->{'members'}));
+ }
+local $arpa = &bind8::ip_to_arpa($ip);
+$arpa =~ s/\.$//;
+local ($z) = grep { $arpa =~ /\.$_->{'value'}$/i } @zones;
+return ( ) if (!$z);
+local $file = &bind8::find("file", $z->{'members'});
+local $fn = $file->{'values'}->[0];
+local @recs = &bind8::read_zone_file($fn, $config{'domain'});
+return ( $fn, \@recs, $arpa, $z->{'value'} );
+}
+
sub apply_configuration
{
&lock_file("$module_config_directory/apply");
&bind8::delete_record($fn, $old);
&bind8::bump_soa_record($fn, $recs);
}
+ ($rfn, $rrecs, $arpa, $rzone) = &get_reverse_dns_zone($in{'oldip'});
+ if ($rfn) {
+ ($old) = grep { $_->{'name'} eq $arpa."." } @$rrecs;
+ if ($old) {
+ &bind8::delete_record($rfn, $old);
+ &bind8::bump_soa_record($rfn, $rrecs);
+ }
+ }
}
else {
# Validate inputs
}
&bind8::bump_soa_record($fn, $recs);
+ if ($in{'new'}) {
+ # Add reverse record to DNS
+ ($rfn, $rrecs, $arpa, $rzone) = &get_reverse_dns_zone($in{'ip'});
+ if ($rfn) {
+ &bind8::create_record($rfn, $arpa.".", undef, "IN",
+ "PTR", $in{'host'}.'.');
+ }
+ }
+ elsif ($in{'ip'} ne $in{'oldip'} ||
+ $in{'host'} ne $in{'old'}) {
+ ($orfn, $orrecs, $oarpa, $orzone) = &get_reverse_dns_zone(
+ $in{'oldip'});
+ ($rfn, $rrecs, $arpa, $rzone) = &get_reverse_dns_zone(
+ $in{'ip'});
+ if ($orfn) {
+ ($old) = grep { $_->{'name'} eq $oarpa."." } @$orrecs;
+ }
+ else {
+ $old = undef;
+ }
+ if ($orzone && !$rzone && $old) {
+ # No longer exists
+ &bind8::delete_record($orfn, $old);
+ }
+ elsif (!$orzone && $rzone) {
+ # Create in new reverse zone
+ &bind8::create_record($rfn, $arpa.".", undef, "IN",
+ "PTR", $in{'host'}.'.');
+ }
+ elsif ($orzone ne $rzone && $old) {
+ # Move to new reverse zone
+ &bind8::delete_record($orfn, $old);
+ &bind8::create_record($rfn, $arpa.".", undef, "IN",
+ "PTR", $in{'host'}.'.');
+ }
+ elsif ($old) {
+ # Update in this one
+ &bind8::modify_record($rfn, $old, $arpa.".",
+ $old->{'ttl'}, $old->{'class'}, $old->{'type'},
+ $in{'host'}.'.');
+ }
+ }
+ &bind8::bump_soa_record($rfn, $rrecs) if ($rfn);
+ &bind8::bump_soa_record($orfn, $orrecs) if ($orfn);
+
# Save DHCP host
if (!$in{'new'} && $oldpar ne $par) {
# Move to new parent