#define UNIX_PATH_MAX 108
#endif
+#ifdef REMOTEBACKEND_HTTP
HTTPConnector::HTTPConnector(std::map<std::string,std::string> options) {
this->d_url = options.find("url")->second;
if (options.find("url-suffix") != options.end()) {
}
// converts json value into string
-void HTTPConnector::json2string(const Json::Value &input, std::string &output) {
- if (input.isString()) output = input.asString();
- else if (input.isNull()) output = "";
- else if (input.isUInt()) output = lexical_cast<std::string>(input.asUInt());
- else if (input.isInt()) output = lexical_cast<std::string>(input.asInt());
+void HTTPConnector::json2string(const rapidjson::Value &input, std::string &output) {
+ if (input.IsString()) output = input.GetString();
+ else if (input.IsNull()) output = "";
+ else if (input.IsUint()) output = lexical_cast<std::string>(input.GetUint());
+ else if (input.IsInt()) output = lexical_cast<std::string>(input.GetInt());
else output = "inconvertible value";
}
+void HTTPConnector::addUrlComponent(const rapidjson::Value ¶meters, const char *element, std::stringstream& ss) {
+ rapidjson::Value nullval;
+ std::string sparam;
+ nullval.SetNull();
+ const rapidjson::Value& param = (parameters.HasMember(element)?parameters[element]:nullval);
+ if (param.IsNull() == false) {
+ json2string(param, sparam);
+ ss << "/" << sparam;
+ }
+}
+
+
// builds our request
-void HTTPConnector::requestbuilder(const std::string &method, const Json::Value ¶meters, struct curl_slist **slist)
+void HTTPConnector::requestbuilder(const std::string &method, const rapidjson::Value ¶meters, struct curl_slist **slist)
{
std::stringstream ss;
- Json::Value param;
std::string sparam;
char *tmpstr;
- // check for certain elements
- std::vector<std::string> members = parameters.getMemberNames();
-
// special names are qname, name, zonename, kind, others go to headers
ss << d_url;
// add the url components, if found, in following order.
// id must be first due to the fact that the qname/name can be empty
- if ((param = parameters.get("id", Json::Value())).isNull() == false) {
- json2string(param, sparam);
- ss << "/" << sparam;
- }
- if ((param = parameters.get("zonename", Json::Value())).isNull() == false) {
- json2string(param, sparam);
- ss << "/" << sparam;
- }
- if ((param = parameters.get("qname", Json::Value())).isNull() == false) {
- json2string(param, sparam);
- ss << "/" << sparam;
- }
-
- if ((param = parameters.get("name", Json::Value())).isNull() == false) {
- json2string(param, sparam);
- ss << "/" << sparam;
- }
-
- if ((param = parameters.get("kind", Json::Value())).isNull() == false) {
- json2string(param, sparam);
- ss << "/" << sparam;
- }
- if ((param = parameters.get("qtype", Json::Value())).isNull() == false) {
- json2string(param, sparam);
- ss << "/" << sparam;
- }
+ addUrlComponent(parameters, "id", ss);
+ addUrlComponent(parameters, "zonename", ss);
+ addUrlComponent(parameters, "qname", ss);
+ addUrlComponent(parameters, "name", ss);
+ addUrlComponent(parameters, "kind", ss);
+ addUrlComponent(parameters, "qtype", ss);
// finally add suffix
ss << d_url_suffix;
} else if (method == "addDomainKey") {
// create post with keydata
std::stringstream ss2;
- param = parameters["key"];
- ss2 << "flags=" << param["flags"].asUInt() << "&active=" << (param["active"].asBool() ? 1 : 0) << "&content=";
- tmpstr = curl_easy_escape(d_c, param["content"].asCString(), 0);
+ const rapidjson::Value& param = parameters["key"];
+ ss2 << "flags=" << param["flags"].GetUint() << "&active=" << (param["active"].GetBool() ? 1 : 0) << "&content=";
+ tmpstr = curl_easy_escape(d_c, param["content"].GetString(), 0);
ss2 << tmpstr;
sparam = ss2.str();
curl_easy_setopt(d_c, CURLOPT_POSTFIELDSIZE, sparam.size());
int n=0;
// copy all metadata values into post
std::stringstream ss2;
- param = parameters["value"];
+ const rapidjson::Value& param = parameters["value"];
curl_easy_setopt(d_c, CURLOPT_POST, 1);
// this one has values too
- if (param.isArray()) {
- for(Json::ValueIterator i = param.begin(); i != param.end(); i++) {
- ss2 << "value" << (++n) << "=" << (*i).asString() << "&";
+ if (param.IsArray()) {
+ for(rapidjson::Value::ConstValueIterator i = param.Begin(); i != param.End(); i++) {
+ ss2 << "value" << (++n) << "=" << i->GetString() << "&";
}
}
sparam = ss2.str();
}
// put everything else into headers
- BOOST_FOREACH(std::string member, members) {
+ for (rapidjson::Value::ConstMemberIterator iter = parameters.MemberBegin(); iter != parameters.MemberEnd(); ++iter) {
char header[1024];
+ const char *member = iter->name.GetString();
// these are not put into headers for obvious reasons
- if (member == "zonename" || member == "qname" ||
- member == "name" || member == "kind" ||
- member == "qtype" || member == "id" ||
- member == "key" ) continue;
+ if (!strncmp(member,"zonename",8) || !strncmp(member,"qname",5) ||
+ !strncmp(member,"name",4) || !strncmp(member,"kind",4) ||
+ !strncmp(member,"qtype",5) || !strncmp(member,"id",2) ||
+ !strncmp(member,"key",3)) continue;
json2string(parameters[member], sparam);
- snprintf(header, sizeof header, "X-RemoteBackend-%s: %s", member.c_str(), sparam.c_str());
+ snprintf(header, sizeof header, "X-RemoteBackend-%s: %s", iter->name.GetString(), sparam.c_str());
(*slist) = curl_slist_append((*slist), header);
};
curl_easy_setopt(d_c, CURLOPT_HTTPHEADER, *slist);
}
-int HTTPConnector::send_message(const Json::Value &input) {
+int HTTPConnector::send_message(const rapidjson::Document &input) {
int rv;
long rcode;
struct curl_slist *slist;
slist = NULL;
// build request
- requestbuilder(input["method"].asString(), input["parameters"], &slist);
+ requestbuilder(input["method"].GetString(), input["parameters"], &slist);
// setup write function helper
curl_easy_setopt(d_c, CURLOPT_WRITEFUNCTION, &(httpconnector_write_data));
return rv;
}
-int HTTPConnector::recv_message(Json::Value &output) {
- Json::Reader r;
+int HTTPConnector::recv_message(rapidjson::Document &output) {
+ rapidjson::StringStream ss(d_data.c_str());
int rv = -1;
+ output.ParseStream<0>(ss);
// offer whatever we read in send_message
- if (r.parse(d_data, output) == true)
+ if (output.HasParseError() == false)
rv = d_data.size();
d_data = ""; // cleanup here
return rv;
}
+
+#endif
* we need to do some treatment to the value before
* sending it downwards.
*/
-bool Connector::send(Json::Value &value) {
+bool Connector::send(rapidjson::Document &value) {
return send_message(value);
}
* that the receiving happened ok, and extract
* result. Logging is performed here, too.
*/
-bool Connector::recv(Json::Value &value) {
- Json::Value input;
+bool Connector::recv(rapidjson::Value &value) {
+ rapidjson::Document input;
if (recv_message(input)>0) {
bool rv = true;
// check for error
- value = input.get("result",Json::Value());
- if (value.isNull() || (value.isBool() && value.asBool() == false)) {
+ if (input.HasMember("result")) {
+ value = input["result"];
+ } else {
+ value = false;
+ return false;
+ }
+ if (!value.IsObject() && (value.IsBool() && value.GetBool() == false)) {
rv = false;
- value = Json::Value(false);
- }
- Json::Value messages = input.get("log", Json::Value());
- if (messages.isArray()) {
- // log em all
- for(Json::ValueIterator iter = messages.begin(); iter != messages.end(); iter++) {
- L<<Logger::Info<<"[remotebackend]:"<< (*iter).asString()<<std::endl;
+ value = false;
+ }
+ if (input.HasMember("log")) {
+ const rapidjson::Value& messages = input["log"];
+ if (messages.IsArray()) {
+ // log em all
+ for (rapidjson::Value::ConstValueIterator iter = messages.Begin(); iter != messages.End(); ++iter)
+ L<<Logger::Info<<"[remotebackend]:"<< iter->GetString() <<std::endl;
+ } else if (messages.IsString()) { // could be just a string, too
+ L<<Logger::Info<<"[remotebackend]:"<< messages.GetString() <<std::endl;
}
}
return rv;
}
// connectors know what they are doing
- if (type == "http") {
- this->connector = new HTTPConnector(options);
- } else if (type == "unix") {
+ if (type == "unix") {
this->connector = new UnixsocketConnector(options);
+#ifdef REMOTEBACKEND_HTTP
+ } else if (type == "http") {
+ this->connector = new HTTPConnector(options);
+#endif
} else if (type == "pipe") {
this->connector = new PipeConnector(options);
} else {
* data is mainly left alone, some defaults are assumed.
*/
void RemoteBackend::lookup(const QType &qtype, const std::string &qdomain, DNSPacket *pkt_p, int zoneId) {
- Json::Value query,args;
+ rapidjson::Document query;
+ rapidjson::Value parameters;
if (d_index != -1)
throw AhuException("Attempt to lookup while one running");
- args["qtype"] = qtype.getName();
- args["qname"] = qdomain;
+ query.SetObject();
+ JSON_ADD_MEMBER(query, "method", "lookup", query.GetAllocator())
+ parameters.SetObject();
+ JSON_ADD_MEMBER(parameters, "qtype", qtype.getName().c_str(), query.GetAllocator());
+ JSON_ADD_MEMBER(parameters, "qname", qdomain.c_str(), query.GetAllocator());
+
if (pkt_p != NULL) {
- args["remote"] = pkt_p->getRemote();
- args["local"] = pkt_p->getLocal();
- args["real-remote"] = pkt_p->getRealRemote().toString();
+ JSON_ADD_MEMBER(parameters, "remote", pkt_p->getRemote().c_str(), query.GetAllocator());
+ JSON_ADD_MEMBER(parameters, "local", pkt_p->getRemote().c_str(), query.GetAllocator());
+ JSON_ADD_MEMBER(parameters, "real-remote", pkt_p->getRealRemote().toString().c_str(), query.GetAllocator());
}
- args["zone-id"] = zoneId;
- query["method"] = "lookup";
- query["parameters"] = args;
+ JSON_ADD_MEMBER(parameters, "zone-id", zoneId, query.GetAllocator());
+ query.AddMember("parameters", parameters, query.GetAllocator());
if (connector->send(query) == false || connector->recv(d_result) == false) return;
- // OK. we have result values in result
- if (d_result.isArray() == false) return;
+ // OK. we have result parametersues in result
+ if (d_result.IsArray() == false) return;
d_index = 0;
}
bool RemoteBackend::get(DNSResourceRecord &rr) {
if (d_index == -1) return false;
-
- Json::Value empty("");
- Json::Value emptyint(-1);
+ rapidjson::Value value;
- rr.qtype = d_result[d_index].get("qtype",empty).asString();
- rr.qname = d_result[d_index].get("qname",empty).asString();
+ value = "";
+ rr.qtype = JSON_GET(d_result[d_index], "qtype", value).GetString();
+ rr.qname = JSON_GET(d_result[d_index], "qname", value).GetString();
rr.qclass = QClass::IN;
- rr.content = d_result[d_index].get("content",empty).asString();
- rr.ttl = d_result[d_index].get("ttl",emptyint).asInt();
- rr.domain_id = d_result[d_index].get("domain_id",emptyint).asInt();
- rr.priority = d_result[d_index].get("priority",emptyint).asInt();
+ rr.content = JSON_GET(d_result[d_index], "content",value).GetString();
+ value = -1;
+ rr.ttl = JSON_GET(d_result[d_index], "ttl",value).GetInt();
+ rr.domain_id = JSON_GET(d_result[d_index],"domain_id",value).GetInt();
+ rr.priority = JSON_GET(d_result[d_index],"priority",value).GetInt();
+ value = 1;
if (d_dnssec)
- rr.auth = d_result[d_index].get("auth", Json::Value(1)).asInt();
+ rr.auth = JSON_GET(d_result[d_index],"auth", value).GetInt();
else
rr.auth = 1;
- rr.scopeMask = d_result[d_index].get("scopeMask",Json::Value(0)).asInt();
+ value = 0;
+ rr.scopeMask = JSON_GET(d_result[d_index],"scopeMask", value).GetInt();
d_index++;
// id index is out of bounds, we know the results end here.
- if (d_index == static_cast<int>(d_result.size())) {
- d_result = Json::Value();
+ if (d_index == static_cast<int>(d_result.Size())) {
+ d_result.SetNull();
d_index = -1;
}
return true;
}
bool RemoteBackend::list(const std::string &target, int domain_id) {
- Json::Value query;
+ rapidjson::Document query;
+ rapidjson::Value parameters;
if (d_index != -1)
throw AhuException("Attempt to lookup while one running");
+ query.SetObject();
+ JSON_ADD_MEMBER(query, "method", "list", query.GetAllocator());
query["method"] = "list";
- query["parameters"] = Json::Value();
- query["parameters"]["zonename"] = target;
- query["parameters"]["domain-id"] = domain_id;
+ parameters.SetObject();
+ JSON_ADD_MEMBER(parameters, "zonename", target.c_str(), query.GetAllocator());
+ JSON_ADD_MEMBER(parameters, "domain-id", domain_id, query.GetAllocator());
+ query.AddMember("parameters", parameters, query.GetAllocator());
if (connector->send(query) == false || connector->recv(d_result) == false)
return false;
- d_index = 0;
+ if (d_result.IsArray() == false)
+ return false;
+ d_index = 0;
return true;
}
bool RemoteBackend::getBeforeAndAfterNamesAbsolute(uint32_t id, const std::string& qname, std::string& unhashed, std::string& before, std::string& after) {
- Json::Value query,answer;
+ rapidjson::Document query;
+ rapidjson::Value answer,parameters;
// no point doing dnssec if it's not supported
if (d_dnssec == false) return false;
- query["method"] = "getBeforeAndAfterNamesAbsolute";
- query["parameters"] = Json::Value();
- query["parameters"]["id"] = id;
- query["parameters"]["qname"] = qname;
+ query.SetObject();
+ JSON_ADD_MEMBER(query, "method", "getBeforeAndAfterNamesAbsolute", query.GetAllocator());
+
+ parameters.SetObject();
+ JSON_ADD_MEMBER(parameters, "id", id, query.GetAllocator());
+ JSON_ADD_MEMBER(parameters, "qname", qname.c_str(), query.GetAllocator());
+ query.AddMember("parameters", parameters, query.GetAllocator());
if (connector->send(query) == false || connector->recv(answer) == false)
return false;
-
- unhashed = answer["unhashed"].asString();
- before = answer["before"].asString();
- after = answer["after"].asString();
+
+ unhashed = answer["unhashed"].GetString();
+ before = answer["before"].GetString();
+ after = answer["after"].GetString();
return true;
}
bool RemoteBackend::getDomainMetadata(const std::string& name, const std::string& kind, std::vector<std::string>& meta) {
- Json::Value query,answer;
+ rapidjson::Document query;
+ rapidjson::Value answer,parameters;
+
+ query.SetObject();
+ JSON_ADD_MEMBER(query, "method", "getDomainMetadata", query.GetAllocator());
+ parameters.SetObject();
+ JSON_ADD_MEMBER(parameters, "name", name.c_str(), query.GetAllocator());
+ JSON_ADD_MEMBER(parameters, "kind", kind.c_str(), query.GetAllocator());
+ query.AddMember("parameters", parameters, query.GetAllocator());
- query["method"] = "getDomainMetadata";
- query["parameters"] = Json::Value();
- query["parameters"]["name"] = name;
- query["parameters"]["kind"] = kind;
if (connector->send(query) == false)
return false;
meta.clear();
if (connector->recv(answer) == false)
return true;
- for(Json::ValueIterator iter = answer.begin(); iter != answer.end(); iter++) {
- meta.push_back((*iter).asString());
+ for(rapidjson::Value::ValueIterator iter = answer.Begin(); iter != answer.End(); iter++) {
+ meta.push_back(iter->GetString());
}
return true;
}
bool RemoteBackend::setDomainMetadata(const string& name, const std::string& kind, const std::vector<std::string>& meta) {
- Json::Value query,answer;
- query["method"] = "setDomainMetadata";
- query["parameters"] = Json::Value();
- query["parameters"]["name"] = name;
- query["parameters"]["kind"] = kind;
- query["parameters"]["value"] = Json::Value();
+ rapidjson::Document query;
+ rapidjson::Value answer,parameters,val;
+ query.SetObject();
+ JSON_ADD_MEMBER(query, "method", "setDomainMetadata", query.GetAllocator());
+ parameters.SetObject();
+ JSON_ADD_MEMBER(parameters, "name", name.c_str(), query.GetAllocator());
+ JSON_ADD_MEMBER(parameters, "kind", kind.c_str(), query.GetAllocator());
+ val.SetArray();
BOOST_FOREACH(std::string value, meta) {
- query["parameters"]["value"].append(value);
+ val.PushBack(value.c_str(), query.GetAllocator());
}
+ parameters.AddMember("value", val, query.GetAllocator());
+ query.AddMember("parameters", parameters, query.GetAllocator());
if (connector->send(query) == false || connector->recv(answer) == false)
return false;
- return answer.asBool();
+ if (answer.IsBool())
+ return answer.GetBool();
+ return false;
}
bool RemoteBackend::getDomainKeys(const std::string& name, unsigned int kind, std::vector<DNSBackend::KeyData>& keys) {
- Json::Value query,answer;
+ rapidjson::Document query;
+ rapidjson::Value answer,parameters;
// no point doing dnssec if it's not supported
if (d_dnssec == false) return false;
- query["method"] = "getDomainKeys";
- query["parameters"] = Json::Value();
- query["parameters"]["name"] = name;
- query["parameters"]["kind"] = kind;
+ query.SetObject();
+ JSON_ADD_MEMBER(query, "method", "getDomainKeys", query.GetAllocator());
+ parameters.SetObject();
+ JSON_ADD_MEMBER(parameters, "name", name.c_str(), query.GetAllocator());
+ JSON_ADD_MEMBER(parameters, "kind", kind, query.GetAllocator());
+ query.AddMember("parameters", parameters, query.GetAllocator());
if (connector->send(query) == false || connector->recv(answer) == false)
return false;
keys.clear();
- for(Json::ValueIterator iter = answer.begin(); iter != answer.end(); iter++) {
+ for(rapidjson::Value::ValueIterator iter = answer.Begin(); iter != answer.End(); iter++) {
DNSBackend::KeyData key;
- key.id = (*iter)["id"].asUInt();
- key.flags = (*iter)["flags"].asUInt();
- key.active = (*iter)["active"].asBool();
- key.content = (*iter)["content"].asString();
+ key.id = (*iter)["id"].GetUint();
+ key.flags = (*iter)["flags"].GetUint();
+ key.active = (*iter)["active"].GetBool();
+ key.content = (*iter)["content"].GetString();
keys.push_back(key);
}
}
bool RemoteBackend::removeDomainKey(const string& name, unsigned int id) {
- Json::Value query,answer;
+ rapidjson::Document query;
+ rapidjson::Value answer,parameters;
// no point doing dnssec if it's not supported
if (d_dnssec == false) return false;
- query["method"] = "remoteDomainKey";
- query["parameters"] = Json::Value();
- query["parameters"]["name"] = name;
- query["parameters"]["id"] = id;
+
+ query.SetObject();
+ JSON_ADD_MEMBER(query, "method", "getDomainKeys", query.GetAllocator());
+ parameters.SetObject();
+ JSON_ADD_MEMBER(parameters, "name", name.c_str(), query.GetAllocator());
+ JSON_ADD_MEMBER(parameters, "id", id, query.GetAllocator());
+ query.AddMember("parameters", parameters, query.GetAllocator());
if (connector->send(query) == false || connector->recv(answer) == false)
return false;
- return answer.asBool();
+ return answer.GetBool();
}
int RemoteBackend::addDomainKey(const string& name, const KeyData& key) {
- Json::Value query,answer;
+ rapidjson::Document query;
+ rapidjson::Value answer,parameters,jkey;
// no point doing dnssec if it's not supported
if (d_dnssec == false) return false;
- query["method"] = "addDomainKey";
- query["parameters"] = Json::Value();
- query["parameters"]["name"] = name;
- query["parameters"]["key"] = Json::Value();
- query["parameters"]["key"]["flags"] = key.flags;
- query["parameters"]["key"]["active"] = key.active;
- query["parameters"]["key"]["content"] = key.content;
+ query.SetObject();
+ JSON_ADD_MEMBER(query, "method", "addDomainKey", query.GetAllocator());
+ parameters.SetObject();
+ JSON_ADD_MEMBER(parameters, "name", name.c_str(), query.GetAllocator());
+ jkey.SetObject();
+ JSON_ADD_MEMBER(jkey, "flags", key.flags, query.GetAllocator());
+ JSON_ADD_MEMBER(jkey, "active", key.active, query.GetAllocator());
+ JSON_ADD_MEMBER(jkey, "content", key.content.c_str(), query.GetAllocator());
+ parameters.AddMember("key", jkey, query.GetAllocator());
+ query.AddMember("parameters", parameters, query.GetAllocator());
if (connector->send(query) == false || connector->recv(answer) == false)
return false;
- return answer.asInt();
+ return answer.GetInt();
}
bool RemoteBackend::activateDomainKey(const string& name, unsigned int id) {
- Json::Value query,answer;
+ rapidjson::Document query;
+ rapidjson::Value answer, parameters;
+
// no point doing dnssec if it's not supported
if (d_dnssec == false) return false;
- query["method"] = "activateDomainKey";
- query["parameters"] = Json::Value();
- query["parameters"]["name"] = name;
- query["parameters"]["id"] = id;
+
+ query.SetObject();
+ JSON_ADD_MEMBER(query, "method", "activateDomainKey", query.GetAllocator());
+ parameters.SetObject();
+ JSON_ADD_MEMBER(parameters, "name", name.c_str(), query.GetAllocator());
+ JSON_ADD_MEMBER(parameters, "id", id, query.GetAllocator());
+ query.AddMember("parameters", parameters, query.GetAllocator());
if (connector->send(query) == false || connector->recv(answer) == false)
return false;
- return answer.asBool();
+ return answer.GetBool();
}
bool RemoteBackend::deactivateDomainKey(const string& name, unsigned int id) {
- Json::Value query,answer;
+ rapidjson::Document query;
+ rapidjson::Value answer, parameters;
+
// no point doing dnssec if it's not supported
if (d_dnssec == false) return false;
- query["method"] = "deactivateDomainKey";
- query["parameters"] = Json::Value();
- query["parameters"]["name"] = name;
- query["parameters"]["id"] = id;
+
+ query.SetObject();
+ JSON_ADD_MEMBER(query, "method", "deactivateDomainKey", query.GetAllocator());
+ parameters.SetObject();
+ JSON_ADD_MEMBER(parameters, "name", name.c_str(), query.GetAllocator());
+ JSON_ADD_MEMBER(parameters, "id", id, query.GetAllocator());
+ query.AddMember("parameters", parameters, query.GetAllocator());
+
if (connector->send(query) == false || connector->recv(answer) == false)
return false;
- return answer.asBool();
+ return answer.GetBool();
}
bool RemoteBackend::doesDNSSEC() {
}
bool RemoteBackend::getTSIGKey(const std::string& name, std::string* algorithm, std::string* content) {
- Json::Value query,answer;
- query["method"] = "getTSIGKey";
- query["parameters"] = Json::Value();
- query["parameters"]["name"] = name;
+ rapidjson::Document query;
+ rapidjson::Value answer, parameters;
+
+ // no point doing dnssec if it's not supported
+ if (d_dnssec == false) return false;
+ query.SetObject();
+ JSON_ADD_MEMBER(query, "method", "getTSIGKey", query.GetAllocator());
+ parameters.SetObject();
+ JSON_ADD_MEMBER(parameters, "name", name.c_str(), query.GetAllocator());
+ query.AddMember("parameters", parameters, query.GetAllocator());
if (connector->send(query) == false || connector->recv(answer) == false)
return false;
if (algorithm != NULL)
- algorithm->assign(answer["algorithm"].asString());
+ algorithm->assign(answer["algorithm"].GetString());
if (content != NULL)
- content->assign(answer["content"].asString());
+ content->assign(answer["content"].GetString());
return true;
}
bool RemoteBackend::getDomainInfo(const string &domain, DomainInfo &di) {
- Json::Value query,answer;
+ rapidjson::Document query;
+ rapidjson::Value answer, parameters;
+ rapidjson::Value value;
std::string kind;
- query["method"] = "getDomainInfo";
- query["parameters"] = Json::Value();
- query["parameters"]["name"] = domain;
+
+ query.SetObject();
+ JSON_ADD_MEMBER(query, "method", "getDomainInfo", query.GetAllocator());
+ parameters.SetObject();
+ JSON_ADD_MEMBER(parameters, "name", domain.c_str(), query.GetAllocator());
+ query.AddMember("parameters", parameters, query.GetAllocator());
if (connector->send(query) == false || connector->recv(answer) == false)
return false;
// make sure we got zone & kind
- if (!answer.isMember("zone")) {
+ if (!answer.HasMember("zone")) {
L<<Logger::Error<<kBackendId<<"Missing zone in getDomainInfo return value"<<endl;
throw new AhuException();
}
+ value = -1;
// parse return value. we need at least zone,serial,kind
- di.id = answer.get("id", Json::Value(-1)).asInt();
- di.zone = answer["zone"].asString();
- if (answer.isMember("masters") && answer["masters"].isArray()) {
- Json::Value value = answer["masters"];
- for(Json::Value::iterator i = value.begin(); i != value.end(); i++) {
- di.masters.push_back((*i).asString());
+ di.id = JSON_GET(answer,"id",value).GetInt();
+ di.zone = answer["zone"].GetString();
+ if (answer.HasMember("masters") && answer["masters"].IsArray()) {
+ rapidjson::Value& value = answer["masters"];
+ for(rapidjson::Value::ValueIterator i = value.Begin(); i != value.End(); i++) {
+ di.masters.push_back(i->GetString());
}
}
- di.notified_serial = answer.get("notified_serial", Json::Value(-1)).asInt();
- di.serial = answer.get("serial", Json::Value(0)).asInt();
- di.last_check = answer.get("last_check", Json::Value(0)).asInt();
- kind = answer.get("kind", Json::Value("native")).asString();
+ di.notified_serial = JSON_GET(answer, "notified_serial", value).GetInt();
+ value = 0;
+ di.serial = JSON_GET(answer,"serial", value).GetInt();
+ di.last_check = JSON_GET(answer,"last_check", value).GetInt();
+ value = "native";
+ kind = JSON_GET(answer, "kind", value).GetString();
if (kind == "master") {
di.kind = DomainInfo::Master;
} else if (kind == "slave") {
}
void RemoteBackend::setNotified(uint32_t id, uint32_t serial) {
- Json::Value query,answer;
- std::string kind;
- query["method"] = "setNotified";
- query["parameters"] = Json::Value();
- query["parameters"]["id"] = id;
- query["parameters"]["serial"] = serial;
+ rapidjson::Document query;
+ rapidjson::Value answer, parameters;
+
+ query.SetObject();
+ JSON_ADD_MEMBER(query, "method", "setNotified", query.GetAllocator());
+ parameters.SetObject();
+ JSON_ADD_MEMBER(parameters, "id", id, query.GetAllocator());
+ JSON_ADD_MEMBER(parameters, "serial", id, query.GetAllocator());
+
if (connector->send(query) == false || connector->recv(answer) == false) {
L<<Logger::Error<<kBackendId<<"Failed to execute RPC for RemoteBackend::setNotified("<<id<<","<<serial<<")"<<endl;
}
{
declare(suffix,"dnssec","Enable dnssec support","no");
declare(suffix,"connection-string","Connection string","");
+ declare(suffix,"timeout","Timeout in milliseconds to wait for reply","2000");
}
DNSBackend *make(const std::string &suffix="")
public:
RemoteLoader()
{
+#ifdef REMOTEBACKEND_HTTP
curl_global_init(CURL_GLOBAL_ALL);
+#endif
BackendMakers().report(new RemoteBackendFactory);
L<<Logger::Notice<<kBackendId<<" This is the remotebackend version "VERSION" ("__DATE__", "__TIME__") reporting"<<endl;
}