return rcodes_short_s.at(rcode);
}
+std::optional<uint8_t> RCode::from_short(const std::string_view& rcode_string)
+{
+ uint8_t position = 0;
+ for (const auto& short_rcode : rcodes_short_s) {
+ if (short_rcode == rcode_string) {
+ return position;
+ }
+ ++position;
+ }
+ return std::nullopt;
+}
+
std::string ERCode::to_s(uint16_t rcode) {
if (rcode >= RCode::rcodes_s.size()) {
return std::string("Err#")+std::to_string(rcode);
#include "qtype.hh"
#include "dnsname.hh"
#include <ctime>
+#include <optional>
+#include <string_view>
#include <sys/types.h>
#undef BADSIG // signal.h SIG_ERR
enum rcodes_ : uint8_t { NoError=0, FormErr=1, ServFail=2, NXDomain=3, NotImp=4, Refused=5, YXDomain=6, YXRRSet=7, NXRRSet=8, NotAuth=9, NotZone=10};
static std::string to_s(uint8_t rcode);
static std::string to_short_s(uint8_t rcode);
+ static std::optional<uint8_t> from_short(const std::string_view& rcode_string);
const static std::array<std::string, 24> rcodes_s;
};
return true;
}
+static uint8_t strToRCode(const std::string& context, const std::string& parameterName, const ::rust::String& rcode_rust_string)
+{
+ auto rcode_str = std::string(rcode_rust_string);
+ boost::to_lower(rcode_str);
+ auto rcode = RCode::from_short(rcode_str);
+ if (!rcode) {
+ return checkedConversionFromStr<uint8_t>(context, parameterName, rcode_rust_string);
+ }
+ return *rcode;
+}
+
static std::optional<std::string> loadContentFromConfigurationFile(const std::string& fileName)
{
/* no check on the file size, don't do this with just any file! */
ruleParams.d_tagSettings->d_name = std::string(rule.tag_name);
ruleParams.d_tagSettings->d_value = std::string(rule.tag_value);
}
- dbrgObj->setRCodeRate(checkedConversionFromStr<int>("dynamic-rules.rules.rcode_rate", "rcode", rule.rcode), std::move(ruleParams));
+ dbrgObj->setRCodeRate(strToRCode("dynamic-rules.rules.rcode_rate", "rcode", rule.rcode), std::move(ruleParams));
}
else if (rule.rule_type == "rcode-ratio") {
DynBlockRulesGroup::DynBlockRatioRule ruleParams(std::string(rule.comment), rule.action_duration, rule.ratio, rule.warning_ratio, rule.seconds, rule.action.empty() ? DNSAction::Action::None : DNSAction::typeFromString(std::string(rule.action)), rule.minimum_number_of_responses);
ruleParams.d_tagSettings->d_name = std::string(rule.tag_name);
ruleParams.d_tagSettings->d_value = std::string(rule.tag_value);
}
- dbrgObj->setRCodeRatio(checkedConversionFromStr<int>("dynamic-rules.rules.rcode_ratio", "rcode", rule.rcode), std::move(ruleParams));
+ dbrgObj->setRCodeRatio(strToRCode("dynamic-rules.rules.rcode_ratio", "rcode", rule.rcode), std::move(ruleParams));
}
else if (rule.rule_type == "qtype-rate") {
DynBlockRulesGroup::DynBlockRule ruleParams(std::string(rule.comment), rule.action_duration, rule.rate, rule.warning_rate, rule.seconds, rule.action.empty() ? DNSAction::Action::None : DNSAction::typeFromString(std::string(rule.action)));