doveadm-director.c revision bfef6891565ff9018ac92add6eae401e9352c657
02c335c23bf5fa225a467c19f2c063fb0dc7b8c3Timo Sirainen/* Copyright (c) 2009-2016 Dovecot authors, see the included COPYING file */
09060303d565e15d54e42b4ef722f9d3c26f5336Timo Sirainen const char *tag;
264a0f242067fb14df778d2fef181ad0045ad0eaAki Tuomi const char *user;
264a0f242067fb14df778d2fef181ad0045ad0eaAki Tuomi const char *host;
264a0f242067fb14df778d2fef181ad0045ad0eaAki Tuomi const char *ip;
264a0f242067fb14df778d2fef181ad0045ad0eaAki Tuomi const char *port;
a75d470c9223a75801418fcdda258885c36317e0Timo SirainenHASH_TABLE_DEFINE_TYPE(user_list, void *, struct user_list *);
5d16ff58f96527093b49597e8d6168f833e0a52eAki Tuomistatic void director_cmd_help(const struct doveadm_cmd_ver2 *);
264a0f242067fb14df778d2fef181ad0045ad0eaAki Tuomistatic int director_get_host(const char *host, struct ip_addr **ips_r,
264a0f242067fb14df778d2fef181ad0045ad0eaAki Tuomi unsigned int *ips_count_r) ATTR_WARN_UNUSED_RESULT;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainendirector_send(struct director_context *ctx, const char *data)
8338066be35c696b59fa9aefdc07042cb0797197Timo Sirainen if (write_full(i_stream_get_fd(ctx->input), data, strlen(data)) < 0)
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen i_fatal("write(%s) failed: %m", ctx->socket_path);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenstatic void director_connect(struct director_context *ctx)
f158d9a303bb15a6848ca276c9391c7ca52e452bTimo Sirainen#define DIRECTOR_HANDSHAKE "VERSION\tdirector-doveadm\t1\t0\n"
bace943c67e6cd14ce6c994f533d82a3caad5bf1Timo Sirainen ctx->input = i_stream_create_fd_autoclose(&fd, (size_t)-1);
0f3d4fbcf88e2ffd674893aed8cc1288fe17d290Timo Sirainen i_fatal("read(%s) failed: %s", ctx->socket_path,
224414073c72d77a09a77b4dd71500ada5690802Timo Sirainen i_fatal("read(%s) timed out (is director configured?)",
f158d9a303bb15a6848ca276c9391c7ca52e452bTimo Sirainen if (!version_string_verify(line, "director-doveadm", 1)) {
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen "%s not a compatible director-doveadm socket",
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenstatic void director_disconnect(struct director_context *ctx)
0f3d4fbcf88e2ffd674893aed8cc1288fe17d290Timo Sirainen i_fatal("read(%s) failed: %s", ctx->socket_path,
5d16ff58f96527093b49597e8d6168f833e0a52eAki Tuomicmd_director_init(struct doveadm_cmd_context *cctx)
5d16ff58f96527093b49597e8d6168f833e0a52eAki Tuomi if (!doveadm_cmd_param_str(cctx, "socket-path", &(ctx->socket_path)))
264a0f242067fb14df778d2fef181ad0045ad0eaAki Tuomi ctx->socket_path = t_strconcat(doveadm_settings->base_dir,
5d16ff58f96527093b49597e8d6168f833e0a52eAki Tuomi if (!doveadm_cmd_param_bool(cctx, "user-map", &(ctx->user_map)))
5d16ff58f96527093b49597e8d6168f833e0a52eAki Tuomi if (!doveadm_cmd_param_bool(cctx, "hash-map", &(ctx->hash_map)))
5d16ff58f96527093b49597e8d6168f833e0a52eAki Tuomi if (!doveadm_cmd_param_bool(cctx, "force-flush", &(ctx->force_flush)))
5d16ff58f96527093b49597e8d6168f833e0a52eAki Tuomi if (!doveadm_cmd_param_istream(cctx, "users-file", &(ctx->users_input)))
5d16ff58f96527093b49597e8d6168f833e0a52eAki Tuomi if (!doveadm_cmd_param_str(cctx, "tag", &(ctx->tag)))
5d16ff58f96527093b49597e8d6168f833e0a52eAki Tuomi if (!doveadm_cmd_param_str(cctx, "user", &(ctx->user)))
5d16ff58f96527093b49597e8d6168f833e0a52eAki Tuomi if (!doveadm_cmd_param_str(cctx, "host", &(ctx->host)))
5d16ff58f96527093b49597e8d6168f833e0a52eAki Tuomi if (!doveadm_cmd_param_str(cctx, "ip", &(ctx->ip)))
5d16ff58f96527093b49597e8d6168f833e0a52eAki Tuomi if (!doveadm_cmd_param_str(cctx, "port", &(ctx->port)))
5d16ff58f96527093b49597e8d6168f833e0a52eAki Tuomi if (!doveadm_cmd_param_str(cctx, "vhost-count", &(ctx->vhost_count)))
bfef6891565ff9018ac92add6eae401e9352c657Timo Sirainen if (!doveadm_cmd_param_str(cctx, "passdb-field", &(ctx->passdb_field)))
264a0f242067fb14df778d2fef181ad0045ad0eaAki Tuomicmd_director_status_user(struct director_context *ctx)
edd318d5866ac3fbc6e8df28fb24a4dfef93c884Timo Sirainen unsigned int expires;
264a0f242067fb14df778d2fef181ad0045ad0eaAki Tuomi director_send(ctx, t_strdup_printf("USER-LOOKUP\t%s\t%s\n", ctx->user,
264a0f242067fb14df778d2fef181ad0045ad0eaAki Tuomi doveadm_print_formatted_set_format("Current: %{status} (expires %{expires})\n" \
264a0f242067fb14df778d2fef181ad0045ad0eaAki Tuomi "Hashed: %{hashed}\n" \
264a0f242067fb14df778d2fef181ad0045ad0eaAki Tuomi "Initial config: %{initial-config}\n");
5d16ff58f96527093b49597e8d6168f833e0a52eAki Tuomistatic void cmd_director_status(struct doveadm_cmd_context *cctx)
68787d48554f497e711ff66a087ab31f990a11e9Timo Sirainen doveadm_print_header_simple("mail server ip");
a5ddfd7a8b473f73135b93d5e081e470a87f0f7eTimo Sirainen doveadm_print_header("state-changed", "state changed", 0);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen while ((line = i_stream_read_next_line(ctx->input)) != NULL) {
a5ddfd7a8b473f73135b93d5e081e470a87f0f7eTimo Sirainen /* ip vhosts users tag updown updown-ts */
a5ddfd7a8b473f73135b93d5e081e470a87f0f7eTimo Sirainen doveadm_print(args[4][0] == 'D' ? "down" : "up");
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen i_error("Director disconnected unexpectedly");
678d0463849ba777106eb7875f27db07a5d8e3dfTimo Sirainenuser_list_add(const char *username, pool_t pool,
e1550f6a31306246a8499f5c9ca876096cbbeae9Timo Sirainen user_hash = mail_user_hash(username, doveadm_settings->director_username_hash);
a75d470c9223a75801418fcdda258885c36317e0Timo Sirainen old_user = hash_table_lookup(users, POINTER_CAST(user_hash));
c224fff79d18480a65e9b4504b891b8ea176f5b1Timo Sirainen hash_table_update(users, POINTER_CAST(user_hash), user);
0591dbf3c6edb9ad502df0e57a0a458896e632a1Timo Sirainenuserdb_get_user_list(const char *auth_socket_path, pool_t pool,
caa1fa99c79c568ce2e42477bc169e7024fb220bTimo Sirainen auth_socket_path = t_strconcat(doveadm_settings->base_dir,
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen ctx = auth_master_user_list_init(conn, "", NULL);
0591dbf3c6edb9ad502df0e57a0a458896e632a1Timo Sirainen while ((username = auth_master_user_list_next(ctx)) != NULL)
264a0f242067fb14df778d2fef181ad0045ad0eaAki Tuomiuser_file_get_user_list(struct istream *input, pool_t pool,
0591dbf3c6edb9ad502df0e57a0a458896e632a1Timo Sirainen while ((username = i_stream_read_next_line(input)) != NULL)
264a0f242067fb14df778d2fef181ad0045ad0eaAki Tuomistatic int director_get_host(const char *host, struct ip_addr **ips_r,
2ea9c5da50bbcb67de03c91ef4cf7778d1e57a22Timo Sirainen unsigned int *ips_count_r)
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen ret = net_gethostbyname(host, ips_r, ips_count_r);
2ea9c5da50bbcb67de03c91ef4cf7778d1e57a22Timo Sirainenstatic bool ip_find(const struct ip_addr *ips, unsigned int ips_count,
2ea9c5da50bbcb67de03c91ef4cf7778d1e57a22Timo Sirainen unsigned int i;
2ea9c5da50bbcb67de03c91ef4cf7778d1e57a22Timo Sirainen for (i = 0; i < ips_count; i++) {
5d16ff58f96527093b49597e8d6168f833e0a52eAki Tuomistatic void cmd_director_map(struct doveadm_cmd_context *cctx)
264a0f242067fb14df778d2fef181ad0045ad0eaAki Tuomi if ((ctx->hash_map && ctx->user_map) && ctx->host == NULL) {
3957200d949c6e96c4184db2395444d723950583Timo Sirainen /* user -> hash mapping */
264a0f242067fb14df778d2fef181ad0045ad0eaAki Tuomi user_hash = mail_user_hash(ctx->host, doveadm_settings->director_username_hash);
3957200d949c6e96c4184db2395444d723950583Timo Sirainen doveadm_print_header("hash", "hash", DOVEADM_PRINT_HEADER_FLAG_HIDE_TITLE);
3957200d949c6e96c4184db2395444d723950583Timo Sirainen doveadm_print(t_strdup_printf("%u", user_hash));
264a0f242067fb14df778d2fef181ad0045ad0eaAki Tuomi if (director_get_host(ctx->host, &ips, &ips_count) != 0) return;
caa1fa99c79c568ce2e42477bc169e7024fb220bTimo Sirainen pool = pool_alloconly_create("director map users", 1024*128);
264a0f242067fb14df778d2fef181ad0045ad0eaAki Tuomi user_file_get_user_list(ctx->users_input, pool, users);
3957200d949c6e96c4184db2395444d723950583Timo Sirainen /* hash -> usernames mapping */
3957200d949c6e96c4184db2395444d723950583Timo Sirainen doveadm_print_header("user", "user", DOVEADM_PRINT_HEADER_FLAG_HIDE_TITLE);
3957200d949c6e96c4184db2395444d723950583Timo Sirainen user = hash_table_lookup(users, POINTER_CAST(user_hash));
6176f3618240943f3cb41cb7063ecef56b1dd7dfTimo Sirainen doveadm_print_header("user", "user", DOVEADM_PRINT_HEADER_FLAG_EXPAND);
caa1fa99c79c568ce2e42477bc169e7024fb220bTimo Sirainen doveadm_print_header_simple("mail server ip");
caa1fa99c79c568ce2e42477bc169e7024fb220bTimo Sirainen while ((line = i_stream_read_next_line(ctx->input)) != NULL) {
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen } else if (ips_count == 0 ||
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen i_error("Director disconnected unexpectedly");
5d16ff58f96527093b49597e8d6168f833e0a52eAki Tuomicmd_director_add_or_update(struct doveadm_cmd_context *cctx, bool update)
e307e0fcc31ab7b3d062f6ff4b7d48d8b1b2f7b8Timo Sirainen const char *director_cmd = update ? "HOST-UPDATE" : "HOST-SET";
8ae72ad7d0c69e972cfa65d1e2ce4e3e9a8b765cTimo Sirainen unsigned int i, ips_count, vhost_count = UINT_MAX;
264a0f242067fb14df778d2fef181ad0045ad0eaAki Tuomi if (str_to_uint(ctx->vhost_count, &vhost_count) < 0) {
264a0f242067fb14df778d2fef181ad0045ad0eaAki Tuomi } else if (update) {
264a0f242067fb14df778d2fef181ad0045ad0eaAki Tuomi if (director_get_host(host, &ips, &ips_count) != 0) return;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen for (i = 0; i < ips_count; i++) {
a4502a71879d6018bd2c64f13614bb619911dd9fTimo Sirainen str_printfa(cmd, "%s\t%s", director_cmd, net_ip2addr(&ips[i]));
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen for (i = 0; i < ips_count; i++) {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen if (line == NULL || strcmp(line, "OK") != 0) {
5d16ff58f96527093b49597e8d6168f833e0a52eAki Tuomistatic void cmd_director_add(struct doveadm_cmd_context *cctx)
5d16ff58f96527093b49597e8d6168f833e0a52eAki Tuomistatic void cmd_director_update(struct doveadm_cmd_context *cctx)
5d16ff58f96527093b49597e8d6168f833e0a52eAki Tuomicmd_director_ipcmd(const char *cmd_name, const char *success_result,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen unsigned int i, ips_count;
264a0f242067fb14df778d2fef181ad0045ad0eaAki Tuomi if (director_get_host(host, &ips, &ips_count) != 0) return;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen for (i = 0; i < ips_count; i++) {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen for (i = 0; i < ips_count; i++) {
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen if (line != NULL && strcmp(line, "NOTFOUND") == 0) {
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen } else if (line == NULL || strcmp(line, "OK") != 0) {
264a0f242067fb14df778d2fef181ad0045ad0eaAki Tuomi i_info("%s: %s\n", net_ip2addr(&ips[i]), success_result);
5d16ff58f96527093b49597e8d6168f833e0a52eAki Tuomistatic void cmd_director_remove(struct doveadm_cmd_context *cctx)
5d16ff58f96527093b49597e8d6168f833e0a52eAki Tuomi cmd_director_ipcmd("HOST-REMOVE", "removed", cctx);
5d16ff58f96527093b49597e8d6168f833e0a52eAki Tuomistatic void cmd_director_up(struct doveadm_cmd_context *cctx)
5d16ff58f96527093b49597e8d6168f833e0a52eAki Tuomistatic void cmd_director_down(struct doveadm_cmd_context *cctx)
5d16ff58f96527093b49597e8d6168f833e0a52eAki Tuomistatic void cmd_director_move(struct doveadm_cmd_context *cctx)
264a0f242067fb14df778d2fef181ad0045ad0eaAki Tuomi user_hash = mail_user_hash(ctx->user, doveadm_settings->director_username_hash);
264a0f242067fb14df778d2fef181ad0045ad0eaAki Tuomi if (director_get_host(ctx->host, &ips, &ips_count) != 0) return;
264a0f242067fb14df778d2fef181ad0045ad0eaAki Tuomi i_info("User hash %u moved to %s\n", user_hash, ip_str);
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen "wait a while for it to be finished");
5d16ff58f96527093b49597e8d6168f833e0a52eAki Tuomistatic void cmd_director_kick(struct doveadm_cmd_context *cctx)
264a0f242067fb14df778d2fef181ad0045ad0eaAki Tuomi const char *line;
bfef6891565ff9018ac92add6eae401e9352c657Timo Sirainen str_append_tabescaped(cmd, ctx->passdb_field);
5e9bb72de1209cd39fdf3e95bdb26e047cc5594eTimo Sirainenstatic void cmd_director_flush_all(struct director_context *ctx)
5d16ff58f96527093b49597e8d6168f833e0a52eAki Tuomistatic void cmd_director_flush(struct doveadm_cmd_context *cctx)
5e9bb72de1209cd39fdf3e95bdb26e047cc5594eTimo Sirainen unsigned int i, ips_count;
264a0f242067fb14df778d2fef181ad0045ad0eaAki Tuomi const char *line;
264a0f242067fb14df778d2fef181ad0045ad0eaAki Tuomi if (director_get_host(ctx->host, &ips, &ips_count) != 0) return;
5e9bb72de1209cd39fdf3e95bdb26e047cc5594eTimo Sirainen for (i = 0; i < ips_count; i++) {
db8ca445e2082fe0b17d593f1f842cf8c40dd6a2Timo Sirainen director_send(ctx, t_strdup_printf("%s\t%s\n",
db8ca445e2082fe0b17d593f1f842cf8c40dd6a2Timo Sirainen ctx->force_flush ? "HOST-FLUSH" : "HOST-RESET-USERS",
5e9bb72de1209cd39fdf3e95bdb26e047cc5594eTimo Sirainen for (i = 0; i < ips_count; i++) {
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen if (line != NULL && strcmp(line, "NOTFOUND") == 0) {
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen } else if (line == NULL || strcmp(line, "OK") != 0) {
5d16ff58f96527093b49597e8d6168f833e0a52eAki Tuomistatic void cmd_director_dump(struct doveadm_cmd_context *cctx)
264a0f242067fb14df778d2fef181ad0045ad0eaAki Tuomi doveadm_print_formatted_set_format("doveadm director %{command} -a %{socket-path} %{host} %{vhost_count}");
264a0f242067fb14df778d2fef181ad0045ad0eaAki Tuomi doveadm_print_formatted_set_format("doveadm director %{command} %{host} %{vhost_count}");
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen while ((line = i_stream_read_next_line(ctx->input)) != NULL) {
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen while ((line = i_stream_read_next_line(ctx->input)) != NULL) {
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen i_error("Director disconnected unexpectedly");
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainenstatic void director_read_ok_reply(struct director_context *ctx)
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen i_error("Director disconnected unexpectedly");
5d16ff58f96527093b49597e8d6168f833e0a52eAki Tuomistatic void cmd_director_ring_add(struct doveadm_cmd_context *cctx)
23bdbb7b1831785c6ba6df190f6369da882d2b9dTimo Sirainen (ctx->port != 0 && net_str2port(ctx->port, &port) < 0)) {
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen str_printfa(str, "DIRECTOR-ADD\t%s", net_ip2addr(&ip));
5d16ff58f96527093b49597e8d6168f833e0a52eAki Tuomistatic void cmd_director_ring_remove(struct doveadm_cmd_context *cctx)
264a0f242067fb14df778d2fef181ad0045ad0eaAki Tuomi (ctx->port != NULL && net_str2port(ctx->port, &port) < 0)) {
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen str_printfa(str, "DIRECTOR-REMOVE\t%s", net_ip2addr(&ip));
5d16ff58f96527093b49597e8d6168f833e0a52eAki Tuomistatic void cmd_director_ring_status(struct doveadm_cmd_context *cctx)
d3af9043837e4bf0e87a9150fedc9e94908e6f82Timo Sirainen unsigned long l;
d3af9043837e4bf0e87a9150fedc9e94908e6f82Timo Sirainen while ((line = i_stream_read_next_line(ctx->input)) != NULL) {
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen i_error("Director disconnected unexpectedly");
264a0f242067fb14df778d2fef181ad0045ad0eaAki Tuomi .usage = "[-a <director socket path>] [<user>] [<tag>]",
264a0f242067fb14df778d2fef181ad0045ad0eaAki TuomiDOVEADM_CMD_PARAM('a', "socket-path", CMD_PARAM_STR, 0)
264a0f242067fb14df778d2fef181ad0045ad0eaAki TuomiDOVEADM_CMD_PARAM('\0', "user", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL)
264a0f242067fb14df778d2fef181ad0045ad0eaAki TuomiDOVEADM_CMD_PARAM('\0', "tag", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL)
264a0f242067fb14df778d2fef181ad0045ad0eaAki Tuomi .usage = "[-a <director socket path>] [-f <users file>] [-h | -u] [<host>]",
264a0f242067fb14df778d2fef181ad0045ad0eaAki TuomiDOVEADM_CMD_PARAM('a', "socket-path", CMD_PARAM_STR, 0)
264a0f242067fb14df778d2fef181ad0045ad0eaAki TuomiDOVEADM_CMD_PARAM('f', "users-file", CMD_PARAM_ISTREAM, 0)
264a0f242067fb14df778d2fef181ad0045ad0eaAki TuomiDOVEADM_CMD_PARAM('h', "hash-map", CMD_PARAM_BOOL, 0)
264a0f242067fb14df778d2fef181ad0045ad0eaAki TuomiDOVEADM_CMD_PARAM('u', "user-map", CMD_PARAM_BOOL, 0)
264a0f242067fb14df778d2fef181ad0045ad0eaAki TuomiDOVEADM_CMD_PARAM('\0', "host", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL)
264a0f242067fb14df778d2fef181ad0045ad0eaAki Tuomi .usage = "[-a <director socket path>] [-t <tag>] <host> [<vhost count>]",
264a0f242067fb14df778d2fef181ad0045ad0eaAki TuomiDOVEADM_CMD_PARAM('a', "socket-path", CMD_PARAM_STR, 0)
264a0f242067fb14df778d2fef181ad0045ad0eaAki TuomiDOVEADM_CMD_PARAM('\0', "host", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL)
264a0f242067fb14df778d2fef181ad0045ad0eaAki TuomiDOVEADM_CMD_PARAM('\0', "vhost-count", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL)
264a0f242067fb14df778d2fef181ad0045ad0eaAki Tuomi .usage = "[-a <director socket path>] <host> <vhost count>",
264a0f242067fb14df778d2fef181ad0045ad0eaAki TuomiDOVEADM_CMD_PARAM('a', "socket-path", CMD_PARAM_STR, 0)
264a0f242067fb14df778d2fef181ad0045ad0eaAki TuomiDOVEADM_CMD_PARAM('\0', "host", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL)
264a0f242067fb14df778d2fef181ad0045ad0eaAki TuomiDOVEADM_CMD_PARAM('\0', "vhost-count", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL)
264a0f242067fb14df778d2fef181ad0045ad0eaAki TuomiDOVEADM_CMD_PARAM('a', "socket-path", CMD_PARAM_STR, 0)
264a0f242067fb14df778d2fef181ad0045ad0eaAki TuomiDOVEADM_CMD_PARAM('\0', "host", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL)
264a0f242067fb14df778d2fef181ad0045ad0eaAki TuomiDOVEADM_CMD_PARAM('a', "socket-path", CMD_PARAM_STR, 0)
264a0f242067fb14df778d2fef181ad0045ad0eaAki TuomiDOVEADM_CMD_PARAM('\0', "host", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL)
264a0f242067fb14df778d2fef181ad0045ad0eaAki TuomiDOVEADM_CMD_PARAM('a', "socket-path", CMD_PARAM_STR, 0)
264a0f242067fb14df778d2fef181ad0045ad0eaAki TuomiDOVEADM_CMD_PARAM('\0', "host", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL)
264a0f242067fb14df778d2fef181ad0045ad0eaAki Tuomi .usage = "[-a <director socket path>] <user> <host>",
264a0f242067fb14df778d2fef181ad0045ad0eaAki TuomiDOVEADM_CMD_PARAM('a', "socket-path", CMD_PARAM_STR, 0)
264a0f242067fb14df778d2fef181ad0045ad0eaAki TuomiDOVEADM_CMD_PARAM('\0', "user", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL)
264a0f242067fb14df778d2fef181ad0045ad0eaAki TuomiDOVEADM_CMD_PARAM('\0', "host", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL)
bfef6891565ff9018ac92add6eae401e9352c657Timo Sirainen .usage = "[-a <director socket path>] [-f <passdb field>] <user>",
264a0f242067fb14df778d2fef181ad0045ad0eaAki TuomiDOVEADM_CMD_PARAM('a', "socket-path", CMD_PARAM_STR, 0)
bfef6891565ff9018ac92add6eae401e9352c657Timo SirainenDOVEADM_CMD_PARAM('\0', "passdb-field", CMD_PARAM_STR, 0)
264a0f242067fb14df778d2fef181ad0045ad0eaAki TuomiDOVEADM_CMD_PARAM('\0', "user", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL)
264a0f242067fb14df778d2fef181ad0045ad0eaAki Tuomi .usage = "[-a <director socket path>] [-F] <host>|all",
264a0f242067fb14df778d2fef181ad0045ad0eaAki TuomiDOVEADM_CMD_PARAM('a', "socket-path", CMD_PARAM_STR, 0)
264a0f242067fb14df778d2fef181ad0045ad0eaAki TuomiDOVEADM_CMD_PARAM('F', "force-flush", CMD_PARAM_BOOL, 0)
264a0f242067fb14df778d2fef181ad0045ad0eaAki TuomiDOVEADM_CMD_PARAM('\0', "host", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL)
264a0f242067fb14df778d2fef181ad0045ad0eaAki TuomiDOVEADM_CMD_PARAM('a', "socket-path", CMD_PARAM_STR, 0)
264a0f242067fb14df778d2fef181ad0045ad0eaAki Tuomi .usage = "[-a <director socket path>] <ip> [<port>]",
264a0f242067fb14df778d2fef181ad0045ad0eaAki TuomiDOVEADM_CMD_PARAM('a', "socket-path", CMD_PARAM_STR, 0)
264a0f242067fb14df778d2fef181ad0045ad0eaAki TuomiDOVEADM_CMD_PARAM('\0', "ip", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL)
264a0f242067fb14df778d2fef181ad0045ad0eaAki TuomiDOVEADM_CMD_PARAM('\0', "port", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL)
264a0f242067fb14df778d2fef181ad0045ad0eaAki Tuomi .usage = "[-a <director socket path>] <ip> [<port>]",
264a0f242067fb14df778d2fef181ad0045ad0eaAki TuomiDOVEADM_CMD_PARAM('a', "socket-path", CMD_PARAM_STR, 0)
264a0f242067fb14df778d2fef181ad0045ad0eaAki TuomiDOVEADM_CMD_PARAM('\0', "ip", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL)
264a0f242067fb14df778d2fef181ad0045ad0eaAki TuomiDOVEADM_CMD_PARAM('\0', "port", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL)
264a0f242067fb14df778d2fef181ad0045ad0eaAki TuomiDOVEADM_CMD_PARAM('a', "socket-path", CMD_PARAM_STR, 0)
264a0f242067fb14df778d2fef181ad0045ad0eaAki Tuomistatic void director_cmd_help(const struct doveadm_cmd_ver2 *cmd)
caa1fa99c79c568ce2e42477bc169e7024fb220bTimo Sirainen unsigned int i;
caa1fa99c79c568ce2e42477bc169e7024fb220bTimo Sirainen for (i = 0; i < N_ELEMENTS(doveadm_cmd_director); i++) {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen unsigned int i;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen for (i = 0; i < N_ELEMENTS(doveadm_cmd_director); i++)