]>
Commit | Line | Data |
---|---|---|
70ab73a0 JG |
1 | // Copyright (c) 2009-2012 Bitcoin Developers |
2 | // Distributed under the MIT/X11 software license, see the accompanying | |
3 | // file COPYING or http://www.opensource.org/licenses/mit-license.php. | |
4 | ||
5 | #include "net.h" | |
6 | #include "bitcoinrpc.h" | |
7 | ||
8 | using namespace json_spirit; | |
9 | using namespace std; | |
10 | ||
11 | Value getconnectioncount(const Array& params, bool fHelp) | |
12 | { | |
13 | if (fHelp || params.size() != 0) | |
14 | throw runtime_error( | |
15 | "getconnectioncount\n" | |
16 | "Returns the number of connections to other nodes."); | |
17 | ||
1006f070 | 18 | LOCK(cs_vNodes); |
70ab73a0 JG |
19 | return (int)vNodes.size(); |
20 | } | |
21 | ||
1006f070 JG |
22 | static void CopyNodeStats(std::vector<CNodeStats>& vstats) |
23 | { | |
24 | vstats.clear(); | |
25 | ||
26 | LOCK(cs_vNodes); | |
27 | vstats.reserve(vNodes.size()); | |
28 | BOOST_FOREACH(CNode* pnode, vNodes) { | |
29 | CNodeStats stats; | |
30 | pnode->copyStats(stats); | |
31 | vstats.push_back(stats); | |
32 | } | |
33 | } | |
34 | ||
35 | Value getpeerinfo(const Array& params, bool fHelp) | |
36 | { | |
37 | if (fHelp || params.size() != 0) | |
38 | throw runtime_error( | |
39 | "getpeerinfo\n" | |
40 | "Returns data about each connected network node."); | |
41 | ||
42 | vector<CNodeStats> vstats; | |
43 | CopyNodeStats(vstats); | |
44 | ||
45 | Array ret; | |
46 | ||
47 | BOOST_FOREACH(const CNodeStats& stats, vstats) { | |
48 | Object obj; | |
49 | ||
50 | obj.push_back(Pair("addr", stats.addrName)); | |
51 | obj.push_back(Pair("services", strprintf("%08"PRI64x, stats.nServices))); | |
52 | obj.push_back(Pair("lastsend", (boost::int64_t)stats.nLastSend)); | |
53 | obj.push_back(Pair("lastrecv", (boost::int64_t)stats.nLastRecv)); | |
86648a8d PW |
54 | obj.push_back(Pair("bytessent", (boost::int64_t)stats.nSendBytes)); |
55 | obj.push_back(Pair("bytesrecv", (boost::int64_t)stats.nRecvBytes)); | |
1006f070 JG |
56 | obj.push_back(Pair("conntime", (boost::int64_t)stats.nTimeConnected)); |
57 | obj.push_back(Pair("version", stats.nVersion)); | |
58 | obj.push_back(Pair("subver", stats.strSubVer)); | |
59 | obj.push_back(Pair("inbound", stats.fInbound)); | |
18e8e437 | 60 | obj.push_back(Pair("startingheight", stats.nStartingHeight)); |
1006f070 | 61 | obj.push_back(Pair("banscore", stats.nMisbehavior)); |
86648a8d PW |
62 | if (stats.fSyncNode) |
63 | obj.push_back(Pair("syncnode", true)); | |
1006f070 JG |
64 | |
65 | ret.push_back(obj); | |
66 | } | |
ea0796bd | 67 | |
1006f070 JG |
68 | return ret; |
69 | } | |
70ab73a0 | 70 | |
72a348fd MC |
71 | Value addnode(const Array& params, bool fHelp) |
72 | { | |
73 | string strCommand; | |
74 | if (params.size() == 2) | |
75 | strCommand = params[1].get_str(); | |
76 | if (fHelp || params.size() != 2 || | |
77 | (strCommand != "onetry" && strCommand != "add" && strCommand != "remove")) | |
78 | throw runtime_error( | |
79 | "addnode <node> <add|remove|onetry>\n" | |
80 | "Attempts add or remove <node> from the addnode list or try a connection to <node> once."); | |
81 | ||
82 | string strNode = params[0].get_str(); | |
83 | ||
84 | if (strCommand == "onetry") | |
85 | { | |
86 | CAddress addr; | |
87 | ConnectNode(addr, strNode.c_str()); | |
88 | return Value::null; | |
89 | } | |
90 | ||
91 | LOCK(cs_vAddedNodes); | |
92 | vector<string>::iterator it = vAddedNodes.begin(); | |
93 | for(; it != vAddedNodes.end(); it++) | |
94 | if (strNode == *it) | |
95 | break; | |
96 | ||
97 | if (strCommand == "add") | |
98 | { | |
99 | if (it != vAddedNodes.end()) | |
100 | throw JSONRPCError(-23, "Error: Node already added"); | |
101 | vAddedNodes.push_back(strNode); | |
102 | } | |
103 | else if(strCommand == "remove") | |
104 | { | |
105 | if (it == vAddedNodes.end()) | |
106 | throw JSONRPCError(-24, "Error: Node has not been added."); | |
107 | vAddedNodes.erase(it); | |
108 | } | |
109 | ||
110 | return Value::null; | |
111 | } | |
112 | ||
67a11bd6 MC |
113 | Value getaddednodeinfo(const Array& params, bool fHelp) |
114 | { | |
115 | if (fHelp || params.size() < 1 || params.size() > 2) | |
116 | throw runtime_error( | |
117 | "getaddednodeinfo <dns> [node]\n" | |
118 | "Returns information about the given added node, or all added nodes\n" | |
119 | "(note that onetry addnodes are not listed here)\n" | |
120 | "If dns is false, only a list of added nodes will be provided,\n" | |
121 | "otherwise connected information will also be available."); | |
122 | ||
123 | bool fDns = params[0].get_bool(); | |
124 | ||
125 | list<string> laddedNodes(0); | |
126 | if (params.size() == 1) | |
127 | { | |
128 | LOCK(cs_vAddedNodes); | |
129 | BOOST_FOREACH(string& strAddNode, vAddedNodes) | |
130 | laddedNodes.push_back(strAddNode); | |
131 | } | |
132 | else | |
133 | { | |
134 | string strNode = params[1].get_str(); | |
135 | LOCK(cs_vAddedNodes); | |
136 | BOOST_FOREACH(string& strAddNode, vAddedNodes) | |
137 | if (strAddNode == strNode) | |
138 | { | |
139 | laddedNodes.push_back(strAddNode); | |
140 | break; | |
141 | } | |
142 | if (laddedNodes.size() == 0) | |
143 | throw JSONRPCError(-24, "Error: Node has not been added."); | |
144 | } | |
145 | ||
146 | if (!fDns) | |
147 | { | |
148 | Object ret; | |
149 | BOOST_FOREACH(string& strAddNode, laddedNodes) | |
150 | ret.push_back(Pair("addednode", strAddNode)); | |
151 | return ret; | |
152 | } | |
153 | ||
154 | Array ret; | |
155 | ||
156 | list<pair<string, vector<CService> > > laddedAddreses(0); | |
157 | BOOST_FOREACH(string& strAddNode, laddedNodes) | |
158 | { | |
159 | vector<CService> vservNode(0); | |
0e4b3175 | 160 | if(Lookup(strAddNode.c_str(), vservNode, Params().GetDefaultPort(), fNameLookup, 0)) |
67a11bd6 MC |
161 | laddedAddreses.push_back(make_pair(strAddNode, vservNode)); |
162 | else | |
163 | { | |
164 | Object obj; | |
165 | obj.push_back(Pair("addednode", strAddNode)); | |
166 | obj.push_back(Pair("connected", false)); | |
167 | Array addresses; | |
168 | obj.push_back(Pair("addresses", addresses)); | |
169 | } | |
170 | } | |
171 | ||
172 | LOCK(cs_vNodes); | |
173 | for (list<pair<string, vector<CService> > >::iterator it = laddedAddreses.begin(); it != laddedAddreses.end(); it++) | |
174 | { | |
175 | Object obj; | |
176 | obj.push_back(Pair("addednode", it->first)); | |
177 | ||
178 | Array addresses; | |
179 | bool fConnected = false; | |
180 | BOOST_FOREACH(CService& addrNode, it->second) | |
181 | { | |
182 | bool fFound = false; | |
183 | Object node; | |
184 | node.push_back(Pair("address", addrNode.ToString())); | |
185 | BOOST_FOREACH(CNode* pnode, vNodes) | |
186 | if (pnode->addr == addrNode) | |
187 | { | |
188 | fFound = true; | |
189 | fConnected = true; | |
190 | node.push_back(Pair("connected", pnode->fInbound ? "inbound" : "outbound")); | |
191 | break; | |
192 | } | |
193 | if (!fFound) | |
194 | node.push_back(Pair("connected", "false")); | |
195 | addresses.push_back(node); | |
196 | } | |
197 | obj.push_back(Pair("connected", fConnected)); | |
198 | obj.push_back(Pair("addresses", addresses)); | |
199 | ret.push_back(obj); | |
200 | } | |
201 | ||
202 | return ret; | |
203 | } | |
204 |