summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--one.cpp60
-rw-r--r--osdep/Http.cpp2
-rw-r--r--service/ControlPlane.cpp68
3 files changed, 89 insertions, 41 deletions
diff --git a/one.cpp b/one.cpp
index 8ef09806..03f5e5fa 100644
--- a/one.cpp
+++ b/one.cpp
@@ -408,6 +408,59 @@ static int cli(int argc,char **argv)
printf("%s",cliFixJsonCRs(responseBody).c_str());
return 0;
} else {
+ printf("200 listnetworks <nwid> <name> <mac> <status> <type> <dev> <ZT assigned ips>"ZT_EOL_S);
+ json_value *j = json_parse(responseBody.c_str(),responseBody.length());
+ if (j) {
+ if (j->type == json_array) {
+ for(unsigned int p=0;p<j->u.array.length;++p) {
+ json_value *jn = j->u.array.values[p];
+ if (jn->type == json_object) {
+ const char *nwid = (const char *)0;
+ const char *name = "";
+ const char *mac = (const char *)0;
+ const char *status = (const char *)0;
+ const char *type = (const char *)0;
+ const char *portDeviceName = "";
+ std::string ips;
+ for(unsigned int k=0;k<jn->u.object.length;++k) {
+ if ((!strcmp(jn->u.object.values[k].name,"nwid"))&&(jn->u.object.values[k].value->type == json_string))
+ nwid = jn->u.object.values[k].value->u.string.ptr;
+ else if ((!strcmp(jn->u.object.values[k].name,"name"))&&(jn->u.object.values[k].value->type == json_string))
+ name = jn->u.object.values[k].value->u.string.ptr;
+ else if ((!strcmp(jn->u.object.values[k].name,"mac"))&&(jn->u.object.values[k].value->type == json_string))
+ mac = jn->u.object.values[k].value->u.string.ptr;
+ else if ((!strcmp(jn->u.object.values[k].name,"status"))&&(jn->u.object.values[k].value->type == json_string))
+ status = jn->u.object.values[k].value->u.string.ptr;
+ else if ((!strcmp(jn->u.object.values[k].name,"type"))&&(jn->u.object.values[k].value->type == json_string))
+ type = jn->u.object.values[k].value->u.string.ptr;
+ else if ((!strcmp(jn->u.object.values[k].name,"portDeviceName"))&&(jn->u.object.values[k].value->type == json_string))
+ portDeviceName = jn->u.object.values[k].value->u.string.ptr;
+ else if ((!strcmp(jn->u.object.values[k].name,"assignedAddresses"))&&(jn->u.object.values[k].value->type == json_array)) {
+ for(unsigned int a=0;a<jn->u.object.values[k].value->u.array.length;++a) {
+ json_value *aa = jn->u.object.values[k].value->u.array.values[a];
+ if (aa->type == json_string) {
+ if (ips.length())
+ ips.push_back(',');
+ ips.append(aa->u.string.ptr);
+ }
+ }
+ }
+ }
+ if ((nwid)&&(mac)&&(status)&&(type)) {
+ printf("200 listnetworks %s %s %s %s %s %s %s"ZT_EOL_S,
+ nwid,
+ (((name)&&(name[0])) ? name : "-"),
+ mac,
+ status,
+ type,
+ (((portDeviceName)&&(portDeviceName[0])) ? portDeviceName : "-"),
+ ((ips.length() > 0) ? ips.c_str() : "-"));
+ }
+ }
+ }
+ }
+ json_value_free(j);
+ }
}
} else {
printf("%u %s %s"ZT_EOL_S,scode,command.c_str(),responseBody.c_str());
@@ -418,20 +471,23 @@ static int cli(int argc,char **argv)
cliPrintHelp(argv[0],stderr);
return 2;
}
+ requestHeaders["Content-Type"] = "application/json";
+ requestHeaders["Content-Length"] = "2";
unsigned int scode = Http::POST(
1024 * 1024 * 16,
60000,
(const struct sockaddr *)&addr,
(std::string("/network/") + arg1).c_str(),
requestHeaders,
- "",
- 0,
+ "{}",
+ 2,
responseHeaders,
responseBody);
if (scode == 200) {
if (json) {
printf("%s",cliFixJsonCRs(responseBody).c_str());
} else {
+ printf("200 join OK"ZT_EOL_S);
}
return 0;
} else {
diff --git a/osdep/Http.cpp b/osdep/Http.cpp
index 57efc556..1abf4903 100644
--- a/osdep/Http.cpp
+++ b/osdep/Http.cpp
@@ -209,7 +209,7 @@ unsigned int Http::_do(
handler.lastActivity = OSUtils::now();
try {
- handler.writeSize = Utils::snprintf(handler.writeBuf,sizeof(handler.writeBuf),"GET %s HTTP/1.1\r\n",path);
+ handler.writeSize = Utils::snprintf(handler.writeBuf,sizeof(handler.writeBuf),"%s %s HTTP/1.1\r\n",method,path);
for(std::map<std::string,std::string>::const_iterator h(requestHeaders.begin());h!=requestHeaders.end();++h)
handler.writeSize += Utils::snprintf(handler.writeBuf + handler.writeSize,sizeof(handler.writeBuf) - handler.writeSize,"%s: %s\r\n",h->first.c_str(),h->second.c_str());
handler.writeSize += Utils::snprintf(handler.writeBuf + handler.writeSize,sizeof(handler.writeBuf) - handler.writeSize,"\r\n");
diff --git a/service/ControlPlane.cpp b/service/ControlPlane.cpp
index 4d57fbda..1b5113d0 100644
--- a/service/ControlPlane.cpp
+++ b/service/ControlPlane.cpp
@@ -438,26 +438,22 @@ unsigned int ControlPlane::handleRequest(
if (ps[0] == "config") {
// TODO
} else if (ps[0] == "network") {
- if ((ps.size() > 1)&&(ps[1] == "controller")) {
- // TODO
- } else {
- if (ps.size() == 2) {
- uint64_t wantnw = Utils::hexStrToU64(ps[1].c_str());
- _node->join(wantnw); // does nothing if we are a member
- ZT1_VirtualNetworkList *nws = _node->networks();
- if (nws) {
- for(unsigned long i=0;i<nws->networkCount;++i) {
- if (nws->networks[i].nwid == wantnw) {
- responseContentType = "application/json";
- _jsonAppend(0,responseBody,&(nws->networks[i]),_svc->portDeviceName(nws->networks[i].nwid));
- responseBody.push_back('\n');
- scode = 200;
- break;
- }
+ if (ps.size() == 2) {
+ uint64_t wantnw = Utils::hexStrToU64(ps[1].c_str());
+ _node->join(wantnw); // does nothing if we are a member
+ ZT1_VirtualNetworkList *nws = _node->networks();
+ if (nws) {
+ for(unsigned long i=0;i<nws->networkCount;++i) {
+ if (nws->networks[i].nwid == wantnw) {
+ responseContentType = "application/json";
+ _jsonAppend(0,responseBody,&(nws->networks[i]),_svc->portDeviceName(nws->networks[i].nwid));
+ responseBody.push_back('\n');
+ scode = 200;
+ break;
}
- _node->freeQueryResult((void *)nws);
- } else scode = 500;
- } // else 404
+ }
+ _node->freeQueryResult((void *)nws);
+ } else scode = 500;
}
} // else 404
} else scode = 401; // isAuth == false
@@ -468,26 +464,22 @@ unsigned int ControlPlane::handleRequest(
if (ps[0] == "config") {
// TODO
} else if (ps[0] == "network") {
- if ((ps.size() > 1)&&(ps[1] == "controller")) {
- // TODO
- } else {
- ZT1_VirtualNetworkList *nws = _node->networks();
- if (nws) {
- if (ps.size() == 2) {
- uint64_t wantnw = Utils::hexStrToU64(ps[1].c_str());
- for(unsigned long i=0;i<nws->networkCount;++i) {
- if (nws->networks[i].nwid == wantnw) {
- _node->leave(wantnw);
- responseBody = "true";
- responseContentType = "application/json";
- scode = 200;
- break;
- }
+ ZT1_VirtualNetworkList *nws = _node->networks();
+ if (nws) {
+ if (ps.size() == 2) {
+ uint64_t wantnw = Utils::hexStrToU64(ps[1].c_str());
+ for(unsigned long i=0;i<nws->networkCount;++i) {
+ if (nws->networks[i].nwid == wantnw) {
+ _node->leave(wantnw);
+ responseBody = "true";
+ responseContentType = "application/json";
+ scode = 200;
+ break;
}
- } // else 404
- _node->freeQueryResult((void *)nws);
- } else scode = 500;
- }
+ }
+ } // else 404
+ _node->freeQueryResult((void *)nws);
+ } else scode = 500;
} // else 404
} else {