Hello community, here is the log from the commit of package icinga2 for openSUSE:Factory checked in at 2020-09-22 21:15:59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/icinga2 (Old) and /work/SRC/openSUSE:Factory/.icinga2.new.4249 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "icinga2" Tue Sep 22 21:15:59 2020 rev:29 rq:836041 version:2.12.0 Changes: -------- --- /work/SRC/openSUSE:Factory/icinga2/icinga2.changes 2020-08-25 09:41:40.672291571 +0200 +++ /work/SRC/openSUSE:Factory/.icinga2.new.4249/icinga2.changes 2020-09-22 21:17:37.440267616 +0200 @@ -1,0 +2,93 @@ +Tue Sep 22 05:41:20 UTC 2020 - ecsos <[email protected]> + +- Update to 2.12.0 + * Breaking changes + - Deprecate Windows plugins in favor of our + - PowerShell plugins #8071 + - Deprecate Livestatus #8051 + - Refuse acknowledging an already acknowledged checkable #7695 + - Config lexer: complain on EOF in heredocs, i.e. {{{abc<EOF> #7541 + * Enhancements + + Core + - Implement new database backend: Icinga DB #7571 + - Re-send notifications previously suppressed by their time periods #7816 + + API + - Host/Service: Add acknowledgement_last_change and next_update attributes #7881 #7534 + - Improve error message for POST queries #7681 + - /v1/actions/remove-comment: let users specify themselves #7646 + - /v1/actions/remove-downtime: let users specify themselves #7645 + - /v1/config/stages: Add 'activate' parameter #7535 + + CLI + - Add pki verify command for better TLS certificate troubleshooting #7843 + - Add OpenSSL version to 'Build' section in --version #7833 + - Improve experience with 'Node Setup for Agents/Satellite' #7835 + + DSL + - Add get_template() and get_templates() #7632 + - MacroProcessor::ResolveArguments(): skip null argument values #7567 + - Fix crash due to dependency apply rule with ignore_on_error and non-existing parent #7538 + - Introduce ternary operator (x ? y : z) #7442 + - LegacyTimePeriod: support specifying seconds #7439 + - Add support for Lambda Closures (() use(x) => x and () use(x) => { return x }) #7417 + + ITL + - Add notemp parameter to oracle health #7748 + - Add extended checks options to snmp-interface command template #7602 + - Add file age check for Windows command definition #7540 + + Docs + - Development: Update debugging instructions #7867 + - Add new API clients #7859 + - Clarify CRITICAL vs. UNKNOWN #7665 + - Explicitly explain how to disable freshness checks #7664 + - Update installation for RHEL/CentOS 8 and SLES 15 #7640 + - Add Powershell example to validate the certificate #7603 + + Misc + - Don't send event::Heartbeat to unauthenticated peers #7747 + - OpenTsdbWriter: Add custom tag support #7357 + * Bugfixes + + Core + - Fix JSON-RPC crashes #7532 #7737 + - Fix zone definitions in zones #7546 + - Fix deadlock during start on OpenBSD #7739 + - Consider PENDING not a problem #7685 + - Fix zombie processes after reload #7606 + - Don't wait for checks to finish during reload #7894 + + Cluster + - Fix segfault during heartbeat timeout with clients not yet signed #7970 + - Make the config update process mutually exclusive (Prevents file system race conditions) #7936 + - Fix check_timeout not being forwarded to agent command endpoints #7861 + - Config sync: Use a more friendly message when configs are equal and don't need a reload #7811 + - Fix open connections when agent waits for CA approval #7686 + - Consider a JsonRpcConnection alive on a single byte of TLS payload, not only on a whole message #7836 + - Send JsonRpcConnection heartbeat every 20s instead of 10s #8102 + - Use JsonRpcConnection heartbeat only to update connection liveness (m_Seen) #8142 + - Fix TLS context not being updated on signed certificate messages on agents #7654 + + API + - Close connections w/o successful TLS handshakes after 10s #7809 + - Handle permission exceptions soon enough, returning 404 #7528 + + SELinux + - Fix safe-reload #7858 + - Allow direct SMTP notifications #7749 + + Windows + - Terminate check processes with UNKNOWN state on timeout #7788 + - Ensure that log replay files are properly renamed #7767 + + Metrics + - Graphite/OpenTSDB: Ensure that reconnect failure is detected #7765 + - Always send 0 as value for thresholds #7696 + + Scripts + - Fix notification scripts to stay compatible with Dash #7706 + - Fix bash line continuation in mail-host-notification.sh #7701 + - Fix notification scripts string comparison #7647 + - Service and host mail-notifications: Add line-breaks to very long output #6822 + - Set correct UTF-8 email subject header (RFC1342) #6369 + + Misc + - DSL: Fix segfault due to passing null as custom function to Array#{sort,map,reduce,filter,any,all}() #8053 + - CLI: pki save-cert: allow to specify --key and --cert for backwards compatibility #7995 + - Catch exception when trusted cert is not readable during node setup on agent/satellite #7838 + - CheckCommand ssl: Fix wrong parameter -N #7741 + - Code quality fixes + - Small documentation fixes +- Fix boost build error for Tumbleweed. + - Add patch icinga2-boost-8185-8184.patch + - Add patch icinga2-boost-8185-8190.patch + - add patch icinga2-boost-8185-8191.patch + +------------------------------------------------------------------- Old: ---- v2.11.5.tar.gz New: ---- icinga2-boost-8185-8184.patch icinga2-boost-8185-8190.patch icinga2-boost-8185-8191.patch v2.12.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ icinga2.spec ++++++ --- /var/tmp/diff_new_pack.uTPPiZ/_old 2020-09-22 21:17:38.728268743 +0200 +++ /var/tmp/diff_new_pack.uTPPiZ/_new 2020-09-22 21:17:38.728268743 +0200 @@ -77,6 +77,19 @@ %define icinga_group icinga %define icingacmd_group icingacmd +# enable unity builds by default for all architectures except arm32 +%ifarch %{arm} +%bcond_with unity_build +%else +%bcond_without unity_build +%endif +# enable unity builds by default for all distribution except Tumbleweed +%if 0%{?suse_version} > 1500 +%define unity_build 0 +%else +%define unity_build 1 +%endif + %define logmsg logger -t %{name}/rpm Summary: Network monitoring application @@ -84,9 +97,9 @@ Group: System/Monitoring %if "%{_vendor}" == "suse" %else -%endif # suse +%endif Name: icinga2 -Version: 2.11.5 +Version: 2.12.0 Release: %{revision}%{?dist} URL: https://www.icinga.com/ Source: https://github.com/Icinga/%{name}/archive/v%{version}.tar.gz @@ -95,6 +108,12 @@ %if "%{_vendor}" == "suse" # PATCH-FEATURE-OPENSUSE ecsos -- insert missing graphite tags as descriped in icingaweb2-module-graphite docs. Patch0: icinga2-graphite.patch +%if 0%{?suse_version} > 1500 +# PATCH-FEATURE-OPENSUSE ecsos -- Boost in Tumbleweed is to new. Fix boost build error in Tumbleweed. Should be included in version 2.13.0 +Patch1: icinga2-boost-8185-8184.patch +Patch2: icinga2-boost-8185-8190.patch +Patch3: icinga2-boost-8185-8191.patch +%endif %endif BuildRoot: %{_tmppath}/%{name}-%{version}-build @@ -163,6 +182,7 @@ BuildRequires: libboost_program_options-devel >= 1.66 BuildRequires: libboost_regex-devel >= 1.66 BuildRequires: libboost_system-devel >= 1.66 +BuildRequires: libboost_test-devel >= 1.66 BuildRequires: libboost_thread-devel >= 1.66 %else %if (0%{?el5} || 0%{?rhel} == 5 || "%{?dist}" == ".el5" || 0%{?el6} || 0%{?rhel} == 6 || "%{?dist}" == ".el6") @@ -239,7 +259,7 @@ %else BuildRequires: mysql-devel -%endif #suse +%endif Requires: %{name}-bin = %{version}-%{release} @@ -308,6 +328,12 @@ %if "%{_vendor}" == "suse" find . -type f -name '*.sh' -exec sed -i -e 's|\/usr\/bin\/env bash|\/bin\/bash|g' {} \; %patch0 -p1 +%if 0%{?suse_version} > 1500 +# Fix boost biuld error in Tumbleed. Should be fixed in 2.13.0 +%patch1 -p1 +%patch2 -p1 +%patch3 -p1 +%endif %endif %build @@ -328,6 +354,13 @@ %if 0%{?fedora} CMAKE_OPTS="$CMAKE_OPTS -DICINGA2_WITH_STUDIO=true" %endif + +%if %{unity_build} +CMAKE_OPTS="$CMAKE_OPTS -DICINGA2_UNITY_BUILD=ON " +%else +CMAKE_OPTS="$CMAKE_OPTS -DICINGA2_UNITY_BUILD=OFF " +%endif + %if "%{_vendor}" == "redhat" %if 0%{?el5} || 0%{?rhel} == 5 || "%{?dist}" == ".el5" || 0%{?el6} || 0%{?rhel} == 6 || "%{?dist}" == ".el6" %if 0%{?build_icinga_org} ++++++ icinga2-boost-8185-8184.patch ++++++ >From c30bae2994f1e5f33f6da51eb96d423e9bf0f75c Mon Sep 17 00:00:00 2001 From: Louis Sautier <[email protected]> Date: Thu, 20 Aug 2020 18:25:48 +0200 Subject: [PATCH] =?UTF-8?q?Fix=20=E2=80=98fs::copy=5Foption=E2=80=99=20has?= =?UTF-8?q?=20not=20been=20declared=20with=20boost=201.74.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It was deprecated in https://github.com/boostorg/filesystem/commit/f199152b7df036ff1606c85e4ea1b28edfeda6cc --- lib/base/utility.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/base/utility.cpp b/lib/base/utility.cpp index 1add7616c6..d8e6f20b0c 100644 --- a/lib/base/utility.cpp +++ b/lib/base/utility.cpp @@ -725,7 +725,11 @@ void Utility::CopyFile(const String& source, const String& target) { namespace fs = boost::filesystem; +#if BOOST_VERSION >= 107400 + fs::copy_file(fs::path(source.Begin(), source.End()), fs::path(target.Begin(), target.End()), fs::copy_options::overwrite_existing); +#else /* BOOST_VERSION */ fs::copy_file(fs::path(source.Begin(), source.End()), fs::path(target.Begin(), target.End()), fs::copy_option::overwrite_if_exists); +#endif /* BOOST_VERSION */ } /* ++++++ icinga2-boost-8185-8190.patch ++++++ >From 45dd71e0f9a93369e08d6cb26f97940f9c9594aa Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" <[email protected]> Date: Wed, 26 Aug 2020 13:56:26 +0200 Subject: [PATCH] Introduce HttpUtility::Set() refs #8185 --- lib/cli/consolecommand.cpp | 9 ++++--- lib/perfdata/elasticsearchwriter.cpp | 13 ++++----- lib/perfdata/influxdbwriter.cpp | 7 ++--- lib/remote/configfileshandler.cpp | 4 +-- lib/remote/eventshandler.cpp | 2 +- lib/remote/httpserverconnection.cpp | 40 ++++++++++++++-------------- lib/remote/httputility.cpp | 4 +-- lib/remote/httputility.hpp | 28 +++++++++++++++++++ lib/remote/infohandler.cpp | 6 ++--- plugins/check_nscp_api.cpp | 9 ++++--- 10 files changed, 77 insertions(+), 45 deletions(-) diff --git a/lib/cli/consolecommand.cpp b/lib/cli/consolecommand.cpp index 41b6590e4c..42c5c63133 100644 --- a/lib/cli/consolecommand.cpp +++ b/lib/cli/consolecommand.cpp @@ -3,6 +3,7 @@ #include "cli/consolecommand.hpp" #include "config/configcompiler.hpp" #include "remote/consolehandler.hpp" +#include "remote/httputility.hpp" #include "remote/url.hpp" #include "base/configwriter.hpp" #include "base/serializer.hpp" @@ -580,11 +581,11 @@ Dictionary::Ptr ConsoleCommand::SendRequest() http::request<http::string_body> request(http::verb::post, std::string(l_Url->Format(false)), 10); - request.set(http::field::user_agent, "Icinga/DebugConsole/" + Application::GetAppVersion()); - request.set(http::field::host, l_Url->GetHost() + ":" + l_Url->GetPort()); + HttpUtility::Set(request, http::field::user_agent, "Icinga/DebugConsole/" + Application::GetAppVersion()); + HttpUtility::Set(request, http::field::host, l_Url->GetHost() + ":" + l_Url->GetPort()); - request.set(http::field::accept, "application/json"); - request.set(http::field::authorization, "Basic " + Base64::Encode(l_Url->GetUsername() + ":" + l_Url->GetPassword())); + HttpUtility::Set(request, http::field::accept, "application/json"); + HttpUtility::Set(request, http::field::authorization, "Basic " + Base64::Encode(l_Url->GetUsername() + ":" + l_Url->GetPassword())); try { http::write(*l_TlsStream, request); diff --git a/lib/perfdata/elasticsearchwriter.cpp b/lib/perfdata/elasticsearchwriter.cpp index 6870198e45..3764bf536b 100644 --- a/lib/perfdata/elasticsearchwriter.cpp +++ b/lib/perfdata/elasticsearchwriter.cpp @@ -2,6 +2,7 @@ #include "perfdata/elasticsearchwriter.hpp" #include "perfdata/elasticsearchwriter-ti.cpp" +#include "remote/httputility.hpp" #include "remote/url.hpp" #include "icinga/compatutility.hpp" #include "icinga/service.hpp" @@ -474,27 +475,27 @@ void ElasticsearchWriter::SendRequest(const String& body) http::request<http::string_body> request (http::verb::post, std::string(url->Format(true)), 10); - request.set(http::field::user_agent, "Icinga/" + Application::GetAppVersion()); - request.set(http::field::host, url->GetHost() + ":" + url->GetPort()); + HttpUtility::Set(request, http::field::user_agent, "Icinga/" + Application::GetAppVersion()); + HttpUtility::Set(request, http::field::host, url->GetHost() + ":" + url->GetPort()); /* Specify required headers by Elasticsearch. */ - request.set(http::field::accept, "application/json"); + HttpUtility::Set(request, http::field::accept, "application/json"); /* Use application/x-ndjson for bulk streams. While ES * is able to handle application/json, the newline separator * causes problems with Logstash (#6609). */ - request.set(http::field::content_type, "application/x-ndjson"); + HttpUtility::Set(request, http::field::content_type, "application/x-ndjson"); /* Send authentication if configured. */ String username = GetUsername(); String password = GetPassword(); if (!username.IsEmpty() && !password.IsEmpty()) - request.set(http::field::authorization, "Basic " + Base64::Encode(username + ":" + password)); + HttpUtility::Set(request, http::field::authorization, "Basic " + Base64::Encode(username + ":" + password)); request.body() = body; - request.set(http::field::content_length, request.body().size()); + HttpUtility::Set(request, http::field::content_length, request.body().size()); /* Don't log the request body to debug log, this is already done above. */ Log(LogDebug, "ElasticsearchWriter") diff --git a/lib/perfdata/influxdbwriter.cpp b/lib/perfdata/influxdbwriter.cpp index 4692b8b5df..0ddd582447 100644 --- a/lib/perfdata/influxdbwriter.cpp +++ b/lib/perfdata/influxdbwriter.cpp @@ -2,6 +2,7 @@ #include "perfdata/influxdbwriter.hpp" #include "perfdata/influxdbwriter-ti.cpp" +#include "remote/httputility.hpp" #include "remote/url.hpp" #include "icinga/service.hpp" #include "icinga/macroprocessor.hpp" @@ -501,11 +502,11 @@ void InfluxdbWriter::Flush() http::request<http::string_body> request (http::verb::post, std::string(url->Format(true)), 10); - request.set(http::field::user_agent, "Icinga/" + Application::GetAppVersion()); - request.set(http::field::host, url->GetHost() + ":" + url->GetPort()); + HttpUtility::Set(request, http::field::user_agent, "Icinga/" + Application::GetAppVersion()); + HttpUtility::Set(request, http::field::host, url->GetHost() + ":" + url->GetPort()); request.body() = body; - request.set(http::field::content_length, request.body().size()); + HttpUtility::Set(request, http::field::content_length, request.body().size()); try { if (stream.first) { diff --git a/lib/remote/configfileshandler.cpp b/lib/remote/configfileshandler.cpp index d714f4d864..5c2bfdb405 100644 --- a/lib/remote/configfileshandler.cpp +++ b/lib/remote/configfileshandler.cpp @@ -82,9 +82,9 @@ bool ConfigFilesHandler::HandleRequest( String content((std::istreambuf_iterator<char>(fp)), std::istreambuf_iterator<char>()); response.result(http::status::ok); - response.set(http::field::content_type, "application/octet-stream"); + HttpUtility::Set(response, http::field::content_type, "application/octet-stream"); response.body() = content; - response.set(http::field::content_length, response.body().size()); + HttpUtility::Set(response, http::field::content_length, response.body().size()); } catch (const std::exception& ex) { HttpUtility::SendJsonError(response, params, 500, "Could not read file.", DiagnosticInformation(ex)); diff --git a/lib/remote/eventshandler.cpp b/lib/remote/eventshandler.cpp index e92b14a2d4..e41b4711c6 100644 --- a/lib/remote/eventshandler.cpp +++ b/lib/remote/eventshandler.cpp @@ -100,7 +100,7 @@ bool EventsHandler::HandleRequest( server.StartStreaming(); response.result(http::status::ok); - response.set(http::field::content_type, "application/json"); + HttpUtility::Set(response, http::field::content_type, "application/json"); IoBoundWorkSlot dontLockTheIoThread (yc); diff --git a/lib/remote/httpserverconnection.cpp b/lib/remote/httpserverconnection.cpp index d4eac7d074..688392c821 100644 --- a/lib/remote/httpserverconnection.cpp +++ b/lib/remote/httpserverconnection.cpp @@ -184,12 +184,12 @@ bool EnsureValidHeaders( { "status", String("Bad Request: ") + errorMsg } })); } else { - response.set(http::field::content_type, "text/html"); + HttpUtility::Set(response, http::field::content_type, "text/html"); response.body() = String("<h1>Bad Request</h1><p><pre>") + errorMsg + "</pre></p>"; - response.set(http::field::content_length, response.body().size()); + HttpUtility::Set(response, http::field::content_length, response.body().size()); } - response.set(http::field::connection, "close"); + HttpUtility::Set(response, http::field::connection, "close"); boost::system::error_code ec; @@ -247,20 +247,20 @@ bool HandleAccessControl( auto& origin (request[http::field::origin]); if (allowedOrigins.find(origin.to_string()) != allowedOrigins.end()) { - response.set(http::field::access_control_allow_origin, origin); + HttpUtility::Set(response, http::field::access_control_allow_origin, origin); } allowOriginHeader.Done(); - response.set(http::field::access_control_allow_credentials, "true"); + HttpUtility::Set(response, http::field::access_control_allow_credentials, "true"); if (request.method() == http::verb::options && !request[http::field::access_control_request_method].empty()) { response.result(http::status::ok); - response.set(http::field::access_control_allow_methods, "GET, POST, PUT, DELETE"); - response.set(http::field::access_control_allow_headers, "Authorization, X-HTTP-Method-Override"); + HttpUtility::Set(response, http::field::access_control_allow_methods, "GET, POST, PUT, DELETE"); + HttpUtility::Set(response, http::field::access_control_allow_headers, "Authorization, X-HTTP-Method-Override"); response.body() = "Preflight OK"; - response.set(http::field::content_length, response.body().size()); - response.set(http::field::connection, "close"); + HttpUtility::Set(response, http::field::content_length, response.body().size()); + HttpUtility::Set(response, http::field::connection, "close"); boost::system::error_code ec; @@ -288,10 +288,10 @@ bool EnsureAcceptHeader( if (request.method() != http::verb::get && request[http::field::accept] != "application/json") { response.result(http::status::bad_request); - response.set(http::field::content_type, "text/html"); + HttpUtility::Set(response, http::field::content_type, "text/html"); response.body() = "<h1>Accept header is missing or not set to 'application/json'.</h1>"; - response.set(http::field::content_length, response.body().size()); - response.set(http::field::connection, "close"); + HttpUtility::Set(response, http::field::content_length, response.body().size()); + HttpUtility::Set(response, http::field::connection, "close"); boost::system::error_code ec; @@ -320,8 +320,8 @@ bool EnsureAuthenticatedUser( << "Unauthorized request: " << request.method_string() << ' ' << request.target(); response.result(http::status::unauthorized); - response.set(http::field::www_authenticate, "Basic realm=\"Icinga 2\""); - response.set(http::field::connection, "close"); + HttpUtility::Set(response, http::field::www_authenticate, "Basic realm=\"Icinga 2\""); + HttpUtility::Set(response, http::field::connection, "close"); if (request[http::field::accept] == "application/json") { HttpUtility::SendJsonBody(response, nullptr, new Dictionary({ @@ -329,9 +329,9 @@ bool EnsureAuthenticatedUser( { "status", "Unauthorized. Please check your user credentials." } })); } else { - response.set(http::field::content_type, "text/html"); + HttpUtility::Set(response, http::field::content_type, "text/html"); response.body() = "<h1>Unauthorized. Please check your user credentials.</h1>"; - response.set(http::field::content_length, response.body().size()); + HttpUtility::Set(response, http::field::content_length, response.body().size()); } boost::system::error_code ec; @@ -421,12 +421,12 @@ bool EnsureValidBody( { "status", String("Bad Request: ") + ec.message() } })); } else { - response.set(http::field::content_type, "text/html"); + HttpUtility::Set(response, http::field::content_type, "text/html"); response.body() = String("<h1>Bad Request</h1><p><pre>") + ec.message() + "</pre></p>"; - response.set(http::field::content_length, response.body().size()); + HttpUtility::Set(response, http::field::content_length, response.body().size()); } - response.set(http::field::connection, "close"); + HttpUtility::Set(response, http::field::connection, "close"); http::async_write(stream, response, yc[ec]); stream.async_flush(yc[ec]); @@ -511,7 +511,7 @@ void HttpServerConnection::ProcessMessages(boost::asio::yield_context yc) parser.header_limit(1024 * 1024); parser.body_limit(-1); - response.set(http::field::server, l_ServerHeader); + HttpUtility::Set(response, http::field::server, l_ServerHeader); if (!EnsureValidHeaders(*m_Stream, buf, parser, response, m_ShuttingDown, yc)) { break; diff --git a/lib/remote/httputility.cpp b/lib/remote/httputility.cpp index 91902ba501..e46e990ecf 100644 --- a/lib/remote/httputility.cpp +++ b/lib/remote/httputility.cpp @@ -56,9 +56,9 @@ void HttpUtility::SendJsonBody(boost::beast::http::response<boost::beast::http:: { namespace http = boost::beast::http; - response.set(http::field::content_type, "application/json"); + HttpUtility::Set(response, http::field::content_type, "application/json"); response.body() = JsonEncode(val, params && GetLastParameter(params, "pretty")); - response.set(http::field::content_length, response.body().size()); + HttpUtility::Set(response, http::field::content_length, response.body().size()); } void HttpUtility::SendJsonError(boost::beast::http::response<boost::beast::http::string_body>& response, diff --git a/lib/remote/httputility.hpp b/lib/remote/httputility.hpp index 6465b4af92..be600d4090 100644 --- a/lib/remote/httputility.hpp +++ b/lib/remote/httputility.hpp @@ -5,8 +5,12 @@ #include "remote/url.hpp" #include "base/dictionary.hpp" +#include "base/string.hpp" #include <boost/beast/http.hpp> +#include <boost/lexical_cast.hpp> #include <string> +#include <type_traits> +#include <utility> namespace icinga { @@ -26,6 +30,30 @@ class HttpUtility static void SendJsonBody(boost::beast::http::response<boost::beast::http::string_body>& response, const Dictionary::Ptr& params, const Value& val); static void SendJsonError(boost::beast::http::response<boost::beast::http::string_body>& response, const Dictionary::Ptr& params, const int code, const String& verbose = String(), const String& diagnosticInformation = String()); + + template<class Message, class Key, class Value, typename std::enable_if<std::is_arithmetic<Value>::value, int>::type = 0> + static void Set(Message& message, Key&& key, Value value) + { + Set(message, std::forward<Key>(key), boost::lexical_cast<std::string>(value)); + } + + template<class Message, class Key> + static void Set(Message& message, Key&& key, const String& value) + { + Set(message, std::forward<Key>(key), value.GetData()); + } + + template<class Message, class Key> + static void Set(Message& message, Key&& key, String&& value) + { + Set(message, std::forward<Key>(key), value.GetData()); + } + + template<class Message, class Key, class Value, typename std::enable_if<!std::is_arithmetic<Value>::value, int>::type = 0> + static void Set(Message& message, Key&& key, Value&& value) + { + message.set(std::forward<Key>(key), std::forward<Value>(value)); + } }; } diff --git a/lib/remote/infohandler.cpp b/lib/remote/infohandler.cpp index 18c18c0e04..daec628047 100644 --- a/lib/remote/infohandler.cpp +++ b/lib/remote/infohandler.cpp @@ -29,7 +29,7 @@ bool InfoHandler::HandleRequest( if (url->GetPath().empty()) { response.result(http::status::found); - response.set(http::field::location, "/v1"); + HttpUtility::Set(response, http::field::location, "/v1"); return true; } @@ -74,7 +74,7 @@ bool InfoHandler::HandleRequest( HttpUtility::SendJsonBody(response, params, result); } else { - response.set(http::field::content_type, "text/html"); + HttpUtility::Set(response, http::field::content_type, "text/html"); String body = "<html><head><title>Icinga 2</title></head><h1>Hello from Icinga 2 (Version: " + Application::GetAppVersion() + ")!</h1>"; body += "<p>You are authenticated as <b>" + user->GetName() + "</b>. "; @@ -92,7 +92,7 @@ bool InfoHandler::HandleRequest( body += R"(<p>More information about API requests is available in the <a href="https://icinga.com/docs/icinga2/latest/" target="_blank">documentation</a>.</p></html>)"; response.body() = body; - response.set(http::field::content_length, response.body().size()); + HttpUtility::Set(response, http::field::content_length, response.body().size()); } return true; diff --git a/plugins/check_nscp_api.cpp b/plugins/check_nscp_api.cpp index 3f6843ec29..ad15e62527 100644 --- a/plugins/check_nscp_api.cpp +++ b/plugins/check_nscp_api.cpp @@ -16,6 +16,7 @@ #include "base/tcpsocket.hpp" /* include global icinga::Connect */ #include "base/tlsstream.hpp" #include "base/base64.hpp" +#include "remote/httputility.hpp" #include "remote/url.hpp" #include <remote/url-characters.hpp> #include <boost/program_options.hpp> @@ -365,11 +366,11 @@ static Dictionary::Ptr FetchData(const String& host, const String& port, const S http::request<http::string_body> request (http::verb::get, std::string(url->Format(true)), 10); - request.set(http::field::user_agent, "Icinga/check_nscp_api/" + String(VERSION)); - request.set(http::field::host, host + ":" + port); + HttpUtility::Set(request, http::field::user_agent, "Icinga/check_nscp_api/" + String(VERSION)); + HttpUtility::Set(request, http::field::host, host + ":" + port); - request.set(http::field::accept, "application/json"); - request.set("password", password); + HttpUtility::Set(request, http::field::accept, "application/json"); + HttpUtility::Set(request, "password", password); if (l_Debug) { std::cout << "Sending request to " << url->Format(false, false) << "'.\n"; ++++++ icinga2-boost-8185-8191.patch ++++++ >From 7e62a68eadada58e762d3f4261750796adffd440 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" <[email protected]> Date: Wed, 26 Aug 2020 13:48:39 +0200 Subject: [PATCH] Define BOOST_ASIO_USE_TS_EXECUTOR_AS_DEFAULT refs #8185 --- CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 046f23cf22..46e765415e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -172,6 +172,9 @@ add_definitions(-DBOOST_COROUTINES_NO_DEPRECATION_WARNING) add_definitions(-DBOOST_FILESYSTEM_NO_DEPRECATED) +# Required for Boost v1.74+ +add_definitions(-DBOOST_ASIO_USE_TS_EXECUTOR_AS_DEFAULT) + link_directories(${Boost_LIBRARY_DIRS}) include_directories(${Boost_INCLUDE_DIRS}) ++++++ v2.11.5.tar.gz -> v2.12.0.tar.gz ++++++ /work/SRC/openSUSE:Factory/icinga2/v2.11.5.tar.gz /work/SRC/openSUSE:Factory/.icinga2.new.4249/v2.12.0.tar.gz differ: char 12, line 1
