diff --git a/net-mgmt/icinga2/Makefile b/net-mgmt/icinga2/Makefile index b30568b3a1c0..ce14bb592e9f 100644 --- a/net-mgmt/icinga2/Makefile +++ b/net-mgmt/icinga2/Makefile @@ -1,7 +1,6 @@ PORTNAME= icinga2 DISTVERSIONPREFIX= v -DISTVERSION= 2.14.3 -PORTREVISION= 1 +DISTVERSION= 2.14.5 CATEGORIES= net-mgmt MAINTAINER= flo@FreeBSD.org @@ -11,8 +10,6 @@ WWW= https://www.icinga.org/icinga2/ LICENSE= GPLv2 LICENSE_FILE= ${WRKSRC}/COPYING -BROKEN= fails to build with Boost>=1.87 - LIB_DEPENDS= libboost_system.so:devel/boost-libs RUN_DEPENDS= ${LOCALBASE}/bin/bash:shells/bash diff --git a/net-mgmt/icinga2/distinfo b/net-mgmt/icinga2/distinfo index c5066ef8b891..a79dbd826262 100644 --- a/net-mgmt/icinga2/distinfo +++ b/net-mgmt/icinga2/distinfo @@ -1,3 +1,3 @@ -TIMESTAMP = 1731438143 -SHA256 (icinga-icinga2-v2.14.3_GH0.tar.gz) = 8cde20f8d8f66228fd66b4b4cef0deb0e60cf8d2a0ddc94c4cf54df5bec7db33 -SIZE (icinga-icinga2-v2.14.3_GH0.tar.gz) = 9397891 +TIMESTAMP = 1739700506 +SHA256 (icinga-icinga2-v2.14.5_GH0.tar.gz) = 9ab744de272ce17a871298116bd8029400a08563664f07ad1e52d2fa73d6929f +SIZE (icinga-icinga2-v2.14.5_GH0.tar.gz) = 9413390 diff --git a/net-mgmt/icinga2/files/patch-boost-1.87.diff b/net-mgmt/icinga2/files/patch-boost-1.87.diff new file mode 100644 index 000000000000..831c3b9d1e3a --- /dev/null +++ b/net-mgmt/icinga2/files/patch-boost-1.87.diff @@ -0,0 +1,341 @@ +diff --git a/lib/base/io-engine.hpp b/lib/base/io-engine.hpp +index 55a06fb6a6..37ba434761 100644 +--- lib/base/io-engine.hpp ++++ lib/base/io-engine.hpp +@@ -16,11 +16,16 @@ + #include + #include + #include ++#include + #include + #include + #include + #include + ++#if BOOST_VERSION >= 108000 ++# include ++#endif // BOOST_VERSION >= 108000 ++ + namespace icinga + { + +@@ -102,6 +107,10 @@ class IoEngine + static void SpawnCoroutine(Handler& h, Function f) { + + boost::asio::spawn(h, ++#if BOOST_VERSION >= 108000 ++ std::allocator_arg_t(), ++ boost::context::fixedsize_stack(GetCoroutineStackSize()), ++#endif // BOOST_VERSION >= 108000 + [f](boost::asio::yield_context yc) { + + try { +@@ -119,7 +128,11 @@ class IoEngine + throw; + } + }, ++#if BOOST_VERSION >= 108000 ++ boost::asio::detached ++#else // BOOST_VERSION >= 108000 + boost::coroutines::attributes(GetCoroutineStackSize()) // Set a pre-defined stack size. ++#endif // BOOST_VERSION >= 108000 + ); + } + +diff --git a/test/base-io-engine.cpp b/test/base-io-engine.cpp +index 869688b1a6..3a251b1b42 100644 +--- test/base-io-engine.cpp ++++ test/base-io-engine.cpp +@@ -17,7 +17,7 @@ BOOST_AUTO_TEST_CASE(timeout_run) + boost::asio::io_context::strand strand (io); + int called = 0; + +- boost::asio::spawn(strand, [&](boost::asio::yield_context yc) { ++ IoEngine::SpawnCoroutine(strand, [&](boost::asio::yield_context yc) { + boost::asio::deadline_timer timer (io); + + Timeout timeout (strand, boost::posix_time::millisec(300), [&called] { ++called; }); +@@ -44,7 +44,7 @@ BOOST_AUTO_TEST_CASE(timeout_cancelled) + boost::asio::io_context::strand strand (io); + int called = 0; + +- boost::asio::spawn(strand, [&](boost::asio::yield_context yc) { ++ IoEngine::SpawnCoroutine(strand, [&](boost::asio::yield_context yc) { + boost::asio::deadline_timer timer (io); + Timeout timeout (strand, boost::posix_time::millisec(300), [&called] { ++called; }); + +@@ -71,7 +71,7 @@ BOOST_AUTO_TEST_CASE(timeout_scope) + boost::asio::io_context::strand strand (io); + int called = 0; + +- boost::asio::spawn(strand, [&](boost::asio::yield_context yc) { ++ IoEngine::SpawnCoroutine(strand, [&](boost::asio::yield_context yc) { + boost::asio::deadline_timer timer (io); + + { +@@ -100,7 +100,7 @@ BOOST_AUTO_TEST_CASE(timeout_due_cancelled) + boost::asio::io_context::strand strand (io); + int called = 0; + +- boost::asio::spawn(strand, [&](boost::asio::yield_context yc) { ++ IoEngine::SpawnCoroutine(strand, [&](boost::asio::yield_context yc) { + boost::asio::deadline_timer timer (io); + Timeout timeout (strand, boost::posix_time::millisec(300), [&called] { ++called; }); + +@@ -131,7 +131,7 @@ BOOST_AUTO_TEST_CASE(timeout_due_scope) + boost::asio::io_context::strand strand (io); + int called = 0; + +- boost::asio::spawn(strand, [&](boost::asio::yield_context yc) { ++ IoEngine::SpawnCoroutine(strand, [&](boost::asio::yield_context yc) { + boost::asio::deadline_timer timer (io); + + { +diff --git a/lib/base/io-engine.hpp b/lib/base/io-engine.hpp +index 0350d45b83..55a06fb6a6 100644 +--- lib/base/io-engine.hpp ++++ lib/base/io-engine.hpp +@@ -106,14 +106,17 @@ class IoEngine + + try { + f(yc); +- } catch (const boost::coroutines::detail::forced_unwind &) { +- // Required for proper stack unwinding when coroutines are destroyed. +- // https://github.com/boostorg/coroutine/issues/39 +- throw; + } catch (const std::exception& ex) { + Log(LogCritical, "IoEngine") << "Exception in coroutine: " << DiagnosticInformation(ex); + } catch (...) { +- Log(LogCritical, "IoEngine", "Exception in coroutine!"); ++ try { ++ Log(LogCritical, "IoEngine", "Exception in coroutine!"); ++ } catch (...) { ++ } ++ ++ // Required for proper stack unwinding when coroutines are destroyed. ++ // https://github.com/boostorg/coroutine/issues/39 ++ throw; + } + }, + boost::coroutines::attributes(GetCoroutineStackSize()) // Set a pre-defined stack size. +diff --git a/lib/icingadb/redisconnection.cpp b/lib/icingadb/redisconnection.cpp +index a6b82187dd..c1f73f5a0e 100644 +--- lib/icingadb/redisconnection.cpp ++++ lib/icingadb/redisconnection.cpp +@@ -377,8 +377,6 @@ void RedisConnection::Connect(asio::yield_context& yc) + } + + break; +- } catch (const boost::coroutines::detail::forced_unwind&) { +- throw; + } catch (const std::exception& ex) { + Log(LogCritical, "IcingaDB") + << "Cannot connect to " << m_Host << ":" << m_Port << ": " << ex.what(); +@@ -408,17 +406,10 @@ void RedisConnection::ReadLoop(asio::yield_context& yc) + for (auto i (item.Amount); i; --i) { + ReadOne(yc); + } +- } catch (const boost::coroutines::detail::forced_unwind&) { +- throw; + } catch (const std::exception& ex) { + Log(LogCritical, "IcingaDB") + << "Error during receiving the response to a query which has been fired and forgotten: " << ex.what(); + +- continue; +- } catch (...) { +- Log(LogCritical, "IcingaDB") +- << "Error during receiving the response to a query which has been fired and forgotten"; +- + continue; + } + +@@ -432,9 +423,7 @@ void RedisConnection::ReadLoop(asio::yield_context& yc) + + try { + reply = ReadOne(yc); +- } catch (const boost::coroutines::detail::forced_unwind&) { +- throw; +- } catch (...) { ++ } catch (const std::exception&) { + promise.set_exception(std::current_exception()); + + continue; +@@ -455,9 +444,7 @@ void RedisConnection::ReadLoop(asio::yield_context& yc) + for (auto i (item.Amount); i; --i) { + try { + replies.emplace_back(ReadOne(yc)); +- } catch (const boost::coroutines::detail::forced_unwind&) { +- throw; +- } catch (...) { ++ } catch (const std::exception&) { + promise.set_exception(std::current_exception()); + break; + } +@@ -551,19 +538,11 @@ void RedisConnection::WriteItem(boost::asio::yield_context& yc, RedisConnection: + + try { + WriteOne(item, yc); +- } catch (const boost::coroutines::detail::forced_unwind&) { +- throw; + } catch (const std::exception& ex) { + Log msg (LogCritical, "IcingaDB", "Error during sending query"); + LogQuery(item, msg); + msg << " which has been fired and forgotten: " << ex.what(); + +- return; +- } catch (...) { +- Log msg (LogCritical, "IcingaDB", "Error during sending query"); +- LogQuery(item, msg); +- msg << " which has been fired and forgotten"; +- + return; + } + +@@ -587,19 +566,11 @@ void RedisConnection::WriteItem(boost::asio::yield_context& yc, RedisConnection: + WriteOne(query, yc); + ++i; + } +- } catch (const boost::coroutines::detail::forced_unwind&) { +- throw; + } catch (const std::exception& ex) { + Log msg (LogCritical, "IcingaDB", "Error during sending query"); + LogQuery(item[i], msg); + msg << " which has been fired and forgotten: " << ex.what(); + +- return; +- } catch (...) { +- Log msg (LogCritical, "IcingaDB", "Error during sending query"); +- LogQuery(item[i], msg); +- msg << " which has been fired and forgotten"; +- + return; + } + +@@ -618,9 +589,7 @@ void RedisConnection::WriteItem(boost::asio::yield_context& yc, RedisConnection: + + try { + WriteOne(item.first, yc); +- } catch (const boost::coroutines::detail::forced_unwind&) { +- throw; +- } catch (...) { ++ } catch (const std::exception&) { + item.second.set_exception(std::current_exception()); + + return; +@@ -645,9 +614,7 @@ void RedisConnection::WriteItem(boost::asio::yield_context& yc, RedisConnection: + for (auto& query : item.first) { + WriteOne(query, yc); + } +- } catch (const boost::coroutines::detail::forced_unwind&) { +- throw; +- } catch (...) { ++ } catch (const std::exception&) { + item.second.set_exception(std::current_exception()); + + return; +diff --git a/lib/icingadb/redisconnection.hpp b/lib/icingadb/redisconnection.hpp +index 3f963f3d37..2386a1e36e 100644 +--- lib/icingadb/redisconnection.hpp ++++ lib/icingadb/redisconnection.hpp +@@ -389,9 +389,7 @@ RedisConnection::Reply RedisConnection::ReadOne(StreamPtr& stream, boost::asio:: + + try { + return ReadRESP(*strm, yc); +- } catch (const boost::coroutines::detail::forced_unwind&) { +- throw; +- } catch (...) { ++ } catch (const std::exception&) { + if (m_Connecting.exchange(false)) { + m_Connected.store(false); + stream = nullptr; +@@ -403,6 +401,8 @@ RedisConnection::Reply RedisConnection::ReadOne(StreamPtr& stream, boost::asio:: + } + } + ++ throw; ++ } catch (...) { + throw; + } + } +@@ -427,9 +427,7 @@ void RedisConnection::WriteOne(StreamPtr& stream, RedisConnection::Query& query, + try { + WriteRESP(*strm, query, yc); + strm->async_flush(yc); +- } catch (const boost::coroutines::detail::forced_unwind&) { +- throw; +- } catch (...) { ++ } catch (const std::exception&) { + if (m_Connecting.exchange(false)) { + m_Connected.store(false); + stream = nullptr; +@@ -441,6 +439,8 @@ void RedisConnection::WriteOne(StreamPtr& stream, RedisConnection::Query& query, + } + } + ++ throw; ++ } catch (...) { + throw; + } + } +diff --git a/lib/remote/jsonrpcconnection.cpp b/lib/remote/jsonrpcconnection.cpp +index d49c0b359a..8e95325feb 100644 +--- lib/remote/jsonrpcconnection.cpp ++++ lib/remote/jsonrpcconnection.cpp +@@ -212,7 +212,7 @@ void JsonRpcConnection::SendMessage(const Dictionary::Ptr& message) + + Ptr keepAlive (this); + +- m_IoStrand.post([this, keepAlive, message]() { SendMessageInternal(message); }); ++ boost::asio::post(m_IoStrand, [this, keepAlive, message] { SendMessageInternal(message); }); + } + + void JsonRpcConnection::SendRawMessage(const String& message) +@@ -223,7 +223,7 @@ void JsonRpcConnection::SendRawMessage(const String& message) + + Ptr keepAlive (this); + +- m_IoStrand.post([this, keepAlive, message]() { ++ boost::asio::post(m_IoStrand, [this, keepAlive, message] { + if (m_ShuttingDown) { + return; + } +diff --git a/lib/base/tcpsocket.hpp b/lib/base/tcpsocket.hpp +index 471ad8d239..1cf1a23501 100644 +--- lib/base/tcpsocket.hpp ++++ lib/base/tcpsocket.hpp +@@ -41,8 +41,7 @@ void Connect(Socket& socket, const String& node, const String& service) + using boost::asio::ip::tcp; + + tcp::resolver resolver (IoEngine::Get().GetIoContext()); +- tcp::resolver::query query (node, service); +- auto result (resolver.resolve(query)); ++ auto result (resolver.resolve(node.CStr(), service.CStr())); + auto current (result.begin()); + + for (;;) { +@@ -72,8 +71,7 @@ void Connect(Socket& socket, const String& node, const String& service, boost::a + using boost::asio::ip::tcp; + + tcp::resolver resolver (IoEngine::Get().GetIoContext()); +- tcp::resolver::query query (node, service); +- auto result (resolver.async_resolve(query, yc)); ++ auto result (resolver.async_resolve(node.CStr(), service.CStr(), yc)); + auto current (result.begin()); + + for (;;) { +diff --git a/lib/remote/apilistener.cpp b/lib/remote/apilistener.cpp +index 519469aafa..7ef3acddda 100644 +--- lib/remote/apilistener.cpp ++++ lib/remote/apilistener.cpp +@@ -439,9 +439,7 @@ bool ApiListener::AddListener(const String& node, const String& service) + + try { + tcp::resolver resolver (io); +- tcp::resolver::query query (node, service, tcp::resolver::query::passive); +- +- auto result (resolver.resolve(query)); ++ auto result (resolver.resolve(node.CStr(), service.CStr(), tcp::resolver::passive)); + auto current (result.begin()); + + for (;;) { + diff --git a/net-mgmt/icinga2/pkg-plist b/net-mgmt/icinga2/pkg-plist index 110b03aab758..edc45110c4d4 100644 --- a/net-mgmt/icinga2/pkg-plist +++ b/net-mgmt/icinga2/pkg-plist @@ -38,9 +38,9 @@ etc/bash_completion.d/icinga2 @sample %%ETCDIR%%/zones.conf.sample %%ETCDIR%%/zones.d/README %%MYSQL%%lib/icinga2/libmysql_shim.so -%%MYSQL%%lib/icinga2/libmysql_shim.so.2.14.3 +%%MYSQL%%lib/icinga2/libmysql_shim.so.2.14.5 %%PGSQL%%lib/icinga2/libpgsql_shim.so -%%PGSQL%%lib/icinga2/libpgsql_shim.so.2.14.3 +%%PGSQL%%lib/icinga2/libpgsql_shim.so.2.14.5 lib/icinga2/sbin/icinga2 libexec/nagios/check_nscp_api sbin/icinga2