summaryrefslogtreecommitdiff
path: root/node/Topology.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'node/Topology.cpp')
-rw-r--r--node/Topology.cpp32
1 files changed, 31 insertions, 1 deletions
diff --git a/node/Topology.cpp b/node/Topology.cpp
index 18432f25..6efde33e 100644
--- a/node/Topology.cpp
+++ b/node/Topology.cpp
@@ -35,10 +35,12 @@
namespace ZeroTier {
-Topology::Topology(const RuntimeEnvironment *renv) :
+Topology::Topology(const RuntimeEnvironment *renv,bool enablePermanentIdCaching) :
_r(renv),
_amSupernode(false)
{
+ if (enablePermanentIdCaching)
+ _idCacheBase = (_r->homePath + ZT_PATH_SEPARATOR_S + "iddb.d");
_loadPeers();
}
@@ -83,6 +85,7 @@ SharedPtr<Peer> Topology::addPeer(const SharedPtr<Peer> &peer)
Mutex::Lock _l(_activePeers_m);
SharedPtr<Peer> p(_activePeers.insert(std::pair< Address,SharedPtr<Peer> >(peer->address(),peer)).first->second);
p->setLastUsed(now);
+ saveIdentity(p->identity());
return p;
}
@@ -102,6 +105,32 @@ SharedPtr<Peer> Topology::getPeer(const Address &zta)
return SharedPtr<Peer>();
}
+Identity Topology::getIdentity(const Address &zta)
+{
+ SharedPtr<Peer> p(getPeer(zta));
+ if (p)
+ return p->identity();
+ if (_idCacheBase.length()) {
+ std::string idcPath(_idCacheBase + ZT_PATH_SEPARATOR_S + zta.toString());
+ std::string ids;
+ if (Utils::readFile(idcPath.c_str(),ids)) {
+ try {
+ return Identity(ids);
+ } catch ( ... ) {} // ignore invalid IDs
+ }
+ }
+ return Identity();
+}
+
+void Topology::saveIdentity(const Identity &id)
+{
+ if ((id)&&(_idCacheBase.length())) {
+ std::string idcPath(_idCacheBase + ZT_PATH_SEPARATOR_S + id.address().toString());
+ if (!Utils::fileExists(idcPath.c_str()))
+ Utils::writeFile(idcPath.c_str(),id.toString(false));
+ }
+}
+
SharedPtr<Peer> Topology::getBestSupernode(const Address *avoid,unsigned int avoidCount,bool strictAvoid) const
{
SharedPtr<Peer> bestSupernode;
@@ -244,6 +273,7 @@ void Topology::_loadPeers()
SharedPtr<Peer> p(new Peer());
ptr += p->deserialize(buf,ptr);
_activePeers[p->address()] = p;
+ saveIdentity(p->identity());
}
if (ptr) {
memmove(buf.data(),buf.data() + ptr,buf.size() - ptr);