Implement the mark-and-sweep delete
This commit is contained in:
parent
9351ba62c1
commit
1519c653aa
@ -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);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user