]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
loginctl: add --json= and -j, decouple list-* from --output=
authorMike Yuan <me@yhndnzj.com>
Tue, 16 Jan 2024 10:07:40 +0000 (18:07 +0800)
committerMike Yuan <me@yhndnzj.com>
Wed, 17 Jan 2024 03:30:04 +0000 (11:30 +0800)
--output= is documented to only affect journal output in *-status.
Let's use --json= and -j standard options for list-* instead.

man/loginctl.xml
shell-completion/bash/loginctl
src/login/loginctl.c

index 8a093c6e2982d71dd4d474973242904a8adeced6..099de1dfe5e961fa8587a561186832bda0d2f924 100644 (file)
@@ -50,7 +50,8 @@
       <varlistentry>
         <term><command>list-sessions</command></term>
 
-        <listitem><para>List current sessions.</para></listitem>
+        <listitem><para>List current sessions. The JSON format output can be toggled using <option>--json=</option>
+        or <option>-j</option> option.</para></listitem>
       </varlistentry>
 
       <varlistentry>
       <varlistentry>
         <term><command>list-users</command></term>
 
-        <listitem><para>List currently logged in users.
-        </para></listitem>
+        <listitem><para>List currently logged in users. The JSON format output can be toggled using
+        <option>--json=</option> or <option>-j</option> option.</para></listitem>
       </varlistentry>
 
       <varlistentry>
       <varlistentry>
         <term><command>list-seats</command></term>
 
-        <listitem><para>List currently available seats on the local
-        system.</para></listitem>
+        <listitem><para>List currently available seats on the local system. The JSON format output can be
+        toggled using <option>--json=</option> or <option>-j</option> option.</para></listitem>
       </varlistentry>
 
       <varlistentry>
 
       <xi:include href="standard-options.xml" xpointer="no-pager" />
       <xi:include href="standard-options.xml" xpointer="no-legend" />
+      <xi:include href="standard-options.xml" xpointer="json" />
+      <xi:include href="standard-options.xml" xpointer="j" />
       <xi:include href="standard-options.xml" xpointer="help" />
       <xi:include href="standard-options.xml" xpointer="version" />
     </variablelist>
index b307e428bebb4142f2d74db96fdcf48c5b49a077..e6c476742b38dd4c3f783e9928e8c702af7f9622 100644 (file)
@@ -42,9 +42,9 @@ _loginctl () {
 
     local -A OPTS=(
         [STANDALONE]='--all -a --help -h --no-pager --version
-                      --no-legend --no-ask-password -l --full --value'
+                      --no-legend --no-ask-password -l --full --value -j'
         [ARG]='--host -H --kill-whom --property -p --signal -s -M --machine
-                      -n --lines -o --output -P'
+                      -n --lines -o --output -P --json'
     )
 
     if __contains_word "$prev" ${OPTS[ARG]}; then
@@ -68,6 +68,9 @@ _loginctl () {
             --output|-o)
                 comps=$( loginctl --output=help 2>/dev/null )
                 ;;
+            --json)
+                comps=$( loginctl --json=help 2>/dev/null )
+                ;;
         esac
         COMPREPLY=( $(compgen -W '$comps' -- "$cur") )
         return 0
index 04ba845cbc45b0165766756bdaeb4103761489e0..b9c34cfc0f71a3a4f64ae167cd78714d3c762970 100644 (file)
@@ -44,6 +44,7 @@ static BusPrintPropertyFlags arg_print_flags = 0;
 static bool arg_full = false;
 static PagerFlags arg_pager_flags = 0;
 static bool arg_legend = true;
+static JsonFormatFlags arg_json_format_flags = JSON_FORMAT_OFF;
 static const char *arg_kill_whom = NULL;
 static int arg_signal = SIGTERM;
 static BusTransport arg_transport = BUS_TRANSPORT_LOCAL;
@@ -113,32 +114,25 @@ static OutputFlags get_output_flags(void) {
                 colors_enabled() * OUTPUT_COLOR;
 }
 
-static int show_table(Table *table, const char *word) {
+static int list_table_print(Table *table, const char *type) {
         int r;
 
         assert(table);
-        assert(word);
-
-        if (!table_isempty(table) || OUTPUT_MODE_IS_JSON(arg_output)) {
-                r = table_set_sort(table, (size_t) 0);
-                if (r < 0)
-                        return table_log_sort_error(r);
+        assert(type);
 
-                table_set_header(table, arg_legend);
+        r = table_set_sort(table, (size_t) 0);
+        if (r < 0)
+                return table_log_sort_error(r);
 
-                if (OUTPUT_MODE_IS_JSON(arg_output))
-                        r = table_print_json(table, NULL, output_mode_to_json_format_flags(arg_output) | JSON_FORMAT_COLOR_AUTO);
-                else
-                        r = table_print(table, NULL);
-                if (r < 0)
-                        return table_log_print_error(r);
-        }
+        r = table_print_with_pager(table, arg_json_format_flags, arg_pager_flags, arg_legend);
+        if (r < 0)
+                return r;
 
         if (arg_legend) {
                 if (table_isempty(table))
-                        printf("No %s.\n", word);
+                        printf("No %s.\n", type);
                 else
-                        printf("\n%zu %s listed.\n", table_get_rows(table) - 1, word);
+                        printf("\n%zu %s listed.\n", table_get_rows(table) - 1, type);
         }
 
         return 0;
@@ -283,8 +277,6 @@ static int list_sessions(int argc, char *argv[], void *userdata) {
 
         assert(argv);
 
-        pager_open(arg_pager_flags);
-
         r = bus_call_method(bus, bus_login_mgr, "ListSessionsEx", &error, &reply, NULL);
         if (r < 0) {
                 if (sd_bus_error_has_name(&error, SD_BUS_ERROR_UNKNOWN_METHOD)) {
@@ -314,7 +306,7 @@ static int list_sessions(int argc, char *argv[], void *userdata) {
         if (r < 0)
                 return r;
 
-        return show_table(table, "sessions");
+        return list_table_print(table, "sessions");
 }
 
 static int list_users(int argc, char *argv[], void *userdata) {
@@ -333,8 +325,6 @@ static int list_users(int argc, char *argv[], void *userdata) {
 
         assert(argv);
 
-        pager_open(arg_pager_flags);
-
         r = bus_call_method(bus, bus_login_mgr, "ListUsers", &error, &reply, NULL);
         if (r < 0)
                 return log_error_errno(r, "Failed to list users: %s", bus_error_message(&error, r));
@@ -392,7 +382,7 @@ static int list_users(int argc, char *argv[], void *userdata) {
         if (r < 0)
                 return bus_log_parse_error(r);
 
-        return show_table(table, "users");
+        return list_table_print(table, "users");
 }
 
 static int list_seats(int argc, char *argv[], void *userdata) {
@@ -404,8 +394,6 @@ static int list_seats(int argc, char *argv[], void *userdata) {
 
         assert(argv);
 
-        pager_open(arg_pager_flags);
-
         r = bus_call_method(bus, bus_login_mgr, "ListSeats", &error, &reply, NULL);
         if (r < 0)
                 return log_error_errno(r, "Failed to list seats: %s", bus_error_message(&error, r));
@@ -438,7 +426,7 @@ static int list_seats(int argc, char *argv[], void *userdata) {
         if (r < 0)
                 return bus_log_parse_error(r);
 
-        return show_table(table, "seats");
+        return list_table_print(table, "seats");
 }
 
 static int show_unit_cgroup(
@@ -1551,6 +1539,7 @@ static int parse_argv(int argc, char *argv[]) {
                 ARG_VALUE,
                 ARG_NO_PAGER,
                 ARG_NO_LEGEND,
+                ARG_JSON,
                 ARG_KILL_WHOM,
                 ARG_NO_ASK_PASSWORD,
         };
@@ -1564,6 +1553,7 @@ static int parse_argv(int argc, char *argv[]) {
                 { "full",            no_argument,       NULL, 'l'                 },
                 { "no-pager",        no_argument,       NULL, ARG_NO_PAGER        },
                 { "no-legend",       no_argument,       NULL, ARG_NO_LEGEND       },
+                { "json",            required_argument, NULL, ARG_JSON            },
                 { "kill-whom",       required_argument, NULL, ARG_KILL_WHOM       },
                 { "signal",          required_argument, NULL, 's'                 },
                 { "host",            required_argument, NULL, 'H'                 },
@@ -1579,7 +1569,7 @@ static int parse_argv(int argc, char *argv[]) {
         assert(argc >= 0);
         assert(argv);
 
-        while ((c = getopt_long(argc, argv, "hp:P:als:H:M:n:o:", options, NULL)) >= 0)
+        while ((c = getopt_long(argc, argv, "hp:P:als:H:M:n:o:j", options, NULL)) >= 0)
 
                 switch (c) {
 
@@ -1633,7 +1623,19 @@ static int parse_argv(int argc, char *argv[]) {
                         if (arg_output < 0)
                                 return log_error_errno(arg_output, "Unknown output '%s'.", optarg);
 
-                        if (OUTPUT_MODE_IS_JSON(arg_output))
+                        break;
+
+                case 'j':
+                        arg_json_format_flags = JSON_FORMAT_PRETTY_AUTO|JSON_FORMAT_COLOR_AUTO;
+                        arg_legend = false;
+                        break;
+
+                case ARG_JSON:
+                        r = parse_json_argument(optarg, &arg_json_format_flags);
+                        if (r <= 0)
+                                return r;
+
+                        if (!FLAGS_SET(arg_json_format_flags, JSON_FORMAT_OFF))
                                 arg_legend = false;
 
                         break;