diff --git a/rippled-example.cfg b/rippled-example.cfg index 6eb7172bf..f682966e7 100644 --- a/rippled-example.cfg +++ b/rippled-example.cfg @@ -219,7 +219,8 @@ # [cluster_nodes]: # To extend full trust to other nodes, place their node public keys here. # Generally, you should only do this for nodes under common administration. -# Node public keys start with an 'n'. +# Node public keys start with an 'n'. To give a node a name for identification +# place a space after the public key and then the name. # # [ledger_history]: # The number of past ledgers to acquire on server startup and the minimum to diff --git a/src/cpp/ripple/Peer.cpp b/src/cpp/ripple/Peer.cpp index 7b686f3af..460f2108c 100644 --- a/src/cpp/ripple/Peer.cpp +++ b/src/cpp/ripple/Peer.cpp @@ -686,7 +686,7 @@ void Peer::recvHello(ripple::TMHello& packet) << "Peer speaks version " << (packet.protoversion() >> 16) << "." << (packet.protoversion() & 0xFF); mHello = packet; - if (theApp->getUNL().nodeInCluster(mNodePublic)) + if (theApp->getUNL().nodeInCluster(mNodePublic, mNodeName)) { mCluster = true; mLoad.setPrivileged(); @@ -1785,7 +1785,11 @@ Json::Value Peer::getJson() if (mInbound) ret["inbound"] = true; if (mCluster) + { ret["cluster"] = true; + if (!mNodeName.empty()) + ret["name"] = mNodeName; + } if (mHello.has_fullversion()) ret["version"] = mHello.fullversion(); diff --git a/src/cpp/ripple/Peer.h b/src/cpp/ripple/Peer.h index 2d3fb9527..f21e96b30 100644 --- a/src/cpp/ripple/Peer.h +++ b/src/cpp/ripple/Peer.h @@ -40,6 +40,7 @@ private: bool mActive; bool mCluster; // Node in our cluster RippleAddress mNodePublic; // Node public key of peer. + std::string mNodeName; ipPort mIpPort; ipPort mIpPortConnect; uint256 mCookieHash; diff --git a/src/cpp/ripple/UniqueNodeList.cpp b/src/cpp/ripple/UniqueNodeList.cpp index c0f4d8016..9c3487c7f 100644 --- a/src/cpp/ripple/UniqueNodeList.cpp +++ b/src/cpp/ripple/UniqueNodeList.cpp @@ -64,15 +64,6 @@ void UniqueNodeList::start() // Load information about when we last updated. bool UniqueNodeList::miscLoad() { - BOOST_FOREACH(const std::string& node, theConfig.CLUSTER_NODES) - { - RippleAddress a = RippleAddress::createNodePublic(node); - if (a.isValid()) - sClusterNodes.insert(a); - else - cLog(lsWARNING) << "Entry in cluster list invalid: '" << node << "'"; - } - boost::recursive_mutex::scoped_lock sl(theApp->getWalletDB()->getDBLock()); Database *db=theApp->getWalletDB()->getDB(); @@ -105,11 +96,20 @@ bool UniqueNodeList::miscSave() void UniqueNodeList::trustedLoad() { - BOOST_FOREACH(const std::string& node, theConfig.CLUSTER_NODES) + BOOST_FOREACH(const std::string& c, theConfig.CLUSTER_NODES) { + std::string node, name; + size_t s = c.find(' '); + if (s != std::string::npos) + { + name = c.substr(s+1); + node = c.substr(0, s); + } + else + node = c; RippleAddress a = RippleAddress::createNodePublic(node); if (a.isValid()) - sClusterNodes.insert(a); + sClusterNodes.insert(std::make_pair(a, name)); else cLog(lsWARNING) << "Entry in cluster list invalid: '" << node << "'"; } @@ -1699,7 +1699,17 @@ bool UniqueNodeList::nodeInUNL(const RippleAddress& naNodePublic) bool UniqueNodeList::nodeInCluster(const RippleAddress& naNodePublic) { boost::recursive_mutex::scoped_lock sl(mUNLLock); - return sClusterNodes.count(naNodePublic) != 0; + return sClusterNodes.end() != sClusterNodes.find(naNodePublic); +} + +bool UniqueNodeList::nodeInCluster(const RippleAddress& naNodePublic, std::string& name) +{ + boost::recursive_mutex::scoped_lock sl(mUNLLock); + std::map::iterator it = sClusterNodes.find(naNodePublic); + if (it == sClusterNodes.end()) + return false; + name = it->second; + return true; } // vim:ts=4 diff --git a/src/cpp/ripple/UniqueNodeList.h b/src/cpp/ripple/UniqueNodeList.h index 9cf511d84..ee0770f79 100644 --- a/src/cpp/ripple/UniqueNodeList.h +++ b/src/cpp/ripple/UniqueNodeList.h @@ -88,7 +88,7 @@ private: std::vector viReferrals; } scoreNode; - std::set sClusterNodes; + std::map sClusterNodes; typedef boost::unordered_map strIndex; typedef std::pair ipPort; @@ -155,6 +155,7 @@ public: bool nodeInUNL(const RippleAddress& naNodePublic); bool nodeInCluster(const RippleAddress& naNodePublic); + bool nodeInCluster(const RippleAddress& naNodePublic, std::string& name); void nodeBootstrap(); bool nodeLoad(boost::filesystem::path pConfig);