]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
doveadm kick: Change output format to only print number of connections kicked
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Thu, 13 Jan 2022 16:52:22 +0000 (18:52 +0200)
committerTimo Sirainen <timo.sirainen@open-xchange.com>
Tue, 8 Feb 2022 09:48:24 +0000 (10:48 +0100)
Having the list of usernames kicked is a bit excessive and it also hides
how many connections were kicked.

The output also wasn't correct when kicking based on alt-username, because
it only printed the alt-username rather than the real usernames.

src/doveadm/doveadm-kick.c

index 7b25557bef2e4438c6678099b7bdcb4cb4ac95a0..b4ebcc2ef81cb035350063a97a69edd43a19d047 100644 (file)
@@ -22,41 +22,9 @@ struct kick_context {
        struct who_context who;
        enum doveadm_client_type conn_type;
        ARRAY(struct kick_session) kicks;
-       ARRAY(const char *) kicked_users;
-
-       bool kicked;
+       unsigned int kicked_count;
 };
 
-static void kick_print_kicked(struct kick_context *ctx)
-{
-       unsigned int i, count;
-       const char *const *users;
-       bool cli = (ctx->conn_type == DOVEADM_CONNECTION_TYPE_CLI);
-
-       if (array_count(&ctx->kicked_users) == 0) {
-               if (cli)
-                       printf("no users kicked\n");
-               doveadm_exit_code = DOVEADM_EX_NOTFOUND;
-               return;
-       }
-
-       if (cli)
-               printf("kicked connections from the following users:\n");
-
-       array_sort(&ctx->kicked_users, i_strcmp_p);
-       users = array_get(&ctx->kicked_users, &count);
-       doveadm_print(users[0]);
-       for (i = 1; i < count; i++) {
-               if (strcmp(users[i-1], users[i]) != 0)
-                       doveadm_print(users[i]);
-       }
-
-       doveadm_print_flush();
-
-       if (cli)
-               printf("\n");
-}
-
 static void kick_user_anvil_callback(const char *reply, void *context)
 {
        struct kick_context *ctx = context;
@@ -65,8 +33,8 @@ static void kick_user_anvil_callback(const char *reply, void *context)
        if (reply != NULL) {
                if (str_to_uint(reply, &count) < 0)
                        i_error("Unexpected reply from anvil: %s", reply);
-               else if (count > 0)
-                       ctx->kicked = TRUE;
+               else
+                       ctx->kicked_count += count;
        }
        io_loop_stop(current_ioloop);
 }
@@ -105,9 +73,6 @@ static void kick_users_via_anvil(struct kick_context *ctx)
                return;
        }
 
-       p_array_init(&ctx->kicked_users, ctx->who.pool,
-                    array_count(&ctx->kicks));
-
        array_foreach(&ctx->kicks, session) {
                str_truncate(cmd, 0);
                if (ctx->who.filter.alt_username_field == NULL) {
@@ -125,16 +90,13 @@ static void kick_users_via_anvil(struct kick_context *ctx)
                        str_append_tabescaped(cmd, session->username);
                }
 
-               ctx->kicked = FALSE;
                anvil_client_query(anvil, str_c(cmd),
                                   kick_user_anvil_callback, ctx);
                io_loop_run(current_ioloop);
-               if (ctx->kicked)
-                       array_push_back(&ctx->kicked_users, &session->username);
        }
        anvil_client_deinit(&anvil);
 
-       kick_print_kicked(ctx);
+       doveadm_print(dec2str(ctx->kicked_count));
 }
 
 static void cmd_kick(struct doveadm_cmd_context *cctx)
@@ -161,8 +123,8 @@ static void cmd_kick(struct doveadm_cmd_context *cctx)
        }
 
        doveadm_print_init(DOVEADM_PRINT_TYPE_FORMATTED);
-       doveadm_print_formatted_set_format("%{result} ");
-       doveadm_print_header_simple("result");
+       doveadm_print_formatted_set_format("%{count} connections kicked\n");
+       doveadm_print_header_simple("count");
 
        if (ctx.who.filter.net_bits == 0 &&
            strpbrk(ctx.who.filter.username, "*?") == NULL) {