From a19fdd66c2290dbb42e250e04fb0cb24dc749a83 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 15 Nov 2019 19:02:55 +0100 Subject: [PATCH 1/2] id128: add new "-u" switch for outputting Ids in UUID format For some unrelated stuff I wanted the machine ID in UUID format, and it was annoying doing that manually. So let's add a switch for this, so that this works: systemd-id128 machine-id -u --- src/id128/id128.c | 35 ++++++++++++++++++++++------------- src/journal/journalctl.c | 2 +- src/shared/id128-print.c | 17 ++++++++++++----- src/shared/id128-print.h | 12 ++++++++++-- 4 files changed, 45 insertions(+), 21 deletions(-) diff --git a/src/id128/id128.c b/src/id128/id128.c index d3874dbb00..4c5d696c32 100644 --- a/src/id128/id128.c +++ b/src/id128/id128.c @@ -7,14 +7,15 @@ #include "id128-print.h" #include "main-func.h" #include "pretty-print.h" +#include "terminal-util.h" #include "util.h" #include "verbs.h" -static bool arg_pretty = false; -static sd_id128_t arg_app = {}; +static Id128PrettyPrintMode arg_mode = ID128_PRINT_ID128; +static sd_id128_t arg_app = SD_ID128_NULL; static int verb_new(int argc, char **argv, void *userdata) { - return id128_print_new(arg_pretty); + return id128_print_new(arg_mode); } static int verb_machine_id(int argc, char **argv, void *userdata) { @@ -29,7 +30,7 @@ static int verb_machine_id(int argc, char **argv, void *userdata) { return log_error_errno(r, "Failed to get %smachine-ID: %m", sd_id128_is_null(arg_app) ? "" : "app-specific "); - return id128_pretty_print(id, arg_pretty); + return id128_pretty_print(id, arg_mode); } static int verb_boot_id(int argc, char **argv, void *userdata) { @@ -44,7 +45,7 @@ static int verb_boot_id(int argc, char **argv, void *userdata) { return log_error_errno(r, "Failed to get %sboot-ID: %m", sd_id128_is_null(arg_app) ? "" : "app-specific "); - return id128_pretty_print(id, arg_pretty); + return id128_pretty_print(id, arg_mode); } static int verb_invocation_id(int argc, char **argv, void *userdata) { @@ -59,7 +60,7 @@ static int verb_invocation_id(int argc, char **argv, void *userdata) { if (r < 0) return log_error_errno(r, "Failed to get invocation-ID: %m"); - return id128_pretty_print(id, arg_pretty); + return id128_pretty_print(id, arg_mode); } static int help(void) { @@ -70,19 +71,22 @@ static int help(void) { if (r < 0) return log_oom(); - printf("%s [OPTIONS...] {COMMAND}\n\n" - "Generate and print id128 strings.\n\n" - " -h --help Show this help\n" - " -p --pretty Generate samples of program code\n" - " -a --app-specific=ID Generate app-specific IDs\n" + printf("%s [OPTIONS...] COMMAND\n\n" + "%sGenerate and print 128bit identifiers.%s\n" "\nCommands:\n" " new Generate a new id128 string\n" " machine-id Print the ID of current machine\n" " boot-id Print the ID of current boot\n" " invocation-id Print the ID of current invocation\n" " help Show this help\n" + "\nOptions:\n" + " -h --help Show this help\n" + " -p --pretty Generate samples of program code\n" + " -a --app-specific=ID Generate app-specific IDs\n" + " -u --uuid Output in UUID format\n" "\nSee the %s for details.\n" , program_invocation_short_name + , ansi_highlight(), ansi_normal() , link ); @@ -103,6 +107,7 @@ static int parse_argv(int argc, char *argv[]) { { "version", no_argument, NULL, ARG_VERSION }, { "pretty", no_argument, NULL, 'p' }, { "app-specific", required_argument, NULL, 'a' }, + { "uuid", no_argument, NULL, 'u' }, {}, }; @@ -111,7 +116,7 @@ static int parse_argv(int argc, char *argv[]) { assert(argc >= 0); assert(argv); - while ((c = getopt_long(argc, argv, "hpa:", options, NULL)) >= 0) + while ((c = getopt_long(argc, argv, "hpa:u", options, NULL)) >= 0) switch (c) { case 'h': @@ -121,7 +126,7 @@ static int parse_argv(int argc, char *argv[]) { return version(); case 'p': - arg_pretty = true; + arg_mode = ID128_PRINT_PRETTY; break; case 'a': @@ -130,6 +135,10 @@ static int parse_argv(int argc, char *argv[]) { return log_error_errno(r, "Failed to parse \"%s\" as application-ID: %m", optarg); break; + case 'u': + arg_mode = ID128_PRINT_UUID; + break; + case '?': return -EINVAL; diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c index e5a2f6efcf..726d96702d 100644 --- a/src/journal/journalctl.c +++ b/src/journal/journalctl.c @@ -2047,7 +2047,7 @@ int main(int argc, char *argv[]) { switch (arg_action) { case ACTION_NEW_ID128: - r = id128_print_new(true); + r = id128_print_new(ID128_PRINT_PRETTY); goto finish; case ACTION_SETUP_KEYS: diff --git a/src/shared/id128-print.c b/src/shared/id128-print.c index febe3635ba..27a4e85573 100644 --- a/src/shared/id128-print.c +++ b/src/shared/id128-print.c @@ -10,15 +10,22 @@ #include "pretty-print.h" #include "terminal-util.h" -int id128_pretty_print(sd_id128_t id, bool pretty) { - unsigned i; +int id128_pretty_print(sd_id128_t id, Id128PrettyPrintMode mode) { _cleanup_free_ char *man_link = NULL, *mod_link = NULL; const char *on, *off; + unsigned i; - if (!pretty) { + assert(mode >= 0); + assert(mode < _ID128_PRETTY_PRINT_MODE_MAX); + + if (mode == ID128_PRINT_ID128) { printf(SD_ID128_FORMAT_STR "\n", SD_ID128_FORMAT_VAL(id)); return 0; + } else if (mode == ID128_PRINT_UUID) { + printf(SD_ID128_UUID_FORMAT_STR "\n", + SD_ID128_FORMAT_VAL(id)); + return 0; } on = ansi_highlight(); @@ -53,7 +60,7 @@ int id128_pretty_print(sd_id128_t id, bool pretty) { return 0; } -int id128_print_new(bool pretty) { +int id128_print_new(Id128PrettyPrintMode mode) { sd_id128_t id; int r; @@ -61,5 +68,5 @@ int id128_print_new(bool pretty) { if (r < 0) return log_error_errno(r, "Failed to generate ID: %m"); - return id128_pretty_print(id, pretty); + return id128_pretty_print(id, mode); } diff --git a/src/shared/id128-print.h b/src/shared/id128-print.h index 5d50de0fc8..1dc5b6aae5 100644 --- a/src/shared/id128-print.h +++ b/src/shared/id128-print.h @@ -6,5 +6,13 @@ #include "sd-id128.h" -int id128_pretty_print(sd_id128_t id, bool pretty); -int id128_print_new(bool pretty); +typedef enum Id128PrettyPrintMode { + ID128_PRINT_ID128, + ID128_PRINT_UUID, + ID128_PRINT_PRETTY, + _ID128_PRETTY_PRINT_MODE_MAX, + _ID128_PRETTY_PRINT_MODE_INVALID = -1 +} Id128PrettyPrintMode; + +int id128_pretty_print(sd_id128_t id, Id128PrettyPrintMode mode); +int id128_print_new(Id128PrettyPrintMode mode); From 394fda4cafd775de779f06bafdf96a2632ed7eed Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 15 Nov 2019 19:04:21 +0100 Subject: [PATCH 2/2] id128: drop "MESSAGE_" prefix of pretty output Using these IDs for message identication is one use case, but there are others, hence let's drop the prefix, it only made sense to have while the tool was part of journalctl. --- src/shared/id128-print.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/shared/id128-print.c b/src/shared/id128-print.c index 27a4e85573..356f410507 100644 --- a/src/shared/id128-print.c +++ b/src/shared/id128-print.c @@ -42,7 +42,7 @@ int id128_pretty_print(sd_id128_t id, Id128PrettyPrintMode mode) { "As UUID:\n" "%s" SD_ID128_UUID_FORMAT_STR "%s\n\n" "As %s macro:\n" - "%s#define MESSAGE_XYZ SD_ID128_MAKE(", + "%s#define XYZ SD_ID128_MAKE(", on, SD_ID128_FORMAT_VAL(id), off, on, SD_ID128_FORMAT_VAL(id), off, man_link, @@ -53,7 +53,7 @@ int id128_pretty_print(sd_id128_t id, Id128PrettyPrintMode mode) { printf("As Python constant:\n" ">>> import %s\n" - ">>> %sMESSAGE_XYZ = uuid.UUID('" SD_ID128_FORMAT_STR "')%s\n", + ">>> %sXYZ = uuid.UUID('" SD_ID128_FORMAT_STR "')%s\n", mod_link, on, SD_ID128_FORMAT_VAL(id), off);