machinectl: show (some) of the new image metadata bits in "status-image" output

Let's hook it all up, and show the image metadata among the rest of the
output.
This commit is contained in:
Lennart Poettering 2017-11-14 23:28:57 +01:00
parent cf30a8c1ed
commit 6ca7d231ed
1 changed files with 105 additions and 6 deletions

View File

@ -900,6 +900,100 @@ static int show_machine(int argc, char *argv[], void *userdata) {
return r;
}
static int print_image_hostname(sd_bus *bus, const char *name) {
_cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
const char *hn;
int r;
r = sd_bus_call_method(
bus,
"org.freedesktop.machine1",
"/org/freedesktop/machine1",
"org.freedesktop.machine1.Manager",
"GetImageHostname",
NULL, &reply, "s", name);
if (r < 0)
return r;
r = sd_bus_message_read(reply, "s", &hn);
if (r < 0)
return r;
if (!isempty(hn))
printf("\tHostname: %s\n", hn);
return 0;
}
static int print_image_machine_id(sd_bus *bus, const char *name) {
_cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
sd_id128_t id = SD_ID128_NULL;
const void *p;
size_t size;
int r;
r = sd_bus_call_method(
bus,
"org.freedesktop.machine1",
"/org/freedesktop/machine1",
"org.freedesktop.machine1.Manager",
"GetImageMachineID",
NULL, &reply, "s", name);
if (r < 0)
return r;
r = sd_bus_message_read_array(reply, 'y', &p, &size);
if (r < 0)
return r;
if (size == sizeof(sd_id128_t))
memcpy(&id, p, size);
if (!sd_id128_is_null(id))
printf(" Machine ID: " SD_ID128_FORMAT_STR "\n", SD_ID128_FORMAT_VAL(id));
return 0;
}
static int print_image_machine_info(sd_bus *bus, const char *name) {
_cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
_cleanup_strv_free_ char **l = NULL;
int r;
r = sd_bus_call_method(
bus,
"org.freedesktop.machine1",
"/org/freedesktop/machine1",
"org.freedesktop.machine1.Manager",
"GetImageMachineInfo",
NULL, &reply, "s", name);
if (r < 0)
return r;
r = sd_bus_message_enter_container(reply, 'a', "{ss}");
if (r < 0)
return r;
for (;;) {
const char *p, *q;
r = sd_bus_message_read(reply, "{ss}", &p, &q);
if (r < 0)
return r;
if (r == 0)
break;
if (streq(p, "DEPLOYMENT"))
printf(" Deployment: %s\n", q);
}
r = sd_bus_message_exit_container(reply);
if (r < 0)
return r;
return 0;
}
typedef struct ImageStatusInfo {
char *name;
char *path;
@ -914,12 +1008,13 @@ typedef struct ImageStatusInfo {
} ImageStatusInfo;
static void image_status_info_clear(ImageStatusInfo *info) {
if (info) {
free(info->name);
free(info->path);
free(info->type);
zero(*info);
}
if (!info)
return;
free(info->name);
free(info->path);
free(info->type);
zero(*info);
}
static void print_image_status_info(sd_bus *bus, ImageStatusInfo *i) {
@ -942,6 +1037,10 @@ static void print_image_status_info(sd_bus *bus, ImageStatusInfo *i) {
if (i->path)
printf("\t Path: %s\n", i->path);
(void) print_image_hostname(bus, i->name);
(void) print_image_machine_id(bus, i->name);
(void) print_image_machine_info(bus, i->name);
print_os_release(bus, "GetImageOSRelease", i->name, "\t OS: ");
printf("\t RO: %s%s%s\n",