From 959331133252261c0754528fa47da3110390a26c Mon Sep 17 00:00:00 2001 From: SChernykh Date: Mon, 21 Feb 2022 19:59:57 +0100 Subject: [PATCH] Added `bans` console command --- src/console_commands.cpp | 14 +++++++++++++- src/log.cpp | 23 +++++++++++++++++++++++ src/log.h | 7 +++++++ src/tcp_server.h | 1 + src/tcp_server.inl | 24 ++++++++++++++++++++++++ 5 files changed, 68 insertions(+), 1 deletion(-) diff --git a/src/console_commands.cpp b/src/console_commands.cpp index a62ab92..2369ab4 100644 --- a/src/console_commands.cpp +++ b/src/console_commands.cpp @@ -70,7 +70,7 @@ typedef struct cmd { cmdfunc *func; } cmd; -static cmdfunc do_help, do_status, do_loglevel, do_addpeers, do_droppeers, do_showpeers, do_outpeers, do_inpeers, do_start_mining, do_stop_mining, do_exit; +static cmdfunc do_help, do_status, do_loglevel, do_addpeers, do_droppeers, do_showpeers, do_showbans, do_outpeers, do_inpeers, do_start_mining, do_stop_mining, do_exit; static cmd cmds[] = { { STRCONST("help"), "", "display list of commands", do_help }, @@ -79,6 +79,7 @@ static cmd cmds[] = { { STRCONST("addpeers"), "", "add peer", do_addpeers }, { STRCONST("droppeers"), "", "disconnect all peers", do_droppeers }, { STRCONST("peers"), "", "show all peers", do_showpeers }, + { STRCONST("bans"), "", "show all banned IPs", do_showbans }, { STRCONST("outpeers"), "", "set maximum number of outgoing connections", do_outpeers }, { STRCONST("inpeers"), "", "set maximum number of incoming connections", do_inpeers }, { STRCONST("start_mining"), "", "start mining", do_start_mining }, @@ -145,6 +146,17 @@ static int do_showpeers(p2pool* m_pool, const char* /* args */) return 0; } +static int do_showbans(p2pool* m_pool, const char* /* args */) +{ + if (m_pool->stratum_server()) { + m_pool->stratum_server()->print_bans(); + } + if (m_pool->p2p_server()) { + m_pool->p2p_server()->print_bans(); + } + return 0; +} + static int do_outpeers(p2pool* m_pool, const char* args) { if (m_pool->p2p_server()) { diff --git a/src/log.cpp b/src/log.cpp index 9ca1afc..bae36a0 100644 --- a/src/log.cpp +++ b/src/log.cpp @@ -320,6 +320,29 @@ NOINLINE void Stream::writeCurrentTime() m_numberWidth = 1; } +NOINLINE void put_rawip(const raw_ip& value, Stream* wrapper) +{ + const char* addr_str; + char addr_str_buf[64]; + + static constexpr uint8_t ipv4_prefix[12] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255 }; + const bool is_v6 = (memcmp(value.data, ipv4_prefix, 12) != 0); + + if (is_v6) { + addr_str = inet_ntop(AF_INET6, value.data, addr_str_buf, sizeof(addr_str_buf)); + } + else { + addr_str = inet_ntop(AF_INET, value.data + 12, addr_str_buf, sizeof(addr_str_buf)); + } + + if (addr_str) { + *wrapper << addr_str; + } + else { + *wrapper << "N/A"; + } +} + } // namespace log } // namespace p2pool diff --git a/src/log.h b/src/log.h index 8711884..c7586c3 100644 --- a/src/log.h +++ b/src/log.h @@ -384,6 +384,13 @@ template<> struct log::Stream::Entry } }; +void put_rawip(const raw_ip& value, Stream* wrapper); + +template<> struct log::Stream::Entry +{ + static FORCEINLINE void put(const raw_ip& value, Stream* wrapper) { put_rawip(value, wrapper); } +}; + namespace { template void apply_severity(log::Stream&); diff --git a/src/tcp_server.h b/src/tcp_server.h index 5be8826..e14c899 100644 --- a/src/tcp_server.h +++ b/src/tcp_server.h @@ -48,6 +48,7 @@ public: virtual void on_connect_failed(bool is_v6, const raw_ip& ip, int port); void ban(const raw_ip& ip, uint64_t seconds); + virtual void print_bans(); struct Client { diff --git a/src/tcp_server.inl b/src/tcp_server.inl index 5a68ee8..4381f1f 100644 --- a/src/tcp_server.inl +++ b/src/tcp_server.inl @@ -501,6 +501,30 @@ void TCPServer::ban(const raw_ip& ip, uint64_t se m_bans[ip] = ban_time; } +template +void TCPServer::print_bans() +{ + using namespace std::chrono; + const auto cur_time = steady_clock::now(); + + std::vector> bans; + { + MutexLock lock(m_bansLock); + + bans.reserve(m_bans.size()); + for (const auto& b : m_bans) { + bans.emplace_back(std::make_pair(b.first, b.second)); + } + } + + for (const auto& b : bans) { + if (cur_time < b.second) { + const uint64_t t = duration_cast(b.second - cur_time).count(); + LOGINFO(0, b.first << " is banned (" << t << " seconds left)"); + } + } +} + template bool TCPServer::send_internal(Client* client, SendCallbackBase&& callback) {