diff options
| author | Michael Biebl <biebl@debian.org> | 2025-02-28 17:38:21 +0100 |
|---|---|---|
| committer | Michael Biebl <biebl@debian.org> | 2025-02-28 17:38:21 +0100 |
| commit | 625e8ce60e826bde943487b8238884a9232e4562 (patch) | |
| tree | 4c1f0f88c466c69c27fc9ffbe787cc7d0964d630 /src/core/dns | |
| parent | 8bdf070ff046f482f6eb5e2b15ebc216f5d1e3da (diff) | |
New upstream version 1.52.0 upstream/1.52.0
Diffstat (limited to 'src/core/dns')
| -rw-r--r-- | src/core/dns/nm-dns-dnsconfd.c | 124 |
1 files changed, 63 insertions, 61 deletions
diff --git a/src/core/dns/nm-dns-dnsconfd.c b/src/core/dns/nm-dns-dnsconfd.c index b356c2f9..63b3060f 100644 --- a/src/core/dns/nm-dns-dnsconfd.c +++ b/src/core/dns/nm-dns-dnsconfd.c @@ -32,6 +32,8 @@ typedef struct { char *name_owner; guint name_owner_changed_id; GCancellable *name_owner_cancellable; + bool was_start_tried; + GCancellable *start_cancellable; GVariant *latest_update_args; guint awaited_configuration_serial; @@ -61,7 +63,11 @@ G_DEFINE_TYPE(NMDnsDnsconfd, nm_dns_dnsconfd, NM_TYPE_DNS_PLUGIN) #define DNSCONFD_DBUS_SERVICE "com.redhat.dnsconfd" -typedef enum { CONNECTION_FAIL, CONNECTION_SUCCESS, CONNECTION_WAIT } ConnectionState; +typedef enum { + CONNECTION_FAIL, + CONNECTION_SUCCESS, + CONNECTION_WAIT, +} ConnectionState; /*****************************************************************************/ @@ -329,29 +335,8 @@ get_networks(NMDnsConfigIPData *ip_data, char ***networks) static void server_builder_append_interface_info(GVariantBuilder *argument_builder, const char *interface, - char **networks, - const char *connection_id, - const char *connection_uuid, - const char *dbus_path) + char **networks) { - if (connection_id) { - g_variant_builder_add(argument_builder, - "{sv}", - "connection-id", - g_variant_new("s", connection_id)); - } - if (connection_uuid) { - g_variant_builder_add(argument_builder, - "{sv}", - "connection-uuid", - g_variant_new("s", connection_uuid)); - } - if (dbus_path) { - g_variant_builder_add(argument_builder, - "{sv}", - "connection-object", - g_variant_new("s", dbus_path)); - } if (interface) { g_variant_builder_add(argument_builder, "{sv}", "interface", g_variant_new("s", interface)); } @@ -500,6 +485,7 @@ name_owner_changed(NMDnsDnsconfd *self, const char *name_owner) } _LOGT("D-Bus name for dnsconfd got owner %s", name_owner); + priv->was_start_tried = FALSE; if (!subscribe_serial(self)) { /* This means that in time between new name and subscribe serial call @@ -544,6 +530,33 @@ get_name_owner_cb(const char *name_owner, GError *error, gpointer user_data) name_owner_changed(user_data, name_owner); } +static void +dnsconfd_start_done(GObject *source_object, GAsyncResult *res, gpointer user_data) +{ + NMDnsDnsconfd *self; + NMDnsDnsconfdPrivate *priv; + gs_free_error GError *error = NULL; + gs_unref_variant GVariant *response = NULL; + + response = g_dbus_connection_call_finish(G_DBUS_CONNECTION(source_object), res, &error); + if (nm_utils_error_is_cancelled(error)) + return; + + self = user_data; + priv = NM_DNS_DNSCONFD_GET_PRIVATE(self); + nm_clear_g_cancellable(&priv->start_cancellable); + + if (!res) { + g_dbus_error_strip_remote_error(error); + _LOGW("failed to start Dnsconfd %s", error->message); + } else { + _LOGT("succesfully started Dnsconfd"); + } + + /* No update maybe changed or state change, as this is handled by the name owner callbacks + * which should be triggered right after this */ +} + static ConnectionState ensure_all_connected(NMDnsDnsconfd *self) { @@ -581,6 +594,19 @@ ensure_all_connected(NMDnsDnsconfd *self) self); } + if (!priv->was_start_tried) { + _LOGT("attempting to start Dnsconfd via DBus"); + priv->was_start_tried = TRUE; + nm_clear_g_cancellable(&priv->start_cancellable); + priv->start_cancellable = g_cancellable_new(); + nm_dbus_connection_call_start_service_by_name(priv->dbus_connection, + DNSCONFD_DBUS_SERVICE, + -1, + priv->start_cancellable, + dnsconfd_start_done, + self); + } + return CONNECTION_WAIT; } @@ -589,18 +615,11 @@ parse_all_interface_config(GVariantBuilder *argument_builder, const CList *ip_data_lst_head, const char *ca) { - NMDnsConfigIPData *ip_data; - const char *const *dns_server_strings; - guint nameserver_count; - const char *ifname; - NMDevice *device; - NMActiveConnection *active_connection; - NMSettingsConnection *settings_connection; - NMActRequest *act_request; - const char *connection_id; - const char *connection_uuid; - const char *dbus_path; - gboolean explicit_default = is_default_interface_explicit(ip_data_lst_head); + NMDnsConfigIPData *ip_data; + const char *const *dns_server_strings; + guint nameserver_count; + const char *ifname; + gboolean explicit_default = is_default_interface_explicit(ip_data_lst_head); c_list_for_each_entry (ip_data, ip_data_lst_head, ip_data_lst) { /* No need to free insides of routing and search domains, as they point to data @@ -615,23 +634,7 @@ parse_all_interface_config(GVariantBuilder *argument_builder, &nameserver_count); if (!nameserver_count) continue; - ifname = nm_platform_link_get_name(NM_PLATFORM_GET, ip_data->data->ifindex); - device = nm_manager_get_device_by_ifindex(NM_MANAGER_GET, ip_data->data->ifindex); - act_request = nm_device_get_act_request(device); - active_connection = NM_ACTIVE_CONNECTION(act_request); - - /* Presume that when we have server of this interface then the interface has to have - * an active connection */ - nm_assert(active_connection); - - settings_connection = nm_active_connection_get_settings_connection(active_connection); - connection_id = nm_settings_connection_get_id(settings_connection); - connection_uuid = nm_settings_connection_get_uuid(settings_connection); - dbus_path = nm_dbus_object_get_path_still_exported(NM_DBUS_OBJECT(act_request)); - - /* dbus_path also should be set, because if we are parsing this connection then we - * expect it to be active and exported on dbus */ - nm_assert(dbus_path && dbus_path[0] != 0); + ifname = nm_platform_link_get_name(NM_PLATFORM_GET, ip_data->data->ifindex); gather_interface_domains(ip_data, explicit_default, &routing_domains, &search_domains); get_networks(ip_data, &networks); @@ -643,12 +646,7 @@ parse_all_interface_config(GVariantBuilder *argument_builder, routing_domains, search_domains, ca)) { - server_builder_append_interface_info(argument_builder, - ifname, - networks, - connection_id, - connection_uuid, - dbus_path); + server_builder_append_interface_info(argument_builder, ifname, networks); } } } @@ -696,7 +694,10 @@ update(NMDnsPlugin *plugin, /* We need to consider only whether we are connected, because newer update call * overrides the old one */ - if (all_connected != CONNECTION_SUCCESS) { + if (all_connected == CONNECTION_FAIL) { + priv->plugin_state = DNSCONFD_PLUGIN_IDLE; + _LOGT("failed to connect"); + } else if (all_connected == CONNECTION_WAIT) { priv->plugin_state = DNSCONFD_PLUGIN_WAIT_CONNECT; _LOGT("not connected, waiting to connect"); } else { @@ -704,6 +705,8 @@ update(NMDnsPlugin *plugin, _LOGT("connected, waiting for update to finish"); } + _nm_dns_plugin_update_pending_maybe_changed(plugin); + if (all_connected == CONNECTION_FAIL) { nm_utils_error_set(error, NM_UTILS_ERROR_UNKNOWN, @@ -717,8 +720,6 @@ update(NMDnsPlugin *plugin, send_dnsconfd_update(self); - _nm_dns_plugin_update_pending_maybe_changed(NM_DNS_PLUGIN(self)); - return TRUE; } @@ -731,6 +732,7 @@ stop(NMDnsPlugin *plugin) nm_clear_g_cancellable(&priv->update_cancellable); nm_clear_g_cancellable(&priv->name_owner_cancellable); nm_clear_g_cancellable(&priv->serial_cancellable); + nm_clear_g_cancellable(&priv->start_cancellable); nm_clear_g_dbus_connection_signal(priv->dbus_connection, &priv->name_owner_changed_id); nm_clear_g_dbus_connection_signal(priv->dbus_connection, &priv->properties_changed_id); } |