diff --git a/node/Constants.hpp b/node/Constants.hpp index 85af3b287..20983db9f 100644 --- a/node/Constants.hpp +++ b/node/Constants.hpp @@ -340,6 +340,11 @@ error_no_byte_order_defined; */ #define ZT_UPDATE_MIN_INTERVAL 120000 +/** + * Maximum interval between attempts to do a software update + */ +#define ZT_UPDATE_MAX_INTERVAL 28800000 + /** * Update HTTP timeout in seconds */ diff --git a/node/Node.cpp b/node/Node.cpp index dd0e47edf..cd8cfb5e2 100644 --- a/node/Node.cpp +++ b/node/Node.cpp @@ -434,6 +434,9 @@ Node::ReasonForTermination Node::run() #ifdef ZT_AUTO_UPDATE if (ZT_DEFAULTS.updateLatestNfoURL.length()) _r->updater = new SoftwareUpdater(_r); + else { + LOG("WARNING: unable to enable software updates: latest .nfo URL from ZT_DEFAULTS is empty (does this platform actually support software updates?)"); + } #endif // Bind local port for core I/O @@ -575,6 +578,8 @@ Node::ReasonForTermination Node::run() _r->mc->clean(); _r->topology->clean(); _r->nc->clean(); + if (_r->updater) + _r->updater->checkIfMaxIntervalExceeded(now); } try { diff --git a/node/PacketDecoder.cpp b/node/PacketDecoder.cpp index 1c6d09caa..ca9f18a32 100644 --- a/node/PacketDecoder.cpp +++ b/node/PacketDecoder.cpp @@ -41,6 +41,7 @@ #include "NodeConfig.hpp" #include "Service.hpp" #include "Demarc.hpp" +#include "SoftwareUpdater.hpp" namespace ZeroTier { @@ -265,6 +266,11 @@ bool PacketDecoder::_doOK(const RuntimeEnvironment *_r,const SharedPtr &pe unsigned int vRevision = at(ZT_PROTO_VERB_HELLO__OK__IDX_REVISION); TRACE("%s(%s): OK(HELLO), version %u.%u.%u",source().toString().c_str(),_remoteAddress.toString().c_str(),vMajor,vMinor,vRevision); peer->setRemoteVersion(vMajor,vMinor,vRevision); + + // If a supernode has a version higher than ours, this causes a software + // update check to run now. + if ((_r->updater)&&(_r->topology->isSupernode(peer->address()))) + _r->updater->sawRemoteVersion(vMajor,vMinor,vRevision); } break; case Packet::VERB_WHOIS: { // Right now only supernodes are allowed to send OK(WHOIS) to prevent diff --git a/node/SoftwareUpdater.hpp b/node/SoftwareUpdater.hpp index 5e47bbead..477bc7e33 100644 --- a/node/SoftwareUpdater.hpp +++ b/node/SoftwareUpdater.hpp @@ -76,6 +76,9 @@ public: /** * Check for updates now regardless of last check time or version + * + * This only starts a check if one is not in progress. Otherwise it does + * nothing. */ inline void checkNow() { @@ -87,6 +90,17 @@ public: } } + /** + * Check for updates now if it's been longer than ZT_UPDATE_MAX_INTERVAL + * + * This is called periodically from the main loop. + */ + inline void checkIfMaxIntervalExceeded(uint64_t now) + { + if ((now - _lastUpdateAttempt) >= ZT_UPDATE_MAX_INTERVAL) + checkNow(); + } + /** * Pack three-component version into a 64-bit integer * diff --git a/version.h b/version.h index 03a5cdc14..dd03d237f 100644 --- a/version.h +++ b/version.h @@ -41,6 +41,6 @@ /** * Revision: 16-bit (0-65535) */ -#define ZEROTIER_ONE_VERSION_REVISION 3 +#define ZEROTIER_ONE_VERSION_REVISION 4 #endif