dns: reload DNS plugin in SIGHUP
Previously, on SIGHUP we would re-read the configuration and possibly reconfigure DNS. However, if the DNS plugin didn't change, we would not restart it. That is good, because restarting the DNS plugin shortly interrupts name resolution. dnsmasq might depend on additional configuration from /etc/NetworkManager/dnsmasq.d, thus, the user also needs a way to restart the plugin to pickup the configuration. For that, it could just kill the dnsmasq instance, but that means, ratelimiting will hit and restarting dnsmasq too often might bork the plugin for 5 minutes. Now, on SIGHUP, also restart the DNS plugin. The advantage is that one signal reloads everything, including the dnsmasq instance, without ratelimiting. The disadvantage is, that it shortly interrupts name resolution.
This commit is contained in:
@@ -1520,7 +1520,7 @@ _get_resconf_immutable (void)
|
|||||||
NM_DEFINE_SINGLETON_GETTER (NMDnsManager, nm_dns_manager_get, NM_TYPE_DNS_MANAGER);
|
NM_DEFINE_SINGLETON_GETTER (NMDnsManager, nm_dns_manager_get, NM_TYPE_DNS_MANAGER);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
init_resolv_conf_mode (NMDnsManager *self)
|
init_resolv_conf_mode (NMDnsManager *self, gboolean force_reload_plugin)
|
||||||
{
|
{
|
||||||
NMDnsManagerPrivate *priv = NM_DNS_MANAGER_GET_PRIVATE (self);
|
NMDnsManagerPrivate *priv = NM_DNS_MANAGER_GET_PRIVATE (self);
|
||||||
NMDnsManagerResolvConfManager rc_manager;
|
NMDnsManagerResolvConfManager rc_manager;
|
||||||
@@ -1565,13 +1565,13 @@ again:
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (nm_streq0 (mode, "dnsmasq")) {
|
if (nm_streq0 (mode, "dnsmasq")) {
|
||||||
if (!NM_IS_DNS_DNSMASQ (priv->plugin)) {
|
if (force_reload_plugin || !NM_IS_DNS_DNSMASQ (priv->plugin)) {
|
||||||
_clear_plugin (self);
|
_clear_plugin (self);
|
||||||
priv->plugin = nm_dns_dnsmasq_new ();
|
priv->plugin = nm_dns_dnsmasq_new ();
|
||||||
plugin_changed = TRUE;
|
plugin_changed = TRUE;
|
||||||
}
|
}
|
||||||
} else if (nm_streq0 (mode, "unbound")) {
|
} else if (nm_streq0 (mode, "unbound")) {
|
||||||
if (!NM_IS_DNS_UNBOUND (priv->plugin)) {
|
if (force_reload_plugin || !NM_IS_DNS_UNBOUND (priv->plugin)) {
|
||||||
_clear_plugin (self);
|
_clear_plugin (self);
|
||||||
priv->plugin = nm_dns_unbound_new ();
|
priv->plugin = nm_dns_unbound_new ();
|
||||||
plugin_changed = TRUE;
|
plugin_changed = TRUE;
|
||||||
@@ -1615,7 +1615,8 @@ config_changed_cb (NMConfig *config,
|
|||||||
* The reason is, that the configuration also depends on whether resolv.conf
|
* The reason is, that the configuration also depends on whether resolv.conf
|
||||||
* is immutable, thus, without the configuration changing, we always want to
|
* is immutable, thus, without the configuration changing, we always want to
|
||||||
* re-configure the mode. */
|
* re-configure the mode. */
|
||||||
init_resolv_conf_mode (self);
|
init_resolv_conf_mode (self,
|
||||||
|
NM_FLAGS_HAS (changes, NM_CONFIG_CHANGE_SIGHUP));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (NM_FLAGS_ANY (changes, NM_CONFIG_CHANGE_SIGHUP |
|
if (NM_FLAGS_ANY (changes, NM_CONFIG_CHANGE_SIGHUP |
|
||||||
@@ -1647,7 +1648,7 @@ nm_dns_manager_init (NMDnsManager *self)
|
|||||||
NM_CONFIG_SIGNAL_CONFIG_CHANGED,
|
NM_CONFIG_SIGNAL_CONFIG_CHANGED,
|
||||||
G_CALLBACK (config_changed_cb),
|
G_CALLBACK (config_changed_cb),
|
||||||
self);
|
self);
|
||||||
init_resolv_conf_mode (self);
|
init_resolv_conf_mode (self, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
Reference in New Issue
Block a user