]> granicus.if.org Git - pdns/commitdiff
expose create zone in JSON webserver
authorChristian Hofstaedtler <christian@hofstaedtler.name>
Fri, 20 Sep 2013 13:03:29 +0000 (15:03 +0200)
committerChristian Hofstaedtler <christian@hofstaedtler.name>
Fri, 27 Sep 2013 16:05:44 +0000 (18:05 +0200)
pdns/ws.cc

index 86781e6f0a7ed253a9689deea6d4626a45c9bc3f..c576fef895c8ea6d16f106d59ae067c8c7fe3218 100644 (file)
@@ -503,6 +503,47 @@ static string json_dispatch(const string& method, const string& post, varmap_t&
 
     if(method == "GET") {
       // get current zone
+      return getZone(zonename);
+    } else if (method == "POST") {
+      // create
+      UeberBackend B;
+      SOAData sd;
+      DomainInfo di;
+      sd.db = (DNSBackend*)-1;
+      if(B.getSOA(zonename, sd) && sd.db && B.getDomainInfo(zonename, di)) {
+        map<string, string> err;
+        err["error"] = "Domain '"+zonename+"' already exists";
+        return returnJSONObject(err);
+      }
+
+      if (!B.createDomain(zonename, &sd.db)) {
+        map<string, string> err;
+        err["error"] = "Creating domain '"+zonename+"' failed";
+        return returnJSONObject(err);
+      }
+
+      if(!B.getDomainInfo(zonename, di) || !di.backend) {
+        map<string, string> err;
+        err["error"] = "Creating 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"]);
+
+      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();
+
       return getZone(zonename);
     } else {
       map<string, string> err;