merge: branch 'nm-1-38'

[nm-1.38] [RFE] dispatch `dns-change` dispatcher event

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1763
This commit is contained in:
Gris Ge 2023-10-19 08:52:52 +00:00
commit 7b07b513e1
8 changed files with 78 additions and 16 deletions

View file

@ -68,8 +68,9 @@
device an operation just happened on, and second the action. For device actions,
the interface is the name of the kernel interface suitable for IP configuration.
Thus it is either VPN_IP_IFACE, DEVICE_IP_IFACE, or DEVICE_IFACE, as applicable.
For the <varname>hostname</varname> action the device name is always <literal>"none"</literal>
and for <varname>connectivity-change</varname> it is empty.
For the <varname>hostname</varname> action the device name is always <literal>"none"</literal>.
For <varname>connectivity-change</varname> it is empty.
For <varname>dns-change</varname> it is empty.
</para>
<para>The actions are:</para>
<variablelist class="dispatcher-options">

View file

@ -1818,7 +1818,7 @@ plugin_skip:;
}
/* signal that DNS resolution configs were changed */
if ((do_update || caching || force_emit) && result == SR_SUCCESS)
if ((caching || force_emit) && result == SR_SUCCESS)
g_signal_emit(self, signals[CONFIG_CHANGED], 0);
nm_clear_pointer(&priv->config_variant, g_variant_unref);
@ -1834,6 +1834,16 @@ plugin_skip:;
return TRUE;
}
gboolean
nm_dns_manager_is_unmanaged(NMDnsManager *self)
{
NMDnsManagerPrivate *priv = NM_DNS_MANAGER_GET_PRIVATE(self);
return NM_IN_SET(priv->rc_manager,
NM_DNS_MANAGER_RESOLV_CONF_MAN_UNMANAGED,
NM_DNS_MANAGER_RESOLV_CONF_MAN_IMMUTABLE);
}
/*****************************************************************************/
gboolean

View file

@ -155,4 +155,6 @@ char *nmtst_dns_create_resolv_conf(const char *const *searches,
const char *const *nameservers,
const char *const *options);
gboolean nm_dns_manager_is_unmanaged(NMDnsManager *self);
#endif /* __NETWORKMANAGER_DNS_MANAGER_H__ */

View file

@ -49,6 +49,8 @@
} \
G_STMT_END
static gboolean nm_dispatcher_need_device(NMDispatcherAction action);
/*****************************************************************************/
struct NMDispatcherCallId {
@ -440,7 +442,8 @@ static const char *action_table[] = {[NM_DISPATCHER_ACTION_HOSTNAME] = NMD_
[NM_DISPATCHER_ACTION_DHCP_CHANGE_4] = NMD_ACTION_DHCP4_CHANGE,
[NM_DISPATCHER_ACTION_DHCP_CHANGE_6] = NMD_ACTION_DHCP6_CHANGE,
[NM_DISPATCHER_ACTION_CONNECTIVITY_CHANGE] =
NMD_ACTION_CONNECTIVITY_CHANGE};
NMD_ACTION_CONNECTIVITY_CHANGE,
[NM_DISPATCHER_ACTION_DNS_CHANGE] = NMD_ACTION_DNS_CHANGE};
static const char *
action_to_string(NMDispatcherAction action)
@ -499,9 +502,7 @@ _dispatcher_call(NMDispatcherAction action,
if (G_UNLIKELY(!request_id))
request_id = ++gl.request_id_counter;
/* All actions except 'hostname' and 'connectivity-change' require a device */
if (action == NM_DISPATCHER_ACTION_HOSTNAME
|| action == NM_DISPATCHER_ACTION_CONNECTIVITY_CHANGE) {
if (!nm_dispatcher_need_device(action)) {
_LOG2D(request_id,
log_ifname,
log_con_uuid,
@ -561,9 +562,8 @@ _dispatcher_call(NMDispatcherAction action,
g_variant_builder_init(&vpn_ip4_props, G_VARIANT_TYPE_VARDICT);
g_variant_builder_init(&vpn_ip6_props, G_VARIANT_TYPE_VARDICT);
/* hostname and connectivity-change actions don't send device data */
if (action != NM_DISPATCHER_ACTION_HOSTNAME
&& action != NM_DISPATCHER_ACTION_CONNECTIVITY_CHANGE) {
/* hostname, DNS and connectivity-change actions don't send device data */
if (nm_dispatcher_need_device(action)) {
fill_device_props(device,
&device_props,
&device_proxy_props,
@ -873,6 +873,30 @@ nm_dispatcher_call_connectivity(NMConnectivityState connectivity_state,
out_call_id);
}
/**
* nm_dispatcher_call_dns_change():
*
* This method does not block the caller.
*
* Returns: %TRUE if the action was dispatched, %FALSE on failure
*/
gboolean
nm_dispatcher_call_dns_change(void)
{
return _dispatcher_call(NM_DISPATCHER_ACTION_DNS_CHANGE,
FALSE,
NULL,
NULL,
NULL,
FALSE,
NM_CONNECTIVITY_UNKNOWN,
NULL,
NULL,
NULL,
NULL,
NULL);
}
void
nm_dispatcher_call_cancel(NMDispatcherCallId *call_id)
{
@ -885,3 +909,16 @@ nm_dispatcher_call_cancel(NMDispatcherCallId *call_id)
_LOG3D(call_id, "cancelling dispatcher callback action");
call_id->callback = NULL;
}
/* All actions except 'hostname', 'connectivity-change' and 'dns-change' require
* a device */
static gboolean
nm_dispatcher_need_device(NMDispatcherAction action)
{
if (action == NM_DISPATCHER_ACTION_HOSTNAME
|| action == NM_DISPATCHER_ACTION_CONNECTIVITY_CHANGE
|| action == NM_DISPATCHER_ACTION_DNS_CHANGE) {
return FALSE;
}
return TRUE;
}

View file

@ -21,7 +21,8 @@ typedef enum {
NM_DISPATCHER_ACTION_VPN_DOWN,
NM_DISPATCHER_ACTION_DHCP_CHANGE_4,
NM_DISPATCHER_ACTION_DHCP_CHANGE_6,
NM_DISPATCHER_ACTION_CONNECTIVITY_CHANGE
NM_DISPATCHER_ACTION_CONNECTIVITY_CHANGE,
NM_DISPATCHER_ACTION_DNS_CHANGE,
} NMDispatcherAction;
#define NM_DISPATCHER_ACTION_DHCP_CHANGE_X(IS_IPv4) \
@ -68,6 +69,8 @@ gboolean nm_dispatcher_call_connectivity(NMConnectivityState state,
gpointer user_data,
NMDispatcherCallId **out_call_id);
gboolean nm_dispatcher_call_dns_change(void);
void nm_dispatcher_call_cancel(NMDispatcherCallId *call_id);
#endif /* __NM_DISPATCHER_H__ */

View file

@ -2563,11 +2563,15 @@ dns_config_changed(NMDnsManager *dns_manager, gpointer user_data)
if (priv->updating_dns)
return;
nm_manager_for_each_device (priv->manager, device, tmp_lst) {
nm_device_clear_dns_lookup_data(device);
if (!nm_dns_manager_is_unmanaged(dns_manager)) {
nm_manager_for_each_device (priv->manager, device, tmp_lst) {
nm_device_clear_dns_lookup_data(device);
}
update_system_hostname(self, "DNS configuration changed");
}
update_system_hostname(self, "DNS configuration changed");
nm_dispatcher_call_dns_change();
}
static void

View file

@ -33,6 +33,7 @@
#define NMD_ACTION_DHCP4_CHANGE "dhcp4-change"
#define NMD_ACTION_DHCP6_CHANGE "dhcp6-change"
#define NMD_ACTION_CONNECTIVITY_CHANGE "connectivity-change"
#define NMD_ACTION_DNS_CHANGE "dns-change"
typedef enum {
DISPATCH_RESULT_UNKNOWN = 0,

View file

@ -453,8 +453,12 @@ nm_dispatcher_utils_construct_envp(const char *action,
items = g_ptr_array_new_with_free_func(g_free);
/* Hostname and connectivity changes don't require a device nor contain a connection */
if (NM_IN_STRSET(action, NMD_ACTION_HOSTNAME, NMD_ACTION_CONNECTIVITY_CHANGE))
/* Hostname, dns and connectivity changes don't require a device nor contain
* a connection */
if (NM_IN_STRSET(action,
NMD_ACTION_HOSTNAME,
NMD_ACTION_CONNECTIVITY_CHANGE,
NMD_ACTION_DNS_CHANGE))
goto done;
/* Connection properties */