From 997d9f9963fd6930eb1898bf2dcee49968d7c0f4 Mon Sep 17 00:00:00 2001 From: DL6ER Date: Mon, 2 Dec 2019 15:37:31 +0000 Subject: [PATCH] Reload all lists (but do not clear the DNS cache itself) on receipt of real-time signal 0. Signed-off-by: DL6ER --- src/datastructure.c | 38 ++++++++++++++++++++++++++++++++++++++ src/datastructure.h | 3 +++ src/dnsmasq/dnsmasq.c | 1 - src/dnsmasq_interface.c | 36 +----------------------------------- src/dnsmasq_interface.h | 2 -- src/signals.c | 14 ++++++++++++++ 6 files changed, 56 insertions(+), 38 deletions(-) diff --git a/src/datastructure.c b/src/datastructure.c index ed616e62..ac576690 100644 --- a/src/datastructure.c +++ b/src/datastructure.c @@ -295,3 +295,41 @@ const char *getClientNameString(const int queryID) else return HIDDEN_CLIENT; } + +void FTL_reset_per_client_domain_data(void) +{ + for(int domainID = 0; domainID < counters->domains; domainID++) + { + domainsData *domain = getDomain(domainID, true); + if(domain == NULL) + continue; + + for(int clientID = 0; clientID < counters->clients; clientID++) + { + // Reset all blocking yes/no fields for all domains and clients + // This forces a reprocessing of all available filters for any + // given domain and client the next time they are seen + domain->clientstatus->set(domain->clientstatus, clientID, UNKNOWN_BLOCKED); + } + } +} + +void FTL_reload_all_domainlists(void) +{ + // (Re-)open gravity database connection + gravityDB_close(); + gravityDB_open(); + // gravityDB_close() has finalized all prepared statements, reinitialize them + gravityDB_reload_client_statements(); + + // Reset number of blocked domains + counters->gravity = gravityDB_count(GRAVITY_TABLE); + + // Read and compile possible regex filters + // only after having called gravityDB_open() + read_regex_from_database(); + + // Reset FTL's internal DNS cache storing whether a specific domain + // has already been validated for a specific user + FTL_reset_per_client_domain_data(); +} diff --git a/src/datastructure.h b/src/datastructure.h index 40181dfa..8531ef37 100644 --- a/src/datastructure.h +++ b/src/datastructure.h @@ -25,6 +25,9 @@ const char *getDomainString(const int queryID); const char *getClientIPString(const int queryID); const char *getClientNameString(const int queryID); +void FTL_reload_all_domainlists(void); +void FTL_reset_per_client_domain_data(void); + typedef struct { unsigned char magic; unsigned char type; diff --git a/src/dnsmasq/dnsmasq.c b/src/dnsmasq/dnsmasq.c index 869fa561..c794be4c 100644 --- a/src/dnsmasq/dnsmasq.c +++ b/src/dnsmasq/dnsmasq.c @@ -1413,7 +1413,6 @@ static void async_event(int pipe, time_t now) if (daemon->log_file != NULL) log_reopen(daemon->log_file); - FTL_reset_per_client_domain_data(true); break; case EVENT_NEWADDR: diff --git a/src/dnsmasq_interface.c b/src/dnsmasq_interface.c index b8fa3fb2..1968bdbc 100644 --- a/src/dnsmasq_interface.c +++ b/src/dnsmasq_interface.c @@ -675,20 +675,7 @@ void FTL_dnsmasq_reload(void) // Reread pihole-FTL.conf to see which debugging flags are set read_debuging_settings(NULL); - // (Re-)open gravity database connection - gravityDB_close(); - gravityDB_open(); - // gravityDB_close() has finalized all prepared statements, reinitialize them - gravityDB_reload_client_statements(); - - // Reset number of blocked domains - counters->gravity = gravityDB_count(GRAVITY_TABLE); - - // Read and compile possible regex filters - // only after having called gravityDB_open() - read_regex_from_database(); - - FTL_reset_per_client_domain_data(false); + FTL_reload_all_domainlists(); // Print current set of capabilities if requested via debug flag if(config.debug & DEBUG_CAPS) @@ -1658,24 +1645,3 @@ static void prepare_blocking_metadata(void) // Free IPv6addr clearSetupVarsArray(); } - -void FTL_reset_per_client_domain_data(bool sigusr2) -{ - if(sigusr2) - logg("Received SIGUSR2, resetting domain blocking data"); - - for(int domainID = 0; domainID < counters->domains; domainID++) - { - domainsData *domain = getDomain(domainID, true); - if(domain == NULL) - continue; - - for(int clientID = 0; clientID < counters->clients; clientID++) - { - // Reset all blocking yes/no fields for all domains and clients - // This forces a reprocessing of all available filters for any - // given domain and client the next time they are seen - domain->clientstatus->set(domain->clientstatus, clientID, UNKNOWN_BLOCKED); - } - } -} diff --git a/src/dnsmasq_interface.h b/src/dnsmasq_interface.h index 0c76614f..fe9cbd96 100644 --- a/src/dnsmasq_interface.h +++ b/src/dnsmasq_interface.h @@ -52,6 +52,4 @@ bool _FTL_CNAME(const char *domain, const struct crec *cpp, const int id, const void FTL_dnsmasq_reload(void); void FTL_fork_and_bind_sockets(struct passwd *ent_pw); -void FTL_reset_per_client_domain_data(bool sigusr2); - #endif // DNSMASQ_INTERFACE_H diff --git a/src/signals.c b/src/signals.c index e80e51df..11434b97 100644 --- a/src/signals.c +++ b/src/signals.c @@ -17,6 +17,8 @@ #include "memory.h" // ls_dir() #include "files.h" +// FTL_reload_all_domainlists() +#include "datastructure.h" volatile sig_atomic_t killed = 0; static time_t FTLstarttime = 0; @@ -82,6 +84,18 @@ static void SIGRT_handler(int signum, siginfo_t *si, void *unused) { int rtsig = signum - SIGRTMIN; logg("Received: %s (%d -> %d)", strsignal(signum), signum, rtsig); + + if(rtsig == 0) + { + // Reload + // - gravity + // - exact whitelist + // - regex whitelist + // - exact blacklist + // - exact blacklist + // WITHOUT wiping the DNS cache itself + FTL_reload_all_domainlists(); + } } void handle_signals(void)