From: Christian Hofstaedtler Date: Sat, 5 Oct 2013 13:03:30 +0000 (+0200) Subject: ws: implement PUT for zones (update or create) X-Git-Tag: rec-3.6.0-rc1~416^2~6 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=838f3b98431c5729ab545ed7386765744a2054ea;p=pdns ws: implement PUT for zones (update or create) --- diff --git a/pdns/ws.cc b/pdns/ws.cc index 80c2bc0d8..91dd43388 100644 --- a/pdns/ws.cc +++ b/pdns/ws.cc @@ -333,18 +333,19 @@ static string getZone(const string& zonename) { return makeStringFromDocument(doc); } -static string createZone(const string& zonename, varmap_t& varmap) { +static string createOrUpdateZone(const string& zonename, bool onlyCreate, varmap_t& varmap) { UeberBackend B; SOAData sd; DomainInfo di; sd.db = (DNSBackend*)-1; - if (B.getSOA(zonename, sd) && sd.db && B.getDomainInfo(zonename, di)) { + bool exists = (B.getSOA(zonename, sd) && sd.db && B.getDomainInfo(zonename, di)); + if (exists && onlyCreate) { map err; err["error"] = "Domain '"+zonename+"' already exists"; return returnJSONObject(err); } - if (!B.createDomain(zonename, &sd.db)) { + if (!exists && !B.createDomain(zonename, &sd.db)) { map err; err["error"] = "Creating domain '"+zonename+"' failed"; return returnJSONObject(err); @@ -352,26 +353,28 @@ static string createZone(const string& zonename, varmap_t& varmap) { if(!B.getDomainInfo(zonename, di) || !di.backend) { map err; - err["error"] = "Creating domain '"+zonename+"' failed: lookup of domain_id failed"; + err["error"] = "Modifying domain '"+zonename+"' failed: lookup of domain_id failed"; return returnJSONObject(err); } di.backend->setKind(zonename, DomainInfo::stringToKind(varmap["kind"])); di.backend->setMaster(zonename, varmap["master"]); - // create SOA record so zone "really" exists - DNSResourceRecord soa; - soa.qname = zonename; - soa.content = "1"; - soa.qtype = "SOA"; - soa.domain_id = di.id; - soa.auth = 0; - soa.ttl = ::arg().asNum( "default-ttl" ); - soa.priority = 0; + if (!exists) { + // create SOA record so zone "really" exists + DNSResourceRecord soa; + soa.qname = zonename; + soa.content = "1"; + soa.qtype = "SOA"; + soa.domain_id = di.id; + soa.auth = 0; + soa.ttl = ::arg().asNum( "default-ttl" ); + soa.priority = 0; - sd.db->startTransaction(zonename, di.id); - sd.db->feedRecord(soa); - sd.db->commitTransaction(); + sd.db->startTransaction(zonename, di.id); + sd.db->feedRecord(soa); + sd.db->commitTransaction(); + } return getZone(zonename); } @@ -569,7 +572,10 @@ static string jsonDispatch(const string& method, const string& post, varmap_t& v return getZone(zonename); } else if (method == "POST") { // create - return createZone(zonename, varmap); + return createOrUpdateZone(zonename, true, varmap); + } else if (method == "PUT") { + // update or create + return createOrUpdateZone(zonename, false, varmap); } else if (method == "DELETE") { // delete UeberBackend B;