diff --git a/.gitignore b/.gitignore index 889aa44..f4b9338 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -SOURCES/pcp-6.3.2.src.tar.gz +SOURCES/pcp-6.3.7.src.tar.gz diff --git a/.pcp.metadata b/.pcp.metadata index 42510bb..5700554 100644 --- a/.pcp.metadata +++ b/.pcp.metadata @@ -1 +1 @@ -90248a6ea840586b2ffa04f89aadea2fa7a3860e SOURCES/pcp-6.3.2.src.tar.gz +cd24aa253a1fb7e34b5ce40fc305ef19704f7eca SOURCES/pcp-6.3.7.src.tar.gz diff --git a/SOURCES/fix-pmdabpf-noarch-man-page-build-failure.patch b/SOURCES/fix-pmdabpf-noarch-man-page-build-failure.patch new file mode 100644 index 0000000..87dde64 --- /dev/null +++ b/SOURCES/fix-pmdabpf-noarch-man-page-build-failure.patch @@ -0,0 +1,93 @@ +diff -Naurp pcp-6.3.7.orig/src/pmdas/bpf/GNUmakefile pcp-6.3.7/src/pmdas/bpf/GNUmakefile +--- pcp-6.3.7.orig/src/pmdas/bpf/GNUmakefile 2025-03-27 17:01:59.000000000 +1100 ++++ pcp-6.3.7/src/pmdas/bpf/GNUmakefile 2025-03-31 14:48:17.152726333 +1100 +@@ -1,7 +1,6 @@ + TOPDIR = ../../.. + include $(TOPDIR)/src/include/builddefs + +-ifeq "$(PMDA_BPF)" "true" + CFILES = bpf.c + CMDTARGET = pmdabpf$(EXECSUFFIX) + LIBTARGET = pmda_bpf.$(DSOSUFFIX) +@@ -27,12 +26,15 @@ MAN_DEST = $(PCP_MAN_DIR)/man$(MAN_SECTI + + LDIRT = domain.h *.o $(IAM).log pmda$(IAM) pmda_$(IAM).$(DSOSUFFIX) + +-default_pcp default: $(CMDTARGET) $(LIBTARGET) $(SUBDIRS) +- $(SUBDIRS_MAKERULE) ++default: build-me + + include $(BUILDRULES) + +-install_pcp install: default $(SUBDIRS) ++ifeq "$(PMDA_BPF)" "true" ++build-me: $(CMDTARGET) $(LIBTARGET) $(SUBDIRS) ++ $(SUBDIRS_MAKERULE) ++ ++install: default $(SUBDIRS) + $(INSTALL) -m 755 -d $(PMDAADMDIR) + $(INSTALL) -m 755 -d $(PMDATMPDIR) + $(INSTALL) -m 755 -t $(PMDATMPDIR) Install Remove $(CMDTARGET) $(LIBTARGET) $(SCRIPTS) $(PMDAADMDIR) +@@ -43,6 +45,15 @@ install_pcp install: default $(SUBDIRS) + $(INSTALL) -m 644 -t $(PMDATMPDIR)/$(CONFIG) $(CONFIG) $(PMDACONFIG)/$(CONFIG) + @$(INSTALL_MAN) + $(SUBDIRS_MAKERULE) ++else ++build-me: ++install: ++ @$(INSTALL_MAN) ++endif ++ ++default_pcp : default ++ ++install_pcp : install + + $(OBJECTS): domain.h + +@@ -51,12 +62,6 @@ domain.h: ../../pmns/stdpmid + + pmns: + $(LN_S) -f root_bpf pmns +-else +-default_pcp default: +- +-install_pcp install: +- @$(INSTALL_MAN) +-endif + + check:: $(MAN_PAGES) + $(MANLINT) $^ +@@ -64,5 +69,6 @@ check:: $(MAN_PAGES) + clean:: + $(MAKE) -C modules/ clean + rm -f $(LDIRT) ++ + debug: + @echo PMDA_BPF=$(PMDA_BPF) +diff -Naurp pcp-6.3.7.orig/src/pmdas/bpf/modules/GNUmakefile pcp-6.3.7/src/pmdas/bpf/modules/GNUmakefile +--- pcp-6.3.7.orig/src/pmdas/bpf/modules/GNUmakefile 2024-03-14 09:37:59.000000000 +1100 ++++ pcp-6.3.7/src/pmdas/bpf/modules/GNUmakefile 2025-03-31 14:48:17.157726345 +1100 +@@ -70,15 +70,21 @@ APPS_BPF = \ + APPS_BPF_2 = \ + netatop.bpf.c + +-default_pcp default: $(PMDABPF_MODULES) ++default: build-me + + include $(BUILDRULES) + ++ifeq "$(PMDA_BPF)" "true" ++build-me: $(PMDABPF_MODULES) ++ + install_pcp install: default + $(INSTALL) -m 755 -d $(MODULEDIR) + $(INSTALL) -m 755 -d $(MODULETMP) + $(INSTALL) -m 644 -t $(MODULETMP) $(PMDABPF_MODULES) $(MODULEDIR) +- ++else ++build-me: ++install: ++endif + + # Use the clang pipeline to emit LLVM to LLD and emit BPF straight to an ELF .o. + # The GCC pipeline has parts of this but not completely, and in any case, likely diff --git a/SOURCES/pcp-xsos-fixes.patch b/SOURCES/pcp-xsos-fixes.patch deleted file mode 100644 index cbe1038..0000000 --- a/SOURCES/pcp-xsos-fixes.patch +++ /dev/null @@ -1,269 +0,0 @@ -commit d2852e19e77e25d628399d51fcf199233547f8c4 -Author: Nathan Scott -Date: Wed Nov 13 17:17:28 2024 +1100 - - libpcp, pcp-xsos: finer grained string output control in pmPrintValue - - Implement a mechanism in pmPrintValue for producing single-line value - output, giving shell scripts a chance to operate sensibly with whacky - command lines. - - Resolves Red Hat bugs RHEL-67164 and RHEL-67148. - -diff --git a/man/man3/pmprintvalue.3 b/man/man3/pmprintvalue.3 -index 067b2aee2b..656c05849d 100644 ---- a/man/man3/pmprintvalue.3 -+++ b/man/man3/pmprintvalue.3 -@@ -80,6 +80,15 @@ and - pairs for each requested metric), based upon the - metrics type as returned from - .BR pmLookupDesc (3). -+.SH ENVIRONMENT -+Output of string metric values can be further controlled using -+.BR PCP_SQUASH_NEWLINES . -+When set in the environment of the calling process, and the -+.I type -+is set to PM_TYPE_STRING or PM_TYPE_AGGREGATE, then the output -+value is guaranteed to be free of embedded newline characters. -+If the given value contained such characters, they will have been -+replaced by a space before being printed. - .SH SEE ALSO - .BR PMAPI (3), - .BR pmAtomStr (3), -diff --git a/qa/1564 b/qa/1564 -index cbb976cfe4..714955223e 100755 ---- a/qa/1564 -+++ b/qa/1564 -@@ -117,5 +117,33 @@ pcp -a $archive xsos -x -n | _filter_net - echo === Archive pcp xsos -N - pcp -a $archive xsos -x -N | _filter_netstat - -+echo === Special case: eval command issues | tee -a $seq.full -+test -f /eperm && $sudo rm -f /eperm -+(./src/args \$\(touch /eperm\) )& -+argspid=$! -+$PCP_BINADM_DIR/pmsleep 0.25 # start args -+$sudo pcp xsos -x --ps >> $seq.full -+echo $? exit status -+test -f /eperm && echo file exists && $sudo rm -f /eperm -+$PCP_BINADM_DIR/pmsignal $argspid -+wait $argspid -+ -+echo === Special case: multiline ps issues | tee -a $seq.full -+(./src/args ' -+multi -+line -+args -+')& -+argspid=$! -+$PCP_BINADM_DIR/pmsleep 0.25 # start args -+pcp xsos -x --ps >> $seq.full -+echo $? exit status -+$PCP_BINADM_DIR/pmsignal $argspid -+wait $argspid -+ -+echo === Special case: command line errors | tee -a $seq.full -+pcp xsos unknown_arg >> $seq.full 2>&1 -+echo $? exit status -+ - # success, all done - exit -diff --git a/qa/1564.out b/qa/1564.out -index 57de00c30a..11321e342a 100644 ---- a/qa/1564.out -+++ b/qa/1564.out -@@ -111,3 +111,9 @@ NET STATS - Ip.InAddrErrors: XXX - Ip6.InAddrErrors: XXX - -+=== Special case: eval command issues -+0 exit status -+=== Special case: multiline ps issues -+0 exit status -+=== Special case: command line errors -+1 exit status -diff --git a/qa/src/.gitignore b/qa/src/.gitignore -index 7e9b0fe08a..3399d24a4e 100644 ---- a/qa/src/.gitignore -+++ b/qa/src/.gitignore -@@ -13,6 +13,7 @@ archend - archfetch - archinst - arch_maxfd -+args - atomstr - badUnitsStr_r - badloglabel -diff --git a/qa/src/GNUlocaldefs b/qa/src/GNUlocaldefs -index ae647278f2..ac0920d136 100644 ---- a/qa/src/GNUlocaldefs -+++ b/qa/src/GNUlocaldefs -@@ -48,7 +48,7 @@ CFILES = disk_test.c exercise.c context_test.c chkoptfetch.c \ - archctl_segfault.c debug.c int2pmid.c int2indom.c exectest.c \ - unpickargs.c hanoi.c progname.c countmark.c check_attribute.c \ - indom2int.c pmid2int.c scanmeta.c traverse_return_codes.c \ -- timeshift.c checkstructs.c bcc_profile.c sha1int2ext.c \ -+ timeshift.c checkstructs.c bcc_profile.c args.c sha1int2ext.c \ - getdomainname.c profilecrash.c store_and_fetch.c test_service_notify.c \ - ctx_derive.c pmstrn.c pmfstring.c pmfg-derived.c mmv_help.c sizeof.c \ - stampconv.c time_stamp.c archend.c scandata.c wait_for_values.c \ -diff --git a/qa/src/args.c b/qa/src/args.c -new file mode 100644 -index 0000000000..06d9b9b6cc ---- /dev/null -+++ b/qa/src/args.c -@@ -0,0 +1,18 @@ -+/* -+ * Copyright (c) 2024 Red Hat. -+ * -+ * QA helper that waits for stdin input then exits, useful for -+ * shell escape testing as it allows arbitrary args (ignored). -+ */ -+ -+#include -+#include -+#include -+ -+int -+main(int argc, char **argv) -+{ -+ while (1) -+ sleep(1); -+ exit(EXIT_SUCCESS); -+} -diff --git a/src/libpcp/src/check-statics b/src/libpcp/src/check-statics -index 29dcb868ad..b9f21edc32 100755 ---- a/src/libpcp/src/check-statics -+++ b/src/libpcp/src/check-statics -@@ -581,6 +581,8 @@ util.o - msgbuf # guarded by util_lock mutex - msgbuflen # guarded by util_lock mutex - msgsize # guarded by util_lock mutex -+ squashed # guarded by __pmLock_extcall mutex when set -+ # in a one-trip initialization - filename # guarded by __pmLock_extcall mutex when set - # in a one-trip initialization - ?base # no unsafe side-effects, see notes in util.c -diff --git a/src/libpcp/src/util.c b/src/libpcp/src/util.c -index d4f79ca40d..84a7df6329 100644 ---- a/src/libpcp/src/util.c -+++ b/src/libpcp/src/util.c -@@ -984,6 +984,18 @@ print_event_summary(FILE *f, const pmValue *val, int highres) - fputc(']', f); - } - -+static void -+squash_string(char *s, unsigned int len) -+{ -+ unsigned int i; -+ -+ /* replace end-of-line characters */ -+ for (i = 0; i < len; i++) { -+ if (isspace(s[i])) -+ s[i] = ' '; -+ } -+} -+ - /* Print single pmValue. */ - void - pmPrintValue(FILE *f, /* output stream */ -@@ -997,6 +1009,16 @@ pmPrintValue(FILE *f, /* output stream */ - int n; - char *p; - int sts; -+ static int squashed = -1; -+ -+ if (squashed == -1) { -+ /* one-trip initialization */ -+ PM_LOCK(__pmLock_extcall); -+ squashed = 0; -+ if (getenv("PCP_SQUASH_NEWLINES") != NULL) /* THREADSAFE */ -+ squashed = 1; -+ PM_UNLOCK(__pmLock_extcall); -+ } - - if (type != PM_TYPE_UNKNOWN && - type != PM_TYPE_EVENT && -@@ -1032,7 +1054,10 @@ pmPrintValue(FILE *f, /* output stream */ - break; - - case PM_TYPE_STRING: -- n = (int)strlen(a.cp) + 2; -+ n = (int)strlen(a.cp); -+ if (squashed) -+ squash_string(a.cp, n); -+ n += 2; - while (n < minwidth) { - fputc(' ', f); - n++; -@@ -1123,6 +1148,8 @@ pmPrintValue(FILE *f, /* output stream */ - n++; - } - n = (int)val->value.pval->vlen - PM_VAL_HDR_SIZE; -+ if (squashed) -+ squash_string(val->value.pval->vbuf, n); - fprintf(f, "\"%*.*s\"", n, n, val->value.pval->vbuf); - done = 1; - } - -commit a55c5de05836ca0e71b052a4579b34f8e6577c23 -Merge: 3bcaee943a b147af9c8e -Author: Nathan Scott -Date: Wed Nov 13 16:49:57 2024 +1100 - - Merge commit 'b147af9c8e71423be9bb62699534d3fea4d86b8a' into xsos - - -commit b147af9c8e71423be9bb62699534d3fea4d86b8a -Author: Nathan Scott -Date: Wed Nov 13 16:49:57 2024 +1100 - - Squashed 'vendor/github.com/performancecopilot/xsos-pcp/' changes from deb8740f2f..de2b314859 - - de2b314859 pcp-xsos: fine-tune error handling on bad command line options - 35f2cefa3a pcp-xsos: single-line pmPrintValue/pminfo values, escape shell chars - - git-subtree-dir: vendor/github.com/performancecopilot/xsos-pcp - git-subtree-split: de2b314859d01dec9387e06da39af6920018d219 - -diff --git a/pcp-xsos b/pcp-xsos -index e8c60f1e0c..388712752d 100755 ---- a/vendor/github.com/performancecopilot/xsos-pcp/pcp-xsos -+++ b/vendor/github.com/performancecopilot/xsos-pcp/pcp-xsos -@@ -112,7 +112,6 @@ _usage() - { - [ ! -z "$@" ] && echo $@ 1>&2 - pmgetopt --progname=$progname --usage --config=$tmp/usage -- sts=0 - exit - } - -@@ -206,9 +205,11 @@ do - color=false - ;; - -\?) -+ sts=0 - _usage "" - ;; - --) # end of options, start of arguments -+ sts=1 - _usage "Unknown argument: $2" - ;; - esac -@@ -304,6 +305,7 @@ fi - # kernel_all_load_value[15]=0.06 - # kernel_cpu_util_user_error="No value(s) available!" - -+export PCP_SQUASH_NEWLINES=1 - if ! pminfo $batch --fetch ${metrics[*]} > $tmp/metrics 2>$tmp/error - then - if grep "^pminfo:" $tmp/error > /dev/null 2>&1 -@@ -320,6 +322,8 @@ gawk < $tmp/metrics > $tmp/variables ' - function filter(string) { - gsub(/"/, "\\\"", string) # escape double quotes - gsub(/\\u/, "\\\\u", string) # escape backslash-u -+ # replace any characters with special shell meaning -+ gsub("/\\(|\\$|\\*|)|\\{|\\}\\?|`|;|!/", "-", string) - gsub(/%/, "%%", string) # percent sign in printf - gsub(/^\\"|\\"$/, "\"", string) # except on ends - return string diff --git a/SOURCES/pmapi-header-multilib-fix.patch b/SOURCES/pmapi-header-multilib-fix.patch new file mode 100644 index 0000000..b26db21 --- /dev/null +++ b/SOURCES/pmapi-header-multilib-fix.patch @@ -0,0 +1,202 @@ +diff -Naurp pcp-6.3.7.orig/configure pcp-6.3.7/configure +--- pcp-6.3.7.orig/configure 2025-03-31 12:41:26.000000000 +1100 ++++ pcp-6.3.7/configure 2025-06-26 19:38:57.864414825 +1000 +@@ -932,6 +932,7 @@ sed + SED + awk + AWK ++enable_multilib + enable_shared + cxx + ac_ct_CXX +@@ -1055,6 +1056,7 @@ enable_ssp + enable_pie + enable_visibility + enable_shared ++enable_multilib + with_perl_installdirs + with_perl_install_base + with_python_prefix +@@ -1748,7 +1750,8 @@ Optional Features: + --disable-ssp disable gcc stack-protector + --disable-pie disable position-independent-executable + --disable-visibility disable gcc symbol visibility +- --disable-shared disable core shared libary generation ++ --disable-shared disable core shared library generation ++ --enable-multilib enable multilib installations + + Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] +@@ -5696,6 +5699,21 @@ else case e in #( + esac + fi + ++ ++ ++# Check whether --enable-multilib was given. ++if test ${enable_multilib+y} ++then : ++ enableval=$enable_multilib; PACKAGE_CONFIGURE="$PACKAGE_CONFIGURE --enable-multilib=$withval" ++ ++printf "%s\n" "#define HAVE_MULTILIB 1" >>confdefs.h ++ ++ enable_multilib=true ++else case e in #( ++ e) enable_multilib=false ;; ++esac ++fi ++ + + + +diff -Naurp pcp-6.3.7.orig/configure.ac pcp-6.3.7/configure.ac +--- pcp-6.3.7.orig/configure.ac 2025-03-31 12:41:26.000000000 +1100 ++++ pcp-6.3.7/configure.ac 2025-06-26 19:38:57.867577540 +1000 +@@ -655,11 +655,20 @@ AC_LANG_POP([C++]) + + dnl Prevent shared libraries from being built for libpcp and other core libraries + AC_ARG_ENABLE([shared], +- [AS_HELP_STRING([--disable-shared], [disable core shared libary generation])], ++ [AS_HELP_STRING([--disable-shared], [disable core shared library generation])], + [PACKAGE_CONFIGURE="$PACKAGE_CONFIGURE --disable-shared=$withval"], + [enable_shared=false]) + AC_SUBST(enable_shared) + ++dnl Support installing both devel package variants on either 32/64 bit platform ++AC_ARG_ENABLE([multilib], ++ [AS_HELP_STRING([--enable-multilib], [enable multilib installations])], ++ [PACKAGE_CONFIGURE="$PACKAGE_CONFIGURE --enable-multilib=$withval" ++ AC_DEFINE(HAVE_MULTILIB, [1], [multilib defined]) ++ enable_multilib=true], ++ [enable_multilib=false]) ++AC_SUBST(enable_multilib) ++ + dnl check if user wants to use any of their own commands; + dnl ordering is important: some tests use earlier results + +diff -Naurp pcp-6.3.7.orig/src/include/builddefs.in pcp-6.3.7/src/include/builddefs.in +--- pcp-6.3.7.orig/src/include/builddefs.in 2025-03-27 17:01:59.000000000 +1100 ++++ pcp-6.3.7/src/include/builddefs.in 2025-06-26 19:38:57.869743878 +1000 +@@ -259,6 +259,7 @@ QT_VERSION = @qt_version@ + CLANG_MAJOR_VERSION = @CLANG_MAJOR_VERSION@ + + # configuration state affecting the entire build ++ENABLE_MULTILIB = @enable_multilib@ + ENABLE_SHARED = @enable_shared@ + ENABLE_SECURE = @enable_secure@ + ENABLE_PROBES = @enable_probes@ +diff -Naurp pcp-6.3.7.orig/src/include/pcp/config32.h pcp-6.3.7/src/include/pcp/config32.h +--- pcp-6.3.7.orig/src/include/pcp/config32.h 2024-07-30 16:43:55.000000000 +1000 ++++ pcp-6.3.7/src/include/pcp/config32.h 2025-06-26 19:38:57.871096964 +1000 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2014,2016 Red Hat. ++ * Copyright (c) 2014,2016,2025 Red Hat. + * Headers for "multilib" support (32-bit and 64-bit packages co-existing) + * + * This library is free software; you can redistribute it and/or modify it +@@ -19,5 +19,7 @@ + #define HAVE_32BIT_LONG 1 + #define HAVE_32BIT_PTR 1 + /* #undef HAVE_64BIT_PTR */ ++#define PM_PAD_RESULT 4 ++#define PM_PAD_TIMESPEC 4 + + #endif /* PCP_CONFIG32_H */ +diff -Naurp pcp-6.3.7.orig/src/include/pcp/config64.h pcp-6.3.7/src/include/pcp/config64.h +--- pcp-6.3.7.orig/src/include/pcp/config64.h 2024-07-30 16:43:55.000000000 +1000 ++++ pcp-6.3.7/src/include/pcp/config64.h 2025-06-26 19:38:57.871276548 +1000 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2014,2016 Red Hat. ++ * Copyright (c) 2014,2016,2025 Red Hat. + * Headers for "multilib" support (32-bit and 64-bit packages co-existing) + * + * This library is free software; you can redistribute it and/or modify it +@@ -19,5 +19,7 @@ + /* #undef HAVE_32BIT_LONG */ + /* #undef HAVE_32BIT_PTR */ + #define HAVE_64BIT_PTR 1 ++/* #undef PM_PAD_RESULT */ ++/* #undef PM_PAD_TIMESPEC */ + + #endif /* PCP_CONFIG64_H */ +diff -Naurp pcp-6.3.7.orig/src/include/pcp/config.h.in pcp-6.3.7/src/include/pcp/config.h.in +--- pcp-6.3.7.orig/src/include/pcp/config.h.in 2025-03-14 14:41:06.000000000 +1100 ++++ pcp-6.3.7/src/include/pcp/config.h.in 2025-06-26 19:38:57.871702924 +1000 +@@ -792,6 +792,9 @@ + #undef HAVE__ETEXT + #undef HAVE_ETEXT + ++/* multilib headers */ ++#undef HAVE_MULTILIB ++ + /* sizeof suseconds_t ... only ever going to exist on linux-like systems */ + #undef PM_SIZEOF_SUSECONDS_T + +@@ -801,9 +804,3 @@ + #ifndef PM_SIZEOF_TIME_T + #error Unknown time_t size + #endif +- +-/* __pmResult padding */ +-#undef PM_PAD_RESULT +- +-/* timespec padding */ +-#undef PM_PAD_TIMESPEC +diff -Naurp pcp-6.3.7.orig/src/include/pcp/configsz.h.in pcp-6.3.7/src/include/pcp/configsz.h.in +--- pcp-6.3.7.orig/src/include/pcp/configsz.h.in 2024-07-30 16:43:55.000000000 +1000 ++++ pcp-6.3.7/src/include/pcp/configsz.h.in 2025-06-26 19:38:57.872742426 +1000 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2014-2017 Red Hat. ++ * Copyright (c) 2014-2017,2025 Red Hat. + * + * This library is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published +@@ -26,4 +26,10 @@ + /* pointer size */ + #undef HAVE_64BIT_PTR + ++/* __pmResult padding */ ++#undef PM_PAD_RESULT ++ ++/* timespec padding */ ++#undef PM_PAD_TIMESPEC ++ + #endif /* PCP_CONFIGSZ_H */ +diff -Naurp pcp-6.3.7.orig/src/include/pcp/GNUmakefile pcp-6.3.7/src/include/pcp/GNUmakefile +--- pcp-6.3.7.orig/src/include/pcp/GNUmakefile 2024-07-30 16:43:55.000000000 +1000 ++++ pcp-6.3.7/src/include/pcp/GNUmakefile 2025-06-26 19:38:57.873157593 +1000 +@@ -22,11 +22,16 @@ SDSH_HFILES = sds.h sdsalloc.h + EXTERNAL_HFILES = dict.h + HFILES = pmapi.h impl.h pmda.h pmtime.h pmdaroot.h pmafm.h \ + trace.h trace_dev.h mmv_stats.h mmv_dev.h import.h \ +- config32.h config64.h platform32.h platform64.h \ + pmjson.h pmhttp.h pmdbg.h pmwebapi.h deprecated.h \ + ini.h sds.h dict.h archive.h +-INFILES = config.h.in configsz.h.in platform_defs.h.in platformsz.h.in +-CONFFILES = config.h configsz.h platform_defs.h platformsz.h ++INFILES = config.h.in platform_defs.h.in ++CONFFILES = config.h platform_defs.h ++ifeq "$(ENABLE_MULTILIB)" "true" ++HFILES += config32.h config64.h platform32.h platform64.h ++else ++INFILES += configsz.h.in platformsz.h.in ++CONFFILES += configsz.h platformsz.h ++endif + GENERATED_HFILES = $(CONFFILES) + NOSHIP_HFILES = libpcp.h sdsalloc.h + +diff -Naurp pcp-6.3.7.orig/src/include/pcp/platform_defs.h.in pcp-6.3.7/src/include/pcp/platform_defs.h.in +--- pcp-6.3.7.orig/src/include/pcp/platform_defs.h.in 2025-03-31 12:41:26.000000000 +1100 ++++ pcp-6.3.7/src/include/pcp/platform_defs.h.in 2025-06-26 19:38:57.873423552 +1000 +@@ -36,7 +36,7 @@ extern "C" { + #define FMT_PID "@fmt_pid@" + #define FMT_PTHREAD "@fmt_pthread@" + +-#ifdef HAVE_BITS_WORDSIZE_H ++#if defined(HAVE_MULTILIB) && defined(HAVE_BITS_WORDSIZE_H) + #include + #if __WORDSIZE == 32 + #include "config32.h" diff --git a/SOURCES/pmda-openmetrics-rollup.patch b/SOURCES/pmda-openmetrics-rollup.patch new file mode 100644 index 0000000..e63f800 --- /dev/null +++ b/SOURCES/pmda-openmetrics-rollup.patch @@ -0,0 +1,465 @@ +diff -Naurp pcp-6.3.7.orig/qa/1976 pcp-6.3.7/qa/1976 +--- pcp-6.3.7.orig/qa/1976 1970-01-01 10:00:00.000000000 +1000 ++++ pcp-6.3.7/qa/1976 2025-06-26 18:02:39.313416612 +1000 +@@ -0,0 +1,85 @@ ++#!/bin/sh ++# PCP QA Test No. 1976 ++# Test pmdaopenmetrics metric removal ++# ++# Copyright (c) 2017, 2025 Red Hat. All Rights Reserved. ++# ++seq=`basename $0` ++echo "QA output created by $seq" ++ ++# get standard environment, filters and checks ++. ./common.openmetrics ++ ++_pmdaopenmetrics_check || _notrun "openmetrics pmda not installed" ++ ++status=1 # failure is the default! ++ ++_cleanup() ++{ ++ cd $here ++ _pmdaopenmetrics_cleanup ++ $sudo rm -rf $tmp $tmp.* ++} ++ ++_prepare_pmda openmetrics ++trap "_cleanup; exit \$status" 0 1 2 3 15 ++_stop_auto_restart pmcd ++ ++_pmdaopenmetrics_save_config ++ ++# add all the sample text files as urls. ++# need to be a place the user $PCP_USER (pmcd) can read ++# ++( cd $here/openmetrics/samples; ls -1 *.txt ) | sort | while read file ++do ++ cp $here/openmetrics/samples/$file $tmp.$file ++ urlbase=`basename "$file" .txt | tr .- _` ++ echo 'file://'$tmp.$file >$tmp.tmp ++ $sudo cp $tmp.tmp $PCP_PMDAS_DIR/openmetrics/config.d/$urlbase.url ++done ++ls -l $PCP_PMDAS_DIR/openmetrics/config.d >>$seq_full ++ ++# add all the sample scripts ++cp -a $here/openmetrics/scripts/* $PCP_PMDAS_DIR/openmetrics/config.d ++find $PCP_PMDAS_DIR/openmetrics/config.d -name GNU\* -exec rm -f {} ";" ++ ++_pmdaopenmetrics_install ++ ++if ! _pmdaopenmetrics_wait_for_metric openmetrics.thermostat ++then ++ status=1 ++ exit ++fi ++ ++echo "-- metric removal of new source/metric --" ++$sudo rm $PCP_PMDAS_DIR/openmetrics/config.d/simple_metric.url ++pminfo openmetrics.simple_metric ++echo ++ ++echo "-- source re-addition --" ++# same access controls logic as above, user $PCP_USER needs to be ++# able to read the file at the end of the URL ++# ++cp $here/openmetrics/samples/simple_metric.txt $tmp.simple_metric.txt ++echo 'file:///'$tmp.simple_metric.txt >$PCP_PMDAS_DIR/openmetrics/config.d/simple_metric.url ++pminfo openmetrics.simple_metric ++echo ++ ++echo "-- metric removal of recognized source/metric --" ++$sudo rm $PCP_PMDAS_DIR/openmetrics/config.d/simple_metric.url ++pminfo openmetrics.simple_metric ++echo ++ ++echo "-- source re-addition with epoch timestamp --" ++txtpath=$here/openmetrics/samples/simple_metric.txt ++urlfile=$PCP_PMDAS_DIR/openmetrics/config.d/simple_metric.url ++echo 'file:///'$txtpath > $urlfile ++$sudo touch -t 197001010000 $urlfile ++pminfo openmetrics.simple_metric ++echo ++ ++_pmdaopenmetrics_remove >/dev/null 2>&1 ++ ++# success, all done ++status=0 ++exit +diff -Naurp pcp-6.3.7.orig/qa/1976.out pcp-6.3.7/qa/1976.out +--- pcp-6.3.7.orig/qa/1976.out 1970-01-01 10:00:00.000000000 +1000 ++++ pcp-6.3.7/qa/1976.out 2025-06-26 18:02:01.879861640 +1000 +@@ -0,0 +1,17 @@ ++QA output created by 1976 ++ ++=== openmetrics agent installation === ++-- metric removal of new source/metric -- ++Error: openmetrics.simple_metric: Unknown metric name ++ ++-- source re-addition -- ++openmetrics.simple_metric.metric2 ++openmetrics.simple_metric.metric1 ++ ++-- metric removal of recognized source/metric -- ++Error: openmetrics.simple_metric: Unknown metric name ++ ++-- source re-addition with epoch timestamp -- ++openmetrics.simple_metric.metric2 ++openmetrics.simple_metric.metric1 ++ +diff -Naurp pcp-6.3.7.orig/qa/group pcp-6.3.7/qa/group +--- pcp-6.3.7.orig/qa/group 2025-06-26 17:55:37.790462638 +1000 ++++ pcp-6.3.7/qa/group 2025-06-26 17:58:18.996389423 +1000 +@@ -2205,6 +2205,7 @@ pmcd.pdu + 1963 pmda.linux local + 1970 pmda.bpf local + 1973 pcp zoneinfo python local ++1976 pmdaopenmetrics python local + 1978 atop local pmlogrewrite + 1984 pmlogconf pmda.redis local + 1985 pmfind local valgrind +diff -Naurp pcp-6.3.7.orig/qa/openmetrics/scripts/curl/script.sh pcp-6.3.7/qa/openmetrics/scripts/curl/script.sh +--- pcp-6.3.7.orig/qa/openmetrics/scripts/curl/script.sh 2023-11-16 17:51:39.000000000 +1100 ++++ pcp-6.3.7/qa/openmetrics/scripts/curl/script.sh 2025-06-26 18:02:50.155355973 +1000 +@@ -1,4 +1,4 @@ + #! /bin/sh + + . /etc/pcp.conf +-curl -Gq file://$PCP_PMDAS_DIR/openmetrics/config.d/some_metric.txt ++curl -Gqs file://$PCP_PMDAS_DIR/openmetrics/config.d/some_metric.txt +diff -Naurp pcp-6.3.7.orig/qa/openmetrics/scripts/curl_filtered.sh pcp-6.3.7/qa/openmetrics/scripts/curl_filtered.sh +--- pcp-6.3.7.orig/qa/openmetrics/scripts/curl_filtered.sh 2023-11-16 17:51:39.000000000 +1100 ++++ pcp-6.3.7/qa/openmetrics/scripts/curl_filtered.sh 2025-06-26 18:02:50.155694515 +1000 +@@ -7,6 +7,6 @@ + + . /etc/pcp.conf + +-( curl -Gq file://$PCP_PMDAS_DIR/openmetrics/config.d/some_metric.txt ; \ +-curl -Gq file://$PCP_PMDAS_DIR/openmetrics/config.d/some_other_metric.txt) \ ++( curl -Gqs file://$PCP_PMDAS_DIR/openmetrics/config.d/some_metric.txt ; \ ++curl -Gqs file://$PCP_PMDAS_DIR/openmetrics/config.d/some_other_metric.txt) \ + | sed -e '/metric2/d' +diff -Naurp pcp-6.3.7.orig/qa/openmetrics/scripts/curl_hostname_label.sh pcp-6.3.7/qa/openmetrics/scripts/curl_hostname_label.sh +--- pcp-6.3.7.orig/qa/openmetrics/scripts/curl_hostname_label.sh 2023-11-16 17:51:39.000000000 +1100 ++++ pcp-6.3.7/qa/openmetrics/scripts/curl_hostname_label.sh 2025-06-26 18:02:50.155942641 +1000 +@@ -12,5 +12,5 @@ + + # here for QA purposes we're fetching from a local file + # and just pretending it came from a remote host. +-curl -q -G file://$PCP_PMDAS_DIR/openmetrics/config.d/some_metric.txt 2>/dev/null | \ ++curl -Gqs file://$PCP_PMDAS_DIR/openmetrics/config.d/some_metric.txt 2>/dev/null | \ + sed -e 's/[a-z0-9]*=/hostname="remotehost",&/' +diff -Naurp pcp-6.3.7.orig/qa/openmetrics/scripts/curl_scripted.sh pcp-6.3.7/qa/openmetrics/scripts/curl_scripted.sh +--- pcp-6.3.7.orig/qa/openmetrics/scripts/curl_scripted.sh 2023-11-16 17:51:39.000000000 +1100 ++++ pcp-6.3.7/qa/openmetrics/scripts/curl_scripted.sh 2025-06-26 18:02:50.156229975 +1000 +@@ -1,5 +1,5 @@ + #! /bin/sh + + . /etc/pcp.conf +-curl -Gq file://$PCP_PMDAS_DIR/openmetrics/config.d/some_metric.txt +-curl -Gq file://$PCP_PMDAS_DIR/openmetrics/config.d/some_other_metric.txt ++curl -Gqs file://$PCP_PMDAS_DIR/openmetrics/config.d/some_metric.txt ++curl -Gqs file://$PCP_PMDAS_DIR/openmetrics/config.d/some_other_metric.txt +diff -Naurp pcp-6.3.7.orig/src/pmdas/openmetrics/pmdaopenmetrics.python pcp-6.3.7/src/pmdas/openmetrics/pmdaopenmetrics.python +--- pcp-6.3.7.orig/src/pmdas/openmetrics/pmdaopenmetrics.python 2025-06-26 17:55:37.790973098 +1000 ++++ pcp-6.3.7/src/pmdas/openmetrics/pmdaopenmetrics.python 2025-06-26 18:02:26.571388227 +1000 +@@ -32,7 +32,8 @@ import subprocess + import sys + from ctypes import c_int + from socket import gethostname +-from stat import ST_MODE, S_IXUSR, ST_CTIME ++from urllib.parse import urlparse ++from stat import ST_MODE, S_IXUSR + import requests + + from pcp.pmapi import pmUnits, pmContext +@@ -127,15 +128,9 @@ class Metric(object): + (name, pmContext.pmIDStr(self.pmid), self.mtype, self.msem, self.singular, self.mindom, self.labels)) + + self.obj = pmdaMetric(self.pmid, self.mtype, self.mindom, self.msem, self.munits) ++ self.source.pmda.all_metrics[self.mname] = self.obj + +- if helpline: # it could be None! +- unescaped = helpline.replace('\\\\', '\\').replace('\\n', '\n') +- split = unescaped.split('\n') +- help_oneline = split[0] # must have at least one entry +- help_text = '\n'.join(split[1:]) # may have other entries +- else: +- help_oneline = '' +- help_text = '' ++ help_text, help_oneline = self.source.helptext(helpline) + + try: + self.source.pmda.add_metric(self.mname, self.obj, help_oneline, help_text) +@@ -565,7 +560,7 @@ class Source(object): + self.path = path # pathname to .url or executable file + self.url = None + self.parse_error = False +- self.parse_url_time = 0 # timestamp of config file when it was last parsed ++ self.parse_time = None # last time config file was parsed + self.is_scripted = is_scripted + self.pmda = thispmda # the shared pmda + self.requests = None +@@ -588,6 +583,16 @@ class Source(object): + self.metrics_by_name = {} # name -> Metric + self.metrics_by_num = {} # number (last component of pmid) -> Metric + ++ def helptext(self, helpline): ++ if helpline: # it could be None! ++ unescaped = helpline.replace('\\\\', '\\').replace('\\n', '\n') ++ split = unescaped.split('\n') ++ help_oneline = split[0] # must have at least one entry ++ help_text = '\n'.join(split[1:]) # may have other entries ++ else: ++ help_oneline = '' ++ help_text = '' ++ return help_text, help_oneline + + def old_enough_for_refresh(self): + '''But what is "old"? If it is empty (no metrics), then it +@@ -685,6 +690,23 @@ class Source(object): + self.pmda.debug("included_labels '%s'" % (included_labels)) if self.pmda.dbg else None + self.pmda.debug("optional_labels '%s'" % (optional_labels)) if self.pmda.dbg else None + if sp.name in self.metrics_by_name: ++ if ("openmetrics.%s.%s" % (self.name, sp.name)) not in self.pmda.all_metrics and self.name in self.pmda.re_add_list: ++ # re-add metric to namespace ++ if pcpline: ++ split = pcpline.split(" ") ++ fullname = "openmetrics.%s.%s" % (self.name, split[1]) ++ else: ++ fullname = "openmetrics.%s.%s" % (self.name, sp.name.replace(":", ".")) ++ help_oneline, help_text = self.helptext(helpline) ++ try: ++ obj = self.pmda.removed_metrics[fullname] ++ self.pmda.add_metric(fullname, obj, help_oneline, help_text) ++ self.pmda.debug("re-adding metric: %s to namespace" % fullname) if self.pmda.dbg else None ++ self.pmda.all_metrics[fullname] = obj ++ del self.pmda.removed_metrics[fullname] ++ self.pmda.set_need_refresh() ++ except Exception as e: ++ self.pmda.debug("Can't re-add metric: %s, see error: %s" % (fullname, e)) if self.pmda.dbg else None + m = self.metrics_by_name[sp.name] + assert self.metrics_by_num[m.metricnum] == m + if m.singular: +@@ -693,6 +715,7 @@ class Source(object): + else: + m.store_inst(naming_labels, sp.value) + self.pmda.debug("naming_labels '%s'" % (naming_labels)) if self.pmda.dbg else None ++ # new metric case + else: + # check metric is not excluded by filters + fullname = "openmetrics.%s.%s" % (self.name, sp.name) +@@ -800,9 +823,9 @@ class Source(object): + + return num_metrics + +- def parse_url_config(self, filepath): ++ def parse_config(self, filepath): + ''' +- Parse a URL config file. The first line is always the URL. ++ Parse a configuration file. The first line is always the URL. + Remaining lines are prefixed with a keyword. Supported keywords + include '#' for a comment, 'HEADER:' to add to the header passed + to the headers dict parameter to the get() call. Note the ':' are +@@ -900,12 +923,12 @@ class Source(object): + if not s[ST_MODE] & S_IXUSR: + self.pmda.err("cannot execute script '%s'" % self.path) + return +- elif self.parse_url_time < s[ST_CTIME]: ++ elif self.parse_time is None or self.parse_time < s.st_mtime_ns: + # (re)parse the URL from given file +- self.parse_url_config(self.path) +- self.parse_url_time = s[ST_CTIME] ++ self.parse_config(self.path) ++ self.parse_time = s.st_mtime_ns + except Exception as e: +- self.pmda.err("cannot read %s: %s" % (self.path, e)) ++ self.pmda.err("cannot stat %s: %s" % (self.path, e)) + return + + # fetch the document +@@ -1001,7 +1024,7 @@ class OpenMetricsPMDA(PMDA): + # now everything else may take time + self.pmda_name = pmda_name + self.config_dir = os.path.normpath(config) +- self.config_dir_ctime = None ++ self.config_dir_mtime = 0.0 + self.timeout = timeout + + # a single central Session that all our sources can concurrently reuse +@@ -1014,6 +1037,11 @@ class OpenMetricsPMDA(PMDA): + reserved_cluster = self.cluster_table.intern_lookup_value("control") + assert reserved_cluster == 0 + self.source_by_cluster = {} ++ # all metrics added, to be used for removal ++ self.all_metrics = {} ++ # keep track of removed metrics, in case of re-addition ++ self.removed_metrics = {} ++ self.controls = {0:0} + + # compiled regex cache + self.regex_cache = {} +@@ -1106,26 +1134,53 @@ class OpenMetricsPMDA(PMDA): + assert s == self.source_by_name[s.name] + + +- def traverse(self, directory, ctime): ++ def traverse(self, directory, mtime): + ''' Return list of files below dir, recursively ''' + ret = [] +- m = os.path.getctime(directory) +- if ctime is None or m > ctime: +- ctime = m ++ m = os.path.getmtime(directory) ++ if mtime is None or m > mtime: ++ mtime = m + + for path, subdirs, files in os.walk(directory): + for f in files: + if not f.startswith("."): + fname = os.path.join(path, f) +- m = os.path.getctime(fname) +- if ctime is None or m > ctime: +- ctime = m ++ m = os.path.getmtime(fname) ++ if mtime is None or m > mtime: ++ mtime = m + ret.append(fname) ++ fname = os.path.join(path, f) ++ with open(fname, 'r') as name: ++ f_path = name.readline().strip() ++ if f_path.startswith("file:///"): ++ parsed = urlparse(f_path) ++ m = os.path.getmtime(parsed.path) ++ if mtime is None or m > mtime: ++ mtime = m + for d in subdirs: +- m, _ = self.traverse(os.path.join(path, d), ctime) +- if ctime is None or m > ctime: +- ctime = m +- return ctime, ret ++ m, _ = self.traverse(os.path.join(path, d), mtime) ++ if mtime is None or m > mtime: ++ mtime = m ++ return mtime, ret ++ ++ def initialize_controls(self, cluster): ++ # initialize statistics ++ self.stats_fetch_calls[cluster] = 0 ++ self.stats_fetch_time[cluster] = 0 ++ self.stats_parse_time[cluster] = 0 ++ self.stats_status[cluster] = "unknown" ++ self.stats_status_code[cluster] = 0 ++ ++ self.controls[cluster] = 1 ++ ++ def delete_controls(self, cluster): ++ del self.stats_fetch_calls[cluster] ++ del self.stats_fetch_time[cluster] ++ del self.stats_parse_time[cluster] ++ del self.stats_status[cluster] ++ del self.stats_status_code[cluster] ++ ++ self.controls[cluster] = 0 + + def rescan_confdir(self): + '''Scan the configuration directories for any new .url files +@@ -1138,19 +1193,56 @@ class OpenMetricsPMDA(PMDA): + ''' + + traverse_time = time.time() +- dir_ctime, conf_filelist = self.traverse(self.config_dir, self.config_dir_ctime) ++ dir_mtime, conf_filelist = self.traverse(self.config_dir, self.config_dir_mtime) + traverse_time = time.time() - traverse_time + +- if self.config_dir_ctime is None or self.config_dir_ctime < dir_ctime: +- self.config_dir_ctime = dir_ctime ++ if self.config_dir_mtime < dir_mtime: ++ self.config_dir_mtime = dir_mtime + else: # no new or changed conf files, don't rescan directory + return + + self.log("Config change detected, traversed %d config entries in %.04fs, rescanning ..." % (len(conf_filelist), traverse_time)) + nickname_regexp = self.lookup_regex(r"^[A-Za-z][A-Za-z0-9_.]*$") ++ self.re_add_list = [] ++ ++ # calculate config entry nicknames ++ nicknames = [] ++ for file in conf_filelist: ++ file_split = os.path.splitext(file) ++ name = file_split[0].replace(self.config_dir + "/", "").replace("/", ".") ++ nicknames.append(name) ++ ++ # check if config change adds a previously removed source ++ for key in self.removed_metrics: ++ split_name = key.split(".") ++ if split_name[1] in nicknames: ++ self.re_add_list.append(split_name[1]) ++ ++ # if source is not in config directory, remove the metric ++ for key, value in self.all_metrics.items(): ++ split_name = key.split(".") ++ if split_name[1] in nicknames: ++ continue ++ try: ++ remove_name = key ++ remove_obj = value ++ cluster = self.cluster_table.intern_lookup_value(split_name[1]) ++ if self.controls[cluster] == 1: ++ self.delete_controls(cluster) ++ self.remove_metric(remove_name, remove_obj) ++ self.removed_metrics[remove_name] = remove_obj ++ self.debug("removed metric name: %s" % remove_name) if self.dbg else None ++ self.set_need_refresh() ++ except Exception as e: ++ self.debug("can't remove metric: %s, see error: %s" % (key, e)) if self.dbg else None ++ ++ for key in self.removed_metrics: ++ if key in self.all_metrics: ++ del self.all_metrics[key] + +- # TODO: maybe nuke sources related to removed files + save_cluster_table = False ++ cluster_for_refresh_names = [] ++ cluster_for_refresh = [] + if sort_conf_list: + # sorted for indom cluster consistency + conf_filelist = sorted(conf_filelist) +@@ -1177,6 +1269,13 @@ class OpenMetricsPMDA(PMDA): + if name in self.source_by_name: + # this source is already known + self.assert_source_invariants(name=name) ++ s = self.source_by_name[name] ++ for key, value in self.source_by_cluster.items(): ++ if value == s: ++ cluster_for_refresh.append(key) ++ cluster_for_refresh_names.append(name) ++ if name in self.re_add_list: ++ self.initialize_controls(key) + else: + try: + path = file +@@ -1185,17 +1284,16 @@ class OpenMetricsPMDA(PMDA): + self.source_by_name[source.name] = source + self.source_by_cluster[source.cluster] = source + +- # initialize statistics +- self.stats_fetch_calls[cluster] = 0 +- self.stats_fetch_time[cluster] = 0 +- self.stats_parse_time[cluster] = 0 +- self.stats_status[cluster] = "unknown" +- self.stats_status_code[cluster] = 0 ++ self.initialize_controls(cluster) + + save_cluster_table = True + self.log("Found source %s cluster %d" % (name, cluster)) + except Exception as e: + self.err("Error allocating new cluster/source %s (%s)" % (name, e)) ++ ++ self.debug("refreshing cluster list: %s" % cluster_for_refresh_names) if self.dbg else None ++ self.refresh_some_clusters_for_fetch(cluster_for_refresh) ++ + if save_cluster_table: + self.cluster_table.save() + self.set_notify_change() diff --git a/SOURCES/pmwebapi-filter-exact.patch b/SOURCES/pmwebapi-filter-exact.patch new file mode 100644 index 0000000..3d8c467 --- /dev/null +++ b/SOURCES/pmwebapi-filter-exact.patch @@ -0,0 +1,39 @@ +commit f7476aaaede432f851562d0e8b7f6c4e2f618e66 +Author: William Cohen +Date: Wed Apr 2 16:56:04 2025 -0400 + + libpcp_web, qa: Fix the selection and testing of exact match filtering + + Testing showed that globbing matching was being used for the exact + match filtering. Corrected the code to use exact matching when + selected and updated qa/1543 to have the correct output when using + exact match for filtering. + +diff --git a/qa/1543.out b/qa/1543.out +index fcaa3f4e4..9ff2f82c7 100644 +--- a/qa/1543.out ++++ b/qa/1543.out +@@ -1041,6 +1041,10 @@ sample_long_one{role="testing",agent="sample",hostname="HOSTNAME",cluster="zero" + # HELP sample_long_one 1 as a 32-bit integer + # TYPE sample_long_one gauge + sample_long_one{role="testing",agent="sample",hostname="HOSTNAME",cluster="zero",domainname="DOMAINNAME",machineid="MACHINEID"} 1 ++# PCP5 sample.long.ten 29.0.11 32 PM_INDOM_NULL instant none ++# HELP sample_long_ten 10 as a 32-bit integer ++# TYPE sample_long_ten gauge ++sample_long_ten{role="testing",agent="sample",hostname="HOSTNAME",cluster="zero",domainname="DOMAINNAME",machineid="MACHINEID"} 10 + == good filter regex == + # PCP5 sample.long.one 29.0.10 32 PM_INDOM_NULL instant none + # HELP sample_long_one 1 as a 32-bit integer +diff --git a/src/libpcp_web/src/webgroup.c b/src/libpcp_web/src/webgroup.c +index e0b16d1c5..8f5e8a4ea 100644 +--- a/src/libpcp_web/src/webgroup.c ++++ b/src/libpcp_web/src/webgroup.c +@@ -2021,7 +2021,7 @@ pmWebGroupScrape(pmWebGroupSettings *settings, sds id, dict *params, void *arg) + if (strcmp(match, "regex") == 0) { + scrape.match = MATCH_REGEX; + } else if (strcmp(match, "exact") == 0) +- scrape.match = MATCH_GLOB; ++ scrape.match = MATCH_EXACT; + else if (strcmp(match, "glob") != 0) { + infofmt(msg, "%s - invalid 'match' parameter value", match); + sts = -EINVAL; diff --git a/SOURCES/python-pmda-wrapper-list-fix.patch b/SOURCES/python-pmda-wrapper-list-fix.patch new file mode 100644 index 0000000..b26daa7 --- /dev/null +++ b/SOURCES/python-pmda-wrapper-list-fix.patch @@ -0,0 +1,17 @@ +diff -Naurp pcp-6.3.7.orig/src/python/pmda.c pcp-6.3.7/src/python/pmda.c +--- pcp-6.3.7.orig/src/python/pmda.c 2025-06-26 19:39:47.002695985 +1000 ++++ pcp-6.3.7/src/python/pmda.c 2025-06-26 19:40:16.426718001 +1000 +@@ -417,11 +417,11 @@ refresh_all_clusters(int numclusters, in + PyList_SET_ITEM(list, i, num); + } + +- arglist = Py_BuildValue("(N)", list); ++ arglist = Py_BuildValue("(O)", list); ++ Py_DECREF(list); + if (arglist == NULL) + return -ENOMEM; + result = PyObject_Call(refresh_all_func, arglist, NULL); +- Py_DECREF(list); + Py_DECREF(arglist); + if (result == NULL) + return callback_error("refresh_all_clusters"); diff --git a/SOURCES/redhat-issues-RHEL-58953-perl-drop-Y2038-checks.patch b/SOURCES/redhat-issues-RHEL-58953-perl-drop-Y2038-checks.patch index 0bd5a5b..df0fa4c 100644 --- a/SOURCES/redhat-issues-RHEL-58953-perl-drop-Y2038-checks.patch +++ b/SOURCES/redhat-issues-RHEL-58953-perl-drop-Y2038-checks.patch @@ -1,35 +1,7 @@ -diff -Naurp pcp-6.3.1.orig/configure pcp-6.3.1/configure ---- pcp-6.3.1.orig/configure 2024-09-11 11:45:29.000000000 +1000 -+++ pcp-6.3.1/configure 2024-10-02 11:50:38.938538019 +1000 -@@ -5442,11 +5442,11 @@ if test x$ac_prog_cxx_stdcxx = xno - then : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++11 features" >&5 - printf %s "checking for $CXX option to enable C++11 features... " >&6; } --if test ${ac_cv_prog_cxx_11+y} -+if test ${ac_cv_prog_cxx_cxx11+y} - then : - printf %s "(cached) " >&6 - else $as_nop -- ac_cv_prog_cxx_11=no -+ ac_cv_prog_cxx_cxx11=no - ac_save_CXX=$CXX - cat confdefs.h - <<_ACEOF >conftest.$ac_ext - /* end confdefs.h. */ -@@ -5488,11 +5488,11 @@ if test x$ac_prog_cxx_stdcxx = xno - then : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++98 features" >&5 - printf %s "checking for $CXX option to enable C++98 features... " >&6; } --if test ${ac_cv_prog_cxx_98+y} -+if test ${ac_cv_prog_cxx_cxx98+y} - then : - printf %s "(cached) " >&6 - else $as_nop -- ac_cv_prog_cxx_98=no -+ ac_cv_prog_cxx_cxx98=no - ac_save_CXX=$CXX - cat confdefs.h - <<_ACEOF >conftest.$ac_ext - /* end confdefs.h. */ -@@ -9457,7 +9457,7 @@ printf %s "checking if Perl is Y2038-saf +diff -Naurp pcp-6.3.7.orig/configure pcp-6.3.7/configure +--- pcp-6.3.7.orig/configure 2025-03-31 12:41:26.000000000 +1100 ++++ pcp-6.3.7/configure 2025-03-31 14:00:04.534091532 +1100 +@@ -9618,7 +9618,7 @@ printf %s "checking if Perl is Y2038-saf # { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } @@ -38,10 +10,10 @@ diff -Naurp pcp-6.3.1.orig/configure pcp-6.3.1/configure ;; 67768036191676799) # all good -diff -Naurp pcp-6.3.1.orig/configure.ac pcp-6.3.1/configure.ac ---- pcp-6.3.1.orig/configure.ac 2024-09-11 11:45:29.000000000 +1000 -+++ pcp-6.3.1/configure.ac 2024-10-02 11:50:35.841529740 +1000 -@@ -1401,7 +1401,7 @@ AS_IF([test "x$do_perl" != "xno"], [ +diff -Naurp pcp-6.3.7.orig/configure.ac pcp-6.3.7/configure.ac +--- pcp-6.3.7.orig/configure.ac 2025-03-31 12:41:26.000000000 +1100 ++++ pcp-6.3.7/configure.ac 2025-03-31 13:59:38.095025279 +1100 +@@ -1406,7 +1406,7 @@ AS_IF([test "x$do_perl" != "xno"], [ # can't play in this sandpit # AC_MSG_RESULT([no]) diff --git a/SOURCES/selinux-pcp_pmie_t.patch b/SOURCES/selinux-pcp_pmie_t.patch new file mode 100644 index 0000000..383094f --- /dev/null +++ b/SOURCES/selinux-pcp_pmie_t.patch @@ -0,0 +1,21 @@ +commit 081aa84d3809b64f3e7765abf13a9a90f1072ec8 +Author: Nathan Scott +Date: Tue May 6 11:46:14 2025 +1000 + + selinux: additional policy needed for pcp_pmie_t using ps(1) + + Resolves Fedora BZ 2363903. + +diff --git a/src/selinux/pcp.te b/src/selinux/pcp.te +index a30144950..9cbd59bd2 100644 +--- a/src/selinux/pcp.te ++++ b/src/selinux/pcp.te +@@ -247,7 +247,7 @@ optional_policy(` + # + # pcp_pmie local policy + # +-allow pcp_pmie_t self:capability { chown fsetid sys_ptrace }; ++allow pcp_pmie_t self:capability { chown fsetid sys_admin sys_ptrace }; + allow pcp_pmie_t self:cap_userns sys_ptrace; + allow pcp_pmie_t self:netlink_route_socket { create_socket_perms nlmsg_read }; + allow pcp_pmie_t self:unix_dgram_socket { create_socket_perms sendto }; diff --git a/SOURCES/selinux-pmie-and-pmlogger.patch b/SOURCES/selinux-pmie-and-pmlogger.patch deleted file mode 100644 index 21cfc2b..0000000 --- a/SOURCES/selinux-pmie-and-pmlogger.patch +++ /dev/null @@ -1,24 +0,0 @@ -diff --git a/src/selinux/pcp.te b/src/selinux/pcp.te -index 46d921b5c..c03d03674 100644 ---- a/src/selinux/pcp.te -+++ b/src/selinux/pcp.te -@@ -906,6 +906,9 @@ allow pcp_pmlogger_t etc_t:dir { add_name read remove_name write }; - allow pcp_pmlogger_t etc_t:file { create unlink write }; - allow pcp_pmlogger_t cgroup_t:file { getattr read open append write }; - -+allow pcp_pmlogger_t fixed_disk_device_t:blk_file getattr; -+allow pcp_pmlogger_t sysfs_t:lnk_file read; -+ - #============= pcp_pmie_t ============== - # type=AVC msg=audit(N): avc: denied { execute execute_no_trans getattr open read } for pid=PID comm="pmdaX" name="/" dev="tracefs" ino=INO scontext=system_u:system_r:pcp_pmie_t:s0 tcontext=system_u:object_r:hostname_exec_t:s0 tclass=file permissive=0 - allow pcp_pmie_t hostname_exec_t:file { execute execute_no_trans getattr open read }; -@@ -940,6 +943,9 @@ allow pcp_pmie_t etc_t:dir { add_name read remove_name write }; - allow pcp_pmie_t etc_t:file { create unlink write }; - allow pcp_pmie_t cgroup_t:file { getattr read open append write }; - -+allow pcp_pmie_t fixed_disk_device_t:blk_file getattr; -+allow pcp_pmie_t sysfs_t:lnk_file read; -+ - #============= pmda-lio ============== - # type=AVC msg=audit(N): avc: denied { open read search write } for pid=PID comm="pmdaX" name="/" dev="tracefs" ino=INO scontext=system_u:system_r:pcp_pmcd_t:s0 tcontext=system_u:object_r:configfs_t:s0 tclass=dir permissive=0 - allow pcp_pmcd_t configfs_t:dir { open read search write }; diff --git a/SOURCES/selinux-proc_psi_t.patch b/SOURCES/selinux-proc_psi_t.patch new file mode 100644 index 0000000..003ec28 --- /dev/null +++ b/SOURCES/selinux-proc_psi_t.patch @@ -0,0 +1,52 @@ +commit 7047f77ccaa84e9af356b9918395a4057af23933 +Author: Nathan Scott +Date: Mon Apr 14 11:58:41 2025 +1000 + + selinux: add permissions allowing proc_psi_t access + + Access to /proc/pressure recently became selinux policy + protected so we need to allow pcp_pmcd_t to access that + as it contains important system level metrics. + + Resolves Red Hat bugzilla #2358326. + +diff --git a/src/selinux/pcp.if b/src/selinux/pcp.if +index 3ce68c2039..0297185c61 100644 +--- a/src/selinux/pcp.if ++++ b/src/selinux/pcp.if +@@ -535,3 +535,23 @@ ifndef(`userdom_manage_tmp_files',` + ') + ') + ') ++ ++######################################## ++## ++## Dummy kernel_read_psi(). ++## Allow caller to set up pressure stall information (PSI), ++## but if you don't have actual kernel_read_psi() interface ++## nothing needs to be done. ++## ++## ++## Domain allowed access. ++## ++## ++# ++ifndef(`kernel_read_psi',` ++ interface(`kernel_read_psi',` ++ gen_require(` ++ type $1; ++ ') ++ ') ++') +diff --git a/src/selinux/pcp.te b/src/selinux/pcp.te +index 9ad27c5c91..a301449500 100644 +--- a/src/selinux/pcp.te ++++ b/src/selinux/pcp.te +@@ -123,6 +123,7 @@ kernel_read_vm_sysctls(pcp_pmcd_t) + kernel_read_rpc_sysctls(pcp_pmcd_t) + kernel_search_network_sysctl(pcp_pmcd_t) + kernel_read_net_sysctls(pcp_pmcd_t) ++kernel_read_psi(pcp_pmcd_t) + + corecmd_exec_bin(pcp_pmcd_t) + corecmd_exec_shell(pcp_pmcd_t) diff --git a/SOURCES/systemd-tmpfiles.d-directories.patch b/SOURCES/systemd-tmpfiles.d-directories.patch new file mode 100644 index 0000000..6accc0a --- /dev/null +++ b/SOURCES/systemd-tmpfiles.d-directories.patch @@ -0,0 +1,40 @@ +diff -Naurp pcp-6.3.7.orig/GNUmakefile pcp-6.3.7/GNUmakefile +--- pcp-6.3.7.orig/GNUmakefile 2025-03-27 17:01:59.000000000 +1100 ++++ pcp-6.3.7/GNUmakefile 2025-06-26 19:23:24.874469186 +1000 +@@ -135,6 +135,8 @@ pcp.lsm src/include/builddefs src/includ + + tmpfiles.init.setup: tmpfiles.init.setup.in + sed < $< > $@ \ ++ -e "s@PCP_VAR_DIR@$(PCP_VAR_DIR)@" \ ++ -e "s@PCP_TMP_DIR@$(PCP_TMP_DIR)@" \ + -e "s@PCP_RUN_DIR@$(PCP_RUN_DIR)@" \ + -e "s@PCP_LOG_DIR@$(PCP_LOG_DIR)@" \ + -e "s/PCP_GROUP/$(PCP_GROUP)/" \ +diff -Naurp pcp-6.3.7.orig/tmpfiles.init.setup.in pcp-6.3.7/tmpfiles.init.setup.in +--- pcp-6.3.7.orig/tmpfiles.init.setup.in 2024-07-30 16:43:55.000000000 +1000 ++++ pcp-6.3.7/tmpfiles.init.setup.in 2025-06-26 19:23:24.875070062 +1000 +@@ -1,10 +1,16 @@ + # tmpfiles.d(5) config for Performance Co-Pilot startup components + # +-# Type Path Mode User Group Age Argument +-D PCP_RUN_DIR 0775 PCP_USER PCP_GROUP - - +-d PCP_LOG_DIR 0775 PCP_USER PCP_GROUP - - +-d PCP_LOG_DIR/pmcd 0755 root root - - +-d PCP_LOG_DIR/pmfind 0775 PCP_USER PCP_GROUP - - +-d PCP_LOG_DIR/pmie 0775 PCP_USER PCP_GROUP - - +-d PCP_LOG_DIR/pmlogger 0775 PCP_USER PCP_GROUP - - +-d PCP_LOG_DIR/pmproxy 0775 PCP_USER PCP_GROUP - - ++# Path Mode User Group Age Argument ++D PCP_RUN_DIR 0775 PCP_USER PCP_GROUP - - ++d PCP_VAR_DIR 0755 root root - - ++d PCP_VAR_DIR/config 0755 root root - - ++d PCP_VAR_DIR/config/pmda 0775 PCP_USER PCP_GROUP - - ++d PCP_VAR_DIR/config/pmie 0775 PCP_USER PCP_GROUP - - ++d PCP_VAR_DIR/config/pmlogger 0775 PCP_USER PCP_GROUP - - ++d PCP_TMP_DIR 0775 PCP_USER PCP_GROUP - - ++d PCP_LOG_DIR 0775 PCP_USER PCP_GROUP - - ++d PCP_LOG_DIR/pmcd 0755 root root - - ++d PCP_LOG_DIR/pmfind 0775 PCP_USER PCP_GROUP - - ++d PCP_LOG_DIR/pmie 0775 PCP_USER PCP_GROUP - - ++d PCP_LOG_DIR/pmlogger 0775 PCP_USER PCP_GROUP - - ++d PCP_LOG_DIR/pmproxy 0775 PCP_USER PCP_GROUP - - diff --git a/SPECS/pcp.spec b/SPECS/pcp.spec index 4f46d99..4f67ea2 100644 --- a/SPECS/pcp.spec +++ b/SPECS/pcp.spec @@ -1,17 +1,23 @@ Name: pcp -Version: 6.3.2 -Release: 3%{?dist} +Version: 6.3.7 +Release: 5%{?dist} Summary: System-level performance monitoring and performance management License: GPL-2.0-or-later AND LGPL-2.1-or-later AND CC-BY-3.0 URL: https://pcp.io Source0: https://github.com/performancecopilot/pcp/releases/pcp-%{version}.src.tar.gz -Patch0: pcp-xsos-fixes.patch # Keep xx-default-archive-version.patch for the life of RHEL9 -Patch1: redhat-issues-RHEL-2317-default-archive-version.patch -Patch2: redhat-issues-RHEL-58953-perl-drop-Y2038-checks.patch -Patch3: selinux-pmie-and-pmlogger.patch +Patch0: redhat-issues-RHEL-2317-default-archive-version.patch +Patch1: redhat-issues-RHEL-58953-perl-drop-Y2038-checks.patch +Patch2: selinux-proc_psi_t.patch +Patch3: selinux-pcp_pmie_t.patch +Patch4: pmwebapi-filter-exact.patch +Patch5: pmda-openmetrics-rollup.patch +Patch6: pmapi-header-multilib-fix.patch +Patch7: python-pmda-wrapper-list-fix.patch +Patch8: systemd-tmpfiles.d-directories.patch +Patch9: fix-pmdabpf-noarch-man-page-build-failure.patch %if 0%{?fedora} >= 40 || 0%{?rhel} >= 10 ExcludeArch: %{ix86} @@ -108,7 +114,7 @@ ExcludeArch: %{ix86} # support for pmdabcc, check bcc.spec for supported architectures of bcc %if 0%{?fedora} >= 25 || 0%{?rhel} > 6 -%ifarch x86_64 %{power64} aarch64 s390x +%ifarch x86_64 %{power64} aarch64 s390x riscv64 %global disable_bcc 0 %else %global disable_bcc 1 @@ -119,7 +125,7 @@ ExcludeArch: %{ix86} # support for pmdabpf, check bcc.spec for supported architectures of libbpf-tools %if 0%{?fedora} >= 37 || 0%{?rhel} > 8 -%ifarch x86_64 %{power64} aarch64 s390x +%ifarch x86_64 %{power64} aarch64 s390x riscv64 %global disable_bpf 0 %else %global disable_bpf 1 @@ -130,7 +136,7 @@ ExcludeArch: %{ix86} # support for pmdabpftrace, check bpftrace.spec for supported architectures of bpftrace %if 0%{?fedora} >= 30 || 0%{?rhel} > 7 -%ifarch x86_64 %{power64} aarch64 s390x +%ifarch x86_64 %{power64} aarch64 s390x riscv64 %global disable_bpftrace 0 %else %global disable_bpftrace 1 @@ -168,6 +174,17 @@ ExcludeArch: %{ix86} %global disable_mssql 1 %endif +# No mysql support on 32-bit x86 platforms from el9 and later +%ifarch %{ix86} +%if 0%{?rhel} >= 9 +%global disable_mysql 1 +%else +%global disable_mysql 0 +%endif +%else +%global disable_mysql 0 +%endif + # support for pmdanutcracker (perl deps missing on rhel) %if 0%{?rhel} == 0 %global disable_nutcracker 0 @@ -232,7 +249,7 @@ ExcludeArch: %{ix86} %global disable_xlsx 1 %endif -%if 0%{?fedora} >= 40 || 0%{?rhel} >= 10 +%if 0%{?fedora} >= 40 || 0%{?rhel} >= 9 %global disable_amdgpu 0 %else %global disable_amdgpu 1 @@ -353,10 +370,11 @@ Requires: pcp-selinux = %{version}-%{release} %global _pmdasdir %{_localstatedir}/lib/pcp/pmdas %global _pmdasexecdir %{_libexecdir}/pcp/pmdas %global _testsdir %{_localstatedir}/lib/pcp/testsuite -%global _ieconfigdir %{_localstatedir}/lib/pcp/config/pmie %global _ieconfdir %{_localstatedir}/lib/pcp/config/pmieconf %global _selinuxdir %{_datadir}/selinux/packages/targeted +%global _with_multilib --enable-multilib=true + %if 0%{?fedora} >= 20 || 0%{?rhel} >= 8 %global _with_doc --with-docdir=%{_docdir}/%{name} %endif @@ -440,6 +458,12 @@ Requires: pcp-selinux = %{version}-%{release} %global _with_mongodb --with-pmdamongodb=yes %endif +%if %{disable_mysql} +%global _with_mysql --with-pmdamysql=no +%else +%global _with_mysql --with-pmdamysql=yes +%endif + %if %{disable_nutcracker} %global _with_nutcracker --with-pmdanutcracker=no %else @@ -482,16 +506,6 @@ else fi } -%global run_pmieconf() %{expand: -if [ -d "%1" -a -w "%1" -a -w "%1/%2" ] -then - pmieconf -f "%1/%2" -c enable "%3" - chown pcp:pcp "%1/%2" 2>/dev/null -else - echo "WARNING: Cannot write to %1/%2, skipping pmieconf enable of %3." >&2 -fi -} - %description Performance Co-Pilot (PCP) provides a framework and services to support system-level performance monitoring and performance management. @@ -574,7 +588,7 @@ Obsoletes: pcp-gui-testsuite < 3.9.5 # both of which are now obsoleted by the base pcp package Requires: pcp-pmda-activemq pcp-pmda-bonding pcp-pmda-dbping pcp-pmda-ds389 pcp-pmda-ds389log Requires: pcp-pmda-elasticsearch pcp-pmda-gpfs pcp-pmda-gpsd pcp-pmda-lustre -Requires: pcp-pmda-memcache pcp-pmda-mysql pcp-pmda-named pcp-pmda-netfilter pcp-pmda-news +Requires: pcp-pmda-memcache pcp-pmda-named pcp-pmda-netfilter pcp-pmda-news Requires: pcp-pmda-nginx pcp-pmda-nfsclient pcp-pmda-pdns pcp-pmda-postfix pcp-pmda-postgresql pcp-pmda-oracle Requires: pcp-pmda-samba pcp-pmda-slurm pcp-pmda-zimbra Requires: pcp-pmda-dm pcp-pmda-apache @@ -614,6 +628,9 @@ Requires: pcp-pmda-mongodb %if !%{disable_mssql} Requires: pcp-pmda-mssql %endif +%if !%{disable_mysql} +Requires: pcp-pmda-mysql +%endif %if !%{disable_snmp} Requires: pcp-pmda-snmp %endif @@ -1327,6 +1344,7 @@ This package contains the PCP Performance Metrics Domain Agent (PMDA) for collecting metrics about Memcached. #end pcp-pmda-memcache +%if !%{disable_mysql} # # pcp-pmda-mysql # @@ -1343,6 +1361,7 @@ BuildRequires: perl(DBI) perl(DBD::mysql) This package contains the PCP Performance Metrics Domain Agent (PMDA) for collecting metrics about the MySQL database. #end pcp-pmda-mysql +%endif # # pcp-pmda-named @@ -2491,7 +2510,7 @@ sed -i "/PACKAGE_BUILD/s/=[0-9]*/=$_build/" VERSION.pcp %if !%{disable_python2} && 0%{?default_python} != 3 export PYTHON=python%{?default_python} %endif -%configure %{?_with_initd} %{?_with_doc} %{?_with_dstat} %{?_with_ib} %{?_with_gfs2} %{?_with_statsd} %{?_with_perfevent} %{?_with_bcc} %{?_with_bpf} %{?_with_bpftrace} %{?_with_json} %{?_with_mongodb} %{?_with_snmp} %{?_with_nutcracker} %{?_with_python2} +%configure %{?_with_multilib} %{?_with_initd} %{?_with_doc} %{?_with_dstat} %{?_with_ib} %{?_with_gfs2} %{?_with_statsd} %{?_with_perfevent} %{?_with_bcc} %{?_with_bpf} %{?_with_bpftrace} %{?_with_json} %{?_with_mongodb} %{?_with_mysql} %{?_with_snmp} %{?_with_nutcracker} %{?_with_python2} make %{?_smp_mflags} default_pcp %install @@ -2880,7 +2899,8 @@ done %if !%{disable_selinux} %selinux_relabel_pre -s targeted %endif -%if 0%{?fedora} >= 32 || 0%{?rhel} >= 9 +%if 0%{?fedora} >= 42 || 0%{?rhel} >= 11 +%elif 0%{?fedora} >= 32 || 0%{?rhel} >= 9 echo u pcpqa - \"PCP Quality Assurance\" %{_testsdir} /bin/bash | \ systemd-sysusers --replace=/usr/lib/sysusers.d/pcp-testsuite.conf - %else @@ -2922,7 +2942,8 @@ fi %endif %pre -%if 0%{?fedora} >= 32 || 0%{?rhel} >= 9 +%if 0%{?fedora} >= 42 || 0%{?rhel} >= 11 +%elif 0%{?fedora} >= 32 || 0%{?rhel} >= 9 echo u pcp - \"Performance Co-Pilot\" %{_localstatedir}/lib/pcp | \ systemd-sysusers --replace=/usr/lib/sysusers.d/pcp.conf - %else @@ -2989,8 +3010,10 @@ exit 0 %{pmda_remove "$1" "snmp"} %endif +%if !%{disable_mysql} %preun pmda-mysql %{pmda_remove "$1" "mysql"} +%endif %preun pmda-activemq %{pmda_remove "$1" "activemq"} @@ -3222,7 +3245,6 @@ fi PCP_PMDAS_DIR=%{_pmdasdir} PCP_SYSCONFIG_DIR=%{_sysconfdir}/sysconfig PCP_PMCDCONF_PATH=%{_confdir}/pmcd/pmcd.conf -PCP_PMIECONFIG_DIR=%{_ieconfigdir} # auto-install important PMDAs for RH Support (if not present already) for PMDA in dm nfsclient openmetrics ; do if ! grep -q "$PMDA/pmda$PMDA" "$PCP_PMCDCONF_PATH" @@ -3230,10 +3252,12 @@ for PMDA in dm nfsclient openmetrics ; do %{install_file "$PCP_PMDAS_DIR/$PMDA" .NeedInstall} fi done -# auto-enable these usually optional pmie rules -%{run_pmieconf "$PCP_PMIECONFIG_DIR" config.default dmthin} # managed via /usr/lib/systemd/system-preset/90-default.preset nowadays: -%if 0%{?rhel} > 0 && 0%{?rhel} < 10 +%if 0%{?fedora} > 40 || 0%{?rhel} > 9 + for s in pmcd pmlogger pmie; do + systemctl --quiet is-enabled $s && systemctl restart $s >/dev/null 2>&1 + done +%else # old-school methods follow %if !%{disable_systemd} systemctl restart pmcd pmlogger pmie >/dev/null 2>&1 systemctl enable pmcd pmlogger pmie >/dev/null 2>&1 @@ -3402,7 +3426,7 @@ fi %files pmda-lustrecomm -f pcp-pmda-lustrecomm-files.rpm -%if !%{disable_perl} +%if !%{disable_mysql} %files pmda-mysql -f pcp-pmda-mysql-files.rpm %endif @@ -3604,6 +3628,30 @@ fi %files zeroconf -f pcp-zeroconf-files.rpm %changelog +* Fri Jun 27 2025 Nathan Scott - 6.3.7-5 +- Backport some more fixes to the OpenMetrics PMDA (RHEL-54039) +- Fix a multilib regression in PCP header files (RHEL-93186) +- Fix python PMDA wrapper handling of list objects +- Improve tmpfiles.d handling of empty directories + +* Wed Apr 30 2025 Lauren Chilton - 6.3.7-4 +- Backport metric removal for pmdaopenmetrics + +* Tue Apr 22 2025 William Cohen - 6.3.7-3 +- Backport the webapi filtering fix to allow the use of exact matching. (RHEL-85792) + +* Tue Apr 15 2025 Nathan Scott - 6.3.7-2 +- Add selinux policy for new proc_psi_t-induced failure + +* Mon Mar 31 2025 Nathan Scott - 6.3.7-1 +- Update to latest stable version of PCP (RHEL-83482) + +* Fri Mar 21 2025 Frederic Berat - 6.3.4-2 +- Enable AMD GPU pmda (RHEL-83154) + +* Fri Mar 14 2025 Nathan Scott - 6.3.4-1 +- Update to latest stable version of PCP (RHEL-83482) + * Fri Jan 3 2025 Sam Feifer - 6.3.2-3 - Fix selinux denials caused by pmie and pmlogger trying to access /dev/dm-*