dns-manager: always apply options from [global-dns]
Currently, the use of [global-dns] section for setting DNS options is conditioned on presence of a nameserver in a [global-dns-domain-*] section. Attempt to use the section for options alone results in an error: [global-dns] options=timeout:1 Or via D-Bus API: # busctl set-property org.freedesktop.NetworkManager \ /org/freedesktop/NetworkManager org.freedesktop.NetworkManager \ GlobalDnsConfiguration 'a{sv}' 2 \ "options" as 1 "timeout:1" \ "domains" a{sv} 0 ... Nov 24 13:15:21 zmok.local NetworkManager[501184]: <debug> [1669292121.3904] manager: set global DNS failed with error: Global DNS configuration is missing the default domain The insistence on existence of [global-dns-domain-*] would make sense if other [global-dns-domain-...] sections were present. However, the user might only want to set the options in resolv.conf and still use connection-provide nameservers for the actual resolving. Lift the limitation by allowing the [global-dns] to be used alone, while still insist on [global-dns-domain-*] being there in presence of other domain-specific options. https://bugzilla.redhat.com/show_bug.cgi?id=2019306
This commit is contained in:
@@ -4497,7 +4497,9 @@ EXTRA_DIST += \
|
|||||||
src/core/tests/config/NetworkManager-warn.conf \
|
src/core/tests/config/NetworkManager-warn.conf \
|
||||||
src/core/tests/config/NetworkManager.state \
|
src/core/tests/config/NetworkManager.state \
|
||||||
src/core/tests/config/bad.conf \
|
src/core/tests/config/bad.conf \
|
||||||
|
src/core/tests/config/global-dns-good.conf \
|
||||||
src/core/tests/config/global-dns-invalid.conf \
|
src/core/tests/config/global-dns-invalid.conf \
|
||||||
|
src/core/tests/config/global-dns-options.conf \
|
||||||
src/core/tests/config/conf.d/00-overrides.conf \
|
src/core/tests/config/conf.d/00-overrides.conf \
|
||||||
src/core/tests/config/conf.d/10-more.conf \
|
src/core/tests/config/conf.d/10-more.conf \
|
||||||
src/core/tests/config/conf.d/20-config-enable-1.conf \
|
src/core/tests/config/conf.d/20-config-enable-1.conf \
|
||||||
|
@@ -1201,7 +1201,8 @@ compute_hash(NMDnsManager *self, const NMGlobalDnsConfig *global, guint8 buffer[
|
|||||||
|
|
||||||
if (global)
|
if (global)
|
||||||
nm_global_dns_config_update_checksum(global, sum);
|
nm_global_dns_config_update_checksum(global, sum);
|
||||||
else {
|
|
||||||
|
if (!global || !nm_global_dns_config_lookup_domain(global, "*")) {
|
||||||
const CList *head;
|
const CList *head;
|
||||||
|
|
||||||
/* FIXME(ip-config-checksum): this relies on the fact that an IP
|
/* FIXME(ip-config-checksum): this relies on the fact that an IP
|
||||||
@@ -1244,13 +1245,15 @@ merge_global_dns_config(NMResolvConfData *rc, NMGlobalDnsConfig *global_conf)
|
|||||||
}
|
}
|
||||||
|
|
||||||
default_domain = nm_global_dns_config_lookup_domain(global_conf, "*");
|
default_domain = nm_global_dns_config_lookup_domain(global_conf, "*");
|
||||||
nm_assert(default_domain);
|
if (!default_domain)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
servers = nm_global_dns_domain_get_servers(default_domain);
|
servers = nm_global_dns_domain_get_servers(default_domain);
|
||||||
if (servers) {
|
if (!servers)
|
||||||
for (i = 0; servers[i]; i++)
|
return TRUE;
|
||||||
add_string_item(rc->nameservers, servers[i], TRUE);
|
|
||||||
}
|
for (i = 0; servers[i]; i++)
|
||||||
|
add_string_item(rc->nameservers, servers[i], TRUE);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@@ -1311,9 +1314,10 @@ _collect_resolv_conf_data(NMDnsManager *self,
|
|||||||
|
|
||||||
priv = NM_DNS_MANAGER_GET_PRIVATE(self);
|
priv = NM_DNS_MANAGER_GET_PRIVATE(self);
|
||||||
|
|
||||||
if (global_config) {
|
if (global_config)
|
||||||
merge_global_dns_config(&rc, global_config);
|
merge_global_dns_config(&rc, global_config);
|
||||||
} else {
|
|
||||||
|
if (!global_config || !nm_global_dns_config_lookup_domain(global_config, "*")) {
|
||||||
nm_auto_str_buf NMStrBuf tmp_strbuf = NM_STR_BUF_INIT(0, FALSE);
|
nm_auto_str_buf NMStrBuf tmp_strbuf = NM_STR_BUF_INIT(0, FALSE);
|
||||||
int first_prio = 0;
|
int first_prio = 0;
|
||||||
const NMDnsConfigIPData *ip_data;
|
const NMDnsConfigIPData *ip_data;
|
||||||
@@ -2556,14 +2560,12 @@ config_changed_cb(NMConfig *config,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static GVariant *
|
static void
|
||||||
_get_global_config_variant(NMGlobalDnsConfig *global)
|
_get_global_config_variant(GVariantBuilder *builder, NMGlobalDnsConfig *global)
|
||||||
{
|
{
|
||||||
NMGlobalDnsDomain *domain;
|
NMGlobalDnsDomain *domain;
|
||||||
GVariantBuilder builder;
|
|
||||||
guint i, num;
|
guint i, num;
|
||||||
|
|
||||||
g_variant_builder_init(&builder, G_VARIANT_TYPE("aa{sv}"));
|
|
||||||
num = nm_global_dns_config_get_num_domains(global);
|
num = nm_global_dns_config_get_num_domains(global);
|
||||||
for (i = 0; i < num; i++) {
|
for (i = 0; i < num; i++) {
|
||||||
GVariantBuilder conf_builder;
|
GVariantBuilder conf_builder;
|
||||||
@@ -2599,10 +2601,8 @@ _get_global_config_variant(NMGlobalDnsConfig *global)
|
|||||||
"priority",
|
"priority",
|
||||||
g_variant_new_int32(NM_DNS_PRIORITY_DEFAULT_NORMAL));
|
g_variant_new_int32(NM_DNS_PRIORITY_DEFAULT_NORMAL));
|
||||||
|
|
||||||
g_variant_builder_add(&builder, "a{sv}", &conf_builder);
|
g_variant_builder_add(builder, "a{sv}", &conf_builder);
|
||||||
}
|
}
|
||||||
|
|
||||||
return g_variant_ref_sink(g_variant_builder_end(&builder));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static GVariant *
|
static GVariant *
|
||||||
@@ -2619,15 +2619,12 @@ _get_config_variant(NMDnsManager *self)
|
|||||||
if (priv->config_variant)
|
if (priv->config_variant)
|
||||||
return priv->config_variant;
|
return priv->config_variant;
|
||||||
|
|
||||||
global_config = nm_config_data_get_global_dns_config(nm_config_get_data(priv->config));
|
|
||||||
if (global_config) {
|
|
||||||
priv->config_variant = _get_global_config_variant(global_config);
|
|
||||||
_LOGT("current configuration: %s", (str = g_variant_print(priv->config_variant, TRUE)));
|
|
||||||
return priv->config_variant;
|
|
||||||
}
|
|
||||||
|
|
||||||
g_variant_builder_init(&builder, G_VARIANT_TYPE("aa{sv}"));
|
g_variant_builder_init(&builder, G_VARIANT_TYPE("aa{sv}"));
|
||||||
|
|
||||||
|
global_config = nm_config_data_get_global_dns_config(nm_config_get_data(priv->config));
|
||||||
|
if (global_config)
|
||||||
|
_get_global_config_variant(&builder, global_config);
|
||||||
|
|
||||||
head = _mgr_get_ip_data_lst_head(self);
|
head = _mgr_get_ip_data_lst_head(self);
|
||||||
c_list_for_each_entry (ip_data, head, ip_data_lst) {
|
c_list_for_each_entry (ip_data, head, ip_data_lst) {
|
||||||
GVariantBuilder entry_builder;
|
GVariantBuilder entry_builder;
|
||||||
|
@@ -1233,7 +1233,7 @@ load_global_dns(GKeyFile *keyfile, gboolean internal)
|
|||||||
default_found = TRUE;
|
default_found = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!default_found) {
|
if (!default_found && g_hash_table_size(dns_config->domains)) {
|
||||||
nm_log_dbg(LOGD_CORE,
|
nm_log_dbg(LOGD_CORE,
|
||||||
"%s global DNS configuration is missing default domain, ignore it",
|
"%s global DNS configuration is missing default domain, ignore it",
|
||||||
internal ? "internal" : "user");
|
internal ? "internal" : "user");
|
||||||
|
13
src/core/tests/config/global-dns-good.conf
Normal file
13
src/core/tests/config/global-dns-good.conf
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
# Good configuration, since there is a default domain section
|
||||||
|
|
||||||
|
[global-dns]
|
||||||
|
searches=foo.com
|
||||||
|
options=timeout:5
|
||||||
|
|
||||||
|
[global-dns-domain-*]
|
||||||
|
servers=4.5.6.7
|
||||||
|
options=myoption1
|
||||||
|
|
||||||
|
[global-dns-domain-test.com]
|
||||||
|
servers=1.2.3.4
|
||||||
|
options=myoption2
|
5
src/core/tests/config/global-dns-options.conf
Normal file
5
src/core/tests/config/global-dns-options.conf
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
# Good configuration, since there is no domain section
|
||||||
|
|
||||||
|
[global-dns]
|
||||||
|
searches=foo.com
|
||||||
|
options=timeout:5
|
@@ -370,7 +370,21 @@ test_config_global_dns(void)
|
|||||||
|
|
||||||
g_object_unref(config);
|
g_object_unref(config);
|
||||||
|
|
||||||
/* Check that a file without a default domain section gives a NULL configuration */
|
/* Check that a file with a default domain section gives a good configuration */
|
||||||
|
config =
|
||||||
|
setup_config(NULL, TEST_DIR "/global-dns-good.conf", "", NULL, "/no/such/dir", "", NULL);
|
||||||
|
dns = nm_config_data_get_global_dns_config(nm_config_get_data_orig(config));
|
||||||
|
g_assert(dns);
|
||||||
|
g_object_unref(config);
|
||||||
|
|
||||||
|
/* Check that a file with options but no domains gives a good configuration */
|
||||||
|
config =
|
||||||
|
setup_config(NULL, TEST_DIR "/global-dns-options.conf", "", NULL, "/no/such/dir", "", NULL);
|
||||||
|
dns = nm_config_data_get_global_dns_config(nm_config_get_data_orig(config));
|
||||||
|
g_assert(dns);
|
||||||
|
g_object_unref(config);
|
||||||
|
|
||||||
|
/* Check that a file with a domain domain, but without a default one gives a NULL configuration */
|
||||||
config =
|
config =
|
||||||
setup_config(NULL, TEST_DIR "/global-dns-invalid.conf", "", NULL, "/no/such/dir", "", NULL);
|
setup_config(NULL, TEST_DIR "/global-dns-invalid.conf", "", NULL, "/no/such/dir", "", NULL);
|
||||||
dns = nm_config_data_get_global_dns_config(nm_config_get_data_orig(config));
|
dns = nm_config_data_get_global_dns_config(nm_config_get_data_orig(config));
|
||||||
|
Reference in New Issue
Block a user