]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
dissect: beef up dissection output
authorLennart Poettering <lennart@poettering.net>
Wed, 29 Jul 2020 13:15:07 +0000 (15:15 +0200)
committerLennart Poettering <lennart@poettering.net>
Tue, 11 Aug 2020 20:26:48 +0000 (22:26 +0200)
Let's use a proper table for outputting partition information. Let's
also put the general information about the image first, and the table
after that.

Moreover, dissect the image before showing any output, so that we can
early on return an error if the image is not valid.

src/dissect/dissect.c

index f44c8b37839330e189f1d5af89c9dab79e54aba2..c9f16d7a64b3d743a279b8d05699fc56689a14a5 100644 (file)
@@ -11,6 +11,7 @@
 #include "copy.h"
 #include "dissect-image.h"
 #include "fd-util.h"
+#include "format-table.h"
 #include "format-util.h"
 #include "fs-util.h"
 #include "hexdecoct.h"
@@ -364,53 +365,26 @@ static int run(int argc, char *argv[]) {
         switch (arg_action) {
 
         case ACTION_DISSECT: {
+                _cleanup_(table_unrefp) Table *t = NULL;
                 uint64_t size;
-                unsigned i;
 
-                for (i = 0; i < _PARTITION_DESIGNATOR_MAX; i++) {
-                        DissectedPartition *p = m->partitions + i;
-
-                        if (!p->found)
-                                continue;
-
-                        printf("Found %s '%s' partition",
-                               p->rw ? "writable" : "read-only",
-                               partition_designator_to_string(i));
-
-                        if (!sd_id128_is_null(p->uuid))
-                                printf(" (UUID " SD_ID128_FORMAT_STR ")", SD_ID128_FORMAT_VAL(p->uuid));
-
-                        if (p->fstype)
-                                printf(" of type %s", p->fstype);
-
-                        if (p->architecture != _ARCHITECTURE_INVALID)
-                                printf(" for %s", architecture_to_string(p->architecture));
-
-                        if (dissected_image_can_do_verity(m, i))
-                                printf(" %s verity", dissected_image_has_verity(m, i) ? "with" : "without");
-
-                        if (p->partno >= 0)
-                                printf(" on partition #%i", p->partno);
-
-                        if (p->node)
-                                printf(" (%s)", p->node);
-
-                        putchar('\n');
-                }
+                r = dissected_image_acquire_metadata(m);
+                if (r == -EMEDIUMTYPE)
+                        return log_error_errno(r, "Not a valid OS image, no os-release file included.");
+                if (r == -ENXIO)
+                        return log_error_errno(r, "No root partition discovered.");
+                if (r < 0)
+                        return log_error_errno(r, "Failed to acquire image metadata: %m");
 
                 printf("      Name: %s\n", basename(arg_image));
 
                 if (ioctl(d->fd, BLKGETSIZE64, &size) < 0)
                         log_debug_errno(errno, "Failed to query size of loopback device: %m");
                 else {
-                        char t[FORMAT_BYTES_MAX];
-                        printf("      Size: %s\n", format_bytes(t, sizeof(t), size));
+                        char s[FORMAT_BYTES_MAX];
+                        printf("      Size: %s\n", format_bytes(s, sizeof(s), size));
                 }
 
-                r = dissected_image_acquire_metadata(m);
-                if (r < 0)
-                        return log_error_errno(r, "Failed to acquire image metadata: %m");
-
                 if (m->hostname)
                         printf("  Hostname: %s\n", m->hostname);
 
@@ -435,6 +409,73 @@ static int run(int argc, char *argv[]) {
                                        *p, *q);
                 }
 
+                putc('\n', stdout);
+
+                t = table_new("rw", "designator", "partition uuid", "fstype", "architecture", "verity", "node", "partno");
+                if (!t)
+                        return log_oom();
+
+                (void) table_set_empty_string(t, "-");
+                (void) table_set_align_percent(t, table_get_cell(t, 0, 7), 100);
+
+                for (unsigned i = 0; i < _PARTITION_DESIGNATOR_MAX; i++) {
+                        DissectedPartition *p = m->partitions + i;
+
+                        if (!p->found)
+                                continue;
+
+                        r = table_add_many(
+                                        t,
+                                        TABLE_STRING, p->rw ? "rw" : "ro",
+                                        TABLE_STRING, partition_designator_to_string(i));
+                        if (r < 0)
+                                return table_log_add_error(r);
+
+                        if (sd_id128_is_null(p->uuid))
+                                r = table_add_cell(t, NULL, TABLE_EMPTY, NULL);
+                        else
+                                r = table_add_cell(t, NULL, TABLE_UUID, &p->uuid);
+                        if (r < 0)
+                                return table_log_add_error(r);
+
+                        r = table_add_many(
+                                        t,
+                                        TABLE_STRING, p->fstype,
+                                        TABLE_STRING, architecture_to_string(p->architecture));
+                        if (r < 0)
+                                return table_log_add_error(r);
+
+                        if (arg_verity_data)
+                                r = table_add_cell(t, NULL, TABLE_STRING, "external");
+                        else if (dissected_image_can_do_verity(m, i))
+                                r = table_add_cell(t, NULL, TABLE_STRING, yes_no(dissected_image_has_verity(m, i)));
+                        else
+                                r = table_add_cell(t, NULL, TABLE_EMPTY, NULL);
+                        if (r < 0)
+                                return table_log_add_error(r);
+
+
+                        if (p->partno < 0) /* no partition table, naked file system */ {
+                                r = table_add_cell(t, NULL, TABLE_STRING, arg_image);
+                                if (r < 0)
+                                        return table_log_add_error(r);
+
+                                r = table_add_cell(t, NULL, TABLE_EMPTY, NULL);
+                        } else {
+                                r = table_add_cell(t, NULL, TABLE_STRING, p->node);
+                                if (r < 0)
+                                        return table_log_add_error(r);
+
+                                r = table_add_cell(t, NULL, TABLE_INT, &p->partno);
+                        }
+                        if (r < 0)
+                                return table_log_add_error(r);
+                }
+
+                r = table_print(t, stdout);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to dump table: %m");
+
                 break;
         }