Lubomir Rintel 2023-01-26 09:02:31 +01:00
commit b76ebc3bfc
7 changed files with 63 additions and 29 deletions

View file

@ -4497,7 +4497,9 @@ EXTRA_DIST += \
src/core/tests/config/NetworkManager-warn.conf \
src/core/tests/config/NetworkManager.state \
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-options.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/20-config-enable-1.conf \

View file

@ -1201,7 +1201,8 @@ compute_hash(NMDnsManager *self, const NMGlobalDnsConfig *global, guint8 buffer[
if (global)
nm_global_dns_config_update_checksum(global, sum);
else {
if (!global || !nm_global_dns_config_lookup_domain(global, "*")) {
const CList *head;
/* 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, "*");
nm_assert(default_domain);
if (!default_domain)
return TRUE;
servers = nm_global_dns_domain_get_servers(default_domain);
if (servers) {
for (i = 0; servers[i]; i++)
add_string_item(rc->nameservers, servers[i], TRUE);
}
if (!servers)
return TRUE;
for (i = 0; servers[i]; i++)
add_string_item(rc->nameservers, servers[i], TRUE);
return TRUE;
}
@ -1313,7 +1316,8 @@ _collect_resolv_conf_data(NMDnsManager *self,
if (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);
int first_prio = 0;
const NMDnsConfigIPData *ip_data;
@ -2556,14 +2560,12 @@ config_changed_cb(NMConfig *config,
}
}
static GVariant *
_get_global_config_variant(NMGlobalDnsConfig *global)
static void
_get_global_config_variant(GVariantBuilder *builder, NMGlobalDnsConfig *global)
{
NMGlobalDnsDomain *domain;
GVariantBuilder builder;
guint i, num;
g_variant_builder_init(&builder, G_VARIANT_TYPE("aa{sv}"));
num = nm_global_dns_config_get_num_domains(global);
for (i = 0; i < num; i++) {
GVariantBuilder conf_builder;
@ -2599,10 +2601,8 @@ _get_global_config_variant(NMGlobalDnsConfig *global)
"priority",
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 *
@ -2619,15 +2619,12 @@ _get_config_variant(NMDnsManager *self)
if (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}"));
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);
c_list_for_each_entry (ip_data, head, ip_data_lst) {
GVariantBuilder entry_builder;

View file

@ -1125,10 +1125,13 @@ load_global_dns(GKeyFile *keyfile, gboolean internal)
gboolean default_found = FALSE;
char **strv;
group =
internal ? NM_CONFIG_KEYFILE_GROUP_INTERN_GLOBAL_DNS : NM_CONFIG_KEYFILE_GROUP_GLOBAL_DNS;
domain_prefix = internal ? NM_CONFIG_KEYFILE_GROUPPREFIX_INTERN_GLOBAL_DNS_DOMAIN
: NM_CONFIG_KEYFILE_GROUPPREFIX_GLOBAL_DNS_DOMAIN;
if (internal) {
group = NM_CONFIG_KEYFILE_GROUP_INTERN_GLOBAL_DNS;
domain_prefix = NM_CONFIG_KEYFILE_GROUPPREFIX_INTERN_GLOBAL_DNS_DOMAIN;
} else {
group = NM_CONFIG_KEYFILE_GROUP_GLOBAL_DNS;
domain_prefix = NM_CONFIG_KEYFILE_GROUPPREFIX_GLOBAL_DNS_DOMAIN;
}
domain_prefix_len = strlen(domain_prefix);
if (!nm_config_keyfile_has_global_dns_config(keyfile, internal))
@ -1230,7 +1233,7 @@ load_global_dns(GKeyFile *keyfile, gboolean internal)
default_found = TRUE;
}
if (!default_found) {
if (!default_found && g_hash_table_size(dns_config->domains)) {
nm_log_dbg(LOGD_CORE,
"%s global DNS configuration is missing default domain, ignore it",
internal ? "internal" : "user");

View file

@ -1509,8 +1509,8 @@ nm_config_keyfile_has_global_dns_config(GKeyFile *keyfile, gboolean internal)
if (!keyfile)
return FALSE;
if (g_key_file_has_group(keyfile,
internal ? NM_CONFIG_KEYFILE_GROUP_GLOBAL_DNS
: NM_CONFIG_KEYFILE_GROUP_INTERN_GLOBAL_DNS))
internal ? NM_CONFIG_KEYFILE_GROUP_INTERN_GLOBAL_DNS
: NM_CONFIG_KEYFILE_GROUP_GLOBAL_DNS))
return TRUE;
groups = g_key_file_get_groups(keyfile, NULL);

View 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

View file

@ -0,0 +1,5 @@
# Good configuration, since there is no domain section
[global-dns]
searches=foo.com
options=timeout:5

View file

@ -370,7 +370,21 @@ test_config_global_dns(void)
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 =
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));