Reverse updates
authorJamie Cameron <jcameron@webmin.com>
Thu, 24 Jan 2008 00:48:19 +0000 (00:48 +0000)
committerJamie Cameron <jcameron@webmin.com>
Thu, 24 Jan 2008 00:48:19 +0000 (00:48 +0000)
dhcp-dns/delete.cgi
dhcp-dns/dhcp-dns-lib.pl
dhcp-dns/save.cgi

index 1b6381a..4404cd7 100644 (file)
@@ -12,14 +12,29 @@ require './dhcp-dns-lib.pl';
 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
index 7e35403..73fcabb 100644 (file)
@@ -193,6 +193,26 @@ local @recs = &bind8::read_zone_file($fn, $config{'domain'});
 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");
index cc214ff..2bca1e3 100644 (file)
@@ -50,6 +50,14 @@ if ($in{'delete'}) {
                &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
@@ -103,6 +111,51 @@ else {
                }
        &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