]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
resolve: Add show-multicast verb 18355/head
authorDaan De Meyer <daan.j.demeyer@gmail.com>
Sat, 23 Jan 2021 17:36:32 +0000 (17:36 +0000)
committerDaan De Meyer <daan.j.demeyer@gmail.com>
Sun, 31 Jan 2021 10:14:40 +0000 (10:14 +0000)
The show-multicast verb calls the GetMulticastHosts() D-Bus method
and displays all its results formatted into a table.

man/resolvectl.xml
src/resolve/resolvectl.c

index fb6cae7b9b6a6bd447c3afdfe02381ddbacaf6d3..c6e9f147a7a1a40e1bd2b0ab8c00e53797f4c1be 100644 (file)
         automatically, an explicit reverting is not necessary in that case.</para></listitem>
       </varlistentry>
 
+      <varlistentry>
+        <term><command>show-multicast</command></term>
+
+        <listitem><para>Display the discovered LLMNR and mDNS hostnames along with their IPv4/IPv6 addresses.
+        </para></listitem>
+      </varlistentry>
+
       <xi:include href="systemctl.xml" xpointer="log-level" />
     </variablelist>
   </refsect1>
index b479335769105d4beb125c5a16a80e3c81cce222..ced229669c057032c7d41c156b8180c4736777a9 100644 (file)
@@ -2500,6 +2500,90 @@ static int verb_log_level(int argc, char *argv[], void *userdata) {
         return 0;
 }
 
+static const char *resolve_flags_to_string(uint64_t flags) {
+        return flags & SD_RESOLVED_DNS         ? "DNS" :
+                flags & SD_RESOLVED_LLMNR_IPV4 ? "LLMNR/IPv4" :
+                flags & SD_RESOLVED_LLMNR_IPV6 ? "LLMNR/IPv6" :
+                flags & SD_RESOLVED_MDNS_IPV4  ? "mDNS/IPv4" :
+                flags & SD_RESOLVED_MDNS_IPV6  ? "mDNS/IPv6" :
+                                                 "";
+}
+
+static int verb_show_multicast(int argc, char *argv[], void *userdata) {
+        _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
+        _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
+        _cleanup_(table_unrefp) Table *table = NULL;
+        sd_bus *bus = userdata;
+        int r;
+
+        assert(bus);
+
+        table = table_new("Hostname", "Address", "Source");
+        if (!table)
+                return log_oom();
+
+        r = bus_call_method(bus, bus_resolve_mgr, "GetMulticastHosts", &error, &reply, NULL);
+        if (r < 0)
+                return log_error_errno(r, "Failed to query systemd-resolved: %s", bus_error_message(&error, r));
+
+        r = sd_bus_message_enter_container(reply, 'a', "(stiiay)");
+        if (r < 0)
+                return bus_log_parse_error(r);
+
+        while ((r = sd_bus_message_enter_container(reply, 'r', "stiiay")) > 0) {
+                char *canonical;
+                uint64_t flags;
+                _cleanup_free_ char *pretty = NULL;
+                int ifindex, family;
+                union in_addr_union a;
+
+                r = sd_bus_message_read(reply, "st", &canonical, &flags);
+                if (r < 0)
+                        return bus_log_parse_error(r);
+
+                r = sd_bus_message_read(reply, "i", &ifindex);
+                if (r < 0)
+                        return bus_log_parse_error(r);
+
+                sd_bus_error_free(&error);
+                r = bus_message_read_in_addr_auto(reply, &error, &family, &a);
+                if (r < 0)
+                        return log_error_errno(
+                                r,
+                                "systemd-resolved returned invalid result: %s",
+                                bus_error_message(&error, r));
+
+                r = sd_bus_message_exit_container(reply);
+                if (r < 0)
+                        return bus_log_parse_error(r);
+
+                r = in_addr_ifindex_to_string(family, &a, ifindex, &pretty);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to print address: %m");
+
+                r = table_add_many(
+                        table,
+                        TABLE_STRING,
+                        canonical,
+                        TABLE_STRING,
+                        pretty,
+                        TABLE_STRING,
+                        resolve_flags_to_string(flags));
+                if (r < 0)
+                        return table_log_add_error(r);
+        }
+
+        r = sd_bus_message_exit_container(reply);
+        if (r < 0)
+                return bus_log_parse_error(r);
+
+        r = table_print(table, NULL);
+        if (r < 0)
+                return table_log_print_error(r);
+
+        return 0;
+}
+
 static void help_protocol_types(void) {
         if (arg_legend)
                 puts("Known protocol types:");
@@ -2610,6 +2694,7 @@ static int native_help(void) {
                "  nta [LINK [DOMAIN...]]       Get/set per-interface DNSSEC NTA\n"
                "  revert LINK                  Revert per-interface configuration\n"
                "  log-level [LEVEL]            Get/set logging threshold for systemd-resolved\n"
+               "  show-multicast               Show domain names discovered via LLMNR/mDNS\n"
                "\nOptions:\n"
                "  -h --help                    Show this help\n"
                "     --version                 Show package version\n"
@@ -3154,7 +3239,7 @@ static int native_parse_argv(int argc, char *argv[]) {
 }
 
 static int native_main(int argc, char *argv[], sd_bus *bus) {
-
+        /* clang-format off */
         static const Verb verbs[] = {
                 { "help",                  VERB_ANY, VERB_ANY, 0,            verb_help             },
                 { "status",                VERB_ANY, VERB_ANY, VERB_DEFAULT, verb_status           },
@@ -3176,8 +3261,10 @@ static int native_main(int argc, char *argv[], sd_bus *bus) {
                 { "nta",                   VERB_ANY, VERB_ANY, 0,            verb_nta              },
                 { "revert",                VERB_ANY, 2,        0,            verb_revert_link      },
                 { "log-level",             VERB_ANY, 2,        0,            verb_log_level        },
+                { "show-multicast",        VERB_ANY, VERB_ANY, 0,            verb_show_multicast   },
                 {}
         };
+        /* clang-format on */
 
         return dispatch_verb(argc, argv, verbs, bus);
 }