diff --git a/Makefile.am b/Makefile.am index 1daf7287d..d8e5104e9 100644 --- a/Makefile.am +++ b/Makefile.am @@ -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 \ diff --git a/introspection/org.freedesktop.NetworkManager.DnsManager.xml b/introspection/org.freedesktop.NetworkManager.DnsManager.xml new file mode 100644 index 000000000..8cc3eba21 --- /dev/null +++ b/introspection/org.freedesktop.NetworkManager.DnsManager.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + diff --git a/src/dns/nm-dns-manager.c b/src/dns/nm-dns-manager.c index 3a3ae3a66..aee6e8fc8 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 @@ -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); } diff --git a/src/dns/nm-dns-manager.h b/src/dns/nm-dns-manager.h index 3deda5823..d8b253a69 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;