From 94415361c57802f2b5efc15c083205e38eabaabc Mon Sep 17 00:00:00 2001 From: Jelloul Ayeb <jelloul.ayeb@aviation-civile.gouv.fr> Date: Thu, 1 Jun 2023 22:31:24 +0200 Subject: [PATCH] update soa serials of affected domains when deleting records --- functions/classes/class.PowerDNS.php | 54 ++++++++++++++++++++++------ 1 file changed, 43 insertions(+), 11 deletions(-) diff --git a/functions/classes/class.PowerDNS.php b/functions/classes/class.PowerDNS.php index ff559054..db3ab4f5 100644 --- a/functions/classes/class.PowerDNS.php +++ b/functions/classes/class.PowerDNS.php @@ -686,6 +686,27 @@ class PowerDNS extends Common_functions { return !is_null($record) ? $record : false; } + /** + * Searches domains referencing a hostname or ip + * + * @access public + * @param mixed $hostname + * @param mixed $ip + * @return array|boolean + */ + public function search_domains_by_hostname_or_ip ($hostname, $ip) { + // query + $query = "select DISTINCT(`domain_id`) from `records` where `name` = ? or `content` = ? and `type` != 'NS' and `type` != 'SOA';"; + // fetch + try { $records = $this->Database_pdns->getObjectsQuery($query, array($hostname, $ip)); } + catch (Exception $e) { + $this->Result->show("danger", _("Error: ").$e->getMessage()); + return false; + } + # result + return sizeof($records)>0 ? $records : false; + } + /** * Searches records for specific domainid for type and name values * @@ -933,17 +954,28 @@ class PowerDNS extends Common_functions { * @return void */ public function pdns_remove_ip_and_hostname_records ($hostname, $ip) { - // set query - $query = "delete from `records` where (`name` = ? or `content` = ?) and `type` != 'NS' and `type` != 'SOA';"; - - // run - try { $this->Database_pdns->runQuery($query, array($hostname, $ip)); } - catch (Exception $e) { - $this->Result->show("danger", _("Error: ").$e->getMessage()); - return false; - } - #result - return true; + // find out which domains are going to need an soa serial update + $domains_records = $this->search_domains_by_hostname_or_ip($hostname, $ip); + + // set query + $query = "delete from `records` where (`name` = ? or `content` = ?) and `type` != 'NS' and `type` != 'SOA';"; + + // run + try { $this->Database_pdns->runQuery($query, array($hostname, $ip)); } + catch (Exception $e) { + $this->Result->show("danger", _("Error: ").$e->getMessage()); + return false; + } + + // update soa serial for impacted domains + if($domains_records !== false) { + foreach ($domains_records as $d) { + $this->update_soa_serial ($d->domain_id); + } + } + + #result + return true; } /** -- GitLab