import CS pcp-6.3.7-5.el9

This commit is contained in:
eabdullin 2025-09-15 12:30:25 +00:00
parent 62128d912a
commit 51205b2b46
14 changed files with 1017 additions and 361 deletions

2
.gitignore vendored
View File

@ -1 +1 @@
SOURCES/pcp-6.3.2.src.tar.gz
SOURCES/pcp-6.3.7.src.tar.gz

View File

@ -1 +1 @@
90248a6ea840586b2ffa04f89aadea2fa7a3860e SOURCES/pcp-6.3.2.src.tar.gz
cd24aa253a1fb7e34b5ce40fc305ef19704f7eca SOURCES/pcp-6.3.7.src.tar.gz

View File

@ -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

View File

@ -1,269 +0,0 @@
commit d2852e19e77e25d628399d51fcf199233547f8c4
Author: Nathan Scott <nathans@redhat.com>
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 <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+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 <nathans@redhat.com>
Date: Wed Nov 13 16:49:57 2024 +1100
Merge commit 'b147af9c8e71423be9bb62699534d3fea4d86b8a' into xsos
commit b147af9c8e71423be9bb62699534d3fea4d86b8a
Author: Nathan Scott <nathans@redhat.com>
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

View File

@ -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 <bits/wordsize.h>
#if __WORDSIZE == 32
#include "config32.h"

View File

@ -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()

View File

@ -0,0 +1,39 @@
commit f7476aaaede432f851562d0e8b7f6c4e2f618e66
Author: William Cohen <wcohen@redhat.com>
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;

View File

@ -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");

View File

@ -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])

View File

@ -0,0 +1,21 @@
commit 081aa84d3809b64f3e7765abf13a9a90f1072ec8
Author: Nathan Scott <nathans@redhat.com>
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 };

View File

@ -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 };

View File

@ -0,0 +1,52 @@
commit 7047f77ccaa84e9af356b9918395a4057af23933
Author: Nathan Scott <nathans@redhat.com>
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',`
')
')
')
+
+########################################
+## <summary>
+## 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.
+## <param name="domain">
+## <summary>
+## Domain allowed access.
+## </summary>
+## </summary>
+#
+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)

View File

@ -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 - -

View File

@ -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 <nathans@redhat.com> - 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 <lchilton@redhat.com> - 6.3.7-4
- Backport metric removal for pmdaopenmetrics
* Tue Apr 22 2025 William Cohen <wcohen@redhat.com> - 6.3.7-3
- Backport the webapi filtering fix to allow the use of exact matching. (RHEL-85792)
* Tue Apr 15 2025 Nathan Scott <nathans@redhat.com> - 6.3.7-2
- Add selinux policy for new proc_psi_t-induced failure
* Mon Mar 31 2025 Nathan Scott <nathans@redhat.com> - 6.3.7-1
- Update to latest stable version of PCP (RHEL-83482)
* Fri Mar 21 2025 Frederic Berat <fberat@redhat.com> - 6.3.4-2
- Enable AMD GPU pmda (RHEL-83154)
* Fri Mar 14 2025 Nathan Scott <nathans@redhat.com> - 6.3.4-1
- Update to latest stable version of PCP (RHEL-83482)
* Fri Jan 3 2025 Sam Feifer <sfeifer@redhat.com> - 6.3.2-3
- Fix selinux denials caused by pmie and pmlogger trying to access /dev/dm-*