From a1141feae8deb8ad37fe67564fc3f0004e6ef4ae Mon Sep 17 00:00:00 2001
From: Britney Fransen <brfransen@gmail.com>
Date: Fri, 22 Dec 2023 10:50:20 -0500
Subject: zabbix: upgrade to 6.4.10

---
 linhes/zabbix/PKGBUILD                     |  54 +++++--
 linhes/zabbix/fix-build-with-libxml2.patch | 230 +++++++++++++++++++++++++++++
 linhes/zabbix/zabbix-web-service.service   |  11 ++
 linhes/zabbix/zabbix-web-service.sysusers  |   1 +
 linhes/zabbix/zabbix-web-service.tmpfiles  |   1 +
 5 files changed, 287 insertions(+), 10 deletions(-)
 create mode 100644 linhes/zabbix/fix-build-with-libxml2.patch
 create mode 100644 linhes/zabbix/zabbix-web-service.service
 create mode 100644 linhes/zabbix/zabbix-web-service.sysusers
 create mode 100644 linhes/zabbix/zabbix-web-service.tmpfiles

diff --git a/linhes/zabbix/PKGBUILD b/linhes/zabbix/PKGBUILD
index b242e5a..ef47499 100644
--- a/linhes/zabbix/PKGBUILD
+++ b/linhes/zabbix/PKGBUILD
@@ -1,21 +1,24 @@
 # Maintainer: Bartłomiej Piotrowski <bpiotrowski@archlinux.org>
 # Maintainer: Florian Pritz <bluewind@xinu.at>
+# Maintainer: Robin Candau <antiz@archlinux.org>
 
 pkgbase=zabbix
-pkgname=(zabbix-server zabbix-agent{,2} zabbix-proxy zabbix-frontend-php)
-pkgver=6.4.8
+pkgname=(zabbix-server zabbix-agent{,2} zabbix-proxy zabbix-frontend-php zabbix-web-service)
+pkgver=6.4.10
 pkgrel=1
 arch=(x86_64)
 url='https://www.zabbix.com/'
 license=(GPL)
-makedepends=(libxml2 unixodbc net-snmp mariadb-libs libldap libevent go pkgconfig pcre2)
+makedepends=(libxml2 unixodbc net-snmp mariadb-libs libldap libevent go pkgconfig pcre2 openipmi)
 source=("https://cdn.zabbix.com/zabbix/sources/stable/${pkgver%.*}/zabbix-${pkgver}.tar.gz"
         zabbix-agent.{service,sysusers,tmpfiles}
         zabbix-agent2.service
         zabbix-server-mysql.service zabbix-server.{sysusers,tmpfiles}
-        zabbix-proxy-mysql.service zabbix-proxy.{sysusers,tmpfiles})
+        zabbix-proxy-mysql.service zabbix-proxy.{sysusers,tmpfiles}
+        zabbix-web-service.{service,sysusers,tmpfiles}
+        fix-build-with-libxml2.patch)
 
-sha512sums=('712e9f3fdb772475137c7238e8ca26f510180c147b7aa74b29567033f62d4beb00275b96aaf05c978fec341b08c82102ecf1976a5e8af257e848ae3974a6fec9'
+sha512sums=('bd8460da2cca3b8a0b4e0adbf5a7a30e74c30667bd95f161ca6159798f788748f5de6a512a3b36f2b47d695daf3e810abcf68b3016af6fd06602075a76cb4ef6'
             '8c1fa2676bc0ef91bc39ec5f97b4d3ba5c365d063420455a3785121a54e120bc5afeacde42a48f4509c115f940dcc3b6c2f43044a7fbfb421182fc93b22a2444'
             '3ab3ac1acc7e35c8896157aef601ebc30815237ac5252cbd0c1ecb26eeaf9eccf5c49938ae8c85bb79a6f95f607f082f6b80ed660829599ec03aa626cca6d3dc'
             'ca6b4779de23829dfdd80ee21e924fbe4e2754f4e693bed4b1a2aa846cd87d150e399b1169d7fe58d30c50ed837c1b8254e580de420267d0a1834d6dc409c43d'
@@ -25,16 +28,24 @@ sha512sums=('712e9f3fdb772475137c7238e8ca26f510180c147b7aa74b29567033f62d4beb002
             'b6d548a26f845ef1a39724e3273aa521715272e20a0038144f86d377a26dfec6e3e129404cfda77632cad2f5cd6bab4a33f70a26c8c67b0d0b2abb3678ad2d83'
             '94701f34fe5df4859c6a4d0459c16062374e8f89f4f51c414e71c9c2db14f61e087721e68dddb3e8d88bf1c097477c1a21e27ba4705fd07d88c60adb41acc1be'
             '7c1072a8cd5837095f857b50124cb45d1bdbddbce108f6f067a35c3c9ebb1ad0502ef617dfa10f9c843631220177a6286a97b1c2a46539200be72fa83cb23b99'
-            '64042ddf511b56b2a5a311e34643f4e049c09d909ea65b7343a8a9637f33dc59f2b1342201290ca0774cbcbf616096b3696982047fb622b7d51afb5eceb298dd')
+            '64042ddf511b56b2a5a311e34643f4e049c09d909ea65b7343a8a9637f33dc59f2b1342201290ca0774cbcbf616096b3696982047fb622b7d51afb5eceb298dd'
+            '545bb284ac28386f8b9f33f0c5066bb73b3634fab8760861bc172fe83897f22e54ecaf186970f0ef178256c9ff152a3e806636145a77af78964f7af0fdcec1a1'
+            '2766787aaeef2f48909c52deb411b47971931a972282f701c401f8315264c8817fc1f9f49a2672152c78a0ebba7d72329c18b441e134c5ec3db5f12681b6e590'
+            '309f55c8c381364eca6d31c4709a0ebb7e04cefad9e51f44173d839a58e7f8e95e3c678922f9e1fe42cff90dba5144cc7ee3a6e1c236b079b501c0e08ad2152d'
+            '1e29dd44ac8b51b768352bdfbb4176f2ea82fa2a0887fd59ab2f114874745833a013874896850fce515e25ae56f39d16192b27f3044319725e8f77c6f64c00e5')
 
 prepare() {
   cd $pkgbase-$pkgver
   sed -i \
     -e '/^LogFile=.*/d' \
     -e 's/# LogType=file/LogType=system/' \
-    conf/zabbix_{agentd,proxy,server}.conf
+    conf/zabbix_{agentd,proxy,server}.conf src/go/conf/zabbix_web_service.conf
 
   autoreconf -fi
+
+ # Temporary patch to fix build against libxml2
+ # See https://support.zabbix.com/browse/ZBX-23738
+ patch -Np1 <${srcdir}/fix-build-with-libxml2.patch
 }
 
 build() {
@@ -58,6 +69,8 @@ build() {
     --with-libpcre2
     --with-ssh2
     --with-unixodbc
+    --with-openipmi
+    --enable-webservice
   )
 
   cd $pkgbase-$pkgver
@@ -86,7 +99,9 @@ build() {
 package_zabbix-server() {
   pkgdesc='Monitoring software for networks and applications'
   depends=(net-snmp curl libxml2 unixodbc libldap libevent pcre2)
-  optdepends=('mariadb-libs: for MariaDB support')
+  optdepends=('mariadb-libs: for MariaDB support'
+              'openipmi: for IPMI support'
+              'zabbix-web-service: for scheduled PDF report generation')
   backup=(etc/zabbix/zabbix_server.conf)
 
   cd $pkgbase-$pkgver
@@ -172,8 +187,9 @@ package_zabbix-agent2() {
 
 package_zabbix-proxy() {
   pkgdesc='Data collecting proxy for Zabbix'
-  depends=(net-snmp curl libxml2 sqlite unixodbc libldap pcre2 libevent)
-  optdepends=('mariadb-libs: for MariaDB support')
+  depends=(net-snmp curl libxml2 unixodbc libldap pcre2 libevent)
+  optdepends=('mariadb-libs: for MariaDB support'
+              'openipmi: for IPMI support')
   backup=(etc/zabbix/zabbix_proxy.conf)
 
   cd $pkgbase-$pkgver
@@ -211,3 +227,21 @@ package_zabbix-frontend-php() {
   cp -a ui/* "$pkgdir/usr/share/webapps/zabbix"
   chown 33:33 ${pkgdir}/usr/share/webapps/zabbix/conf/ # write access for http user
 }
+
+package_zabbix-web-service() {
+  pkgdesc='Zabbix web service used to generate and send scheduled reports'
+  depends=(chromium)
+  backup=(etc/zabbix/zabbix_web_service.conf)
+
+  cd $pkgbase-$pkgver
+  install -Dm755 src/go/bin/zabbix_web_service "$pkgdir/usr/bin/zabbix_web_service"
+  install -Dm644 src/go/conf/zabbix_web_service.conf "$pkgdir/etc/zabbix/zabbix_web_service.conf"
+  chown 173:173 "$pkgdir/etc/zabbix/zabbix_web_service.conf"
+
+  install -Dm644 "$srcdir/zabbix-web-service.service" \
+	"$pkgdir/usr/lib/systemd/system/zabbix-web-service.service"
+  install -Dm644 "$srcdir/zabbix-web-service.sysusers" \
+	"$pkgdir/usr/lib/sysusers.d/zabbix-web-service.conf"
+  install -Dm644 "$srcdir/zabbix-web-service.tmpfiles" \
+	"$pkgdir/usr/lib/tmpfiles.d/zabbix-web-service.conf"
+}
diff --git a/linhes/zabbix/fix-build-with-libxml2.patch b/linhes/zabbix/fix-build-with-libxml2.patch
new file mode 100644
index 0000000..c4716f0
--- /dev/null
+++ b/linhes/zabbix/fix-build-with-libxml2.patch
@@ -0,0 +1,230 @@
+diff --git a/ChangeLog.d/bugfix/ZBX-23738 b/ChangeLog.d/bugfix/ZBX-23738
+new file mode 100644
+index 0000000..f7c7dd5
+--- /dev/null
++++ b/ChangeLog.d/bugfix/ZBX-23738
+@@ -0,0 +1 @@
++.......PS. [ZBX-23738] fixed Zabbix backend sources for libxml2 2.12.0 version changes (akozlovs)
+diff --git a/m4/libxml2.m4 b/m4/libxml2.m4
+index b0a3c77..282d3b6 100644
+--- a/m4/libxml2.m4
++++ b/m4/libxml2.m4
+@@ -30,10 +30,13 @@ AS_HELP_STRING([--with-libxml2@<:@=ARG@:>@],
+         [
+         if test "$withval" = "no"; then
+             want_libxml2="no"
++            _libxml2_with="no"
+         elif test "$withval" = "yes"; then
+             want_libxml2="yes"
++            _libxml2_with="yes"
+         else
+             want_libxml2="yes"
++            _libxml2_with=$withval
+         fi
+         ],
+         [want_libxml2="no"]
+@@ -49,27 +52,43 @@ AS_HELP_STRING([--with-libxml2@<:@=ARG@:>@],
+     dnl
+ 
+     if test "$want_libxml2" = "yes"; then
+-        AC_REQUIRE([PKG_PROG_PKG_CONFIG])
+-        m4_ifdef([PKG_PROG_PKG_CONFIG], [PKG_PROG_PKG_CONFIG()], [:])
++        if test "$_libxml2_with" != "yes"; then
++            XML2_INCDIR=$_libxml2_with/include
++            XML2_LIBDIR=$_libxml2_with/lib
++            LIBXML2_CFLAGS="-I$XML2_INCDIR"
++            LIBXML2_LDFLAGS="-L$XML2_LIBDIR"
++            _full_libxml2_libs=$LIBXML2_LDFLAGS
++            configured_libxml2="yes"
++        else
++            AC_REQUIRE([PKG_PROG_PKG_CONFIG])
++            m4_ifdef([PKG_PROG_PKG_CONFIG], [PKG_PROG_PKG_CONFIG()], [:])
++
++            if test -x "$PKG_CONFIG"; then
+ 
+-        if test -x "$PKG_CONFIG"; then
++                LIBXML2_CFLAGS="`$PKG_CONFIG --cflags libxml-2.0`"
+ 
+-            LIBXML2_CFLAGS="`$PKG_CONFIG --cflags libxml-2.0`"
++                _full_libxml2_libs="`$PKG_CONFIG --libs libxml-2.0`"
++
++                for i in $_full_libxml2_libs; do
++                    case $i in
++                       -lxml2)
++                            ;;
++                       -L*)
++                            LIBXML2_LDFLAGS="${LIBXML2_LDFLAGS} $i"
++                            ;;
++                       -R*)
++                            LIBXML2_LDFLAGS="${LIBXML2_LDFLAGS} -Wl,$i"
++                            ;;
++                    esac
++                done
+ 
+-            _full_libxml2_libs="`$PKG_CONFIG --libs libxml-2.0`"
++                configured_libxml2="yes"
++            else
++                configured_libxml2="no"
++            fi
++        fi
+ 
+-            for i in $_full_libxml2_libs; do
+-                case $i in
+-                   -lxml2)
+-                        ;;
+-                   -L*)
+-                        LIBXML2_LDFLAGS="${LIBXML2_LDFLAGS} $i"
+-                        ;;
+-                   -R*)
+-                        LIBXML2_LDFLAGS="${LIBXML2_LDFLAGS} -Wl,$i"
+-                        ;;
+-                esac
+-            done
++        if test "$configured_libxml2" = "yes"; then
+ 
+             if test "x$enable_static" = "xyes"; then
+                 for i in $_full_libxml2_libs; do
+@@ -88,6 +107,20 @@ AS_HELP_STRING([--with-libxml2@<:@=ARG@:>@],
+                 done
+             fi
+ 
++            if test "$_libxml2_with" != "yes"; then
++                if test -f $_libxml2_with/include/libxml2/libxml/xmlversion.h; then
++                    LIBXML2_VERSION=`cat $_libxml2_with/include/libxml2/libxml/xmlversion.h \
++                                  | grep '#define.*LIBXML_DOTTED_VERSION.*' \
++                                  | sed -e 's/#define LIBXML_DOTTED_VERSION  *//' \
++                                  | sed -e 's/  *\/\*.*\*\///' \
++                                  | sed -e 's/\"//g'`
++                else
++                    AC_MSG_ERROR([Not found libxml2 library])
++                fi
++            else
++                LIBXML2_VERSION=`$PKG_CONFIG --version libxml-2.0`
++            fi
++
+             _save_libxml2_libs="${LIBS}"
+             _save_libxml2_ldflags="${LDFLAGS}"
+             _save_libxml2_cflags="${CFLAGS}"
+@@ -96,7 +129,7 @@ AS_HELP_STRING([--with-libxml2@<:@=ARG@:>@],
+             CFLAGS="${CFLAGS} ${LIBXML2_CFLAGS}"
+ 
+             AC_CHECK_LIB(xml2, xmlReadMemory, [
+-                    LIBXML2_LIBS="-lxml2 ${LIBXML2_LIBS}"
++                    LIBXML2_LIBS="${LIBXML2_LIBS} -lxml2"
+                     ],[
+                     AC_MSG_ERROR([Not found libxml2 library])
+                     ])
+@@ -108,8 +141,6 @@ AS_HELP_STRING([--with-libxml2@<:@=ARG@:>@],
+             unset _save_libxml2_ldflags
+             unset _save_libxml2_cflags
+ 
+-            LIBXML2_VERSION=`$PKG_CONFIG --version libxml-2.0`
+-
+             AC_DEFINE([HAVE_LIBXML2], [1], [Define to 1 if libxml2 libraries are available])
+ 
+             found_libxml2="yes"
+diff --git a/src/libs/zbxpreproc/item_preproc.c b/src/libs/zbxpreproc/item_preproc.c
+index 88f94c6..8921b2d 100644
+--- a/src/libs/zbxpreproc/item_preproc.c
++++ b/src/libs/zbxpreproc/item_preproc.c
+@@ -27,6 +27,7 @@
+ #include "zbxxml.h"
+ #ifdef HAVE_LIBXML2
+ #	include <libxml/xpath.h>
++#	include <libxml/parser.h>
+ #endif
+ 
+ #include "zbxnum.h"
+@@ -896,7 +897,7 @@ int	item_preproc_get_error_from_xml(const zbx_variant_t *value, const char *para
+ 	xmlDoc			*doc = NULL;
+ 	xmlXPathContext		*xpathCtx = NULL;
+ 	xmlXPathObject		*xpathObj = NULL;
+-	xmlErrorPtr		pErr;
++	const xmlError		*pErr;
+ 	xmlBufferPtr		xmlBufferLocal;
+ 
+ 	zbx_variant_copy(&value_str, value);
+diff --git a/src/libs/zbxpreproc/pp_manager.c b/src/libs/zbxpreproc/pp_manager.c
+index 9959a9f..a39f95d 100644
+--- a/src/libs/zbxpreproc/pp_manager.c
++++ b/src/libs/zbxpreproc/pp_manager.c
+@@ -34,6 +34,7 @@
+ 
+ #ifdef HAVE_LIBXML2
+ #	include <libxml/xpath.h>
++#	include <libxml/parser.h>
+ #endif
+ 
+ #define PP_STARTUP_TIMEOUT	10
+diff --git a/src/libs/zbxxml/xml.c b/src/libs/zbxxml/xml.c
+index 00eadce..7763be8 100644
+--- a/src/libs/zbxxml/xml.c
++++ b/src/libs/zbxxml/xml.c
+@@ -27,6 +27,7 @@
+ 
+ #ifdef HAVE_LIBXML2
+ #	include <libxml/xpath.h>
++#	include <libxml/parser.h>
+ #endif
+ 
+ typedef struct _zbx_xml_node_t zbx_xml_node_t;
+@@ -282,7 +283,7 @@ int	zbx_query_xpath(zbx_variant_t *value, const char *params, char **errmsg)
+ 	xmlXPathContext	*xpathCtx;
+ 	xmlXPathObject	*xpathObj;
+ 	xmlNodeSetPtr	nodeset;
+-	xmlErrorPtr	pErr;
++	const xmlError	*pErr;
+ 	xmlBufferPtr	xmlBufferLocal;
+ 
+ 	if (NULL == (doc = xmlReadMemory(value->data.str, strlen(value->data.str), "noname.xml", NULL, 0)))
+@@ -638,7 +639,7 @@ static void	vector_to_json(zbx_vector_xml_node_ptr_t *nodes, struct zbx_json *js
+  ******************************************************************************/
+ int	zbx_open_xml(char *data, int options, int maxerrlen, void **xml_doc, void **root_node, char **errmsg)
+ {
+-	xmlErrorPtr	pErr;
++	const xmlError	*pErr;
+ 
+ 	if (NULL == (*xml_doc = xmlReadMemory(data, strlen(data), "noname.xml", NULL, options)))
+ 	{
+@@ -694,7 +695,7 @@ int	zbx_open_xml(char *data, int options, int maxerrlen, void **xml_doc, void **
+  ******************************************************************************/
+ int	zbx_check_xml_memory(char *mem, int maxerrlen, char **errmsg)
+ {
+-	xmlErrorPtr	pErr;
++	const xmlError	*pErr;
+ 
+ 	if (NULL == mem)
+ 	{
+@@ -949,7 +950,7 @@ int	zbx_json_to_xml(char *json_data, char **xstr, char **errmsg)
+ 	int			size, ret = FAIL;
+ 	struct zbx_json_parse	jp;
+ 	xmlDoc			*doc = NULL;
+-	xmlErrorPtr		pErr;
++	const xmlError		*pErr;
+ 	xmlChar			*xmem;
+ 
+ 	if (NULL == (doc = xmlNewDoc(BAD_CAST XML_DEFAULT_VERSION)))
+@@ -1005,7 +1006,11 @@ zbx_libxml_error_t;
+  *             err       - [IN] the libxml2 error message                     *
+  *                                                                            *
+  ******************************************************************************/
++#if 21200 > LIBXML_VERSION /* version 2.12.0 */
+ static void	libxml_handle_error_xpath_check(void *user_data, xmlErrorPtr err)
++#else
++static void	libxml_handle_error_xpath_check(void *user_data, const xmlError *err)
++#endif
+ {
+ 	zbx_libxml_error_t	*err_ctx;
+ 
+@@ -1155,7 +1160,11 @@ out:
+  *             err       - [IN] the libxml2 error message                     *
+  *                                                                            *
+  ******************************************************************************/
++#if 21200 > LIBXML_VERSION /* version 2.12.0 */
+ static void	libxml_handle_error_try_read_value(void *user_data, xmlErrorPtr err)
++#else
++static void	libxml_handle_error_try_read_value(void *user_data, const xmlError *err)
++#endif
+ {
+ 	ZBX_UNUSED(user_data);
+ 	ZBX_UNUSED(err);
diff --git a/linhes/zabbix/zabbix-web-service.service b/linhes/zabbix/zabbix-web-service.service
new file mode 100644
index 0000000..fd3c324
--- /dev/null
+++ b/linhes/zabbix/zabbix-web-service.service
@@ -0,0 +1,11 @@
+[Unit]
+Description=Zabbix Web Service
+After=network.target
+
+[Service]
+Type=simple
+ExecStart=/usr/bin/zabbix_web_service -f
+User=zabbix-web-service
+
+[Install]
+WantedBy=multi-user.target
diff --git a/linhes/zabbix/zabbix-web-service.sysusers b/linhes/zabbix/zabbix-web-service.sysusers
new file mode 100644
index 0000000..5c42710
--- /dev/null
+++ b/linhes/zabbix/zabbix-web-service.sysusers
@@ -0,0 +1 @@
+u zabbix-web-service 173 - /var/lib/zabbix-web-service
diff --git a/linhes/zabbix/zabbix-web-service.tmpfiles b/linhes/zabbix/zabbix-web-service.tmpfiles
new file mode 100644
index 0000000..45d6a63
--- /dev/null
+++ b/linhes/zabbix/zabbix-web-service.tmpfiles
@@ -0,0 +1 @@
+d /var/lib/zabbix-web-service 0750 zabbix-web-service zabbix-web-service -
-- 
cgit v0.12

