]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
doveadm director status user: Show more ways of what user's potential hosts are.
authorTimo Sirainen <tss@iki.fi>
Thu, 20 May 2010 10:37:15 +0000 (12:37 +0200)
committerTimo Sirainen <tss@iki.fi>
Thu, 20 May 2010 10:37:15 +0000 (12:37 +0200)
--HG--
branch : HEAD

src/director/director.c
src/director/director.h
src/director/doveadm-connection.c
src/director/mail-host.c
src/director/mail-host.h
src/director/main.c
src/doveadm/doveadm-director.c

index b9dd4251b0f8256f5f8a9bf43ac5e1247ee16583..d938e9da94eb2481770a0367be8c444a094dca19 100644 (file)
@@ -208,6 +208,7 @@ void director_deinit(struct director **_dir)
 
        user_directory_deinit(&dir->users);
        mail_hosts_deinit(&dir->mail_hosts);
+       mail_hosts_deinit(&dir->orig_config_hosts);
        if (dir->to_request != NULL)
                timeout_remove(&dir->to_request);
        array_foreach(&dir->dir_hosts, hostp)
index 59a5033d7983b4ff81820ab293eb5d606fa8bacd..fcfd19960ffba2a9ef2fce68d602bd0883b6326b 100644 (file)
@@ -30,7 +30,11 @@ struct director {
        struct director_host *self_host;
        struct director_connection *left, *right;
 
+       /* current mail hosts */
        struct mail_host_list *mail_hosts;
+       /* original mail hosts configured in config file.
+          this is used only for doveadm lookups */
+       struct mail_host_list *orig_config_hosts;
        /* temporary user -> host associations */
        struct user_directory *users;
 
index 75fadbea0c8ca7292b7e93374527029f31aeb44f..28f8d7e52ab3552c8b18293daf90da512232c088 100644 (file)
@@ -120,16 +120,37 @@ static bool
 doveadm_cmd_user_lookup(struct doveadm_connection *conn, const char *line)
 {
        struct user *user;
-       unsigned int hash;
+       struct mail_host *host;
+       unsigned int username_hash;
+       string_t *str = t_str_new(256);
+
+       username_hash = user_directory_get_username_hash(line);
 
-       hash = user_directory_get_username_hash(line);
-       user = user_directory_lookup(conn->dir->users, hash);
+       /* get user's current host */
+       user = user_directory_lookup(conn->dir->users, username_hash);
        if (user == NULL)
-               o_stream_send_str(conn->output, "NOTFOUND\n");
+               str_append(str, "\t0");
        else {
-               o_stream_send_str(conn->output, t_strconcat(
-                       net_ip2addr(&user->host->ip), "\n", NULL));
+               str_printfa(str, "%s\t%u", net_ip2addr(&user->host->ip),
+                           user->timestamp +
+                           conn->dir->set->director_user_expire);
        }
+
+       /* get host if it wasn't in user directory */
+       host = mail_host_get_by_hash(conn->dir->mail_hosts, username_hash);
+       if (host == NULL)
+               str_append(str, "\t");
+       else
+               str_printfa(str, "\t%s", net_ip2addr(&host->ip));
+
+       /* get host with default configuration */
+       host = mail_host_get_by_hash(conn->dir->orig_config_hosts,
+                                    username_hash);
+       if (host == NULL)
+               str_append(str, "\t");
+       else
+               str_printfa(str, "\t%s\n", net_ip2addr(&host->ip));
+       o_stream_send(conn->output, str_data(str), str_len(str));
        return TRUE;
 }
 
index 521fd3140126ef8bf6bc16b210a4e7d936917b9f..b61cb656c5671fd71ea1d04f895880c4181ebc3c 100644 (file)
@@ -195,3 +195,26 @@ void mail_hosts_deinit(struct mail_host_list **_list)
        array_free(&list->vhosts);
        i_free(list);
 }
+
+static struct mail_host *mail_host_dup(const struct mail_host *src)
+{
+       struct mail_host *dest;
+
+       dest = i_new(struct mail_host, 1);
+       *dest = *src;
+       return dest;
+}
+
+struct mail_host_list *mail_hosts_dup(const struct mail_host_list *src)
+{
+       struct mail_host_list *dest;
+       struct mail_host *const *hostp, *dest_host;
+
+       dest = mail_hosts_init();
+       array_foreach(&src->hosts, hostp) {
+               dest_host = mail_host_dup(*hostp);
+               array_append(&dest->hosts, &dest_host, 1);
+       }
+       mail_hosts_sort(dest);
+       return dest;
+}
index 84395f929bd72d1d6a915867217b5449ad323e3e..073cb7493e75b553d12e15e36d4809e33c203896 100644 (file)
@@ -32,4 +32,6 @@ const ARRAY_TYPE(mail_host) *mail_hosts_get(struct mail_host_list *list);
 struct mail_host_list *mail_hosts_init(void);
 void mail_hosts_deinit(struct mail_host_list **list);
 
+struct mail_host_list *mail_hosts_dup(const struct mail_host_list *src);
+
 #endif
index efba776ed606d2d14511ba3cb4d03e5d91c3b0c5..099ef8d1ee43dacc6d1b4abf8bdf190dc846631f 100644 (file)
@@ -145,6 +145,7 @@ static void main_init(void)
        if (mail_hosts_parse_and_add(director->mail_hosts,
                                     set->director_mail_servers) < 0)
                i_fatal("Invalid value for director_mail_servers setting");
+       director->orig_config_hosts = mail_hosts_dup(director->mail_hosts);
 
        director_connect(director);
 }
index 8d27edadfe4dd7216da9ad864c8f2bdf69fc53f6..988e3746e6d65cee6c8a7aa5b605864fe30bfef8 100644 (file)
@@ -80,7 +80,8 @@ cmd_director_init(int argc, char *argv[], unsigned int cmd_idx)
 static void
 cmd_director_status_user(struct director_context *ctx, const char *user)
 {
-       const char *line;
+       const char *line, *const *args;
+       unsigned int expires;
 
        director_send(ctx, t_strdup_printf("USER-LOOKUP\t%s\n", user));
        line = i_stream_read_next_line(ctx->input);
@@ -89,10 +90,21 @@ cmd_director_status_user(struct director_context *ctx, const char *user)
                return;
        }
 
-       if (strcmp(line, "NOTFOUND") == 0)
-               printf("User not assigned to any server\n");
-       else
-               printf("%s\n", line);
+       args = t_strsplit(line, "\t");
+       if (str_array_length(args) != 4 ||
+           str_to_uint(args[1], &expires) < 0) {
+               printf("Invalid reply from director\n");
+               return;
+       }
+
+       if (args[0][0] != '\0') {
+               printf("Current: %s (expires %s)\n",
+                      args[0], unixdate2str(expires));
+       } else {
+               printf("Current: not assigned\n");
+       }
+       printf("Hashed: %s\n", args[2]);
+       printf("Initial config: %s\n", args[3]);
        director_disconnect(ctx);
 }