doveadm-director.c revision 91770f85d9b2ac3e91b7aa74f57149412ae33c4c
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen/* Copyright (c) 2009-2010 Dovecot authors, see the included COPYING file */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenextern struct doveadm_cmd doveadm_cmd_director[];
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"
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ctx->input = i_stream_create_fd(fd, (size_t)-1, TRUE);
f158d9a303bb15a6848ca276c9391c7ca52e452bTimo Sirainen if (!version_string_verify(line, "director-doveadm", 1)) {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen i_fatal("%s not a compatible director-doveadm socket",
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenstatic void director_disconnect(struct director_context *ctx)
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen i_fatal("read(%s) failed: %m", ctx->socket_path);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainencmd_director_init(int argc, char *argv[], unsigned int cmd_idx)
1c7b846a17612b1fe7dcee797d0d8115201e58f4Timo Sirainen ctx->socket_path = t_strconcat(doveadm_settings->base_dir,
b2024fa4e6ed39f9b5b6bb6c051f6d535fc0e011Timo Sirainencmd_director_status_user(struct director_context *ctx, const char *user)
edd318d5866ac3fbc6e8df28fb24a4dfef93c884Timo Sirainen unsigned int expires;
b2024fa4e6ed39f9b5b6bb6c051f6d535fc0e011Timo Sirainen director_send(ctx, t_strdup_printf("USER-LOOKUP\t%s\n", user));
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenstatic void cmd_director_status(int argc, char *argv[])
68787d48554f497e711ff66a087ab31f990a11e9Timo Sirainen doveadm_print_header_simple("mail server ip");
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen while ((line = i_stream_read_next_line(ctx->input)) != NULL) {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenstatic void cmd_director_add(int argc, char *argv[])
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen if (str_to_uint(argv[optind++], &vhost_count) < 0)
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen if (net_gethostbyname(host, &ips, &ips_count) < 0)
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen for (i = 0; i < ips_count; i++) {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen for (i = 0; i < ips_count; i++) {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen if (line == NULL || strcmp(line, "OK") != 0) {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen fprintf(stderr, "%s: %s\n", net_ip2addr(&ips[i]),
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenstatic void cmd_director_remove(int argc, char *argv[])
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen unsigned int i, ips_count;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen if (net_gethostbyname(host, &ips, &ips_count) < 0)
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen for (i = 0; i < ips_count; i++) {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen t_strdup_printf("HOST-REMOVE\t%s\n", net_ip2addr(&ip)));
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen for (i = 0; i < ips_count; i++) {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen if (line == NULL || strcmp(line, "OK") != 0) {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen fprintf(stderr, "%s: %s\n", net_ip2addr(&ips[i]),
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen printf("%s: removed\n", net_ip2addr(&ips[i]));
5e9bb72de1209cd39fdf3e95bdb26e047cc5594eTimo Sirainenstatic void cmd_director_flush_all(struct director_context *ctx)
5e9bb72de1209cd39fdf3e95bdb26e047cc5594eTimo Sirainenstatic void cmd_director_flush(int argc, char *argv[])
5e9bb72de1209cd39fdf3e95bdb26e047cc5594eTimo Sirainen unsigned int i, ips_count;
5e9bb72de1209cd39fdf3e95bdb26e047cc5594eTimo Sirainen if (net_gethostbyname(host, &ips, &ips_count) < 0)
5e9bb72de1209cd39fdf3e95bdb26e047cc5594eTimo Sirainen for (i = 0; i < ips_count; i++) {
5e9bb72de1209cd39fdf3e95bdb26e047cc5594eTimo Sirainen t_strdup_printf("HOST-FLUSH\t%s\n", net_ip2addr(&ip)));
5e9bb72de1209cd39fdf3e95bdb26e047cc5594eTimo Sirainen for (i = 0; i < ips_count; i++) {
5e9bb72de1209cd39fdf3e95bdb26e047cc5594eTimo Sirainen if (line == NULL || strcmp(line, "OK") != 0) {
5e9bb72de1209cd39fdf3e95bdb26e047cc5594eTimo Sirainen fprintf(stderr, "%s: %s\n", net_ip2addr(&ips[i]),
5e9bb72de1209cd39fdf3e95bdb26e047cc5594eTimo Sirainen printf("%s: flushed\n", net_ip2addr(&ips[i]));
5f4a009a7763f62afe0245a9735931f95a89804dTimo Sirainen "[-a <director socket path>] [<user>]", NULL },
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen "[-a <director socket path>] <host> [<vhost count>]", NULL },
5e9bb72de1209cd39fdf3e95bdb26e047cc5594eTimo Sirainen "[-a <director socket path>] <host>|all", NULL }
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen unsigned int i;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen for (i = 0; i < N_ELEMENTS(doveadm_cmd_director); i++)