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