serde_yaml::Value::Mapping(map)
}
- pub fn get_value(&self, field: &[String], defaults: &str) -> Result<String, std::io::Error> {
+ pub fn get_value(&self, field: &[String], defaults: &str, with_comment: bool) -> Result<String, std::io::Error> {
let value = serde_yaml::to_value(self);
let value = match value {
Ok(value) => value,
Ok(value) => {
let map = Self::buildnestedmaps(field, &value);
let res = serde_yaml::to_string(&map).unwrap();
- let name = field.join(".");
- let msg = format!("# {}: not explicitly set, default value(s) listed below:\n{}", name, res);
- Ok(msg)
+ if with_comment {
+ let name = field.join(".");
+ let msg = format!("# {}: not explicitly set, default value(s) listed below:\n{}", name, res);
+ Ok(msg)
+ }
+ else {
+ Ok(res)
+ }
},
Err(x) => Err(x)
}
{
std::stringstream ret;
int err = 0;
- if (!g_yamlSettings) {
+ if (!g_yamlSettings) {
for (auto i = begin; i != end; ++i) {
if (::arg().parmIsset(*i)) {
const auto& parm = arg()[*i];
}
else {
auto settings = g_yamlStruct.lock();
- ret << "# YAML settings active" << endl;
if (begin == end) {
- auto yaml = settings->get_value({}, pdns::settings::rec::defaultsToYaml(false));
+ auto yaml = settings->get_value({}, pdns::settings::rec::defaultsToYaml(false), true);
+ ret << std::string(yaml);
+ }
+ else {
+ for (auto i = begin; i != end; ++i) {
+ rust::Vec<::rust::String> field;
+ stringtok(field, *i, ".");
+ rust::Slice<const ::rust::String> slice{field};
+ try {
+ auto yaml = settings->get_value(slice, pdns::settings::rec::defaultsToYaml(false), true);
+ ret << std::string(yaml);
+ }
+ catch (const std::exception& stdex) {
+ ret << std::string(stdex.what()) << endl;
+ err = 1;
+ }
+ }
+ }
+ }
+ return {err, ret.str()};
+}
+
+static Answer doGetDefaultParameter(ArgIterator begin, ArgIterator end)
+{
+ std::stringstream ret;
+ int err = 0;
+
+ if (!g_yamlSettings) {
+ for (auto i = begin; i != end; ++i) {
+ if (::arg().parmIsset(*i)) {
+ ret << *i << '=' << ::arg().getDefault(*i) << endl;
+ }
+ else {
+ ret << *i << " not known" << endl;
+ err = 1;
+ }
+ }
+ }
+ else {
+ auto settings = g_yamlStruct.lock();
+ auto defaults = pdns::rust::settings::rec::parse_yaml_string("");
+ if (begin == end) {
+ auto yaml = pdns::settings::rec::defaultsToYaml(false);
ret << std::string(yaml);
}
else {
stringtok(field, *i, ".");
rust::Slice<const ::rust::String> slice{field};
try {
- auto yaml = settings->get_value(slice, pdns::settings::rec::defaultsToYaml(false));
+ auto yaml = defaults.get_value(slice, pdns::settings::rec::defaultsToYaml(false), false);
ret << std::string(yaml);
}
catch (const std::exception& stdex) {
{"get-dont-throttle-netmasks", "Get the list of netmasks that are not allowed to be throttled"},
{"get-ntas", "Get all configured Negative Trust Anchors"},
{"get-tas", "Get all configured Trust Anchors"},
- {"get-parameter [key1] [key2] ..", "Get configuration parameters"},
+ {"get-parameter [key1] ..", "Get configuration parameters"},
+ {"get-default-parameter [key1] ..", "Get default configuration parameters"},
{"get-proxymapping-stats", "Get proxy mapping statistics"},
{"get-qtypelist", "Get QType statistics. Note queries from cache aren't being counted yet"},
{"get-remotelogger-stats", "Get remote logger statistics"},
{"get-all", getAllStats},
{"get", doGet},
{"get-parameter", doGetParameter},
+ {"get-default-parameter", doGetDefaultParameter},
{"quit", [&](ArgIterator, ArgIterator) -> Answer { *command = doExit; return {0, "bye\n"}; }},
{"version", [&](ArgIterator, ArgIterator) -> Answer { return {0, getPDNSVersion() + "\n"}; }},
{"quit-nicely", [&](ArgIterator, ArgIterator) -> Answer { *command = doExitNicely; return {0, "bye nicely\n"}; }},