From 306375c36804c5c85cd9b77b353f40edf116521d Mon Sep 17 00:00:00 2001 From: Nick Rosbrook Date: Fri, 10 Oct 2025 15:56:34 -0400 Subject: [PATCH] resolve: add DNS scope info to DNSConfiguration This is one of several commits to expand the DNSConfiguration varlink type to include the necessary information for resolvectl status output. --- src/resolve/resolved-manager.c | 75 ++++++++++++++++++- .../varlink-io.systemd.Resolve.Monitor.c | 21 +++++- 2 files changed, 93 insertions(+), 3 deletions(-) diff --git a/src/resolve/resolved-manager.c b/src/resolve/resolved-manager.c index f6147b595c8..36c78eaf048 100644 --- a/src/resolve/resolved-manager.c +++ b/src/resolve/resolved-manager.c @@ -2049,11 +2049,14 @@ static int dns_configuration_json_append( DnsServer *dns_servers, DnsSearchDomain *search_domains, Set *negative_trust_anchors, + Set *dns_scopes, sd_json_variant **configuration) { _cleanup_(sd_json_variant_unrefp) sd_json_variant *dns_servers_json = NULL, *search_domains_json = NULL, - *current_dns_server_json = NULL; + *current_dns_server_json = NULL, + *scopes_json = NULL; + DnsScope *scope; int r; assert(configuration); @@ -2076,6 +2079,23 @@ static int dns_configuration_json_append( return r; } + SET_FOREACH(scope, dns_scopes) { + _cleanup_(sd_json_variant_unrefp) sd_json_variant *v = NULL; + + r = dns_scope_dump_cache_to_json(scope, &v); + if (r < 0) + return r; + + /* The cache is not relevant to the configuration of the scope. */ + r = sd_json_variant_filter(&v, STRV_MAKE("cache")); + if (r < 0) + return r; + + r = sd_json_variant_append_array(&scopes_json, v); + if (r < 0) + return r; + } + LIST_FOREACH(servers, s, dns_servers) { _cleanup_(sd_json_variant_unrefp) sd_json_variant *v = NULL; @@ -2117,13 +2137,21 @@ static int dns_configuration_json_append( JSON_BUILD_PAIR_VARIANT_NON_NULL("searchDomains", search_domains_json), SD_JSON_BUILD_PAIR_CONDITION(!set_isempty(negative_trust_anchors), "negativeTrustAnchors", - JSON_BUILD_STRING_SET(negative_trust_anchors))); + JSON_BUILD_STRING_SET(negative_trust_anchors)), + JSON_BUILD_PAIR_VARIANT_NON_NULL("scopes", scopes_json)); } static int global_dns_configuration_json_append(Manager *m, sd_json_variant **configuration) { + _cleanup_set_free_ Set *scopes = NULL; + int r; + assert(m); assert(configuration); + r = set_ensure_put(&scopes, NULL, m->unicast_scope); + if (r < 0) + return r; + return dns_configuration_json_append( /* ifname = */ NULL, /* ifindex = */ 0, @@ -2133,13 +2161,47 @@ static int global_dns_configuration_json_append(Manager *m, sd_json_variant **co m->dns_servers, m->search_domains, m->trust_anchor.negative_by_name, + scopes, configuration); } static int link_dns_configuration_json_append(Link *l, sd_json_variant **configuration) { + _cleanup_set_free_ Set *scopes = NULL; + int r; + assert(l); assert(configuration); + if (l->unicast_scope) { + r = set_ensure_put(&scopes, NULL, l->unicast_scope); + if (r < 0) + return r; + } + + if (l->llmnr_ipv4_scope) { + r = set_ensure_put(&scopes, NULL, l->llmnr_ipv4_scope); + if (r < 0) + return r; + } + + if (l->llmnr_ipv6_scope) { + r = set_ensure_put(&scopes, NULL, l->llmnr_ipv6_scope); + if (r < 0) + return r; + } + + if (l->mdns_ipv4_scope) { + r = set_ensure_put(&scopes, NULL, l->mdns_ipv4_scope); + if (r < 0) + return r; + } + + if (l->mdns_ipv6_scope) { + r = set_ensure_put(&scopes, NULL, l->mdns_ipv6_scope); + if (r < 0) + return r; + } + return dns_configuration_json_append( l->ifname, l->ifindex, @@ -2149,13 +2211,21 @@ static int link_dns_configuration_json_append(Link *l, sd_json_variant **configu l->dns_servers, l->search_domains, l->dnssec_negative_trust_anchors, + scopes, configuration); } static int delegate_dns_configuration_json_append(DnsDelegate *d, sd_json_variant **configuration) { + _cleanup_set_free_ Set *scopes = NULL; + int r; + assert(d); assert(configuration); + r = set_ensure_put(&scopes, NULL, d->scope); + if (r < 0) + return r; + return dns_configuration_json_append( /* ifname = */ NULL, /* ifindex = */ 0, @@ -2165,6 +2235,7 @@ static int delegate_dns_configuration_json_append(DnsDelegate *d, sd_json_varian d->dns_servers, d->search_domains, /* negative_trust_anchors = */ NULL, + scopes, configuration); } diff --git a/src/shared/varlink-io.systemd.Resolve.Monitor.c b/src/shared/varlink-io.systemd.Resolve.Monitor.c index bbca42a9e75..df76510cf65 100644 --- a/src/shared/varlink-io.systemd.Resolve.Monitor.c +++ b/src/shared/varlink-io.systemd.Resolve.Monitor.c @@ -138,6 +138,21 @@ static SD_VARLINK_DEFINE_STRUCT_TYPE( SD_VARLINK_FIELD_COMMENT("Interface index for which this search domain is configured."), SD_VARLINK_DEFINE_FIELD(ifindex, SD_VARLINK_INT, SD_VARLINK_NULLABLE)); +static SD_VARLINK_DEFINE_STRUCT_TYPE( + DNSScope, + SD_VARLINK_FIELD_COMMENT("Protocol associated with this scope."), + SD_VARLINK_DEFINE_FIELD(protocol, SD_VARLINK_STRING, 0), + SD_VARLINK_FIELD_COMMENT("Address family associated with this scope."), + SD_VARLINK_DEFINE_FIELD(family, SD_VARLINK_INT, SD_VARLINK_NULLABLE), + SD_VARLINK_FIELD_COMMENT("Interface index associated with this scope."), + SD_VARLINK_DEFINE_FIELD(ifindex, SD_VARLINK_INT, SD_VARLINK_NULLABLE), + SD_VARLINK_FIELD_COMMENT("Interface name associated with this scope."), + SD_VARLINK_DEFINE_FIELD(ifname, SD_VARLINK_STRING, SD_VARLINK_NULLABLE), + SD_VARLINK_FIELD_COMMENT("DNSSEC mode associated with this scope."), + SD_VARLINK_DEFINE_FIELD(dnssec, SD_VARLINK_STRING, SD_VARLINK_NULLABLE), + SD_VARLINK_FIELD_COMMENT("DNSOverTLS mode associated with this scope."), + SD_VARLINK_DEFINE_FIELD(dnsOverTLS, SD_VARLINK_STRING, SD_VARLINK_NULLABLE)); + static SD_VARLINK_DEFINE_STRUCT_TYPE( DNSConfiguration, SD_VARLINK_FIELD_COMMENT("Interface name, if any, associated with this configuration. Empty for global configuration."), @@ -155,7 +170,9 @@ static SD_VARLINK_DEFINE_STRUCT_TYPE( SD_VARLINK_FIELD_COMMENT("Array of configured search domains."), SD_VARLINK_DEFINE_FIELD_BY_TYPE(searchDomains, SearchDomain, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE), SD_VARLINK_FIELD_COMMENT("Array of configured DNSSEC negative trust anchors."), - SD_VARLINK_DEFINE_FIELD(negativeTrustAnchors, SD_VARLINK_STRING, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE)); + SD_VARLINK_DEFINE_FIELD(negativeTrustAnchors, SD_VARLINK_STRING, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE), + SD_VARLINK_FIELD_COMMENT("Array of current DNS scopes."), + SD_VARLINK_DEFINE_FIELD_BY_TYPE(scopes, DNSScope, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE)); static SD_VARLINK_DEFINE_METHOD_FULL( SubscribeDNSConfiguration, @@ -188,5 +205,7 @@ SD_VARLINK_DEFINE_INTERFACE( &vl_type_SearchDomain, SD_VARLINK_SYMBOL_COMMENT("Encapsulates a global or per-link DNS configuration, including configured DNS servers, search domains, and more."), &vl_type_DNSConfiguration, + SD_VARLINK_SYMBOL_COMMENT("Encapsulates a DNS scope specification."), + &vl_type_DNSScope, SD_VARLINK_SYMBOL_COMMENT("Sends the complete global and per-link DNS configurations when any changes are made to them. The current configurations are given immediately when this method is invoked."), &vl_method_SubscribeDNSConfiguration); -- 2.47.3