diff --git a/include/ircd/server/server.h b/include/ircd/server/server.h index 26e5f02bd..7c8f1612c 100644 --- a/include/ircd/server/server.h +++ b/include/ircd/server/server.h @@ -25,6 +25,8 @@ namespace ircd::server IRCD_EXCEPTION(error, buffer_overrun); IRCD_EXCEPTION(error, unavailable); IRCD_EXCEPTION(error, canceled); + + extern conf::item enable; } #include "tag.h" diff --git a/ircd/server.cc b/ircd/server.cc index 00e33e5e1..d39abce0b 100644 --- a/ircd/server.cc +++ b/ircd/server.cc @@ -36,6 +36,14 @@ ircd::server::log decltype(ircd::server::dock) ircd::server::dock; +decltype(ircd::server::enable) +ircd::server::enable +{ + { "name", "ircd.server.enable" }, + { "default", true }, + { "persist", false }, +}; + decltype(ircd::server::close_all_timeout) ircd::server::close_all_timeout { @@ -510,10 +518,16 @@ ircd::server::submit(const hostport &hostport, request &request) { assert(request.tag == nullptr); + if(unlikely(!server::enable)) + throw unavailable + { + "Remote server requests are disabled by the configuration." + }; + if(unlikely(ircd::run::level != ircd::run::level::RUN)) throw unavailable { - "Unable to fulfill requests at this time." + "Unable to fulfill any further requests." }; auto &peer