d209baa18a
Resolves: rhbz#1957575
2591 lines
110 KiB
Diff
2591 lines
110 KiB
Diff
diff -Naurp pcp-5.3.0.orig/configure pcp-5.3.0/configure
|
|
--- pcp-5.3.0.orig/configure 2021-04-12 19:16:21.000000000 +1000
|
|
+++ pcp-5.3.0/configure 2021-05-14 13:18:32.122079201 +1000
|
|
@@ -775,9 +775,6 @@ ncursesw_CFLAGS
|
|
HAVE_NCURSES
|
|
ncurses_LIBS
|
|
ncurses_CFLAGS
|
|
-HAVE_LIBVARLINK
|
|
-libvarlink_LIBS
|
|
-libvarlink_CFLAGS
|
|
HAVE_LIBUV
|
|
libuv_LIBS
|
|
libuv_CFLAGS
|
|
@@ -1076,8 +1073,6 @@ openssl_CFLAGS
|
|
openssl_LIBS
|
|
libuv_CFLAGS
|
|
libuv_LIBS
|
|
-libvarlink_CFLAGS
|
|
-libvarlink_LIBS
|
|
ncurses_CFLAGS
|
|
ncurses_LIBS
|
|
ncursesw_CFLAGS
|
|
@@ -1818,10 +1813,6 @@ Some influential environment variables:
|
|
libuv_CFLAGS
|
|
C compiler flags for libuv, overriding pkg-config
|
|
libuv_LIBS linker flags for libuv, overriding pkg-config
|
|
- libvarlink_CFLAGS
|
|
- C compiler flags for libvarlink, overriding pkg-config
|
|
- libvarlink_LIBS
|
|
- linker flags for libvarlink, overriding pkg-config
|
|
ncurses_CFLAGS
|
|
C compiler flags for ncurses, overriding pkg-config
|
|
ncurses_LIBS
|
|
@@ -10769,80 +10760,6 @@ fi
|
|
|
|
|
|
pkg_failed=no
|
|
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for libvarlink" >&5
|
|
-$as_echo_n "checking for libvarlink... " >&6; }
|
|
-
|
|
-if test -n "$libvarlink_CFLAGS"; then
|
|
- pkg_cv_libvarlink_CFLAGS="$libvarlink_CFLAGS"
|
|
- elif test -n "$PKG_CONFIG"; then
|
|
- if test -n "$PKG_CONFIG" && \
|
|
- { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libvarlink\""; } >&5
|
|
- ($PKG_CONFIG --exists --print-errors "libvarlink") 2>&5
|
|
- ac_status=$?
|
|
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
|
|
- test $ac_status = 0; }; then
|
|
- pkg_cv_libvarlink_CFLAGS=`$PKG_CONFIG --cflags "libvarlink" 2>/dev/null`
|
|
- test "x$?" != "x0" && pkg_failed=yes
|
|
-else
|
|
- pkg_failed=yes
|
|
-fi
|
|
- else
|
|
- pkg_failed=untried
|
|
-fi
|
|
-if test -n "$libvarlink_LIBS"; then
|
|
- pkg_cv_libvarlink_LIBS="$libvarlink_LIBS"
|
|
- elif test -n "$PKG_CONFIG"; then
|
|
- if test -n "$PKG_CONFIG" && \
|
|
- { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libvarlink\""; } >&5
|
|
- ($PKG_CONFIG --exists --print-errors "libvarlink") 2>&5
|
|
- ac_status=$?
|
|
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
|
|
- test $ac_status = 0; }; then
|
|
- pkg_cv_libvarlink_LIBS=`$PKG_CONFIG --libs "libvarlink" 2>/dev/null`
|
|
- test "x$?" != "x0" && pkg_failed=yes
|
|
-else
|
|
- pkg_failed=yes
|
|
-fi
|
|
- else
|
|
- pkg_failed=untried
|
|
-fi
|
|
-
|
|
-
|
|
-
|
|
-if test $pkg_failed = yes; then
|
|
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
|
-$as_echo "no" >&6; }
|
|
-
|
|
-if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
|
|
- _pkg_short_errors_supported=yes
|
|
-else
|
|
- _pkg_short_errors_supported=no
|
|
-fi
|
|
- if test $_pkg_short_errors_supported = yes; then
|
|
- libvarlink_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libvarlink" 2>&1`
|
|
- else
|
|
- libvarlink_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libvarlink" 2>&1`
|
|
- fi
|
|
- # Put the nasty error message in config.log where it belongs
|
|
- echo "$libvarlink_PKG_ERRORS" >&5
|
|
-
|
|
- have_libvarlink=false
|
|
-elif test $pkg_failed = untried; then
|
|
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
|
-$as_echo "no" >&6; }
|
|
- have_libvarlink=false
|
|
-else
|
|
- libvarlink_CFLAGS=$pkg_cv_libvarlink_CFLAGS
|
|
- libvarlink_LIBS=$pkg_cv_libvarlink_LIBS
|
|
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
|
|
-$as_echo "yes" >&6; }
|
|
- have_libvarlink=true
|
|
-fi
|
|
-HAVE_LIBVARLINK=$have_libvarlink
|
|
-
|
|
-
|
|
-
|
|
-pkg_failed=no
|
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ncurses" >&5
|
|
$as_echo_n "checking for ncurses... " >&6; }
|
|
|
|
@@ -11652,12 +11569,9 @@ $as_echo "no" >&6; }; fi
|
|
|
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the podman PMDA should be included" >&5
|
|
$as_echo_n "checking if the podman PMDA should be included... " >&6; }
|
|
-pmda_podman=false
|
|
-if test "x$do_pmdapodman" = "xyes"; then :
|
|
- pmda_podman=true
|
|
-fi
|
|
-if test "x$do_pmdapodman" = "xcheck"; then :
|
|
- $have_libvarlink && pmda_podman=true
|
|
+pmda_podman=true
|
|
+if test "x$do_pmdapodman" = "xno"; then :
|
|
+ pmda_podman=false
|
|
fi
|
|
PMDA_PODMAN=$pmda_podman
|
|
|
|
diff -Naurp pcp-5.3.0.orig/configure.ac pcp-5.3.0/configure.ac
|
|
--- pcp-5.3.0.orig/configure.ac 2021-04-12 19:16:21.000000000 +1000
|
|
+++ pcp-5.3.0/configure.ac 2021-05-14 13:18:32.122079201 +1000
|
|
@@ -1793,9 +1793,6 @@ AC_CHECK_LIB(uv, uv_pipe_chmod,
|
|
have_uv_pipe_chmod=true,
|
|
have_uv_pipe_chmod=false)
|
|
|
|
-PKG_CHECK_MODULES([libvarlink], [libvarlink], [have_libvarlink=true], [have_libvarlink=false])
|
|
-AC_SUBST(HAVE_LIBVARLINK, [$have_libvarlink])
|
|
-
|
|
PKG_CHECK_MODULES([ncurses], [ncurses], [have_ncurses=true], [have_ncurses=false])
|
|
AC_SUBST(HAVE_NCURSES, [$have_ncurses])
|
|
|
|
@@ -1917,11 +1914,9 @@ AS_IF([test "x$do_pmdastatsd" = "xcheck"
|
|
AC_SUBST(PMDA_STATSD, $pmda_statsd)
|
|
if $pmda_statsd; then AC_MSG_RESULT(yes); else AC_MSG_RESULT(no); fi
|
|
|
|
-dnl Do you have varlink libraries for pmdapodman?
|
|
AC_MSG_CHECKING([if the podman PMDA should be included])
|
|
-pmda_podman=false
|
|
-AS_IF([test "x$do_pmdapodman" = "xyes"], [pmda_podman=true])
|
|
-AS_IF([test "x$do_pmdapodman" = "xcheck"], [$have_libvarlink && pmda_podman=true])
|
|
+pmda_podman=true
|
|
+AS_IF([test "x$do_pmdapodman" = "xno"], [pmda_podman=false])
|
|
AC_SUBST(PMDA_PODMAN, $pmda_podman)
|
|
if $pmda_podman; then AC_MSG_RESULT(yes); else AC_MSG_RESULT(no); fi
|
|
|
|
diff -Naurp pcp-5.3.0.orig/qa/1357 pcp-5.3.0/qa/1357
|
|
--- pcp-5.3.0.orig/qa/1357 2018-11-19 13:48:15.000000000 +1100
|
|
+++ pcp-5.3.0/qa/1357 2021-05-14 13:18:32.122079201 +1000
|
|
@@ -1,8 +1,8 @@
|
|
#!/bin/sh
|
|
-# PCP QA Test No. 1358
|
|
+# PCP QA Test No. 1357
|
|
# Verify podman PMDA memory accesses using valgrind.
|
|
#
|
|
-# Copyright (c) 2018 Red Hat.
|
|
+# Copyright (c) 2018,2021 Red Hat.
|
|
#
|
|
|
|
seq=`basename $0`
|
|
@@ -11,6 +11,7 @@ echo "QA output created by $seq"
|
|
. ./common.containers
|
|
|
|
[ -f $PCP_PMDAS_DIR/podman/pmdapodman ] || _notrun "podman pmda not installed"
|
|
+[ -x $PCP_BIN_DIR/systemctl ] || _notrun "systemctl command not available"
|
|
_check_valgrind
|
|
_check_containers
|
|
_check_podman_binary
|
|
@@ -48,18 +49,22 @@ _filter()
|
|
}
|
|
|
|
# real QA test starts here
|
|
+$sudo $PCP_BIN_DIR/systemctl restart podman.service
|
|
+
|
|
container=`$podman run -d busybox sleep 10`
|
|
echo "== container: $container" >> $here/$seq.full
|
|
[ -z "$container" ] && _fail "Failed to create container"
|
|
-pod=`$podman pod create`
|
|
-echo "== pod: $pod" >> $here/$seq.full
|
|
-[ -z "$pod" ] && _fail "Failed to create pod"
|
|
+
|
|
+# RHBZ #1958732
|
|
+#pod=`$podman pod create`
|
|
+#echo "== pod: $pod" >> $here/$seq.full
|
|
+#[ -z "$pod" ] && _fail "Failed to create pod"
|
|
|
|
pmda=$PCP_PMDAS_DIR/podman/pmda_podman.so,podman_init
|
|
pmns=$PCP_VAR_DIR/pmns/root_podman
|
|
args="-L -K clear -K add,33,$pmda -v -n $pmns"
|
|
|
|
-_run_valgrind --sudo pminfo $args podman 2>&1 | _filter
|
|
+_run_valgrind --sudo pminfo $args podman.container 2>&1 | _filter
|
|
|
|
# success, all done
|
|
status=0
|
|
diff -Naurp pcp-5.3.0.orig/qa/1357.out pcp-5.3.0/qa/1357.out
|
|
--- pcp-5.3.0.orig/qa/1357.out 2018-11-19 13:48:15.000000000 +1100
|
|
+++ pcp-5.3.0/qa/1357.out 2021-05-14 13:18:32.122079201 +1000
|
|
@@ -3,10 +3,9 @@ QA output created by 1357
|
|
=== std err ===
|
|
=== filtered valgrind report ===
|
|
Memcheck, a memory error detector
|
|
-Command: pminfo -L -K clear -K add,33,PCP_PMDAS_DIR/podman/pmda_podman.so,podman_init -v -n PCP_VAR_DIR/pmns/root_podman podman
|
|
+Command: pminfo -L -K clear -K add,33,PCP_PMDAS_DIR/podman/pmda_podman.so,podman_init -v -n PCP_VAR_DIR/pmns/root_podman podman.container
|
|
LEAK SUMMARY:
|
|
definitely lost: 0 bytes in 0 blocks
|
|
indirectly lost: 0 bytes in 0 blocks
|
|
ERROR SUMMARY: 0 errors from 0 contexts ...
|
|
== removing container
|
|
-== removing pod
|
|
diff -Naurp pcp-5.3.0.orig/qa/1358 pcp-5.3.0/qa/1358
|
|
--- pcp-5.3.0.orig/qa/1358 2018-11-19 13:48:15.000000000 +1100
|
|
+++ pcp-5.3.0/qa/1358 2021-05-14 13:18:32.122079201 +1000
|
|
@@ -2,7 +2,7 @@
|
|
# PCP QA Test No. 1358
|
|
# Exercise the podman PMDA.
|
|
#
|
|
-# Copyright (c) 2018 Red Hat.
|
|
+# Copyright (c) 2018,2021 Red Hat.
|
|
#
|
|
|
|
seq=`basename $0`
|
|
@@ -11,6 +11,7 @@ echo "QA output created by $seq"
|
|
. ./common.containers
|
|
|
|
[ -f $PCP_PMDAS_DIR/podman/pmdapodman ] || _notrun "podman pmda not installed"
|
|
+[ -x $PCP_BIN_DIR/systemctl ] || _notrun "systemctl command not available"
|
|
_check_containers
|
|
_check_podman_binary
|
|
_check_podman_images busybox
|
|
@@ -42,10 +43,9 @@ pmdapodman_install()
|
|
|
|
_filter()
|
|
{
|
|
- egrep "^podman|$pod1|$pod2|$container1|$container2" | \
|
|
+ #egrep "^podman|$pod1|$pod2|$container1|$container2" | \
|
|
+ egrep "^podman|$container1|$container2" | \
|
|
sed \
|
|
- -e "s/$pod1/POD/g" \
|
|
- -e "s/$pod2/POD/g" \
|
|
-e "s/$container1/CONTAINER/g" \
|
|
-e "s/$container2/CONTAINER/g" \
|
|
-e 's/ value [0-9]\+\.\?[0-9]*[eE][+-][0-9]\+/ value FLOAT/g' \
|
|
@@ -53,6 +53,8 @@ _filter()
|
|
-e 's/ value [0-9]\+/ value INTEGER/g' \
|
|
-e 's/ value ".*"/ value STRING/g' \
|
|
-e 's/inst \[[[0-9]\+ or/ inst [NNN or/g' \
|
|
+ #-e "s/$pod1/POD/g" \
|
|
+ #-e "s/$pod2/POD/g" \
|
|
#end
|
|
}
|
|
|
|
@@ -80,6 +82,8 @@ _prepare_pmda podman
|
|
trap "_cleanup; exit \$status" 0 1 2 3 15
|
|
|
|
# real QA test starts here
|
|
+$sudo $PCP_BIN_DIR/systemctl restart podman.service
|
|
+
|
|
pmdapodman_install
|
|
|
|
# create some new podman containers
|
|
@@ -89,16 +93,17 @@ container2=`$podman run -d busybox sleep
|
|
echo "== container2: $container2" >> $here/$seq.full
|
|
[ -z "$container1" -o -z "$container2" ] && _fail "Failed to create containers"
|
|
|
|
+# RHBZ #1958732
|
|
# create some new podman pods
|
|
-pod1=`$podman pod create`
|
|
-echo "== pod1: $pod1" >> $here/$seq.full
|
|
-pod2=`$podman pod create`
|
|
-echo "== pod2: $pod2" >> $here/$seq.full
|
|
-[ -z "$pod1" -o -z "$pod2" ] && _fail "Failed to create PODs"
|
|
+#pod1=`$podman pod create`
|
|
+#echo "== pod1: $pod1" >> $here/$seq.full
|
|
+#pod2=`$podman pod create`
|
|
+#echo "== pod2: $pod2" >> $here/$seq.full
|
|
+#[ -z "$pod1" -o -z "$pod2" ] && _fail "Failed to create PODs"
|
|
|
|
# fetch new state, check for new containers and pods
|
|
echo "=== podman metric verification ==="
|
|
-pminfo --fetch podman | tee -a $here/$seq.full | _filter
|
|
+pminfo --fetch podman.container | tee -a $here/$seq.full | _filter
|
|
|
|
echo
|
|
echo "=== remove $iam agent ==="
|
|
diff -Naurp pcp-5.3.0.orig/qa/1358.out pcp-5.3.0/qa/1358.out
|
|
--- pcp-5.3.0.orig/qa/1358.out 2018-11-19 13:48:15.000000000 +1100
|
|
+++ pcp-5.3.0/qa/1358.out 2021-05-14 13:18:32.122079201 +1000
|
|
@@ -58,18 +58,6 @@ podman.container.stats.mem_perc
|
|
podman.container.stats.pids
|
|
inst [NNN or "CONTAINER"] value INTEGER
|
|
inst [NNN or "CONTAINER"] value INTEGER
|
|
-podman.pod.name
|
|
- inst [NNN or "POD"] value STRING
|
|
- inst [NNN or "POD"] value STRING
|
|
-podman.pod.cgroup
|
|
- inst [NNN or "POD"] value STRING
|
|
- inst [NNN or "POD"] value STRING
|
|
-podman.pod.status
|
|
- inst [NNN or "POD"] value STRING
|
|
- inst [NNN or "POD"] value STRING
|
|
-podman.pod.containers
|
|
- inst [NNN or "POD"] value INTEGER
|
|
- inst [NNN or "POD"] value INTEGER
|
|
|
|
=== remove podman agent ===
|
|
Culling the Performance Metrics Name Space ...
|
|
@@ -78,4 +66,3 @@ Updating the PMCD control file, and noti
|
|
[...removing files...]
|
|
Check podman metrics have gone away ... OK
|
|
== removing containers
|
|
-== removing pods
|
|
diff -Naurp pcp-5.3.0.orig/qa/917.out.in pcp-5.3.0/qa/917.out.in
|
|
--- pcp-5.3.0.orig/qa/917.out.in 2021-03-23 12:34:51.000000000 +1100
|
|
+++ pcp-5.3.0/qa/917.out.in 2021-05-14 13:18:32.122079201 +1000
|
|
@@ -22,6 +22,7 @@ Checking policies.
|
|
allow [init_t] [tmp_t] : [file] { open };
|
|
allow [init_t] [system_cronjob_t] : [dbus] { send_msg };
|
|
allow [pcp_pmcd_t] [user_home_t] : [file] { execute execute_no_trans };
|
|
+ allow [pcp_pmcd_t] [user_tmp_t] : [sock_file] { getattr write };
|
|
allow [pcp_pmcd_t] [debugfs_t] : [file] { append getattr ioctl open read write };
|
|
! allow [pcp_pmcd_t] [pcp_pmie_exec_t] : [file] { execute execute_no_trans open read map };
|
|
allow [pcp_pmcd_t] [pcp_var_lib_t] : [fifo_file] { getattr read open unlink };
|
|
diff -Naurp pcp-5.3.0.orig/qa/admin/other-packages/manifest pcp-5.3.0/qa/admin/other-packages/manifest
|
|
--- pcp-5.3.0.orig/qa/admin/other-packages/manifest 2021-02-17 15:27:41.000000000 +1100
|
|
+++ pcp-5.3.0/qa/admin/other-packages/manifest 2021-05-14 13:18:32.123079184 +1000
|
|
@@ -319,18 +319,6 @@ S_pkg? /usr/local/include/uv.h [N/A (bui
|
|
slackpkg? uv.h [N/A (build optional)]
|
|
pacman? /usr/include/uv.h [extra/libuv (build optional)]
|
|
brew? /usr/local/include/uv.h [libuv (build optional)]
|
|
-# -- libvarlink
|
|
-dpkg? varlink.h [N/A (build optional)]
|
|
-rpm? /usr/include/varlink.h [libvarlink-devel (build optional)]
|
|
-urpmi? /usr/include/varlink.h [libvarlink-devel (build optional)]
|
|
-emerge? varlink.h [N/A (build optional)]
|
|
-pkgin? varlink.h [N/A (build optional)]
|
|
-pkg_add? varlink.h [N/A (build optional)]
|
|
-F_pkg? varlink.h [N/A (build optional)]
|
|
-S_pkg? varlink.h [N/A (build optional)]
|
|
-slackpkg? varlink.h [N/A (build optional)]
|
|
-pacman? varlink.h [N/A (build optional)]
|
|
-brew? varlink.h [N/A (build optional)]
|
|
# -- liblzma
|
|
dpkg? /usr/include/lzma.h [liblzma-dev (build optional)]
|
|
rpm? /usr/include/lzma.h [xz-devel (build optional)]
|
|
diff -Naurp pcp-5.3.0.orig/qa/admin/other-packages/unavailable pcp-5.3.0/qa/admin/other-packages/unavailable
|
|
--- pcp-5.3.0.orig/qa/admin/other-packages/unavailable 2021-02-17 15:27:41.000000000 +1100
|
|
+++ pcp-5.3.0/qa/admin/other-packages/unavailable 2021-05-14 13:18:32.123079184 +1000
|
|
@@ -17,13 +17,13 @@
|
|
#-- ArchLinux
|
|
ArchLinux - - python-bcc qtchooser
|
|
#-- CentOS
|
|
-CentOS 8\.2\. - 389-ds 389-ds-base apache2 avahi-devel avahi-tools avahi-utils chan-devel Coin[0-9]-devel Coin-devel community-mysql cpan(YAML::LibYAML) cppcheck device-mapper-devel docker docker-common docker-io HdrHistogram_c-devel infiniband-diags-devel kubernetes-client kubernetes-node libavahi-devel libibumad-devel libqt5Core-devel libQt5Core-devel libqt5-qtbase-devel libqt5-qtsvg-devel libsqlite3 libvarlink-devel libvirt-python libvirt-python3 mariadb-client mozilla-nspr-devel mozilla-nss-devel mozilla-nss-tools net-tools-deprecated perl-base perl-DBD-mysql perl-Getopt-Std perl-ldap perl-List-MoreUtils perl-rrdtool perl-Spreadsheet-Read perl-Spreadsheet-ReadSXC perl-YAML-LibYAML pkg-config pkgconfig python36-libs python36-lxml python36-pillow python36-requests python36-setuptools python36-six python3-curses python3-devel python3-libvirt-python python3-openpyxl python3-Pillow python3-pyodbc python3-rtslib-fb qt4-devel qtchooser qt-devel realpath RediSearch sensors SoQt-devel system-python-libs zabbix22-agent zabbix-agent zfs-fuse
|
|
-CentOS 8\.[0-1] - 389-ds 389-ds-base apache2 avahi-devel avahi-tools avahi-utils chan-devel Coin[0-9]-devel Coin-devel cpan(YAML::LibYAML) cppcheck device-mapper-devel docker-common docker-io HdrHistogram_c-devel infiniband-diags-devel kubernetes-client kubernetes-node libavahi-devel libvarlink-devel mandoc perl-File-Slurp perl-Getopt-Std perl-JSON perl-ldap perl-List-MoreUtils perl-Spreadsheet-Read perl-Spreadsheet-ReadSXC perl-YAML-LibYAML pylint python36-devel python36-lxml python3-libvirt-python python3-openpyxl python3-Pillow python3-pyodbc python3-rtslib-fb python-prometheus_client qt4-devel qtchooser qt-devel sensors SoQt-devel statsd zabbix22-agent zabbix-agent zfs-fuse
|
|
-CentOS 7\.8 - apache2 avahi-utils bpftrace chan-devel Coin[0-9]-devel Coin-devel community-mysql coreutils-single docker-io git-core HdrHistogram_c-devel libavahi-devel libibumad-devel libqt5Core-devel libQt5Core-devel libqt5-qtbase-devel libqt5-qtsvg-devel libsqlite3 libvarlink-devel libvirt-python3 mariadb-client mozilla-nspr-devel mozilla-nss-devel mozilla-nss-tools mysql net-tools-deprecated perl-base perl-DBD-mysql perl-Getopt-Std perl-interpreter perl-ldap perl-rrdtool perl-Spreadsheet-Read perl-Spreadsheet-ReadSXC pkg-config pkgconf-pkg-config platform-python-devel platform-python-setuptools python36-devel python36-libs python36-setuptools python3-bcc python3-curses python3-elasticsearch python3-jsonpointer python3-libvirt python3-libvirt-python python3-lxml python3-openpyxl python3-pillow python3-Pillow python3-prometheus_client python3-pylint python3-pyodbc python3-requests python3-rtslib python3-rtslib-fb python3-six qt4-devel qtchooser realpath RediSearch sensors sqlite-libs system-python-libs zabbix-agent zfs-fuse
|
|
-CentOS 7\.7 - bpftrace chan-devel coreutils-single HdrHistogram_c-devel libvarlink-devel libvirt-python3 perl-Getopt-Std perl-Spreadsheet-Read perl-Spreadsheet-ReadSXC python2-openpyxl python3-bcc python3-elasticsearch python3-jsonpointer python3-libvirt python3-libvirt-python python3-lxml python3-openpyxl python3-pillow python3-Pillow python3-prometheus_client python3-psycopg2 python3-pyodbc python3-requests python3-rtslib python3-rtslib-fb python3-six python-openpyxl python-prometheus_client python-pylint qtchooser realpath redis-server system-python-libs zfs-fuse
|
|
-CentOS 7\.6 - apache2 avahi-utils bpftrace chan-devel Coin-devel community-mysql coreutils-single docker-io git-core HdrHistogram_c-devel libavahi-devel libibumad-devel libqt5Core-devel libQt5Core-devel libqt5-qtbase-devel libqt5-qtsvg-devel libsqlite3 libvarlink-devel libvirt-python3 mariadb-client mozilla-nspr-devel mozilla-nss-devel mozilla-nss-tools mysql net-tools-deprecated perl-base perl-DBD-mysql perl-Getopt-Std perl-interpreter perl-ldap perl-rrdtool perl-Spreadsheet-Read perl-Spreadsheet-ReadSXC pkg-config pkgconf-pkg-config platform-python-devel platform-python-setuptools python2-openpyxl python36-devel python36-libs python36-setuptools python3-bcc python3-curses python3-elasticsearch python3-jsonpointer python3-libvirt python3-libvirt-python python3-lxml python3-openpyxl python3-pillow python3-Pillow python3-prometheus_client python3-pylint python3-pyodbc python3-requests python3-rtslib python3-rtslib-fb python3-six python-openpyxl python-prometheus_client python-pylint qt4-devel qtchooser realpath RediSearch redis-server sensors sqlite-libs system-python-libs zabbix22-agent zabbix-agent zfs-fuse
|
|
-CentOS 7\.5 - bpftrace chan-devel coreutils-single HdrHistogram_c-devel libvarlink-devel libvirt-python3 perl-Getopt-Std perl-Spreadsheet-Read perl-Spreadsheet-ReadSXC python2-openpyxl python3-bcc python3-elasticsearch python3-jsonpointer python3-libvirt python3-libvirt-python python3-lxml python3-openpyxl python3-pillow python3-Pillow python3-prometheus_client python3-psycopg2 python3-pyodbc python3-requests python3-rtslib python3-rtslib-fb python3-six python-openpyxl python-prometheus_client python-pylint qtchooser realpath redis-server system-python-libs zfs-fuse
|
|
-CentOS 6\.10 - 389-ds apache2 avahi-utils bpftrace ccache chan-devel Coin[0-9]-devel Coin-devel community-mysql coreutils-single cppcheck docker docker-common docker-io git-core HdrHistogram_c-devel java-latest-openjdk-headless kubernetes-client kubernetes-node libavahi-devel libpfm-devel libqt5Core-devel libQt5Core-devel libqt5-qtbase-devel libqt5-qtsvg-devel libsqlite3 libuv-devel libvarlink-devel libvirt-daemon libvirt-daemon-driver-qemu mandoc mariadb mariadb-client mozilla-nspr-devel mozilla-nss-devel mozilla-nss-tools net-tools-deprecated perl-autodie perl-base perl-DBD-mysql perl-Getopt-Std perl-interpreter perl-ldap perl-Net-SNMP perl-rrdtool perl-Spreadsheet-Read perl-Spreadsheet-ReadSXC perl-Spreadsheet-WriteExcel perl-Spreadsheet-XLSX perl-Text-CSV_XS perl-YAML-LibYAML pkg-config pkgconf-pkg-config platform-python-devel platform-python-setuptools podman-docker pylint python2-devel python2-elasticsearch python2-jsonpointer python2-libs python2-libvirt python2-lxml python2-openpyxl python2-psycopg2 python2-pylint python2-requests python2-rtslib python2-rtslib-fb python2-setuptools python2-six python-curses python-elasticsearch python-libvirt-python python-openpyxl python-prometheus_client python-pylint qt4-devel qt5-qtbase-devel qt5-qtsvg-devel qtchooser ragel rdma-core-devel realpath redis RediSearch selinux-policy-devel sensors socat SoQt-devel sqlite-libs statsd systemd-devel system-python-libs uic zabbix22-agent zabbix-agent zfs-fuse
|
|
+CentOS 8\.2\. - 389-ds 389-ds-base apache2 avahi-devel avahi-tools avahi-utils chan-devel Coin[0-9]-devel Coin-devel community-mysql cpan(YAML::LibYAML) cppcheck device-mapper-devel docker docker-common docker-io HdrHistogram_c-devel infiniband-diags-devel kubernetes-client kubernetes-node libavahi-devel libibumad-devel libqt5Core-devel libQt5Core-devel libqt5-qtbase-devel libqt5-qtsvg-devel libsqlite3 libvirt-python libvirt-python3 mariadb-client mozilla-nspr-devel mozilla-nss-devel mozilla-nss-tools net-tools-deprecated perl-base perl-DBD-mysql perl-Getopt-Std perl-ldap perl-List-MoreUtils perl-rrdtool perl-Spreadsheet-Read perl-Spreadsheet-ReadSXC perl-YAML-LibYAML pkg-config pkgconfig python36-libs python36-lxml python36-pillow python36-requests python36-setuptools python36-six python3-curses python3-devel python3-libvirt-python python3-openpyxl python3-Pillow python3-pyodbc python3-rtslib-fb qt4-devel qtchooser qt-devel realpath RediSearch sensors SoQt-devel system-python-libs zabbix22-agent zabbix-agent zfs-fuse
|
|
+CentOS 8\.[0-1] - 389-ds 389-ds-base apache2 avahi-devel avahi-tools avahi-utils chan-devel Coin[0-9]-devel Coin-devel cpan(YAML::LibYAML) cppcheck device-mapper-devel docker-common docker-io HdrHistogram_c-devel infiniband-diags-devel kubernetes-client kubernetes-node libavahi-devel mandoc perl-File-Slurp perl-Getopt-Std perl-JSON perl-ldap perl-List-MoreUtils perl-Spreadsheet-Read perl-Spreadsheet-ReadSXC perl-YAML-LibYAML pylint python36-devel python36-lxml python3-libvirt-python python3-openpyxl python3-Pillow python3-pyodbc python3-rtslib-fb python-prometheus_client qt4-devel qtchooser qt-devel sensors SoQt-devel statsd zabbix22-agent zabbix-agent zfs-fuse
|
|
+CentOS 7\.8 - apache2 avahi-utils bpftrace chan-devel Coin[0-9]-devel Coin-devel community-mysql coreutils-single docker-io git-core HdrHistogram_c-devel libavahi-devel libibumad-devel libqt5Core-devel libQt5Core-devel libqt5-qtbase-devel libqt5-qtsvg-devel libsqlite3 libvirt-python3 mariadb-client mozilla-nspr-devel mozilla-nss-devel mozilla-nss-tools mysql net-tools-deprecated perl-base perl-DBD-mysql perl-Getopt-Std perl-interpreter perl-ldap perl-rrdtool perl-Spreadsheet-Read perl-Spreadsheet-ReadSXC pkg-config pkgconf-pkg-config platform-python-devel platform-python-setuptools python36-devel python36-libs python36-setuptools python3-bcc python3-curses python3-elasticsearch python3-jsonpointer python3-libvirt python3-libvirt-python python3-lxml python3-openpyxl python3-pillow python3-Pillow python3-prometheus_client python3-pylint python3-pyodbc python3-requests python3-rtslib python3-rtslib-fb python3-six qt4-devel qtchooser realpath RediSearch sensors sqlite-libs system-python-libs zabbix-agent zfs-fuse
|
|
+CentOS 7\.7 - bpftrace chan-devel coreutils-single HdrHistogram_c-devel libvirt-python3 perl-Getopt-Std perl-Spreadsheet-Read perl-Spreadsheet-ReadSXC python2-openpyxl python3-bcc python3-elasticsearch python3-jsonpointer python3-libvirt python3-libvirt-python python3-lxml python3-openpyxl python3-pillow python3-Pillow python3-prometheus_client python3-psycopg2 python3-pyodbc python3-requests python3-rtslib python3-rtslib-fb python3-six python-openpyxl python-prometheus_client python-pylint qtchooser realpath redis-server system-python-libs zfs-fuse
|
|
+CentOS 7\.6 - apache2 avahi-utils bpftrace chan-devel Coin-devel community-mysql coreutils-single docker-io git-core HdrHistogram_c-devel libavahi-devel libibumad-devel libqt5Core-devel libQt5Core-devel libqt5-qtbase-devel libqt5-qtsvg-devel libsqlite3 libvirt-python3 mariadb-client mozilla-nspr-devel mozilla-nss-devel mozilla-nss-tools mysql net-tools-deprecated perl-base perl-DBD-mysql perl-Getopt-Std perl-interpreter perl-ldap perl-rrdtool perl-Spreadsheet-Read perl-Spreadsheet-ReadSXC pkg-config pkgconf-pkg-config platform-python-devel platform-python-setuptools python2-openpyxl python36-devel python36-libs python36-setuptools python3-bcc python3-curses python3-elasticsearch python3-jsonpointer python3-libvirt python3-libvirt-python python3-lxml python3-openpyxl python3-pillow python3-Pillow python3-prometheus_client python3-pylint python3-pyodbc python3-requests python3-rtslib python3-rtslib-fb python3-six python-openpyxl python-prometheus_client python-pylint qt4-devel qtchooser realpath RediSearch redis-server sensors sqlite-libs system-python-libs zabbix22-agent zabbix-agent zfs-fuse
|
|
+CentOS 7\.5 - bpftrace chan-devel coreutils-single HdrHistogram_c-devel libvirt-python3 perl-Getopt-Std perl-Spreadsheet-Read perl-Spreadsheet-ReadSXC python2-openpyxl python3-bcc python3-elasticsearch python3-jsonpointer python3-libvirt python3-libvirt-python python3-lxml python3-openpyxl python3-pillow python3-Pillow python3-prometheus_client python3-psycopg2 python3-pyodbc python3-requests python3-rtslib python3-rtslib-fb python3-six python-openpyxl python-prometheus_client python-pylint qtchooser realpath redis-server system-python-libs zfs-fuse
|
|
+CentOS 6\.10 - 389-ds apache2 avahi-utils bpftrace ccache chan-devel Coin[0-9]-devel Coin-devel community-mysql coreutils-single cppcheck docker docker-common docker-io git-core HdrHistogram_c-devel java-latest-openjdk-headless kubernetes-client kubernetes-node libavahi-devel libpfm-devel libqt5Core-devel libQt5Core-devel libqt5-qtbase-devel libqt5-qtsvg-devel libsqlite3 libuv-devel libvirt-daemon libvirt-daemon-driver-qemu mandoc mariadb mariadb-client mozilla-nspr-devel mozilla-nss-devel mozilla-nss-tools net-tools-deprecated perl-autodie perl-base perl-DBD-mysql perl-Getopt-Std perl-interpreter perl-ldap perl-Net-SNMP perl-rrdtool perl-Spreadsheet-Read perl-Spreadsheet-ReadSXC perl-Spreadsheet-WriteExcel perl-Spreadsheet-XLSX perl-Text-CSV_XS perl-YAML-LibYAML pkg-config pkgconf-pkg-config platform-python-devel platform-python-setuptools podman-docker pylint python2-devel python2-elasticsearch python2-jsonpointer python2-libs python2-libvirt python2-lxml python2-openpyxl python2-psycopg2 python2-pylint python2-requests python2-rtslib python2-rtslib-fb python2-setuptools python2-six python-curses python-elasticsearch python-libvirt-python python-openpyxl python-prometheus_client python-pylint qt4-devel qt5-qtbase-devel qt5-qtsvg-devel qtchooser ragel rdma-core-devel realpath redis RediSearch selinux-policy-devel sensors socat SoQt-devel sqlite-libs statsd systemd-devel system-python-libs uic zabbix22-agent zabbix-agent zfs-fuse
|
|
#-- Debian
|
|
# Version Code Name
|
|
# 6 squeeze
|
|
@@ -60,22 +60,22 @@ OpenBSD 6\.7 - libibumad
|
|
OpenBSD 6\.4 - libibumad libvirt-python3 py3-bcc py3-openpyxl py3-prometheus-client py3-jsonpointer qtchooser realpath
|
|
OpenBSD 6\.3 - avahi-tools avahi-utils libibumad libvirt-python3 py3-bcc py3-elasticsearch py3-openpyxl py3-prometheus-client py3-jsonpointer qtchooser realpath
|
|
#-- openSUSE
|
|
-openSUSE 15\.[01] - 389-ds-base avahi-devel avahi-tools chan-devel community-mysql coreutils-single docker-common docker-io HdrHistogram_c-devel kubernetes-client kubernetes-node libvarlink-devel libvirt-python libvirt-python3 mysql perl-DBD-MySQL perl-Getopt-Std perl-LDAP perl-Spreadsheet-WriteExcel perl-XML-TokeParser podman-docker pylint python2-libs python2-libvirt python2-rtslib python36-devel python3-libvirt python3-pillow python3-rtslib python-libs python-pylint python-rtslib python-setuptools qt5-qtsvg-devel qtchooser selinux-policy selinux-policy-devel selinux-policy-targeted statsd zabbix22-agent zabbix-agent zfs-fuse
|
|
+openSUSE 15\.[01] - 389-ds-base avahi-devel avahi-tools chan-devel community-mysql coreutils-single docker-common docker-io HdrHistogram_c-devel kubernetes-client kubernetes-node libvirt-python libvirt-python3 mysql perl-DBD-MySQL perl-Getopt-Std perl-LDAP perl-Spreadsheet-WriteExcel perl-XML-TokeParser podman-docker pylint python2-libs python2-libvirt python2-rtslib python36-devel python3-libvirt python3-pillow python3-rtslib python-libs python-pylint python-rtslib python-setuptools qt5-qtsvg-devel qtchooser selinux-policy selinux-policy-devel selinux-policy-targeted statsd zabbix22-agent zabbix-agent zfs-fuse
|
|
openSUSE 15.0 - coreutils-single perl-Getopt-Std podman-docker python3-pyodbc
|
|
-openSUSE 42\.2 - Coin[0-9]-devel Coin-devel coreutils-single docker-io libvarlink-devel libvirt-python3 perl-Getopt-Std podman-docker pylint python2-pylint python3-elasticsearch python3-jsonpointer python3-libvirt python3-libvirt-python python3-pillow python3-rtslib python3-rtslib-fb python-pylint qtchooser selinux-policy selinux-policy-devel selinux-policy-targeted SoQt-devel zabbix22-agent zabbix-agent
|
|
-openSUSE 42\.3 - coreutils-single docker-io libvarlink-devel libvirt-python3 perl-Getopt-Std podman-docker pylint python2-pylint python3-elasticsearch python3-jsonpointer python3-libvirt python3-libvirt-python python3-pillow python3-rtslib python3-rtslib-fb qtchooser zabbix22-agent zabbix-agent
|
|
+openSUSE 42\.2 - Coin[0-9]-devel Coin-devel coreutils-single docker-io libvirt-python3 perl-Getopt-Std podman-docker pylint python2-pylint python3-elasticsearch python3-jsonpointer python3-libvirt python3-libvirt-python python3-pillow python3-rtslib python3-rtslib-fb python-pylint qtchooser selinux-policy selinux-policy-devel selinux-policy-targeted SoQt-devel zabbix22-agent zabbix-agent
|
|
+openSUSE 42\.3 - coreutils-single docker-io libvirt-python3 perl-Getopt-Std podman-docker pylint python2-pylint python3-elasticsearch python3-jsonpointer python3-libvirt python3-libvirt-python python3-pillow python3-rtslib python3-rtslib-fb qtchooser zabbix22-agent zabbix-agent
|
|
#-- Slackware
|
|
Slackware 14\.2 - cppcheck pylint python-psycopg2 socat valgrind mandoc
|
|
#-- SuSE SLES
|
|
-SUSE 12-SP0 - 389-ds 389-ds-base Coin[0-9]-devel Coin-devel coreutils-single cppcheck gfs2-utils kubernetes-client kubernetes-node libqt5-qtsvg-devel libuv-devel libvarlink-devel libvirt-python3 memcached perl-Getopt-Std python36-libs python36-six python3-bcc python3-curses python3-elasticsearch python3-jsonpointer python3-libs python3-libvirt python3-libvirt-python python3-lxml python3-openpyxl python3-pillow python3-Pillow python3-prometheus_client python3-psycopg2 python3-requests python3-rtslib python3-rtslib-fb python3-six qt5-qtbase-devel qt5-qtsvg-devel qtchooser SoQt-devel system-python-libs yajl zabbix22-agent zabbix-agent
|
|
-SUSE 12-SP4 - 389-ds 389-ds-base chan-devel Coin[0-9]-devel Coin-devel coreutils-single cppcheck gfs2-utils HdrHistogram_c-devel kubernetes-client kubernetes-node libuv-devel libvarlink-devel libvirt-python3 perl-Getopt-Std python36-libs python36-six python3-bcc python3-elasticsearch python3-jsonpointer python3-libs python3-libvirt python3-libvirt-python python3-openpyxl python3-pillow python3-Pillow python3-prometheus_client python3-psycopg2 python3-rtslib python3-rtslib-fb qt5-qtbase-devel qt5-qtsvg-devel qtchooser selinux-policy-targeted SoQt-devel statsd system-python-libs yajl zabbix22-agent zabbix-agent zfs-fuse
|
|
+SUSE 12-SP0 - 389-ds 389-ds-base Coin[0-9]-devel Coin-devel coreutils-single cppcheck gfs2-utils kubernetes-client kubernetes-node libqt5-qtsvg-devel libuv-devel libvirt-python3 memcached perl-Getopt-Std python36-libs python36-six python3-bcc python3-curses python3-elasticsearch python3-jsonpointer python3-libs python3-libvirt python3-libvirt-python python3-lxml python3-openpyxl python3-pillow python3-Pillow python3-prometheus_client python3-psycopg2 python3-requests python3-rtslib python3-rtslib-fb python3-six qt5-qtbase-devel qt5-qtsvg-devel qtchooser SoQt-devel system-python-libs yajl zabbix22-agent zabbix-agent
|
|
+SUSE 12-SP4 - 389-ds 389-ds-base chan-devel Coin[0-9]-devel Coin-devel coreutils-single cppcheck gfs2-utils HdrHistogram_c-devel kubernetes-client kubernetes-node libuv-devel libvirt-python3 perl-Getopt-Std python36-libs python36-six python3-bcc python3-elasticsearch python3-jsonpointer python3-libs python3-libvirt python3-libvirt-python python3-openpyxl python3-pillow python3-Pillow python3-prometheus_client python3-psycopg2 python3-rtslib python3-rtslib-fb qt5-qtbase-devel qt5-qtsvg-devel qtchooser selinux-policy-targeted SoQt-devel statsd system-python-libs yajl zabbix22-agent zabbix-agent zfs-fuse
|
|
#-- RedHat
|
|
-RHEL 8\.2 - 389-ds 389-ds-base apache2 avahi-devel avahi-tools avahi-utils chan-devel Coin[0-9]-devel Coin-devel community-mysql cpan(YAML::LibYAML) cppcheck device-mapper-devel docker docker-common docker-io HdrHistogram_c-devel infiniband-diags-devel kubernetes-client kubernetes-node libavahi-devel libibmad-devel libibumad-devel libqt5Core-devel libQt5Core-devel libqt5-qtbase-devel libqt5-qtsvg-devel libsqlite3 libvarlink-devel libvirt-python libvirt-python3 mariadb-client mozilla-nspr-devel mozilla-nss-devel mozilla-nss-tools net-tools-deprecated perl-base perl-DBD-mysql perl-Getopt-Std perl-ldap perl-List-MoreUtils perl-rrdtool perl-Spreadsheet-Read perl-Spreadsheet-ReadSXC perl-YAML-LibYAML pkg-config pkgconfig python36-libs python36-lxml python36-pillow python36-requests python36-setuptools python36-six python3-curses python3-devel python3-libvirt-python python3-openpyxl python3-Pillow python3-pyodbc python3-rtslib-fb qt4-devel qtchooser qt-devel realpath RediSearch sensors SoQt-devel system-python-libs zabbix22-agent zabbix-agent zfs-fuse
|
|
-RHEL 8\.[0-1] - 389-ds 389-ds-base apache2 avahi-devel avahi-tools avahi-utils chan-devel Coin[0-9]-devel Coin-devel cpan(YAML::LibYAML) cppcheck device-mapper-devel docker-common docker-io HdrHistogram_c-devel infiniband-diags-devel kubernetes-client kubernetes-node libavahi-devel libibmad-devel libvarlink-devel mandoc perl-File-Slurp perl-Getopt-Std perl-JSON perl-ldap perl-List-MoreUtils perl-Spreadsheet-Read perl-Spreadsheet-ReadSXC perl-YAML-LibYAML pylint python36-devel python36-lxml python3-libvirt-python python3-openpyxl python3-Pillow python3-pyodbc python3-rtslib-fb python-prometheus_client qt4-devel qtchooser qt-devel sensors SoQt-devel statsd zabbix22-agent zabbix-agent zfs-fuse python2-pylint
|
|
-RHEL 7\.9 - apache2 avahi-utils bpftrace chan-devel Coin[0-9]-devel Coin-devel community-mysql docker-io git-core HdrHistogram_c-devel libavahi-devel libqt5Core-devel libQt5Core-devel libqt5-qtbase-devel libqt5-qtsvg-devel libsqlite3 libvarlink-devel mariadb-client mozilla-nspr-devel mozilla-nss-devel mozilla-nss-tools mysql net-tools-deprecated perl-base perl-DBD-mysql perl-Getopt-Std perl-interpreter perl-ldap perl-rrdtool perl-Spreadsheet-Read perl-Spreadsheet-ReadSXC pkg-config pkgconf-pkg-config platform-python-devel platform-python-setuptools qt4-devel qtchooser realpath RediSearch sensors sqlite-libs system-python-libs zabbix-agent zfs-fuse zabbix22-agent python2-openpyxl python2-elasticsearch python-pylint python-prometheus_client python-openpyxl avahi-devel avahi-tools device-mapper-devel infiniband-diags-devel python2-jsonpointer python2-setuptools python2-libvirt python-libvirt-python python2-lxml python2-psycopg2 setools python-curses python2-libs python2-devel podman-docker coreutils-single python2-rtslib-fb python2-rtslib
|
|
-RHEL 7\.8 - apache2 avahi-utils bpftrace chan-devel Coin[0-9]-devel Coin-devel community-mysql docker-io git-core HdrHistogram_c-devel kubernetes-client libavahi-devel libibumad-devel libqt5Core-devel libQt5Core-devel libqt5-qtbase-devel libqt5-qtsvg-devel libsqlite3 libvarlink-devel mariadb-client mozilla-nspr-devel mozilla-nss-devel mozilla-nss-tools mysql net-tools-deprecated perl-base perl-DBD-mysql perl-Getopt-Std perl-interpreter perl-ldap perl-rrdtool perl-Spreadsheet-Read perl-Spreadsheet-ReadSXC pkg-config pkgconf-pkg-config platform-python-devel platform-python-setuptools qt4-devel qtchooser realpath RediSearch sensors sqlite-libs system-python-libs zabbix-agent zfs-fuse
|
|
-RHEL 7\.[5-7] - chan-devel Coin[0-9]-devel Coin-devel cppcheck device-mapper-devel HdrHistogram_c-devel kubernetes-client libvarlink-devel openssl-devel perl-Getopt-Std perl-Spreadsheet-Read perl-Spreadsheet-ReadSXC perl-YAML-LibYAML pylint python2-elasticsearch python2-openpyxl python2-prometheus_client python2-pylint python-elasticsearch python-openpyxl python-prometheus_client python-pylint qtchooser ruby SoQt-devel statsd system-python-libs zabbix22-agent zabbix-agent zfs-fuse
|
|
-RHEL 6\.10 - apache2 avahi-utils bpftrace chan-devel Coin[0-9]-devel Coin-devel community-mysql coreutils-single device-mapper-devel docker-common docker-io git-core HdrHistogram_c-devel infiniband-diags-devel java-latest-openjdk-headless kubernetes-client kubernetes-node libavahi-devel libicu-devel libpfm-devel libqt5Core-devel libQt5Core-devel libqt5-qtbase-devel libqt5-qtsvg-devel libsqlite3 libvarlink-devel libvirt-daemon libvirt-daemon-driver-qemu mandoc mariadb mariadb-client mozilla-nspr-devel mozilla-nss-devel mozilla-nss-tools net-tools-deprecated perl-autodie perl-base perl-DBD-mysql perl-Getopt-Std perl-ldap perl-rrdtool perl-Spreadsheet-Read perl-Spreadsheet-ReadSXC pkg-config pkg-configmandoc pkgconf-pkg-config platform-python-devel platform-python-setuptools podman-docker pylint python2-devel python2-elasticsearch python2-jsonpointer python2-libs python2-libvirt python2-lxml python2-openpyxl python2-psycopg2 python2-pylint python2-rtslib python2-rtslib-fb python-curses python-libvirt-python python-openpyxl python-prometheus_client python-pylint qt4-devel qtchooser ragel rdma-core-devel realpath RediSearch selinux-policy-devel sensors setools sqlite-libs systemd-devel system-python-libs uic xfsprogs
|
|
+RHEL 8\.2 - 389-ds 389-ds-base apache2 avahi-devel avahi-tools avahi-utils chan-devel Coin[0-9]-devel Coin-devel community-mysql cpan(YAML::LibYAML) cppcheck device-mapper-devel docker docker-common docker-io HdrHistogram_c-devel infiniband-diags-devel kubernetes-client kubernetes-node libavahi-devel libibmad-devel libibumad-devel libqt5Core-devel libQt5Core-devel libqt5-qtbase-devel libqt5-qtsvg-devel libsqlite3 libvirt-python libvirt-python3 mariadb-client mozilla-nspr-devel mozilla-nss-devel mozilla-nss-tools net-tools-deprecated perl-base perl-DBD-mysql perl-Getopt-Std perl-ldap perl-List-MoreUtils perl-rrdtool perl-Spreadsheet-Read perl-Spreadsheet-ReadSXC perl-YAML-LibYAML pkg-config pkgconfig python36-libs python36-lxml python36-pillow python36-requests python36-setuptools python36-six python3-curses python3-devel python3-libvirt-python python3-openpyxl python3-Pillow python3-pyodbc python3-rtslib-fb qt4-devel qtchooser qt-devel realpath RediSearch sensors SoQt-devel system-python-libs zabbix22-agent zabbix-agent zfs-fuse
|
|
+RHEL 8\.[0-1] - 389-ds 389-ds-base apache2 avahi-devel avahi-tools avahi-utils chan-devel Coin[0-9]-devel Coin-devel cpan(YAML::LibYAML) cppcheck device-mapper-devel docker-common docker-io HdrHistogram_c-devel infiniband-diags-devel kubernetes-client kubernetes-node libavahi-devel libibmad-devel mandoc perl-File-Slurp perl-Getopt-Std perl-JSON perl-ldap perl-List-MoreUtils perl-Spreadsheet-Read perl-Spreadsheet-ReadSXC perl-YAML-LibYAML pylint python36-devel python36-lxml python3-libvirt-python python3-openpyxl python3-Pillow python3-pyodbc python3-rtslib-fb python-prometheus_client qt4-devel qtchooser qt-devel sensors SoQt-devel statsd zabbix22-agent zabbix-agent zfs-fuse python2-pylint
|
|
+RHEL 7\.9 - apache2 avahi-utils bpftrace chan-devel Coin[0-9]-devel Coin-devel community-mysql docker-io git-core HdrHistogram_c-devel libavahi-devel libqt5Core-devel libQt5Core-devel libqt5-qtbase-devel libqt5-qtsvg-devel libsqlite3 mariadb-client mozilla-nspr-devel mozilla-nss-devel mozilla-nss-tools mysql net-tools-deprecated perl-base perl-DBD-mysql perl-Getopt-Std perl-interpreter perl-ldap perl-rrdtool perl-Spreadsheet-Read perl-Spreadsheet-ReadSXC pkg-config pkgconf-pkg-config platform-python-devel platform-python-setuptools qt4-devel qtchooser realpath RediSearch sensors sqlite-libs system-python-libs zabbix-agent zfs-fuse zabbix22-agent python2-openpyxl python2-elasticsearch python-pylint python-prometheus_client python-openpyxl avahi-devel avahi-tools device-mapper-devel infiniband-diags-devel python2-jsonpointer python2-setuptools python2-libvirt python-libvirt-python python2-lxml python2-psycopg2 setools python-curses python2-libs python2-devel podman-docker coreutils-single python2-rtslib-fb python2-rtslib
|
|
+RHEL 7\.8 - apache2 avahi-utils bpftrace chan-devel Coin[0-9]-devel Coin-devel community-mysql docker-io git-core HdrHistogram_c-devel kubernetes-client libavahi-devel libibumad-devel libqt5Core-devel libQt5Core-devel libqt5-qtbase-devel libqt5-qtsvg-devel libsqlite3 mariadb-client mozilla-nspr-devel mozilla-nss-devel mozilla-nss-tools mysql net-tools-deprecated perl-base perl-DBD-mysql perl-Getopt-Std perl-interpreter perl-ldap perl-rrdtool perl-Spreadsheet-Read perl-Spreadsheet-ReadSXC pkg-config pkgconf-pkg-config platform-python-devel platform-python-setuptools qt4-devel qtchooser realpath RediSearch sensors sqlite-libs system-python-libs zabbix-agent zfs-fuse
|
|
+RHEL 7\.[5-7] - chan-devel Coin[0-9]-devel Coin-devel cppcheck device-mapper-devel HdrHistogram_c-devel kubernetes-client openssl-devel perl-Getopt-Std perl-Spreadsheet-Read perl-Spreadsheet-ReadSXC perl-YAML-LibYAML pylint python2-elasticsearch python2-openpyxl python2-prometheus_client python2-pylint python-elasticsearch python-openpyxl python-prometheus_client python-pylint qtchooser ruby SoQt-devel statsd system-python-libs zabbix22-agent zabbix-agent zfs-fuse
|
|
+RHEL 6\.10 - apache2 avahi-utils bpftrace chan-devel Coin[0-9]-devel Coin-devel community-mysql coreutils-single device-mapper-devel docker-common docker-io git-core HdrHistogram_c-devel infiniband-diags-devel java-latest-openjdk-headless kubernetes-client kubernetes-node libavahi-devel libicu-devel libpfm-devel libqt5Core-devel libQt5Core-devel libqt5-qtbase-devel libqt5-qtsvg-devel libsqlite3 libvirt-daemon libvirt-daemon-driver-qemu mandoc mariadb mariadb-client mozilla-nspr-devel mozilla-nss-devel mozilla-nss-tools net-tools-deprecated perl-autodie perl-base perl-DBD-mysql perl-Getopt-Std perl-ldap perl-rrdtool perl-Spreadsheet-Read perl-Spreadsheet-ReadSXC pkg-config pkg-configmandoc pkgconf-pkg-config platform-python-devel platform-python-setuptools podman-docker pylint python2-devel python2-elasticsearch python2-jsonpointer python2-libs python2-libvirt python2-lxml python2-openpyxl python2-psycopg2 python2-pylint python2-rtslib python2-rtslib-fb python-curses python-libvirt-python python-openpyxl python-prometheus_client python-pylint qt4-devel qtchooser ragel rdma-core-devel realpath RediSearch selinux-policy-devel sensors setools sqlite-libs systemd-devel system-python-libs uic xfsprogs
|
|
#-- Ubuntu
|
|
Ubuntu 20\.04 - apache2-mpm-worker avahi-tools kubernetes-client libicu libpython-dev libqt4-dev libreadline6-dev libsoqt4-dev libsoqt-dev libsoqt-dev-common libuv-dev mariadb-client-core mysql-client-core perl-modules qt4-qmake realpath redis-cli
|
|
Ubuntu 19\.10 - kubernetes-client libreadline6-dev libsoqt5-dev libsoqt-dev-common redis-tools
|
|
diff -Naurp pcp-5.3.0.orig/qa/admin/package-lists/Fedora+31+x86_64 pcp-5.3.0/qa/admin/package-lists/Fedora+31+x86_64
|
|
--- pcp-5.3.0.orig/qa/admin/package-lists/Fedora+31+x86_64 2021-02-17 15:27:41.000000000 +1100
|
|
+++ pcp-5.3.0/qa/admin/package-lists/Fedora+31+x86_64 2021-05-14 13:18:32.123079184 +1000
|
|
@@ -47,7 +47,6 @@ kubernetes-client
|
|
libicu-devel
|
|
libpfm-devel
|
|
libuv-devel
|
|
-libvarlink-devel
|
|
libvirt-daemon
|
|
libvirt-daemon-driver-qemu
|
|
lm_sensors
|
|
diff -Naurp pcp-5.3.0.orig/qa/admin/package-lists/Fedora+32+x86_64 pcp-5.3.0/qa/admin/package-lists/Fedora+32+x86_64
|
|
--- pcp-5.3.0.orig/qa/admin/package-lists/Fedora+32+x86_64 2021-02-17 15:27:41.000000000 +1100
|
|
+++ pcp-5.3.0/qa/admin/package-lists/Fedora+32+x86_64 2021-05-14 13:18:32.123079184 +1000
|
|
@@ -46,7 +46,6 @@ kubernetes-client
|
|
libicu-devel
|
|
libpfm-devel
|
|
libuv-devel
|
|
-libvarlink-devel
|
|
libvirt-daemon
|
|
libvirt-daemon-driver-qemu
|
|
lm_sensors
|
|
diff -Naurp pcp-5.3.0.orig/qa/admin/package-lists/Fedora+33+x86_64 pcp-5.3.0/qa/admin/package-lists/Fedora+33+x86_64
|
|
--- pcp-5.3.0.orig/qa/admin/package-lists/Fedora+33+x86_64 2021-02-17 15:27:41.000000000 +1100
|
|
+++ pcp-5.3.0/qa/admin/package-lists/Fedora+33+x86_64 2021-05-14 13:18:32.123079184 +1000
|
|
@@ -57,7 +57,6 @@ libibumad-devel
|
|
libicu-devel
|
|
libpfm-devel
|
|
libuv-devel
|
|
-libvarlink-devel
|
|
libvirt-daemon
|
|
libvirt-daemon-driver-qemu
|
|
libvirt-python3
|
|
diff -Naurp pcp-5.3.0.orig/qa/admin/package-lists/Fedora+34+x86_64 pcp-5.3.0/qa/admin/package-lists/Fedora+34+x86_64
|
|
--- pcp-5.3.0.orig/qa/admin/package-lists/Fedora+34+x86_64 2021-02-17 15:27:41.000000000 +1100
|
|
+++ pcp-5.3.0/qa/admin/package-lists/Fedora+34+x86_64 2021-05-14 13:18:32.123079184 +1000
|
|
@@ -46,7 +46,6 @@ kubernetes-client
|
|
libicu-devel
|
|
libpfm-devel
|
|
libuv-devel
|
|
-libvarlink-devel
|
|
libvirt-daemon
|
|
libvirt-daemon-driver-qemu
|
|
lm_sensors
|
|
diff -Naurp pcp-5.3.0.orig/qa/admin/package-lists/Fedora+35+x86_64 pcp-5.3.0/qa/admin/package-lists/Fedora+35+x86_64
|
|
--- pcp-5.3.0.orig/qa/admin/package-lists/Fedora+35+x86_64 2021-02-17 15:27:41.000000000 +1100
|
|
+++ pcp-5.3.0/qa/admin/package-lists/Fedora+35+x86_64 2021-05-14 13:18:32.123079184 +1000
|
|
@@ -46,7 +46,6 @@ kubernetes-client
|
|
libicu-devel
|
|
libpfm-devel
|
|
libuv-devel
|
|
-libvarlink-devel
|
|
libvirt-daemon
|
|
libvirt-daemon-driver-qemu
|
|
lm_sensors
|
|
diff -Naurp pcp-5.3.0.orig/qa/common.containers pcp-5.3.0/qa/common.containers
|
|
--- pcp-5.3.0.orig/qa/common.containers 2018-11-19 13:48:15.000000000 +1100
|
|
+++ pcp-5.3.0/qa/common.containers 2021-05-14 13:18:32.123079184 +1000
|
|
@@ -25,7 +25,7 @@ _check_podman_binary()
|
|
[ $? -eq 0 ] || _notrun "No podman binary found"
|
|
podman="$sudo $podman"
|
|
|
|
- $sudo test -S /run/podman/io.podman || _notrun "no podman varlink socket"
|
|
+ $sudo test -f "$PCP_SYSTEMDUNIT_DIR/podman.socket" || _notrun "No podman REST API service found"
|
|
}
|
|
|
|
_check_docker_binary()
|
|
diff -Naurp pcp-5.3.0.orig/src/include/builddefs.in pcp-5.3.0/src/include/builddefs.in
|
|
--- pcp-5.3.0.orig/src/include/builddefs.in 2021-04-01 14:24:05.000000000 +1100
|
|
+++ pcp-5.3.0/src/include/builddefs.in 2021-05-14 13:18:32.123079184 +1000
|
|
@@ -346,8 +346,6 @@ HAVE_LIBUV = @HAVE_LIBUV@
|
|
LIB_FOR_LIBUV = @libuv_LIBS@
|
|
HAVE_OPENSSL = @HAVE_OPENSSL@
|
|
LIB_FOR_OPENSSL = @openssl_LIBS@
|
|
-HAVE_LIBVARLINK = @HAVE_LIBVARLINK@
|
|
-LIB_FOR_LIBVARLINK = @libvarlink_LIBS@
|
|
HAVE_NCURSES = @HAVE_NCURSES@
|
|
LIB_FOR_NCURSES = @ncurses_LIBS@
|
|
HAVE_NCURSESW = @HAVE_NCURSESW@
|
|
diff -Naurp pcp-5.3.0.orig/src/libpcp_web/src/http_client.c pcp-5.3.0/src/libpcp_web/src/http_client.c
|
|
--- pcp-5.3.0.orig/src/libpcp_web/src/http_client.c 2021-02-17 15:27:41.000000000 +1100
|
|
+++ pcp-5.3.0/src/libpcp_web/src/http_client.c 2021-05-14 13:18:32.124079167 +1000
|
|
@@ -1,5 +1,5 @@
|
|
/*
|
|
- * Copyright (c) 2014,2016-2017,2020 Red Hat.
|
|
+ * Copyright (c) 2014,2016-2017,2020-2021 Red Hat.
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Library General Public
|
|
@@ -501,7 +501,7 @@ on_header_value(http_parser *pp, const c
|
|
if (length + 1 > cp->type_length) {
|
|
cp->error_code = -E2BIG;
|
|
if (pmDebugOptions.http)
|
|
- fprintf(stderr, "on_header_value: Setting error E2BIG");
|
|
+ fprintf(stderr, "on_header_value: Setting error E2BIG\n");
|
|
return 1;
|
|
}
|
|
strncpy(cp->type_buffer, offset, length);
|
|
@@ -523,7 +523,7 @@ on_body(http_parser *pp, const char *off
|
|
if (length > cp->body_length - cp->offset) {
|
|
cp->error_code = -E2BIG;
|
|
if (pmDebugOptions.http)
|
|
- fprintf(stderr, "on_body: Setting error E2BIG");
|
|
+ fprintf(stderr, "on_body: Setting error E2BIG\n");
|
|
return 1;
|
|
}
|
|
strncpy(cp->body_buffer + cp->offset, offset, length);
|
|
@@ -595,7 +595,7 @@ http_client_response(http_client *cp)
|
|
return sts ? sts : -EAGAIN;
|
|
}
|
|
if (pmDebugOptions.http)
|
|
- fprintf(stderr, "http_client error code=%d", cp->error_code);
|
|
+ fprintf(stderr, "http_client_response error code=%d\n", cp->error_code);
|
|
|
|
bytes = http_parser_execute(&cp->parser, &settings, buffer, sts);
|
|
if (pmDebugOptions.http) {
|
|
@@ -604,7 +604,7 @@ http_client_response(http_client *cp)
|
|
fprintf(stderr, "While loop condition=%d\n", (bytes && !(cp->flags & F_MESSAGE_END)));
|
|
}
|
|
|
|
- } while (bytes && !(cp->flags & F_MESSAGE_END));
|
|
+ } while (bytes && !cp->error_code && !(cp->flags & F_MESSAGE_END));
|
|
|
|
if (http_should_client_disconnect(cp))
|
|
http_client_disconnect(cp);
|
|
@@ -650,6 +650,7 @@ void
|
|
pmhttpFreeClient(http_client *cp)
|
|
{
|
|
http_client_disconnect(cp);
|
|
+ free(cp->url);
|
|
free(cp);
|
|
}
|
|
|
|
diff -Naurp pcp-5.3.0.orig/src/pmdas/podman/context.c pcp-5.3.0/src/pmdas/podman/context.c
|
|
--- pcp-5.3.0.orig/src/pmdas/podman/context.c 2018-11-19 13:48:15.000000000 +1100
|
|
+++ pcp-5.3.0/src/pmdas/podman/context.c 1970-01-01 10:00:00.000000000 +1000
|
|
@@ -1,100 +0,0 @@
|
|
-/*
|
|
- * Copyright (c) 2018 Red Hat.
|
|
- *
|
|
- * This program is free software; you can redistribute it and/or modify it
|
|
- * under the terms of the GNU General Public License as published by the
|
|
- * Free Software Foundation; either version 2 of the License, or (at your
|
|
- * option) any later version.
|
|
- *
|
|
- * This program is distributed in the hope that it will be useful, but
|
|
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
|
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
- * for more details.
|
|
- */
|
|
-
|
|
-#include "podman.h"
|
|
-
|
|
-enum {
|
|
- CTX_INACTIVE = 0,
|
|
- CTX_ACTIVE = (1<<0),
|
|
- CTX_CONTAINER= (1<<1),
|
|
-};
|
|
-
|
|
-typedef struct context {
|
|
- unsigned int state;
|
|
- struct container *container;
|
|
-} context_t;
|
|
-
|
|
-static context_t *ctxtab;
|
|
-static int num_ctx;
|
|
-
|
|
-static void
|
|
-podman_context_clear(int ctx)
|
|
-{
|
|
- ctxtab[ctx].state = CTX_INACTIVE;
|
|
- ctxtab[ctx].container = NULL;
|
|
-}
|
|
-
|
|
-void
|
|
-podman_context_end(int ctx)
|
|
-{
|
|
- if (ctx < 0 || ctx >= num_ctx || ctxtab[ctx].state == CTX_INACTIVE)
|
|
- return;
|
|
- podman_context_clear(ctx);
|
|
-}
|
|
-
|
|
-static void
|
|
-podman_context_grow_table(int ctx)
|
|
-{
|
|
- size_t need;
|
|
-
|
|
- if (ctx < num_ctx)
|
|
- return;
|
|
-
|
|
- need = (ctx + 1) * sizeof(ctxtab[0]);
|
|
- ctxtab = (context_t *)realloc(ctxtab, need);
|
|
- if (ctxtab == NULL)
|
|
- pmNoMem("podman context table", need, PM_FATAL_ERR);
|
|
- while (num_ctx <= ctx)
|
|
- podman_context_clear(num_ctx++);
|
|
-}
|
|
-
|
|
-struct container *
|
|
-podman_context_container(int ctx)
|
|
-{
|
|
- context_t *pp;
|
|
-
|
|
- if (ctx < 0 || ctx >= num_ctx)
|
|
- return NULL;
|
|
- pp = &ctxtab[ctx];
|
|
- if (pp->state == CTX_INACTIVE)
|
|
- return NULL;
|
|
- if (pp->state & CTX_CONTAINER)
|
|
- return pp->container;
|
|
- return NULL;
|
|
-}
|
|
-
|
|
-void
|
|
-podman_context_set_container(int ctx, pmInDom indom, const char *value, int length)
|
|
-{
|
|
- struct container *cp = NULL;
|
|
- char name[64+1];
|
|
- int sts;
|
|
-
|
|
- if (length < sizeof(name)) {
|
|
- pmsprintf(name, sizeof(name), "%s", value);
|
|
- sts = pmdaCacheLookupName(indom, name, NULL, (void **)&cp);
|
|
- if (sts < 0)
|
|
- cp = NULL;
|
|
- }
|
|
-
|
|
- podman_context_grow_table(ctx);
|
|
- if (cp) {
|
|
- ctxtab[ctx].container = cp;
|
|
- ctxtab[ctx].state |= CTX_CONTAINER;
|
|
- } else {
|
|
- ctxtab[ctx].container = NULL;
|
|
- ctxtab[ctx].state &= ~CTX_CONTAINER;
|
|
- }
|
|
- ctxtab[ctx].state |= CTX_ACTIVE;
|
|
-}
|
|
diff -Naurp pcp-5.3.0.orig/src/pmdas/podman/.gitignore pcp-5.3.0/src/pmdas/podman/.gitignore
|
|
--- pcp-5.3.0.orig/src/pmdas/podman/.gitignore 2018-11-19 13:48:15.000000000 +1100
|
|
+++ pcp-5.3.0/src/pmdas/podman/.gitignore 2021-05-14 13:18:32.124079167 +1000
|
|
@@ -1,6 +1,8 @@
|
|
domain.h
|
|
pmdapodman
|
|
pmda_podman.so
|
|
+jsonsl.c
|
|
+jsonsl.h
|
|
help.dir
|
|
help.pag
|
|
exports
|
|
diff -Naurp pcp-5.3.0.orig/src/pmdas/podman/GNUmakefile pcp-5.3.0/src/pmdas/podman/GNUmakefile
|
|
--- pcp-5.3.0.orig/src/pmdas/podman/GNUmakefile 2021-02-22 11:31:04.000000000 +1100
|
|
+++ pcp-5.3.0/src/pmdas/podman/GNUmakefile 2021-05-14 13:18:32.124079167 +1000
|
|
@@ -1,5 +1,5 @@
|
|
#
|
|
-# Copyright (c) 2018,2020 Red Hat.
|
|
+# Copyright (c) 2018,2020-2021 Red Hat.
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify it
|
|
# under the terms of the GNU General Public License as published by the
|
|
@@ -21,18 +21,21 @@ CMDTARGET = pmda$(IAM)
|
|
LIBTARGET = pmda_$(IAM).$(DSOSUFFIX)
|
|
PMDAINIT = $(IAM)_init
|
|
|
|
-CFILES = varlink.c context.c pmda.c
|
|
+PMDAADMDIR = $(PCP_PMDASADM_DIR)/$(IAM)
|
|
+PMDATMPDIR = $(PCP_PMDAS_DIR)/$(IAM)
|
|
+
|
|
+LLDLIBS = $(PCP_WEBLIB)
|
|
+
|
|
+CFILES = podman.c jsonsl.c pmda.c
|
|
+HFILES = podman.h jsonsl.h
|
|
+EXT_FILES = jsonsl.c jsonsl.h
|
|
+
|
|
+LCFLAGS = -I$(TOPDIR)/src/libpcp_web/src
|
|
|
|
SCRIPTS = Install Remove
|
|
VERSION_SCRIPT = exports
|
|
HELPTARGETS = help.dir help.pag
|
|
-LDIRT = $(HELPTARGETS) domain.h $(VERSION_SCRIPT)
|
|
-
|
|
-LLDLIBS = $(PCP_PMDALIB) $(LIB_FOR_LIBVARLINK)
|
|
-LCFLAGS = $(INVISIBILITY)
|
|
-
|
|
-PMDAADMDIR = $(PCP_PMDASADM_DIR)/$(IAM)
|
|
-PMDATMPDIR = $(PCP_PMDAS_DIR)/$(IAM)
|
|
+LDIRT = $(HELPTARGETS) domain.h $(VERSION_SCRIPT) $(EXT_FILES)
|
|
|
|
MAN_SECTION = 1
|
|
MAN_PAGES = pmda$(IAM).$(MAN_SECTION)
|
|
@@ -43,7 +46,7 @@ default: build-me
|
|
include $(BUILDRULES)
|
|
|
|
ifeq "$(PMDA_PODMAN)" "true"
|
|
-build-me: $(LIBTARGET) $(CMDTARGET) $(HELPTARGETS)
|
|
+build-me: $(EXT_FILES) $(LIBTARGET) $(CMDTARGET) $(HELPTARGETS)
|
|
|
|
install: default
|
|
$(INSTALL) -m 755 -d $(PMDAADMDIR)
|
|
@@ -57,6 +60,9 @@ build-me:
|
|
install:
|
|
endif
|
|
|
|
+$(EXT_FILES):
|
|
+ $(LN_S) $(TOPDIR)/src/external/$@ .
|
|
+
|
|
default_pcp : default
|
|
|
|
install_pcp : install
|
|
diff -Naurp pcp-5.3.0.orig/src/pmdas/podman/help pcp-5.3.0/src/pmdas/podman/help
|
|
--- pcp-5.3.0.orig/src/pmdas/podman/help 2018-11-19 13:48:15.000000000 +1100
|
|
+++ pcp-5.3.0/src/pmdas/podman/help 2021-05-14 13:18:32.124079167 +1000
|
|
@@ -32,9 +32,9 @@
|
|
@ podman.container.name human-readable name for each podman container
|
|
@ podman.container.command command line of initial container process
|
|
@ podman.container.status string indicating current container status
|
|
-@ podman.container.rwsize prefered I/O size for podman container
|
|
-@ podman.container.rootfssize size of container root filesystem
|
|
@ podman.container.running zero or one indicating container running
|
|
+@ podman.container.image base image name for each container
|
|
+@ podman.container.pod pod mapping for containers in pods
|
|
|
|
@ podman.container.stats.net_input interface bytes received per container
|
|
@ podman.container.stats.net_output interface bytes transmitted per container
|
|
diff -Naurp pcp-5.3.0.orig/src/pmdas/podman/Install pcp-5.3.0/src/pmdas/podman/Install
|
|
--- pcp-5.3.0.orig/src/pmdas/podman/Install 2018-11-19 13:48:15.000000000 +1100
|
|
+++ pcp-5.3.0/src/pmdas/podman/Install 2021-05-14 13:18:32.124079167 +1000
|
|
@@ -1,6 +1,6 @@
|
|
#!/bin/sh
|
|
#
|
|
-# Copyright (c) 2018 Red Hat.
|
|
+# Copyright (c) 2018-2021 Red Hat.
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify it
|
|
# under the terms of the GNU General Public License as published by the
|
|
@@ -23,14 +23,14 @@ daemon_opt=true
|
|
pipe_opt=true
|
|
pmns_source=root_podman
|
|
|
|
-if [ ! -S /run/podman/io.podman ]
|
|
+if [ ! -S /run/podman/podman.sock ]
|
|
then
|
|
- $PCP_ECHO_PROG $PCP_ECHO_N "Do you wish to start the podman varlink socket? [y] ""$PCP_ECHO_C"
|
|
+ $PCP_ECHO_PROG $PCP_ECHO_N "Do you wish to start the podman system service? [y] ""$PCP_ECHO_C"
|
|
read ans
|
|
if [ "X$ans" = "Xy" -o "X$ans" = "XY" -o -z "$ans" ]
|
|
then
|
|
- systemctl enable io.podman.service
|
|
- systemctl start io.podman.service
|
|
+ systemctl enable podman.service
|
|
+ systemctl start podman.service
|
|
else
|
|
echo "Warning: continuing installation but expect no metric values"
|
|
fi
|
|
diff -Naurp pcp-5.3.0.orig/src/pmdas/podman/pmda.c pcp-5.3.0/src/pmdas/podman/pmda.c
|
|
--- pcp-5.3.0.orig/src/pmdas/podman/pmda.c 2018-11-19 13:48:15.000000000 +1100
|
|
+++ pcp-5.3.0/src/pmdas/podman/pmda.c 2021-05-14 13:18:32.124079167 +1000
|
|
@@ -1,5 +1,5 @@
|
|
/*
|
|
- * Copyright (c) 2018 Red Hat.
|
|
+ * Copyright (c) 2018,2021 Red Hat.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License as published by the
|
|
@@ -16,8 +16,8 @@
|
|
#include "libpcp.h"
|
|
#include "domain.h"
|
|
|
|
-static pmdaIndom podman_indomtab[NUM_INDOMS];
|
|
-#define INDOM(x) (podman_indomtab[x].it_indom)
|
|
+char *podman_rundir;
|
|
+pmdaIndom podman_indomtab[NUM_INDOMS];
|
|
|
|
#define NUM_METRICS (NUM_CONTAINER_STATS + NUM_CONTAINER_INFO + NUM_POD_INFO)
|
|
static pmdaMetric podman_metrictab[] = {
|
|
@@ -67,15 +67,15 @@ static pmdaMetric podman_metrictab[] = {
|
|
{ .m_desc = { PMDA_PMID(CLUSTER_INFO, INFO_STATUS),
|
|
PM_TYPE_STRING, CONTAINER_INDOM, PM_SEM_DISCRETE,
|
|
PMDA_PMUNITS(0,0,0,0,0,0) }, },
|
|
- { .m_desc = { PMDA_PMID(CLUSTER_INFO, INFO_RWSIZE),
|
|
- PM_TYPE_U64, CONTAINER_INDOM, PM_SEM_INSTANT,
|
|
- PMDA_PMUNITS(1,0,0,PM_SPACE_KBYTE,0,0) }, },
|
|
- { .m_desc = { PMDA_PMID(CLUSTER_INFO, INFO_ROOTFSSIZE),
|
|
- PM_TYPE_U64, CONTAINER_INDOM, PM_SEM_INSTANT,
|
|
- PMDA_PMUNITS(1,0,0,PM_SPACE_KBYTE,0,0) }, },
|
|
{ .m_desc = { PMDA_PMID(CLUSTER_INFO, INFO_RUNNING),
|
|
PM_TYPE_U32, CONTAINER_INDOM, PM_SEM_INSTANT,
|
|
PMDA_PMUNITS(0,0,0,0,0,0) }, },
|
|
+ { .m_desc = { PMDA_PMID(CLUSTER_INFO, INFO_IMAGE),
|
|
+ PM_TYPE_STRING, CONTAINER_INDOM, PM_SEM_DISCRETE,
|
|
+ PMDA_PMUNITS(0,0,0,0,0,0) }, },
|
|
+ { .m_desc = { PMDA_PMID(CLUSTER_INFO, INFO_POD),
|
|
+ PM_TYPE_STRING, CONTAINER_INDOM, PM_SEM_DISCRETE,
|
|
+ PMDA_PMUNITS(0,0,0,0,0,0) }, },
|
|
|
|
/* pod info cluster (2) */
|
|
{ .m_desc = { PMDA_PMID(CLUSTER_POD, POD_NAME),
|
|
@@ -115,81 +115,23 @@ podman_strings_insert(const char *string
|
|
return pmdaCacheStore(dict, PMDA_CACHE_ADD, string, NULL);
|
|
}
|
|
|
|
-static void
|
|
-podman_refresh_container(pmdaExt *pmda, pmInDom indom, int inst, state_flags_t flags)
|
|
-{
|
|
- container_t *cp = podman_context_container(pmda->e_context);
|
|
- char *name = NULL;
|
|
- int sts;
|
|
-
|
|
- if (cp != NULL)
|
|
- name = podman_strings_lookup(cp->id);
|
|
- else if (inst != PM_IN_NULL) {
|
|
- sts = pmdaCacheLookup(indom, inst, &name, (void **)&cp);
|
|
- name = (sts < 0) ? NULL : podman_strings_lookup(cp->id);
|
|
- }
|
|
- if (name && name[0] == '\0')
|
|
- name = NULL;
|
|
-
|
|
- if (name)
|
|
- refresh_podman_container(indom, name, flags);
|
|
- else
|
|
- refresh_podman_containers(indom, flags);
|
|
-}
|
|
-
|
|
-static void
|
|
-podman_refresh_info(pmdaExt *pmda, pmInDom indom, int inst, char *name)
|
|
-{
|
|
- container_t *cp = podman_context_container(pmda->e_context);
|
|
- int sts;
|
|
-
|
|
- if (cp != NULL)
|
|
- name = podman_strings_lookup(cp->id);
|
|
- else if (inst != PM_IN_NULL) {
|
|
- sts = pmdaCacheLookup(indom, inst, &name, (void **)&cp);
|
|
- name = (sts < 0) ? NULL : podman_strings_lookup(cp->id);
|
|
- }
|
|
- if (name && name[0] == '\0')
|
|
- name = NULL;
|
|
-
|
|
- if (name)
|
|
- refresh_podman_container(indom, name, STATE_INFO);
|
|
- else
|
|
- refresh_podman_containers(indom, STATE_INFO);
|
|
-}
|
|
-
|
|
-static void
|
|
-podman_refresh_pod(pmdaExt *pmda, pmInDom indom, int inst, char *name)
|
|
-{
|
|
- container_t *cp;
|
|
- int sts;
|
|
-
|
|
- if (inst != PM_IN_NULL) {
|
|
- sts = pmdaCacheLookup(indom, inst, &name, (void **)&cp);
|
|
- name = (sts < 0) ? NULL : podman_strings_lookup(cp->id);
|
|
- }
|
|
- if (name && name[0] == '\0')
|
|
- name = NULL;
|
|
-
|
|
- if (name)
|
|
- refresh_podman_pod_info(indom, name);
|
|
- else
|
|
- refresh_podman_pods_info(indom);
|
|
-}
|
|
-
|
|
static int
|
|
podman_instance(pmInDom indom, int inst, char *name, pmInResult **result, pmdaExt *pmda)
|
|
{
|
|
- unsigned int serial = pmInDom_serial(indom);
|
|
+ unsigned int refresh = 0, need_refresh[NUM_CLUSTERS] = { 0 };
|
|
|
|
- switch(serial) {
|
|
+ switch (pmInDom_serial(indom)) {
|
|
case CONTAINER_INDOM:
|
|
- podman_refresh_info(pmda, indom, inst, name);
|
|
+ need_refresh[CLUSTER_INFO]++;
|
|
+ refresh++;
|
|
break;
|
|
case POD_INDOM:
|
|
- podman_refresh_pod(pmda, indom, inst, name);
|
|
+ need_refresh[CLUSTER_POD]++;
|
|
+ refresh++;
|
|
break;
|
|
}
|
|
+ if (refresh)
|
|
+ podman_refresh(need_refresh);
|
|
return pmdaInstance(indom, inst, name, result, pmda);
|
|
}
|
|
|
|
@@ -271,15 +213,15 @@ podman_info_fetchCallBack(unsigned int i
|
|
case INFO_STATUS:
|
|
atom->cp = podman_strings_lookup(cp->info.status);
|
|
break;
|
|
- case INFO_RWSIZE:
|
|
- atom->ull = cp->info.rwsize;
|
|
- break;
|
|
- case INFO_ROOTFSSIZE:
|
|
- atom->ull = cp->info.rootfssize;
|
|
- break;
|
|
case INFO_RUNNING:
|
|
atom->ul = cp->info.running;
|
|
break;
|
|
+ case INFO_IMAGE:
|
|
+ atom->cp = podman_strings_lookup(cp->info.image);
|
|
+ break;
|
|
+ case INFO_POD:
|
|
+ atom->cp = podman_strings_lookup(cp->info.podid);
|
|
+ break;
|
|
default:
|
|
return PM_ERR_PMID;
|
|
}
|
|
@@ -289,7 +231,7 @@ podman_info_fetchCallBack(unsigned int i
|
|
static int
|
|
podman_pod_fetchCallBack(unsigned int item, unsigned int inst, pmAtomValue *atom)
|
|
{
|
|
- pod_info_t *pp;
|
|
+ pod_t *pp;
|
|
int sts;
|
|
|
|
sts = pmdaCacheLookup(INDOM(POD_INDOM), inst, NULL, (void **)&pp);
|
|
@@ -297,19 +239,21 @@ podman_pod_fetchCallBack(unsigned int it
|
|
return sts;
|
|
if (sts != PMDA_CACHE_ACTIVE)
|
|
return PM_ERR_INST;
|
|
+ if (!(pp->flags & STATE_POD))
|
|
+ return 0;
|
|
|
|
switch (item) {
|
|
case POD_NAME:
|
|
- atom->cp = podman_strings_lookup(pp->name);
|
|
+ atom->cp = podman_strings_lookup(pp->info.name);
|
|
break;
|
|
case POD_CGROUP:
|
|
- atom->cp = podman_strings_lookup(pp->cgroup);
|
|
+ atom->cp = podman_strings_lookup(pp->info.cgroup);
|
|
break;
|
|
case POD_STATUS:
|
|
- atom->cp = podman_strings_lookup(pp->status);
|
|
+ atom->cp = podman_strings_lookup(pp->info.status);
|
|
break;
|
|
case POD_CONTAINERS:
|
|
- atom->ul = pp->ncontainers;
|
|
+ atom->ul = pp->info.ncontainers;
|
|
break;
|
|
default:
|
|
return PM_ERR_PMID;
|
|
@@ -340,7 +284,6 @@ static int
|
|
podman_fetch(int numpmid, pmID pmidlist[], pmResult **resp, pmdaExt *pmda)
|
|
{
|
|
unsigned int cluster, need_refresh[NUM_CLUSTERS] = { 0 };
|
|
- state_flags_t flags = STATE_NONE;
|
|
int i;
|
|
|
|
for (i = 0; i < numpmid; i++) {
|
|
@@ -348,16 +291,7 @@ podman_fetch(int numpmid, pmID pmidlist[
|
|
if (cluster < NUM_CLUSTERS)
|
|
need_refresh[cluster]++;
|
|
}
|
|
-
|
|
- if (need_refresh[CLUSTER_STATS])
|
|
- flags |= STATE_STATS;
|
|
- if (need_refresh[CLUSTER_INFO])
|
|
- flags |= STATE_INFO;
|
|
-
|
|
- if (flags != STATE_NONE)
|
|
- podman_refresh_container(pmda, INDOM(CONTAINER_INDOM), PM_IN_NULL, flags);
|
|
- if (need_refresh[CLUSTER_POD])
|
|
- podman_refresh_pod(pmda, INDOM(POD_INDOM), PM_IN_NULL, NULL);
|
|
+ podman_refresh(need_refresh);
|
|
|
|
return pmdaFetch(numpmid, pmidlist, resp, pmda);
|
|
}
|
|
@@ -366,7 +300,7 @@ static int
|
|
podman_labelCallBack(pmInDom indom, unsigned int inst, pmLabelSet **lp)
|
|
{
|
|
container_t *cp;
|
|
- pod_info_t *pp;
|
|
+ pod_t *pp;
|
|
void *vp;
|
|
int sts;
|
|
|
|
@@ -376,23 +310,19 @@ podman_labelCallBack(pmInDom indom, unsi
|
|
if (sts != PMDA_CACHE_ACTIVE)
|
|
return 0;
|
|
if (indom == INDOM(POD_INDOM)) {
|
|
- pp = (pod_info_t *)vp;
|
|
- // for (i = 0; i < cp->info.labels; i++)
|
|
- // pmdaAddLabels(lp, "{\"%s\":\"%s\"}",
|
|
- // podman_strings_lookup(pp->labelnames[n]),
|
|
- // podman_strings_lookup(pp->labelvalue[n]));
|
|
- return pp->labels;
|
|
+ pp = (pod_t *)vp;
|
|
+ if (pp->info.nlabels)
|
|
+ pmdaAddNotes(lp, "%s", podman_strings_lookup(pp->info.labelmap));
|
|
+ return pp->info.nlabels;
|
|
}
|
|
if (indom == INDOM(CONTAINER_INDOM)) {
|
|
cp = (container_t *)vp;
|
|
- if (cp->podmap)
|
|
+ if (cp->info.podid)
|
|
pmdaAddLabels(lp, "{\"pod\":\"%s\"}",
|
|
- podman_strings_lookup(cp->podmap));
|
|
- // for (i = 0; i < cp->info.labels; i++)
|
|
- // pmdaAddLabels(lp, "{\"%s\":\"%s\"}",
|
|
- // podman_strings_lookup(cp->info.labelnames[n]),
|
|
- // podman_strings_lookup(cp->info.labelvalues[n]));
|
|
- return cp->info.labels + (cp->podmap? 1 : 0);
|
|
+ podman_strings_lookup(cp->info.podid));
|
|
+ if (cp->info.nlabels)
|
|
+ pmdaAddNotes(lp, "%s", podman_strings_lookup(cp->info.labelmap));
|
|
+ return cp->info.nlabels + (cp->info.podid ? 1 : 0);
|
|
}
|
|
return 0;
|
|
}
|
|
@@ -403,19 +333,6 @@ podman_label(int ident, int type, pmLabe
|
|
return pmdaLabel(ident, type, lpp, pmda);
|
|
}
|
|
|
|
-static int
|
|
-podman_attribute(int ctx, int attr, const char *value, int len, pmdaExt *pmda)
|
|
-{
|
|
- switch (attr) {
|
|
- case PMDA_ATTR_CONTAINER:
|
|
- podman_context_set_container(ctx, INDOM(CONTAINER_INDOM), value, len);
|
|
- break;
|
|
- default:
|
|
- break;
|
|
- }
|
|
- return pmdaAttribute(ctx, attr, value, len, pmda);
|
|
-}
|
|
-
|
|
static pmLongOptions longopts[] = {
|
|
PMDA_OPTIONS_HEADER("Options"),
|
|
PMOPT_DEBUG,
|
|
@@ -447,13 +364,16 @@ podman_init(pmdaInterface *dp)
|
|
if (dp->status != 0)
|
|
return;
|
|
|
|
+ if (podman_rundir == NULL)
|
|
+ podman_rundir = "/run";
|
|
+
|
|
+ podman_parse_init();
|
|
+
|
|
dp->version.seven.fetch = podman_fetch;
|
|
dp->version.seven.label = podman_label;
|
|
dp->version.seven.instance = podman_instance;
|
|
- dp->version.seven.attribute = podman_attribute;
|
|
pmdaSetFetchCallBack(dp, podman_fetchCallBack);
|
|
pmdaSetLabelCallBack(dp, podman_labelCallBack);
|
|
- pmdaSetEndContextCallBack(dp, podman_context_end);
|
|
|
|
podman_indomtab[CONTAINER_INDOM].it_indom = CONTAINER_INDOM;
|
|
podman_indomtab[STRINGS_INDOM].it_indom = STRINGS_INDOM;
|
|
diff -Naurp pcp-5.3.0.orig/src/pmdas/podman/podman.c pcp-5.3.0/src/pmdas/podman/podman.c
|
|
--- pcp-5.3.0.orig/src/pmdas/podman/podman.c 1970-01-01 10:00:00.000000000 +1000
|
|
+++ pcp-5.3.0/src/pmdas/podman/podman.c 2021-05-14 13:19:32.695039941 +1000
|
|
@@ -0,0 +1,737 @@
|
|
+/*
|
|
+ * Copyright (c) 2021 Red Hat.
|
|
+ *
|
|
+ * This program is free software; you can redistribute it and/or modify it
|
|
+ * under the terms of the GNU General Public License as published by the
|
|
+ * Free Software Foundation; either version 2 of the License, or (at your
|
|
+ * option) any later version.
|
|
+ *
|
|
+ * This program is distributed in the hope that it will be useful, but
|
|
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
|
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
+ * for more details.
|
|
+ */
|
|
+#include <ctype.h>
|
|
+#include "podman.h"
|
|
+#include "jsonsl.h"
|
|
+#include "pmhttp.h"
|
|
+#include "http_client.h"
|
|
+#include "http_parser.h"
|
|
+
|
|
+typedef struct {
|
|
+ uint32_t id;
|
|
+ container_stats_e field;
|
|
+ container_stats_t values;
|
|
+} container_stats_parser_t;
|
|
+
|
|
+typedef struct {
|
|
+ uint32_t id;
|
|
+ container_info_e field;
|
|
+ container_info_t values;
|
|
+} container_info_parser_t;
|
|
+
|
|
+typedef struct {
|
|
+ uint32_t id;
|
|
+ pod_info_e field;
|
|
+ pod_info_t values;
|
|
+} pod_info_parser_t;
|
|
+
|
|
+static container_stats_parser_t container_stats_parser;
|
|
+static jsonsl_t container_stats_json;
|
|
+static container_info_parser_t container_info_parser;
|
|
+static jsonsl_t container_info_json;
|
|
+static pod_info_parser_t pod_info_parser;
|
|
+static jsonsl_t pod_info_json;
|
|
+
|
|
+static int
|
|
+log_error(jsonsl_t json, jsonsl_error_t error,
|
|
+ struct jsonsl_state_st *state, jsonsl_char_t *at)
|
|
+{
|
|
+ pmNotifyErr(LOG_ERR, "Error %s at position %lu. Remaining: %s\n",
|
|
+ jsonsl_strerror(error), json->pos, at);
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/*
|
|
+ * Parse and refresh metric values relating to container stats cluster
|
|
+ */
|
|
+
|
|
+static void
|
|
+container_stats_update(container_stats_parser_t *parser, const char *position)
|
|
+{
|
|
+ if (container_stats_json->level == 2) { /* complete */
|
|
+ container_t *cp = NULL;
|
|
+ pmInDom indom = INDOM(CONTAINER_INDOM);
|
|
+ char *name = podman_strings_lookup(parser->id);
|
|
+ int sts = pmdaCacheLookupName(indom, name, NULL, (void **)&cp);
|
|
+ if (sts < 0 || cp == NULL) {
|
|
+ if ((cp = calloc(1, sizeof(*cp))) == NULL)
|
|
+ return;
|
|
+ if (pmDebugOptions.attr)
|
|
+ fprintf(stderr, "adding container %s (%u)\n", name, parser->id);
|
|
+ }
|
|
+ /* store the completed info values into the cached structure */
|
|
+ cp->flags |= STATE_STATS;
|
|
+ memcpy(&cp->stats, &parser->values, sizeof(cp->stats));
|
|
+ pmdaCacheStore(indom, PMDA_CACHE_ADD, name, (void *)cp);
|
|
+ }
|
|
+}
|
|
+
|
|
+static void
|
|
+container_stats_field(container_stats_parser_t *cp,
|
|
+ const char *key, size_t len)
|
|
+{
|
|
+ cp->field = -1;
|
|
+
|
|
+ if (len == 11 && strncmp("ContainerID", key, len) == 0)
|
|
+ cp->field = STATS_ID;
|
|
+ else if (len == 10 && strncmp("BlockInput", key, len) == 0)
|
|
+ cp->field = STATS_BLOCK_INPUT;
|
|
+ else if (len == 11 && strncmp("BlockOutput", key, len) == 0)
|
|
+ cp->field = STATS_BLOCK_OUTPUT;
|
|
+ else if (len == 8 && strncmp("NetInput", key, len) == 0)
|
|
+ cp->field = STATS_NET_INPUT;
|
|
+ else if (len == 9 && strncmp("NetOutput", key, len) == 0)
|
|
+ cp->field = STATS_NET_OUTPUT;
|
|
+ else if (len == 3 && strncmp("CPU", key, len) == 0)
|
|
+ cp->field = STATS_CPU;
|
|
+ else if (len == 7 && strncmp("CPUNano", key, len) == 0)
|
|
+ cp->field = STATS_CPU_NANO;
|
|
+ else if (len == 13 && strncmp("CPUSystemNano", key, len) == 0)
|
|
+ cp->field = STATS_SYSTEM_NANO;
|
|
+ else if (len == 8 && strncmp("MemUsage", key, len) == 0)
|
|
+ cp->field = STATS_MEM_USAGE;
|
|
+ else if (len == 8 && strncmp("MemLimit", key, len) == 0)
|
|
+ cp->field = STATS_MEM_LIMIT;
|
|
+ else if (len == 7 && strncmp("MemPerc", key, len) == 0)
|
|
+ cp->field = STATS_MEM_PERC;
|
|
+ else if (len == 4 && strncmp("PIDs", key, len) == 0)
|
|
+ cp->field = STATS_PIDS;
|
|
+}
|
|
+
|
|
+static void
|
|
+container_stats_value(container_stats_parser_t *cp,
|
|
+ const char *value, size_t len)
|
|
+{
|
|
+ char buffer[BUFSIZ];
|
|
+ char *end;
|
|
+
|
|
+ switch (cp->field) {
|
|
+ case STATS_NET_INPUT:
|
|
+ cp->values.net_input = strtoull(value, &end, 0);
|
|
+ if (end - value != len)
|
|
+ cp->values.net_input = 0;
|
|
+ break;
|
|
+ case STATS_NET_OUTPUT:
|
|
+ cp->values.net_output = strtoull(value, &end, 0);
|
|
+ if (end - value != len)
|
|
+ cp->values.net_output = 0;
|
|
+ break;
|
|
+ case STATS_BLOCK_INPUT:
|
|
+ cp->values.block_input = strtoull(value, &end, 0);
|
|
+ if (end - value != len)
|
|
+ cp->values.block_input = 0;
|
|
+ break;
|
|
+ case STATS_BLOCK_OUTPUT:
|
|
+ cp->values.block_output = strtoull(value, &end, 0);
|
|
+ if (end - value != len)
|
|
+ cp->values.block_output = 0;
|
|
+ break;
|
|
+ case STATS_CPU:
|
|
+ cp->values.cpu = strtod(value, &end);
|
|
+ if (end - value != len)
|
|
+ cp->values.cpu = 0;
|
|
+ break;
|
|
+ case STATS_CPU_NANO:
|
|
+ cp->values.cpu_nano = strtoll(value, &end, 0);
|
|
+ if (end - value != len)
|
|
+ cp->values.cpu_nano = 0;
|
|
+ break;
|
|
+ case STATS_SYSTEM_NANO:
|
|
+ cp->values.system_nano = strtoll(value, &end, 0);
|
|
+ if (end - value != len)
|
|
+ cp->values.system_nano = 0;
|
|
+ break;
|
|
+ case STATS_MEM_USAGE:
|
|
+ cp->values.mem_usage = strtoll(value, &end, 0);
|
|
+ if (end - value != len)
|
|
+ cp->values.mem_usage = 0;
|
|
+ break;
|
|
+ case STATS_MEM_LIMIT:
|
|
+ cp->values.mem_limit = strtoll(value, &end, 0);
|
|
+ if (end - value != len)
|
|
+ cp->values.mem_limit = 0;
|
|
+ break;
|
|
+ case STATS_MEM_PERC:
|
|
+ cp->values.mem_perc = strtod(value, &end);
|
|
+ if (end - value != len)
|
|
+ cp->values.mem_perc = 0;
|
|
+ break;
|
|
+ case STATS_PIDS:
|
|
+ cp->values.nprocesses = strtoul(value, &end, 0);
|
|
+ if (end - value != len)
|
|
+ cp->values.nprocesses = 0;
|
|
+ break;
|
|
+ case STATS_ID:
|
|
+ pmsprintf(buffer, sizeof(buffer), "%.*s", (int)len, value);
|
|
+ cp->id = podman_strings_insert(buffer);
|
|
+ break;
|
|
+ default:
|
|
+ break;
|
|
+ }
|
|
+}
|
|
+
|
|
+/*
|
|
+ * Sample output:
|
|
+ * {"Error":null,"Stats":[{"ContainerID":"aff836906c5bc3b4c932ba546984752784617645639632dcf0cd348d5c5f0d82","Name":"bold_nash","PerCPU":null,"CPU":1.5856378300710223e-9,"CPUNano":25700000,"CPUSystemNano":17224,"SystemNano":1620798867976609176,"MemUsage":7237632,"MemLimit":16391106560,"MemPerc":0.04415584740118973,"NetInput":1468,"NetOutput":167816,"BlockInput":12435456,"BlockOutput":0,"PIDs":1}]}
|
|
+ */
|
|
+
|
|
+static void
|
|
+container_stats_create(jsonsl_t json, jsonsl_action_t action,
|
|
+ struct jsonsl_state_st *state, const jsonsl_char_t *at)
|
|
+{
|
|
+ container_stats_parser_t *parser;
|
|
+
|
|
+ if (state->level == 3 && state->type == JSONSL_T_OBJECT) {
|
|
+ /* new container, any previous one is stashed in indom cache */
|
|
+ parser = (container_stats_parser_t *)json->data;
|
|
+ memset(&parser->values, 0, sizeof(container_stats_t));
|
|
+ parser->id = -1;
|
|
+ }
|
|
+}
|
|
+
|
|
+static void
|
|
+container_stats_complete(jsonsl_t json, jsonsl_action_t action,
|
|
+ struct jsonsl_state_st *state, const jsonsl_char_t *at)
|
|
+{
|
|
+ container_stats_parser_t *parser;
|
|
+
|
|
+ parser = (container_stats_parser_t *)json->data;
|
|
+ if ((state->level == 4) &&
|
|
+ (state->type == JSONSL_T_STRING || state->type == JSONSL_T_SPECIAL)) {
|
|
+ const char *value = at - (json->pos - state->pos_begin);
|
|
+ size_t bytes = json->pos - state->pos_begin;
|
|
+ if (state->type == JSONSL_T_STRING) /* skip enclosing quotes */
|
|
+ value++, bytes--;
|
|
+ container_stats_value(parser, value, bytes);
|
|
+ }
|
|
+ else if (state->level == 4 && state->type == JSONSL_T_HKEY) {
|
|
+ const char *key = (at - (json->pos - state->pos_begin)) + 1;
|
|
+ size_t bytes = (json->pos - state->pos_begin) - 1;
|
|
+ container_stats_field(parser, key, bytes);
|
|
+ }
|
|
+ else if (state->level == 3 && state->type == JSONSL_T_OBJECT) {
|
|
+ container_stats_update(parser, at);
|
|
+ }
|
|
+}
|
|
+
|
|
+/*
|
|
+ * Parse and refresh metric values relating to container info cluster
|
|
+ */
|
|
+
|
|
+static void
|
|
+container_info_add_labels(container_info_parser_t *ip, const char *value)
|
|
+{
|
|
+ if (ip->values.labels == NULL) {
|
|
+ ip->values.labels = value - 2;
|
|
+ ip->values.nlabels = 1;
|
|
+ } else {
|
|
+ ip->values.nlabels++;
|
|
+ }
|
|
+}
|
|
+
|
|
+static void
|
|
+container_info_end_labels(container_info_parser_t *ip, int bytes)
|
|
+{
|
|
+ char labels[PM_MAXLABELJSONLEN];
|
|
+
|
|
+ if (ip->field == INFO_LABELS && ip->values.labels != NULL) {
|
|
+ pmsprintf(labels, sizeof(labels),
|
|
+ "{\"podman\":%.*s}", bytes, ip->values.labels);
|
|
+ ip->values.labelmap = podman_strings_insert(labels);
|
|
+ ip->values.labels = NULL;
|
|
+ }
|
|
+ ip->field = -1; /* end labels */
|
|
+}
|
|
+
|
|
+static void
|
|
+container_info_update(container_info_parser_t *ip, int level, const char *position)
|
|
+{
|
|
+ if (level > 2) { /* labels complete */
|
|
+ container_info_end_labels(ip, position - ip->values.labels + 1);
|
|
+ } else { /* container is complete */
|
|
+ container_t *cp = NULL;
|
|
+ pmInDom indom = INDOM(CONTAINER_INDOM);
|
|
+ char *name = podman_strings_lookup(ip->id);
|
|
+ int sts = pmdaCacheLookupName(indom, name, NULL, (void **)&cp);
|
|
+ if (sts < 0 || cp == NULL) {
|
|
+ if ((cp = calloc(1, sizeof(*cp))) == NULL)
|
|
+ return;
|
|
+ if (pmDebugOptions.attr)
|
|
+ fprintf(stderr, "adding container %s (%u)\n", name, ip->id);
|
|
+ }
|
|
+ cp->flags |= STATE_INFO;
|
|
+ /* store the completed values into the cached structure */
|
|
+ memcpy(&cp->info, &ip->values, sizeof(cp->info));
|
|
+ pmdaCacheStore(indom, PMDA_CACHE_ADD, name, (void *)cp);
|
|
+ }
|
|
+}
|
|
+
|
|
+static void
|
|
+container_info_field(container_info_parser_t *ip, int level,
|
|
+ const char *key, size_t len)
|
|
+{
|
|
+ if (level >= 3 && ip->field == INFO_LABELS) {
|
|
+ container_info_add_labels(ip, key);
|
|
+ return;
|
|
+ }
|
|
+ if (level != 3)
|
|
+ return;
|
|
+
|
|
+ ip->field = -1;
|
|
+ if (len == 5 && strncmp("Names", key, len) == 0)
|
|
+ ip->field = INFO_NAME;
|
|
+ else if (len == 6 && strncmp("Status", key, len) == 0)
|
|
+ ip->field = INFO_STATUS;
|
|
+ else if (len == 7 && strncmp("Command", key, len) == 0)
|
|
+ ip->field = INFO_COMMAND;
|
|
+ else if (len == 3 && strncmp("Pod", key, len) == 0)
|
|
+ ip->field = INFO_POD;
|
|
+ else if (len == 2 && strncmp("Id", key, len) == 0)
|
|
+ ip->field = INFO_ID;
|
|
+ else if (len == 6 && strncmp("Labels", key, len) == 0)
|
|
+ ip->field = INFO_LABELS;
|
|
+}
|
|
+
|
|
+static void
|
|
+container_info_value(container_info_parser_t *ip, int level,
|
|
+ const char *value, size_t len)
|
|
+{
|
|
+ char buffer[BUFSIZ];
|
|
+
|
|
+ if (level != 3)
|
|
+ return;
|
|
+
|
|
+ switch (ip->field) {
|
|
+ case INFO_NAME:
|
|
+ pmsprintf(buffer, sizeof(buffer), "%.*s", (int)len, value);
|
|
+ ip->values.name = podman_strings_insert(buffer);
|
|
+ break;
|
|
+ case INFO_COMMAND:
|
|
+ pmsprintf(buffer, sizeof(buffer), "%.*s", (int)len, value);
|
|
+ ip->values.command = podman_strings_insert(buffer);
|
|
+ break;
|
|
+ case INFO_STATUS:
|
|
+ pmsprintf(buffer, sizeof(buffer), "%.*s", (int)len, value);
|
|
+ ip->values.status = podman_strings_insert(buffer);
|
|
+ ip->values.running = (strncmp("Running", value, len) == 0);
|
|
+ break;
|
|
+ case INFO_IMAGE:
|
|
+ pmsprintf(buffer, sizeof(buffer), "%.*s", (int)len, value);
|
|
+ ip->values.image = podman_strings_insert(buffer);
|
|
+ break;
|
|
+ case INFO_POD:
|
|
+ pmsprintf(buffer, sizeof(buffer), "%.*s", (int)len, value);
|
|
+ ip->values.podid = podman_strings_insert(buffer);
|
|
+ break;
|
|
+ case INFO_ID:
|
|
+ pmsprintf(buffer, sizeof(buffer), "%.*s", (int)len, value);
|
|
+ ip->id = podman_strings_insert(buffer);
|
|
+ break;
|
|
+ default:
|
|
+ break;
|
|
+ }
|
|
+}
|
|
+
|
|
+/*
|
|
+ * Sample output:
|
|
+ * [{"AutoRemove":false,"Command":["bash"],"Created":"2021-05-12T10:29:51.438438116+10:00","CreatedAt":"","Exited":false,"ExitedAt":-62135596800,"ExitCode":0,"Id":"aff836906c5bc3b4c932ba546984752784617645639632dcf0cd348d5c5f0d82","Image":"registry.fedoraproject.org/fedora:latest","ImageID":"eb7134a03cd6bd8a3de99c16cf174d66ad2d93724bac3307795efcd8aaf914c5","IsInfra":false,"Labels":{"license":"MIT","name":"fedora","vendor":"Fedora Project","version":"32"},"Mounts":[],"Names":["bold_nash"],"Namespaces":{},"Networks":["podman"],"Pid":51085,"Pod":"","PodName":"","Ports":null,"Size":null,"StartedAt":1620779391,"State":"running","Status":""}]
|
|
+ */
|
|
+
|
|
+static void
|
|
+container_info_create(jsonsl_t json, jsonsl_action_t action,
|
|
+ struct jsonsl_state_st *state, const jsonsl_char_t *at)
|
|
+{
|
|
+ container_info_parser_t *parser;
|
|
+
|
|
+ if (state->level == 2 && state->type == JSONSL_T_OBJECT) {
|
|
+ /* new container, any previous one is stashed in indom cache */
|
|
+ parser = (container_info_parser_t *)json->data;
|
|
+ memset(&parser->values, 0, sizeof(container_info_t));
|
|
+ parser->id = -1;
|
|
+ }
|
|
+}
|
|
+
|
|
+static void
|
|
+container_info_complete(jsonsl_t json, jsonsl_action_t action,
|
|
+ struct jsonsl_state_st *state, const jsonsl_char_t *at)
|
|
+{
|
|
+ container_info_parser_t *parser;
|
|
+
|
|
+ parser = (container_info_parser_t *)json->data;
|
|
+ if (state->type == JSONSL_T_STRING || state->type == JSONSL_T_SPECIAL) {
|
|
+ const char *value = at - (json->pos - state->pos_begin);
|
|
+ size_t bytes = json->pos - state->pos_begin;
|
|
+ if (state->type == JSONSL_T_STRING) /* skip enclosing quotes */
|
|
+ value++, bytes--;
|
|
+ container_info_value(parser, state->level, value, bytes);
|
|
+ }
|
|
+ else if (state->type == JSONSL_T_HKEY) {
|
|
+ const char *key = (at - (json->pos - state->pos_begin)) + 1;
|
|
+ size_t bytes = (json->pos - state->pos_begin) - 1;
|
|
+ container_info_field(parser, state->level, key, bytes);
|
|
+ }
|
|
+ else if (state->type == JSONSL_T_OBJECT) {
|
|
+ container_info_update(parser, state->level, at);
|
|
+ }
|
|
+}
|
|
+
|
|
+
|
|
+/*
|
|
+ * Parse and refresh metric values relating to pod info cluster
|
|
+ */
|
|
+
|
|
+static void
|
|
+pod_info_add_labels(pod_info_parser_t *pp, const char *value)
|
|
+{
|
|
+ if (pp->values.labels == NULL) {
|
|
+ pp->values.labels = value - 2;
|
|
+ pp->values.nlabels = 1;
|
|
+ } else {
|
|
+ pp->values.nlabels++;
|
|
+ }
|
|
+}
|
|
+
|
|
+static void
|
|
+pod_info_end_labels(pod_info_parser_t *pp, int bytes)
|
|
+{
|
|
+ char labels[PM_MAXLABELJSONLEN];
|
|
+
|
|
+ if (pp->field == POD_LABELS && pp->values.labels != NULL) {
|
|
+ pmsprintf(labels, sizeof(labels),
|
|
+ "{\"podman\":%.*s}", bytes, pp->values.labels);
|
|
+ pp->values.labelmap = podman_strings_insert(labels);
|
|
+ pp->values.labels = NULL;
|
|
+ }
|
|
+ pp->field = -1; /* end labels */
|
|
+}
|
|
+
|
|
+static void
|
|
+pod_info_update(pod_info_parser_t *ip, int level, const char *position)
|
|
+{
|
|
+ if (level > 2) { /* labels are now complete */
|
|
+ pod_info_end_labels(ip, position - ip->values.labels + 1);
|
|
+ } else { /* pod is complete */
|
|
+ pod_t *pp = NULL;
|
|
+ pmInDom indom = INDOM(POD_INDOM);
|
|
+ char *name = podman_strings_lookup(ip->id);
|
|
+ int sts = pmdaCacheLookupName(indom, name, NULL, (void **)&pp);
|
|
+ if (sts < 0 || pp == NULL) {
|
|
+ if ((pp = calloc(1, sizeof(*pp))) == NULL)
|
|
+ return;
|
|
+ if (pmDebugOptions.attr)
|
|
+ fprintf(stderr, "adding pod %s (%u)\n", name, ip->id);
|
|
+ }
|
|
+ pp->flags |= STATE_POD;
|
|
+ /* store the completed pod values into the cached structure */
|
|
+ memcpy(&pp->info, &ip->values, sizeof(pp->info));
|
|
+ pmdaCacheStore(indom, PMDA_CACHE_ADD, name, (void *)pp);
|
|
+ }
|
|
+}
|
|
+
|
|
+static void
|
|
+pod_info_field(pod_info_parser_t *pp, int level, const char *key, size_t len)
|
|
+{
|
|
+ if (level >= 3 && pp->field == POD_LABELS) {
|
|
+ pod_info_add_labels(pp, key);
|
|
+ return;
|
|
+ }
|
|
+ if (level != 3)
|
|
+ return;
|
|
+
|
|
+ pp->field = -1;
|
|
+ if (len == 2 && strncmp("Id", key, len) == 0) {
|
|
+ pod_info_e lastfield = pp->field;
|
|
+ if (pod_info_json->level >= 2) {
|
|
+ if (lastfield == POD_CONTAINERS) /* containers */
|
|
+ pp->values.ncontainers++;
|
|
+ } else if (pod_info_json->level < 2) { /* pods */
|
|
+ pp->field = POD_ID;
|
|
+ }
|
|
+ }
|
|
+ else if (len == 4 && strncmp("Name", key, len) == 0)
|
|
+ pp->field = POD_NAME;
|
|
+ else if (len == 6 && strncmp("Cgroup", key, len) == 0)
|
|
+ pp->field = POD_CGROUP;
|
|
+ else if (len == 6 && strncmp("Labels", key, len) == 0)
|
|
+ pp->field = POD_LABELS;
|
|
+ else if (len == 6 && strncmp("Status", key, len) == 0)
|
|
+ pp->field = POD_STATUS;
|
|
+ else if (len == 10 && strncmp("Containers", key, len) == 0) {
|
|
+ pp->field = POD_CONTAINERS;
|
|
+ pp->values.ncontainers = 0;
|
|
+ }
|
|
+}
|
|
+
|
|
+static void
|
|
+pod_info_value(pod_info_parser_t *pp, int level, const char *value, size_t len)
|
|
+{
|
|
+ char buffer[BUFSIZ];
|
|
+
|
|
+ if (level != 3)
|
|
+ return;
|
|
+
|
|
+ switch (pp->field) {
|
|
+ case POD_NAME:
|
|
+ pmsprintf(buffer, sizeof(buffer), "%.*s", (int)len, value);
|
|
+ pp->values.name = podman_strings_insert(buffer);
|
|
+ break;
|
|
+ case POD_CGROUP:
|
|
+ pmsprintf(buffer, sizeof(buffer), "%.*s", (int)len, value);
|
|
+ pp->values.cgroup = podman_strings_insert(buffer);
|
|
+ break;
|
|
+ case POD_STATUS:
|
|
+ pmsprintf(buffer, sizeof(buffer), "%.*s", (int)len, value);
|
|
+ pp->values.status = podman_strings_insert(buffer);
|
|
+ pp->values.running = (strcmp(buffer, "Running") == 0);
|
|
+ break;
|
|
+ case POD_CONTAINERS:
|
|
+ pp->values.ncontainers = 0;
|
|
+ /* count Id fields in pod_info_containers */
|
|
+ break;
|
|
+ default:
|
|
+ break;
|
|
+ }
|
|
+}
|
|
+
|
|
+/*
|
|
+ * Sample output:
|
|
+ * [{"Cgroup":"user.slice","Containers":[{"Id":"527c6d322dd68e261630a3f46b3a7db3b1b79ceb0c09d8aeb36012fa8efa28b2","Names":"b9ab3ec058fc-infra","Status":"configured"}],"Created":"2021-05-11T15:26:25.325078296-07:00","Id":"b9ab3ec058fc50417bd68e79a40b0ff75d67c074ca37cba1c73a012c7bb40953","InfraId":"527c6d322dd68e261630a3f46b3a7db3b1b79ceb0c09d8aeb36012fa8efa28b2","Name":"pod001","Namespace":"","Networks":null,"Status":"Created","Labels":{}}]
|
|
+ */
|
|
+
|
|
+static void
|
|
+pod_info_create(jsonsl_t json, jsonsl_action_t action,
|
|
+ struct jsonsl_state_st *state, const jsonsl_char_t *at)
|
|
+{
|
|
+ pod_info_parser_t *parser;
|
|
+
|
|
+ if (state->level == 2 && state->type == JSONSL_T_OBJECT) {
|
|
+ /* new pod, any previous one is stashed in indom cache */
|
|
+ parser = (pod_info_parser_t *)json->data;
|
|
+ memset(&parser->values, 0, sizeof(pod_info_t));
|
|
+ parser->id = -1;
|
|
+ }
|
|
+}
|
|
+
|
|
+static void
|
|
+pod_info_complete(jsonsl_t json, jsonsl_action_t action,
|
|
+ struct jsonsl_state_st *state, const jsonsl_char_t *at)
|
|
+{
|
|
+ pod_info_parser_t *parser = (pod_info_parser_t *)json->data;
|
|
+
|
|
+ if (state->type == JSONSL_T_STRING || state->type == JSONSL_T_SPECIAL) {
|
|
+ const char *value = at - (json->pos - state->pos_begin);
|
|
+ size_t bytes = json->pos - state->pos_begin;
|
|
+ if (state->type == JSONSL_T_STRING) /* skip quotes */
|
|
+ value++, bytes--;
|
|
+ pod_info_value(parser, state->level, value, bytes);
|
|
+ }
|
|
+ else if (state->type == JSONSL_T_HKEY) {
|
|
+ const char *key = (at - (json->pos - state->pos_begin)) + 1;
|
|
+ size_t bytes = (json->pos - state->pos_begin) - 1;
|
|
+ pod_info_field(parser, state->level, key, bytes);
|
|
+ }
|
|
+ else if (state->type == JSONSL_T_OBJECT) {
|
|
+ pod_info_update(parser, state->level, at);
|
|
+ }
|
|
+}
|
|
+
|
|
+/*
|
|
+ * Global setup and teardown routines
|
|
+ */
|
|
+
|
|
+int
|
|
+podman_parse_init(void)
|
|
+{
|
|
+ if ((container_stats_json = jsonsl_new(16)) == 0)
|
|
+ return -ENOMEM;
|
|
+
|
|
+ if ((container_info_json = jsonsl_new(16)) == 0) {
|
|
+ jsonsl_destroy(container_stats_json);
|
|
+ return -ENOMEM;
|
|
+ }
|
|
+
|
|
+ if ((pod_info_json = jsonsl_new(16)) == 0) {
|
|
+ jsonsl_destroy(container_stats_json);
|
|
+ jsonsl_destroy(container_info_json);
|
|
+ return -ENOMEM;
|
|
+ }
|
|
+
|
|
+ container_stats_json->data = &container_stats_parser;
|
|
+ container_stats_json->error_callback = log_error;
|
|
+ container_stats_json->action_callback_PUSH = container_stats_create;
|
|
+ container_stats_json->action_callback_POP = container_stats_complete;
|
|
+ jsonsl_enable_all_callbacks(container_stats_json);
|
|
+
|
|
+ container_info_json->data = &container_info_parser;
|
|
+ container_info_json->error_callback = log_error;
|
|
+ container_info_json->action_callback_PUSH = container_info_create;
|
|
+ container_info_json->action_callback_POP = container_info_complete;
|
|
+ jsonsl_enable_all_callbacks(container_info_json);
|
|
+
|
|
+ pod_info_json->data = &pod_info_parser;
|
|
+ pod_info_json->error_callback = log_error;
|
|
+ pod_info_json->action_callback_PUSH = pod_info_create;
|
|
+ pod_info_json->action_callback_POP = pod_info_complete;
|
|
+ jsonsl_enable_all_callbacks(pod_info_json);
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+void
|
|
+podman_parse_end(void)
|
|
+{
|
|
+ jsonsl_destroy(container_stats_json);
|
|
+ jsonsl_destroy(container_info_json);
|
|
+ jsonsl_destroy(pod_info_json);
|
|
+}
|
|
+
|
|
+static void
|
|
+podman_http_parse(struct http_client *cp,
|
|
+ jsonsl_t json, const char *buffer, size_t length)
|
|
+{
|
|
+ if (cp->parser.status_code == 200) {
|
|
+ jsonsl_reset(json);
|
|
+ jsonsl_feed(json, buffer, length);
|
|
+ }
|
|
+}
|
|
+
|
|
+static char *
|
|
+podman_buffer(char *buffer, size_t *buflen)
|
|
+{
|
|
+ size_t length = *buflen;
|
|
+ char *p;
|
|
+
|
|
+ if (length == 0)
|
|
+ length = 256;
|
|
+ if (length >= UINT_MAX / 256)
|
|
+ return NULL;
|
|
+
|
|
+ length *= 2;
|
|
+ if ((p = realloc(buffer, length)) != NULL) {
|
|
+ *buflen = length;
|
|
+ } else {
|
|
+ free(buffer);
|
|
+ *buflen = 0;
|
|
+ }
|
|
+ return p;
|
|
+}
|
|
+
|
|
+static int
|
|
+podman_validate_socket(const char *path)
|
|
+{
|
|
+ struct stat sbuf;
|
|
+
|
|
+ if (stat(path, &sbuf) < 0)
|
|
+ return -ENOENT;
|
|
+ if (S_ISSOCK(sbuf.st_mode))
|
|
+ return 0;
|
|
+ return -EINVAL;
|
|
+}
|
|
+
|
|
+static void
|
|
+podman_http_fetch(const char *url, const char *query, jsonsl_t parser)
|
|
+{
|
|
+ struct http_client *client;
|
|
+ static size_t jsonlen;
|
|
+ static char *json;
|
|
+ char type[64];
|
|
+ int sts, len;
|
|
+
|
|
+ if ((json == NULL) &&
|
|
+ (json = podman_buffer(json, &jsonlen)) == NULL)
|
|
+ return;
|
|
+
|
|
+ if ((client = pmhttpNewClient()) == NULL)
|
|
+ return;
|
|
+
|
|
+retry:
|
|
+ len = pmsprintf(type, sizeof(type), "/v3.0.0/libpod/%s", query);
|
|
+ if ((sts = pmhttpClientFetch(client, url, json, jsonlen, type, len)) > 0) {
|
|
+ if (pmDebugOptions.attr)
|
|
+ fprintf(stderr, "podman_http_fetch: %.*s\n", sts, json);
|
|
+ podman_http_parse(client, parser, json, sts);
|
|
+ } else if (sts == -E2BIG) {
|
|
+ json = podman_buffer(json, &jsonlen);
|
|
+ goto retry;
|
|
+ }
|
|
+ pmhttpFreeClient(client);
|
|
+}
|
|
+
|
|
+#define PODQUERY "pods/json"
|
|
+#define INFOQUERY "containers/json"
|
|
+#define STATSQUERY "containers/stats?stream=false"
|
|
+
|
|
+static void
|
|
+podman_refresh_socket(const char *path, unsigned int need_refresh[])
|
|
+{
|
|
+ char url[MAXPATHLEN + 8];
|
|
+
|
|
+ if (podman_validate_socket(path) < 0)
|
|
+ return;
|
|
+ if (pmDebugOptions.attr)
|
|
+ fprintf(stderr, "refreshing on socket %s\n", path);
|
|
+
|
|
+ /* Unix domain socket protocol and path (used for all requests) */
|
|
+ pmsprintf(url, sizeof(url), "unix:/%s", path);
|
|
+
|
|
+ if (need_refresh[CLUSTER_POD])
|
|
+ podman_http_fetch(url, PODQUERY, pod_info_json);
|
|
+
|
|
+ if (need_refresh[CLUSTER_INFO])
|
|
+ podman_http_fetch(url, INFOQUERY, container_info_json);
|
|
+
|
|
+ if (need_refresh[CLUSTER_STATS])
|
|
+ podman_http_fetch(url, STATSQUERY, container_stats_json);
|
|
+}
|
|
+
|
|
+/*
|
|
+ * Refresh instance domain and all values for given clusters.
|
|
+ * Algorith used is designed to produce a union of containers
|
|
+ * across all podman invocations (using root or rootless); so
|
|
+ * we make requests on /run/podman socket first, then iterate
|
|
+ * over all /run/user/.../podman sockets.
|
|
+ */
|
|
+void
|
|
+podman_refresh(unsigned int need_refresh[])
|
|
+{
|
|
+ static const char sockpath[] = "podman/podman.sock";
|
|
+ pmInDom containers = INDOM(CONTAINER_INDOM);
|
|
+ pmInDom pods = INDOM(POD_INDOM);
|
|
+ char dirpath[MAXPATHLEN];
|
|
+ char path[MAXPATHLEN];
|
|
+ DIR *rundir;
|
|
+ struct dirent *entry;
|
|
+
|
|
+ if (need_refresh[CLUSTER_STATS] || need_refresh[CLUSTER_INFO])
|
|
+ pmdaCacheOp(containers, PMDA_CACHE_INACTIVE);
|
|
+ if (need_refresh[CLUSTER_POD])
|
|
+ pmdaCacheOp(pods, PMDA_CACHE_INACTIVE);
|
|
+
|
|
+ /* first the root socket */
|
|
+ pmsprintf(path, MAXPATHLEN, "%s/%s", podman_rundir, sockpath);
|
|
+ podman_refresh_socket(path, need_refresh);
|
|
+
|
|
+ /* then any user sockets (rootless) */
|
|
+ pmsprintf(dirpath, MAXPATHLEN, "%s/user", podman_rundir);
|
|
+ if ((rundir = opendir(dirpath)) == NULL)
|
|
+ return;
|
|
+ while ((entry = readdir(rundir)) != NULL) {
|
|
+ char *user = entry->d_name;
|
|
+ if (!isdigit(user[0]) || strcmp(user, "0") == 0)
|
|
+ continue;
|
|
+ pmsprintf(path, MAXPATHLEN, "%s/%s/%s", dirpath, user, sockpath);
|
|
+ podman_refresh_socket(path, need_refresh);
|
|
+ }
|
|
+ closedir(rundir);
|
|
+}
|
|
diff -Naurp pcp-5.3.0.orig/src/pmdas/podman/podman.h pcp-5.3.0/src/pmdas/podman/podman.h
|
|
--- pcp-5.3.0.orig/src/pmdas/podman/podman.h 2018-11-19 13:48:15.000000000 +1100
|
|
+++ pcp-5.3.0/src/pmdas/podman/podman.h 2021-05-14 13:18:32.125079150 +1000
|
|
@@ -1,5 +1,5 @@
|
|
/*
|
|
- * Copyright (c) 2018 Red Hat.
|
|
+ * Copyright (c) 2018,2021 Red Hat.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License as published by the
|
|
@@ -16,21 +16,20 @@
|
|
|
|
#include "pmapi.h"
|
|
#include "pmda.h"
|
|
-#include <stdbool.h>
|
|
|
|
typedef struct {
|
|
uint32_t name; /* string mapping for name */
|
|
uint32_t command; /* string mapping for running command */
|
|
uint32_t status; /* string mapping for status */
|
|
- int64_t rwsize;
|
|
- int64_t rootfssize;
|
|
- bool running;
|
|
- unsigned int labels;
|
|
- uint32_t *labelnames; /* string mappings for label names */
|
|
- uint32_t *labelvalues; /* string mappings for label values */
|
|
+ unsigned int running;
|
|
+ uint32_t labelmap; /* string mapping for labels */
|
|
+ unsigned int nlabels; /* number of labels in labelmap */
|
|
+ const char *labels; /* pointer to start of all labels */
|
|
+ uint32_t image; /* string mapping for image name */
|
|
+ uint32_t podid; /* string mapping for pod name */
|
|
} container_info_t;
|
|
|
|
-typedef struct container_stats {
|
|
+typedef struct {
|
|
int64_t net_input;
|
|
int64_t net_output;
|
|
int64_t block_input;
|
|
@@ -41,40 +40,40 @@ typedef struct container_stats {
|
|
int64_t mem_usage;
|
|
int64_t mem_limit;
|
|
double mem_perc;
|
|
- int64_t nprocesses;
|
|
- uint32_t name; /* string mapping for container name */
|
|
+ uint32_t nprocesses;
|
|
} container_stats_t;
|
|
|
|
-typedef enum state_flags {
|
|
+typedef enum {
|
|
STATE_NONE = 0x0,
|
|
STATE_INFO = 0x1,
|
|
STATE_STATS = 0x2,
|
|
+ STATE_POD = 0x4,
|
|
} state_flags_t;
|
|
|
|
-typedef struct container {
|
|
- uint32_t id; /* string mapping for container hash */
|
|
- uint32_t podmap; /* string mapping for pod hash (optional) */
|
|
+typedef struct {
|
|
state_flags_t flags;
|
|
container_info_t info;
|
|
container_stats_t stats;
|
|
} container_t;
|
|
|
|
-typedef struct pod_info {
|
|
- uint32_t id; /* string mapping for pod hash */
|
|
- state_flags_t flags;
|
|
+typedef struct {
|
|
uint32_t name; /* string mapping for pod name */
|
|
uint32_t cgroup; /* string mapping for cgroup name */
|
|
- uint64_t rwsize;
|
|
- uint64_t rootfssize;
|
|
- bool running;
|
|
- unsigned int labels;
|
|
- uint32_t *labelnames; /* string mappings for label names */
|
|
- uint32_t *labelvalues; /* string mappings for label values */
|
|
+ unsigned int running;
|
|
+ uint32_t labelmap; /* string mapping for label names */
|
|
+ unsigned int nlabels; /* number of labels in labelmap */
|
|
+ const char *labels; /* pointer to start of all labels */
|
|
uint32_t status; /* string mapping for status info */
|
|
- uint32_t ncontainers;
|
|
+ unsigned int ncontainers;
|
|
} pod_info_t;
|
|
|
|
-enum {
|
|
+typedef struct {
|
|
+ state_flags_t flags;
|
|
+ pod_info_t info;
|
|
+} pod_t;
|
|
+
|
|
+typedef enum {
|
|
+ /* pmID item fields */
|
|
STATS_NET_INPUT = 0,
|
|
STATS_NET_OUTPUT = 1,
|
|
STATS_BLOCK_INPUT = 2,
|
|
@@ -86,26 +85,39 @@ enum {
|
|
STATS_MEM_LIMIT = 8,
|
|
STATS_MEM_PERC = 9,
|
|
STATS_PIDS = 10,
|
|
- NUM_CONTAINER_STATS
|
|
-};
|
|
+ NUM_CONTAINER_STATS,
|
|
|
|
-enum {
|
|
+ /* internal fields */
|
|
+ STATS_ID,
|
|
+} container_stats_e;
|
|
+
|
|
+typedef enum {
|
|
+ /* pmID item fields */
|
|
INFO_NAME = 0,
|
|
INFO_COMMAND = 1,
|
|
INFO_STATUS = 2,
|
|
- INFO_RWSIZE = 3,
|
|
- INFO_ROOTFSSIZE = 4,
|
|
INFO_RUNNING = 5,
|
|
- NUM_CONTAINER_INFO
|
|
-};
|
|
+ INFO_IMAGE = 6,
|
|
+ INFO_POD = 7,
|
|
+ NUM_CONTAINER_INFO,
|
|
+
|
|
+ /* internal fields */
|
|
+ INFO_ID,
|
|
+ INFO_LABELS,
|
|
+} container_info_e;
|
|
|
|
-enum {
|
|
+typedef enum {
|
|
+ /* pmID item fields */
|
|
POD_NAME = 0,
|
|
POD_CGROUP = 1,
|
|
POD_STATUS = 2,
|
|
POD_CONTAINERS = 3,
|
|
- NUM_POD_INFO
|
|
-};
|
|
+ NUM_POD_INFO,
|
|
+
|
|
+ /* internal fields */
|
|
+ POD_ID,
|
|
+ POD_LABELS,
|
|
+} pod_info_e;
|
|
|
|
enum {
|
|
CLUSTER_STATS = 0,
|
|
@@ -123,16 +135,21 @@ enum {
|
|
|
|
/* General routines */
|
|
|
|
-extern void podman_context_set_container(int, pmInDom, const char *, int);
|
|
-extern container_t *podman_context_container(int);
|
|
-extern void podman_context_end(int);
|
|
-
|
|
-extern void refresh_podman_containers(pmInDom, state_flags_t);
|
|
-extern void refresh_podman_container(pmInDom, char *, state_flags_t);
|
|
-extern void refresh_podman_pod_info(pmInDom, char *);
|
|
-extern void refresh_podman_pods_info(pmInDom);
|
|
-
|
|
+extern void podman_refresh(unsigned int[]);
|
|
extern char *podman_strings_lookup(int);
|
|
extern int podman_strings_insert(const char *);
|
|
|
|
+/* Parsing routines */
|
|
+
|
|
+extern int podman_parse_init(void);
|
|
+extern void podman_parse_end(void);
|
|
+
|
|
+/* Instance domains */
|
|
+
|
|
+extern pmdaIndom podman_indomtab[NUM_INDOMS];
|
|
+#define INDOM(x) (podman_indomtab[x].it_indom)
|
|
+
|
|
+/* System paths */
|
|
+extern char *podman_rundir;
|
|
+
|
|
#endif /* PCP_PODMAN_H */
|
|
diff -Naurp pcp-5.3.0.orig/src/pmdas/podman/Remove pcp-5.3.0/src/pmdas/podman/Remove
|
|
--- pcp-5.3.0.orig/src/pmdas/podman/Remove 2018-11-19 13:48:15.000000000 +1100
|
|
+++ pcp-5.3.0/src/pmdas/podman/Remove 2021-05-14 13:18:32.124079167 +1000
|
|
@@ -1,6 +1,6 @@
|
|
#!/bin/sh
|
|
#
|
|
-# Copyright (c) 2018 Red Hat.
|
|
+# Copyright (c) 2018-2021 Red Hat.
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify it
|
|
# under the terms of the GNU General Public License as published by the
|
|
diff -Naurp pcp-5.3.0.orig/src/pmdas/podman/root_podman pcp-5.3.0/src/pmdas/podman/root_podman
|
|
--- pcp-5.3.0.orig/src/pmdas/podman/root_podman 2018-11-19 13:48:15.000000000 +1100
|
|
+++ pcp-5.3.0/src/pmdas/podman/root_podman 2021-05-14 13:18:32.125079150 +1000
|
|
@@ -1,5 +1,5 @@
|
|
/*
|
|
- * Copyright (c) 2018 Red Hat.
|
|
+ * Copyright (c) 2018,2021 Red Hat.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License as published by the
|
|
@@ -37,9 +37,9 @@ podman.container {
|
|
name PODMAN:1:0
|
|
command PODMAN:1:1
|
|
status PODMAN:1:2
|
|
- rwsize PODMAN:1:3
|
|
- rootfssize PODMAN:1:4
|
|
running PODMAN:1:5
|
|
+ image PODMAN:1:6
|
|
+ pod PODMAN:1:7
|
|
}
|
|
|
|
podman.container.stats {
|
|
diff -Naurp pcp-5.3.0.orig/src/pmdas/podman/varlink.c pcp-5.3.0/src/pmdas/podman/varlink.c
|
|
--- pcp-5.3.0.orig/src/pmdas/podman/varlink.c 2021-02-17 15:27:41.000000000 +1100
|
|
+++ pcp-5.3.0/src/pmdas/podman/varlink.c 1970-01-01 10:00:00.000000000 +1000
|
|
@@ -1,557 +0,0 @@
|
|
-/*
|
|
- * Copyright (c) 2018 Red Hat.
|
|
- *
|
|
- * This program is free software; you can redistribute it and/or modify it
|
|
- * under the terms of the GNU General Public License as published by the
|
|
- * Free Software Foundation; either version 2 of the License, or (at your
|
|
- * option) any later version.
|
|
- *
|
|
- * This program is distributed in the hope that it will be useful, but
|
|
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
|
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
- * for more details.
|
|
- */
|
|
-
|
|
-#include "podman.h"
|
|
-#include <varlink.h>
|
|
-#include <sys/epoll.h>
|
|
-#include <sys/signalfd.h>
|
|
-
|
|
-typedef struct varlink {
|
|
- int epoll_fd;
|
|
- int signal_fd;
|
|
- VarlinkConnection *connection;
|
|
-} varlink_t;
|
|
-
|
|
-typedef struct varlink_reply {
|
|
- char *error;
|
|
- VarlinkObject *parameters;
|
|
-} varlink_reply_t;
|
|
-
|
|
-static inline int
|
|
-epoll_control(int epfd, int op, int fd, uint32_t events, void *ptr)
|
|
-{
|
|
- struct epoll_event event = {.events = events, .data = {.ptr = ptr}};
|
|
-
|
|
- return epoll_ctl(epfd, op, fd, &event);
|
|
-}
|
|
-
|
|
-static varlink_t *
|
|
-varlink_connect(void)
|
|
-{
|
|
- static varlink_t varlink;
|
|
- static int setup;
|
|
- sigset_t mask;
|
|
- int sts;
|
|
-
|
|
- if (setup == 0) {
|
|
- if ((varlink.epoll_fd = epoll_create1(EPOLL_CLOEXEC)) < 0)
|
|
- return NULL;
|
|
- sigemptyset(&mask);
|
|
- sigaddset(&mask, SIGTERM);
|
|
- sigaddset(&mask, SIGINT);
|
|
- sigaddset(&mask, SIGPIPE);
|
|
- sigprocmask(SIG_BLOCK, &mask, NULL);
|
|
- varlink.signal_fd = signalfd(-1, &mask, SFD_NONBLOCK | SFD_CLOEXEC);
|
|
- if (varlink.signal_fd < 0)
|
|
- return NULL;
|
|
- epoll_control(varlink.epoll_fd, EPOLL_CTL_ADD, varlink.signal_fd, EPOLLIN, NULL);
|
|
- setup = 1;
|
|
- }
|
|
-
|
|
- sts = varlink_connection_new(&varlink.connection, "unix:/run/podman/io.podman");
|
|
- if (sts != 0) {
|
|
- fprintf(stderr, "Error connecting to varlink %s: %s\n",
|
|
- "unix:/run/podman/io.podman",
|
|
- varlink_error_string(-sts));
|
|
- return NULL;
|
|
- }
|
|
-
|
|
- return &varlink;
|
|
-}
|
|
-
|
|
-static void
|
|
-varlink_disconnect(varlink_t *link)
|
|
-{
|
|
- epoll_control(link->epoll_fd, EPOLL_CTL_DEL,
|
|
- varlink_connection_get_fd(link->connection), 0, NULL);
|
|
- varlink_connection_close(link->connection);
|
|
- varlink_connection_free(link->connection);
|
|
- link->connection = NULL;
|
|
-}
|
|
-
|
|
-static long
|
|
-varlink_reply_callback(VarlinkConnection *connection, const char *error,
|
|
- VarlinkObject *parameters, uint64_t flags, void *arg)
|
|
-{
|
|
- varlink_reply_t *reply = (varlink_reply_t *)arg;
|
|
-
|
|
- if (error != NULL) {
|
|
- if ((reply->error = strdup(error)) == NULL)
|
|
- return -ENOMEM;
|
|
- }
|
|
- reply->parameters = varlink_object_ref(parameters);
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static long
|
|
-varlink_connection_wait(varlink_t *link)
|
|
-{
|
|
- struct epoll_event event;
|
|
- int sts, timeout = -1;
|
|
-
|
|
- if ((sts = varlink_connection_get_events(link->connection)) < 0)
|
|
- return sts;
|
|
-
|
|
- if ((sts = epoll_control(link->epoll_fd, EPOLL_CTL_ADD,
|
|
- varlink_connection_get_fd(link->connection),
|
|
- varlink_connection_get_events(link->connection),
|
|
- link->connection)) < 0 && errno != EEXIST)
|
|
- return sts;
|
|
-
|
|
- for (;;) {
|
|
- sts = epoll_wait(link->epoll_fd, &event, 1, timeout);
|
|
- if (sts < 0) {
|
|
- if (errno == EINTR)
|
|
- continue;
|
|
- return -errno;
|
|
- }
|
|
- if (sts == 0)
|
|
- return -ETIMEDOUT;
|
|
- if (event.data.ptr == link->connection) {
|
|
- epoll_control(link->epoll_fd, EPOLL_CTL_MOD,
|
|
- varlink_connection_get_fd(link->connection),
|
|
- varlink_connection_get_events(link->connection),
|
|
- link->connection);
|
|
- break; /* ready */
|
|
- }
|
|
- if (event.data.ptr == NULL) {
|
|
- struct signalfd_siginfo info;
|
|
- long size;
|
|
-
|
|
- size = read(link->signal_fd, &info, sizeof(info));
|
|
- if (size != sizeof(info))
|
|
- continue;
|
|
- pmNotifyErr(LOG_ERR, "podman command interrupted\n");
|
|
- return -EINTR;
|
|
- }
|
|
- }
|
|
-
|
|
- if ((sts = varlink_connection_process_events(link->connection, 0)) != 0)
|
|
- return sts;
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static void
|
|
-refresh_container_info(VarlinkObject *info, container_info_t *ip)
|
|
-{
|
|
- VarlinkArray *args;
|
|
- const char *temp;
|
|
- size_t bytes, length = 0;
|
|
- char cmd[BUFSIZ] = {0};
|
|
- int i, sts, count;
|
|
-
|
|
- temp = NULL;
|
|
- varlink_object_get_string(info, "names", &temp);
|
|
- ip->name = temp? podman_strings_insert(temp) : -1;
|
|
-
|
|
- /* extract the command, stored as an array of strings */
|
|
- sts = varlink_object_get_array(info, "command", &args);
|
|
- count = sts < 0? 0 : varlink_array_get_n_elements(args);
|
|
- for (i = 0; i < count; i++) {
|
|
- temp = NULL;
|
|
- varlink_array_get_string(args, i, &temp);
|
|
- bytes = temp? strlen(temp) : 0;
|
|
- if (bytes > 0 && bytes < sizeof(cmd) - length - 1) {
|
|
- strcat(cmd, temp);
|
|
- strcat(cmd, " ");
|
|
- }
|
|
- length += bytes + 1;
|
|
- }
|
|
- if (length > 0) {
|
|
- cmd[length-1] = '\0';
|
|
- ip->command = podman_strings_insert(cmd);
|
|
- } else {
|
|
- ip->command = -1;
|
|
- }
|
|
-
|
|
- temp = NULL;
|
|
- varlink_object_get_string(info, "status", &temp);
|
|
- ip->status = temp? podman_strings_insert(temp) : -1;
|
|
- varlink_object_get_int(info, "rootfssize", &ip->rootfssize);
|
|
- varlink_object_get_int(info, "rwsize", &ip->rwsize);
|
|
- varlink_object_get_bool(info, "running", &ip->running);
|
|
-}
|
|
-
|
|
-static int
|
|
-varlink_container_info(varlink_t *link, char *name, container_info_t *ip)
|
|
-{
|
|
- varlink_reply_t reply = {0};
|
|
- VarlinkObject *info;
|
|
- int sts;
|
|
-
|
|
- if (pmDebugOptions.attr)
|
|
- fprintf(stderr, "refresh container info for %s\n", name);
|
|
-
|
|
- varlink_object_new(&reply.parameters);
|
|
- varlink_object_set_string(reply.parameters, "name", name);
|
|
-
|
|
- sts = varlink_connection_call(link->connection,
|
|
- "io.podman.GetContainer",
|
|
- reply.parameters, 0, varlink_reply_callback, &reply);
|
|
- varlink_object_unref(reply.parameters);
|
|
- if (sts != 0)
|
|
- return sts;
|
|
-
|
|
- if ((sts = varlink_connection_wait(link)) < 0)
|
|
- goto done;
|
|
-
|
|
- if (reply.error) {
|
|
- if (strcmp(reply.error, "io.podman.NoContainerRunning") != 0)
|
|
- fprintf(stderr, "Error: %s %s - %s\n", "io.podman.GetContainer",
|
|
- name, reply.error);
|
|
- free(reply.error);
|
|
- goto done;
|
|
- }
|
|
-
|
|
- sts = varlink_object_get_object(reply.parameters, "container", &info);
|
|
- if (sts != 0)
|
|
- goto done;
|
|
-
|
|
- refresh_container_info(info, ip);
|
|
-
|
|
-done:
|
|
- varlink_object_unref(reply.parameters);
|
|
- return sts;
|
|
-}
|
|
-
|
|
-static int
|
|
-varlink_container_stats(varlink_t *link, char *name, container_stats_t *cp)
|
|
-{
|
|
- varlink_reply_t reply = {0};
|
|
- VarlinkObject *stats;
|
|
- const char *temp;
|
|
- int sts;
|
|
-
|
|
- if (pmDebugOptions.attr)
|
|
- fprintf(stderr, "refresh container stats for %s\n", name);
|
|
-
|
|
- varlink_object_new(&reply.parameters);
|
|
- varlink_object_set_string(reply.parameters, "name", name);
|
|
-
|
|
- sts = varlink_connection_call(link->connection,
|
|
- "io.podman.GetContainerStats",
|
|
- reply.parameters, 0, varlink_reply_callback, &reply);
|
|
- varlink_object_unref(reply.parameters);
|
|
- if (sts != 0)
|
|
- return sts;
|
|
-
|
|
- if ((sts = varlink_connection_wait(link)) < 0)
|
|
- goto done;
|
|
-
|
|
- if (reply.error) {
|
|
- if (strcmp(reply.error, "io.podman.NoContainerRunning") != 0)
|
|
- fprintf(stderr, "Error: %s %s - %s\n", "io.podman.GetContainerStats",
|
|
- name, reply.error);
|
|
- free(reply.error);
|
|
- goto done;
|
|
- }
|
|
-
|
|
- sts = varlink_object_get_object(reply.parameters, "container", &stats);
|
|
- if (sts != 0)
|
|
- goto done;
|
|
- varlink_object_get_int(stats, "net_input", &cp->net_input);
|
|
- varlink_object_get_int(stats, "net_output", &cp->net_output);
|
|
- varlink_object_get_int(stats, "block_input", &cp->block_input);
|
|
- varlink_object_get_int(stats, "block_output", &cp->block_output);
|
|
- varlink_object_get_float(stats, "cpu", &cp->cpu);
|
|
- varlink_object_get_int(stats, "cpu_nano", &cp->cpu_nano);
|
|
- varlink_object_get_int(stats, "system_nano", &cp->system_nano);
|
|
- varlink_object_get_int(stats, "mem_usage", &cp->mem_usage);
|
|
- varlink_object_get_int(stats, "mem_limit", &cp->mem_limit);
|
|
- varlink_object_get_float(stats, "mem_perc", &cp->mem_perc);
|
|
- varlink_object_get_int(stats, "pids", &cp->nprocesses);
|
|
- varlink_object_get_string(stats, "name", &temp);
|
|
- cp->name = podman_strings_insert(temp);
|
|
-
|
|
-done:
|
|
- varlink_object_unref(reply.parameters);
|
|
- return sts;
|
|
-}
|
|
-
|
|
-void
|
|
-refresh_podman_container(pmInDom indom, char *name, state_flags_t flags)
|
|
-{
|
|
- container_t *cp;
|
|
- varlink_t *link;
|
|
- int sts;
|
|
-
|
|
- if (pmDebugOptions.attr)
|
|
- fprintf(stderr, "refresh podman container %s\n", name);
|
|
-
|
|
- if ((link = varlink_connect()) == NULL)
|
|
- return;
|
|
-
|
|
- if ((sts = pmdaCacheLookupName(indom, name, NULL, (void **)&cp)) < 0) {
|
|
- if ((cp = calloc(1, sizeof(container_t))) == NULL)
|
|
- return;
|
|
- cp->id = podman_strings_insert(name);
|
|
- if (pmDebugOptions.attr)
|
|
- fprintf(stderr, "adding container %s (%u)\n", name, cp->id);
|
|
- }
|
|
- pmdaCacheStore(indom, PMDA_CACHE_ADD, name, (void *)cp);
|
|
-
|
|
- if (flags & STATE_INFO) {
|
|
- if ((sts = varlink_container_info(link, name, &cp->info)) == 0)
|
|
- cp->flags |= STATE_INFO;
|
|
- }
|
|
- if (flags & STATE_STATS) {
|
|
- if ((sts = varlink_container_stats(link, name, &cp->stats)) == 0)
|
|
- cp->flags |= STATE_STATS;
|
|
- }
|
|
-}
|
|
-
|
|
-static int
|
|
-varlink_container_list(varlink_t *link, pmInDom indom)
|
|
-{
|
|
- container_t *cp;
|
|
- varlink_reply_t reply = {0};
|
|
- VarlinkObject *state;
|
|
- VarlinkArray *list;
|
|
- const char *id;
|
|
- int i, sts, count = 0;
|
|
-
|
|
- if (pmDebugOptions.attr)
|
|
- fprintf(stderr, "list containers\n");
|
|
-
|
|
- sts = varlink_connection_call(link->connection, "io.podman.ListContainers",
|
|
- reply.parameters, 0, varlink_reply_callback, &reply);
|
|
- if (sts != 0)
|
|
- return sts;
|
|
-
|
|
- if ((sts = varlink_connection_wait(link)) < 0)
|
|
- goto done;
|
|
-
|
|
- if (reply.error) {
|
|
- fprintf(stderr, "Error: %s - %s\n", "io.podman.ListContainers",
|
|
- reply.error);
|
|
- free(reply.error);
|
|
- goto done;
|
|
- }
|
|
-
|
|
- sts = varlink_object_get_array(reply.parameters, "containers", &list);
|
|
- if (sts < 0)
|
|
- goto done;
|
|
-
|
|
- count = varlink_array_get_n_elements(list);
|
|
- for (i = 0; i < count; i++) {
|
|
- varlink_array_get_object(list, i, &state);
|
|
- varlink_object_get_string(state, "id", &id);
|
|
- if ((sts = pmdaCacheLookupName(indom, id, NULL, (void **)&cp)) < 0) {
|
|
- if ((cp = calloc(1, sizeof(container_t))) == NULL)
|
|
- continue;
|
|
- cp->id = podman_strings_insert(id);
|
|
- if (pmDebugOptions.attr)
|
|
- fprintf(stderr, "adding container %s (%u)\n", id, cp->id);
|
|
- }
|
|
- pmdaCacheStore(indom, PMDA_CACHE_ADD, id, (void *)cp);
|
|
- refresh_container_info(state, &cp->info);
|
|
- cp->flags |= STATE_INFO;
|
|
- }
|
|
-
|
|
-done:
|
|
- varlink_object_unref(reply.parameters);
|
|
- return count;
|
|
-}
|
|
-
|
|
-static int
|
|
-varlink_pod_list(varlink_t *link, pmInDom indom)
|
|
-{
|
|
- pod_info_t *pp;
|
|
- varlink_reply_t reply = {0};
|
|
- VarlinkObject *state;
|
|
- VarlinkArray *list;
|
|
- const char *id, *temp;
|
|
- int i, sts, count = 0;
|
|
-
|
|
- if (pmDebugOptions.attr)
|
|
- fprintf(stderr, "list pods\n");
|
|
-
|
|
- sts = varlink_connection_call(link->connection, "io.podman.ListPods",
|
|
- reply.parameters, 0, varlink_reply_callback, &reply);
|
|
- if (sts != 0)
|
|
- return sts;
|
|
-
|
|
- if ((sts = varlink_connection_wait(link)) < 0)
|
|
- goto done;
|
|
-
|
|
- if (reply.error) {
|
|
- fprintf(stderr, "Error: %s - %s\n", "io.podman.ListPods", reply.error);
|
|
- free(reply.error);
|
|
- goto done;
|
|
- }
|
|
-
|
|
- sts = varlink_object_get_array(reply.parameters, "pods", &list);
|
|
- if (sts < 0)
|
|
- goto done;
|
|
-
|
|
- count = varlink_array_get_n_elements(list);
|
|
- for (i = 0; i < count; i++) {
|
|
- varlink_array_get_object(list, i, &state);
|
|
- varlink_object_get_string(state, "id", &id);
|
|
- if ((sts = pmdaCacheLookupName(indom, id, NULL, (void **)&pp)) < 0) {
|
|
- if ((pp = calloc(1, sizeof(pod_info_t))) == NULL)
|
|
- continue;
|
|
- pp->id = podman_strings_insert(id);
|
|
- if (pmDebugOptions.attr)
|
|
- fprintf(stderr, "adding pod %s (%u)\n", id, pp->id);
|
|
- }
|
|
- pmdaCacheStore(indom, PMDA_CACHE_ADD, id, (void *)pp);
|
|
-
|
|
- temp = NULL;
|
|
- varlink_object_get_string(state, "name", &temp);
|
|
- pp->name = temp? podman_strings_insert(temp) : -1;
|
|
- temp = NULL;
|
|
- varlink_object_get_string(state, "cgroup", &temp);
|
|
- pp->cgroup = temp? podman_strings_insert(temp) : -1;
|
|
- temp = NULL;
|
|
- varlink_object_get_string(state, "status", &temp);
|
|
- pp->status = temp? podman_strings_insert(temp) : -1;
|
|
- temp = NULL;
|
|
- varlink_object_get_string(state, "numberofcontainers", &temp);
|
|
- pp->ncontainers = temp ? atoi(temp) : 0;
|
|
-
|
|
- pp->flags |= STATE_INFO;
|
|
- }
|
|
-
|
|
-done:
|
|
- varlink_object_unref(reply.parameters);
|
|
- return count;
|
|
-}
|
|
-
|
|
-void
|
|
-refresh_podman_containers(pmInDom indom, state_flags_t flags)
|
|
-{
|
|
- container_t *cp;
|
|
- varlink_t *varlink;
|
|
- char *name;
|
|
- int inst, sts;
|
|
-
|
|
- pmdaCacheOp(indom, PMDA_CACHE_INACTIVE);
|
|
-
|
|
- if ((varlink = varlink_connect()) == NULL)
|
|
- return;
|
|
-
|
|
- /* extract list of containers - this also provides all container 'info' */
|
|
- sts = varlink_container_list(varlink, indom);
|
|
- if ((sts == 0) || (!(flags & STATE_STATS)))
|
|
- goto done;
|
|
-
|
|
- /* walk active entries, refreshing container 'stats' */
|
|
- for (pmdaCacheOp(indom, PMDA_CACHE_WALK_REWIND);;) {
|
|
- if ((inst = pmdaCacheOp(indom, PMDA_CACHE_WALK_NEXT)) < 0)
|
|
- break;
|
|
- if (!pmdaCacheLookup(indom, inst, &name, (void **)&cp) || !cp)
|
|
- continue;
|
|
- if ((sts = varlink_container_stats(varlink, name, &cp->stats)) == 0)
|
|
- cp->flags |= STATE_STATS;
|
|
- }
|
|
-
|
|
-done:
|
|
- varlink_disconnect(varlink);
|
|
-}
|
|
-
|
|
-static int
|
|
-varlink_pod_info(varlink_t *link, char *name, pod_info_t *pp)
|
|
-{
|
|
- varlink_reply_t reply = {0};
|
|
- VarlinkObject *info;
|
|
- const char *temp;
|
|
- int sts;
|
|
-
|
|
- if (pmDebugOptions.attr)
|
|
- fprintf(stderr, "refresh pod info for %s\n", name);
|
|
-
|
|
- varlink_object_new(&reply.parameters);
|
|
- varlink_object_set_string(reply.parameters, "name", name);
|
|
-
|
|
- sts = varlink_connection_call(link->connection,
|
|
- "io.podman.GetPod",
|
|
- reply.parameters, 0, varlink_reply_callback, &reply);
|
|
- varlink_object_unref(reply.parameters);
|
|
- if (sts != 0)
|
|
- return sts;
|
|
-
|
|
- if ((sts = varlink_connection_wait(link)) < 0)
|
|
- goto done;
|
|
-
|
|
- if (reply.error) {
|
|
- if (strcmp(reply.error, "io.podman.NoPodRunning") != 0)
|
|
- fprintf(stderr, "Error: %s %s - %s\n", "io.podman.GetPod",
|
|
- name, reply.error);
|
|
- free(reply.error);
|
|
- goto done;
|
|
- }
|
|
-
|
|
- sts = varlink_object_get_object(reply.parameters, "container", &info);
|
|
- if (sts != 0)
|
|
- goto done;
|
|
- temp = NULL;
|
|
- varlink_object_get_string(info, "name", &temp);
|
|
- pp->name = temp? podman_strings_insert(temp) : -1;
|
|
- temp = NULL;
|
|
- varlink_object_get_string(info, "cgroup", &temp);
|
|
- pp->cgroup = temp? podman_strings_insert(temp) : -1;
|
|
- temp = NULL;
|
|
- varlink_object_get_string(info, "status", &temp);
|
|
- pp->status = temp? podman_strings_insert(temp) : -1;
|
|
- temp = NULL;
|
|
- varlink_object_get_string(info, "numberofcontainers", &temp);
|
|
- pp->ncontainers = temp? atoi(temp) : 0;
|
|
-
|
|
-done:
|
|
- varlink_object_unref(reply.parameters);
|
|
- return sts;
|
|
-}
|
|
-
|
|
-void
|
|
-refresh_podman_pod_info(pmInDom indom, char *name)
|
|
-{
|
|
- pod_info_t *pp;
|
|
- varlink_t *link;
|
|
- int sts;
|
|
-
|
|
- if (pmDebugOptions.attr)
|
|
- fprintf(stderr, "refresh podman pod %s\n", name);
|
|
-
|
|
- if ((link = varlink_connect()) == NULL)
|
|
- return;
|
|
-
|
|
- if ((sts = pmdaCacheLookupName(indom, name, NULL, (void **)&pp)) < 0) {
|
|
- if ((pp = calloc(1, sizeof(pod_info_t))) == NULL)
|
|
- return;
|
|
- pp->id = podman_strings_insert(name);
|
|
- if (pmDebugOptions.attr)
|
|
- fprintf(stderr, "adding pod %s (%u)\n", name, pp->id);
|
|
- }
|
|
- pmdaCacheStore(indom, PMDA_CACHE_ADD, name, (void *)pp);
|
|
-
|
|
- if ((sts = varlink_pod_info(link, name, pp)) == 0)
|
|
- pp->flags |= STATE_INFO;
|
|
-}
|
|
-
|
|
-void
|
|
-refresh_podman_pods_info(pmInDom indom)
|
|
-{
|
|
- varlink_t *varlink;
|
|
-
|
|
- pmdaCacheOp(indom, PMDA_CACHE_INACTIVE);
|
|
-
|
|
- if ((varlink = varlink_connect()) == NULL)
|
|
- return;
|
|
-
|
|
- varlink_pod_list(varlink, indom);
|
|
-
|
|
- varlink_disconnect(varlink);
|
|
-}
|
|
diff -Naurp pcp-5.3.0.orig/src/selinux/pcpupstream.te.in pcp-5.3.0/src/selinux/pcpupstream.te.in
|
|
--- pcp-5.3.0.orig/src/selinux/pcpupstream.te.in 2021-03-23 12:33:35.000000000 +1100
|
|
+++ pcp-5.3.0/src/selinux/pcpupstream.te.in 2021-05-14 13:18:32.125079150 +1000
|
|
@@ -124,6 +124,9 @@ allow init_t system_cronjob_t:dbus send_
|
|
#type=AVC msg=audit(XXX.4): avc: denied { execute execute_no_trans open read } for pid=YYYY comm="pmdaX" name="/" dev="tracefs" ino=1 scontext=system_u:system_r:pcp_pmcd_t:s0 tcontext=system_u:object_r:user_home_t:s0 tclass=file permissive=0
|
|
allow pcp_pmcd_t user_home_t:file { execute execute_no_trans };
|
|
|
|
+#type=AVC msg=audit(XXX.90): avc: denied { getattr write } for pid=1514 comm="pmdapodman" path="/run/user/N/podman/podman.sock" dev="tmpfs" ino=228 scontext=system_u:system_r:pcp_pmcd_t:s0 tcontext=unconfined_u:object_r:user_tmp_t:s0 tclass=sock_file permissive=0
|
|
+allow pcp_pmcd_t user_tmp_t:sock_file { getattr write };
|
|
+
|
|
#type=AVC msg=audit(XXX.6): avc: denied { append getattr ioctl open read write } for pid=YYYY comm="pmdaX" name="/" dev="tracefs" ino=1 scontext=system_u:system_r:pcp_pmcd_t:s0 tcontext=system_u:object_r:debugfs_t:s0 tclass=file permissive=0
|
|
allow pcp_pmcd_t debugfs_t:file { append getattr ioctl open read write };
|
|
|