*
* Copyright (C) 2018-2020 Matt Schatz <genius3000@g3k.solutions>
* Copyright (C) 2018-2019 linuxdaemon <linuxdaemon.irc@gmail.com>
- * Copyright (C) 2013, 2016-2020 Sadie Powell <sadie@witchery.services>
+ * Copyright (C) 2013, 2017-2021 Sadie Powell <sadie@witchery.services>
* Copyright (C) 2013, 2015-2016 Adam <Adam@anope.org>
* Copyright (C) 2012-2016 Attila Molnar <attilamolnar@hush.com>
* Copyright (C) 2012, 2018 Robby <robby@chatbelgie.be>
unsigned long duration;
unsigned int bitmask;
unsigned char records[256];
- unsigned long stats_hits, stats_misses;
- DNSBLConfEntry(): type(A_BITMASK),duration(86400),bitmask(0),stats_hits(0), stats_misses(0) {}
+ unsigned long stats_hits, stats_misses, stats_errors;
+ DNSBLConfEntry()
+ : type(A_BITMASK)
+ , duration(86400)
+ , bitmask(0)
+ , stats_hits(0)
+ , stats_misses(0)
+ , stats_errors(0)
+ {
+ }
};
/* Check the user still exists */
LocalUser* them = IS_LOCAL(ServerInstance->FindUUID(theiruid));
if (!them || them->client_sa != theirsa)
+ {
+ ConfEntry->stats_misses++;
return;
+ }
int i = countExt.get(them);
if (i)
const DNS::ResourceRecord* const ans_record = r->FindAnswerOfType(DNS::QUERY_A);
if (!ans_record)
{
- ConfEntry->stats_misses++;
+ ConfEntry->stats_errors++;
ServerInstance->SNO->WriteGlobalSno('d', "%s returned an result with no IPv4 address.",
ConfEntry->name.c_str());
return;
in_addr resultip;
if (inet_pton(AF_INET, ans_record->rdata.c_str(), &resultip) != 1)
{
- ConfEntry->stats_misses++;
+ ConfEntry->stats_errors++;
ServerInstance->SNO->WriteGlobalSno('d', "%s returned an invalid IPv4 address: %s",
ConfEntry->name.c_str(), ans_record->rdata.c_str());
return;
// The DNSBL reply should be in the 127.0.0.0/8 range.
if ((resultip.s_addr & 0xFF) != 127)
{
- ConfEntry->stats_misses++;
+ ConfEntry->stats_errors++;
ServerInstance->SNO->WriteGlobalSno('d', "%s returned an IPv4 address which is outside of the 127.0.0.0/8 subnet: %s",
ConfEntry->name.c_str(), ans_record->rdata.c_str());
return;
void OnError(const DNS::Query *q) CXX11_OVERRIDE
{
+ bool is_miss = true;
+ switch (q->error)
+ {
+ case DNS::ERROR_NO_RECORDS:
+ case DNS::ERROR_DOMAIN_NOT_FOUND:
+ ConfEntry->stats_misses++;
+ break;
+
+ default:
+ ConfEntry->stats_errors++;
+ is_miss = false;
+ break;
+ }
+
LocalUser* them = IS_LOCAL(ServerInstance->FindUUID(theiruid));
if (!them || them->client_sa != theirsa)
return;
if (i)
countExt.set(them, i - 1);
- if (q->error == DNS::ERROR_NO_RECORDS || q->error == DNS::ERROR_DOMAIN_NOT_FOUND)
- {
- ConfEntry->stats_misses++;
+ if (is_miss)
return;
- }
ServerInstance->SNO->WriteGlobalSno('d', "An error occurred whilst checking whether %s (%s) is on the '%s' DNS blacklist: %s",
them->GetFullRealHost().c_str(), them->GetIPString().c_str(), ConfEntry->name.c_str(), this->manager->GetErrorStr(q->error).c_str());
if (stats.GetSymbol() != 'd')
return MOD_RES_PASSTHRU;
- unsigned long total_hits = 0, total_misses = 0;
-
+ unsigned long total_hits = 0;
+ unsigned long total_misses = 0;
+ unsigned long total_errors = 0;
for (std::vector<reference<DNSBLConfEntry> >::const_iterator i = DNSBLConfEntries.begin(); i != DNSBLConfEntries.end(); ++i)
{
total_hits += (*i)->stats_hits;
total_misses += (*i)->stats_misses;
+ total_errors += (*i)->stats_errors;
- stats.AddRow(304, "DNSBLSTATS DNSbl \"" + (*i)->name + "\" had " +
- ConvToStr((*i)->stats_hits) + " hits and " + ConvToStr((*i)->stats_misses) + " misses");
+ stats.AddRow(304, InspIRCd::Format("DNSBLSTATS \"%s\" had %lu hits, %lu misses, and %lu errors",
+ (*i)->name.c_str(), (*i)->stats_hits, (*i)->stats_misses, (*i)->stats_errors));
}
stats.AddRow(304, "DNSBLSTATS Total hits: " + ConvToStr(total_hits));
stats.AddRow(304, "DNSBLSTATS Total misses: " + ConvToStr(total_misses));
-
+ stats.AddRow(304, "DNSBLSTATS Total errors: " + ConvToStr(total_errors));
return MOD_RES_PASSTHRU;
}
};