From 8210a61ad5ad50315673b9b8229dab129fd11ebe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Fri, 31 May 2019 16:08:31 +0200 Subject: [PATCH 1/3] networkctl: log quietly if we fail to get bit rates If we query older networked, they will be missing. This is not an error. Also, make the error more informative, because the bus error itself might be just "Unknown interface or property" which is not enough to understand what is going on. --- src/network/networkctl.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/network/networkctl.c b/src/network/networkctl.c index 9c23672ffd..713c0cde0e 100644 --- a/src/network/networkctl.c +++ b/src/network/networkctl.c @@ -222,9 +222,11 @@ static int acquire_link_bitrates(sd_bus *bus, LinkInfo *link) { "org.freedesktop.network1.Link", "BitRates"); if (r < 0) { - if (sd_bus_error_has_name(&error, BUS_ERROR_SPEED_METER_INACTIVE)) - return 0; - return log_error_errno(r, "%s", bus_error_message(&error, r)); + bool quiet = sd_bus_error_has_name(&error, SD_BUS_ERROR_UNKNOWN_PROPERTY) || + sd_bus_error_has_name(&error, BUS_ERROR_SPEED_METER_INACTIVE); + + return log_full_errno(quiet ? LOG_DEBUG : LOG_WARNING, + r, "Failed to query link bit rates: %s", bus_error_message(&error, r)); } r = sd_bus_message_enter_container(reply, 'v', "(dd)"); From 9e5205d2f79f8ff914ca9c1b838013ef9e595f60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Fri, 31 May 2019 15:33:46 +0200 Subject: [PATCH 2/3] sd-bus: improve bus error message for uknown properties MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit "Unknown interface or property." → "Unknown interface org.freedesktop.network1.Link or property BitRates." (I don't think the quotes are necessary. Dbus names have pretty strict rules.) --- src/libsystemd/sd-bus/bus-objects.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/libsystemd/sd-bus/bus-objects.c b/src/libsystemd/sd-bus/bus-objects.c index d18c578177..ae643cacc7 100644 --- a/src/libsystemd/sd-bus/bus-objects.c +++ b/src/libsystemd/sd-bus/bus-objects.c @@ -1437,16 +1437,22 @@ int bus_process_object(sd_bus *bus, sd_bus_message *m) { return 0; if (sd_bus_message_is_method_call(m, "org.freedesktop.DBus.Properties", "Get") || - sd_bus_message_is_method_call(m, "org.freedesktop.DBus.Properties", "Set")) + sd_bus_message_is_method_call(m, "org.freedesktop.DBus.Properties", "Set")) { + const char *interface = NULL, *property = NULL; + + (void) sd_bus_message_rewind(m, true); + (void) sd_bus_message_read_basic(m, 's', &interface); + (void) sd_bus_message_read_basic(m, 's', &property); + r = sd_bus_reply_method_errorf( m, SD_BUS_ERROR_UNKNOWN_PROPERTY, - "Unknown property or interface."); - else + "Unknown interface %s or property %s.", strnull(interface), strnull(property)); + } else r = sd_bus_reply_method_errorf( m, SD_BUS_ERROR_UNKNOWN_METHOD, - "Unknown method '%s' or interface '%s'.", m->member, m->interface); + "Unknown method %s or interface %s.", m->member, m->interface); if (r < 0) return r; From 24a4e7ff9da885138300f35146ad75b4e06e79c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Fri, 31 May 2019 16:21:56 +0200 Subject: [PATCH 3/3] busctl: always prefix bus error message with local string The message we get from the bus can be pretty bare-bones, and the user might be confused which operation failed. Since we don't control the other side, let's prefix the remote message with an informative prefix. --- src/busctl/busctl.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/busctl/busctl.c b/src/busctl/busctl.c index e702f9366a..43850c6c23 100644 --- a/src/busctl/busctl.c +++ b/src/busctl/busctl.c @@ -975,7 +975,8 @@ static int introspect(int argc, char **argv, void *userdata) { r = sd_bus_call_method(bus, argv[1], argv[2], "org.freedesktop.DBus.Properties", "GetAll", &error, &reply, "s", m->interface); if (r < 0) - return log_error_errno(r, "%s", bus_error_message(&error, r)); + return log_error_errno(r, "Failed to get all properties on interface %s: %s", + m->interface, bus_error_message(&error, r)); r = sd_bus_message_enter_container(reply, 'a', "{sv}"); if (r < 0) @@ -1181,7 +1182,12 @@ static int monitor(int argc, char **argv, int (*dump)(sd_bus_message *m, FILE *f return r; /* upgrade connection; it's not used for anything else after this call */ - r = sd_bus_message_new_method_call(bus, &message, "org.freedesktop.DBus", "/org/freedesktop/DBus", "org.freedesktop.DBus.Monitoring", "BecomeMonitor"); + r = sd_bus_message_new_method_call(bus, + &message, + "org.freedesktop.DBus", + "/org/freedesktop/DBus", + "org.freedesktop.DBus.Monitoring", + "BecomeMonitor"); if (r < 0) return bus_log_create_error(r); @@ -1229,7 +1235,8 @@ static int monitor(int argc, char **argv, int (*dump)(sd_bus_message *m, FILE *f r = sd_bus_call(bus, message, arg_timeout, &error, NULL); if (r < 0) - return log_error_errno(r, "%s", bus_error_message(&error, r)); + return log_error_errno(r, "Call to org.freedesktop.DBus.Monitoring.BecomeMonitor failed: %s", + bus_error_message(&error, r)); r = sd_bus_get_unique_name(bus, &unique_name); if (r < 0) @@ -1987,7 +1994,7 @@ static int call(int argc, char **argv, void *userdata) { r = sd_bus_call(bus, m, arg_timeout, &error, &reply); if (r < 0) - return log_error_errno(r, "%s", bus_error_message(&error, r)); + return log_error_errno(r, "Call failed: %s", bus_error_message(&error, r)); r = sd_bus_message_is_empty(reply); if (r < 0) @@ -2089,7 +2096,9 @@ static int get_property(int argc, char **argv, void *userdata) { r = sd_bus_call_method(bus, argv[1], argv[2], "org.freedesktop.DBus.Properties", "Get", &error, &reply, "ss", argv[3], *i); if (r < 0) - return log_error_errno(r, "%s", bus_error_message(&error, r)); + return log_error_errno(r, "Failed to get property %s on interface %s: %s", + *i, argv[3], + bus_error_message(&error, r)); r = sd_bus_message_peek_type(reply, &type, &contents); if (r < 0) @@ -2173,7 +2182,9 @@ static int set_property(int argc, char **argv, void *userdata) { r = sd_bus_call(bus, m, arg_timeout, &error, NULL); if (r < 0) - return log_error_errno(r, "%s", bus_error_message(&error, r)); + return log_error_errno(r, "Failed to set property %s on interface %s: %s", + argv[4], argv[3], + bus_error_message(&error, r)); return 0; }