]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
doveadm: Added "service stop" command to stop specific services.
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Tue, 28 Jun 2016 20:12:03 +0000 (23:12 +0300)
committerGitLab <gitlab@git.dovecot.net>
Wed, 29 Jun 2016 16:15:03 +0000 (19:15 +0300)
src/doveadm/Makefile.am
src/doveadm/doveadm-cmd.c
src/doveadm/doveadm-cmd.h
src/doveadm/doveadm-service.c [new file with mode: 0644]

index 4f4da33e409b3640d7e8dc489390ed4cc5c3de22..a60100a2334b2e385fd5c7d989412ead56881e54 100644 (file)
@@ -75,6 +75,7 @@ doveadm_common_cmds = \
        doveadm-penalty.c \
        doveadm-proxy.c \
        doveadm-replicator.c \
+       doveadm-service.c \
        doveadm-sis.c \
        doveadm-stats.c \
        doveadm-who.c
index f43e67459aa12f493d17bbb0aca63576153f3498..368a58a817e3a61a49e753652fcfc5d5093c0fa8 100644 (file)
@@ -19,6 +19,7 @@ static struct doveadm_cmd *doveadm_commands[] = {
 };
 
 static struct doveadm_cmd_ver2 *doveadm_commands_ver2[] = {
+       &doveadm_cmd_service_stop_ver2,
        &doveadm_cmd_stop_ver2,
        &doveadm_cmd_reload_ver2,
        &doveadm_cmd_stats_dump_ver2,
index 3c677daaa7b65b841ae5665f416ca8c90930e2e5..19a46cdedf4033b5cb76f8d0a1bddeff2ab8ffec 100644 (file)
@@ -146,6 +146,7 @@ bool doveadm_cmd_param_istream(const struct doveadm_cmd_context *cctx,
 void doveadm_cmd_params_clean(ARRAY_TYPE(doveadm_cmd_param_arr_t) *pargv);
 void doveadm_cmd_params_null_terminate_arrays(ARRAY_TYPE(doveadm_cmd_param_arr_t) *pargv);
 
+extern struct doveadm_cmd_ver2 doveadm_cmd_service_stop_ver2;
 extern struct doveadm_cmd_ver2 doveadm_cmd_stop_ver2;
 extern struct doveadm_cmd_ver2 doveadm_cmd_reload_ver2;
 extern struct doveadm_cmd_ver2 doveadm_cmd_stats_reset_ver2;
diff --git a/src/doveadm/doveadm-service.c b/src/doveadm/doveadm-service.c
new file mode 100644 (file)
index 0000000..58dd76b
--- /dev/null
@@ -0,0 +1,60 @@
+/* Copyright (c) 2016 Dovecot authors, see the included COPYING file */
+
+#include "lib.h"
+#include "str.h"
+#include "write-full.h"
+#include "istream.h"
+#include "doveadm.h"
+
+#include <unistd.h>
+
+static void cmd_service_stop(int argc, char *argv[])
+{
+       const char *path, *line;
+       int fd;
+
+       if (argc == 1)
+               help_ver2(&doveadm_cmd_service_stop_ver2);
+
+       path = t_strconcat(doveadm_settings->base_dir, "/master", NULL);
+       fd = net_connect_unix(path);
+       if (fd == -1)
+               i_fatal("net_connect_unix(%s) failed: %m", path);
+       net_set_nonblock(fd, FALSE);
+
+       string_t *cmd = t_str_new(128);
+       str_append(cmd, "VERSION\tmaster-client\t1\t0\nSTOP");
+       for (int i = 1; i < argc; i++) {
+               str_append_c(cmd, '\t');
+               str_append(cmd, argv[i]);
+       }
+       str_append_c(cmd, '\n');
+       if (write_full(fd, str_data(cmd), str_len(cmd)) < 0)
+               i_error("write(%s) failed: %m", path);
+
+       alarm(5);
+       struct istream *input = i_stream_create_fd(fd, IO_BLOCK_SIZE);
+       if (i_stream_read_next_line(input) == NULL ||
+           (line = i_stream_read_next_line(input)) == NULL) {
+               i_error("read(%s) failed: %s", path, i_stream_get_error(input));
+               doveadm_exit_code = EX_TEMPFAIL;
+       } else if (line[0] == '-') {
+               doveadm_exit_code = DOVEADM_EX_NOTFOUND;
+               i_error("%s", line+1);
+       } else if (line[0] != '+') {
+               i_error("Unexpected input from %s: %s", path, line);
+               doveadm_exit_code = EX_TEMPFAIL;
+       }
+       alarm(0);
+       i_stream_destroy(&input);
+       i_close_fd(&fd);
+}
+
+struct doveadm_cmd_ver2 doveadm_cmd_service_stop_ver2 = {
+       .old_cmd = cmd_service_stop,
+       .name = "service stop",
+       .usage = "<service> [<service> [...]]",
+DOVEADM_CMD_PARAMS_START
+DOVEADM_CMD_PARAM('\0', "service", CMD_PARAM_ARRAY, CMD_PARAM_FLAG_POSITIONAL)
+DOVEADM_CMD_PARAMS_END
+};