From db21c2ec70af9aebe6a9a300b26650688f6378f4 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 19 Jan 2024 15:42:58 +0100 Subject: [PATCH 1/2] hostnamed: expose /etc/os-release and /etc/machine-info data in full There's some appetite to have the full os-release/machine-info data exposed by hostnamed. let's do so in the Describe() method and via Varlink. It's trivial after all. Inspired by: #18649 --- src/hostname/hostnamed.c | 6 ++++++ src/shared/varlink-io.systemd.Hostname.c | 2 ++ 2 files changed, 8 insertions(+) diff --git a/src/hostname/hostnamed.c b/src/hostname/hostnamed.c index 0e06a16a24..4ab429798a 100644 --- a/src/hostname/hostnamed.c +++ b/src/hostname/hostnamed.c @@ -1355,6 +1355,7 @@ static int build_describe_response(Context *c, bool privileged, JsonVariant **re _cleanup_free_ char *hn = NULL, *dhn = NULL, *in = NULL, *chassis = NULL, *vendor = NULL, *model = NULL, *serial = NULL, *firmware_version = NULL, *firmware_vendor = NULL; + _cleanup_strv_free_ char **os_release_pairs = NULL, **machine_info_pairs = NULL; usec_t firmware_date = USEC_INFINITY, eol = USEC_INFINITY; _cleanup_(json_variant_unrefp) JsonVariant *v = NULL; sd_id128_t machine_id, boot_id, product_uuid = SD_ID128_NULL; @@ -1418,6 +1419,9 @@ static int build_describe_response(Context *c, bool privileged, JsonVariant **re (void) vsock_get_local_cid(&local_cid); + (void) load_os_release_pairs(/* root= */ NULL, &os_release_pairs); + (void) load_env_file_pairs(/* f=*/ NULL, "/etc/machine-info", &machine_info_pairs); + r = json_build(&v, JSON_BUILD_OBJECT( JSON_BUILD_PAIR("Hostname", JSON_BUILD_STRING(hn)), JSON_BUILD_PAIR("StaticHostname", JSON_BUILD_STRING(c->data[PROP_STATIC_HOSTNAME])), @@ -1435,6 +1439,8 @@ static int build_describe_response(Context *c, bool privileged, JsonVariant **re JSON_BUILD_PAIR("OperatingSystemCPEName", JSON_BUILD_STRING(c->data[PROP_OS_CPE_NAME])), JSON_BUILD_PAIR("OperatingSystemHomeURL", JSON_BUILD_STRING(c->data[PROP_OS_HOME_URL])), JSON_BUILD_PAIR_FINITE_USEC("OperatingSystemSupportEnd", eol), + JSON_BUILD_PAIR("OperatingSystemReleaseData", JSON_BUILD_STRV_ENV_PAIR(os_release_pairs)), + JSON_BUILD_PAIR("MachineInformationData", JSON_BUILD_STRV_ENV_PAIR(machine_info_pairs)), JSON_BUILD_PAIR("HardwareVendor", JSON_BUILD_STRING(vendor ?: c->data[PROP_HARDWARE_VENDOR])), JSON_BUILD_PAIR("HardwareModel", JSON_BUILD_STRING(model ?: c->data[PROP_HARDWARE_MODEL])), JSON_BUILD_PAIR("HardwareSerial", JSON_BUILD_STRING(serial)), diff --git a/src/shared/varlink-io.systemd.Hostname.c b/src/shared/varlink-io.systemd.Hostname.c index b2c5e038ff..78058a1b2e 100644 --- a/src/shared/varlink-io.systemd.Hostname.c +++ b/src/shared/varlink-io.systemd.Hostname.c @@ -20,6 +20,8 @@ static VARLINK_DEFINE_METHOD( VARLINK_DEFINE_OUTPUT(OperatingSystemCPEName, VARLINK_STRING, VARLINK_NULLABLE), VARLINK_DEFINE_OUTPUT(OperatingSystemHomeURL, VARLINK_STRING, VARLINK_NULLABLE), VARLINK_DEFINE_OUTPUT(OperatingSystemSupportEnd, VARLINK_INT, VARLINK_NULLABLE), + VARLINK_DEFINE_OUTPUT(OperatingSystemReleaseData, VARLINK_STRING, VARLINK_NULLABLE|VARLINK_ARRAY), + VARLINK_DEFINE_OUTPUT(MachineInformationData, VARLINK_STRING, VARLINK_NULLABLE|VARLINK_ARRAY), VARLINK_DEFINE_OUTPUT(HardwareVendor, VARLINK_STRING, VARLINK_NULLABLE), VARLINK_DEFINE_OUTPUT(HardwareModel, VARLINK_STRING, VARLINK_NULLABLE), VARLINK_DEFINE_OUTPUT(HardwareSerial, VARLINK_STRING, VARLINK_NULLABLE), From 2bf618331d16f1a148aff7d97e850eaf06ae92c2 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 19 Jan 2024 15:49:33 +0100 Subject: [PATCH 2/2] hostnamectl: add -j switch for quick json output We already support -j as shortcut for JSON mode in various tools. Let's add one more. We probably should add this systematically (at least where it doesn't conflict with an existing -j switch with other purpose). But I am too lazy to add that now. --- man/hostnamectl.xml | 1 + shell-completion/bash/hostnamectl | 2 +- src/hostname/hostnamectl.c | 7 ++++++- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/man/hostnamectl.xml b/man/hostnamectl.xml index 3239049095..0f50bf9e44 100644 --- a/man/hostnamectl.xml +++ b/man/hostnamectl.xml @@ -201,6 +201,7 @@ + diff --git a/shell-completion/bash/hostnamectl b/shell-completion/bash/hostnamectl index 63edc084ae..27a2fe63d2 100644 --- a/shell-completion/bash/hostnamectl +++ b/shell-completion/bash/hostnamectl @@ -35,7 +35,7 @@ _hostnamectl() { local i verb comps local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]} local -A OPTS=( - [STANDALONE]='-h --help --version --transient --static --pretty --no-ask-password' + [STANDALONE]='-h --help --version --transient --static --pretty --no-ask-password -j' [ARG]='-H --host -M --machine --json' ) diff --git a/src/hostname/hostnamectl.c b/src/hostname/hostnamectl.c index 4b92ac2b23..4abcf40c26 100644 --- a/src/hostname/hostnamectl.c +++ b/src/hostname/hostnamectl.c @@ -616,6 +616,7 @@ static int help(void) { " --pretty Only set pretty hostname\n" " --json=pretty|short|off\n" " Generate JSON output\n" + " -j Same as --json=pretty on tty, --json=short otherwise\n" "\nSee the %s for details.\n", program_invocation_short_name, ansi_highlight(), @@ -658,7 +659,7 @@ static int parse_argv(int argc, char *argv[]) { assert(argc >= 0); assert(argv); - while ((c = getopt_long(argc, argv, "hH:M:", options, NULL)) >= 0) + while ((c = getopt_long(argc, argv, "hH:M:j", options, NULL)) >= 0) switch (c) { @@ -701,6 +702,10 @@ static int parse_argv(int argc, char *argv[]) { break; + case 'j': + arg_json_format_flags = JSON_FORMAT_PRETTY_AUTO|JSON_FORMAT_COLOR_AUTO; + break; + case '?': return -EINVAL;