summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--controller/SqliteNetworkController.cpp43
-rw-r--r--controller/SqliteNetworkController.hpp2
-rw-r--r--service/ControlPlane.cpp8
3 files changed, 53 insertions, 0 deletions
diff --git a/controller/SqliteNetworkController.cpp b/controller/SqliteNetworkController.cpp
index 16f8e5e9..92b8c32c 100644
--- a/controller/SqliteNetworkController.cpp
+++ b/controller/SqliteNetworkController.cpp
@@ -180,6 +180,8 @@ SqliteNetworkController::SqliteNetworkController(const char *dbPath) :
||(sqlite3_prepare_v2(_db,"DELETE FROM Rule WHERE networkId = ?",-1,&_sDeleteRulesForNetwork,(const char **)0) != SQLITE_OK)
||(sqlite3_prepare_v2(_db,"INSERT INTO IpAssignmentPool (networkId,ipNetwork,ipNetmaskBits,ipVersion) VALUES (?,?,?,?)",-1,&_sCreateIpAssignmentPool,(const char **)0) != SQLITE_OK)
||(sqlite3_prepare_v2(_db,"UPDATE Member SET ? = ? WHERE rowid = ?",-1,&_sUpdateMemberField,(const char **)0) != SQLITE_OK)
+ ||(sqlite3_prepare_v2(_db,"DELETE FROM Member WHERE networkId = ? AND nodeId = ?",-1,&_sDeleteMember,(const char **)0) != SQLITE_OK)
+ ||(sqlite3_prepare_v2(_db,"DELETE FROM IpAssignment WHERE networkId = ?; DELETE FROM IpAssignmentPool WHERE networkId = ?; DELETE FROM Member WHERE networkId = ?; DELETE FROM MulticastRate WHERE networkId = ?; DELETE FROM Relay WHERE networkId = ?; DELETE FROM Rule WHERE networkId = ?; DELETE FROM Network WHERE id = ?;",-1,&_sDeleteNetworkAndRelated,(const char **)0) != SQLITE_OK)
) {
sqlite3_close(_db);
throw std::runtime_error("SqliteNetworkController unable to initialize one or more prepared statements");
@@ -223,6 +225,7 @@ SqliteNetworkController::~SqliteNetworkController()
sqlite3_finalize(_sDeleteRulesForNetwork);
sqlite3_finalize(_sCreateIpAssignmentPool);
sqlite3_finalize(_sUpdateMemberField);
+ sqlite3_finalize(_sDeleteNetworkAndRelated);
sqlite3_close(_db);
}
}
@@ -1214,6 +1217,46 @@ unsigned int SqliteNetworkController::handleControlPlaneHttpDELETE(
return 404;
Mutex::Lock _l(_lock);
+ if (path[0] == "network") {
+
+ if ((path.size() >= 2)&&(path[1].length() == 16)) {
+ uint64_t nwid = Utils::hexStrToU64(path[1].c_str());
+ char nwids[24];
+ Utils::snprintf(nwids,sizeof(nwids),"%.16llx",(unsigned long long)nwid);
+
+ if (path.size() >= 3) {
+
+ if ((path.size() == 4)&&(path[2] == "member")&&(path[3].length() == 10)) {
+ uint64_t address = Utils::hexStrToU64(path[3].c_str());
+ char addrs[24];
+ Utils::snprintf(addrs,sizeof(addrs),"%.10llx",address);
+
+ sqlite3_reset(_sDeleteIpAllocations);
+ sqlite3_bind_text(_sDeleteIpAllocations,1,nwids,16,SQLITE_STATIC);
+ sqlite3_bind_text(_sDeleteIpAllocations,2,addrs,10,SQLITE_STATIC);
+ if (sqlite3_step(_sDeleteIpAllocations) == SQLITE_DONE) {
+ sqlite3_reset(_sDeleteMember);
+ sqlite3_bind_text(_sDeleteMember,1,nwids,16,SQLITE_STATIC);
+ sqlite3_bind_text(_sDeleteMember,2,addrs,10,SQLITE_STATIC);
+ if (sqlite3_step(_sDeleteMember) != SQLITE_DONE)
+ return 500;
+ } else return 500;
+
+ return 200;
+ }
+
+ } else {
+
+ sqlite3_reset(_sDeleteNetworkAndRelated);
+ for(int i=1;i<=7;++i)
+ sqlite3_bind_text(_sDeleteNetworkAndRelated,i,nwids,16,SQLITE_STATIC);
+ return ((sqlite3_step(_sDeleteNetworkAndRelated) == SQLITE_DONE) ? 200 : 500);
+
+ }
+ } // else 404
+
+ } // else 404
+
return 404;
}
diff --git a/controller/SqliteNetworkController.hpp b/controller/SqliteNetworkController.hpp
index d2fba0b6..c5d4c51a 100644
--- a/controller/SqliteNetworkController.hpp
+++ b/controller/SqliteNetworkController.hpp
@@ -120,6 +120,8 @@ private:
sqlite3_stmt *_sDeleteRulesForNetwork;
sqlite3_stmt *_sCreateIpAssignmentPool;
sqlite3_stmt *_sUpdateMemberField;
+ sqlite3_stmt *_sDeleteMember;
+ sqlite3_stmt *_sDeleteNetworkAndRelated;
Mutex _lock;
};
diff --git a/service/ControlPlane.cpp b/service/ControlPlane.cpp
index 9173e483..69c5d48d 100644
--- a/service/ControlPlane.cpp
+++ b/service/ControlPlane.cpp
@@ -435,6 +435,14 @@ unsigned int ControlPlane::handleRequest(
} // else 404
_node->freeQueryResult((void *)pl);
} else scode = 500;
+ } else if (ps[0] == "newIdentity") {
+ // Return a newly generated ZeroTier identity -- this is primarily for debugging
+ // and testing to make it easy for automated test scripts to generate test IDs.
+ Identity newid;
+ newid.generate();
+ responseBody = newid.toString(true);
+ responseContentType = "text/plain";
+ scode = 200;
} else {
std::map<std::string,ControlPlaneSubsystem *>::const_iterator ss(_subsystems.find(ps[0]));
if (ss != _subsystems.end())