dns: export DNS manager D-Bus object

Extend the D-Bus API and introduce a new NMDnsManager interface that
contains all the information related to DNS configuration.

At the moment the new DnsManager object only contains basic properties
describing the current DNS mode and resolv.conf manager.
This commit is contained in:
Beniamino Galvani
2016-10-24 13:28:51 +02:00
parent 5307e07e3b
commit 14105ece56
4 changed files with 109 additions and 9 deletions

View File

@@ -223,6 +223,8 @@ introspection_sources = \
introspection/org.freedesktop.NetworkManager.DHCP4Config.h \
introspection/org.freedesktop.NetworkManager.DHCP6Config.c \
introspection/org.freedesktop.NetworkManager.DHCP6Config.h \
introspection/org.freedesktop.NetworkManager.DnsManager.c \
introspection/org.freedesktop.NetworkManager.DnsManager.h \
introspection/org.freedesktop.NetworkManager.IP4Config.c \
introspection/org.freedesktop.NetworkManager.IP4Config.h \
introspection/org.freedesktop.NetworkManager.IP6Config.c \
@@ -324,6 +326,7 @@ dbusinterfaces_DATA = \
introspection/org.freedesktop.NetworkManager.Device.xml \
introspection/org.freedesktop.NetworkManager.DHCP4Config.xml \
introspection/org.freedesktop.NetworkManager.DHCP6Config.xml \
introspection/org.freedesktop.NetworkManager.DnsManager.xml \
introspection/org.freedesktop.NetworkManager.IP4Config.xml \
introspection/org.freedesktop.NetworkManager.IP6Config.xml \
introspection/org.freedesktop.NetworkManager.xml \

View File

@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<node name="/org/freedesktop/NetworkManager/DnsManager">
<!--
org.freedesktop.NetworkManager.DnsManager:
The interface contains DNS-related information.
-->
<interface name="org.freedesktop.NetworkManager.DnsManager">
<!--
Mode:
The current DNS processing mode.
-->
<property name="Mode" type="s" access="read"/>
<!--
RcManager:
The current resolv.conf management mode.
-->
<property name="RcManager" type="s" access="read"/>
</interface>
</node>

View File

@@ -48,6 +48,8 @@
#include "nm-dns-systemd-resolved.h"
#include "nm-dns-unbound.h"
#include "introspection/org.freedesktop.NetworkManager.DnsManager.h"
#if WITH_LIBSOUP
#include <libsoup/soup.h>
@@ -82,6 +84,11 @@ enum {
LAST_SIGNAL
};
NM_GOBJECT_PROPERTIES_DEFINE (NMDnsManager,
PROP_MODE,
PROP_RC_MANAGER,
);
static guint signals[LAST_SIGNAL] = { 0 };
typedef enum {
@@ -126,6 +133,7 @@ typedef struct {
guint8 prev_hash[HASH_LEN]; /* Hash when begin_updates() was called */
NMDnsManagerResolvConfManager rc_manager;
char *mode;
NMDnsPlugin *plugin;
NMConfig *config;
@@ -140,15 +148,15 @@ typedef struct {
} NMDnsManagerPrivate;
struct _NMDnsManager {
GObject parent;
NMExportedObject parent;
NMDnsManagerPrivate _priv;
};
struct _NMDnsManagerClass {
GObjectClass parent;
NMExportedObjectClass parent;
};
G_DEFINE_TYPE (NMDnsManager, nm_dns_manager, G_TYPE_OBJECT)
G_DEFINE_TYPE (NMDnsManager, nm_dns_manager, NM_TYPE_EXPORTED_OBJECT)
NM_DEFINE_SINGLETON_INSTANCE (NMDnsManager);
@@ -1629,7 +1637,7 @@ init_resolv_conf_mode (NMDnsManager *self, gboolean force_reload_plugin)
NMDnsManagerPrivate *priv = NM_DNS_MANAGER_GET_PRIVATE (self);
NMDnsManagerResolvConfManager rc_manager;
const char *mode;
gboolean plugin_changed = FALSE;
gboolean param_changed = FALSE, plugin_changed = FALSE;
mode = nm_config_data_get_dns_mode (nm_config_get_data (priv->config));
@@ -1704,13 +1712,29 @@ again:
g_signal_connect (priv->plugin, NM_DNS_PLUGIN_CHILD_QUIT, G_CALLBACK (plugin_child_quit), self);
}
if ( plugin_changed
|| priv->rc_manager != rc_manager) {
g_object_freeze_notify (G_OBJECT (self));
if (!nm_streq0 (priv->mode, mode)) {
g_free (priv->mode);
priv->mode = g_strdup (mode);
param_changed = TRUE;
_notify (self, PROP_MODE);
}
if (priv->rc_manager != rc_manager) {
priv->rc_manager = rc_manager;
param_changed = TRUE;
_notify (self, PROP_RC_MANAGER);
}
if (param_changed || plugin_changed) {
_LOGI ("init: dns=%s, rc-manager=%s%s%s%s",
mode, _rc_manager_to_string (rc_manager),
NM_PRINT_FMT_QUOTED (priv->plugin, ", plugin=", nm_dns_plugin_get_name (priv->plugin), "", ""));
NM_PRINT_FMT_QUOTED (priv->plugin, ", plugin=",
nm_dns_plugin_get_name (priv->plugin), "", ""));
}
g_object_thaw_notify (G_OBJECT (self));
}
static void
@@ -1749,6 +1773,26 @@ config_changed_cb (NMConfig *config,
}
}
static void
get_property (GObject *object, guint prop_id,
GValue *value, GParamSpec *pspec)
{
NMDnsManager *self = NM_DNS_MANAGER (object);
NMDnsManagerPrivate *priv = NM_DNS_MANAGER_GET_PRIVATE (self);
switch (prop_id) {
case PROP_MODE:
g_value_set_string (value, priv->mode);
break;
case PROP_RC_MANAGER:
g_value_set_string (value, _rc_manager_to_string (priv->rc_manager));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
nm_dns_manager_init (NMDnsManager *self)
{
@@ -1819,6 +1863,7 @@ finalize (GObject *object)
NMDnsManagerPrivate *priv = NM_DNS_MANAGER_GET_PRIVATE (self);
g_free (priv->hostname);
g_free (priv->mode);
G_OBJECT_CLASS (nm_dns_manager_parent_class)->finalize (object);
}
@@ -1827,12 +1872,29 @@ static void
nm_dns_manager_class_init (NMDnsManagerClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
NMExportedObjectClass *exported_object_class = NM_EXPORTED_OBJECT_CLASS (klass);
/* virtual methods */
object_class->dispose = dispose;
object_class->finalize = finalize;
object_class->get_property = get_property;
exported_object_class->export_path = NM_DBUS_PATH "/DnsManager";
exported_object_class->export_on_construction = TRUE;
obj_properties[PROP_MODE] =
g_param_spec_string (NM_DNS_MANAGER_MODE, "", "",
NULL,
G_PARAM_READABLE |
G_PARAM_STATIC_STRINGS);
obj_properties[PROP_RC_MANAGER] =
g_param_spec_string (NM_DNS_MANAGER_RC_MANAGER, "", "",
NULL,
G_PARAM_READABLE |
G_PARAM_STATIC_STRINGS);
g_object_class_install_properties (object_class, _PROPERTY_ENUMS_LAST, obj_properties);
/* signals */
signals[CONFIG_CHANGED] =
g_signal_new (NM_DNS_MANAGER_CONFIG_CHANGED,
G_OBJECT_CLASS_TYPE (object_class),
@@ -1840,5 +1902,9 @@ nm_dns_manager_class_init (NMDnsManagerClass *klass)
0, NULL, NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0);
nm_exported_object_class_add_interface (NM_EXPORTED_OBJECT_CLASS (klass),
NMDBUS_TYPE_DNS_MANAGER_SKELETON,
NULL);
}

View File

@@ -51,6 +51,11 @@ typedef struct {
#define NM_IS_DNS_MANAGER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), NM_TYPE_DNS_MANAGER))
#define NM_DNS_MANAGER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), NM_TYPE_DNS_MANAGER, NMDnsManagerClass))
/* properties */
#define NM_DNS_MANAGER_MODE "mode"
#define NM_DNS_MANAGER_RC_MANAGER "rc-manager"
/* internal signals */
#define NM_DNS_MANAGER_CONFIG_CHANGED "config-changed"
typedef struct _NMDnsManager NMDnsManager;