|
@@ -621,6 +621,15 @@ unsigned int EmbeddedNetworkController::handleControlPlaneHttpPOST(
|
|
if (b.count("activeBridge")) member["activeBridge"] = OSUtils::jsonBool(b["activeBridge"],false);
|
|
if (b.count("activeBridge")) member["activeBridge"] = OSUtils::jsonBool(b["activeBridge"],false);
|
|
if (b.count("noAutoAssignIps")) member["noAutoAssignIps"] = OSUtils::jsonBool(b["noAutoAssignIps"],false);
|
|
if (b.count("noAutoAssignIps")) member["noAutoAssignIps"] = OSUtils::jsonBool(b["noAutoAssignIps"],false);
|
|
|
|
|
|
|
|
+ if (b.count("remoteTraceTarget")) {
|
|
|
|
+ const std::string rtt(OSUtils::jsonString(b["remoteTraceTarget"],""));
|
|
|
|
+ if (rtt.length() == 10) {
|
|
|
|
+ member["remoteTraceTarget"] = rtt;
|
|
|
|
+ } else {
|
|
|
|
+ member["remoteTraceTarget"] = json();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
if (b.count("authorized")) {
|
|
if (b.count("authorized")) {
|
|
const bool newAuth = OSUtils::jsonBool(b["authorized"],false);
|
|
const bool newAuth = OSUtils::jsonBool(b["authorized"],false);
|
|
if (newAuth != OSUtils::jsonBool(member["authorized"],false)) {
|
|
if (newAuth != OSUtils::jsonBool(member["authorized"],false)) {
|
|
@@ -764,6 +773,15 @@ unsigned int EmbeddedNetworkController::handleControlPlaneHttpPOST(
|
|
if (b.count("multicastLimit")) network["multicastLimit"] = OSUtils::jsonInt(b["multicastLimit"],32ULL);
|
|
if (b.count("multicastLimit")) network["multicastLimit"] = OSUtils::jsonInt(b["multicastLimit"],32ULL);
|
|
if (b.count("mtu")) network["mtu"] = std::max(std::min((unsigned int)OSUtils::jsonInt(b["mtu"],ZT_DEFAULT_MTU),(unsigned int)ZT_MAX_MTU),(unsigned int)ZT_MIN_MTU);
|
|
if (b.count("mtu")) network["mtu"] = std::max(std::min((unsigned int)OSUtils::jsonInt(b["mtu"],ZT_DEFAULT_MTU),(unsigned int)ZT_MAX_MTU),(unsigned int)ZT_MIN_MTU);
|
|
|
|
|
|
|
|
+ if (b.count("remoteTraceTarget")) {
|
|
|
|
+ const std::string rtt(OSUtils::jsonString(b["remoteTraceTarget"],""));
|
|
|
|
+ if (rtt.length() == 10) {
|
|
|
|
+ network["remoteTraceTarget"] = rtt;
|
|
|
|
+ } else {
|
|
|
|
+ network["remoteTraceTarget"] = json();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
if (b.count("v4AssignMode")) {
|
|
if (b.count("v4AssignMode")) {
|
|
json nv4m;
|
|
json nv4m;
|
|
json &v4m = b["v4AssignMode"];
|
|
json &v4m = b["v4AssignMode"];
|
|
@@ -1065,6 +1083,55 @@ unsigned int EmbeddedNetworkController::handleControlPlaneHttpDELETE(
|
|
return 404;
|
|
return 404;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+void EmbeddedNetworkController::handleRemoteTrace(const ZT_RemoteTrace &rt)
|
|
|
|
+{
|
|
|
|
+ // Convert Dictionary into JSON object
|
|
|
|
+ json d;
|
|
|
|
+ char *saveptr = (char *)0;
|
|
|
|
+ for(char *l=Utils::stok(rt.data,"\n",&saveptr);(l);l=Utils::stok((char *)0,"\n",&saveptr)) {
|
|
|
|
+ char *eq = strchr(l,'=');
|
|
|
|
+ if (eq > l) {
|
|
|
|
+ std::string k(l,(unsigned long)(eq - l));
|
|
|
|
+ std::string v;
|
|
|
|
+ ++eq;
|
|
|
|
+ while (*eq) {
|
|
|
|
+ if (*eq == '\\') {
|
|
|
|
+ ++eq;
|
|
|
|
+ if (*eq) {
|
|
|
|
+ switch(*eq) {
|
|
|
|
+ case 'r':
|
|
|
|
+ v.push_back('\r');
|
|
|
|
+ break;
|
|
|
|
+ case 'n':
|
|
|
|
+ v.push_back('\n');
|
|
|
|
+ break;
|
|
|
|
+ case '0':
|
|
|
|
+ v.push_back((char)0);
|
|
|
|
+ break;
|
|
|
|
+ case 'e':
|
|
|
|
+ v.push_back('=');
|
|
|
|
+ break;
|
|
|
|
+ default:
|
|
|
|
+ v.push_back(*eq);
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ ++eq;
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ v.push_back(*(eq++));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if (v.length() > 0)
|
|
|
|
+ d[k] = v;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ char p[128];
|
|
|
|
+ OSUtils::ztsnprintf(p,sizeof(p),"trace/%.10llx_%.16llx.json",rt.origin,OSUtils::now());
|
|
|
|
+ _db.writeRaw(p,OSUtils::jsonDump(d));
|
|
|
|
+ //fprintf(stdout,"%s\n",OSUtils::jsonDump(d).c_str()); fflush(stdout);
|
|
|
|
+}
|
|
|
|
+
|
|
void EmbeddedNetworkController::threadMain()
|
|
void EmbeddedNetworkController::threadMain()
|
|
throw()
|
|
throw()
|
|
{
|
|
{
|