diff --git a/make-freebsd.mk b/make-freebsd.mk index e7992f1fb..2832136e0 100644 --- a/make-freebsd.mk +++ b/make-freebsd.mk @@ -72,7 +72,7 @@ selftest: $(OBJS) selftest.o # ./buildinstaller.sh clean: - rm -rf *.o node/*.o controller/*.o osdep/*.o service/*.o ext/http-parser/*.o ext/lz4/*.o ext/json-parser/*.o build-* zerotier-one zerotier-idtool zerotier-selftest ZeroTierOneInstaller-* + rm -rf *.o node/*.o controller/*.o osdep/*.o service/*.o ext/http-parser/*.o ext/lz4/*.o ext/json-parser/*.o build-* zerotier-one zerotier-idtool zerotier-selftest zerotier-cli ZeroTierOneInstaller-* debug: FORCE make -j 4 ZT_DEBUG=1 diff --git a/make-linux.mk b/make-linux.mk index efcf459e3..fbd6d254f 100644 --- a/make-linux.mk +++ b/make-linux.mk @@ -77,7 +77,7 @@ installer: one FORCE ./buildinstaller.sh clean: - rm -rf *.o node/*.o controller/*.o osdep/*.o service/*.o ext/http-parser/*.o ext/lz4/*.o ext/json-parser/*.o zerotier-one zerotier-idtool zerotier-selftest build-* ZeroTierOneInstaller-* *.deb *.rpm + rm -rf *.o node/*.o controller/*.o osdep/*.o service/*.o ext/http-parser/*.o ext/lz4/*.o ext/json-parser/*.o zerotier-one zerotier-idtool zerotier-cli zerotier-selftest build-* ZeroTierOneInstaller-* *.deb *.rpm debug: FORCE make -j 4 ZT_DEBUG=1 diff --git a/make-mac.mk b/make-mac.mk index 0efaef802..a41445dba 100644 --- a/make-mac.mk +++ b/make-mac.mk @@ -76,7 +76,7 @@ selftest: $(OBJS) selftest.o # $(CODESIGN) -vvv "build-ZeroTierUI-release/ZeroTier One.app" clean: - rm -rf *.dSYM build-* *.pkg *.dmg *.o node/*.o controller/*.o service/*.o osdep/*.o ext/http-parser/*.o ext/lz4/*.o ext/json-parser/*.o zerotier-one zerotier-idtool zerotier-selftest ZeroTierOneInstaller-* + rm -rf *.dSYM build-* *.pkg *.dmg *.o node/*.o controller/*.o service/*.o osdep/*.o ext/http-parser/*.o ext/lz4/*.o ext/json-parser/*.o zerotier-one zerotier-idtool zerotier-selftest zerotier-cli ZeroTierOneInstaller-* # For our use -- builds official signed binary, packages in installer and download DMG official: FORCE diff --git a/one.cpp b/one.cpp index fd1700f2d..0bce5eefb 100644 --- a/one.cpp +++ b/one.cpp @@ -298,7 +298,54 @@ static int cli(int argc,char **argv) return 1; } } else if (command == "join") { + if (arg1.length() != 16) { + cliPrintHelp(argv[0],stderr); + return 2; + } + unsigned int scode = Http::POST( + 1024 * 1024 * 16, + 60000, + (const struct sockaddr *)&addr, + (std::string("/network/") + arg1).c_str(), + requestHeaders, + "", + 0, + responseHeaders, + responseBody); + if (scode == 200) { + if (json) { + printf("%s",cliFixJsonCRs(responseBody).c_str()); + } else { + } + return 0; + } else { + printf("%u %s %s"ZT_EOL_S,scode,command.c_str(),responseBody.c_str()); + return 1; + } } else if (command == "leave") { + if (arg1.length() != 16) { + cliPrintHelp(argv[0],stderr); + return 2; + } + unsigned int scode = Http::DELETE( + 1024 * 1024 * 16, + 60000, + (const struct sockaddr *)&addr, + (std::string("/network/") + arg1).c_str(), + requestHeaders, + responseHeaders, + responseBody); + if (scode == 200) { + if (json) { + printf("%s",cliFixJsonCRs(responseBody).c_str()); + } else { + printf("200 leave OK"ZT_EOL_S); + } + return 0; + } else { + printf("%u %s %s"ZT_EOL_S,scode,command.c_str(),responseBody.c_str()); + return 1; + } } else { cliPrintHelp(argv[0],stderr); return 0; diff --git a/osdep/Http.hpp b/osdep/Http.hpp index c73cc112c..a1882add8 100644 --- a/osdep/Http.hpp +++ b/osdep/Http.hpp @@ -82,6 +82,35 @@ public: responseBody); } + /** + * Make HTTP DELETE request + * + * The caller must set all headers, including Host. + * + * @return HTTP status code or 0 on error (responseBody will contain error message) + */ + static inline unsigned int DELETE( + unsigned long maxResponseSize, + unsigned long timeout, + const struct sockaddr *remoteAddress, + const char *path, + const std::map &requestHeaders, + std::map &responseHeaders, + std::string &responseBody) + { + return _do( + "DELETE", + maxResponseSize, + timeout, + remoteAddress, + path, + requestHeaders, + (const void *)0, + 0, + responseHeaders, + responseBody); + } + /** * Make HTTP POST request *