[systemd-devel] [PATCH] systemctl: print unit package in status

Spencer Baugh sbaugh at catern.com
Wed Dec 17 20:00:00 PST 2014


When printing the status of a unit, open a connection to the session bus
and query PackageKit for the package that the unit file belongs
to. Print it if PackageKit knows.
---
 src/systemctl/systemctl.c | 32 ++++++++++++++++++++++++++++++++
 1 file changed, 32 insertions(+)

diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c
index 4c4648f..ea2772b 100644
--- a/src/systemctl/systemctl.c
+++ b/src/systemctl/systemctl.c
@@ -3381,6 +3381,8 @@ typedef struct UnitStatusInfo {
         const char *source_path;
         const char *control_group;
 
+        const char *package_name;
+
         char **dropin_paths;
 
         const char *load_error;
@@ -3507,6 +3509,9 @@ static void print_status_info(
                 printf("   Loaded: %s%s%s\n",
                        on, strna(i->load_state), off);
 
+        if (i->package_name)
+                printf("  Package: %s\n", i->package_name);
+
         if (!strv_isempty(i->dropin_paths)) {
                 _cleanup_free_ char *dir = NULL;
                 bool last = false;
@@ -4384,6 +4389,11 @@ static int show_one(
 
         _cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
         _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
+
+        _cleanup_bus_close_unref_ sd_bus *user_bus = NULL;
+        _cleanup_bus_message_unref_ sd_bus_message *packagekit_reply = NULL;
+
+        const char *file_path;
         UnitStatusInfo info = {};
         ExecStatusInfo *p;
         int r;
@@ -4453,6 +4463,28 @@ static int show_one(
         if (r < 0)
                 return bus_log_parse_error(r);
 
+        file_path = info.source_path ? info.source_path : info.fragment_path;
+        if (file_path) {
+                /* we frequently can't get the user bus, nor call PackageKit, so don't complain on error */
+                sd_bus_default_user(&user_bus);
+                if (user_bus) {
+                        sd_bus_call_method(
+                                user_bus,
+                                "org.freedesktop.PackageKit",
+                                "/org/freedesktop/PackageKit",
+                                "org.freedesktop.PackageKit.Query",
+                                "SearchFile",
+                                NULL,
+                                &packagekit_reply,
+                                "ss", file_path, "0");
+                        if (packagekit_reply) {
+                                r = sd_bus_message_read(packagekit_reply, "bs", NULL, &info.package_name);
+                                if (r < 0)
+                                        return bus_log_parse_error(r);
+                        }
+                }
+        }
+
         r = 0;
 
         if (!show_properties) {
-- 
2.1.3



More information about the systemd-devel mailing list