summaryrefslogtreecommitdiff
path: root/src/dns
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2016-10-24 13:28:51 +0200
committerBeniamino Galvani <bgalvani@redhat.com>2016-12-12 21:49:15 +0100
commit14105ece56b65fed64bade4013b105f7adaad27b (patch)
tree34e288ecd5615551608c73a28af4b6b6c775287b /src/dns
parent5307e07e3b8dc13040f021ba9874130b0bc44800 (diff)
downloadNetworkManager-14105ece56b65fed64bade4013b105f7adaad27b.tar.gz
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.
Diffstat (limited to 'src/dns')
-rw-r--r--src/dns/nm-dns-manager.c84
-rw-r--r--src/dns/nm-dns-manager.h5
2 files changed, 80 insertions, 9 deletions
diff --git a/src/dns/nm-dns-manager.c b/src/dns/nm-dns-manager.c
index 3a3ae3a669..aee6e8fc8a 100644
--- a/src/dns/nm-dns-manager.c
+++ b/src/dns/nm-dns-manager.c
@@ -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
@@ -1750,6 +1774,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)
{
NMDnsManagerPrivate *priv = NM_DNS_MANAGER_GET_PRIVATE (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);
}
diff --git a/src/dns/nm-dns-manager.h b/src/dns/nm-dns-manager.h
index 3deda58237..d8b253a692 100644
--- a/src/dns/nm-dns-manager.h
+++ b/src/dns/nm-dns-manager.h
@@ -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;