Implement the mark-and-sweep delete

This commit is contained in:
Matthew Slowe 2021-06-12 16:54:50 +01:00
parent 9351ba62c1
commit 1519c653aa

View File

@ -23,6 +23,12 @@ sub _info {
print STDERR "\n";
}
sub _notice {
print STDERR ("NOTICE: ");
printf STDERR (@_);
print STDERR "\n";
}
my %supported_types = (
A => "yes",
AAAA => "yes",
@ -92,7 +98,7 @@ sub find_record($$$$) {
_debug("Comparing", $record, $host, $type, $value);
if($record->{host} eq $host and $record->{type} eq $type and reformat_data($type, $record) eq $value) {
# Mark record as seen
# $record->{_seen}++;
$seen{$record} = 1;
_debug("Found a record matching $host $type $value");
return $record;
}
@ -110,7 +116,7 @@ sub format_record($$$$) {
type => $type,
};
if ($type eq 'MX') {
my ($pri, $data) = split(/\s+/, $value) or croak("Argh");
my ($pri, $data) = split(/\s+/, $value);
$record->{mx_priority} = $pri;
$record->{data} = $data;
}
@ -154,7 +160,7 @@ sub check_and_update_record($$$$$) {
} else {
# Create new record
my $new = format_record($zone, $type, $host, $value);
_info("Created new record: %s %s %s", $host, $type, $value);
_notice("Created new record: %s %s %s", $host, $type, $value);
my $res = $ua->post(
$url,
"Content-Type" => "application/json",
@ -166,8 +172,16 @@ sub check_and_update_record($$$$$) {
}
}
sub delete_record($$) {
my ($zone, $record) = @_;
my $url = $in->[0]->{defaults}->{api} . "/$zone/records/$record->{host}/$record->{type}?host=$record->{host}&data=$record->{data}";
my $res = $ua->delete($url);
warn "Failed to delete $url: " . $res->status_line . "\n" . $res->content unless $res->is_success;
}
foreach my $z (keys %{$in->[0]->{zones}}) {
print "--- Handling $z\n";
_info("Processing %s", $z);
my $current = get_current_zone($z);
my $zone = $in->[0]->{zones}->{$z};
@ -194,8 +208,32 @@ foreach my $z (keys %{$in->[0]->{zones}}) {
}
}
}
}
}
# check for unseen records and delete but skip "_template" : true,
_info("Checking for records to delete");
foreach my $record (@{$current->{records}}) {
unless (defined $seen{$record}) {
# _info("Considering %s %s", $record->{host}, $record->{type});
my $skip;
if ($in->[0]->{ignore}->{$z}->{$record->{host}}) {
# check if type is specified
if(keys %{$in->[0]->{ignore}->{$z}->{$record->{host}}}) {
foreach my $type (keys %{$in->[0]->{ignore}->{$z}->{$record->{host}}}) {
if($type eq $record->{type}) {
# _info("Skipping %s %s", $record->{host}, $record->{type});
$skip = 1;
}
}
} else {
#_info("Skipping %s *[%s]", $record->{host}, $record->{type});
$skip = 1;
}
}
unless ($skip) {
_notice("Delete %s %s %s", $record->{host}, $record->{type}, $record->{data});
delete_record($z, $record);
}
}
}
_info("Finished processing %s", $z);
}