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();
107 overlay_.deleteIdlePeers();
123 boost::asio::io_service& io_service,
139 app_.journal(
"PeerFinder"),
149 [counts =
m_traffic.getCounts(), collector]() {
153 for (
size_t i = 0; i < counts.size(); ++i)
193 handoff.
moved =
true;
195 JLOG(journal.
debug()) <<
"Peer connection upgrade from " << remote_endpoint;
198 auto const local_endpoint(
199 stream_ptr->next_layer().socket().local_endpoint(ec));
202 JLOG(journal.
debug()) << remote_endpoint <<
" failed: " << ec.message();
208 if (consumer.disconnect())
218 handoff.
moved =
false;
227 return boost::iequals(s,
"peer");
230 handoff.
moved =
false;
239 if (!negotiatedVersion)
242 handoff.
moved =
false;
246 remote_endpoint.address(),
247 "Unable to agree on a protocol version");
256 handoff.
moved =
false;
260 remote_endpoint.address(),
261 "Incorrect security cookie");
273 remote_endpoint.address(),
279 bool const reserved =
287 JLOG(journal.
debug())
288 <<
"Peer " << remote_endpoint <<
" redirected, slots full";
289 handoff.
moved =
false;
291 slot, request, remote_endpoint.address());
297 auto const peer = std::make_shared<PeerImp>(
305 std::move(stream_ptr),
313 auto const result =
m_peers.emplace(peer->slot(), peer);
314 assert(result.second);
317 list_.emplace(peer.get(), peer);
321 handoff.
moved =
true;
326 JLOG(journal.
debug()) <<
"Peer " << remote_endpoint
327 <<
" fails handshake (" << e.
what() <<
")";
330 handoff.
moved =
false;
332 slot, request, remote_endpoint.address(), e.
what());
346 return !versions.empty();
363 boost::beast::http::response<json_body> msg;
364 msg.version(request.version());
365 msg.result(boost::beast::http::status::service_unavailable);
369 ostr << remote_address;
370 msg.insert(
"Remote-Address", ostr.
str());
372 msg.insert(
"Content-Type",
"application/json");
373 msg.insert(boost::beast::http::field::connection,
"close");
378 ips.
append(_.address.to_string());
380 msg.prepare_payload();
381 return std::make_shared<SimpleWriter>(msg);
391 boost::beast::http::response<boost::beast::http::empty_body> msg;
392 msg.version(request.version());
393 msg.result(boost::beast::http::status::bad_request);
394 msg.reason(
"Bad Request (" + text +
")");
396 msg.insert(
"Remote-Address", remote_address.to_string());
397 msg.insert(boost::beast::http::field::connection,
"close");
398 msg.prepare_payload();
399 return std::make_shared<SimpleWriter>(msg);
410 if (usage.disconnect())
412 JLOG(
journal_.
info()) <<
"Over resource limit: " << remote_endpoint;
419 JLOG(
journal_.
debug()) <<
"Connect: No slot for " << remote_endpoint;
423 auto const p = std::make_shared<ConnectAttempt>(
435 list_.emplace(p.get(), p);
448 auto const result =
m_peers.emplace(peer->slot(), peer);
449 assert(result.second);
454 auto const result =
ids_.emplace(
455 std::piecewise_construct,
458 assert(result.second);
464 JLOG(
journal_.
debug()) <<
"activated " << peer->getRemoteAddress() <<
" ("
480 auto const iter =
m_peers.find(slot);
543 if (bootstrapIps.empty())
546 bootstrapIps.
push_back(
"r.ripple.com 51235");
549 bootstrapIps.
push_back(
"zaphod.alloy.ee 51235");
552 bootstrapIps.push_back(
"sahyadri.isrdc.in 51235");
562 for (
auto const& addr : addresses)
564 if (addr.port() == 0)
586 for (
auto& addr : addresses)
588 if (addr.port() == 0)
603 auto const timer = std::make_shared<Timer>(*
this);
605 list_.emplace(timer.get(), timer);
634 for (
auto const& i : stats)
639 item[
"category"] = i.name;
660 auto const result(
ids_.emplace(
661 std::piecewise_construct,
664 assert(result.second);
668 JLOG(
journal_.
debug()) <<
"activated " << peer->getRemoteAddress() <<
" ("
691 auto const n = m->list_size();
692 auto const& journal = from->pjournal();
694 JLOG(journal.debug()) <<
"TMManifest, " << n
695 << (n == 1 ?
" item" :
" items");
699 auto& s = m->list().Get(i).stobject();
703 uint256 const hash = mo->hash();
704 if (!hashRouter.addSuppressionPeer(hash, from->id()))
706 JLOG(journal.info()) <<
"Duplicate manifest #" << i + 1;
712 JLOG(journal.info()) <<
"Untrusted manifest #" << i + 1;
717 auto const serialized = mo->serialized;
731 soci::transaction tr(*db);
732 static const char*
const sql =
733 "INSERT INTO ValidatorManifests (RawData) VALUES "
735 soci::blob rawData(*db);
737 *db << sql, soci::use(rawData);
740 protocol::TMManifests o;
741 o.add_list()->set_stobject(s);
743 auto const toSkip = hashRouter.shouldRelay(hash);
746 std::make_shared<Message>(o, protocol::mtMANIFESTS),
752 <<
"Bad manifest #" << i + 1 <<
": " <<
to_string(result);
757 JLOG(journal.warn()) <<
"Malformed manifest #" << i + 1;
776 using namespace std::chrono_literals;
779 auto const numPeers{
size()};
790 auto const timeout(
seconds((hops * hops) * 10));
798 for (
auto&
id :
ids_)
803 protocol::TMGetPeerShardInfo tmGPS;
804 tmGPS.set_hops(hops);
806 tmGPS, protocol::mtGET_PEER_SHARD_INFO)));
813 csLast_ = duration_cast<seconds>(
824 if (
auto psi = peer->getPeerShardInfo())
829 auto it{peerShardInfo.find(e.first)};
830 if (it != peerShardInfo.end())
832 it->second.shardIndexes += e.second.shardIndexes;
834 peerShardInfo.emplace(std::move(e));
841 for (
auto const& e : peerShardInfo)
847 auto const& address{e.second.endpoint.address()};
848 if (!address.is_unspecified())
849 pv[jss::ip] = address.to_string();
851 pv[jss::complete_shards] =
to_string(e.second.shardIndexes);
895 sp->getNodePublic().data(), sp->getNodePublic().size());
896 pv[jss::type] = sp->slot()->inbound() ?
"in" :
"out";
898 duration_cast<seconds>(sp->uptime()).count());
901 pv[jss::ip] = sp->getRemoteAddress().address().to_string();
902 if (sp->slot()->inbound())
904 if (
auto port = sp->slot()->listening_port())
905 pv[jss::port] = *port;
914 auto version{sp->getVersion()};
915 if (!version.empty())
917 pv[jss::version] = version;
921 sp->ledgerRange(minSeq, maxSeq);
922 if (minSeq != 0 || maxSeq != 0)
923 pv[jss::complete_ledgers] =
926 if (
auto shardIndexes = sp->getShardIndexes())
927 pv[jss::complete_shards] =
to_string(*shardIndexes);
936 bool const humanReadable =
false;
937 bool const admin =
false;
938 bool const counters =
false;
945 server_info.
removeMember(jss::load_factor_fee_escalation);
949 if (server_info.
isMember(jss::validated_ledger))
951 Json::Value& validated_ledger = server_info[jss::validated_ledger];
972 if (validators.
isMember(jss::publisher_lists))
974 Json::Value& publisher_lists = validators[jss::publisher_lists];
976 for (
auto& publisher : publisher_lists)
988 if (validatorSites.
isMember(jss::validator_sites))
990 validators[jss::validator_sites] =
991 std::move(validatorSites[jss::validator_sites]);
1012 if (req.target() !=
"/crawl" ||
1016 boost::beast::http::response<json_body> msg;
1017 msg.version(req.version());
1018 msg.result(boost::beast::http::status::ok);
1020 msg.insert(
"Content-Type",
"application/json");
1021 msg.insert(
"Connection",
"close");
1041 msg.prepare_payload();
1042 handoff.
response = std::make_shared<SimpleWriter>(msg);
1058 auto key = req.target().substr(prefix.size());
1066 boost::beast::http::response<json_body> msg;
1067 msg.version(req.version());
1069 msg.insert(
"Content-Type",
"application/json");
1070 msg.insert(
"Connection",
"close");
1075 msg.result(boost::beast::http::status::not_found);
1076 msg.insert(
"Content-Length",
"0");
1082 msg.result(boost::beast::http::status::ok);
1087 msg.prepare_payload();
1088 handoff.
response = std::make_shared<SimpleWriter>(msg);
1095 if (req.target() !=
"/health")
1097 boost::beast::http::response<json_body> msg;
1098 msg.version(req.version());
1100 msg.insert(
"Content-Type",
"application/json");
1101 msg.insert(
"Connection",
"close");
1105 int last_validated_ledger_age = -1;
1106 if (info.isMember(
"validated_ledger"))
1107 last_validated_ledger_age = info[
"validated_ledger"][
"age"].asInt();
1108 bool amendment_blocked =
false;
1109 if (info.isMember(
"amendment_blocked"))
1110 amendment_blocked =
true;
1111 int number_peers = info[
"peers"].asInt();
1112 std::string server_state = info[
"server_state"].asString();
1114 info[
"load_factor"].asDouble() / info[
"load_base"].asDouble();
1116 enum { healthy, warning, critical };
1117 int health = healthy;
1118 auto set_health = [&health](
int state) {
1124 if (last_validated_ledger_age >= 7 || last_validated_ledger_age < 0)
1126 msg.body()[jss::info][
"validated_ledger"] = last_validated_ledger_age;
1127 if (last_validated_ledger_age < 20)
1128 set_health(warning);
1130 set_health(critical);
1133 if (amendment_blocked)
1135 msg.body()[jss::info][
"amendment_blocked"] =
true;
1136 set_health(critical);
1139 if (number_peers <= 7)
1141 msg.body()[jss::info][
"peers"] = number_peers;
1142 if (number_peers != 0)
1143 set_health(warning);
1145 set_health(critical);
1148 if (!(server_state ==
"full" || server_state ==
"validating" ||
1149 server_state ==
"proposing"))
1151 msg.body()[jss::info][
"server_state"] = server_state;
1152 if (server_state ==
"syncing" || server_state ==
"tracking" ||
1153 server_state ==
"connected")
1155 set_health(warning);
1158 set_health(critical);
1161 if (load_factor > 100)
1163 msg.body()[jss::info][
"load_factor"] = load_factor;
1164 if (load_factor < 1000)
1165 set_health(warning);
1167 set_health(critical);
1173 msg.result(boost::beast::http::status::ok);
1176 msg.result(boost::beast::http::status::service_unavailable);
1179 msg.result(boost::beast::http::status::internal_server_error);
1183 msg.prepare_payload();
1184 handoff.
response = std::make_shared<SimpleWriter>(msg);
1226 auto const iter =
ids_.find(
id);
1227 if (iter !=
ids_.end())
1228 return iter->second.lock();
1238 for (
auto const& e :
ids_)
1240 if (
auto peer = e.second.lock())
1242 if (peer->getNodePublic() == pubKey)
1252 auto const sm = std::make_shared<Message>(m, protocol::mtPROPOSE_LEDGER);
1258 protocol::TMProposeSet& m,
1265 std::make_shared<Message>(m, protocol::mtPROPOSE_LEDGER, validator);
1267 if (toSkip->find(p->id()) == toSkip->end())
1278 auto const sm = std::make_shared<Message>(m, protocol::mtVALIDATION);
1284 protocol::TMValidation& m,
1291 std::make_shared<Message>(m, protocol::mtVALIDATION, validator);
1293 if (toSkip->find(p->id()) == toSkip->end())
1307 list_.erase(&child);
1328 work_ = boost::none;
1331 for (
auto const& element :
list_)
1337 for (
auto const& child : children)
1339 if (child !=
nullptr)
1348 for (
auto addr : result)
1355 auto const result =
m_peerFinder->buildEndpointsForPeers();
1356 for (
auto const& e : result)
1361 auto const iter =
m_peers.find(e.first);
1363 peer = iter->second.lock();
1366 peer->sendEndpoints(e.second.begin(), e.second.end());
1374 uint64_t squelchDuration)
1376 protocol::TMSquelch m;
1378 m.set_validatorpubkey(validator.data(), validator.size());
1380 m.set_squelchduration(squelchDuration);
1381 return std::make_shared<Message>(m, protocol::mtSQUELCH);
1401 uint32_t squelchDuration)
const
1416 protocol::MessageType type)
1418 if (!
strand_.running_in_this_thread())
1421 [
this, key, validator, peers = std::move(peers), type]()
mutable {
1425 for (
auto id : peers)
1426 slots_.updateSlotAndSquelch(key, validator,
id, type);
1434 protocol::MessageType type)
1436 if (!
strand_.running_in_this_thread())
1437 return post(
strand_, [
this, key, validator, peer, type]() {
1441 slots_.updateSlotAndSquelch(key, validator, peer, type);
1447 if (!
strand_.running_in_this_thread())
1450 slots_.deletePeer(
id,
true);
1456 if (!
strand_.running_in_this_thread())
1459 slots_.deleteIdlePeers();
1470 auto const& section = config.
section(
"overlay");
1475 Throw<std::runtime_error>(
"Configured IP limit is invalid");
1478 set(ip,
"public_ip", section);
1481 boost::system::error_code ec;
1484 Throw<std::runtime_error>(
"Configured public IP is invalid");
1489 auto const& section = config.
section(
"crawl");
1490 auto const& values = section.
values();
1492 if (values.size() > 1)
1494 Throw<std::runtime_error>(
1495 "Configured [crawl] section is invalid, too many values");
1498 bool crawlEnabled =
true;
1501 if (values.size() == 1)
1505 crawlEnabled = boost::lexical_cast<bool>(values.front());
1507 catch (boost::bad_lexical_cast
const&)
1509 Throw<std::runtime_error>(
1510 "Configured [crawl] section has invalid value: " +
1517 if (get<bool>(section,
"overlay",
true))
1521 if (get<bool>(section,
"server",
true))
1525 if (get<bool>(section,
"counts",
false))
1529 if (get<bool>(section,
"unl",
true))
1536 auto const& section = config.
section(
"vl");
1543 auto id = config.
legacy(
"network_id");
1550 if (
id ==
"testnet")
1561 Throw<std::runtime_error>(
1562 "Configured [network_id] section is invalid: must be a number "
1563 "or one of the strings 'main', 'testnet' or 'devnet'.");
1577 boost::asio::io_service& io_service,
1581 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)
std::string features
The set of features we advertise.
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 peerPrivate
true if we want our IP address kept private.
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.
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...
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
bool wantIncoming
true if we want to accept incoming connections.
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.
double outPeers
The number of automatic outbound connections to maintain.
int maxPeers
The largest number of public peer slots to allow.
void legacy(std::string const §ion, std::string value)
Set a value that is not a key/value pair.
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.
@ accepted
Manifest is valid.
Tracks load and resource consumption.
std::string const & getFullVersionString()
Full server version string.
void applyTuning()
Adjusts the values so they follow the business rules.
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.
void checkSanity(std::uint32_t) override
Calls the checkSanity function on each peer.
virtual beast::Journal journal(std::string const &name)=0
virtual ManifestCache & validatorManifests()=0
Value removeMember(const char *key)
Remove and return the named member.
std::uint16_t listeningPort
The listening port number.
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...
double calcOutPeers() const
Returns a suitable value for outPeers according to the rules.
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.
void check() override
Calls the check function on each peer.
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)
bool autoConnect
true if we want to establish connections automatically
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)
@ checkSeconds
How often we check connections (seconds)
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_
int ipLimit
Limit how many incoming connections we allow per IP.
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.