diff --git a/src/bless-boot/bless-boot.c b/src/bless-boot/bless-boot.c index 6e31ea72f0..10effd0462 100644 --- a/src/bless-boot/bless-boot.c +++ b/src/bless-boot/bless-boot.c @@ -2,6 +2,8 @@ #include +#include "sd-json.h" + #include "alloc-util.h" #include "build.h" #include "devnum-util.h" @@ -9,14 +11,11 @@ #include "efivars.h" #include "fd-util.h" #include "find-esp.h" -#include "format-table.h" #include "fs-util.h" #include "log.h" #include "main-func.h" -#include "options.h" #include "parse-util.h" #include "path-util.h" -#include "pretty-print.h" #include "stdio-util.h" #include "string-util.h" #include "strv.h" @@ -28,52 +27,32 @@ static char **arg_path = NULL; STATIC_DESTRUCTOR_REGISTER(arg_path, strv_freep); +COMMAND( + "systemd-bless-boot\0", + "Mark the boot process as good or bad.", + .man_pages = "systemd-bless-boot.service.8\0", +); + typedef enum Status { STATUS_GOOD, STATUS_BAD, STATUS_INDETERMINATE, } Status; -static int help(void) { - _cleanup_free_ char *link = NULL; - _cleanup_(table_unrefp) Table *options = NULL, *verbs = NULL; - int r; +VERB_COMMON_HELP_AUTO_HIDDEN("systemd-bless-boot"); - r = terminal_urlify_man("systemd-bless-boot.service", "8", &link); - if (r < 0) - return log_oom(); +static int check_support(void) { + if (detect_container() > 0) + return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), + "Marking a boot is not supported in containers."); - r = option_parser_get_help_table(&options); - if (r < 0) - return r; + if (!is_efi_boot()) + return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), + "Marking a boot is only supported on EFI systems."); - r = verbs_get_help_table(&verbs); - if (r < 0) - return r; - - (void) table_sync_column_widths(0, options, verbs); - - printf("%s [OPTIONS...] COMMAND\n" - "\n%sMark the boot process as good or bad.%s\n" - "\nCommands:\n", - program_invocation_short_name, - ansi_highlight(), - ansi_normal()); - r = table_print_or_warn(verbs); - if (r < 0) - return r; - - printf("\nOptions:\n"); - r = table_print_or_warn(options); - if (r < 0) - return r; - - printf("\nSee the %s for details.\n", link); return 0; } -VERB_COMMON_HELP_HIDDEN(help); - static int parse_argv(int argc, char *argv[], char ***ret_args) { int r; @@ -85,7 +64,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) { FOREACH_OPTION_OR_RETURN(c, &opts) switch (c) { OPTION_COMMON_HELP: - return help(); + return command_print_help("systemd-bless-boot"); OPTION_COMMON_VERSION: return version(); @@ -95,6 +74,9 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) { if (r < 0) return log_oom(); break; + + OPTION_COMMON_INTROSPECT_CLI: + return introspect_cli(SD_JSON_FORMAT_OFF); } *ret_args = option_parser_get_args(&opts); @@ -346,6 +328,10 @@ static int verb_status(int argc, char *argv[], uintptr_t _data, void *userdata) uint64_t left, done; int r; + r = check_support(); + if (r < 0) + return r; + r = acquire_boot_count_path(&path, &prefix, &left, &done, &suffix); if (r == -EUNATCH) { /* No boot count in place, then let's consider this a "clean" boot, * since "good", "bad", or "indeterminate" don't apply. */ @@ -463,6 +449,10 @@ static int verb_set(int argc, char *argv[], uintptr_t data, void *userdata) { assert(IN_SET(status, STATUS_GOOD, STATUS_BAD, STATUS_INDETERMINATE)); + r = check_support(); + if (r < 0) + return r; + r = acquire_boot_count_path(&path, &prefix, &left, &done, &suffix); if (r == -EUNATCH) /* acquire_boot_count_path() won't log on its own for this specific error */ return log_error_errno(r, "Not booted with boot counting in effect."); @@ -575,14 +565,6 @@ static int run(int argc, char *argv[]) { if (r <= 0) return r; - if (detect_container() > 0) - return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), - "Marking a boot is not supported in containers."); - - if (!is_efi_boot()) - return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), - "Marking a boot is only supported on EFI systems."); - return dispatch_verb(args, NULL); } diff --git a/src/busctl/busctl.c b/src/busctl/busctl.c index edba5748e8..4538dcba42 100644 --- a/src/busctl/busctl.c +++ b/src/busctl/busctl.c @@ -26,12 +26,10 @@ #include "fileio.h" #include "format-table.h" #include "glyph-util.h" -#include "help-util.h" #include "log.h" #include "logarithm.h" #include "main-func.h" #include "memstream-util.h" -#include "options.h" #include "os-util.h" #include "pager.h" #include "parse-argument.h" @@ -77,6 +75,14 @@ static uint64_t arg_limit_signals = 1; STATIC_DESTRUCTOR_REGISTER(arg_matches, strv_freep); +COMMAND( + "busctl\0", + "Introspect the D-Bus IPC bus.", + .man_pages = "busctl.1\0", + .pager_flags = &arg_pager_flags, + .flags = COMMAND_HELP_SEPARATE, /* the verb table is very wide */ +); + #define NAME_IS_ACQUIRED INT_TO_PTR(1) #define NAME_IS_ACTIVATABLE INT_TO_PTR(2) @@ -2073,41 +2079,7 @@ static int verb_set_property(int argc, char *argv[], uintptr_t _data, void *user return 0; } -static int help(void) { - _cleanup_(table_unrefp) Table *options = NULL, *verbs = NULL; - int r; - - pager_open(arg_pager_flags); - - r = verbs_get_help_table(&verbs); - if (r < 0) - return r; - - r = option_parser_get_help_table(&options); - if (r < 0) - return r; - - /* Note: column widths are not synced, because the verbs table is very wide. */ - - help_cmdline("[OPTIONS…] COMMAND …"); - help_abstract("Introspect the D-Bus IPC bus."); - - help_section("Commands"); - r = table_print_or_warn(verbs); - if (r < 0) - return r; - - help_section("Options"); - r = table_print_or_warn(options); - if (r < 0) - return r; - - help_man_page_reference("busctl", "1"); - - return 0; -} - -VERB_COMMON_HELP(help); +VERB_COMMON_HELP_AUTO("busctl"); static int parse_argv(int argc, char *argv[], char ***remaining_args) { assert(argc >= 0); @@ -2121,7 +2093,7 @@ static int parse_argv(int argc, char *argv[], char ***remaining_args) { switch (c) { OPTION_COMMON_HELP: - return help(); + return command_print_help("busctl"); OPTION_COMMON_VERSION: return version(); @@ -2305,6 +2277,9 @@ static int parse_argv(int argc, char *argv[], char ***remaining_args) { arg_limit_signals = arg_limit_messages; break; + + OPTION_COMMON_INTROSPECT_CLI: + return introspect_cli(arg_json_format_flags); } if (arg_full < 0) diff --git a/src/coredump/coredumpctl.c b/src/coredump/coredumpctl.c index d69137466b..c0f4b9cd03 100644 --- a/src/coredump/coredumpctl.c +++ b/src/coredump/coredumpctl.c @@ -30,7 +30,6 @@ #include "format-util.h" #include "fs-util.h" #include "glob-util.h" -#include "help-util.h" #include "image-policy.h" #include "io-util.h" #include "journal-internal.h" @@ -41,7 +40,6 @@ #include "loop-util.h" #include "main-func.h" #include "mount-util.h" -#include "options.h" #include "pager.h" #include "parse-argument.h" #include "parse-util.h" @@ -83,6 +81,13 @@ STATIC_DESTRUCTOR_REGISTER(arg_image, freep); STATIC_DESTRUCTOR_REGISTER(arg_file, strv_freep); STATIC_DESTRUCTOR_REGISTER(arg_image_policy, image_policy_freep); +COMMAND( + "coredumpctl\0", + "List or retrieve coredumps from the journal.", + .man_pages = "coredumpctl.1\0", + .pager_flags = &arg_pager_flags, +); + static int add_match(sd_journal *j, const char *match) { _cleanup_free_ char *p = NULL; const char *field; @@ -178,38 +183,7 @@ static int acquire_journal(sd_journal **ret, char **matches) { return 0; } -static int help(void) { - _cleanup_(table_unrefp) Table *verbs = NULL, *options = NULL; - int r; - - r = verbs_get_help_table(&verbs); - if (r < 0) - return r; - - r = option_parser_get_help_table(&options); - if (r < 0) - return r; - - (void) table_sync_column_widths(0, verbs, options); - - help_cmdline("[OPTIONS…] COMMAND …"); - help_abstract("List or retrieve coredumps from the journal."); - - help_section("Commands"); - r = table_print_or_warn(verbs); - if (r < 0) - return r; - - help_section("Options"); - r = table_print_or_warn(options); - if (r < 0) - return r; - - help_man_page_reference("coredumpctl", "1"); - return 0; -} - -VERB_COMMON_HELP_HIDDEN(help); +VERB_COMMON_HELP_AUTO_HIDDEN("coredumpctl"); static int parse_argv(int argc, char *argv[], char ***remaining_args) { int r; @@ -224,7 +198,7 @@ static int parse_argv(int argc, char *argv[], char ***remaining_args) { switch (c) { OPTION_COMMON_HELP: - return help(); + return command_print_help("coredumpctl"); OPTION_COMMON_VERSION: return version(); @@ -339,6 +313,9 @@ static int parse_argv(int argc, char *argv[], char ***remaining_args) { OPTION_LONG("all", NULL, "Look at all journal files instead of local ones"): arg_all = true; break; + + OPTION_COMMON_INTROSPECT_CLI: + return introspect_cli(arg_json_format_flags); } if (arg_since != USEC_INFINITY && arg_until != USEC_INFINITY && diff --git a/src/creds/creds.c b/src/creds/creds.c index ac405eb3e8..c0908d89ec 100644 --- a/src/creds/creds.c +++ b/src/creds/creds.c @@ -7,6 +7,7 @@ #include "sd-varlink.h" #include "alloc-util.h" +#include "ansi-color.h" #include "build.h" #include "bus-polkit.h" #include "bus-util.h" @@ -24,12 +25,10 @@ #include "log.h" #include "main-func.h" #include "memory-util.h" -#include "options.h" #include "pager.h" #include "parse-argument.h" #include "parse-util.h" #include "polkit-agent.h" -#include "pretty-print.h" #include "stat-util.h" #include "string-table.h" #include "string-util.h" @@ -79,6 +78,13 @@ static bool arg_ask_password = true; STATIC_DESTRUCTOR_REGISTER(arg_tpm2_public_key, freep); STATIC_DESTRUCTOR_REGISTER(arg_tpm2_signature, freep); +COMMAND( + "systemd-creds\0", + "Display and process credentials.", + .man_pages = "systemd-creds.1\0", + .pager_flags = &arg_pager_flags, +); + static const char* transcode_mode_table[_TRANSCODE_MAX] = { [TRANSCODE_OFF] = "off", [TRANSCODE_BASE64] = "base64", @@ -773,51 +779,7 @@ static int verb_has_tpm2(int argc, char *argv[], uintptr_t _data, void *userdata return verb_has_tpm2_generic(arg_quiet); } -static int help(void) { - _cleanup_free_ char *link = NULL; - _cleanup_(table_unrefp) Table *options = NULL, *verbs = NULL; - int r; - - r = terminal_urlify_man("systemd-creds", "1", &link); - if (r < 0) - return log_oom(); - - r = verbs_get_help_table(&verbs); - if (r < 0) - return r; - - r = option_parser_get_help_table(&options); - if (r < 0) - return r; - - (void) table_sync_column_widths(0, verbs, options); - - printf("%s [OPTIONS...] COMMAND ...\n\n" - "%sDisplay and Process Credentials.%s\n" - "\n%sCommands:%s\n", - program_invocation_short_name, - ansi_highlight(), - ansi_normal(), - ansi_underline(), - ansi_normal()); - - r = table_print_or_warn(verbs); - if (r < 0) - return r; - - printf("\n%sOptions:%s\n", - ansi_underline(), - ansi_normal()); - - r = table_print_or_warn(options); - if (r < 0) - return r; - - printf("\nSee the %s for details.\n", link); - return 0; -} - -VERB_COMMON_HELP(help); +VERB_COMMON_HELP_AUTO("systemd-creds"); static int parse_argv(int argc, char *argv[], char ***ret_args) { assert(argc >= 0); @@ -830,7 +792,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) { switch (c) { OPTION_COMMON_HELP: - return help(); + return command_print_help("systemd-creds"); OPTION_COMMON_VERSION: return version(); @@ -1022,6 +984,9 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) { OPTION('q', "quiet", NULL, "Suppress informational messages"): arg_quiet = true; break; + + OPTION_COMMON_INTROSPECT_CLI: + return introspect_cli(arg_json_format_flags); } SET_FLAG(arg_credential_flags, CREDENTIAL_IPC_ALLOW_INTERACTIVE, arg_ask_password); diff --git a/src/cryptsetup/cryptsetup.c b/src/cryptsetup/cryptsetup.c index 5641681861..598bfd5b31 100644 --- a/src/cryptsetup/cryptsetup.c +++ b/src/cryptsetup/cryptsetup.c @@ -25,7 +25,6 @@ #include "escape.h" #include "extract-word.h" #include "fileio.h" -#include "format-table.h" #include "fs-util.h" #include "hexdecoct.h" #include "json-util.h" @@ -35,12 +34,10 @@ #include "main-func.h" #include "memory-util.h" #include "nulstr-util.h" -#include "options.h" #include "parse-util.h" #include "path-util.h" #include "pcrextend-util.h" #include "pkcs11-util.h" -#include "pretty-print.h" #include "process-util.h" #include "random-util.h" #include "string-table.h" @@ -145,6 +142,12 @@ STATIC_DESTRUCTOR_REGISTER(arg_link_key_type, freep); STATIC_DESTRUCTOR_REGISTER(arg_link_key_description, freep); STATIC_DESTRUCTOR_REGISTER(arg_fixate_volume_key, freep); +COMMAND( + "systemd-cryptsetup\0", + "Attach or detach an encrypted block device.", + .man_pages = "systemd-cryptsetup.8\0", +); + static const char* const passphrase_type_table[_PASSPHRASE_TYPE_MAX] = { [PASSPHRASE_REGULAR] = "passphrase", [PASSPHRASE_RECOVERY_KEY] = "recovery key", @@ -2376,51 +2379,7 @@ static int attach_luks_or_plain_or_bitlk( return attach_luks_or_plain_or_bitlk_by_passphrase(cd, name, passwords, flags, pass_volume_key); } -static int help(void) { - _cleanup_free_ char *link = NULL; - _cleanup_(table_unrefp) Table *options = NULL, *verbs = NULL; - int r; - - r = terminal_urlify_man("systemd-cryptsetup", "8", &link); - if (r < 0) - return log_oom(); - - r = verbs_get_help_table(&verbs); - if (r < 0) - return r; - - r = option_parser_get_help_table(&options); - if (r < 0) - return r; - - (void) table_sync_column_widths(0, verbs, options); - - printf("%s [OPTIONS...] {COMMAND} ...\n\n" - "%sAttach or detach an encrypted block device.%s\n" - "\n%sCommands:%s\n", - program_invocation_short_name, - ansi_highlight(), - ansi_normal(), - ansi_underline(), - ansi_normal()); - - r = table_print_or_warn(verbs); - if (r < 0) - return r; - - printf("\n%sOptions:%s\n", - ansi_underline(), - ansi_normal()); - - r = table_print_or_warn(options); - if (r < 0) - return r; - - printf("\nSee the %s for details.\n", link); - return 0; -} - -VERB_COMMON_HELP_HIDDEN(help); +VERB_COMMON_HELP_AUTO_HIDDEN("systemd-cryptsetup"); static int parse_argv(int argc, char *argv[], char ***ret_args) { assert(argc >= 0); @@ -2433,10 +2392,13 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) { switch (c) { OPTION_COMMON_HELP: - return help(); + return command_print_help("systemd-cryptsetup"); OPTION_COMMON_VERSION: return version(); + + OPTION_COMMON_INTROSPECT_CLI: + return introspect_cli(SD_JSON_FORMAT_OFF); } *ret_args = option_parser_get_args(&opts); diff --git a/src/factory-reset/factory-reset-tool.c b/src/factory-reset/factory-reset-tool.c index d3019396c3..c055f26e40 100644 --- a/src/factory-reset/factory-reset-tool.c +++ b/src/factory-reset/factory-reset-tool.c @@ -4,19 +4,15 @@ #include "sd-varlink.h" #include "alloc-util.h" -#include "ansi-color.h" #include "build.h" #include "device-util.h" #include "efivars.h" #include "errno-util.h" #include "factory-reset.h" -#include "format-table.h" #include "fs-util.h" #include "json-util.h" #include "main-func.h" -#include "options.h" #include "os-util.h" -#include "pretty-print.h" #include "udev-util.h" #include "varlink-io.systemd.FactoryReset.h" #include "varlink-util.h" @@ -26,43 +22,11 @@ static bool arg_retrigger = false; static bool arg_quiet = false; static bool arg_varlink = false; -static int help(void) { - _cleanup_free_ char *link = NULL; - _cleanup_(table_unrefp) Table *options = NULL, *verbs = NULL; - int r; - - r = terminal_urlify_man("systemd-factory-reset", "8", &link); - if (r < 0) - return log_oom(); - - r = option_parser_get_help_table(&options); - if (r < 0) - return r; - - r = verbs_get_help_table(&verbs); - if (r < 0) - return r; - - (void) table_sync_column_widths(0, options, verbs); - - printf("%s [OPTIONS...] COMMAND\n" - "\n%sQuery, request, cancel factory reset operation.%s\n" - "\nCommands:\n", - program_invocation_short_name, - ansi_highlight(), - ansi_normal()); - r = table_print_or_warn(verbs); - if (r < 0) - return r; - - printf("\nOptions:\n"); - r = table_print_or_warn(options); - if (r < 0) - return r; - - printf("\nSee the %s for details.\n", link); - return 0; -} +COMMAND( + "systemd-factory-reset\0", + "Query, request, or cancel a factory reset operation.", + .man_pages = "systemd-factory-reset.8\0", +); static int parse_argv(int argc, char *argv[], char ***ret_args) { int r; @@ -75,7 +39,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) { FOREACH_OPTION_OR_RETURN(c, &opts) switch (c) { OPTION_COMMON_HELP: - return help(); + return command_print_help("systemd-factory-reset"); OPTION_COMMON_VERSION: return version(); @@ -87,6 +51,9 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) { OPTION('q', "quiet", NULL, "Suppress output"): arg_quiet = true; break; + + OPTION_COMMON_INTROSPECT_CLI: + return introspect_cli(SD_JSON_FORMAT_OFF); } r = sd_varlink_invocation(SD_VARLINK_ALLOW_ACCEPT); diff --git a/src/hostname/hostnamectl.c b/src/hostname/hostnamectl.c index a6ecad5178..e15d121f6a 100644 --- a/src/hostname/hostnamectl.c +++ b/src/hostname/hostnamectl.c @@ -19,12 +19,10 @@ #include "bus-util.h" #include "errno-util.h" #include "format-table.h" -#include "help-util.h" #include "hostname-setup.h" #include "hostname-util.h" #include "log.h" #include "main-func.h" -#include "options.h" #include "os-util.h" #include "parse-argument.h" #include "polkit-agent.h" @@ -42,6 +40,12 @@ static bool arg_pretty = false; static bool arg_static = false; static sd_json_format_flags_t arg_json_format_flags = SD_JSON_FORMAT_OFF; +COMMAND( + "hostnamectl\0", + "Query or change system hostname.", + .man_pages = "hostnamectl.1\0", +); + typedef struct StatusInfo { const char *hostname; const char *static_hostname; @@ -849,38 +853,7 @@ static int verb_get_or_set_tags(int argc, char *argv[], uintptr_t _data, void *u return 0; } -static int help(void) { - _cleanup_(table_unrefp) Table *options = NULL, *verbs = NULL; - int r; - - r = option_parser_get_help_table(&options); - if (r < 0) - return r; - - r = verbs_get_help_table(&verbs); - if (r < 0) - return r; - - (void) table_sync_column_widths(0, options, verbs); - - help_cmdline("[OPTIONS...] COMMAND ..."); - help_abstract("Query or change system hostname."); - - help_section("Commands"); - r = table_print_or_warn(verbs); - if (r < 0) - return r; - - help_section("Options"); - r = table_print_or_warn(options); - if (r < 0) - return r; - - help_man_page_reference("hostnamectl", "1"); - return 0; -} - -VERB_COMMON_HELP_HIDDEN(help); +VERB_COMMON_HELP_AUTO_HIDDEN("hostnamectl"); static int parse_argv(int argc, char *argv[], char ***ret_args) { int r; @@ -893,7 +866,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) { FOREACH_OPTION_OR_RETURN(c, &opts) switch (c) { OPTION_COMMON_HELP: - return help(); + return command_print_help("hostnamectl"); OPTION_COMMON_VERSION: return version(); @@ -934,6 +907,9 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) { OPTION_COMMON_LOWERCASE_J: arg_json_format_flags = SD_JSON_FORMAT_PRETTY_AUTO|SD_JSON_FORMAT_COLOR_AUTO; break; + + OPTION_COMMON_INTROSPECT_CLI: + return introspect_cli(arg_json_format_flags); } *ret_args = option_parser_get_args(&opts); diff --git a/src/import/importctl.c b/src/import/importctl.c index 58d996e8d7..ad64b8ffcb 100644 --- a/src/import/importctl.c +++ b/src/import/importctl.c @@ -5,6 +5,7 @@ #include "sd-bus.h" #include "sd-event.h" +#include "sd-json.h" #include "alloc-util.h" #include "build.h" @@ -19,7 +20,6 @@ #include "log.h" #include "main-func.h" #include "oci-util.h" -#include "options.h" #include "os-util.h" #include "pager.h" #include "parse-argument.h" @@ -48,6 +48,13 @@ static sd_json_format_flags_t arg_json_format_flags = SD_JSON_FORMAT_OFF; static ImageClass arg_image_class = _IMAGE_CLASS_INVALID; static RuntimeScope arg_runtime_scope = RUNTIME_SCOPE_SYSTEM; +COMMAND( + "importctl\0", + "Download, import or export disk images.", + .man_pages = "importctl.1\0", + .pager_flags = &arg_pager_flags, +); + #define PROGRESS_PREFIX "Total:" static int settle_image_class(void) { @@ -1059,53 +1066,7 @@ static int verb_list_images(int argc, char *argv[], uintptr_t _data, void *userd return 0; } -static int help(void) { - _cleanup_free_ char *link = NULL; - _cleanup_(table_unrefp) Table *options = NULL, *verbs = NULL; - int r; - - pager_open(arg_pager_flags); - - r = terminal_urlify_man("importctl", "1", &link); - if (r < 0) - return log_oom(); - - r = verbs_get_help_table(&verbs); - if (r < 0) - return r; - - r = option_parser_get_help_table(&options); - if (r < 0) - return r; - - (void) table_sync_column_widths(0, verbs, options); - - printf("%s [OPTIONS...] COMMAND ...\n\n" - "%sDownload, import or export disk images%s\n" - "\n%sCommands:%s\n", - program_invocation_short_name, - ansi_highlight(), - ansi_normal(), - ansi_underline(), - ansi_normal()); - - r = table_print_or_warn(verbs); - if (r < 0) - return r; - - printf("\n%sOptions:%s\n", - ansi_underline(), - ansi_normal()); - - r = table_print_or_warn(options); - if (r < 0) - return r; - - printf("\nSee the %s for details.\n", link); - return 0; -} - -VERB_COMMON_HELP(help); +VERB_COMMON_HELP_AUTO("importctl"); static int parse_argv(int argc, char *argv[], char ***ret_args) { int r; @@ -1119,7 +1080,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) { switch (c) { OPTION_COMMON_HELP: - return help(); + return command_print_help("importctl"); OPTION_COMMON_VERSION: return version(); @@ -1236,6 +1197,9 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) { arg_import_flags &= ~IMPORT_PULL_KEEP_DOWNLOAD; arg_import_flags_mask |= IMPORT_PULL_KEEP_DOWNLOAD; break; + + OPTION_COMMON_INTROSPECT_CLI: + return introspect_cli(arg_json_format_flags); } *ret_args = option_parser_get_args(&opts); diff --git a/src/keyutil/keyutil.c b/src/keyutil/keyutil.c index 51c83478eb..c442cf30e9 100644 --- a/src/keyutil/keyutil.c +++ b/src/keyutil/keyutil.c @@ -1,5 +1,7 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ +#include "sd-json.h" + #include "alloc-util.h" #include "ask-password-api.h" #include "build.h" @@ -7,13 +9,10 @@ #include "dlopen-note.h" #include "fd-util.h" #include "fileio.h" -#include "format-table.h" #include "fs-util.h" #include "log.h" #include "main-func.h" -#include "options.h" #include "parse-argument.h" -#include "pretty-print.h" #include "string-util.h" #include "tmpfile-util.h" #include "verbs.h" @@ -37,51 +36,13 @@ STATIC_DESTRUCTOR_REGISTER(arg_signature, freep); STATIC_DESTRUCTOR_REGISTER(arg_content, freep); STATIC_DESTRUCTOR_REGISTER(arg_output, freep); -static int help(void) { - _cleanup_free_ char *link = NULL; - _cleanup_(table_unrefp) Table *options = NULL, *verbs = NULL; - int r; +COMMAND( + "systemd-keyutil\0", + "Perform various operations on private keys and certificates.", + .man_pages = "systemd-keyutil.1\0", +); - r = terminal_urlify_man("systemd-keyutil", "1", &link); - if (r < 0) - return log_oom(); - - r = verbs_get_help_table(&verbs); - if (r < 0) - return r; - - r = option_parser_get_help_table(&options); - if (r < 0) - return r; - - (void) table_sync_column_widths(0, verbs, options); - - printf("%s [OPTIONS...] COMMAND ...\n\n" - "%sPerform various operations on private keys and certificates.%s\n" - "\n%sCommands:%s\n", - program_invocation_short_name, - ansi_highlight(), - ansi_normal(), - ansi_underline(), - ansi_normal()); - - r = table_print_or_warn(verbs); - if (r < 0) - return r; - - printf("\n%sOptions:%s\n", - ansi_underline(), - ansi_normal()); - - r = table_print_or_warn(options); - if (r < 0) - return r; - - printf("\nSee the %s for details.\n", link); - return 0; -} - -VERB_COMMON_HELP_HIDDEN(help); +VERB_COMMON_HELP_AUTO_HIDDEN("systemd-keyutil"); static int parse_argv(int argc, char *argv[], char ***ret_args) { assert(argc >= 0); @@ -95,7 +56,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) { switch (c) { OPTION_COMMON_HELP: - return help(); + return command_print_help("systemd-keyutil"); OPTION_COMMON_VERSION: return version(); @@ -152,6 +113,9 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) { if (r < 0) return r; break; + + OPTION_COMMON_INTROSPECT_CLI: + return introspect_cli(SD_JSON_FORMAT_OFF); } if (arg_private_key_source && !arg_certificate) diff --git a/src/locale/localectl.c b/src/locale/localectl.c index ff7afa6c84..3a172b22b0 100644 --- a/src/locale/localectl.c +++ b/src/locale/localectl.c @@ -1,9 +1,10 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #include "sd-bus.h" +#include "sd-json.h" -#include "ansi-color.h" #include "alloc-util.h" +#include "ansi-color.h" #include "build.h" #include "bus-error.h" #include "bus-locator.h" @@ -12,12 +13,10 @@ #include "fd-util.h" #include "fileio.h" #include "format-table.h" -#include "help-util.h" #include "kbd-util.h" #include "locale-setup.h" #include "main-func.h" #include "memory-util.h" -#include "options.h" #include "pager.h" #include "parse-argument.h" #include "path-util.h" @@ -38,6 +37,13 @@ static const char *arg_host = NULL; static bool arg_convert = true; static bool arg_full = false; +COMMAND( + "localectl\0", + "Query or change system locale and keyboard settings.", + .man_pages = "localectl.1\0", + .pager_flags = &arg_pager_flags, +); + typedef struct StatusInfo { char **locale; const char *vconsole_keymap; @@ -420,39 +426,7 @@ static int verb_list_x11_keymaps(int argc, char *argv[], uintptr_t _data, void * return 0; } -static int help(void) { - _cleanup_(table_unrefp) Table *options = NULL, *verbs = NULL; - int r; - - r = verbs_get_help_table(&verbs); - if (r < 0) - return r; - - r = option_parser_get_help_table(&options); - if (r < 0) - return r; - - (void) table_sync_column_widths(0, verbs, options); - - help_cmdline("[OPTIONS…] COMMAND …"); - help_abstract("Query or change system locale and keyboard settings."); - - help_section("Commands"); - r = table_print_or_warn(verbs); - if (r < 0) - return r; - - help_section("Options"); - r = table_print_or_warn(options); - if (r < 0) - return r; - - help_man_page_reference("localectl", "1"); - - return 0; -} - -VERB_COMMON_HELP_HIDDEN(help); +VERB_COMMON_HELP_AUTO_HIDDEN("localectl"); static int parse_argv(int argc, char *argv[], char ***remaining_args) { assert(argc >= 0); @@ -466,7 +440,7 @@ static int parse_argv(int argc, char *argv[], char ***remaining_args) { switch (c) { OPTION_COMMON_HELP: - return help(); + return command_print_help("localectl"); OPTION_COMMON_VERSION: return version(); @@ -497,6 +471,9 @@ static int parse_argv(int argc, char *argv[], char ***remaining_args) { OPTION_LONG("no-convert", NULL, "Don't convert keyboard mappings"): arg_convert = false; break; + + OPTION_COMMON_INTROSPECT_CLI: + return introspect_cli(SD_JSON_FORMAT_OFF); } *remaining_args = option_parser_get_args(&opts); diff --git a/src/login/inhibit.c b/src/login/inhibit.c index 8345620980..600f98c4ef 100644 --- a/src/login/inhibit.c +++ b/src/login/inhibit.c @@ -240,7 +240,7 @@ static int parse_argv(int argc, char *argv[], char ***remaining_args) { break; OPTION_COMMON_INTROSPECT_CLI: - return introspect_cli(SD_JSON_FORMAT_OFF); + return introspect_cli(arg_json_format_flags); } char **args = option_parser_get_args(&opts); diff --git a/src/network/networkctl.c b/src/network/networkctl.c index 73757cc8f2..e307d78c9c 100644 --- a/src/network/networkctl.c +++ b/src/network/networkctl.c @@ -5,8 +5,6 @@ #include "alloc-util.h" #include "build.h" #include "dlopen-note.h" -#include "format-table.h" -#include "help-util.h" #include "log.h" #include "logs-show.h" #include "main-func.h" @@ -18,7 +16,6 @@ #include "networkctl-lldp.h" #include "networkctl-misc.h" #include "networkctl-status-link.h" -#include "options.h" #include "parse-argument.h" #include "parse-util.h" #include "path-util.h" @@ -41,6 +38,13 @@ bool arg_ask_password = true; STATIC_DESTRUCTOR_REGISTER(arg_drop_in, freep); +COMMAND( + "networkctl\0", + "Query and control the networking subsystem.", + .man_pages = "networkctl.1\0", + .pager_flags = &arg_pager_flags, +); + VERB_SCOPE(, verb_list_links, "list", "[PATTERN...]", VERB_ANY, VERB_ANY, VERB_DEFAULT|VERB_ONLINE_ONLY, "List links"); VERB_SCOPE(, verb_link_status, "status", "[PATTERN...]", VERB_ANY, VERB_ANY, VERB_ONLINE_ONLY, @@ -76,38 +80,7 @@ VERB_SCOPE(, verb_unmask, "unmask", "FILES...", VERB_SCOPE(, verb_persistent_storage, "persistent-storage", "BOOL", 2, 2, 0, "Notify systemd-networkd if persistent storage is ready"); -static int help(void) { - _cleanup_(table_unrefp) Table *verbs = NULL, *options = NULL; - int r; - - r = verbs_get_help_table(&verbs); - if (r < 0) - return r; - - r = option_parser_get_help_table(&options); - if (r < 0) - return r; - - (void) table_sync_column_widths(0, verbs, options); - - help_cmdline("[OPTIONS...] COMMAND"); - help_abstract("Query and control the networking subsystem."); - - help_section("Commands"); - r = table_print_or_warn(verbs); - if (r < 0) - return r; - - help_section("Options"); - r = table_print_or_warn(options); - if (r < 0) - return r; - - help_man_page_reference("networkctl", "1"); - return 0; -} - -VERB_COMMON_HELP_HIDDEN(help); +VERB_COMMON_HELP_AUTO_HIDDEN("networkctl"); static int parse_argv(int argc, char *argv[], char ***remaining_args) { int r; @@ -122,7 +95,7 @@ static int parse_argv(int argc, char *argv[], char ***remaining_args) { switch (c) { OPTION_COMMON_HELP: - return help(); + return command_print_help("networkctl"); OPTION_COMMON_VERSION: return version(); @@ -205,6 +178,9 @@ static int parse_argv(int argc, char *argv[], char ***remaining_args) { OPTION_LONG("stdin", NULL, "Read new contents of edited file from stdin"): arg_stdin = true; break; + + OPTION_COMMON_INTROSPECT_CLI: + return introspect_cli(arg_json_format_flags); } *remaining_args = option_parser_get_args(&opts); diff --git a/src/oom/oomctl.c b/src/oom/oomctl.c index 8b5051ebd0..7238a0554b 100644 --- a/src/oom/oomctl.c +++ b/src/oom/oomctl.c @@ -1,69 +1,27 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #include "sd-bus.h" +#include "sd-json.h" -#include "alloc-util.h" #include "build.h" #include "bus-error.h" #include "bus-locator.h" #include "bus-message-util.h" -#include "format-table.h" #include "log.h" #include "main-func.h" -#include "options.h" #include "pager.h" -#include "pretty-print.h" #include "verbs.h" static PagerFlags arg_pager_flags = 0; -static int help(void) { - _cleanup_free_ char *link = NULL; - _cleanup_(table_unrefp) Table *options = NULL, *verbs = NULL; - int r; +COMMAND( + "oomctl\0", + "Manage or inspect the userspace OOM killer.", + .man_pages = "oomctl.1\0", + .pager_flags = &arg_pager_flags, +); - pager_open(arg_pager_flags); - - r = terminal_urlify_man("oomctl", "1", &link); - if (r < 0) - return log_oom(); - - r = verbs_get_help_table(&verbs); - if (r < 0) - return r; - - r = option_parser_get_help_table(&options); - if (r < 0) - return r; - - (void) table_sync_column_widths(0, verbs, options); - - printf("%s [OPTIONS...] COMMAND ...\n\n" - "%sManage or inspect the userspace OOM killer.%s\n" - "\n%sCommands:%s\n", - program_invocation_short_name, - ansi_highlight(), - ansi_normal(), - ansi_underline(), - ansi_normal()); - - r = table_print_or_warn(verbs); - if (r < 0) - return r; - - printf("\n%sOptions:%s\n", - ansi_underline(), - ansi_normal()); - - r = table_print_or_warn(options); - if (r < 0) - return r; - - printf("\nSee the %s for details.\n", link); - return 0; -} - -VERB_COMMON_HELP_HIDDEN(help); +VERB_COMMON_HELP_AUTO_HIDDEN("oomctl"); VERB_DEFAULT_NOARG(verb_dump_state, "dump", "Output the current state of systemd-oomd"); static int verb_dump_state(int argc, char *argv[], uintptr_t _data, void *userdata) { @@ -96,7 +54,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) { switch (c) { OPTION_COMMON_HELP: - return help(); + return command_print_help("oomctl"); OPTION_COMMON_VERSION: return version(); @@ -104,6 +62,9 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) { OPTION_COMMON_NO_PAGER: arg_pager_flags |= PAGER_DISABLE; break; + + OPTION_COMMON_INTROSPECT_CLI: + return introspect_cli(SD_JSON_FORMAT_OFF); } *ret_args = option_parser_get_args(&opts); diff --git a/src/portable/portablectl.c b/src/portable/portablectl.c index 58eb6f3724..eadb5068e9 100644 --- a/src/portable/portablectl.c +++ b/src/portable/portablectl.c @@ -1,6 +1,7 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #include "sd-bus.h" +#include "sd-json.h" #include "alloc-util.h" #include "ansi-color.h" @@ -16,10 +17,8 @@ #include "format-table.h" #include "fs-util.h" #include "glyph-util.h" -#include "help-util.h" #include "install.h" #include "main-func.h" -#include "options.h" #include "os-util.h" #include "pager.h" #include "parse-argument.h" @@ -52,6 +51,13 @@ static RuntimeScope arg_runtime_scope = RUNTIME_SCOPE_SYSTEM; STATIC_DESTRUCTOR_REGISTER(arg_extension_images, strv_freep); +COMMAND( + "portablectl\0", + "Attach or detach portable services in the local system.", + .man_pages = "portablectl.1\0", + .pager_flags = &arg_pager_flags, +); + static bool is_portable_managed(const char *unit) { return ENDSWITH_SET(unit, ".service", ".target", ".socket", ".path", ".timer"); } @@ -265,7 +271,7 @@ static int maybe_reload(sd_bus **bus) { } VERB_DEFAULT_NOARG(verb_list_images, "list", - "List available portable service images (default)"); + "List available portable service images"); static int verb_list_images(int argc, char *argv[], uintptr_t _data, void *userdata) { _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL; _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL; @@ -1528,40 +1534,7 @@ static int dump_profiles(void) { return 0; } -static int help(void) { - _cleanup_(table_unrefp) Table *verbs = NULL, *options = NULL; - int r; - - pager_open(arg_pager_flags); - - r = verbs_get_help_table(&verbs); - if (r < 0) - return r; - - r = option_parser_get_help_table(&options); - if (r < 0) - return r; - - (void) table_sync_column_widths(0, verbs, options); - - help_cmdline("[OPTIONS…] COMMAND …"); - help_abstract("Attach or detach portable services in the local system."); - - help_section("Commands"); - r = table_print_or_warn(verbs); - if (r < 0) - return r; - - help_section("Options"); - r = table_print_or_warn(options); - if (r < 0) - return r; - - help_man_page_reference("portablectl", "1"); - return 0; -} - -VERB_COMMON_HELP_HIDDEN(help); +VERB_COMMON_HELP_AUTO_HIDDEN("portablectl"); static int parse_argv(int argc, char *argv[], char ***remaining_args) { assert(argc >= 0); @@ -1575,7 +1548,7 @@ static int parse_argv(int argc, char *argv[], char ***remaining_args) { switch (c) { OPTION_COMMON_HELP: - return help(); + return command_print_help("portablectl"); OPTION_COMMON_VERSION: return version(); @@ -1692,6 +1665,9 @@ static int parse_argv(int argc, char *argv[], char ***remaining_args) { OPTION_LONG("system", NULL, /* help= */ NULL): arg_runtime_scope = RUNTIME_SCOPE_SYSTEM; break; + + OPTION_COMMON_INTROSPECT_CLI: + return introspect_cli(SD_JSON_FORMAT_OFF); } *remaining_args = option_parser_get_args(&opts); diff --git a/src/random-seed/random-seed-tool.c b/src/random-seed/random-seed-tool.c index 9f9439c8c5..dd8281f041 100644 --- a/src/random-seed/random-seed-tool.c +++ b/src/random-seed/random-seed-tool.c @@ -8,21 +8,19 @@ #include #include "sd-id128.h" +#include "sd-json.h" #include "alloc-util.h" #include "build.h" #include "errno-util.h" #include "fd-util.h" -#include "format-table.h" #include "fs-util.h" #include "initrd-util.h" #include "io-util.h" #include "log.h" #include "main-func.h" #include "mkdir.h" -#include "options.h" #include "parse-util.h" -#include "pretty-print.h" #include "random-util.h" #include "sha256.h" #include "string-util.h" @@ -45,6 +43,12 @@ typedef enum CreditEntropy { static SeedAction arg_action = _ACTION_INVALID; +COMMAND( + "systemd-random-seed\0", + "Load and save the system random seed at boot and shutdown.", + .man_pages = "systemd-random-seed.8\0", +); + static CreditEntropy may_credit(int seed_fd) { const char *e; int r; @@ -298,45 +302,6 @@ static int save_seed_file( return 0; } -static int help(void) { - _cleanup_free_ char *link = NULL; - _cleanup_(table_unrefp) Table *options = NULL, *verbs = NULL; - int r; - - r = terminal_urlify_man("systemd-random-seed", "8", &link); - if (r < 0) - return log_oom(); - - r = verbs_get_help_table(&verbs); - if (r < 0) - return r; - - r = option_parser_get_help_table(&options); - if (r < 0) - return r; - - (void) table_sync_column_widths(0, verbs, options); - - printf("%s [OPTIONS...] COMMAND\n" - "\n%sLoad and save the system random seed at boot and shutdown.%s\n" - "\nCommands:\n", - program_invocation_short_name, - ansi_highlight(), - ansi_normal()); - - r = table_print_or_warn(verbs); - if (r < 0) - return r; - - printf("\nOptions:\n"); - r = table_print_or_warn(options); - if (r < 0) - return r; - - printf("\nSee the %s for details.\n", link); - return 0; -} - VERB_FULL(verb_set_action, "load", NULL, VERB_ANY, 1, 0, ACTION_LOAD, "Load a random seed saved on disk into the kernel entropy pool"); VERB_FULL(verb_set_action, "save", NULL, VERB_ANY, 1, 0, ACTION_SAVE, @@ -357,10 +322,13 @@ static int parse_argv(int argc, char *argv[]) { switch (c) { OPTION_COMMON_HELP: - return help(); + return command_print_help("systemd-random-seed"); OPTION_COMMON_VERSION: return version(); + + OPTION_COMMON_INTROSPECT_CLI: + return introspect_cli(SD_JSON_FORMAT_OFF); } r = dispatch_verb(option_parser_get_args(&opts), NULL); diff --git a/src/report/report.c b/src/report/report.c index 82559fff38..86bf9c77d7 100644 --- a/src/report/report.c +++ b/src/report/report.c @@ -1,6 +1,7 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #include "sd-event.h" +#include "sd-json.h" #include "sd-varlink.h" #include "alloc-util.h" @@ -9,11 +10,9 @@ #include "dirent-util.h" #include "dlopen-note.h" #include "format-table.h" -#include "help-util.h" #include "json-util.h" #include "log.h" #include "main-func.h" -#include "options.h" #include "parse-argument.h" #include "path-lookup.h" #include "recurse-dir.h" @@ -56,6 +55,13 @@ STATIC_DESTRUCTOR_REGISTER(arg_cert, freep); STATIC_DESTRUCTOR_REGISTER(arg_trust, freep); STATIC_DESTRUCTOR_REGISTER(arg_extra_headers, strv_freep); +COMMAND( + "systemd-report\0", + "Acquire metrics from local sources.", + .man_pages = "systemd-report.1\0", + .pager_flags = &arg_pager_flags, +); + typedef struct LinkInfo { Context *context; sd_varlink *link; @@ -918,39 +924,7 @@ static int vl_server(void) { return 0; } -static int help(void) { - int r; - - _cleanup_(table_unrefp) Table *verbs = NULL, *options = NULL; - r = verbs_get_help_table(&verbs); - if (r < 0) - return r; - - r = option_parser_get_help_table(&options); - if (r < 0) - return r; - - (void) table_sync_column_widths(0, options, verbs); - - help_cmdline("[OPTIONS...] COMMAND ..."); - help_abstract("Acquire metrics from local sources."); - help_section("Commands"); - - r = table_print_or_warn(verbs); - if (r < 0) - return r; - - help_section("Options"); - - r = table_print_or_warn(options); - if (r < 0) - return r; - - help_man_page_reference("systemd-report", "1"); - return 0; -} - -VERB_COMMON_HELP_HIDDEN(help); +VERB_COMMON_HELP_AUTO_HIDDEN("systemd-report"); static int parse_argv(int argc, char *argv[], char ***ret_args) { int r; @@ -963,7 +937,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) { FOREACH_OPTION_OR_RETURN(c, &opts) switch (c) { OPTION_COMMON_HELP: - return help(); + return command_print_help("systemd-report"); OPTION_COMMON_VERSION: return version(); @@ -1048,6 +1022,9 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) { if (arg_sign_mode < 0) return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Failed to parse --sign= mode '%s'.", opts.arg); break; + + OPTION_COMMON_INTROSPECT_CLI: + return introspect_cli(arg_json_format_flags); } if ((arg_url || arg_key || arg_cert || arg_trust || arg_extra_headers) && !HAVE_LIBCURL) diff --git a/src/sbsign/sbsign.c b/src/sbsign/sbsign.c index bed464e8ce..dd50afb63f 100644 --- a/src/sbsign/sbsign.c +++ b/src/sbsign/sbsign.c @@ -2,8 +2,9 @@ #include +#include "sd-json.h" + #include "alloc-util.h" -#include "ansi-color.h" #include "ask-password-api.h" #include "authenticode.h" #include "build.h" @@ -13,16 +14,13 @@ #include "efi.h" #include "fd-util.h" #include "fileio.h" -#include "format-table.h" #include "fs-util.h" #include "install-file.h" #include "io-util.h" #include "log.h" #include "main-func.h" -#include "options.h" #include "parse-argument.h" #include "pe-binary.h" -#include "pretty-print.h" #include "stat-util.h" #include "string-util.h" #include "time-util.h" @@ -48,46 +46,13 @@ STATIC_DESTRUCTOR_REGISTER(arg_private_key_source, freep); STATIC_DESTRUCTOR_REGISTER(arg_signed_data, freep); STATIC_DESTRUCTOR_REGISTER(arg_signed_data_signature, freep); -static int help(void) { - _cleanup_free_ char *link = NULL; - _cleanup_(table_unrefp) Table *options = NULL, *verbs = NULL; - int r; +COMMAND( + "systemd-sbsign\0", + "Sign PE binaries for EFI Secure Boot.", + .man_pages = "systemd-sbsign.1\0", +); - r = terminal_urlify_man("systemd-sbsign", "1", &link); - if (r < 0) - return log_oom(); - - r = verbs_get_help_table(&verbs); - if (r < 0) - return r; - - r = option_parser_get_help_table(&options); - if (r < 0) - return r; - - (void) table_sync_column_widths(0, verbs, options); - - printf("%s [OPTIONS...] COMMAND ...\n" - "\n%sSign binaries for EFI Secure Boot%s\n" - "\n%sCommands:%s\n", - program_invocation_short_name, - ansi_highlight(), ansi_normal(), - ansi_underline(), ansi_normal()); - - r = table_print_or_warn(verbs); - if (r < 0) - return r; - - printf("\n%sOptions:%s\n", ansi_underline(), ansi_normal()); - r = table_print_or_warn(options); - if (r < 0) - return r; - - printf("\nSee the %s for details.\n", link); - return 0; -} - -VERB_COMMON_HELP_HIDDEN(help); +VERB_COMMON_HELP_AUTO_HIDDEN("systemd-sbsign"); static int parse_argv(int argc, char *argv[], char ***ret_args) { assert(argc >= 0); @@ -101,7 +66,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) { switch (c) { OPTION_COMMON_HELP: - return help(); + return command_print_help("systemd-sbsign"); OPTION_COMMON_VERSION: return version(); @@ -163,6 +128,9 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) { return r; break; + + OPTION_COMMON_INTROSPECT_CLI: + return introspect_cli(SD_JSON_FORMAT_OFF); } if (arg_private_key_source && !arg_certificate) diff --git a/src/sleep/sleep.c b/src/sleep/sleep.c index 24cd632111..d56d1ffc26 100644 --- a/src/sleep/sleep.c +++ b/src/sleep/sleep.c @@ -32,14 +32,11 @@ #include "exec-util.h" #include "fd-util.h" #include "fileio.h" -#include "format-table.h" #include "hibernate-util.h" #include "io-util.h" #include "log.h" #include "main-func.h" -#include "options.h" #include "os-util.h" -#include "pretty-print.h" #include "sleep-config.h" #include "special.h" #include "strv.h" @@ -48,6 +45,12 @@ #define DEFAULT_HIBERNATE_DELAY_USEC_NO_BATTERY (2 * USEC_PER_HOUR) +COMMAND( + "systemd-sleep\0", + "Suspend the system, hibernate the system, or both.", + .man_pages = "systemd-suspend.service.8\0", +); + #if ENABLE_EFI static int determine_auto_swap(sd_device *device) { _cleanup_(sd_device_unrefp) sd_device *origin = NULL; @@ -615,45 +618,6 @@ static int execute_s2h(const SleepConfig *sleep_config, SleepOperation main_oper return 0; } -static int help(void) { - _cleanup_free_ char *link = NULL; - _cleanup_(table_unrefp) Table *options = NULL, *verbs = NULL; - int r; - - r = terminal_urlify_man("systemd-suspend.service", "8", &link); - if (r < 0) - return log_oom(); - - r = verbs_get_help_table(&verbs); - if (r < 0) - return r; - - r = option_parser_get_help_table(&options); - if (r < 0) - return r; - - (void) table_sync_column_widths(0, verbs, options); - - printf("%s [OPTIONS…] COMMAND\n" - "\n%sSuspend the system, hibernate the system, or both.%s\n" - "\nCommands:\n", - program_invocation_short_name, - ansi_highlight(), - ansi_normal()); - - r = table_print_or_warn(verbs); - if (r < 0) - return r; - - printf("\nOptions:\n"); - r = table_print_or_warn(options); - if (r < 0) - return r; - - printf("\nSee the %s for details.\n", link); - return 0; -} - VERB_FULL(verb_operate, "suspend", NULL, VERB_ANY, 1, 0, SLEEP_SUSPEND, "Suspend the system"); VERB_FULL(verb_operate, "hibernate", NULL, VERB_ANY, 1, 0, SLEEP_HIBERNATE, @@ -735,10 +699,13 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) { switch (c) { OPTION_COMMON_HELP: - return help(); + return command_print_help("systemd-sleep"); OPTION_COMMON_VERSION: return version(); + + OPTION_COMMON_INTROSPECT_CLI: + return introspect_cli(SD_JSON_FORMAT_OFF); } *ret_args = option_parser_get_args(&opts); diff --git a/src/ssh-generator/ssh-issue.c b/src/ssh-generator/ssh-issue.c index dd2b2370b4..1d87624aae 100644 --- a/src/ssh-generator/ssh-issue.c +++ b/src/ssh-generator/ssh-issue.c @@ -3,18 +3,16 @@ #include #include +#include "sd-json.h" + #include "alloc-util.h" -#include "ansi-color.h" #include "build.h" #include "fd-util.h" -#include "format-table.h" #include "fs-util.h" #include "log.h" #include "main-func.h" #include "mkdir.h" -#include "options.h" #include "parse-argument.h" -#include "pretty-print.h" #include "ssh-util.h" #include "string-util.h" #include "strv.h" @@ -27,6 +25,12 @@ static bool arg_issue_stdout = false; STATIC_DESTRUCTOR_REGISTER(arg_issue_path, freep); +COMMAND( + "systemd-ssh-issue\0", + "Create or remove the /run/issue.d/ file announcing the SSH VSOCK address.", + .man_pages = "systemd-ssh-issue.1\0", +); + static int acquire_cid(unsigned *ret_cid) { int r; @@ -113,47 +117,6 @@ static int verb_rm_vsock(int argc, char *argv[], uintptr_t _data, void *_userdat return 0; } -static int help(void) { - _cleanup_free_ char *link = NULL; - _cleanup_(table_unrefp) Table *options = NULL, *verbs = NULL; - int r; - - r = terminal_urlify_man("systemd-ssh-issue", "1", &link); - if (r < 0) - return log_oom(); - - r = verbs_get_help_table(&verbs); - if (r < 0) - return r; - - r = option_parser_get_help_table(&options); - if (r < 0) - return r; - - (void) table_sync_column_widths(0, verbs, options); - - printf("%s [OPTIONS...] COMMAND\n" - "\n%sCreate/remove ssh /run/issue.d/ file reporting VSOCK address.%s\n" - "\n%sCommands:%s\n", - program_invocation_short_name, - ansi_highlight(), ansi_normal(), - ansi_underline(), ansi_normal()); - - r = table_print_or_warn(verbs); - if (r < 0) - return r; - - printf("\n%sOptions:%s\n", - ansi_underline(), ansi_normal()); - - r = table_print_or_warn(options); - if (r < 0) - return r; - - printf("\nSee the %s for details.\n", link); - return 0; -} - static int parse_argv(int argc, char *argv[], char ***ret_args) { assert(argc >= 0); assert(argv); @@ -167,7 +130,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) { switch (c) { OPTION_COMMON_HELP: - return help(); + return command_print_help("systemd-ssh-issue"); OPTION_COMMON_VERSION: return version(); @@ -191,6 +154,9 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) { arg_issue_stdout = false; break; + + OPTION_COMMON_INTROSPECT_CLI: + return introspect_cli(SD_JSON_FORMAT_OFF); } if (!arg_issue_path && !arg_issue_stdout) { diff --git a/src/userdb/meson.build b/src/userdb/meson.build index c25c40bc0a..3ab6ce7934 100644 --- a/src/userdb/meson.build +++ b/src/userdb/meson.build @@ -16,6 +16,7 @@ executables += [ }, executable_template + { 'name' : 'userdbctl', + 'public' : true, 'conditions' : ['ENABLE_USERDB'], 'sources' : files('userdbctl.c'), }, diff --git a/src/userdb/userdbctl.c b/src/userdb/userdbctl.c index 14c3675ea2..cf185d924f 100644 --- a/src/userdb/userdbctl.c +++ b/src/userdb/userdbctl.c @@ -3,6 +3,8 @@ #include #include +#include "sd-json.h" + #include "alloc-util.h" #include "ansi-color.h" #include "bitfield.h" @@ -20,13 +22,11 @@ #include "format-util.h" #include "fs-util.h" #include "glyph-util.h" -#include "help-util.h" #include "io-util.h" #include "json-util.h" #include "log.h" #include "main-func.h" #include "mkdir.h" -#include "options.h" #include "pager.h" #include "parse-argument.h" #include "recurse-dir.h" @@ -70,6 +70,13 @@ static sd_json_variant *arg_from_file = NULL; STATIC_DESTRUCTOR_REGISTER(arg_services, strv_freep); STATIC_DESTRUCTOR_REGISTER(arg_from_file, sd_json_variant_unrefp); +COMMAND( + "userdbctl\0", + "Show user and group information.", + .man_pages = "userdbctl.1\0", + .pager_flags = &arg_pager_flags, +); + static const char *output_table[_OUTPUT_MAX] = { [OUTPUT_CLASSIC] = "classic", [OUTPUT_TABLE] = "table", @@ -1551,40 +1558,7 @@ static int verb_load_credentials(int argc, char *argv[], uintptr_t _data, void * return r; } -static int help(void) { - _cleanup_(table_unrefp) Table *verbs = NULL, *options = NULL; - int r; - - r = verbs_get_help_table(&verbs); - if (r < 0) - return r; - - r = option_parser_get_help_table(&options); - if (r < 0) - return r; - - (void) table_sync_column_widths(0, verbs, options); - - pager_open(arg_pager_flags); - - help_cmdline("[OPTIONS…] COMMAND …"); - help_abstract("Show user and group information."); - - help_section("Commands"); - r = table_print_or_warn(verbs); - if (r < 0) - return r; - - help_section("Options"); - r = table_print_or_warn(options); - if (r < 0) - return r; - - help_man_page_reference("userdbctl", "1"); - return 0; -} - -VERB_COMMON_HELP_HIDDEN(help); +VERB_COMMON_HELP_AUTO_HIDDEN("userdbctl"); static int parse_from_file(const char *arg, sd_json_variant **ret) { sd_json_variant *v = NULL; @@ -1638,7 +1612,7 @@ static int parse_argv(int argc, char *argv[], char ***remaining_args) { switch (c) { OPTION_COMMON_HELP: - return help(); + return command_print_help("userdbctl"); OPTION_COMMON_VERSION: return version(); @@ -1819,6 +1793,9 @@ static int parse_argv(int argc, char *argv[], char ***remaining_args) { json_variant_unref_and_replace(arg_from_file, v); break; } + + OPTION_COMMON_INTROSPECT_CLI: + return introspect_cli(arg_json_format_flags); } /* When --chain was seen, stop parsing switches after the second positional argument: diff --git a/test/units/TEST-74-AUX-UTILS.introspect-cli.sh b/test/units/TEST-74-AUX-UTILS.introspect-cli.sh index a2b8983efa..b53741aa25 100755 --- a/test/units/TEST-74-AUX-UTILS.introspect-cli.sh +++ b/test/units/TEST-74-AUX-UTILS.introspect-cli.sh @@ -11,7 +11,15 @@ export SYSTEMD_PAGER=cat # A smoke test for the introspection code INTROSPECTABLE=( + busctl + coredumpctl homectl + hostnamectl + importctl + localectl + networkctl + oomctl + portablectl resolvectl systemd-ac-power systemd-analyze @@ -19,16 +27,20 @@ INTROSPECTABLE=( systemd-backlight systemd-battery-check systemd-binfmt + systemd-bless-boot systemd-boot-check-no-failures systemd-bsod systemd-cat systemd-cgls systemd-cgtop systemd-clonesetup + systemd-creds + systemd-cryptsetup systemd-delta systemd-detect-virt systemd-dissect systemd-escape + systemd-factory-reset systemd-firstboot systemd-growfs systemd-hibernate-resume @@ -39,6 +51,7 @@ INTROSPECTABLE=( systemd-journal-gatewayd systemd-journal-remote systemd-journal-upload + systemd-keyutil systemd-modules-load systemd-mute-console systemd-network-generator @@ -48,8 +61,13 @@ INTROSPECTABLE=( systemd-path systemd-pcrextend systemd-pty-forward + systemd-random-seed + systemd-report + systemd-sbsign + systemd-sleep systemd-socket-activate systemd-socket-proxyd + systemd-ssh-issue systemd-stdio-bridge systemd-storage-block systemd-storage-fs @@ -62,6 +80,7 @@ INTROSPECTABLE=( systemd-validatefs systemd-veritysetup timedatectl + userdbctl varlinkctl ) @@ -77,6 +96,11 @@ for i in "${INTROSPECTABLE[@]}"; do $i --introspect-cli | jq -e \ 'any(.commands[]; [.options[].names[-1]] | contains(["--help", "--version", "--introspect-cli"]))' $i --intro | grep -e --help + + # If the tool has a "help" verb, it must work too + if $i --introspect-cli | jq -e 'any(.commands[]; (.verbs // []) | any(.names[0] == "help"))' >/dev/null; then + $i help >/dev/null + fi done # systemd-hwdb defines verbs, check that they are described