Browse Source

Merge pull request #1531 from jgarzik/peerinfo

RPC: add 'getpeerinfo', returning easy-to-retrieve per-CNode data
0.8
Gavin Andresen 13 years ago
parent
commit
3a906d45dc
  1. 1
      bitcoin-qt.pro
  2. 14
      src/bitcoinrpc.cpp
  3. 1
      src/makefile.linux-mingw
  4. 1
      src/makefile.mingw
  5. 1
      src/makefile.osx
  6. 1
      src/makefile.unix
  7. 18
      src/net.cpp
  8. 19
      src/net.h
  9. 67
      src/rpcnet.cpp

1
bitcoin-qt.pro

@ -206,6 +206,7 @@ SOURCES += src/qt/bitcoin.cpp src/qt/bitcoingui.cpp \
src/qt/walletmodel.cpp \ src/qt/walletmodel.cpp \
src/bitcoinrpc.cpp \ src/bitcoinrpc.cpp \
src/rpcdump.cpp \ src/rpcdump.cpp \
src/rpcnet.cpp \
src/qt/overviewpage.cpp \ src/qt/overviewpage.cpp \
src/qt/csvmodelwriter.cpp \ src/qt/csvmodelwriter.cpp \
src/crypter.cpp \ src/crypter.cpp \

14
src/bitcoinrpc.cpp

@ -46,6 +46,8 @@ static std::string strRPCUserColonPass;
static int64 nWalletUnlockTime; static int64 nWalletUnlockTime;
static CCriticalSection cs_nWalletUnlockTime; static CCriticalSection cs_nWalletUnlockTime;
extern Value getconnectioncount(const Array& params, bool fHelp);
extern Value getpeerinfo(const Array& params, bool fHelp);
extern Value dumpprivkey(const Array& params, bool fHelp); extern Value dumpprivkey(const Array& params, bool fHelp);
extern Value importprivkey(const Array& params, bool fHelp); extern Value importprivkey(const Array& params, bool fHelp);
@ -456,17 +458,6 @@ Value getblockcount(const Array& params, bool fHelp)
} }
Value getconnectioncount(const Array& params, bool fHelp)
{
if (fHelp || params.size() != 0)
throw runtime_error(
"getconnectioncount\n"
"Returns the number of connections to other nodes.");
return (int)vNodes.size();
}
Value getdifficulty(const Array& params, bool fHelp) Value getdifficulty(const Array& params, bool fHelp)
{ {
if (fHelp || params.size() != 0) if (fHelp || params.size() != 0)
@ -2310,6 +2301,7 @@ static const CRPCCommand vRPCCommands[] =
{ "stop", &stop, true }, { "stop", &stop, true },
{ "getblockcount", &getblockcount, true }, { "getblockcount", &getblockcount, true },
{ "getconnectioncount", &getconnectioncount, true }, { "getconnectioncount", &getconnectioncount, true },
{ "getpeerinfo", &getpeerinfo, true },
{ "getdifficulty", &getdifficulty, true }, { "getdifficulty", &getdifficulty, true },
{ "getgenerate", &getgenerate, true }, { "getgenerate", &getgenerate, true },
{ "setgenerate", &setgenerate, true }, { "setgenerate", &setgenerate, true },

1
src/makefile.linux-mingw

@ -60,6 +60,7 @@ OBJS= \
obj/protocol.o \ obj/protocol.o \
obj/bitcoinrpc.o \ obj/bitcoinrpc.o \
obj/rpcdump.o \ obj/rpcdump.o \
obj/rpcnet.o \
obj/script.o \ obj/script.o \
obj/sync.o \ obj/sync.o \
obj/util.o \ obj/util.o \

1
src/makefile.mingw

@ -57,6 +57,7 @@ OBJS= \
obj/protocol.o \ obj/protocol.o \
obj/bitcoinrpc.o \ obj/bitcoinrpc.o \
obj/rpcdump.o \ obj/rpcdump.o \
obj/rpcnet.o \
obj/script.o \ obj/script.o \
obj/sync.o \ obj/sync.o \
obj/util.o \ obj/util.o \

1
src/makefile.osx vendored

@ -84,6 +84,7 @@ OBJS= \
obj/protocol.o \ obj/protocol.o \
obj/bitcoinrpc.o \ obj/bitcoinrpc.o \
obj/rpcdump.o \ obj/rpcdump.o \
obj/rpcnet.o \
obj/script.o \ obj/script.o \
obj/sync.o \ obj/sync.o \
obj/util.o \ obj/util.o \

1
src/makefile.unix

@ -104,6 +104,7 @@ OBJS= \
obj/protocol.o \ obj/protocol.o \
obj/bitcoinrpc.o \ obj/bitcoinrpc.o \
obj/rpcdump.o \ obj/rpcdump.o \
obj/rpcnet.o \
obj/script.o \ obj/script.o \
obj/sync.o \ obj/sync.o \
obj/util.o \ obj/util.o \

18
src/net.cpp

@ -606,7 +606,23 @@ bool CNode::Misbehaving(int howmuch)
return false; return false;
} }
#undef X
#define X(name) stats.name = name
void CNode::copyStats(CNodeStats &stats)
{
X(nServices);
X(nLastSend);
X(nLastRecv);
X(nTimeConnected);
X(addrName);
X(nVersion);
X(strSubVer);
X(fInbound);
X(nReleaseTime);
X(nStartingHeight);
X(nMisbehavior);
}
#undef X

19
src/net.h

@ -128,6 +128,24 @@ extern std::map<CInv, int64> mapAlreadyAskedFor;
class CNodeStats
{
public:
uint64 nServices;
int64 nLastSend;
int64 nLastRecv;
int64 nTimeConnected;
std::string addrName;
int nVersion;
std::string strSubVer;
bool fInbound;
int64 nReleaseTime;
int nStartingHeight;
int nMisbehavior;
};
/** Information about a peer */ /** Information about a peer */
@ -617,6 +635,7 @@ public:
static void ClearBanned(); // needed for unit testing static void ClearBanned(); // needed for unit testing
static bool IsBanned(CNetAddr ip); static bool IsBanned(CNetAddr ip);
bool Misbehaving(int howmuch); // 1 == a little, 100 == a lot bool Misbehaving(int howmuch); // 1 == a little, 100 == a lot
void copyStats(CNodeStats &stats);
}; };

67
src/rpcnet.cpp

@ -0,0 +1,67 @@
// Copyright (c) 2009-2012 Bitcoin Developers
// Distributed under the MIT/X11 software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include "net.h"
#include "bitcoinrpc.h"
using namespace json_spirit;
using namespace std;
Value getconnectioncount(const Array& params, bool fHelp)
{
if (fHelp || params.size() != 0)
throw runtime_error(
"getconnectioncount\n"
"Returns the number of connections to other nodes.");
LOCK(cs_vNodes);
return (int)vNodes.size();
}
static void CopyNodeStats(std::vector<CNodeStats>& vstats)
{
vstats.clear();
LOCK(cs_vNodes);
vstats.reserve(vNodes.size());
BOOST_FOREACH(CNode* pnode, vNodes) {
CNodeStats stats;
pnode->copyStats(stats);
vstats.push_back(stats);
}
}
Value getpeerinfo(const Array& params, bool fHelp)
{
if (fHelp || params.size() != 0)
throw runtime_error(
"getpeerinfo\n"
"Returns data about each connected network node.");
vector<CNodeStats> vstats;
CopyNodeStats(vstats);
Array ret;
BOOST_FOREACH(const CNodeStats& stats, vstats) {
Object obj;
obj.push_back(Pair("addr", stats.addrName));
obj.push_back(Pair("services", strprintf("%08"PRI64x, stats.nServices)));
obj.push_back(Pair("lastsend", (boost::int64_t)stats.nLastSend));
obj.push_back(Pair("lastrecv", (boost::int64_t)stats.nLastRecv));
obj.push_back(Pair("conntime", (boost::int64_t)stats.nTimeConnected));
obj.push_back(Pair("version", stats.nVersion));
obj.push_back(Pair("subver", stats.strSubVer));
obj.push_back(Pair("inbound", stats.fInbound));
obj.push_back(Pair("releasetime", (boost::int64_t)stats.nReleaseTime));
obj.push_back(Pair("height", stats.nStartingHeight));
obj.push_back(Pair("banscore", stats.nMisbehavior));
ret.push_back(obj);
}
return ret;
}
Loading…
Cancel
Save