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


Reply via email to