Hi -

It's currently impossible to tell which upstream DNS servers are in use by
dnsmasq; this is particularly irksome when they're controlled by
NetworkManager or similar (grepping for syslog messages doesn't count as
instrumentation...)

Here's a trivial implementation of a GetServes DBus call that returns the
servers/domains (formatted for re-use in --servers flags). Ideally, there'd
be a call like GetConfig or similar that dumps the entire active
configuration in config-file format...


Gabe
-- 
Do not think by infection, catching an opinion like a cold.
diff --git a/dbus/DBus-interface b/dbus/DBus-interface
index 2db5c30..482c37e 100644
--- a/dbus/DBus-interface
+++ b/dbus/DBus-interface
@@ -35,6 +35,11 @@ GetVersion
 ----------
 Returns a string containing the version of dnsmasq running.
 
+GetServers
+----------
+Returns a string containing the current set of upstream servers (and the
+domains they're used for, if set).
+
 ClearCache
 ----------
 Returns nothing. Clears the domain name cache and re-reads
diff --git a/po/de.po b/po/de.po
index a8a83e0..874d3f8 100644
--- a/po/de.po
+++ b/po/de.po
@@ -1412,7 +1412,11 @@ msgstr "DNS-Dienst auf lokale Subnetze eingeschränkt"
 msgid "compile time options: %s"
 msgstr "Übersetzungsoptionen: %s"
 
-#: dnsmasq.c:751
+#: dnsmasq.c:766
+msgid "DBus support enabled: connected to session bus"
+msgstr "DBus-Unterstützung eingeschaltet: mit Sessionbus verbunden"
+
+#: dnsmasq.c:768
 msgid "DBus support enabled: connected to system bus"
 msgstr "DBus-Unterstützung eingeschaltet: mit Systembus verbunden"
 
diff --git a/src/dbus.c b/src/dbus.c
index 6a78b20..a8998d3 100644
--- a/src/dbus.c
+++ b/src/dbus.c
@@ -35,6 +35,9 @@ const char* introspection_xml_template =
 "    <method name=\"GetVersion\">\n"
 "      <arg name=\"version\" direction=\"out\" type=\"s\"/>\n"
 "    </method>\n"
+"    <method name=\"GetServers\">\n"
+"      <arg name=\"config\" direction=\"out\" type=\"s\"/>\n"
+"    </method>\n"
 #ifdef HAVE_LOOP
 "    <method name=\"GetLoopServers\">\n"
 "      <arg name=\"server\" direction=\"out\" type=\"as\"/>\n"
@@ -641,6 +644,38 @@ DBusHandlerResult message_handler(DBusConnection *connection,
       
       dbus_message_append_args(reply, DBUS_TYPE_STRING, &v, DBUS_TYPE_INVALID);
     }
+  else if (strcmp(method, "GetServers") == 0)
+    {
+      reply = dbus_message_new_method_return(message);
+      char *servers = NULL;
+      size_t servers_len = 0;
+      for (struct server *serv = daemon->servers; serv; serv = serv->next) {
+        int domain_len = serv->domain ? strlen(serv->domain) : 0;
+        /* "/" + domain + "/" + address + NUL */
+        int buf_len = domain_len + 2 + ADDRSTRLEN + 1;
+        char *server_flag = calloc(buf_len, 1);
+        char *tmp = server_flag;
+        if (serv->domain) {
+          *tmp++ = '/';
+          strcpy(tmp, serv->domain);
+          tmp += domain_len;
+          *tmp++ = '/';
+        }
+        prettyprint_addr(&serv->addr, tmp);
+
+        servers = realloc(servers, servers_len + 1 + buf_len);
+        tmp = servers + servers_len;
+        if (servers_len > 0)
+          {
+            *tmp++ = '\n';
+            servers_len++;
+          }
+        strcpy(tmp, server_flag);
+        servers_len += strlen(server_flag);
+        free(server_flag);
+      }
+      dbus_message_append_args(reply, DBUS_TYPE_STRING, &servers, DBUS_TYPE_INVALID);
+    }
 #ifdef HAVE_LOOP
   else if (strcmp(method, "GetLoopServers") == 0)
     {
@@ -721,8 +756,16 @@ char *dbus_init(void)
   DBusMessage *message;
 
   dbus_error_init (&dbus_error);
-  if (!(connection = dbus_bus_get (DBUS_BUS_SYSTEM, &dbus_error)))
-    return NULL;
+  if (option_bool(OPT_DEBUG))
+    {
+      if (!(connection = dbus_bus_get (DBUS_BUS_SESSION, &dbus_error)))
+        return NULL;
+    }
+  else
+    {
+      if (!(connection = dbus_bus_get (DBUS_BUS_SYSTEM, &dbus_error)))
+        return NULL;
+    }
     
   dbus_connection_set_exit_on_disconnect(connection, FALSE);
   dbus_connection_set_watch_functions(connection, add_watch, remove_watch, 
diff --git a/src/dnsmasq.c b/src/dnsmasq.c
index ff2c7f2..6d02bda 100644
--- a/src/dnsmasq.c
+++ b/src/dnsmasq.c
@@ -761,7 +761,12 @@ int main (int argc, char **argv)
   if (option_bool(OPT_DBUS))
     {
       if (daemon->dbus)
-	my_syslog(LOG_INFO, _("DBus support enabled: connected to system bus"));
+        {
+          if (option_bool(OPT_DEBUG))
+            my_syslog(LOG_INFO, _("DBus support enabled: connected to session bus"));
+          else
+            my_syslog(LOG_INFO, _("DBus support enabled: connected to system bus"));
+        }
       else
 	my_syslog(LOG_INFO, _("DBus support enabled: bus connection pending"));
     }
_______________________________________________
Dnsmasq-discuss mailing list
Dnsmasq-discuss@lists.thekelleys.org.uk
http://lists.thekelleys.org.uk/mailman/listinfo/dnsmasq-discuss

Reply via email to