From f794af3ca787a55e532d78102273c6e4c348426d Mon Sep 17 00:00:00 2001
From: Nicolas KAROLAK <nicolas@karolak.fr>
Date: Wed, 16 Oct 2019 07:55:01 +0000
Subject: [PATCH] get dns servers from dbus

---
 tests/test_dns_records.py | 32 +++++++++++++++++++++++++-------
 1 file changed, 25 insertions(+), 7 deletions(-)

diff --git a/tests/test_dns_records.py b/tests/test_dns_records.py
index 5107e3ce..5a417247 100755
--- a/tests/test_dns_records.py
+++ b/tests/test_dns_records.py
@@ -5,6 +5,7 @@ Criticality: Normal
 Checks that DNS records are provided by the customer servers are correctly set
 """
 
+import dbus
 from pathlib import Path
 import re
 import subprocess
@@ -20,21 +21,39 @@ def get_dns_servers() -> set:
     servers = list()
     ip_pattern = re.compile(r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$")
 
-    if subprocess.getstatusoutput("command -v nmcli")[0] == 0:
-        # network-manager
+    # dbus method
+    try:
+        bus = dbus.SystemBus()
+        proxy = bus.get_object(
+            bus_name="org.freedesktop.resolve1", object_path="/org/freedesktop/resolve1"
+        )
+        iface = dbus.Interface(
+            object=proxy, dbus_interface="org.freedesktop.DBus.Properties"
+        )
+        data = iface.Get("org.freedesktop.resolve1.Manager", "DNS")
+        for dns in iface.Get("org.freedesktop.resolve1.Manager", "DNS"):
+            delimiter = ":" if len(dns[2]) == 16 else "."  # if IPv6 else IPv4
+            servers.append(delimiter.join([str(int(o)) for o in dns[2]]))
+    except Exception as dbus_err:
+        u.info("DBus method failed: {}".format(dbus_err))
+
+    # network-manager method
+    if not len(servers) and subprocess.getstatusoutput("command -v nmcli")[0] == 0:
         _, output = subprocess.getstatusoutput(
             "nmcli -f all device show | grep IP4.DNS | awk '{ print $2 }'"
         )
         servers = [l for l in output.split("\n") if ip_pattern.match(l)]
 
-    if not len(servers):
-        # resolvconf
+    # resolvconf method
+    if not len(servers) and Path("/etc/resolv.conf").exists():
         with open("/etc/resolv.conf", "r") as f:
             d = f.read().strip()
-            servers = [l.split()[1] for l in d.split("\n") if l.startswith("nameserver")]
+            servers = [
+                l.split()[1] for l in d.split("\n") if l.startswith("nameserver")
+            ]
 
+    # systemd-resolved method
     if "127.0.0.53" in servers:
-        # systemd-resolved
         servers.remove("127.0.0.53")
         _, output = subprocess.getstatusoutput("systemd-resolve --status")
         lines = [l.strip() for l in output.split("\n")]
@@ -48,7 +67,6 @@ def get_dns_servers() -> set:
             else:
                 dns_line = False
 
-
     return set(servers)
 
 
-- 
GitLab