Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package resource-agents for openSUSE:Factory 
checked in at 2026-01-28 15:07:55
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/resource-agents (Old)
 and      /work/SRC/openSUSE:Factory/.resource-agents.new.1928 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "resource-agents"

Wed Jan 28 15:07:55 2026 rev:146 rq:1329342 version:4.17.0+git30.b33c378d

Changes:
--------
--- /work/SRC/openSUSE:Factory/resource-agents/resource-agents.changes  
2025-12-24 13:15:45.205075924 +0100
+++ 
/work/SRC/openSUSE:Factory/.resource-agents.new.1928/resource-agents.changes    
    2026-01-28 15:08:50.434223749 +0100
@@ -1,0 +2,12 @@
+Mon Jan 26 14:30:47 UTC 2026 - Peter Varkoly <[email protected]>
+
+- Update to version 4.17.0+git30.b33c378d: (jsc#PED-15014)
+  * powervs-move-ip/powervs-subnet: fix error logging
+  * Filesystem: optionally report "xargs ps -f" even when killing many 
processes
+  * ocf-shellfunc: add ocf_log_pipe
+  * findif.c: remove unused colonptr variable
+  * Filesystem: use -eq/-ne for numeric variables
+  * powervs-subnet: wait until IP is activated before running monitor-check
+  * OCPBUGS-64765: podman-etcd: add -a option to crictl ps (#2112)
+
+-------------------------------------------------------------------

Old:
----
  resource-agents-4.17.0+git18.92719d83.tar.xz

New:
----
  resource-agents-4.17.0+git30.b33c378d.tar.xz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ resource-agents.spec ++++++
--- /var/tmp/diff_new_pack.jvyJZh/_old  2026-01-28 15:08:51.318260470 +0100
+++ /var/tmp/diff_new_pack.jvyJZh/_new  2026-01-28 15:08:51.318260470 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package resource-agents
 #
-# Copyright (c) 2025 SUSE LLC and contributors
+# Copyright (c) 2026 SUSE LLC and contributors
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -17,7 +17,7 @@
 
 
 Name:           resource-agents
-Version:        4.17.0+git18.92719d83
+Version:        4.17.0+git30.b33c378d
 Release:        0
 Summary:        HA Reusable Cluster Resource Scripts
 License:        GPL-2.0-only AND LGPL-2.1-or-later AND GPL-3.0-or-later

++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.jvyJZh/_old  2026-01-28 15:08:51.378262962 +0100
+++ /var/tmp/diff_new_pack.jvyJZh/_new  2026-01-28 15:08:51.382263129 +0100
@@ -1,7 +1,7 @@
 <servicedata>
 <service name="tar_scm">
 <param name="url">https://github.com/ClusterLabs/resource-agents.git</param>
-<param name="changesrevision">92719d83353a8c7128f5fc72812e4b7c06cf8a6b</param>
+<param name="changesrevision">b33c378db3a04709a276a436606105e52a946116</param>
 </service>
 </servicedata>
 (No newline at EOF)

++++++ resource-agents-4.17.0+git18.92719d83.tar.xz -> 
resource-agents-4.17.0+git30.b33c378d.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/resource-agents-4.17.0+git18.92719d83/heartbeat/Filesystem 
new/resource-agents-4.17.0+git30.b33c378d/heartbeat/Filesystem
--- old/resource-agents-4.17.0+git18.92719d83/heartbeat/Filesystem      
2025-12-08 15:46:10.000000000 +0100
+++ new/resource-agents-4.17.0+git30.b33c378d/heartbeat/Filesystem      
2026-01-22 08:54:44.000000000 +0100
@@ -269,7 +269,29 @@
           avoid functions that could potentially block during process
           detection
 "false" : Do not kill any processes.
-"move"  : like "safe", but try to mount --move first
+
+You may add one or more comma separated modifiers
+"[no]move", "[no]xargs", "[no]ps".
+For example:
+
+"true,xargs,nops":
+       find processes using system tools,
+       then kill them "simultaneously" using "xargs kill",
+       do not bother to show process details.
+
+"safe,move,noxargs,ps":
+       move the mount first, then
+       find processes by walking /proc/ "manually", then
+       show process details and kill them individually in a loop.
+
+"safe,move,xargs,ps":
+       move the mount first, then
+       find processes by walking /proc/ "manually", then
+       use "xargs ps" to show process details before
+       using "xargs kill" to get rid of them.
+
+If you have modifiers that contradict each other, the last mentioned wins,
+"ps,nops" results in nops.
 
 The 'safe' option uses shell logic to walk the /proc/<pid>/ directories
 for pids using the mount point while the default option uses the
@@ -281,8 +303,9 @@
 Which may result in a timeout and stop failure, potentially escalating to
 hard-reset of this node via fencing.
 
-The 'move' option tries to move the mount point somewhere those "rogue apps"
-do not expect it, then proceed to kill current users and attempt to umount.
+The 'move' option tries to "mount --move" the mount point somewhere those
+"rogue apps" do not expect it, then proceed to kill current users and attempt
+to umount.
 
 For 'move' to work, you will have to make sure the mount point does not reside
 under a shared mount, for example by mount -o bind,private /mount /mount
@@ -607,7 +630,7 @@
                move_before_umount=false \
                Filesystem_status
                rc=$?
-               if [ $rc != $OCF_NOT_RUNNING ]; then
+               if [ $rc -ne $OCF_NOT_RUNNING ]; then
                        msg="move_before_umount=$move_before_umount and 
$MOVED_CANONICALIZED_MOUNTPOINT status is [$rc]"
                        rc=$OCF_ERR_GENERIC
                        ocf_exit_reason "$msg"
@@ -770,25 +793,44 @@
        # If the list of pids is too long for a single shell variable,
        # fix your fork bomb workload, and get a better shell anyways.
        #
-       if [ $nr_pids = 0 ]; then
+       if [ $nr_pids -eq 0 ]; then
                ocf_log info "No processes on $dir were signalled. 
force_unmount is set to '$FORCE_UNMOUNT'"
                return 1
-       elif [ $nr_pids -le 24 ]; then
+       fi
+       if $do_xargs_kill; then
+               if $do_ps_f; then
+                       # echo "$pids" | xargs -r kill -s STOP
+                       echo "sending signal $sig to $nr_pids processes:"
+
+                       # According to my man page, 'ps -f "$pid"' might be 
good enough,
+                       # but needs rather specific formatting of that argument.
+                       # And 'ps -f $pid' might produce too many words.
+                       # Use xargs anyway.
+                       echo "$pids" | xargs ps -f 2>&1
+               fi
+               echo "$pids" | xargs -r kill -s $sig 2>&1
+               if ! $do_ps_f; then
+                       if [ $nr_pids -gt 24 ]; then
+                               sed_script="11 s/^.*/... and more .../; 12,$(( 
$nr_pids - 10))d"
+                               pids=$(echo "$pids" | sed -e "$sed_script" | tr 
'\n' ' ')
+                       fi
+                       echo "sent signal $sig to ${nr_pids} processes 
["${pids}"]"
+               fi
+       else
                for pid in $pids; do
-                       ocf_log info "sending signal $sig to: $(ps -f $pid | 
tail -1)"
+                       if $do_ps_f; then
+                               echo "sending signal $sig to: $(ps -f $pid | 
tail -1)"
+                       else
+                               echo "sending signal $sig to $pid"
+                       fi
                        kill -s $sig $pid
                done
-       else
-               echo "$pids" | xargs -r kill -s $sig
-               sed_script="11 s/^.*/... and more .../; 12,$(( $nr_pids - 10))d"
-               pids=$(echo "$pids" | sed -e "$sed_script" | tr '\n' ' ')
-               ocf_log info "sent signals $sig to ${nr_pids} processes 
[${pids}]"
-       fi
+       fi | ocf_log_pipe info
        return 0
 }
 try_umount() {
        local force_arg="$1" SUB="$2"
-       $UMOUNT $force_arg "$SUB"
+       $UMOUNT $force_arg "$SUB" 2>&1 | ocf_log_pipe warn
        list_mounts | grep "${TAB}${SUB}${TAB}" >/dev/null 2>&1 || {
                ocf_log info "unmounted $SUB successfully"
                return $OCF_SUCCESS
@@ -950,7 +992,7 @@
                OP= \
                Filesystem_status
                rc=$?
-               if [ $rc = $OCF_SUCCESS ]; then
+               if [ $rc -eq $OCF_SUCCESS ]; then
                        rc=$OCF_ERR_GENERIC
                        msg="move_before_umount=$move_before_umount and 
something is mounted on $MOVED_CANONICALIZED_MOUNTPOINT"
                        ocf_exit_reason "$msg"
@@ -1162,10 +1204,6 @@
 fi
 
 # Check the OCF_RESKEY_ environment variables...
-FORCE_UNMOUNT="yes"
-if [ -n "${OCF_RESKEY_force_unmount}" ]; then
-       FORCE_UNMOUNT=$OCF_RESKEY_force_unmount
-fi
 
 DEVICE="$OCF_RESKEY_device"
 case "$DEVICE" in
@@ -1181,10 +1219,54 @@
 fi
 FAST_STOP=${OCF_RESKEY_fast_stop:="yes"}
 
-case $FORCE_UNMOUNT in
-       move) move_before_umount=true; FORCE_UNMOUNT=safe ;;
-       *)    move_before_umount=false ;;
-esac
+parse_force_unmount_modifiers()
+{
+       # keep previous "kill one by one" behavior as default for now
+       move_before_umount=''
+       do_xargs_kill=''
+       do_ps_f=''
+       force_unmount=''
+
+       local IFS=','
+       local m
+
+       set -- $OCF_RESKEY_force_unmount
+
+       for m ; do
+               case $m in
+               "") : ;; # silently ignore "*,,*" in the original value.
+               move) move_before_umount=true ;;
+               nomove) move_before_umount=false ;;
+               ps) do_ps_f=true ;;
+               nops) do_ps_f=false ;;
+               xargs) do_xargs_kill=true ;;
+               noxargs) do_xargs_kill=false ;;
+               # see ocf_is_true
+               yes|true|1|YES|TRUE|True|ja|on|ON|\
+               safe|\
+               false|no) force_unmount=$m ;;
+               *) ocf_log warn "force_unmount: unknown modifier $m ignored" ;;
+               esac
+       done
+
+       # not mentioned, or explicitly empty? "sane defaults"
+       if [ -z "$move_before_umount$do_xargs_kill$do_ps_f$force_unmount" ]; 
then
+               FORCE_UNMOUNT=false
+       else
+               FORCE_UNMOUNT=${force_unmount:-yes}
+       fi
+       : move : ${move_before_umount:=false}
+       if $move_before_umount; then
+               : xargs : ${do_xargs_kill:=true}
+               : ps : ${do_ps_f:=false}
+       else
+               : xargs : ${do_xargs_kill:=false}
+               : ps : ${do_ps_f:=true}
+       fi
+}
+
+parse_force_unmount_modifiers
+
 
 OP=$1
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/resource-agents-4.17.0+git18.92719d83/heartbeat/ocf-shellfuncs.in 
new/resource-agents-4.17.0+git30.b33c378d/heartbeat/ocf-shellfuncs.in
--- old/resource-agents-4.17.0+git18.92719d83/heartbeat/ocf-shellfuncs.in       
2025-12-08 15:46:10.000000000 +0100
+++ new/resource-agents-4.17.0+git30.b33c378d/heartbeat/ocf-shellfuncs.in       
2026-01-22 08:54:44.000000000 +0100
@@ -348,6 +348,80 @@
        fi
 }
 
+# ocf_log_pipe:
+#      similar to ocf_log, but read messages from stdin.
+#      Prefix each line with HA_LOGTAG and timestamp, and output
+#      to terminal / syslog / HA_LOGFILE / HA_DEBUGLOG / stderr
+#      as appropriate.
+# Arguments: loglevel (crit, err, warn, info)
+#
+# Linux + systemd specific: could use systemd-cat.
+# Could use logger with structured data and message-id and whatnot, if 
available.
+ocf_log_pipe()
+{
+       local loglevel=$1
+       local __OCF_PRIO
+
+       # test -p /dev/stdin || { ocf_log $loglevel "ocf_log_pipe: stdin should 
be pipe"; return 1; }
+       # ... don't do that, then ...
+
+       case "$loglevel" in
+         crit) __OCF_PRIO="CRIT";;
+         err)  __OCF_PRIO="ERROR";;
+         warn) __OCF_PRIO="WARNING";;
+         info) __OCF_PRIO="INFO";;
+         debug)__OCF_PRIO="DEBUG";;
+         *)
+               # compare ocf_log, and __ha_log
+               __OCF_PRIO=`echo "$1"| tr '[a-z]' '[A-Z]'`
+               loglevel=notice
+               ;;
+       esac
+
+       if [ "$loglevel" = debug ] ; then
+               if [ "$HA_debug" = 0 ] || [ -z "$HA_debug" ]; then
+                       # Avoid sigpipe, drain to dev null.
+                       cat > /dev/null
+                       return
+               fi
+       fi
+
+       # ensure trailing blank in date format
+       case $HA_DATEFMT in *" ") :;; *) HA_DATEFMT="${HA_DATEFMT} ";; esac
+       export HA_LOGTAG HA_DATEFMT __OCF_PRIO
+
+       if test -t 2 ; then
+               awk '{ print strftime(ENVIRON["HA_DATEFMT"]) 
ENVIRON["HA_LOGTAG"] ": " ENVIRON["__OCF_PRIO"] ": " $0 }' >&2
+               return
+       fi
+
+       # should be already set, but just in case:
+       set_logtag
+
+       case $HA_LOGD/$loglevel in
+       yes/debug)      ha_logger -t "${HA_LOGTAG}" -D ha-debug && return ;;
+       yes/*)          ha_logger -t "${HA_LOGTAG}" && return ;;
+       esac
+
+       [ none = "$HA_LOGFACILITY" ] && HA_LOGFACILITY=""
+       if [ -n "$HA_LOGFACILITY" ]; then
+               sed -e "s/^/$__OCF_PRIO: /" \
+               | logger -t "$HA_LOGTAG" -p ${HA_LOGFACILITY}.${loglevel}
+       fi
+       if [ "$loglevel" != "debug" ] && [ -n "$HA_LOGFILE" ]; then
+               awk '{ print strftime(ENVIRON["HA_DATEFMT"]) 
ENVIRON["HA_LOGTAG"] ": " ENVIRON["__OCF_PRIO"] ": " $0 }' >> "$HA_LOGFILE"
+       fi
+       if [ -n "$HA_DEBUGLOG" ] && [ "$HA_LOGFILE" != "$HA_DEBUGLOG" ]; then
+               # I don't know why "logfile" is "{date}{tag}: ",
+               # and "debugfile" is "{tag}:\t{date}".
+               # But this is how ocf_log did it; behave the same.
+               awk '{ print ENVIRON["HA_LOGTAG"] "\t" 
strftime(ENVIRON["HA_DATEFMT"]) ENVIRON["__OCF_PRIO"] ": " $0 }' >> 
"$HA_DEBUGLOG"
+       fi
+       if [ -z "$HA_LOGFACILITY" ] && [ -z "$HA_LOGFILE" ] ; then
+               awk '{ print strftime(ENVIRON["HA_DATEFMT"]) 
ENVIRON["HA_LOGTAG"] ": " ENVIRON["__OCF_PRIO"] ": " $0 }' >&2
+       fi
+}
+
 #
 # ocf_exit_reason: print exit error string to stderr
 # Usage:           Allows the OCF script to provide a string
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/resource-agents-4.17.0+git18.92719d83/heartbeat/podman-etcd 
new/resource-agents-4.17.0+git30.b33c378d/heartbeat/podman-etcd
--- old/resource-agents-4.17.0+git18.92719d83/heartbeat/podman-etcd     
2025-12-08 15:46:10.000000000 +0100
+++ new/resource-agents-4.17.0+git30.b33c378d/heartbeat/podman-etcd     
2026-01-22 08:54:44.000000000 +0100
@@ -738,8 +738,8 @@
 
 etcd_pod_container_exists() {
        local count_matches
-       # Check whether the etcd pod exists on the same node (header line 
included)
-       count_matches=$(crictl pods --label app=etcd -q | xargs -I {} crictl ps 
--pod {} -o json | jq -r '.containers[].metadata | select ( .name == "etcd" 
).name' | wc -l)
+       # Check whether the etcd pod exists on the same node (including 
stopped/exited containers)
+       count_matches=$(crictl pods --label app=etcd -q | xargs -I {} crictl ps 
-a --pod {} -o json | jq -r '.containers[].metadata | select ( .name == "etcd" 
).name' | wc -l)
        if [ "$count_matches" -eq 1 ]; then
                # etcd pod found
                return 0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/resource-agents-4.17.0+git18.92719d83/heartbeat/powervs-move-ip.in 
new/resource-agents-4.17.0+git30.b33c378d/heartbeat/powervs-move-ip.in
--- old/resource-agents-4.17.0+git18.92719d83/heartbeat/powervs-move-ip.in      
2025-12-08 15:46:10.000000000 +0100
+++ new/resource-agents-4.17.0+git30.b33c378d/heartbeat/powervs-move-ip.in      
2026-01-22 08:54:44.000000000 +0100
@@ -310,9 +310,9 @@
                     return json.load(f)
                 finally:
                     fcntl.flock(f, fcntl.LOCK_UN)
-        except (json.JSONDecodeError, FileNotFoundError, PermissionError):
+        except (json.JSONDecodeError, FileNotFoundError, PermissionError) as e:
             ocf.logger.warning(
-                "[PowerCloudTokenManager] _read_cache: failed to read token 
cache read due to missing file or malformed JSON."
+                f"[PowerCloudTokenManager] _read_cache: failed to read token 
cache read due to missing file or malformed JSON: '{e}'"
             )
             return {}
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/resource-agents-4.17.0+git18.92719d83/heartbeat/powervs-subnet.in 
new/resource-agents-4.17.0+git30.b33c378d/heartbeat/powervs-subnet.in
--- old/resource-agents-4.17.0+git18.92719d83/heartbeat/powervs-subnet.in       
2025-12-08 15:46:10.000000000 +0100
+++ new/resource-agents-4.17.0+git30.b33c378d/heartbeat/powervs-subnet.in       
2026-01-22 08:54:44.000000000 +0100
@@ -243,7 +243,16 @@
 
         @staticmethod
         def up(name, **kwargs):
-            return nmcli._nmcli_cmd("connection", "up", name, **kwargs)
+            nmcli._nmcli_cmd("connection", "up", name, **kwargs)
+
+            for i in range(1, 10):
+                time.sleep(1)
+                status = nmcli._nmcli_cmd("connection", "show", name, **kwargs)
+                if len(status.get("IP4.ADDRESS[1]", "")) > 0:
+                    return ocf.OCF_SUCCESS
+                ocf.logger.warning(f"nmcli.connection.up: check {i} of 10: IP 
not yet available.")
+
+            return ocf.OCF_ERR_GENERIC
 
         @staticmethod
         def find(match_key, match_value):
@@ -824,10 +833,13 @@
         conn_options.update({"802-3-ethernet.mtu": "9000", 
"ethtool.feature-tso": "on"})
 
     nmcli.connection.add(conn_name, options=conn_options)
-    nmcli.connection.up(conn_name)
-
-    if monitor_action(**res_options) != ocf.OCF_SUCCESS:
-        raise PowerCloudAPIError(f"start_action: start subnet: 
{ws.subnet_name} failed")
+    rc = nmcli.connection.up(conn_name)
+    if rc != ocf.OCF_SUCCESS:
+        return rc
+
+    rc = monitor_action(**res_options)
+    if rc != ocf.OCF_SUCCESS:
+        raise PowerCloudAPIError(f"start_action: start subnet: 
{ws.subnet_name} failed", rc)
 
     ocf.logger.info(
         f"start_action: finished, added connection {conn_name} for subnet 
{ws.subnet_name}"
@@ -861,8 +873,9 @@
 
     ws.subnet_remove()
 
-    if monitor_action(**res_options) != ocf.OCF_NOT_RUNNING:
-        raise PowerCloudAPIError(f"stop_action: stop subnet {ws.subnet_name} 
failed")
+    rc = monitor_action(**res_options)
+    if rc != ocf.OCF_NOT_RUNNING:
+        raise PowerCloudAPIError(f"stop_action: stop subnet {ws.subnet_name} 
failed", rc)
 
     ocf.logger.info(
         f"stop_action: finished, deleted connection for subnet 
{ws.subnet_name}"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/resource-agents-4.17.0+git18.92719d83/tools/findif.c 
new/resource-agents-4.17.0+git30.b33c378d/tools/findif.c
--- old/resource-agents-4.17.0+git18.92719d83/tools/findif.c    2025-12-08 
15:46:10.000000000 +0100
+++ new/resource-agents-4.17.0+git30.b33c378d/tools/findif.c    2026-01-22 
08:54:44.000000000 +0100
@@ -417,7 +417,6 @@
 ValidateIFName(const char *ifname, struct ifreq *ifr) 
 {
        int skfd = -1;
-       char *colonptr;
 
        if ( (skfd = socket(PF_INET, SOCK_DGRAM, 0)) == -1 ) {
                fprintf(stderr, "%s\n", strerror(errno));
@@ -428,7 +427,7 @@
        *(ifr->ifr_name + sizeof(ifr->ifr_name) - 1) = '\0';
 
        /* Contain a ":"?  Probably an error, but treat as warning at present */
-       if ((colonptr = strchr(ifname, ':')) != NULL) {
+       if (strchr(ifname, ':') != NULL) {
                fprintf(stderr, "%s: warning: name may be invalid\n",
                  ifr->ifr_name);
        }

Reply via email to