From: Ronan Pigott Date: Wed, 3 Apr 2024 20:16:05 +0000 (-0700) Subject: network: add dnr resolvers to networkctl status json output X-Git-Tag: v257-rc1~171^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7823f8a784c0aacfee431bbb2bf8348d7beefcc8;p=thirdparty%2Fsystemd.git network: add dnr resolvers to networkctl status json output --- diff --git a/src/libsystemd-network/sd-dhcp6-lease.c b/src/libsystemd-network/sd-dhcp6-lease.c index 22707b771d5..2729984e308 100644 --- a/src/libsystemd-network/sd-dhcp6-lease.c +++ b/src/libsystemd-network/sd-dhcp6-lease.c @@ -491,7 +491,7 @@ static int dhcp6_lease_add_dnr(sd_dhcp6_lease *lease, const uint8_t *optval, siz res.addrs = new(union in_addr_union, n_addrs); if (!res.addrs) - return -ENOMEM + return -ENOMEM; for (size_t i = 0; i < n_addrs; i++) { union in_addr_union addr = {.in6 = addrs[i]}; diff --git a/src/network/networkd-json.c b/src/network/networkd-json.c index 4eafc62c7e4..24f3378d575 100644 --- a/src/network/networkd-json.c +++ b/src/network/networkd-json.c @@ -503,6 +503,117 @@ static int dns_append_json(Link *link, sd_json_variant **v) { return json_variant_set_field_non_null(v, "DNS", array); } +static int dnr_append_json_one(Link *link, const struct sd_dns_resolver *res, NetworkConfigSource s, const union in_addr_union *p, sd_json_variant **array) { + _cleanup_(sd_json_variant_unrefp) sd_json_variant *addrs_array = NULL; + _cleanup_strv_free_ char **transports = NULL; + int r; + + assert(link); + assert(res); + assert(array); + + FOREACH_ARRAY(addr, res->addrs, res->n_addrs) { + r = sd_json_variant_append_arrayb( + &addrs_array, + JSON_BUILD_IN_ADDR(addr, res->family)); + if (r < 0) + return r; + } + + r = dns_resolver_transports_to_strv(res->transports, &transports); + if (r < 0) + return r; + + //FIXME ifindex? + return sd_json_variant_append_arrayb( + array, + SD_JSON_BUILD_OBJECT( + SD_JSON_BUILD_PAIR_INTEGER("Family", res->family), + SD_JSON_BUILD_PAIR_INTEGER("Priority", res->priority), + JSON_BUILD_PAIR_VARIANT_NON_NULL("Addresses", addrs_array), + JSON_BUILD_PAIR_UNSIGNED_NON_ZERO("Port", res->port), + JSON_BUILD_PAIR_STRING_NON_EMPTY("ServerName", res->auth_name), + JSON_BUILD_PAIR_STRING_NON_EMPTY("DoHPath", res->dohpath), + JSON_BUILD_PAIR_STRV_NON_EMPTY("Transports", transports), + SD_JSON_BUILD_PAIR_STRING("ConfigSource", network_config_source_to_string(s)), + JSON_BUILD_PAIR_IN_ADDR_NON_NULL("ConfigProvider", p, res->family))); +} + +static int dnr_append_json(Link *link, sd_json_variant **v) { + _cleanup_(sd_json_variant_unrefp) sd_json_variant *array = NULL; + int r; + + assert(link); + assert(v); + + if (!link->network) + return 0; + + if (link->dhcp_lease && link_get_use_dnr(link, NETWORK_CONFIG_SOURCE_DHCP4)) { + struct sd_dns_resolver *dnr; + union in_addr_union s; + int n_dnr; + + r = sd_dhcp_lease_get_server_identifier(link->dhcp_lease, &s.in); + if (r < 0) + return r; + + n_dnr = sd_dhcp_lease_get_dnr(link->dhcp_lease, &dnr); + if (n_dnr < 0) + return 0; + + FOREACH_ARRAY(res, dnr, n_dnr) { + r = dnr_append_json_one(link, + res, + NETWORK_CONFIG_SOURCE_DHCP4, + &s, + &array); + if (r < 0) + return r; + } + } + + if (link->dhcp6_lease && link_get_use_dnr(link, NETWORK_CONFIG_SOURCE_DHCP6)) { + struct sd_dns_resolver *dnr; + union in_addr_union s; + int n_dnr; + + r = sd_dhcp6_lease_get_server_address(link->dhcp6_lease, &s.in6); + if (r < 0) + return r; + + n_dnr = sd_dhcp6_lease_get_dnr(link->dhcp6_lease, &dnr); + if (n_dnr < 0) + return 0; + + FOREACH_ARRAY(res, dnr, n_dnr) { + r = dnr_append_json_one(link, + res, + NETWORK_CONFIG_SOURCE_DHCP6, + &s, + &array); + if (r < 0) + return r; + } + } + + if (link_get_use_dnr(link, NETWORK_CONFIG_SOURCE_NDISC)) { + NDiscDNR *a; + + SET_FOREACH(a, link->ndisc_dnr) { + r = dnr_append_json_one(link, + &a->resolver, + NETWORK_CONFIG_SOURCE_NDISC, + &(union in_addr_union) { .in6 = a->router }, + &array); + if (r < 0) + return r; + } + } + + return json_variant_set_field_non_null(v, "DNR", array); +} + static int server_append_json_one_addr(int family, const union in_addr_union *a, NetworkConfigSource s, const union in_addr_union *p, sd_json_variant **array) { assert(IN_SET(family, AF_INET, AF_INET6)); assert(a); @@ -1268,6 +1379,10 @@ int link_build_json(Link *link, sd_json_variant **ret) { if (r < 0) return r; + r = dnr_append_json(link, &v); + if (r < 0) + return r; + r = ntp_append_json(link, &v); if (r < 0) return r; diff --git a/src/shared/dns-resolver-internal.h b/src/shared/dns-resolver-internal.h index 08ef782408a..e5c185c2e07 100644 --- a/src/shared/dns-resolver-internal.h +++ b/src/shared/dns-resolver-internal.h @@ -43,6 +43,8 @@ struct sd_dns_resolver { void siphash24_compress_resolver(const sd_dns_resolver *res, struct siphash *state); +int dns_resolver_transports_to_strv(sd_dns_alpn_flags transports, char ***ret); + int dns_resolvers_to_dot_addrs(const sd_dns_resolver *resolvers, size_t n_resolvers, struct in_addr_full ***ret_addrs, size_t *ret_n_addrs); diff --git a/src/shared/sd-dns-resolver.c b/src/shared/sd-dns-resolver.c index 4c76df18d1f..548672cd331 100644 --- a/src/shared/sd-dns-resolver.c +++ b/src/shared/sd-dns-resolver.c @@ -174,6 +174,32 @@ const char* format_dns_svc_param_key(uint16_t i, char buf[static DECIMAL_STR_MAX return snprintf_ok(buf, DECIMAL_STR_MAX(uint16_t)+3, "key%i", i); } +int dns_resolver_transports_to_strv(sd_dns_alpn_flags transports, char ***ret) { + _cleanup_strv_free_ char **ans = NULL; + + assert(ret); + + if (FLAGS_SET(transports, SD_DNS_ALPN_DO53)) { + /* Do53 has no ALPN, this flag is only for our own usage. */ + } + + if (FLAGS_SET(transports, SD_DNS_ALPN_HTTP_2_TLS)) + if (strv_extend(&ans, "h2") < 0) + return -ENOMEM; + if (FLAGS_SET(transports, SD_DNS_ALPN_HTTP_3)) + if (strv_extend(&ans, "h3") < 0) + return -ENOMEM; + if (FLAGS_SET(transports, SD_DNS_ALPN_DOT)) + if (strv_extend(&ans, "dot") < 0) + return -ENOMEM; + if (FLAGS_SET(transports, SD_DNS_ALPN_DOQ)) + if (strv_extend(&ans, "doq") < 0) + return -ENOMEM; + + *ret = TAKE_PTR(ans); + return 0; +} + int dnr_parse_svc_params(const uint8_t *option, size_t len, sd_dns_resolver *resolver) { size_t offset = 0; int r;