summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Ierymenko <adam.ierymenko@gmail.com>2013-12-26 20:57:17 -0800
committerAdam Ierymenko <adam.ierymenko@gmail.com>2013-12-26 20:57:17 -0800
commitc8166b2db15b692d2c3deba2b7b82343ba478873 (patch)
treeb418e8a043185f14d321b77ae20e440a230fde28
parent54c2c945e00b4da9931bf16c762860886704c6b3 (diff)
downloadinfinitytier-c8166b2db15b692d2c3deba2b7b82343ba478873.tar.gz
infinitytier-c8166b2db15b692d2c3deba2b7b82343ba478873.zip
Bump version to 0.6.4 for testing, integrate software updater auto-check into PacketDecoder decode path and main loop.
-rw-r--r--node/Constants.hpp5
-rw-r--r--node/Node.cpp5
-rw-r--r--node/PacketDecoder.cpp6
-rw-r--r--node/SoftwareUpdater.hpp14
-rw-r--r--version.h2
5 files changed, 31 insertions, 1 deletions
diff --git a/node/Constants.hpp b/node/Constants.hpp
index 85af3b28..20983db9 100644
--- a/node/Constants.hpp
+++ b/node/Constants.hpp
@@ -341,6 +341,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
*/
#define ZT_UPDATE_HTTP_TIMEOUT 30
diff --git a/node/Node.cpp b/node/Node.cpp
index dd0e47ed..cd8cfb5e 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 1c6d09ca..ca9f18a3 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<Peer> &pe
unsigned int vRevision = at<uint16_t>(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 5e47bbea..477bc7e3 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()
{
@@ -88,6 +91,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
*
* @param vmaj Major version (0..65535)
diff --git a/version.h b/version.h
index 03a5cdc1..dd03d237 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