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 2025-01-29 16:09:36
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/resource-agents (Old)
 and      /work/SRC/openSUSE:Factory/.resource-agents.new.2316 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "resource-agents"

Wed Jan 29 16:09:36 2025 rev:135 rq:1241131 version:4.16.0+git38.da9ef4e2

Changes:
--------
--- /work/SRC/openSUSE:Factory/resource-agents/resource-agents.changes  
2024-11-29 00:08:12.999763748 +0100
+++ 
/work/SRC/openSUSE:Factory/.resource-agents.new.2316/resource-agents.changes    
    2025-01-29 16:09:42.929815588 +0100
@@ -1,0 +2,30 @@
+Tue Jan 28 15:57:41 UTC 2025 - Peter Varkoly <vark...@suse.com>
+
+- drop HA package cluster-glue and Linux-HA style fence agents in FrameworkOne
+  (jsc#PED-8498) 
+  Remove dependency: cluster-glue-devel. As a result of this sfex_init, 
sfex_stat,
+  resource-agents-deps.target and ldirectord.service were removed also.
+- Update to version 4.16.0+git38.da9ef4e2:
+  * storage-mon: log "storage_mon is already running" in start-action
+  * storage-mon: check if daemon is already running during start-action
+  * storage-mon: replace dashes with underscores in functions
+  * ocf-binaries: add FGREP
+  * Filesystem: dont report warnings when creating a Filesystem resource
+  * ibm-cloud-vpc-move-fip: new resource agent (#2008)
+  * ibm-cloud-vpc-cr-vip: fix ImportError logging
+  * All agents: use detected grep -E/-F instead of egrep/fgrep when detected
+  * ibm-cloud-vpc-cr-vip: dont build if ibm_cloud_fail_over is not installed
+  * nfsserver: dont use init-scripts if systemd is running
+  * ibm-cloud-vpc-cr-vip: new resource agent (#2002)
+  * ocf-shellfuncs: fixed bash systax error added at 
a25f08cf98d784894df9c52960eff5ccef059393
+  * openstack-cinder-volume: fix detach not working during start-action after 
#2000
+  * openstack-cinder-volume: wait for volume to be available
+  * spec: update Requires paths for RHEL10/CentOS 10
+  * awsvip: let user specify which interface to use, and make the parameter 
optional in aws-vpc-move-ip
+  * aws.sh: add get_interface_mac()
+  * Mid: storage-mon RA: Wait until monitor confirms the startup pid according 
to the OCF resource specification.
+  * High: storage-mon: Correct the timing of setting notification values to 
storage-mon(RA) clients.
+  * aws.sh/ocf-shellfuncs: add ability to fresh token if it's invalid
+  * aws.sh: chmod 600 $TOKEN_FILE, add get_instance_id() with DMI support, and 
use get_instance_id() in AWS agents
+
+-------------------------------------------------------------------

Old:
----
  resource-agents-4.16.0+git2.20a433c3.tar.xz

New:
----
  resource-agents-4.16.0+git38.da9ef4e2.tar.xz

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

Other differences:
------------------
++++++ resource-agents.spec ++++++
--- /var/tmp/diff_new_pack.MKT7aH/_old  2025-01-29 16:09:43.593843124 +0100
+++ /var/tmp/diff_new_pack.MKT7aH/_new  2025-01-29 16:09:43.593843124 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package resource-agents
 #
-# Copyright (c) 2024 SUSE LLC
+# Copyright (c) 2025 SUSE LLC
 #
 # 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.16.0+git2.20a433c3
+Version:        4.16.0+git38.da9ef4e2
 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
@@ -47,7 +47,6 @@
 BuildRequires:  %{python_module urllib3}
 BuildRequires:  autoconf
 BuildRequires:  automake
-BuildRequires:  cluster-glue-devel
 BuildRequires:  docbook-xsl-stylesheets
 BuildRequires:  docbook_4
 BuildRequires:  libqb-devel
@@ -213,10 +212,7 @@
 %{_prefix}/lib/ocf/lib/heartbeat
 %{_sbindir}/ocf-tester
 %{_sbindir}/ocft
-%{_sbindir}/sfex_init
-%{_sbindir}/sfex_stat
 %{_includedir}/heartbeat
-%{_unitdir}/resource-agents-deps.target
 %ghost %dir %attr (1755, root, root) %{_rundir}/resource-agents
 %doc AUTHORS
 %license COPYING
@@ -226,7 +222,6 @@
 %{_mandir}/man7/*.7*
 %exclude %{_mandir}/man7/ocf_heartbeat_ZFS.*
 %{_mandir}/man8/ocf-tester.8*
-%{_mandir}/man8/sfex_init.8*
 %doc doc/README.webapps
 # For compatability with pre-existing agents
 %dir %{_sysconfdir}/ha.d
@@ -246,7 +241,6 @@
 %dir %{_sysconfdir}/ha.d/resource.d
 %{_sbindir}/ldirectord
 %{_sbindir}/rcldirectord
-%{_unitdir}/ldirectord.service
 %exclude %{_sysconfdir}/init.d/ldirectord
 %{_sysconfdir}/ha.d/resource.d/ldirectord
 %config(noreplace) %{_sysconfdir}/logrotate.d/ldirectord

++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.MKT7aH/_old  2025-01-29 16:09:43.645845281 +0100
+++ /var/tmp/diff_new_pack.MKT7aH/_new  2025-01-29 16:09:43.645845281 +0100
@@ -1,7 +1,7 @@
 <servicedata>
 <service name="tar_scm">
 <param name="url">https://github.com/ClusterLabs/resource-agents.git</param>
-<param name="changesrevision">20a433c39ceff08c91316695fa2e99519a4ed302</param>
+<param name="changesrevision">de51a1705ce761f1fb5f1b2294cfc1153af70c1c</param>
 </service>
 </servicedata>
 (No newline at EOF)

++++++ resource-agents-4.16.0+git2.20a433c3.tar.xz -> 
resource-agents-4.16.0+git38.da9ef4e2.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/resource-agents-4.16.0+git2.20a433c3/.gitignore 
new/resource-agents-4.16.0+git38.da9ef4e2/.gitignore
--- old/resource-agents-4.16.0+git2.20a433c3/.gitignore 2024-11-12 
09:00:46.000000000 +0100
+++ new/resource-agents-4.16.0+git38.da9ef4e2/.gitignore        2025-01-28 
09:10:22.000000000 +0100
@@ -66,6 +66,8 @@
 heartbeat/gcp-vpc-move-ip
 heartbeat/gcp-vpc-move-route
 heartbeat/gcp-vpc-move-vip
+heartbeat/ibm-cloud-vpc-cr-vip
+heartbeat/ibm-cloud-vpc-move-fip
 heartbeat/iSCSILogicalUnit
 heartbeat/iSCSITarget
 heartbeat/jira
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/resource-agents-4.16.0+git2.20a433c3/configure.ac 
new/resource-agents-4.16.0+git38.da9ef4e2/configure.ac
--- old/resource-agents-4.16.0+git2.20a433c3/configure.ac       2024-11-12 
09:00:46.000000000 +0100
+++ new/resource-agents-4.16.0+git38.da9ef4e2/configure.ac      2025-01-28 
09:10:22.000000000 +0100
@@ -492,12 +492,12 @@
 AC_PATH_PROGS(PING, ping, /bin/ping)
 AC_PATH_PROGS(IFCONFIG, ifconfig, /sbin/ifconfig)
 AC_PATH_PROGS(MAILCMD, mailx mail, mail)
-AC_PATH_PROGS(EGREP, egrep)
 AC_PATH_PROGS(RM, rm)
+AC_PROG_EGREP
+AC_PROG_FGREP
 
 AC_SUBST(BASH_SHELL)
 AC_SUBST(MAILCMD)
-AC_SUBST(EGREP)
 AC_SUBST(SHELL)
 AC_SUBST(PING)
 AC_SUBST(RM)
@@ -521,6 +521,7 @@
 AC_PYTHON_MODULE(pyroute2)
 AC_PYTHON_MODULE(requests)
 AC_PYTHON_MODULE(urllib3)
+AC_PYTHON_MODULE(ibm_cloud_fail_over)
 
 AS_VERSION_COMPARE([$PYTHON_VERSION], [3.6], [BUILD_OCF_PY=0], 
[BUILD_OCF_PY=1], [BUILD_OCF_PY=1])
 
@@ -566,6 +567,20 @@
 fi
 AM_CONDITIONAL(BUILD_POWERVS_SUBNET, test $BUILD_POWERVS_SUBNET -eq 1)
 
+BUILD_IBM_CLOUD_VPC_MOVE_ROUTE=1
+if test -z "$PYTHON" || test $BUILD_OCF_PY -eq 0 || test 
"x${HAVE_PYMOD_IBM_CLOUD_FAIL_OVER}" != xyes; then
+    BUILD_IBM_CLOUD_VPC_MOVE_ROUTE=0
+    AC_MSG_WARN("Not building ibm-cloud-vpc-cr-vip")
+fi
+AM_CONDITIONAL(BUILD_IBM_CLOUD_VPC_MOVE_ROUTE, test 
$BUILD_IBM_CLOUD_VPC_MOVE_ROUTE -eq 1)
+
+BUILD_IBM_CLOUD_VPC_MOVE_FIP=1
+if test -z "$PYTHON" || test $BUILD_OCF_PY -eq 0 || test 
"x${HAVE_PYMOD_IBM_CLOUD_FAIL_OVER}" != xyes; then
+    BUILD_IBM_CLOUD_VPC_MOVE_FIP=0
+    AC_MSG_WARN("Not building ibm-cloud-vpc-move-fip")
+fi
+AM_CONDITIONAL(BUILD_IBM_CLOUD_VPC_MOVE_FIP, test 
$BUILD_IBM_CLOUD_VPC_MOVE_FIP -eq 1)
+
 AC_PATH_PROGS(ROUTE, route)
 AC_DEFINE_UNQUOTED(ROUTE, "$ROUTE", path to route command)
 
@@ -1016,6 +1031,8 @@
 AC_CONFIG_FILES([heartbeat/gcp-vpc-move-ip], [chmod +x 
heartbeat/gcp-vpc-move-ip])
 AC_CONFIG_FILES([heartbeat/gcp-vpc-move-vip], [chmod +x 
heartbeat/gcp-vpc-move-vip])
 AC_CONFIG_FILES([heartbeat/gcp-vpc-move-route], [chmod +x 
heartbeat/gcp-vpc-move-route])
+AC_CONFIG_FILES([heartbeat/ibm-cloud-vpc-cr-vip], [chmod +x 
heartbeat/ibm-cloud-vpc-cr-vip])
+AC_CONFIG_FILES([heartbeat/ibm-cloud-vpc-move-fip], [chmod +x 
heartbeat/ibm-cloud-vpc-move-fip])
 AC_CONFIG_FILES([heartbeat/iSCSILogicalUnit], [chmod +x 
heartbeat/iSCSILogicalUnit])
 AC_CONFIG_FILES([heartbeat/iSCSITarget], [chmod +x heartbeat/iSCSITarget])
 AC_CONFIG_FILES([heartbeat/jira], [chmod +x heartbeat/jira])
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/resource-agents-4.16.0+git2.20a433c3/doc/man/Makefile.am 
new/resource-agents-4.16.0+git38.da9ef4e2/doc/man/Makefile.am
--- old/resource-agents-4.16.0+git2.20a433c3/doc/man/Makefile.am        
2024-11-12 09:00:46.000000000 +0100
+++ new/resource-agents-4.16.0+git38.da9ef4e2/doc/man/Makefile.am       
2025-01-28 09:10:22.000000000 +0100
@@ -241,6 +241,14 @@
 man_MANS               += ocf_heartbeat_powervs-subnet.7
 endif
 
+if BUILD_IBM_CLOUD_VPC_MOVE_ROUTE
+man_MANS               += ocf_heartbeat_ibm-cloud-vpc-cr-vip.7
+endif
+
+if BUILD_IBM_CLOUD_VPC_MOVE_FIP
+man_MANS               += ocf_heartbeat_ibm-cloud-vpc-move-fip.7
+endif
+
 xmlfiles               = $(man_MANS:.7=.xml)
 
 %.1 %.5 %.7 %.8: %.xml
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/resource-agents-4.16.0+git2.20a433c3/heartbeat/Filesystem 
new/resource-agents-4.16.0+git38.da9ef4e2/heartbeat/Filesystem
--- old/resource-agents-4.16.0+git2.20a433c3/heartbeat/Filesystem       
2024-11-12 09:00:46.000000000 +0100
+++ new/resource-agents-4.16.0+git38.da9ef4e2/heartbeat/Filesystem      
2025-01-28 09:10:22.000000000 +0100
@@ -1145,7 +1145,7 @@
 check_binary $MOUNT
 check_binary $UMOUNT
 
-if [ "$OP" != "monitor" ]; then
+if [ "$OP" != "monitor" ] && [ "$OP" != "validate-all" ]; then
        ocf_log info "Running $OP for $DEVICE on $MOUNTPOINT"
 fi
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/resource-agents-4.16.0+git2.20a433c3/heartbeat/IPaddr2 
new/resource-agents-4.16.0+git38.da9ef4e2/heartbeat/IPaddr2
--- old/resource-agents-4.16.0+git2.20a433c3/heartbeat/IPaddr2  2024-11-12 
09:00:46.000000000 +0100
+++ new/resource-agents-4.16.0+git38.da9ef4e2/heartbeat/IPaddr2 2025-01-28 
09:10:22.000000000 +0100
@@ -1028,7 +1028,7 @@
                echo "partial2"
                return 0
        fi
-       if egrep -q "(^|,)${IP_INC_NO}(,|$)" $IP_CIP_FILE ; then
+       if $EGREP -q "(^|,)${IP_INC_NO}(,|$)" $IP_CIP_FILE ; then
                echo "ok"
                return 0
        else
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/resource-agents-4.16.0+git2.20a433c3/heartbeat/Makefile.am 
new/resource-agents-4.16.0+git38.da9ef4e2/heartbeat/Makefile.am
--- old/resource-agents-4.16.0+git2.20a433c3/heartbeat/Makefile.am      
2024-11-12 09:00:46.000000000 +0100
+++ new/resource-agents-4.16.0+git38.da9ef4e2/heartbeat/Makefile.am     
2025-01-28 09:10:22.000000000 +0100
@@ -210,6 +210,14 @@
 ocf_SCRIPTS         += powervs-subnet
 endif
 
+if BUILD_IBM_CLOUD_VPC_MOVE_ROUTE
+ocf_SCRIPTS         += ibm-cloud-vpc-cr-vip
+endif
+
+if BUILD_IBM_CLOUD_VPC_MOVE_FIP
+ocf_SCRIPTS         += ibm-cloud-vpc-move-fip
+endif
+
 ocfcommondir           = $(OCF_LIB_DIR_PREFIX)/heartbeat
 ocfcommon_DATA         = ocf-shellfuncs        \
                          ocf-binaries          \
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/resource-agents-4.16.0+git2.20a433c3/heartbeat/ManageVE.in 
new/resource-agents-4.16.0+git38.da9ef4e2/heartbeat/ManageVE.in
--- old/resource-agents-4.16.0+git2.20a433c3/heartbeat/ManageVE.in      
2024-11-12 09:00:46.000000000 +0100
+++ new/resource-agents-4.16.0+git38.da9ef4e2/heartbeat/ManageVE.in     
2025-01-28 09:10:22.000000000 +0100
@@ -273,7 +273,7 @@
 declare -i veidtest1=$?
 
 # really a number?
-`echo "$OCF_RESKEY_veid" | egrep -q '^[[:digit:]]+$'`
+`echo "$OCF_RESKEY_veid" | $EGREP -q '^[[:digit:]]+$'`
 
 if [[ $veidtest1 != 1 || $? != 0 ]]; then
   ocf_log err "OCF_RESKEY_veid not set or not a number."
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/resource-agents-4.16.0+git2.20a433c3/heartbeat/SAPInstance 
new/resource-agents-4.16.0+git38.da9ef4e2/heartbeat/SAPInstance
--- old/resource-agents-4.16.0+git2.20a433c3/heartbeat/SAPInstance      
2024-11-12 09:00:46.000000000 +0100
+++ new/resource-agents-4.16.0+git38.da9ef4e2/heartbeat/SAPInstance     
2025-01-28 09:10:22.000000000 +0100
@@ -795,7 +795,7 @@
       esac
 
       SEARCH=`echo "$OCF_RESKEY_MONITOR_SERVICES" | sed 's/\+/\\\+/g' | sed 
's/\./\\\./g'`
-      if [ `echo "$SERVICE" | egrep -c "$SEARCH"` -eq 1 ]
+      if [ `echo "$SERVICE" | $EGREP -c "$SEARCH"` -eq 1 ]
       then
           if [ $STATE -eq $OCF_NOT_RUNNING ]
           then
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/resource-agents-4.16.0+git2.20a433c3/heartbeat/VirtualDomain 
new/resource-agents-4.16.0+git38.da9ef4e2/heartbeat/VirtualDomain
--- old/resource-agents-4.16.0+git2.20a433c3/heartbeat/VirtualDomain    
2024-11-12 09:00:46.000000000 +0100
+++ new/resource-agents-4.16.0+git38.da9ef4e2/heartbeat/VirtualDomain   
2025-01-28 09:10:22.000000000 +0100
@@ -975,7 +975,7 @@
                                sed "s/%n/$target_node/g"`
 
                # extract migrationuri from options
-               elif echo "$migrate_opts" | fgrep -qs -- "--migrateuri="; then
+               elif echo "$migrate_opts" | $FGREP -qs -- "--migrateuri="; then
                        migrateuri=`echo "$migrate_opts" |
                                sed "s/.*--migrateuri=\([^ 
]*\).*/\1/;s/%n/$target_node/g"`
 
@@ -1148,7 +1148,7 @@
        VIRSH_OPTIONS="--connect=${OCF_RESKEY_hypervisor} --quiet"
 
        # Retrieve the domain name from the xml file.
-       DOMAIN_NAME=`egrep '[[:space:]]*<name>.*</name>[[:space:]]*$' 
${OCF_RESKEY_config} 2>/dev/null | sed -e 
's/[[:space:]]*<name>\(.*\)<\/name>[[:space:]]*$/\1/'`
+       DOMAIN_NAME=`$EGREP '[[:space:]]*<name>.*</name>[[:space:]]*$' 
${OCF_RESKEY_config} 2>/dev/null | sed -e 
's/[[:space:]]*<name>\(.*\)<\/name>[[:space:]]*$/\1/'`
 
        EMULATOR_STATE="${HA_RSCTMP}/VirtualDomain-${DOMAIN_NAME}-emu.state"
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/resource-agents-4.16.0+git2.20a433c3/heartbeat/WAS 
new/resource-agents-4.16.0+git38.da9ef4e2/heartbeat/WAS
--- old/resource-agents-4.16.0+git2.20a433c3/heartbeat/WAS      2024-11-12 
09:00:46.000000000 +0100
+++ new/resource-agents-4.16.0+git38.da9ef4e2/heartbeat/WAS     2025-01-28 
09:10:22.000000000 +0100
@@ -227,7 +227,7 @@
     esac
     PortCount=`expr $PortCount + 1`
   done
-  netstat -ltnp  2>/dev/null| egrep -i "($pat) .*LISTEN" | sed 's%.*LISTEN *%%'
+  netstat -ltnp  2>/dev/null| $EGREP -i "($pat) .*LISTEN" | sed 's%.*LISTEN 
*%%'
 }
 
 #
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/resource-agents-4.16.0+git2.20a433c3/heartbeat/WAS6 
new/resource-agents-4.16.0+git38.da9ef4e2/heartbeat/WAS6
--- old/resource-agents-4.16.0+git2.20a433c3/heartbeat/WAS6     2024-11-12 
09:00:46.000000000 +0100
+++ new/resource-agents-4.16.0+git38.da9ef4e2/heartbeat/WAS6    2025-01-28 
09:10:22.000000000 +0100
@@ -196,7 +196,7 @@
     esac
     PortCount=`expr $PortCount + 1`
   done
-  netstat -ltnp  2>/dev/null| egrep -i "($pat) .*LISTEN" | sed 's%.*LISTEN *%%'
+  netstat -ltnp  2>/dev/null| $EGREP -i "($pat) .*LISTEN" | sed 's%.*LISTEN 
*%%'
 }
 
 #
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/resource-agents-4.16.0+git2.20a433c3/heartbeat/aws-vpc-move-ip 
new/resource-agents-4.16.0+git38.da9ef4e2/heartbeat/aws-vpc-move-ip
--- old/resource-agents-4.16.0+git2.20a433c3/heartbeat/aws-vpc-move-ip  
2024-11-12 09:00:46.000000000 +0100
+++ new/resource-agents-4.16.0+git38.da9ef4e2/heartbeat/aws-vpc-move-ip 
2025-01-28 09:10:22.000000000 +0100
@@ -157,7 +157,7 @@
 <content type="string" default="${OCF_RESKEY_routing_table_role_default}" />
 </parameter>
 
-<parameter name="interface" required="1">
+<parameter name="interface" required="0">
 <longdesc lang="en">
 Name of the network interface, i.e. eth0
 </longdesc>
@@ -269,7 +269,7 @@
 
        TOKEN=$(get_token)
        [ $? -ne 0 ] && exit $OCF_ERR_GENERIC
-       EC2_INSTANCE_ID=$(curl_retry "$OCF_RESKEY_curl_retries" 
"$OCF_RESKEY_curl_sleep" "--show-error -s -H 'X-aws-ec2-metadata-token: 
$TOKEN'" "http://169.254.169.254/latest/meta-data/instance-id";)
+       EC2_INSTANCE_ID=$(get_instance_id)
        [ $? -ne 0 ] && exit $OCF_ERR_GENERIC
 
        if [ -z "${EC2_INSTANCE_ID}" ]; then
@@ -321,7 +321,7 @@
                ocf_log debug "monitor: Enhanced Monitoring disabled - omitting 
API call"
        fi
 
-       cmd="ip addr show to $OCF_RESKEY_ip up"
+       cmd="ip addr show dev $OCF_RESKEY_interface to $OCF_RESKEY_ip up"
        ocf_log debug "executing command: $cmd"
        RESULT=$($cmd | grep "$OCF_RESKEY_ip")
        if [ -z "$RESULT" ]; then
@@ -331,7 +331,7 @@
                        level="info"
                fi
 
-               ocf_log "$level" "IP $OCF_RESKEY_ip not assigned to running 
interface"
+               ocf_log "$level" "IP $OCF_RESKEY_ip not assigned to interface 
$OCF_RESKEY_interface"
                return $OCF_NOT_RUNNING
        fi
 
@@ -369,19 +369,7 @@
 }
 
 ec2ip_get_instance_eni() {
-       MAC_FILE="/sys/class/net/${OCF_RESKEY_interface}/address"
-       if [ -f $MAC_FILE ]; then
-               cmd="cat ${MAC_FILE}"
-       else
-               cmd="ip -br link show dev ${OCF_RESKEY_interface} | tr -s ' ' | 
cut -d' ' -f3"
-       fi
-       ocf_log debug "executing command: $cmd"
-       MAC_ADDR="$(eval $cmd)"
-       rc=$?
-       if [ $rc != 0 ]; then
-               ocf_log warn "command failed, rc: $rc"
-               return $OCF_ERR_GENERIC
-       fi
+       MAC_ADDR=$(get_interface_mac)
        ocf_log debug "MAC address associated with interface 
${OCF_RESKEY_interface}: ${MAC_ADDR}"
 
        cmd="curl_retry \"$OCF_RESKEY_curl_retries\" \"$OCF_RESKEY_curl_sleep\" 
\"--show-error -s -H 'X-aws-ec2-metadata-token: $TOKEN'\" 
\"http://169.254.169.254/latest/meta-data/network/interfaces/macs/${MAC_ADDR}/interface-id\"";
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/resource-agents-4.16.0+git2.20a433c3/heartbeat/aws.sh 
new/resource-agents-4.16.0+git38.da9ef4e2/heartbeat/aws.sh
--- old/resource-agents-4.16.0+git2.20a433c3/heartbeat/aws.sh   2024-11-12 
09:00:46.000000000 +0100
+++ new/resource-agents-4.16.0+git38.da9ef4e2/heartbeat/aws.sh  2025-01-28 
09:10:22.000000000 +0100
@@ -9,8 +9,8 @@
 . ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs
 
 # Defaults
-OCF_RESKEY_curl_retries_default="3"
-OCF_RESKEY_curl_sleep_default="1"
+OCF_RESKEY_curl_retries_default="4"
+OCF_RESKEY_curl_sleep_default="3"
 
 : ${OCF_RESKEY_curl_retries=${OCF_RESKEY_curl_retries_default}}
 : ${OCF_RESKEY_curl_sleep=${OCF_RESKEY_curl_sleep_default}}
@@ -18,13 +18,16 @@
 # Function to enable reusable IMDS token retrieval for efficient repeated 
access 
 # File to store the token and timestamp
 TOKEN_FILE="${HA_RSCTMP}/.aws_imds_token"
+TOKEN_FUNC="fetch_new_token"  # Used by curl_retry() if saved token is invalid
 TOKEN_LIFETIME=21600  # Token lifetime in seconds (6 hours)
 TOKEN_EXPIRY_THRESHOLD=3600  # Renew token if less than 60 minutes (1 hour) 
remaining
+DMI_FILE="/sys/devices/virtual/dmi/id/board_asset_tag" # Only supported on 
nitro-based instances.
 
 # Function to fetch a new token
 fetch_new_token() {
     TOKEN=$(curl_retry "$OCF_RESKEY_curl_retries" "$OCF_RESKEY_curl_sleep" 
"--show-error -sX PUT -H 'X-aws-ec2-metadata-token-ttl-seconds: 
$TOKEN_LIFETIME'" "http://169.254.169.254/latest/api/token";)
     echo "$TOKEN $(date +%s)" > "$TOKEN_FILE"
+    chmod 600 "$TOKEN_FILE"
     echo "$TOKEN"
 }
 
@@ -43,4 +46,49 @@
     fi
     # Fetch a new token if not valid
     fetch_new_token
-}
\ No newline at end of file
+}
+
+get_instance_id() {
+    local INSTANCE_ID
+
+    # Try to get the EC2 instance ID from DMI first before falling back to 
IMDS.
+    ocf_log debug "EC2: Attempt to get EC2 Instance ID from local file."
+    if [ -r "$DMI_FILE" ] && [ -s "$DMI_FILE" ]; then
+        INSTANCE_ID="$(cat "$DMI_FILE")"
+        case "$INSTANCE_ID" in
+            i-0*) echo "$INSTANCE_ID"; return "$OCF_SUCCESS" ;;
+        esac
+    fi
+
+    INSTANCE_ID=$(curl_retry "$OCF_RESKEY_curl_retries" 
"$OCF_RESKEY_curl_sleep" "--show-error -s -H 'X-aws-ec2-metadata-token: 
$TOKEN'" "http://169.254.169.254/latest/meta-data/instance-id";)
+    if [ $? -ne 0 ]; then
+        ocf_exit_reason "Failed to get EC2 Instance ID"
+        exit $OCF_ERR_GENERIC
+    fi
+
+    echo "$INSTANCE_ID"
+    return "$OCF_SUCCESS"
+}
+
+get_interface_mac() {
+    local MAC_FILE MAC_ADDR rc
+    MAC_FILE="/sys/class/net/${OCF_RESKEY_interface}/address"
+    if [ -z "$OCF_RESKEY_interface" ]; then
+        cmd="curl_retry \"$OCF_RESKEY_curl_retries\" 
\"$OCF_RESKEY_curl_sleep\" \"--show-error -s -H 'X-aws-ec2-metadata-token: 
$TOKEN'\" \"http://169.254.169.254/latest/meta-data/mac\"";
+    elif [ -f "$MAC_FILE" ]; then
+        cmd="cat ${MAC_FILE}"
+    else
+        cmd="ip -br link show dev ${OCF_RESKEY_interface} | tr -s ' ' | cut 
-d' ' -f3"
+    fi
+    ocf_log debug "executing command: $cmd"
+    MAC_ADDR="$(eval $cmd)"
+    rc=$?
+    if [ $rc != 0 ]; then
+        ocf_log warn "command failed, rc: $rc"
+        return $OCF_ERR_GENERIC
+    fi
+    ocf_log debug "MAC address associated with interface 
${OCF_RESKEY_interface}: ${MAC_ADDR}"
+
+    echo $MAC_ADDR
+    return $OCF_SUCCESS
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/resource-agents-4.16.0+git2.20a433c3/heartbeat/awseip 
new/resource-agents-4.16.0+git38.da9ef4e2/heartbeat/awseip
--- old/resource-agents-4.16.0+git2.20a433c3/heartbeat/awseip   2024-11-12 
09:00:46.000000000 +0100
+++ new/resource-agents-4.16.0+git38.da9ef4e2/heartbeat/awseip  2025-01-28 
09:10:22.000000000 +0100
@@ -305,7 +305,7 @@
 PRIVATE_IP_ADDRESS="${OCF_RESKEY_private_ip_address}"
 TOKEN=$(get_token)
 [ $? -ne 0 ] && exit $OCF_ERR_GENERIC
-INSTANCE_ID=$(curl_retry "$OCF_RESKEY_curl_retries" "$OCF_RESKEY_curl_sleep" 
"--show-error -s -H 'X-aws-ec2-metadata-token: $TOKEN'" 
"http://169.254.169.254/latest/meta-data/instance-id";)
+INSTANCE_ID=$(get_instance_id)
 [ $? -ne 0 ] && exit $OCF_ERR_GENERIC
 
 case $__OCF_ACTION in
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/resource-agents-4.16.0+git2.20a433c3/heartbeat/awsvip 
new/resource-agents-4.16.0+git38.da9ef4e2/heartbeat/awsvip
--- old/resource-agents-4.16.0+git2.20a433c3/heartbeat/awsvip   2024-11-12 
09:00:46.000000000 +0100
+++ new/resource-agents-4.16.0+git38.da9ef4e2/heartbeat/awsvip  2025-01-28 
09:10:22.000000000 +0100
@@ -49,12 +49,14 @@
 OCF_RESKEY_profile_default="default"
 OCF_RESKEY_region_default=""
 OCF_RESKEY_api_delay_default="3"
+OCF_RESKEY_interface_default=""
 
 : ${OCF_RESKEY_awscli=${OCF_RESKEY_awscli_default}}
 : ${OCF_RESKEY_auth_type=${OCF_RESKEY_auth_type_default}}
 : ${OCF_RESKEY_profile=${OCF_RESKEY_profile_default}}
 : ${OCF_RESKEY_region=${OCF_RESKEY_region_default}}
 : ${OCF_RESKEY_api_delay=${OCF_RESKEY_api_delay_default}}
+: ${OCF_RESKEY_interface=${OCF_RESKEY_interface_default}}
 
 meta_data() {
     cat <<END
@@ -125,6 +127,14 @@
 <content type="integer" default="${OCF_RESKEY_api_delay_default}" />
 </parameter>
 
+<parameter name="interface" required="0">
+<longdesc lang="en">
+Name of the network interface, i.e. eth0
+</longdesc>
+<shortdesc lang="en">network interface name</shortdesc>
+<content type="string" default="${OCF_RESKEY_interface_default}" />
+</parameter>
+
 <parameter name="curl_retries" unique="0">
 <longdesc lang="en">
 curl retries before failing
@@ -207,16 +217,16 @@
 }
 
 awsvip_monitor() {
-    $AWSCLI_CMD ec2 describe-instances \
-            --instance-id "${INSTANCE_ID}" \
-            --query 
'Reservations[].Instances[].NetworkInterfaces[].PrivateIpAddresses[].PrivateIpAddress[]'
 \
+    $AWSCLI_CMD ec2 describe-network-interfaces \
+            --network-interface-ids "${NETWORK_ID}" \
+            --query 
'NetworkInterfaces[].PrivateIpAddresses[].PrivateIpAddress[]' \
             --output text | \
             grep -qE "(^|\s)${SECONDARY_PRIVATE_IP}(\s|$)"
-    RET=$?
-
-    if [ $RET -ne 0 ]; then
+    if [ $? -ne 0 ]; then
+        [ "$__OCF_ACTION" = "monitor" ] && ! ocf_is_probe && ocf_log error "IP 
$SECONDARY_PRIVATE_IP not assigned to interface ${NETWORK_ID}"
         return $OCF_NOT_RUNNING
     fi
+
     return $OCF_SUCCESS
 }
 
@@ -265,9 +275,9 @@
 SECONDARY_PRIVATE_IP="${OCF_RESKEY_secondary_private_ip}"
 TOKEN=$(get_token)
 [ $? -ne 0 ] && exit $OCF_ERR_GENERIC
-INSTANCE_ID=$(curl_retry "$OCF_RESKEY_curl_retries" "$OCF_RESKEY_curl_sleep" 
"--show-error -s -H 'X-aws-ec2-metadata-token: $TOKEN'" 
"http://169.254.169.254/latest/meta-data/instance-id";)
+INSTANCE_ID=$(get_instance_id)
 [ $? -ne 0 ] && exit $OCF_ERR_GENERIC
-MAC_ADDRESS=$(curl_retry "$OCF_RESKEY_curl_retries" "$OCF_RESKEY_curl_sleep" 
"--show-error -s -H 'X-aws-ec2-metadata-token: $TOKEN'" 
"http://169.254.169.254/latest/meta-data/mac";)
+MAC_ADDRESS=$(get_interface_mac)
 [ $? -ne 0 ] && exit $OCF_ERR_GENERIC
 NETWORK_ID=$(curl_retry "$OCF_RESKEY_curl_retries" "$OCF_RESKEY_curl_sleep" 
"--show-error -s -H 'X-aws-ec2-metadata-token: $TOKEN'" 
"http://169.254.169.254/latest/meta-data/network/interfaces/macs/${MAC_ADDRESS}/interface-id";)
 [ $? -ne 0 ] && exit $OCF_ERR_GENERIC
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/resource-agents-4.16.0+git2.20a433c3/heartbeat/docker 
new/resource-agents-4.16.0+git38.da9ef4e2/heartbeat/docker
--- old/resource-agents-4.16.0+git2.20a433c3/heartbeat/docker   2024-11-12 
09:00:46.000000000 +0100
+++ new/resource-agents-4.16.0+git38.da9ef4e2/heartbeat/docker  2025-01-28 
09:10:22.000000000 +0100
@@ -512,7 +512,7 @@
        # - image
        # - repository:port/image
        # - docker.io/image (some distro will display "docker.io/" as prefix)
-       docker images | awk '{print $1 ":" $2}' | egrep -q -s 
"^(docker.io\/|${SERVER_NAME}\/)?${IMAGE_NAME}:${IMAGE_TAG}\$"
+       docker images | awk '{print $1 ":" $2}' | $EGREP -q -s 
"^(docker.io\/|${SERVER_NAME}\/)?${IMAGE_NAME}:${IMAGE_TAG}\$"
        if [ $? -eq 0 ]; then
                # image found
                return 0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/resource-agents-4.16.0+git2.20a433c3/heartbeat/eDir88.in 
new/resource-agents-4.16.0+git38.da9ef4e2/heartbeat/eDir88.in
--- old/resource-agents-4.16.0+git2.20a433c3/heartbeat/eDir88.in        
2024-11-12 09:00:46.000000000 +0100
+++ new/resource-agents-4.16.0+git38.da9ef4e2/heartbeat/eDir88.in       
2025-01-28 09:10:22.000000000 +0100
@@ -331,7 +331,7 @@
 
     # Monitor IDM first, as it will start before LDAP
     if [ $MONITOR_IDM -eq 1 ]; then
-        RET=$($NDSTRACE --config-file "$NDSCONF" -c modules | egrep -i 
'^vrdim.*Running' | awk '{print $1}')
+        RET=$($NDSTRACE --config-file "$NDSCONF" -c modules | $EGREP -i 
'^vrdim.*Running' | awk '{print $1}')
         if [ "$RET" !=  "vrdim" ]; then
             ocf_log err "eDirectory IDM engine isn't running ($NDSCONF)."
             return $OCF_ERR_GENERIC
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/resource-agents-4.16.0+git2.20a433c3/heartbeat/ibm-cloud-vpc-cr-vip.in 
new/resource-agents-4.16.0+git38.da9ef4e2/heartbeat/ibm-cloud-vpc-cr-vip.in
--- old/resource-agents-4.16.0+git2.20a433c3/heartbeat/ibm-cloud-vpc-cr-vip.in  
1970-01-01 01:00:00.000000000 +0100
+++ new/resource-agents-4.16.0+git38.da9ef4e2/heartbeat/ibm-cloud-vpc-cr-vip.in 
2025-01-28 09:10:22.000000000 +0100
@@ -0,0 +1,246 @@
+#!@PYTHON@ -tt
+# ------------------------------------------------------------------------
+# Description: Resource Agent to move a IBM Cloud VIP based on Custom Route
+#              Next-hop Change from one virtual network interface (VNI) to
+#              the Second virtual network interface (VNI)
+#
+# Authors:      Eran Gampel
+#
+# Copyright (c) 2024 International Business Machines, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ------------------------------------------------------------------------
+import subprocess
+import ipaddress
+import os
+import sys
+import textwrap
+import time
+
+OCF_FUNCTIONS_DIR = os.environ.get(
+    "OCF_FUNCTIONS_DIR", "%s/lib/heartbeat" % os.environ.get("OCF_ROOT")
+)
+
+sys.path.append(OCF_FUNCTIONS_DIR)
+
+RETRY_COUNT = 1
+SLEEP_TIME  = 1
+
+try:
+    import ocf
+except ImportError:
+    sys.stderr.write("ImportError: ocf module import failed.")
+    sys.exit(5)
+
+try:
+    import ibm_cloud_fail_over
+except ImportError:
+    ocf.logger.error("ImportError: import of ibm_cloud_fail_over module 
failed."   \
+                        "install using: pip install ibm_cloud_fail_over")
+    pass
+
+def os_ip(ip):
+    """Check if VSI own this IP address."""
+
+    command = ["ip", "a"]
+    response = subprocess.run(command, capture_output=True, text=True)
+    return ip in  response.stdout
+
+def ip_address_validator(ip):
+    """validate ip address string
+
+    Args:
+        ip (string): ip address
+
+    Returns:
+        bool: true if the strig is a valid ipv4 ip address
+    """
+    try:
+        ipaddress.ip_address(ip)
+        return True
+    except ValueError:
+        return False
+
+def validate_all_action(
+    vpc_url="",
+    ext_ip_1="",
+    ext_ip_2="",
+    api_key="",
+):
+    """validate all paramters
+
+    Args:
+        vpc_url (str, mandatory): vpc_url for the region.
+        ext_ip_1 (str, mandatory): First Instance IP.
+        ext_ip_2 (str, mandatory): Second Instance IP.
+        api_key (str, optional): IBM Cloud API access key. Defaults to "".
+
+    Returns:
+        _type_: _description_
+    """
+    if not ip_address_validator(ext_ip_1):
+        return ocf.OCF_ERR_CONFIGURED
+    if not ip_address_validator(ext_ip_2):
+        return ocf.OCF_ERR_CONFIGURED
+    ocf.logger.debug(f"validate_all_action: {vpc_url} {api_key}")
+    return ocf.OCF_SUCCESS
+
+def stop_action(
+    vpc_url="",
+    ext_ip_1="",
+    ext_ip_2="",
+    api_key="",
+):
+    """Stop VIP
+
+    Args:
+        vpc_url (str, mandatory): vpc_url for the region.
+        ext_ip_1 (str, mandatory): First Instance IP.
+        ext_ip_2 (str, mandatory): Second Instance IP.
+        api_key (str, optional): IBM Cloud API access key. Defaults to "".
+
+    Returns:
+        _type_: _description_
+    """
+    ocf.logger.info("stop_action: stopping")
+    res = monitor_action(vpc_url, ext_ip_1, ext_ip_2, api_key)
+    if res == ocf.OCF_NOT_RUNNING:
+        ocf.logger.info("Resource is already stopped")
+    if res == ocf.OCF_SUCCESS:
+        for i in range(0,RETRY_COUNT):
+            time.sleep(SLEEP_TIME)
+            res = monitor_action(vpc_url, ext_ip_1, ext_ip_2, api_key)
+            if res == ocf.OCF_NOT_RUNNING:
+                break
+    return ocf.OCF_SUCCESS
+
+def start_action(
+    vpc_url="",
+    ext_ip_1="",
+    ext_ip_2="",
+    api_key="",
+):
+    """start_action: redirect  the service ip.
+    Args:
+        vpc_url (str, mandatory): vpc_url for the region .
+        ext_ip_1 (str, mandatory): First Instance IP.
+        ext_ip_2 (str, mandatory): Second Instance IP.
+        api_key (str, optional): IBM Cloud API access key. Defaults to "".
+
+    Change custom route nexthop to point to this endpoint.
+    In case of a cross AZ Active Passive the route advertize zone will
+    be changed to the new active zone
+    """
+    try:
+        ibm_cloud_fail_over.fail_over_cr_vip("SET", vpc_url , ext_ip_1,
+               ext_ip_2, api_key)
+        active_ip = ibm_cloud_fail_over.fail_over_cr_vip("GET", vpc_url ,
+               ext_ip_1, ext_ip_2, api_key)
+        ocf.logger.info(f"start_action: active_ip: {active_ip}")
+    except Exception as e:
+        ocf.logger.error('Couldn\'t connect with IBM Cloud api: ' + str(e))
+        sys.exit(ocf.OCF_ERR_GENERIC)
+
+    return ocf.OCF_SUCCESS
+
+def monitor_action(
+    vpc_url="",
+    ext_ip_1="",
+    ext_ip_2="",
+    api_key="",
+):
+    """monitor_action: check if service ip and gateway are responding."""
+
+    ocf.logger.debug("monitor_action:")
+    try:
+        active_ip = ibm_cloud_fail_over.fail_over_cr_vip("GET", vpc_url , 
ext_ip_1,
+                       ext_ip_2, api_key)
+        if ip_address_validator(active_ip):
+            if os_ip(active_ip):
+               return ocf.OCF_SUCCESS
+        return ocf.OCF_NOT_RUNNING
+    except Exception as e:
+        ocf.logger.error('Couldn\'t connect with IBM Cloud api: ' + str(e))
+        sys.exit(ocf.OCF_ERR_GENERIC)
+
+
+def main():
+    """Instantiate the resource agent."""
+
+    agent_description = textwrap.dedent("""\
+        Resource Agent to move a IBM Cloud VIP based on Custom Route
+        from one virtual network interface (VNI) to another.
+        The prerequisites for the use of this resource agent are as follows:
+
+        1. A two-node (VSI or BM) cluster distributed in same Avilability zone 
or across.
+        2. Enable Instance Metadata enabled on the two nodes
+        3. allow_ip_spoofing enabled on the Virtual network interface
+        3. IBM Cloud API Key or Trused profile:
+    """)
+
+    agent = ocf.Agent(
+        "ibm-cloud-vpc-cr-vip",
+        shortdesc="Manages moving an IBM Cloud VIP based on Custom Route",
+        longdesc=agent_description
+    )
+
+
+    agent.add_parameter(
+        "vpc_url",
+        shortdesc="VPC_URL",
+        longdesc="IBM Cloud Public VPC URL for your region or a VPE URL for 
IBM Cloud VPC",
+        content_type="string",
+        required=True,
+    )
+
+    agent.add_parameter(
+        "ext_ip_1",
+        shortdesc="Ip address for first instance.",
+        longdesc="predefined private ip address for first instance.",
+        content_type="string",
+        required=True,
+    )
+
+    agent.add_parameter(
+        "ext_ip_2",
+        shortdesc="Ip address for second instance.",
+        longdesc="predefined private ip address for second instance.",
+        content_type="string",
+        required=True,
+    )
+
+
+    agent.add_parameter(
+        "api_key",
+        shortdesc="API Key or @API_KEY_FILE_PATH",
+        longdesc=(
+            "API Key or @API_KEY_FILE_PATH for IBM Cloud access. "
+            "The API key content or the path of an API key file that is 
indicated by the @ symbol."
+            "Not needed if trusted profile is used"
+        ),
+        content_type="string",
+        required=False,
+    )
+
+
+    agent.add_action("start", timeout=30, handler=start_action)
+    agent.add_action("stop", timeout=30, handler=stop_action)
+    agent.add_action(
+        "monitor", depth=0, timeout=60, interval=60, handler=monitor_action
+    )
+    agent.add_action("validate-all", timeout=30, handler=validate_all_action)
+    agent.run()
+
+
+if __name__ == "__main__":
+    main()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/resource-agents-4.16.0+git2.20a433c3/heartbeat/ibm-cloud-vpc-move-fip.in 
new/resource-agents-4.16.0+git38.da9ef4e2/heartbeat/ibm-cloud-vpc-move-fip.in
--- 
old/resource-agents-4.16.0+git2.20a433c3/heartbeat/ibm-cloud-vpc-move-fip.in    
    1970-01-01 01:00:00.000000000 +0100
+++ 
new/resource-agents-4.16.0+git38.da9ef4e2/heartbeat/ibm-cloud-vpc-move-fip.in   
    2025-01-28 09:10:22.000000000 +0100
@@ -0,0 +1,249 @@
+#!@PYTHON@ -tt
+# ------------------------------------------------------------------------
+# Description:  Resource Agent to move an IBM Cloud  Floating IP (FIP)
+#              From one Virtual network Interface to another
+#
+# Authors:      Eran Gampel
+#
+# Copyright (c) 2025 International Business Machines, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ------------------------------------------------------------------------
+import subprocess
+import ipaddress
+import os
+import sys
+import textwrap
+
+OCF_FUNCTIONS_DIR = os.environ.get(
+    "OCF_FUNCTIONS_DIR", "%s/lib/heartbeat" % os.environ.get("OCF_ROOT")
+)
+
+sys.path.append(OCF_FUNCTIONS_DIR)
+
+
+try:
+    import ocf
+except ImportError:
+    sys.stderr.write("ImportError: ocf module import failed.")
+    sys.exit(5)
+
+try:
+    import ibm_cloud_fail_over
+except ImportError:
+    ocf.logger.error("ImportError: import of ibm_cloud_fail_over module 
failed."   \
+                        "install using: pip install ibm_cloud_fail_over")
+    pass
+
+def os_ip(ip):
+    """Check if VSI own this IP address."""
+
+    command = ["ip", "a"]
+    response = subprocess.run(command, capture_output=True, text=True, 
check=False)
+    return ip in  response.stdout
+
+def ip_address_validator(ip):
+    """validate ip address string
+
+    Args:
+        ip (string): ip address
+
+    Returns:
+        bool: true if the strig is a valid ipv4 ip address
+    """
+    try:
+        ipaddress.ip_address(ip)
+        return True
+    except ValueError:
+        return False
+
+def validate_all_action(
+    vpc_url="",
+    vni_id_1="",
+    vni_id_2="",
+    api_key="",
+):
+    """validate all paramters
+
+    Args:
+        vpc_url (str, mandatory): vpc_url for the region .
+        vni_id_1 (str, mandatory): First VNI(Virtual Network Interface) ID.
+        vni_id_2 (str, mandatory): Second VNI(Virtual Network Interface) ID.
+        api_key (str, optional): IBM Cloud API Access key. Defaults to "".
+
+    Returns:
+        _type_: _description_
+    """
+    if not ip_address_validator(vni_id_1):
+        return ocf.OCF_ERR_CONFIGURED
+    if not ip_address_validator(vni_id_2):
+        return ocf.OCF_ERR_CONFIGURED
+    ocf.logger.debug(f"validate_all_action: {vpc_url} {api_key}")
+    return ocf.OCF_SUCCESS
+
+def stop_action(
+    vpc_url="",
+    vni_id_1="",
+    vni_id_2="",
+    fip_id="",
+    api_key="",
+):
+    """Stop VIP
+
+    Args:
+        vpc_url (str, mandatory): vpc_url for the region .
+        vni_id_1 (str, mandatory): First VNI(Virtual Network Interface) ID.
+        vni_id_2 (str, mandatory): Second VNI(Virtual Network Interface) ID.
+        api_key (str, optional): IBM Cloud API Access key. Defaults to "".
+
+    Returns:
+        _type_: _description_
+    """
+    res = monitor_action(vpc_url, vni_id_1, vni_id_2, api_key)
+    if res == ocf.OCF_NOT_RUNNING:
+        ocf.logger.info("Resource is already stopped")
+        return ocf.OCF_SUCCESS
+    try:
+        ocf.logger.info("stop_action:stoping")
+        ibm_cloud_fail_over.fail_over_floating_ip_stop(vpc_url , vni_id_1,
+                                                       vni_id_2, fip_id, 
api_key)
+    except Exception as e:
+        ocf.logger.error('stop_action: Couldn\'t connect with IBM Cloud api: ' 
+ str(e))
+        sys.exit(ocf.OCF_ERR_GENERIC)
+    return ocf.OCF_SUCCESS
+
+def start_action(
+    vpc_url="",
+    vni_id_1="",
+    vni_id_2="",
+    fip_id="",
+    api_key="",
+):
+    """start_action: redirect  the service ip.
+    Args:
+        vpc_url (str, mandatory): vpc_url for the region .
+        vni_id_1 (str, mandatory): First VNI(Virtual Network Interface) ID.
+        vni_id_2 (str, mandatory): Second VNI(Virtual Network Interface) ID.
+        api_key (str, optional): IBM Cloud API Access key. Defaults to "".
+
+    Change custom route nexthop to point to this endpoint.
+    In case of a cross AZ Active Passive the route adveritise zone will
+    be chaged to the new acrtive zone
+    """
+    try:
+        active_fip_id , active_fip_ip = 
ibm_cloud_fail_over.fail_over_floating_ip_start(vpc_url,
+                                                     vni_id_1, vni_id_2, 
fip_id, api_key)
+    except Exception as e:
+        ocf.logger.error('start_action: Couldn\'t connect with IBM Cloud api: 
' + str(e))
+        sys.exit(ocf.OCF_ERR_GENERIC)
+    if active_fip_id != fip_id:
+        ocf.logger.error(f'start_action: fip_id: {fip_id} is not attached')
+        return ocf.OCF_ERR_GENERIC
+    ocf.logger.info(f'start_action: OCF_SUCCESS FIP IP: {active_fip_ip} is 
active')
+    return ocf.OCF_SUCCESS
+
+def monitor_action(
+    vpc_url="",
+    vni_id_1="",
+    vni_id_2="",
+    fip_id="",
+    api_key="",
+):
+    """monitor_action: check if service ip and gateway are responding."""
+    ocf.logger.debug(f'monitor_action: url: {vpc_url} fip_id: {fip_id}' \
+                        f'{vni_id_1}  "vni_id_2:" {vni_id_2}')
+    try:
+        active_fip_id , active_fip_ip = 
ibm_cloud_fail_over.fail_over_get_attached_fip(api_key)
+        if active_fip_id == fip_id:
+            ocf.logger.debug(f'monitor_action: active fip ip: {active_fip_ip}')
+            return ocf.OCF_SUCCESS
+        return ocf.OCF_NOT_RUNNING
+    except Exception as e:
+        ocf.logger.error('Couldn\'t connect with IBM Cloud api: ' + str(e))
+        sys.exit(ocf.OCF_ERR_GENERIC)
+
+
+def main():
+    """Instantiate the resource agent."""
+
+    agent_description = textwrap.dedent("""\
+        Resource Agent to move an IBM Cloud Public Floating IP (FIP) from one 
virtual network
+        interface (VNI) to another.
+        The prerequisites for the use of this resource agent are as follows:
+
+        1. A two-node (VSI or BM) cluster distributed in same Availability 
Zone.
+        2. Enable Instance Metadata on the two nodes.
+        3. Use IBM Cloud API Key or Trusted Profile.
+       4. Assign a Floating IP to one VNI.
+    """)
+
+    agent = ocf.Agent(
+        "ibm-cloud-vpc-move-fip",
+        shortdesc="Manages moving an IBM Cloud Public FIP IP",
+        longdesc=agent_description
+    )
+
+
+    agent.add_parameter(
+        "vpc_url",
+        shortdesc="VPC_URL",
+        longdesc="IBM Cloud Public VPC URL for your region or a VPE URL for 
IBM Cloud VPC",
+        content_type="string",
+        required=True,
+    )
+
+    agent.add_parameter(
+        "vni_id_1",
+        shortdesc="IBM Cloud Virtual Network Interface UUID for first 
instance",
+        longdesc="IBM Cloud Virtual Network Interface UUID (VNI) for first 
instance.",
+        content_type="string",
+        required=True,
+    )
+
+    agent.add_parameter(
+        "vni_id_2",
+        shortdesc="IBM Cloud Virtual Network Interface UUID for Second 
instance",
+        longdesc="IBM Cloud Virtual Network Interface UUID (VNI) for Second 
instance.",
+        content_type="string",
+        required=True,
+    )
+
+    agent.add_parameter(
+        "fip_id",
+        shortdesc="IBM Cloud Floating IP (FIP) UUID to be used for internet 
(public) traffic",
+        longdesc="IBM Cloud Floating IP (FIP) UUID to be used for internet 
(public) traffic.",
+        content_type="string",
+        required=True,
+    )
+
+    agent.add_parameter(
+        "api_key",
+        shortdesc="API Key",
+        longdesc=(
+            "API Key for IBM Cloud Access."
+            "Not needed if Trusted Profile is used"
+        ),
+        content_type="string",
+        required=False,
+    )
+
+    agent.add_action("start", timeout=30, handler=start_action)
+    agent.add_action("stop", timeout=30, handler=stop_action)
+    agent.add_action(
+        "monitor", depth=0, timeout=60, interval=60, handler=monitor_action
+    )
+    agent.add_action("validate-all", timeout=60, handler=validate_all_action)
+    agent.run()
+
+if __name__ == "__main__":
+    main()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/resource-agents-4.16.0+git2.20a433c3/heartbeat/mysql-proxy 
new/resource-agents-4.16.0+git38.da9ef4e2/heartbeat/mysql-proxy
--- old/resource-agents-4.16.0+git2.20a433c3/heartbeat/mysql-proxy      
2024-11-12 09:00:46.000000000 +0100
+++ new/resource-agents-4.16.0+git38.da9ef4e2/heartbeat/mysql-proxy     
2025-01-28 09:10:22.000000000 +0100
@@ -572,7 +572,7 @@
     fi
 
     # check for valid log-level
-    echo $log_level | egrep -q "^(error|warning|info|message|debug|)$"
+    echo $log_level | $EGREP -q "^(error|warning|info|message|debug|)$"
     if [ $? -ne 0 ]; then
         ocf_log err "MySQL Proxy log level '$log_level' not in valid range 
error|warning|info|message|debug"
         return $OCF_ERR_CONFIGURED
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/resource-agents-4.16.0+git2.20a433c3/heartbeat/nfsserver 
new/resource-agents-4.16.0+git38.da9ef4e2/heartbeat/nfsserver
--- old/resource-agents-4.16.0+git2.20a433c3/heartbeat/nfsserver        
2024-11-12 09:00:46.000000000 +0100
+++ new/resource-agents-4.16.0+git38.da9ef4e2/heartbeat/nfsserver       
2025-01-28 09:10:22.000000000 +0100
@@ -264,7 +264,7 @@
        ##
        # If the user defined an init script, It must exist for us to continue
        ##
-       if [ -n "$OCF_RESKEY_nfs_init_script" ]; then
+       if ! $systemd_is_running && [ -n "$OCF_RESKEY_nfs_init_script" ]; then
                # check_binary will exit the process if init script does not 
exist
                check_binary ${OCF_RESKEY_nfs_init_script}
                EXEC_MODE=1
@@ -274,7 +274,7 @@
        ##
        # Check to see if the default init script exists, if so we'll use that.
        ##
-       if which $DEFAULT_INIT_SCRIPT > /dev/null 2>&1; then
+       if ! $systemd_is_running && which $DEFAULT_INIT_SCRIPT > /dev/null 
2>&1; then
                OCF_RESKEY_nfs_init_script=$DEFAULT_INIT_SCRIPT
                EXEC_MODE=1
                return 0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/resource-agents-4.16.0+git2.20a433c3/heartbeat/ocf-binaries.in 
new/resource-agents-4.16.0+git38.da9ef4e2/heartbeat/ocf-binaries.in
--- old/resource-agents-4.16.0+git2.20a433c3/heartbeat/ocf-binaries.in  
2024-11-12 09:00:46.000000000 +0100
+++ new/resource-agents-4.16.0+git38.da9ef4e2/heartbeat/ocf-binaries.in 
2025-01-28 09:10:22.000000000 +0100
@@ -9,6 +9,7 @@
 # Binaries and binary options for use in Resource Agents
 : ${AWK:=@AWK@}
 : ${EGREP:="@EGREP@"}
+: ${FGREP:="@FGREP@"}
 : ${IFCONFIG_A_OPT:="@IFCONFIG_A_OPT@"}
 : ${MAILCMD:=@MAILCMD@}
 : ${PING:=@PING@}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/resource-agents-4.16.0+git2.20a433c3/heartbeat/ocf-shellfuncs.in 
new/resource-agents-4.16.0+git38.da9ef4e2/heartbeat/ocf-shellfuncs.in
--- old/resource-agents-4.16.0+git2.20a433c3/heartbeat/ocf-shellfuncs.in        
2024-11-12 09:00:46.000000000 +0100
+++ new/resource-agents-4.16.0+git38.da9ef4e2/heartbeat/ocf-shellfuncs.in       
2025-01-28 09:10:22.000000000 +0100
@@ -697,6 +697,15 @@
 
                ocf_log debug "result: $result"
                [ $rc -eq 0 ] && break
+               if [ -n "$TOKEN" ] && [ -n "$TOKEN_FILE" ] && \
+                  [ -f "$TOKEN_FILE" ] && [ -n "$TOKEN_FUNC" ] && \
+                  echo "$result" | grep -q "The requested URL returned error: 
401$"; then
+                       local OLD_TOKEN="$TOKEN"
+                       ocf_log err "Token invalid. Getting new token."
+                       TOKEN=$($TOKEN_FUNC)
+                       [ $? -ne 0 ] && exit $OCF_ERR_GENERIC
+                       args=$(echo "$args" | sed "s/$OLD_TOKEN/$TOKEN/")
+               fi
                sleep $sleep
        done
 
@@ -733,7 +742,7 @@
        # The subshell prevents parsing error with incompatible shells
        ocf_version_cmp "$OCF_RESKEY_crm_feature_set" "3.19.7"
        if [ $res -eq 2 ] || [ $res -eq 1 ]; then
-               "$SHELL" -c "CIB_file=<(${HA_SBIN_DIR}/cibadmin -Q \
+               "$SHELL" -c "CIB_file=<(${HA_SBIN_DIR}/cibadmin -Q) \
                        ${HA_SBIN_DIR}/crm_mon \$*" -- $*
        else
                "$SHELL" -c "CIB_file=<(${HA_SBIN_DIR}/cibadmin -Q | sed 
's/validate-with=\"[^\"]*\"/validate-with=\"none\"/') \
@@ -1110,4 +1119,4 @@
 # pacemaker sets HA_use_logd, some others use HA_LOGD :/
 if ocf_is_true "$HA_use_logd"; then
        : ${HA_LOGD:=yes}
-fi
\ No newline at end of file
+fi
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/resource-agents-4.16.0+git2.20a433c3/heartbeat/openstack-cinder-volume 
new/resource-agents-4.16.0+git38.da9ef4e2/heartbeat/openstack-cinder-volume
--- old/resource-agents-4.16.0+git2.20a433c3/heartbeat/openstack-cinder-volume  
2024-11-12 09:00:46.000000000 +0100
+++ new/resource-agents-4.16.0+git38.da9ef4e2/heartbeat/openstack-cinder-volume 
2025-01-28 09:10:22.000000000 +0100
@@ -141,22 +141,24 @@
 
        node_id=$(_get_node_id)
 
-       if [ "$__OCF_ACTION" = "monitor" ] && ocf_is_true 
$OCF_RESKEY_volume_local_check ; then
-               #
-               # Is the volue attached?
-               # We check the local devices
-               #
-               short_volume_id=$(echo $OCF_RESKEY_volume_id | awk '{print 
substr($0, 0, 20)}')
-               if lsblk /dev/disk/by-id/virtio-$short_volume_id 1>/dev/null 
2>&1; then
-                       return $OCF_SUCCESS
-               else
-                       ocf_log warn "$OCF_RESKEY_volume_id is not attached to 
instance $node_id"
-                       return $OCF_NOT_RUNNING
+       if ocf_is_true $OCF_RESKEY_volume_local_check ; then
+               if [ "$__OCF_ACTION" = "monitor" ] || [ "$1" = "quick" ]; then
+                       #
+                       # Is the volume attached?
+                       # We check the local devices
+                       #
+                       short_volume_id=$(echo $OCF_RESKEY_volume_id | awk 
'{print substr($0, 0, 20)}')
+                       if lsblk /dev/disk/by-id/virtio-$short_volume_id 
1>/dev/null 2>&1; then
+                               return $OCF_SUCCESS
+                       else
+                               ocf_log warn "$OCF_RESKEY_volume_id is not 
attached to instance $node_id"
+                               return $OCF_NOT_RUNNING
+                       fi
                fi
        fi
 
        #
-       # Is the volue attached?
+       # Is the volume attached?
        # We use the API
        #
        result=$(run_openstackcli "volume show \
@@ -247,6 +249,11 @@
                return $OCF_ERR_GENERIC
        fi
 
+       while ! osvol_monitor quick; do
+               ocf_log info "Waiting for cinder volume $OCF_RESKEY_volume_id 
to appear on $node_id"
+               sleep 1
+       done
+
        return $OCF_SUCCESS
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/resource-agents-4.16.0+git2.20a433c3/heartbeat/portblock 
new/resource-agents-4.16.0+git38.da9ef4e2/heartbeat/portblock
--- old/resource-agents-4.16.0+git2.20a433c3/heartbeat/portblock        
2024-11-12 09:00:46.000000000 +0100
+++ new/resource-agents-4.16.0+git38.da9ef4e2/heartbeat/portblock       
2025-01-28 09:10:22.000000000 +0100
@@ -529,7 +529,7 @@
 CheckPort() {
 #      Examples of valid port: "1080", "1", "0080"
 #      Examples of invalid port: "1080bad", "0", "0000", ""
-  echo $1 |egrep -qx '[0-9]+(:[0-9]+)?(,[0-9]+(:[0-9]+)?)*'
+  echo $1 | $EGREP -qx '[0-9]+(:[0-9]+)?(,[0-9]+(:[0-9]+)?)*'
 }
 
 IptablesValidateAll()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/resource-agents-4.16.0+git2.20a433c3/heartbeat/rabbitmq-server-ha 
new/resource-agents-4.16.0+git38.da9ef4e2/heartbeat/rabbitmq-server-ha
--- old/resource-agents-4.16.0+git2.20a433c3/heartbeat/rabbitmq-server-ha       
2024-11-12 09:00:46.000000000 +0100
+++ new/resource-agents-4.16.0+git38.da9ef4e2/heartbeat/rabbitmq-server-ha      
2025-01-28 09:10:22.000000000 +0100
@@ -529,7 +529,7 @@
         pid="none"
     else
         # check if provide just a number
-        echo "${pid_param}" | egrep -q '^[0-9]+$'
+        echo "${pid_param}" | $EGREP -q '^[0-9]+$'
         if [ $? -eq 0 ]; then
             pid="${pid_param}"
         elif [ -e "${pid_param}" ]; then # check if passed in a pid file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/resource-agents-4.16.0+git2.20a433c3/heartbeat/sapdb.sh 
new/resource-agents-4.16.0+git38.da9ef4e2/heartbeat/sapdb.sh
--- old/resource-agents-4.16.0+git2.20a433c3/heartbeat/sapdb.sh 2024-11-12 
09:00:46.000000000 +0100
+++ new/resource-agents-4.16.0+git38.da9ef4e2/heartbeat/sapdb.sh        
2025-01-28 09:10:22.000000000 +0100
@@ -238,7 +238,7 @@
         esac
 
         SEARCH=`echo "$OCF_RESKEY_MONITOR_SERVICES" | sed 's/\+/\\\+/g' | sed 
's/\./\\\./g'`
-        if [ `echo "$SERVICE" | egrep -c "$SEARCH"` -eq 1 ]
+        if [ `echo "$SERVICE" | $EGREP -c "$SEARCH"` -eq 1 ]
         then
             if [ $STATE -eq $OCF_NOT_RUNNING ]
             then
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/resource-agents-4.16.0+git2.20a433c3/heartbeat/smb-share.in 
new/resource-agents-4.16.0+git38.da9ef4e2/heartbeat/smb-share.in
--- old/resource-agents-4.16.0+git2.20a433c3/heartbeat/smb-share.in     
2024-11-12 09:00:46.000000000 +0100
+++ new/resource-agents-4.16.0+git38.da9ef4e2/heartbeat/smb-share.in    
2025-01-28 09:10:22.000000000 +0100
@@ -435,7 +435,7 @@
 smb_share_monitor() {
         RES=$(smbcontrol smbd ping > /dev/null 2>&1)
         if [ $? -eq 0 ];then
-            if [ $(testparm -s 2>/dev/null| egrep -c \\[$OCF_RESKEY_share\\]) 
-eq 1 ];then
+            if [ $(testparm -s 2>/dev/null| $EGREP -c \\[$OCF_RESKEY_share\\]) 
-eq 1 ];then
                 return $OCF_SUCCESS
             else
                 return $OCF_NOT_RUNNING
@@ -449,7 +449,7 @@
         smb_share_checktmpmount
         RES=$(smbcontrol smbd ping > /dev/null 2>&1)
         if [ $? -eq 0 ];then
-            if [ $(testparm -s 2>/dev/null| egrep -c \\[$OCF_RESKEY_share\\]) 
-eq 1 ];then
+            if [ $(testparm -s 2>/dev/null| $EGREP -c \\[$OCF_RESKEY_share\\]) 
-eq 1 ];then
                 ocf_log info "Samba share $OCF_RESKEY_share is active"
                 return $OCF_SUCCESS
             else
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/resource-agents-4.16.0+git2.20a433c3/heartbeat/storage-mon.in 
new/resource-agents-4.16.0+git38.da9ef4e2/heartbeat/storage-mon.in
--- old/resource-agents-4.16.0+git2.20a433c3/heartbeat/storage-mon.in   
2024-11-12 09:00:46.000000000 +0100
+++ new/resource-agents-4.16.0+git38.da9ef4e2/heartbeat/storage-mon.in  
2025-01-28 09:10:22.000000000 +0100
@@ -152,7 +152,7 @@
 
 #######################################################################
 
-storage-mon_usage() {
+storage_mon_usage() {
        cat <<END
 usage: $0 {start|stop|monitor|validate-all|meta-data}
 
@@ -161,7 +161,7 @@
        return $1
 }
 
-storage-mon_init() {
+storage_mon_init() {
        #Test for presence of storage_mon helper
        if [ ! -x "$STORAGEMON" ] ; then
                ocf_log err "${STORAGEMON} not installed."
@@ -205,7 +205,7 @@
        fi
 }
 
-storage-mon_update_attribute() {
+storage_mon_update_attribute() {
 
        while :
        do
@@ -224,9 +224,9 @@
        return $OCF_SUCCESS
 }
 
-storage-mon_monitor() {
+storage_mon_monitor() {
        if ! ocf_is_true "$OCF_RESKEY_daemonize"; then
-               storage-mon_init
+               storage_mon_init
 
                # Monitor _MUST!_ differentiate correctly between running
                # (SUCCESS), failed (ERROR) or _cleanly_ stopped (NOT RUNNING).
@@ -252,7 +252,7 @@
                        status="green"
                fi
 
-               storage-mon_update_attribute $status
+               storage_mon_update_attribute $status
                return "$?"
        else
                ocf_pidfile_status "${PIDFILE}" > /dev/null 2>&1
@@ -298,20 +298,25 @@
                        esac
                done
 
-               storage-mon_update_attribute $status
+               storage_mon_update_attribute $status
                return "$?"
        fi      
 }
 
-storage-mon_start() {
+storage_mon_start() {
        if ! ocf_is_true "$OCF_RESKEY_daemonize"; then
-               storage-mon_monitor
+               storage_mon_monitor
                if [ $? -eq $OCF_SUCCESS ]; then
                        return $OCF_SUCCESS
                fi
                touch "${OCF_RESKEY_state_file}"
        else
-               storage-mon_init
+               storage_mon_monitor pid_check_only
+               if [ $? -eq $OCF_SUCCESS ]; then
+                       ocf_log info "storage_mon is already running. PID=`cat 
$PIDFILE`"
+                       return $OCF_SUCCESS
+               fi
+               storage_mon_init
                # generate command line
                cmdline=""
                for DRIVE in ${OCF_RESKEY_drives}; do
@@ -325,11 +330,22 @@
                if [ "$?" -ne 0 ]; then
                        return $OCF_ERR_GENERIC
                fi
+
+               #Wait until monitor confirms the startup pid according to the 
ocf resource specification.       
+               while true; do
+                       storage_mon_monitor pid_check_only
+                       rc="$?"
+                       if [ $rc -eq $OCF_SUCCESS ]; then
+                               break
+                       fi
+                       sleep 1
+                       ocf_log debug "storage-mon daemon still hasn't started 
yet. Waiting..."
+               done
        fi
 }
 
-storage-mon_stop() {
-       storage-mon_monitor
+storage_mon_stop() {
+       storage_mon_monitor
        rc=$?
 
        if ! ocf_is_true "$OCF_RESKEY_daemonize"; then
@@ -352,7 +368,7 @@
                fi
 
                while true; do
-                       storage-mon_monitor pid_check_only
+                       storage_mon_monitor pid_check_only
                        rc="$?"
                        case "$rc" in
                                $OCF_SUCCESS)
@@ -368,8 +384,8 @@
        return $OCF_SUCCESS
 }
 
-storage-mon_validate() {
-       storage-mon_init
+storage_mon_validate() {
+       storage_mon_init
 
        if ! ocf_is_true "$OCF_RESKEY_daemonize"; then
                # Is the state directory writable?
@@ -385,13 +401,13 @@
 }
 
 case "$__OCF_ACTION" in
-       start)          storage-mon_start;;
-       stop)           storage-mon_stop;;
-       monitor)        storage-mon_monitor;;
-       validate-all)   storage-mon_validate;;
+       start)          storage_mon_start;;
+       stop)           storage_mon_stop;;
+       monitor)        storage_mon_monitor;;
+       validate-all)   storage_mon_validate;;
        meta-data)      meta_data;;
-       usage|help)     storage-mon_usage $OCF_SUCCESS;;
-       *)              storage-mon_usage $OCF_ERR_UNIMPLEMENTED;;
+       usage|help)     storage_mon_usage $OCF_SUCCESS;;
+       *)              storage_mon_usage $OCF_ERR_UNIMPLEMENTED;;
 esac
 rc=$?
 ocf_log debug "${OCF_RESOURCE_INSTANCE} $__OCF_ACTION : $rc"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/resource-agents-4.16.0+git2.20a433c3/heartbeat/symlink 
new/resource-agents-4.16.0+git38.da9ef4e2/heartbeat/symlink
--- old/resource-agents-4.16.0+git2.20a433c3/heartbeat/symlink  2024-11-12 
09:00:46.000000000 +0100
+++ new/resource-agents-4.16.0+git38.da9ef4e2/heartbeat/symlink 2025-01-28 
09:10:22.000000000 +0100
@@ -123,7 +123,7 @@
             ocf_log debug "$OCF_RESKEY_link exists but is not a symbolic link, 
will be moved to ${OCF_RESKEY_link}${OCF_RESKEY_backup_suffix} on start"
             rc=$OCF_NOT_RUNNING
         fi
-    elif readlink -m "$OCF_RESKEY_link" | egrep -q "^$(readlink -m 
${OCF_RESKEY_target})$"; then
+    elif readlink -m "$OCF_RESKEY_link" | $EGREP -q "^$(readlink -m 
${OCF_RESKEY_target})$"; then
         ocf_log debug "$OCF_RESKEY_link exists and is a symbolic link to 
${OCF_RESKEY_target}."
         rc=$OCF_SUCCESS
     else
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/resource-agents-4.16.0+git2.20a433c3/resource-agents.spec.in 
new/resource-agents-4.16.0+git38.da9ef4e2/resource-agents.spec.in
--- old/resource-agents-4.16.0+git2.20a433c3/resource-agents.spec.in    
2024-11-12 09:00:46.000000000 +0100
+++ new/resource-agents-4.16.0+git38.da9ef4e2/resource-agents.spec.in   
2025-01-28 09:10:22.000000000 +0100
@@ -100,14 +100,14 @@
 %endif
 
 # Filesystem / fs.sh / netfs.sh
-%if 0%{?fedora} > 39 || 0%{?suse_version}
+%if 0%{?fedora} > 39 || 0%{?rhel} > 9 || 0%{?suse_version}
 Requires: /usr/sbin/fsck
 %else
 Requires: /sbin/fsck
 %endif
 Requires: /usr/sbin/fsck.ext2 /usr/sbin/fsck.ext3 /usr/sbin/fsck.ext4
 Requires: /usr/sbin/fsck.xfs
-%if 0%{?fedora} > 40 || 0%{?suse_version}
+%if 0%{?fedora} > 40 || 0%{?rhel} > 9 || 0%{?suse_version}
 Requires: /usr/sbin/mount.nfs /usr/sbin/mount.nfs4
 %else
 Requires: /sbin/mount.nfs /sbin/mount.nfs4
@@ -127,7 +127,7 @@
 Requires: /usr/sbin/lvm
 
 # nfsserver / netfs.sh
-%if 0%{?fedora} > 40 || 0%{?suse_version}
+%if 0%{?fedora} > 40 || 0%{?rhel} > 9 || 0%{?suse_version}
 Requires: /usr/sbin/rpc.statd
 %else
 Requires: /sbin/rpc.statd
@@ -141,7 +141,7 @@
 Requires: /sbin/rdisc /usr/sbin/arping /bin/ping /bin/ping6
 
 # nfsexport.sh
-%if 0%{?fedora} > 39
+%if 0%{?fedora} > 39 || 0%{?rhel} > 9
 Requires: /usr/sbin/findfs
 Requires: /usr/sbin/quotaon /usr/sbin/quotacheck
 %else
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/resource-agents-4.16.0+git2.20a433c3/tools/storage_mon.c 
new/resource-agents-4.16.0+git38.da9ef4e2/tools/storage_mon.c
--- old/resource-agents-4.16.0+git2.20a433c3/tools/storage_mon.c        
2024-11-12 09:00:46.000000000 +0100
+++ new/resource-agents-4.16.0+git38.da9ef4e2/tools/storage_mon.c       
2025-01-28 09:10:22.000000000 +0100
@@ -320,7 +320,14 @@
 
                                                finished_count++;
                                                test_forks[index] = 0;
-                                       
+
+                                               /* Update the result value for 
the client response once all checks have completed. */
+                                               if (device_count == 
finished_count) { 
+                                                       response_final_score = 
final_score;
+                                                       if 
(!daemon_check_first_all_devices) {
+                                                               
daemon_check_first_all_devices = TRUE;
+                                                       }
+                                               }
                                        }
                                }
                        } else {
@@ -441,15 +448,7 @@
                if (is_child_runnning()) {
                        device_check = FALSE;
                }
-               
-               if (device_count == finished_count && device_check) { 
-                       /* Update the result value for the client response once 
all checks have completed. */
-                       response_final_score = final_score;
 
-                       if (!daemon_check_first_all_devices) {
-                               daemon_check_first_all_devices = TRUE;
-                       }
-               }
        }
 
        if (device_check) {

++++++ use-python-311.patch ++++++
--- /var/tmp/diff_new_pack.MKT7aH/_old  2025-01-29 16:09:43.833853077 +0100
+++ /var/tmp/diff_new_pack.MKT7aH/_new  2025-01-29 16:09:43.837853243 +0100
@@ -1,5 +1,5 @@
---- resource-agents/configure.ac-orig  2024-07-31 09:21:33.479621551 +0200
-+++ resource-agents/configure.ac       2024-07-31 09:21:58.027818044 +0200
+--- resource-agents-4.16.0+git38.da9ef4e2/configure.ac.orig    2025-01-28 
18:29:13.312397138 +0100
++++ resource-agents-4.16.0+git38.da9ef4e2/configure.ac 2025-01-28 
18:29:53.144814319 +0100
 @@ -503,7 +503,7 @@
  AC_SUBST(RM)
  AC_SUBST(TEST)
@@ -9,9 +9,9 @@
  if test -z "$PYTHON"; then
      echo "*** Essential program python not found" 1>&2
      exit 1
-@@ -522,7 +522,7 @@
- AC_PYTHON_MODULE(requests)
+@@ -523,7 +523,7 @@
  AC_PYTHON_MODULE(urllib3)
+ AC_PYTHON_MODULE(ibm_cloud_fail_over)
  
 -AS_VERSION_COMPARE([$PYTHON_VERSION], [3.6], [BUILD_OCF_PY=0], 
[BUILD_OCF_PY=1], [BUILD_OCF_PY=1])
 +AS_VERSION_COMPARE([$PYTHON_VERSION], [3.11], [BUILD_OCF_PY=0], 
[BUILD_OCF_PY=1], [BUILD_OCF_PY=1])

Reply via email to