Implement the mark-and-sweep delete
This commit is contained in:
parent
9351ba62c1
commit
1519c653aa
@ -23,6 +23,12 @@ sub _info {
|
|||||||
print STDERR "\n";
|
print STDERR "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub _notice {
|
||||||
|
print STDERR ("NOTICE: ");
|
||||||
|
printf STDERR (@_);
|
||||||
|
print STDERR "\n";
|
||||||
|
}
|
||||||
|
|
||||||
my %supported_types = (
|
my %supported_types = (
|
||||||
A => "yes",
|
A => "yes",
|
||||||
AAAA => "yes",
|
AAAA => "yes",
|
||||||
@ -92,7 +98,7 @@ sub find_record($$$$) {
|
|||||||
_debug("Comparing", $record, $host, $type, $value);
|
_debug("Comparing", $record, $host, $type, $value);
|
||||||
if($record->{host} eq $host and $record->{type} eq $type and reformat_data($type, $record) eq $value) {
|
if($record->{host} eq $host and $record->{type} eq $type and reformat_data($type, $record) eq $value) {
|
||||||
# Mark record as seen
|
# Mark record as seen
|
||||||
# $record->{_seen}++;
|
$seen{$record} = 1;
|
||||||
_debug("Found a record matching $host $type $value");
|
_debug("Found a record matching $host $type $value");
|
||||||
return $record;
|
return $record;
|
||||||
}
|
}
|
||||||
@ -110,7 +116,7 @@ sub format_record($$$$) {
|
|||||||
type => $type,
|
type => $type,
|
||||||
};
|
};
|
||||||
if ($type eq 'MX') {
|
if ($type eq 'MX') {
|
||||||
my ($pri, $data) = split(/\s+/, $value) or croak("Argh");
|
my ($pri, $data) = split(/\s+/, $value);
|
||||||
$record->{mx_priority} = $pri;
|
$record->{mx_priority} = $pri;
|
||||||
$record->{data} = $data;
|
$record->{data} = $data;
|
||||||
}
|
}
|
||||||
@ -154,7 +160,7 @@ sub check_and_update_record($$$$$) {
|
|||||||
} else {
|
} else {
|
||||||
# Create new record
|
# Create new record
|
||||||
my $new = format_record($zone, $type, $host, $value);
|
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(
|
my $res = $ua->post(
|
||||||
$url,
|
$url,
|
||||||
"Content-Type" => "application/json",
|
"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}}) {
|
foreach my $z (keys %{$in->[0]->{zones}}) {
|
||||||
print "--- Handling $z\n";
|
_info("Processing %s", $z);
|
||||||
my $current = get_current_zone($z);
|
my $current = get_current_zone($z);
|
||||||
|
|
||||||
my $zone = $in->[0]->{zones}->{$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