20 #include <ripple/app/ledger/LedgerMaster.h>
21 #include <ripple/app/misc/HashRouter.h>
22 #include <ripple/app/misc/NetworkOPs.h>
23 #include <ripple/app/misc/ValidatorList.h>
24 #include <ripple/app/misc/ValidatorSite.h>
25 #include <ripple/basics/base64.h>
26 #include <ripple/basics/make_SSLContext.h>
27 #include <ripple/beast/core/LexicalCast.h>
28 #include <ripple/core/DatabaseCon.h>
29 #include <ripple/nodestore/DatabaseShard.h>
30 #include <ripple/overlay/Cluster.h>
31 #include <ripple/overlay/impl/ConnectAttempt.h>
32 #include <ripple/overlay/impl/PeerImp.h>
33 #include <ripple/overlay/predicates.h>
34 #include <ripple/peerfinder/make_Manager.h>
35 #include <ripple/rpc/handlers/GetCounts.h>
36 #include <ripple/rpc/json_body.h>
37 #include <ripple/server/SimpleWriter.h>
39 #include <boost/algorithm/string/predicate.hpp>
40 #include <boost/utility/in_place_factory.hpp>
44 namespace CrawlOptions {
62 overlay_.remove(*
this);
90 if (ec || overlay_.isStopping())
92 if (ec && ec != boost::asio::error::operation_aborted)
94 JLOG(overlay_.journal_.error()) <<
"on_timer: " << ec.message();
99 overlay_.m_peerFinder->once_per_second();
100 overlay_.sendEndpoints();
101 overlay_.autoConnect();
104 overlay_.deleteIdlePeers();
120 boost::asio::io_service& io_service,
136 app_.journal(
"PeerFinder"),
146 [counts =
m_traffic.getCounts(), collector]() {
150 for (
size_t i = 0; i < counts.size(); ++i)
190 handoff.
moved =
true;
192 JLOG(journal.
debug()) <<
"Peer connection upgrade from " << remote_endpoint;
195 auto const local_endpoint(
196 stream_ptr->next_layer().socket().local_endpoint(ec));
199 JLOG(journal.
debug()) << remote_endpoint <<
" failed: " << ec.message();
205 if (consumer.disconnect())
215 handoff.
moved =
false;
224 return boost::iequals(s,
"peer");
227 handoff.
moved =
false;
236 if (!negotiatedVersion)
239 handoff.
moved =
false;
243 remote_endpoint.address(),
244 "Unable to agree on a protocol version");
253 handoff.
moved =
false;
257 remote_endpoint.address(),
258 "Incorrect security cookie");
270 remote_endpoint.address(),
276 bool const reserved =
284 JLOG(journal.
debug())
285 <<
"Peer " << remote_endpoint <<
" redirected, slots full";
286 handoff.
moved =
false;
288 slot, request, remote_endpoint.address());
294 auto const peer = std::make_shared<PeerImp>(
302 std::move(stream_ptr),
310 auto const result =
m_peers.emplace(peer->slot(), peer);
311 assert(result.second);
314 list_.emplace(peer.get(), peer);
318 handoff.
moved =
true;
323 JLOG(journal.
debug()) <<
"Peer " << remote_endpoint
324 <<
" fails handshake (" << e.
what() <<
")";
327 handoff.
moved =
false;
329 slot, request, remote_endpoint.address(), e.
what());
343 return !versions.empty();
360 boost::beast::http::response<json_body> msg;
361 msg.version(request.version());
362 msg.result(boost::beast::http::status::service_unavailable);
366 ostr << remote_address;
367 msg.insert(
"Remote-Address", ostr.
str());
369 msg.insert(
"Content-Type",
"application/json");
370 msg.insert(boost::beast::http::field::connection,
"close");
375 ips.
append(_.address.to_string());
377 msg.prepare_payload();
378 return std::make_shared<SimpleWriter>(msg);
388 boost::beast::http::response<boost::beast::http::empty_body> msg;
389 msg.version(request.version());
390 msg.result(boost::beast::http::status::bad_request);
391 msg.reason(
"Bad Request (" + text +
")");
393 msg.insert(
"Remote-Address", remote_address.to_string());
394 msg.insert(boost::beast::http::field::connection,
"close");
395 msg.prepare_payload();
396 return std::make_shared<SimpleWriter>(msg);
407 if (usage.disconnect())
409 JLOG(
journal_.
info()) <<
"Over resource limit: " << remote_endpoint;
416 JLOG(
journal_.
debug()) <<
"Connect: No slot for " << remote_endpoint;
420 auto const p = std::make_shared<ConnectAttempt>(
432 list_.emplace(p.get(), p);
445 auto const result =
m_peers.emplace(peer->slot(), peer);
446 assert(result.second);
451 auto const result =
ids_.emplace(
452 std::piecewise_construct,
455 assert(result.second);
461 JLOG(
journal_.
debug()) <<
"activated " << peer->getRemoteAddress() <<
" ("
477 auto const iter =
m_peers.find(slot);
514 if (bootstrapIps.empty())
517 bootstrapIps.
push_back(
"r.ripple.com 51235");
520 bootstrapIps.
push_back(
"zaphod.alloy.ee 51235");
523 bootstrapIps.push_back(
"sahyadri.isrdc.in 51235");
533 for (
auto const& addr : addresses)
535 if (addr.port() == 0)
557 for (
auto& addr : addresses)
559 if (addr.port() == 0)
574 auto const timer = std::make_shared<Timer>(*
this);
576 list_.emplace(timer.get(), timer);
605 for (
auto const& i : stats)
610 item[
"category"] = i.name;
631 auto const result(
ids_.emplace(
632 std::piecewise_construct,
635 assert(result.second);
639 JLOG(
journal_.
debug()) <<
"activated " << peer->getRemoteAddress() <<
" ("
662 auto const n = m->list_size();
663 auto const& journal = from->pjournal();
665 JLOG(journal.debug()) <<
"TMManifest, " << n
666 << (n == 1 ?
" item" :
" items");
670 auto& s = m->list().Get(i).stobject();
674 uint256 const hash = mo->hash();
675 if (!hashRouter.addSuppressionPeer(hash, from->id()))
677 JLOG(journal.info()) <<
"Duplicate manifest #" << i + 1;
683 JLOG(journal.info()) <<
"Untrusted manifest #" << i + 1;
688 auto const serialized = mo->serialized;
702 soci::transaction tr(*db);
703 static const char*
const sql =
704 "INSERT INTO ValidatorManifests (RawData) VALUES "
706 soci::blob rawData(*db);
708 *db << sql, soci::use(rawData);
711 protocol::TMManifests o;
712 o.add_list()->set_stobject(s);
714 auto const toSkip = hashRouter.shouldRelay(hash);
717 std::make_shared<Message>(o, protocol::mtMANIFESTS),
723 <<
"Bad manifest #" << i + 1 <<
": " <<
to_string(result);
728 JLOG(journal.warn()) <<
"Malformed manifest #" << i + 1;
747 using namespace std::chrono_literals;
750 auto const numPeers{
size()};
761 auto const timeout(
seconds((hops * hops) * 10));
769 for (
auto&
id :
ids_)
774 protocol::TMGetPeerShardInfo tmGPS;
775 tmGPS.set_hops(hops);
777 tmGPS, protocol::mtGET_PEER_SHARD_INFO)));
784 csLast_ = duration_cast<seconds>(
795 if (
auto psi = peer->getPeerShardInfo())
800 auto it{peerShardInfo.find(e.first)};
801 if (it != peerShardInfo.end())
803 it->second.shardIndexes += e.second.shardIndexes;
805 peerShardInfo.emplace(std::move(e));
812 for (
auto const& e : peerShardInfo)
818 auto const& address{e.second.endpoint.address()};
819 if (!address.is_unspecified())
820 pv[jss::ip] = address.to_string();
822 pv[jss::complete_shards] =
to_string(e.second.shardIndexes);
866 sp->getNodePublic().data(), sp->getNodePublic().size());
867 pv[jss::type] = sp->slot()->inbound() ?
"in" :
"out";
869 duration_cast<seconds>(sp->uptime()).count());
872 pv[jss::ip] = sp->getRemoteAddress().address().to_string();
873 if (sp->slot()->inbound())
875 if (
auto port = sp->slot()->listening_port())
876 pv[jss::port] = *port;
885 auto version{sp->getVersion()};
886 if (!version.empty())
888 pv[jss::version] = version;
892 sp->ledgerRange(minSeq, maxSeq);
893 if (minSeq != 0 || maxSeq != 0)
894 pv[jss::complete_ledgers] =
897 if (
auto shardIndexes = sp->getShardIndexes())
898 pv[jss::complete_shards] =
to_string(*shardIndexes);
907 bool const humanReadable =
false;
908 bool const admin =
false;
909 bool const counters =
false;
916 server_info.
removeMember(jss::load_factor_fee_escalation);
920 if (server_info.
isMember(jss::validated_ledger))
922 Json::Value& validated_ledger = server_info[jss::validated_ledger];
943 if (validators.
isMember(jss::publisher_lists))
945 Json::Value& publisher_lists = validators[jss::publisher_lists];
947 for (
auto& publisher : publisher_lists)
959 if (validatorSites.
isMember(jss::validator_sites))
961 validators[jss::validator_sites] =
962 std::move(validatorSites[jss::validator_sites]);
983 if (req.target() !=
"/crawl" ||
987 boost::beast::http::response<json_body> msg;
988 msg.version(req.version());
989 msg.result(boost::beast::http::status::ok);
991 msg.insert(
"Content-Type",
"application/json");
992 msg.insert(
"Connection",
"close");
1012 msg.prepare_payload();
1013 handoff.
response = std::make_shared<SimpleWriter>(msg);
1029 auto key = req.target().substr(prefix.size());
1037 boost::beast::http::response<json_body> msg;
1038 msg.version(req.version());
1040 msg.insert(
"Content-Type",
"application/json");
1041 msg.insert(
"Connection",
"close");
1046 msg.result(boost::beast::http::status::not_found);
1047 msg.insert(
"Content-Length",
"0");
1053 msg.result(boost::beast::http::status::ok);
1058 msg.prepare_payload();
1059 handoff.
response = std::make_shared<SimpleWriter>(msg);
1066 if (req.target() !=
"/health")
1068 boost::beast::http::response<json_body> msg;
1069 msg.version(req.version());
1071 msg.insert(
"Content-Type",
"application/json");
1072 msg.insert(
"Connection",
"close");
1076 int last_validated_ledger_age = -1;
1077 if (info.isMember(
"validated_ledger"))
1078 last_validated_ledger_age = info[
"validated_ledger"][
"age"].asInt();
1079 bool amendment_blocked =
false;
1080 if (info.isMember(
"amendment_blocked"))
1081 amendment_blocked =
true;
1082 int number_peers = info[
"peers"].asInt();
1083 std::string server_state = info[
"server_state"].asString();
1085 info[
"load_factor"].asDouble() / info[
"load_base"].asDouble();
1087 enum { healthy, warning, critical };
1088 int health = healthy;
1089 auto set_health = [&health](
int state) {
1095 if (last_validated_ledger_age >= 7 || last_validated_ledger_age < 0)
1097 msg.body()[jss::info][
"validated_ledger"] = last_validated_ledger_age;
1098 if (last_validated_ledger_age < 20)
1099 set_health(warning);
1101 set_health(critical);
1104 if (amendment_blocked)
1106 msg.body()[jss::info][
"amendment_blocked"] =
true;
1107 set_health(critical);
1110 if (number_peers <= 7)
1112 msg.body()[jss::info][
"peers"] = number_peers;
1113 if (number_peers != 0)
1114 set_health(warning);
1116 set_health(critical);
1119 if (!(server_state ==
"full" || server_state ==
"validating" ||
1120 server_state ==
"proposing"))
1122 msg.body()[jss::info][
"server_state"] = server_state;
1123 if (server_state ==
"syncing" || server_state ==
"tracking" ||
1124 server_state ==
"connected")
1126 set_health(warning);
1129 set_health(critical);
1132 if (load_factor > 100)
1134 msg.body()[jss::info][
"load_factor"] = load_factor;
1135 if (load_factor < 1000)
1136 set_health(warning);
1138 set_health(critical);
1144 msg.result(boost::beast::http::status::ok);
1147 msg.result(boost::beast::http::status::service_unavailable);
1150 msg.result(boost::beast::http::status::internal_server_error);
1154 msg.prepare_payload();
1155 handoff.
response = std::make_shared<SimpleWriter>(msg);
1191 auto const iter =
ids_.find(
id);
1192 if (iter !=
ids_.end())
1193 return iter->second.lock();
1203 for (
auto const& e :
ids_)
1205 if (
auto peer = e.second.lock())
1207 if (peer->getNodePublic() == pubKey)
1217 auto const sm = std::make_shared<Message>(m, protocol::mtPROPOSE_LEDGER);
1223 protocol::TMProposeSet& m,
1230 std::make_shared<Message>(m, protocol::mtPROPOSE_LEDGER, validator);
1232 if (toSkip->find(p->id()) == toSkip->end())
1243 auto const sm = std::make_shared<Message>(m, protocol::mtVALIDATION);
1249 protocol::TMValidation& m,
1256 std::make_shared<Message>(m, protocol::mtVALIDATION, validator);
1258 if (toSkip->find(p->id()) == toSkip->end())
1274 protocol::TMManifests tm;
1277 [&tm](
std::size_t s) { tm.mutable_list()->Reserve(s); },
1279 tm.add_list()->set_stobject(
1281 hr.addSuppression(
manifest.hash());
1286 if (tm.list_size() != 0)
1288 std::make_shared<Message>(tm, protocol::mtMANIFESTS);
1302 list_.erase(&child);
1323 work_ = boost::none;
1326 for (
auto const& element :
list_)
1332 for (
auto const& child : children)
1334 if (child !=
nullptr)
1343 for (
auto addr : result)
1350 auto const result =
m_peerFinder->buildEndpointsForPeers();
1351 for (
auto const& e : result)
1356 auto const iter =
m_peers.find(e.first);
1358 peer = iter->second.lock();
1361 peer->sendEndpoints(e.second.begin(), e.second.end());
1369 uint64_t squelchDuration)
1371 protocol::TMSquelch m;
1373 m.set_validatorpubkey(validator.data(), validator.size());
1375 m.set_squelchduration(squelchDuration);
1376 return std::make_shared<Message>(m, protocol::mtSQUELCH);
1396 uint32_t squelchDuration)
const
1411 protocol::MessageType type)
1413 if (!
strand_.running_in_this_thread())
1416 [
this, key, validator, peers = std::move(peers), type]()
mutable {
1420 for (
auto id : peers)
1421 slots_.updateSlotAndSquelch(key, validator,
id, type);
1429 protocol::MessageType type)
1431 if (!
strand_.running_in_this_thread())
1432 return post(
strand_, [
this, key, validator, peer, type]() {
1436 slots_.updateSlotAndSquelch(key, validator, peer, type);
1442 if (!
strand_.running_in_this_thread())
1445 slots_.deletePeer(
id,
true);
1451 if (!
strand_.running_in_this_thread())
1454 slots_.deleteIdlePeers();
1465 auto const& section = config.
section(
"overlay");
1470 Throw<std::runtime_error>(
"Configured IP limit is invalid");
1473 set(ip,
"public_ip", section);
1476 boost::system::error_code ec;
1479 Throw<std::runtime_error>(
"Configured public IP is invalid");
1484 auto const& section = config.
section(
"crawl");
1485 auto const& values = section.
values();
1487 if (values.size() > 1)
1489 Throw<std::runtime_error>(
1490 "Configured [crawl] section is invalid, too many values");
1493 bool crawlEnabled =
true;
1496 if (values.size() == 1)
1500 crawlEnabled = boost::lexical_cast<bool>(values.front());
1502 catch (boost::bad_lexical_cast
const&)
1504 Throw<std::runtime_error>(
1505 "Configured [crawl] section has invalid value: " +
1512 if (get<bool>(section,
"overlay",
true))
1516 if (get<bool>(section,
"server",
true))
1520 if (get<bool>(section,
"counts",
false))
1524 if (get<bool>(section,
"unl",
true))
1531 auto const& section = config.
section(
"vl");
1538 auto id = config.
legacy(
"network_id");
1545 if (
id ==
"testnet")
1556 Throw<std::runtime_error>(
1557 "Configured [network_id] section is invalid: must be a number "
1558 "or one of the strings 'main', 'testnet' or 'devnet'.");
1572 boost::asio::io_service& io_service,
1576 return std::make_unique<OverlayImpl>(
std::string const & name() const
Returns the name of this source.
virtual Consumer newInboundEndpoint(beast::IP::Endpoint const &address)=0
Create a new endpoint keyed by inbound IP address or the forwarded IP if proxied.
virtual Consumer newOutboundEndpoint(beast::IP::Endpoint const &address)=0
Create a new endpoint keyed by outbound IP address and port.
Json::Value getServerCounts()
Returns information about the local server's performance counters.
const beast::Journal journal_
boost::asio::ip::address address_type
virtual Cluster & cluster()=0
virtual Json::Value getServerInfo(bool human, bool admin, bool counters)=0
auto const & getCounts() const
An up-to-date copy of all the counters.
@ checkIdlePeers
How often we check for idle peers (seconds)
boost::optional< boost::asio::io_service::work > work_
void stopped()
Called by derived classes to indicate that the stoppable has stopped.
virtual void pubManifest(Manifest const &)=0
static bool is_upgrade(boost::beast::http::header< true, Fields > const &req)
hash_map< Peer::id_t, std::weak_ptr< PeerImp > > ids_
@ arrayValue
array value (ordered list)
boost::beast::http::request< boost::beast::http::dynamic_body > http_request_type
void updateSlotAndSquelch(uint256 const &key, PublicKey const &validator, std::set< Peer::id_t > &&peers, protocol::MessageType type)
Updates message count for validator/peer.
boost::optional< Json::Value > getAvailable(boost::beast::string_view const &pubKey)
Returns the current valid list for the given publisher key, if available, as a Json object.
virtual ValidatorSite & validatorSites()=0
std::uint32_t crawlOptions
void convert(soci::blob &from, std::vector< std::uint8_t > &to)
std::set< std::uint32_t > csIDs_
std::recursive_mutex mutex_
void on_timer(error_code ec)
virtual PeerReservationTable & peerReservations()=0
std::atomic< Peer::id_t > next_id_
std::string base64_encode(std::uint8_t const *data, std::size_t len)
bool empty() const noexcept
std::shared_ptr< boost::asio::ssl::context > make_SSLContext(std::string const &cipherList)
Create a self-signed SSL context that allows anonymous Diffie Hellman.
std::unique_ptr< Overlay > make_Overlay(Application &app, Overlay::Setup const &setup, Stoppable &parent, ServerHandler &serverHandler, Resource::Manager &resourceManager, Resolver &resolver, boost::asio::io_service &io_service, BasicConfig const &config, beast::insight::Collector::ptr const &collector)
Creates the implementation of Overlay.
static std::string makePrefix(std::uint32_t id)
Handoff onHandoff(std::unique_ptr< stream_type > &&bundle, http_request_type &&request, endpoint_type remote_endpoint) override
Conditionally accept an incoming HTTP request.
std::string toBase58(AccountID const &v)
Convert AccountID to base58 checked string.
std::condition_variable csCV_
void setup(Setup const &setup, beast::Journal journal)
boost::asio::io_service::strand strand_
Json::Value getServerInfo()
Returns information about the local server.
void onStart() override
Override called during start.
std::vector< ProtocolVersion > parseProtocolVersions(boost::beast::string_view const &value)
Parse a set of protocol versions.
Stopwatch & stopwatch()
Returns an instance of a wall clock.
std::string to_string(ListDisposition disposition)
void broadcast(protocol::TMProposeSet &m) override
Broadcast a proposal.
virtual std::shared_ptr< Slot > new_outbound_slot(beast::IP::Endpoint const &remote_endpoint)=0
Create a new outbound slot with the specified remote endpoint.
void connect(beast::IP::Endpoint const &remote_endpoint) override
Establish a peer connection to the specified endpoint.
Json::Value json() override
Return diagnostics on the status of all peers.
Setup const & setup() const
bool processValidatorList(http_request_type const &req, Handoff &handoff)
Handles validator list requests.
Select all peers that are in the specified set.
virtual NetworkOPs & getOPs()=0
virtual DatabaseCon & getWalletDB()=0
Retrieve the "wallet database".
bool processHealth(http_request_type const &req, Handoff &handoff)
Handles health requests.
std::vector< std::string > const & values() const
Returns all the values in the section.
bool is_private(AddressV4 const &addr)
Returns true if the address is a private unroutable address.
Sends a message to all peers.
void onChildrenStopped() override
Override called when all children have stopped.
static Config makeConfig(ripple::Config const &config, std::uint16_t port, bool validationPublicKey, int ipLimit)
Make PeerFinder::Config from configuration parameters.
std::condition_variable_any cond_
boost::optional< ProtocolVersion > negotiateProtocolVersion(std::vector< ProtocolVersion > const &versions)
Given a list of supported protocol versions, choose the one we prefer.
PublicKey verifyHandshake(boost::beast::http::fields const &headers, ripple::uint256 const &sharedValue, boost::optional< std::uint32_t > networkID, beast::IP::Address public_ip, beast::IP::Address remote, Application &app)
Validate header fields necessary for upgrading the link to the peer protocol.
static IP::Endpoint from_asio(boost::asio::ip::address const &address)
boost::optional< std::string > member(PublicKey const &node) const
Determines whether a node belongs in the cluster.
PeerFinder::Manager & peerFinder()
std::size_t size() const override
The number of active peers on the network Active peers are only those peers that have completed the h...
void checkTracking(std::uint32_t) override
Calls the checkTracking function on each peer.
bool is_keep_alive(boost::beast::http::message< isRequest, Body, Fields > const &m)
Overlay::Setup setup_Overlay(BasicConfig const &config)
Value & append(const Value &value)
Append value to array at the end.
void onManifests(std::shared_ptr< protocol::TMManifests > const &m, std::shared_ptr< PeerImp > const &from)
Provides an interface for starting and stopping.
beast::IP::Address public_ip
std::shared_ptr< Message > manifestMessage_
LockedSociSession checkoutDb()
Resource::Manager & resourceManager()
@ objectValue
object value (collection of name/value pairs).
void add(Source &source)
Add a child source.
Json::Value getOverlayInfo()
Returns information about peers on the overlay network.
boost::asio::io_service & io_service_
virtual Config & config()=0
Json::Value getJson() const
Return JSON representation of configured validator sites.
std::vector< std::string > IPS_FIXED
bool areChildrenStopped() const
Returns true if all children have stopped.
ServerHandler & serverHandler()
bool set(T &target, std::string const &name, Section const §ion)
Set a value from a configuration Section If the named value is not found or doesn't parse as a T,...
Json::Value getUnlInfo()
Returns information about the local server's UNL.
bool listed(PublicKey const &identity) const
Returns true if public key is included on any lists.
boost::optional< uint256 > makeSharedValue(stream_type &ssl, beast::Journal journal)
Computes a shared value based on the SSL connection state.
void legacy(std::string const §ion, std::string value)
Set a value that is not a key/value pair.
void for_each_manifest(Function &&f) const
Invokes the callback once for every populated manifest.
std::unique_ptr< PeerFinder::Manager > m_peerFinder
bool isMember(const char *key) const
Return true if the object has a member named key.
A generic endpoint for log messages.
ServerHandler & serverHandler_
void onPrepare() override
Override called during preparation.
Child(OverlayImpl &overlay)
std::optional< std::set< PeerShortID > > shouldRelay(uint256 const &key)
Determines whether the hashed item should be relayed.
PeerSequence getActivePeers() const override
Returns a sequence representing the current list of peers.
Result split_commas(FwdIt first, FwdIt last)
virtual PublicKey const & getValidationPublicKey() const =0
OverlayImpl(Application &app, Setup const &setup, Stoppable &parent, ServerHandler &serverHandler, Resource::Manager &resourceManager, Resolver &resolver, boost::asio::io_service &io_service, BasicConfig const &config, beast::insight::Collector::ptr const &collector)
void deleteIdlePeers()
Check if peers stopped relaying messages and if slots stopped receiving messages from the validator.
virtual ValidatorList & validators()=0
bool processRequest(http_request_type const &req, Handoff &handoff)
Handles non-peer protocol requests.
std::optional< std::uint32_t > manifestListSeq_
@ accepted
Manifest is valid.
Tracks load and resource consumption.
std::string const & getFullVersionString()
Full server version string.
void deletePeer(Peer::id_t id)
Called when the peer is deleted.
Json::Value getCountsJson(Application &app, int minObjectCount)
Resource::Manager & m_resourceManager
T emplace_back(T... args)
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
std::set< Peer::id_t > relay(protocol::TMProposeSet &m, uint256 const &uid, PublicKey const &validator) override
Relay a proposal.
boost::optional< Manifest > deserializeManifest(Slice s)
Constructs Manifest from serialized string.
virtual beast::Journal journal(std::string const &name)=0
virtual ManifestCache & validatorManifests()=0
std::shared_ptr< Message > getManifestsMessage()
Value removeMember(const char *key)
Remove and return the named member.
send_if_not_pred< Predicate > send_if_not(std::shared_ptr< Message > const &m, Predicate const &f)
Helper function to aid in type deduction.
void remove(std::shared_ptr< PeerFinder::Slot > const &slot)
Manages the set of connected peers.
void activate(std::shared_ptr< PeerImp > const &peer)
Called when a peer has connected successfully This is called after the peer handshake has been comple...
void onPeerDeactivate(Peer::id_t id)
boost::optional< std::uint32_t > networkID
boost::container::flat_map< Child *, std::weak_ptr< Child > > list_
void lastLink(std::uint32_t id)
Called when the last link from a peer chain is received.
Timer(OverlayImpl &overlay)
void squelch(PublicKey const &validator, Peer::id_t const id, std::uint32_t squelchDuration) const override
Squelch handler.
Wraps a Journal::Sink to prefix its output with a string.
Used to indicate the result of a server connection handoff.
std::shared_ptr< Peer > findPeerByPublicKey(PublicKey const &pubKey) override
Returns the peer with the matching public key, or null.
Json::Value getJson() const
Return a JSON representation of the state of the validator list.
bool contains(PublicKey const &nodeId)
std::vector< std::string > IPS
std::shared_ptr< Writer > makeRedirectResponse(std::shared_ptr< PeerFinder::Slot > const &slot, http_request_type const &request, address_type remote_address)
A version-independent IP address and port combination.
std::weak_ptr< Timer > timer_
std::shared_ptr< boost::asio::ssl::context > context
std::shared_ptr< Writer > response
static boost::asio::ip::tcp::endpoint to_asio_endpoint(IP::Endpoint const &address)
PeerFinder configuration settings.
std::atomic< std::chrono::seconds > csLast_
std::shared_ptr< Peer > findPeerByShortID(Peer::id_t const &id) const override
Returns the peer with the matching short id, or null.
void reportTraffic(TrafficCount::category cat, bool isInbound, int bytes)
Json::Value crawlShards(bool pubKey, std::uint32_t hops) override
Returns information reported to the crawl shard RPC command.
void addCount(category cat, bool inbound, int bytes)
Account for traffic associated with the given category.
std::shared_ptr< Message > makeSquelchMessage(PublicKey const &validator, bool squelch, uint64_t squelchDuration)
ManifestDisposition applyManifest(Manifest m)
Add manifest to cache.
std::shared_ptr< Writer > makeErrorResponse(std::shared_ptr< PeerFinder::Slot > const &slot, http_request_type const &request, address_type remote_address, std::string msg)
hash_map< std::shared_ptr< PeerFinder::Slot >, std::weak_ptr< PeerImp > > m_peers
void resolve(std::vector< std::string > const &names, Handler handler)
resolve all hostnames on the list
static bool isPeerUpgrade(http_request_type const &request)
void add_active(std::shared_ptr< PeerImp > const &peer)
boost::system::error_code error_code
squelch::Slots< UptimeClock > slots_
void onWrite(beast::PropertyStream::Map &stream) override
Subclass override.
virtual HashRouter & getHashRouter()=0
Holds unparsed configuration information.
void for_each(UnaryFunc &&f) const
void onStop() override
Override called when the stop notification is issued.
void unsquelch(PublicKey const &validator, Peer::id_t id) const override
Unsquelch handler.
Section & section(std::string const &name)
Returns the section with the given name.
int limit() override
Returns the maximum number of peers we are configured to allow.
bool processCrawl(http_request_type const &req, Handoff &handoff)
Handles crawl requests.
boost::asio::ip::tcp::endpoint endpoint_type
bool isStopping() const
Returns true if the stoppable should stop.
std::uint32_t sequence() const
A monotonically increasing number used to detect new manifests.