From 905d2e91e598945d4ba3a42430cd288f0a1d0839 Mon Sep 17 00:00:00 2001 From: Adam Ierymenko Date: Wed, 20 May 2015 20:17:56 -0700 Subject: [PATCH] Windows auto-update integration into OneService. --- ext/installfiles/windows/ZeroTier One.aip | 7 +--- service/OneService.cpp | 49 +++++++++++++++++++++-- 2 files changed, 47 insertions(+), 9 deletions(-) diff --git a/ext/installfiles/windows/ZeroTier One.aip b/ext/installfiles/windows/ZeroTier One.aip index 69c2c0b7d..234873f87 100644 --- a/ext/installfiles/windows/ZeroTier One.aip +++ b/ext/installfiles/windows/ZeroTier One.aip @@ -23,7 +23,7 @@ - + @@ -52,7 +52,6 @@ - @@ -68,14 +67,13 @@ - - + @@ -196,7 +194,6 @@ - diff --git a/service/OneService.cpp b/service/OneService.cpp index b8a66f6f2..790f691b9 100644 --- a/service/OneService.cpp +++ b/service/OneService.cpp @@ -108,6 +108,7 @@ namespace { #ifdef ZT_AUTO_UPDATE #define ZT_AUTO_UPDATE_MAX_HTTP_RESPONSE_SIZE (1024 * 1024 * 64) +#define ZT_AUTO_UPDATE_CHECK_PERIOD 21600000 class BackgroundSoftwareUpdateChecker { public: @@ -247,6 +248,40 @@ public: /* Windows version comes in the form of .MSI package that * takes care of everything. */ { + char tempp[512],batp[512],msip[512],cmdline[512]; + if (GetTempPathA(sizeof(tempp),tempp) <= 0) + return; + CreateDirectoryA(tempp,(LPSECURITY_ATTRIBUTES)0); + Utils::snprintf(batp,sizeof(batp),"%s\\ZeroTierOne-update-%u.%u.%u.bat",tempp,vMajor,vMinor,vRevision); + Utils::snprintf(msip,sizeof(msip),"%s\\ZeroTierOne-update-%u.%u.%u.msi",tempp,vMajor,vMinor,vRevision); + FILE *msi = fopen(msip,"wb"); + if ((!msi)||(fwrite(fileData.data(),(size_t)fileData.length(),1,msi) != 1)) { + fclose(msi); + return; + } + fclose(msi); + FILE *bat = fopen(batp,"wb"); + if (!bat) + return; + fprintf(bat, + "TIMEOUT.EXE /T 1 /NOBREAK\r\n" + "NET.EXE STOP \"ZeroTierOneService\"\r\n" + "TIMEOUT.EXE /T 1 /NOBREAK\r\n" + "MSIEXEC.EXE /i \"%s\" /qn\r\n" + "TIMEOUT.EXE /T 1 /NOBREAK\r\n" + "NET.EXE START \"ZeroTierOneService\"\r\n" + "DEL \"%s\"\r\n" + "DEL \"%s\"\r\n", + msip, + msip, + batp); + fclose(bat); + STARTUPINFOA si; + PROCESS_INFORMATION pi; + memset(&si,0,sizeof(si)); + memset(&pi,0,sizeof(pi)); + Utils::snprintf(cmdline,sizeof(cmdline),"CMD.EXE /c \"%s\"",batp); + CreateProcessA(NULL,cmdline,NULL,NULL,FALSE,CREATE_NO_WINDOW|CREATE_NEW_PROCESS_GROUP,NULL,NULL,&si,&pi); } #endif // __WINDOWS__ @@ -367,10 +402,6 @@ public: char portstr[64]; Utils::snprintf(portstr,sizeof(portstr),"%u",port); OSUtils::writeFile((_homePath + ZT_PATH_SEPARATOR_S + "zerotier-one.port").c_str(),std::string(portstr)); - -#ifdef ZT_AUTO_UPDATE - Thread::start(&backgroundSoftwareUpdateChecker); -#endif } virtual ~OneServiceImpl() @@ -436,6 +467,9 @@ public: _nextBackgroundTaskDeadline = 0; uint64_t lastTapMulticastGroupCheck = 0; +#ifdef ZT_AUTO_UPDATE + uint64_t lastSoftwareUpdateCheck = 0; +#endif // ZT_AUTO_UPDATE for(;;) { _run_m.lock(); if (!_run) { @@ -453,6 +487,13 @@ public: dl = _nextBackgroundTaskDeadline; } +#ifdef ZT_AUTO_UPDATE + if ((now - lastSoftwareUpdateCheck) >= ZT_AUTO_UPDATE_CHECK_PERIOD) { + lastSoftwareUpdateCheck = OSUtils::now(); + Thread::start(&backgroundSoftwareUpdateChecker); + } +#endif // ZT_AUTO_UPDATE + if ((now - lastTapMulticastGroupCheck) >= ZT_TAP_CHECK_MULTICAST_INTERVAL) { lastTapMulticastGroupCheck = now; Mutex::Lock _l(_taps_m);