diff options
Diffstat (limited to 'windows/ZeroTierOne/ZeroTierOneService.cpp')
| -rw-r--r-- | windows/ZeroTierOne/ZeroTierOneService.cpp | 71 | 
1 files changed, 54 insertions, 17 deletions
| diff --git a/windows/ZeroTierOne/ZeroTierOneService.cpp b/windows/ZeroTierOne/ZeroTierOneService.cpp index abae3aff..e5426dc2 100644 --- a/windows/ZeroTierOne/ZeroTierOneService.cpp +++ b/windows/ZeroTierOne/ZeroTierOneService.cpp @@ -34,15 +34,13 @@  #include "ZeroTierOneService.h" -#include "../../node/Defaults.hpp" -#include "../../node/Utils.hpp" - -#include "../../control/NodeControlClient.hpp" -#include "../../control/NodeControlService.hpp" +#include "../../version.h" +#include "../../include/ZeroTierOne.h" -#include "../../osdep/WindowsEthernetTapFactory.hpp" -#include "../../osdep/WindowsRoutingTable.hpp" -#include "../../osdep/NativeSocketManager.hpp" +#include "../../node/Constants.hpp" +#include "../../node/Utils.hpp" +#include "../../osdep/OSUtils.hpp" +#include "../../service/OneService.hpp"  #pragma endregion // Includes @@ -53,7 +51,7 @@ ZeroTier::Mutex SVCDBGfile_m;  ZeroTierOneService::ZeroTierOneService() :  	CServiceBase(ZT_SERVICE_NAME,TRUE,TRUE,FALSE), -	_node((ZeroTier::Node *)0) +	_service((ZeroTier::OneService *)0)  {  #ifdef ZT_DEBUG_SERVICE  	SVCDBGfile_m.lock(); @@ -86,6 +84,41 @@ void ZeroTierOneService::threadMain()  restart_node:  	try { +		{ +			ZeroTier::Mutex::Lock _l(_lock); +			delete _service; +			_service = (ZeroTier::OneService *)0; // in case newInstance() fails +			_service = ZeroTier::OneService::newInstance( +				ZeroTier::OneService::platformDefaultHomePath().c_str(), +				ZT1_DEFAULT_PORT); +		} +		switch(_service->run()) { +			case ZeroTier::OneService::ONE_UNRECOVERABLE_ERROR: { +				std::string err("ZeroTier One encountered an unrecoverable error: "); +				err.append(_service->fatalErrorMessage()); +				err.append(" (restarting in 5 seconds)"); +				WriteEventLogEntry(const_cast <PSTR>(err.c_str()),EVENTLOG_ERROR_TYPE); +				Sleep(5000); +			}	goto restart_node; + +			case ZeroTier::OneService::ONE_IDENTITY_COLLISION: { +				std::string homeDir(ZeroTier::OneService::platformDefaultHomePath()); +				delete _service; +				_service = (ZeroTier::OneService *)0; +				std::string oldid; +				ZeroTier::OSUtils::readFile((homeDir + ZT_PATH_SEPARATOR_S + "identity.secret").c_str(),oldid); +				if (oldid.length()) { +					ZeroTier::OSUtils::writeFile((homeDir + ZT_PATH_SEPARATOR_S + "identity.secret.saved_after_collision").c_str(),oldid); +					ZeroTier::OSUtils::rm((homeDir + ZT_PATH_SEPARATOR_S + "identity.secret").c_str()); +					ZeroTier::OSUtils::rm((homeDir + ZT_PATH_SEPARATOR_S + "identity.public").c_str()); +				} +			}	goto restart_node; + +			default: // normal termination +				break; +		} + +#if 0  		std::string authToken(ZeroTier::NodeControlClient::getAuthToken((ZeroTier::ZT_DEFAULTS.defaultHomePath + ZT_PATH_SEPARATOR_S + "authtoken.secret").c_str(),true));  		ZeroTier::WindowsEthernetTapFactory tapFactory(ZeroTier::ZT_DEFAULTS.defaultHomePath.c_str()); @@ -154,6 +187,7 @@ restart_node:  				break;  		} +#endif  	} catch ( ... ) {  		// sanity check, shouldn't happen since Node::run() should catch all its own errors  		// could also happen if we're out of memory though! @@ -164,17 +198,19 @@ restart_node:  	{  		ZeroTier::Mutex::Lock _l(_lock); -		delete _node; -		_node = (ZeroTier::Node *)0; +		delete _service; +		_service = (ZeroTier::OneService *)0;  	}  }  bool ZeroTierOneService::doStartUpgrade(const std::string &msiPath)  { -	std::string msiLog(ZeroTier::ZT_DEFAULTS.defaultHomePath + "\\LastUpdateLog.txt"); -	ZeroTier::Utils::rm(msiLog); +	std::string homePath(ZeroTier::OneService::platformDefaultHomePath()); -	std::string bat(ZeroTier::ZT_DEFAULTS.defaultHomePath + "\\InstallAndRestartService.bat"); +	std::string msiLog(homePath + "\\LastUpdateLog.txt"); +	ZeroTier::OSUtils::rm(msiLog); + +	std::string bat(homePath + "\\InstallAndRestartService.bat");  	FILE *batf = fopen(bat.c_str(),"wb");  	if (!batf)  		return false; @@ -210,10 +246,11 @@ void ZeroTierOneService::OnStop()  	ZT_SVCDBG("ZeroTierOneService::OnStop()\r\n");  	_lock.lock(); -	ZeroTier::Node *n = _node; +	ZeroTier::OneService *s = _service;  	_lock.unlock(); -	if (n) { -		n->terminate(ZeroTier::Node::NODE_NORMAL_TERMINATION,"Windows service stopped"); + +	if (s) { +		s->terminate();  		ZeroTier::Thread::join(_thread);  	}  } | 
