From 820023550a49cc866ba7ea42d8414912f585dd34 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Mon, 15 May 2017 16:12:07 +0100 Subject: [PATCH] [Feature] Use normal resolv.conf rules of rotation in Rspamd --- src/libserver/dns.c | 46 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 39 insertions(+), 7 deletions(-) diff --git a/src/libserver/dns.c b/src/libserver/dns.c index e1ab754db..9aeb24306 100644 --- a/src/libserver/dns.c +++ b/src/libserver/dns.c @@ -198,7 +198,7 @@ static void rspamd_rnds_log_bridge ( } static void -rspamd_dns_server_init (struct upstream *up, gpointer ud) +rspamd_dns_server_init (struct upstream *up, guint idx, gpointer ud) { struct rspamd_dns_resolver *r = ud; rspamd_inet_addr_t *addr; @@ -225,6 +225,25 @@ rspamd_dns_server_init (struct upstream *up, gpointer ud) rspamd_upstream_set_data (up, elt); } +static void +rspamd_dns_server_reorder (struct upstream *up, guint idx, gpointer ud) +{ + struct rspamd_dns_resolver *r = ud; + + rspamd_upstream_set_weight (up, rspamd_upstreams_count (r->ups) - idx + 1); +} + +static bool +rspamd_dns_resolv_conf_on_server (struct rdns_resolver *resolver, + const char *name, unsigned int port, + int priority, unsigned int io_cnt, void *ud) +{ + struct rspamd_dns_resolver *dns_resolver = ud; + + return rspamd_upstreams_add_upstream (dns_resolver->ups, + name, port, NULL); +} + struct rspamd_dns_resolver * dns_resolver_init (rspamd_logger_t *logger, struct event_base *ev_base, @@ -256,7 +275,16 @@ dns_resolver_init (rspamd_logger_t *logger, if (cfg == NULL || cfg->nameservers == NULL) { /* Parse resolv.conf */ - if (!rdns_resolver_parse_resolv_conf (dns_resolver->r, "/etc/resolv.conf")) { + dns_resolver->ups = rspamd_upstreams_create (cfg->ups_ctx); + rspamd_upstreams_set_flags (dns_resolver->ups, + RSPAMD_UPSTREAM_FLAG_NORESOLVE); + rspamd_upstreams_set_rotation (dns_resolver->ups, + RSPAMD_UPSTREAM_MASTER_SLAVE); + + if (!rdns_resolver_parse_resolv_conf_cb (dns_resolver->r, + "/etc/resolv.conf", + rspamd_dns_resolv_conf_on_server, + dns_resolver)) { msg_err ("cannot parse resolv.conf and no nameservers defined, " "so no ways to resolve addresses"); rdns_resolver_release (dns_resolver->r); @@ -264,6 +292,10 @@ dns_resolver_init (rspamd_logger_t *logger, return dns_resolver; } + + /* Use normal resolv.conf rules */ + rspamd_upstreams_foreach (dns_resolver->ups, rspamd_dns_server_reorder, + dns_resolver); } else { dns_resolver->ups = rspamd_upstreams_create (cfg->ups_ctx); @@ -278,13 +310,13 @@ dns_resolver_init (rspamd_logger_t *logger, return dns_resolver; } - - rspamd_upstreams_foreach (dns_resolver->ups, rspamd_dns_server_init, - dns_resolver); - rdns_resolver_set_upstream_lib (dns_resolver->r, &rspamd_ups_ctx, - dns_resolver->ups); } + rspamd_upstreams_foreach (dns_resolver->ups, rspamd_dns_server_init, + dns_resolver); + rdns_resolver_set_upstream_lib (dns_resolver->r, &rspamd_ups_ctx, + dns_resolver->ups); + rdns_resolver_init (dns_resolver->r); if (cfg != NULL) { -- 2.39.5