diff --git a/SOURCES/RHEL-16246-aws-agents-use-curl_retry.patch b/SOURCES/RHEL-16246-aws-agents-use-curl_retry.patch new file mode 100644 index 0000000..9f035a7 --- /dev/null +++ b/SOURCES/RHEL-16246-aws-agents-use-curl_retry.patch @@ -0,0 +1,343 @@ +From fc0657b936f6a58f741e33f851b22f82bc68bffa Mon Sep 17 00:00:00 2001 +From: Oyvind Albrigtsen +Date: Tue, 6 Feb 2024 13:28:12 +0100 +Subject: [PATCH 1/2] ocf-shellfuncs: add curl_retry() + +--- + heartbeat/ocf-shellfuncs.in | 34 ++++++++++++++++++++++++++++++++++ + 1 file changed, 34 insertions(+) + +diff --git a/heartbeat/ocf-shellfuncs.in b/heartbeat/ocf-shellfuncs.in +index c5edb6f57..a69a9743d 100644 +--- a/heartbeat/ocf-shellfuncs.in ++++ b/heartbeat/ocf-shellfuncs.in +@@ -672,6 +672,40 @@ EOF + systemctl daemon-reload + } + ++# usage: curl_retry RETRIES SLEEP ARGS URL ++# ++# Use --show-error in ARGS to log HTTP error code ++# ++# returns: ++# 0 success ++# exit: ++# 1 fail ++curl_retry() ++{ ++ local retries=$1 sleep=$2 opts=$3 url=$4 ++ local tries=$(($retries + 1)) ++ local args="--fail $opts $url" ++ local result rc ++ ++ for try in $(seq $tries); do ++ ocf_log debug "curl $args try $try of $tries" ++ result=$(echo "$args" | xargs curl 2>&1) ++ rc=$? ++ ++ ocf_log debug "result: $result" ++ [ $rc -eq 0 ] && break ++ sleep $sleep ++ done ++ ++ if [ $rc -ne 0 ]; then ++ ocf_exit_reason "curl $args failed $tries tries" ++ exit $OCF_ERR_GENERIC ++ fi ++ ++ echo "$result" ++ return $rc ++} ++ + # usage: crm_mon_no_validation args... + # run crm_mon without any cib schema validation + # This is useful when an agent runs in a bundle to avoid potential + +From 80d330557319bdae9e45aad1279e435fc481d4e7 Mon Sep 17 00:00:00 2001 +From: Oyvind Albrigtsen +Date: Tue, 6 Feb 2024 13:28:25 +0100 +Subject: [PATCH 2/2] AWS agents: use curl_retry() + +--- + heartbeat/aws-vpc-move-ip | 35 ++++++++++++++++++++++++++--------- + heartbeat/aws-vpc-route53.in | 27 +++++++++++++++++++++++++-- + heartbeat/awseip | 36 +++++++++++++++++++++++++++++++----- + heartbeat/awsvip | 32 ++++++++++++++++++++++++++++---- + 4 files changed, 110 insertions(+), 20 deletions(-) + +diff --git a/heartbeat/aws-vpc-move-ip b/heartbeat/aws-vpc-move-ip +index 54806f6ea..6115e5ba8 100755 +--- a/heartbeat/aws-vpc-move-ip ++++ b/heartbeat/aws-vpc-move-ip +@@ -47,6 +47,8 @@ OCF_RESKEY_interface_default="eth0" + OCF_RESKEY_iflabel_default="" + OCF_RESKEY_monapi_default="false" + OCF_RESKEY_lookup_type_default="InstanceId" ++OCF_RESKEY_curl_retries_default="3" ++OCF_RESKEY_curl_sleep_default="1" + + : ${OCF_RESKEY_awscli=${OCF_RESKEY_awscli_default}} + : ${OCF_RESKEY_auth_type=${OCF_RESKEY_auth_type_default}} +@@ -60,6 +62,8 @@ OCF_RESKEY_lookup_type_default="InstanceId" + : ${OCF_RESKEY_iflabel=${OCF_RESKEY_iflabel_default}} + : ${OCF_RESKEY_monapi=${OCF_RESKEY_monapi_default}} + : ${OCF_RESKEY_lookup_type=${OCF_RESKEY_lookup_type_default}} ++: ${OCF_RESKEY_curl_retries=${OCF_RESKEY_curl_retries_default}} ++: ${OCF_RESKEY_curl_sleep=${OCF_RESKEY_curl_sleep_default}} + ####################################################################### + + +@@ -194,6 +198,22 @@ Name of resource type to lookup in route table. + + + ++ ++ ++curl retries before failing ++ ++curl retries ++ ++ ++ ++ ++ ++curl sleep between tries ++ ++curl sleep ++ ++ ++ + + + +@@ -250,8 +270,10 @@ ec2ip_validate() { + fi + fi + +- TOKEN=$(curl -sX PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600") +- EC2_INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id -H "X-aws-ec2-metadata-token: $TOKEN") ++ TOKEN=$(curl_retry "$OCF_RESKEY_curl_retries" "$OCF_RESKEY_curl_sleep" "--show-error -sX PUT -H 'X-aws-ec2-metadata-token-ttl-seconds: 21600'" "http://169.254.169.254/latest/api/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") ++ [ $? -ne 0 ] && exit $OCF_ERR_GENERIC + + if [ -z "${EC2_INSTANCE_ID}" ]; then + ocf_exit_reason "Instance ID not found. Is this a EC2 instance?" +@@ -365,14 +387,9 @@ ec2ip_get_instance_eni() { + fi + ocf_log debug "MAC address associated with interface ${OCF_RESKEY_interface}: ${MAC_ADDR}" + +- cmd="curl -s http://169.254.169.254/latest/meta-data/network/interfaces/macs/${MAC_ADDR}/interface-id -H \"X-aws-ec2-metadata-token: $TOKEN\"" +- ocf_log debug "executing command: $cmd" ++ 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\"" + EC2_NETWORK_INTERFACE_ID="$(eval $cmd)" +- rc=$? +- if [ $rc != 0 ]; then +- ocf_log warn "command failed, rc: $rc" +- return $OCF_ERR_GENERIC +- fi ++ [ $? -ne 0 ] && exit $OCF_ERR_GENERIC + ocf_log debug "network interface id associated MAC address ${MAC_ADDR}: ${EC2_NETWORK_INTERFACE_ID}" + echo $EC2_NETWORK_INTERFACE_ID + } +diff --git a/heartbeat/aws-vpc-route53.in b/heartbeat/aws-vpc-route53.in +index 18ab157e8..eba2ed95c 100644 +--- a/heartbeat/aws-vpc-route53.in ++++ b/heartbeat/aws-vpc-route53.in +@@ -53,6 +53,8 @@ OCF_RESKEY_hostedzoneid_default="" + OCF_RESKEY_fullname_default="" + OCF_RESKEY_ip_default="local" + OCF_RESKEY_ttl_default=10 ++OCF_RESKEY_curl_retries_default="3" ++OCF_RESKEY_curl_sleep_default="1" + + : ${OCF_RESKEY_awscli=${OCF_RESKEY_awscli_default}} + : ${OCF_RESKEY_auth_type=${OCF_RESKEY_auth_type_default}} +@@ -62,6 +64,8 @@ OCF_RESKEY_ttl_default=10 + : ${OCF_RESKEY_fullname:=${OCF_RESKEY_fullname_default}} + : ${OCF_RESKEY_ip:=${OCF_RESKEY_ip_default}} + : ${OCF_RESKEY_ttl:=${OCF_RESKEY_ttl_default}} ++: ${OCF_RESKEY_curl_retries=${OCF_RESKEY_curl_retries_default}} ++: ${OCF_RESKEY_curl_sleep=${OCF_RESKEY_curl_sleep_default}} + + usage() { + cat <<-EOT +@@ -185,6 +189,22 @@ Time to live for Route53 ARECORD + ARECORD TTL + + ++ ++ ++ ++curl retries before failing ++ ++curl retries ++ ++ ++ ++ ++ ++curl sleep between tries ++ ++curl sleep ++ ++ + + + +@@ -357,8 +377,11 @@ r53_monitor() { + _get_ip() { + case $OCF_RESKEY_ip in + local|public) +- TOKEN=$(curl -sX PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600") +- IPADDRESS=$(curl -s http://169.254.169.254/latest/meta-data/${OCF_RESKEY_ip}-ipv4 -H "X-aws-ec2-metadata-token: $TOKEN");; ++ TOKEN=$(curl_retry "$OCF_RESKEY_curl_retries" "$OCF_RESKEY_curl_sleep" "--show-error -sX PUT -H 'X-aws-ec2-metadata-token-ttl-seconds: 21600'" "http://169.254.169.254/latest/api/token") ++ [ $? -ne 0 ] && exit $OCF_ERR_GENERIC ++ IPADDRESS=$(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/${OCF_RESKEY_ip}-ipv4") ++ [ $? -ne 0 ] && exit $OCF_ERR_GENERIC ++ ;; + *.*.*.*) + IPADDRESS="${OCF_RESKEY_ip}";; + esac +diff --git a/heartbeat/awseip b/heartbeat/awseip +index 49b0ca615..ffb6223a1 100755 +--- a/heartbeat/awseip ++++ b/heartbeat/awseip +@@ -49,12 +49,16 @@ OCF_RESKEY_auth_type_default="key" + OCF_RESKEY_profile_default="default" + OCF_RESKEY_region_default="" + OCF_RESKEY_api_delay_default="3" ++OCF_RESKEY_curl_retries_default="3" ++OCF_RESKEY_curl_sleep_default="1" + + : ${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_curl_retries=${OCF_RESKEY_curl_retries_default}} ++: ${OCF_RESKEY_curl_sleep=${OCF_RESKEY_curl_sleep_default}} + + meta_data() { + cat < + + ++ ++ ++curl retries before failing ++ ++curl retries ++ ++ ++ ++ ++ ++curl sleep between tries ++ ++curl sleep ++ ++ ++ + + + +@@ -171,14 +191,18 @@ awseip_start() { + awseip_monitor && return $OCF_SUCCESS + + if [ -n "${PRIVATE_IP_ADDRESS}" ]; then +- NETWORK_INTERFACES_MACS=$(curl -s http://169.254.169.254/latest/meta-data/network/interfaces/macs/ -H "X-aws-ec2-metadata-token: $TOKEN") ++ NETWORK_INTERFACES_MACS=$(curl_retry "$OCF_RESKEY_curl_retries" "$OCF_RESKEY_curl_sleep" "-s -H 'X-aws-ec2-metadata-token: $TOKEN'" "http://169.254.169.254/latest/meta-data/network/interfaces/macs/") + for MAC in ${NETWORK_INTERFACES_MACS}; do +- curl -s http://169.254.169.254/latest/meta-data/network/interfaces/macs/${MAC}/local-ipv4s -H "X-aws-ec2-metadata-token: $TOKEN" | ++ curl_retry "$OCF_RESKEY_curl_retries" "$OCF_RESKEY_curl_sleep" "-s -H 'X-aws-ec2-metadata-token: $TOKEN'" "http://169.254.169.254/latest/meta-data/network/interfaces/macs/${MAC%/*}/local-ipv4s" | + grep -q "^${PRIVATE_IP_ADDRESS}$" + if [ $? -eq 0 ]; then +- NETWORK_ID=$(curl -s http://169.254.169.254/latest/meta-data/network/interfaces/macs/${MAC}/interface-id -H "X-aws-ec2-metadata-token: $TOKEN") ++ NETWORK_ID=$(curl_retry "$OCF_RESKEY_curl_retries" "$OCF_RESKEY_curl_sleep" "-s -H 'X-aws-ec2-metadata-token: $TOKEN'" "http://169.254.169.254/latest/meta-data/network/interfaces/macs/${MAC%/*}/interface-id") + fi + done ++ if [ -z "$NETWORK_ID" ]; then ++ ocf_exit_reason "Could not find network interface for private_ip_address: $PRIVATE_IP_ADDRESS" ++ exit $OCF_ERR_GENERIC ++ fi + $AWSCLI_CMD ec2 associate-address \ + --network-interface-id ${NETWORK_ID} \ + --allocation-id ${ALLOCATION_ID} \ +@@ -282,8 +306,10 @@ fi + ELASTIC_IP="${OCF_RESKEY_elastic_ip}" + ALLOCATION_ID="${OCF_RESKEY_allocation_id}" + PRIVATE_IP_ADDRESS="${OCF_RESKEY_private_ip_address}" +-TOKEN=$(curl -sX PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600") +-INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id -H "X-aws-ec2-metadata-token: $TOKEN") ++TOKEN=$(curl_retry "$OCF_RESKEY_curl_retries" "$OCF_RESKEY_curl_sleep" "--show-error -sX PUT -H 'X-aws-ec2-metadata-token-ttl-seconds: 21600'" "http://169.254.169.254/latest/api/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") ++[ $? -ne 0 ] && exit $OCF_ERR_GENERIC + + case $__OCF_ACTION in + start) +diff --git a/heartbeat/awsvip b/heartbeat/awsvip +index bdb4d68dd..f2b238a0f 100755 +--- a/heartbeat/awsvip ++++ b/heartbeat/awsvip +@@ -48,12 +48,16 @@ OCF_RESKEY_auth_type_default="key" + OCF_RESKEY_profile_default="default" + OCF_RESKEY_region_default="" + OCF_RESKEY_api_delay_default="3" ++OCF_RESKEY_curl_retries_default="3" ++OCF_RESKEY_curl_sleep_default="1" + + : ${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_curl_retries=${OCF_RESKEY_curl_retries_default}} ++: ${OCF_RESKEY_curl_sleep=${OCF_RESKEY_curl_sleep_default}} + + meta_data() { + cat < + + ++ ++ ++curl retries before failing ++ ++curl retries ++ ++ ++ ++ ++ ++curl sleep between tries ++ ++curl sleep ++ ++ ++ + + + +@@ -246,10 +266,14 @@ if [ -n "${OCF_RESKEY_region}" ]; then + AWSCLI_CMD="$AWSCLI_CMD --region ${OCF_RESKEY_region}" + fi + SECONDARY_PRIVATE_IP="${OCF_RESKEY_secondary_private_ip}" +-TOKEN=$(curl -sX PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600") +-INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id -H "X-aws-ec2-metadata-token: $TOKEN") +-MAC_ADDRESS=$(curl -s http://169.254.169.254/latest/meta-data/mac -H "X-aws-ec2-metadata-token: $TOKEN") +-NETWORK_ID=$(curl -s http://169.254.169.254/latest/meta-data/network/interfaces/macs/${MAC_ADDRESS}/interface-id -H "X-aws-ec2-metadata-token: $TOKEN") ++TOKEN=$(curl_retry "$OCF_RESKEY_curl_retries" "$OCF_RESKEY_curl_sleep" "--show-error -sX PUT -H 'X-aws-ec2-metadata-token-ttl-seconds: 21600'" "http://169.254.169.254/latest/api/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") ++[ $? -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") ++[ $? -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 + + case $__OCF_ACTION in + start) diff --git a/SOURCES/RHEL-22715-LVM-activate-fix-false-positive.patch b/SOURCES/RHEL-22715-LVM-activate-fix-false-positive.patch new file mode 100644 index 0000000..163afdd --- /dev/null +++ b/SOURCES/RHEL-22715-LVM-activate-fix-false-positive.patch @@ -0,0 +1,46 @@ +From 65a066cf9066390db65c4875e21c4c391793b9ae Mon Sep 17 00:00:00 2001 +From: Arslan Ahmad +Date: Tue, 16 Jan 2024 09:11:17 +0530 +Subject: [PATCH] Avoid false positive for VG activation + +When lvm.conf file has `volume_list` parameter configured and the +cluster is managing the shared storage using `system_id_source`, +then the activation of the LV fails to happen. However it is +reported as a success. + +The fixes will avoid starting of `LVM-activate` resource when +the cluster is configured with both `system_id_source` and +`volume_list`. + +Signed-off-by: Arslan Ahmad +--- + heartbeat/LVM-activate | 9 +++++++++ + 1 file changed, 9 insertions(+) + +diff --git a/heartbeat/LVM-activate b/heartbeat/LVM-activate +index f6f24a3b5..3858ed8dc 100755 +--- a/heartbeat/LVM-activate ++++ b/heartbeat/LVM-activate +@@ -448,6 +448,10 @@ systemid_check() + { + # system_id_source is set in lvm.conf + source=$(lvmconfig 'global/system_id_source' 2>/dev/null | cut -d"=" -f2) ++ ++ # Is volume_list set in lvm.conf ++ vol_list=$(lvmconfig 'activation/volume_list' 2>/dev/null | cut -d"=" -f2) ++ + if [ "$source" = "" ] || [ "$source" = "none" ]; then + ocf_exit_reason "system_id_source in lvm.conf is not set correctly!" + exit $OCF_ERR_ARGS +@@ -458,6 +462,11 @@ systemid_check() + exit $OCF_ERR_ARGS + fi + ++ if [ -n "$source" ] && [ -n "$vol_list" ]; then ++ ocf_exit_reason "Both system_id_source & volume_list cannot be defined!" ++ exit $OCF_ERR_ARGS ++ fi ++ + return $OCF_SUCCESS + } + diff --git a/SOURCES/RHEL-24683-1-Filesystem-fail-leading-trailing-whitespace.patch b/SOURCES/RHEL-24683-1-Filesystem-fail-leading-trailing-whitespace.patch new file mode 100644 index 0000000..54ca1f6 --- /dev/null +++ b/SOURCES/RHEL-24683-1-Filesystem-fail-leading-trailing-whitespace.patch @@ -0,0 +1,40 @@ +From 264e38e02cb4c04877e412bac254e42c7f6b2e1c Mon Sep 17 00:00:00 2001 +From: Oyvind Albrigtsen +Date: Tue, 20 Feb 2024 12:34:42 +0100 +Subject: [PATCH] Filesystem: fail when leading or trailing whitespace is + present in device or directory parameters + +--- + heartbeat/Filesystem | 12 ++++++++++++ + 1 file changed, 12 insertions(+) + +diff --git a/heartbeat/Filesystem b/heartbeat/Filesystem +index e1378f781..f88e3b552 100755 +--- a/heartbeat/Filesystem ++++ b/heartbeat/Filesystem +@@ -995,6 +995,12 @@ if [ -n "${OCF_RESKEY_force_unmount}" ]; then + fi + + DEVICE="$OCF_RESKEY_device" ++case "$DEVICE" in ++ [[:space:]]*|*[[:space:]]) ++ ocf_exit_reason "device parameter does not accept leading or trailing whitespace characters" ++ exit $OCF_ERR_CONFIGURED ++ ;; ++esac + FSTYPE=$OCF_RESKEY_fstype + if [ ! -z "$OCF_RESKEY_options" ]; then + options="-o $OCF_RESKEY_options" +@@ -1032,6 +1038,12 @@ if [ -z "$OCF_RESKEY_directory" ]; then + else + MOUNTPOINT="$(echo "$OCF_RESKEY_directory" | sed 's/\/*$//')" + : ${MOUNTPOINT:=/} ++ case "$MOUNTPOINT" in ++ [[:space:]]*|*[[:space:]]) ++ ocf_exit_reason "directory parameter does not accept leading or trailing whitespace characters" ++ exit $OCF_ERR_CONFIGURED ++ ;; ++ esac + if [ -e "$MOUNTPOINT" ] ; then + CANONICALIZED_MOUNTPOINT="$(readlink -f "$MOUNTPOINT")" + if [ $? -ne 0 ]; then diff --git a/SOURCES/RHEL-24683-2-Filesystem-return-success-stop-action.patch b/SOURCES/RHEL-24683-2-Filesystem-return-success-stop-action.patch new file mode 100644 index 0000000..e35f1dc --- /dev/null +++ b/SOURCES/RHEL-24683-2-Filesystem-return-success-stop-action.patch @@ -0,0 +1,30 @@ +From 1317efc72af6b72d9fb37aea18dc16129c146148 Mon Sep 17 00:00:00 2001 +From: Oyvind Albrigtsen +Date: Tue, 25 Jun 2024 13:33:19 +0200 +Subject: [PATCH] Filesystem: return success during stop-action when leading or + trailing whitespace is present in device or directory parameters + +--- + heartbeat/Filesystem | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/heartbeat/Filesystem b/heartbeat/Filesystem +index 8e0127531..3eb520e0c 100755 +--- a/heartbeat/Filesystem ++++ b/heartbeat/Filesystem +@@ -1037,6 +1037,7 @@ fi + DEVICE="$OCF_RESKEY_device" + case "$DEVICE" in + [[:space:]]*|*[[:space:]]) ++ [ "$__OCF_ACTION" = "stop" ] && exit $OCF_SUCCESS + ocf_exit_reason "device parameter does not accept leading or trailing whitespace characters" + exit $OCF_ERR_CONFIGURED + ;; +@@ -1080,6 +1081,7 @@ else + : ${MOUNTPOINT:=/} + case "$MOUNTPOINT" in + [[:space:]]*|*[[:space:]]) ++ [ "$__OCF_ACTION" = "stop" ] && exit $OCF_SUCCESS + ocf_exit_reason "directory parameter does not accept leading or trailing whitespace characters" + exit $OCF_ERR_CONFIGURED + ;; diff --git a/SOURCES/RHEL-31763-galera-fix-joiner-promotion-fails-issue.patch b/SOURCES/RHEL-31763-galera-fix-joiner-promotion-fails-issue.patch new file mode 100644 index 0000000..acdfc9c --- /dev/null +++ b/SOURCES/RHEL-31763-galera-fix-joiner-promotion-fails-issue.patch @@ -0,0 +1,75 @@ +From 4357f0dbb8668ac4090cd7070c2ea195e5683326 Mon Sep 17 00:00:00 2001 +From: Damien Ciabrini +Date: Wed, 24 Jan 2024 13:27:26 +0100 +Subject: [PATCH] galera: allow joiner to report non-Primary during initial IST + +It seems that with recent galera versions, when a galera node +joins a cluster, there is a small time window where the node is +connected to the primary component of the galera cluster, but it +might still be preparing its IST. During this time, it can report +itself as being 'not ready' and in 'non-primary' state. + +Update the galera resource agent to allow the node to be in +non-primary state, but only if running a "promote" operation. Any +network partition during the promotion will be caught by the +promote timeout. + +In reworking the promotion code, we move the check for primary +partition into the "galera_monitor" function. The check works +as before for regular "monitor" or "probe" operations. + +Related-Bug: rhbz#2255414 +--- + heartbeat/galera.in | 25 +++++++++++++++++-------- + 1 file changed, 17 insertions(+), 8 deletions(-) + +diff --git a/heartbeat/galera.in b/heartbeat/galera.in +index 6aed3e4b6d..b518595cb0 100755 +--- a/heartbeat/galera.in ++++ b/heartbeat/galera.in +@@ -822,6 +822,11 @@ galera_promote() + return $rc + fi + ++ # At this point, the mysql pidfile is created on disk and the ++ # mysql server is reacheable via its UNIX socket. If we are a ++ # joiner, SST transfers (rsync) have finished, but an IST may ++ # still be requested or ongoing ++ + galera_monitor + rc=$? + if [ $rc != $OCF_SUCCESS -a $rc != $OCF_RUNNING_MASTER ]; then +@@ -835,12 +840,6 @@ galera_promote() + return $OCF_ERR_GENERIC + fi + +- is_primary +- if [ $? -ne 0 ]; then +- ocf_exit_reason "Failure. Master instance started, but is not in Primary mode." +- return $OCF_ERR_GENERIC +- fi +- + if ocf_is_true $bootstrap; then + promote_everyone + clear_bootstrap_node +@@ -991,8 +990,18 @@ galera_monitor() + fi + rc=$OCF_RUNNING_MASTER + else +- ocf_exit_reason "local node <${NODENAME}> is started, but not in primary mode. Unknown state." +- rc=$OCF_ERR_GENERIC ++ # It seems that with recent galera (26.4+), a joiner that is ++ # connected to a Primary component and is preparing its IST ++ # request might still temporarily report its state as ++ # Non-Primary. Do not fail in this case as the promote ++ # operation will loop until the IST finishes or the promote ++ # times out. ++ if [ "$__OCF_ACTION" = "promote" ] && ! ocf_is_true $(is_bootstrap); then ++ ocf_log info "local node <${NODENAME}> is receiving a State Transfer." ++ else ++ ocf_exit_reason "local node <${NODENAME}> is started, but not in primary mode. Unknown state." ++ rc=$OCF_ERR_GENERIC ++ fi + fi + + return $rc diff --git a/SOURCES/RHEL-32265-1-findif.sh-fix-corner-cases.patch b/SOURCES/RHEL-32265-1-findif.sh-fix-corner-cases.patch new file mode 100644 index 0000000..8284aef --- /dev/null +++ b/SOURCES/RHEL-32265-1-findif.sh-fix-corner-cases.patch @@ -0,0 +1,25 @@ +From f717b4a3aa83c9124e62716f421b99e314d00233 Mon Sep 17 00:00:00 2001 +From: Oyvind Albrigtsen +Date: Fri, 12 Apr 2024 12:23:21 +0200 +Subject: [PATCH] findif.sh: fix corner cases + +--- + heartbeat/findif.sh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/heartbeat/findif.sh b/heartbeat/findif.sh +index 7c766e6e0..13484f827 100644 +--- a/heartbeat/findif.sh ++++ b/heartbeat/findif.sh +@@ -215,9 +215,9 @@ findif() + fi + if [ -n "$nic" ] ; then + # NIC supports more than two. +- set -- $(ip -o -f $family route list match $match $scope | grep "dev $nic " | awk 'BEGIN{best=0} /\// { mask=$1; sub(".*/", "", mask); if( int(mask)>=best ) { best=int(mask); best_ln=$0; } } END{print best_ln}') ++ set -- $(ip -o -f $family route list match $match $scope | grep "dev $nic " | sed -e 's,^\([0-9.]\+\) ,\1/32 ,;s,^\([0-9a-f:]\+\) ,\1/128 ,' | sort -t/ -k2,2nr) + else +- set -- $(ip -o -f $family route list match $match $scope | awk 'BEGIN{best=0} /\// { mask=$1; sub(".*/", "", mask); if( int(mask)>=best ) { best=int(mask); best_ln=$0; } } END{print best_ln}') ++ set -- $(ip -o -f $family route list match $match $scope | sed -e 's,^\([0-9.]\+\) ,\1/32 ,;s,^\([0-9a-f:]\+\) ,\1/128 ,' | sort -t/ -k2,2nr) + fi + if [ $# = 0 ] ; then + case $OCF_RESKEY_ip in diff --git a/SOURCES/RHEL-32265-2-IPsrcaddr-add-IPv6-support.patch b/SOURCES/RHEL-32265-2-IPsrcaddr-add-IPv6-support.patch new file mode 100644 index 0000000..90a648d --- /dev/null +++ b/SOURCES/RHEL-32265-2-IPsrcaddr-add-IPv6-support.patch @@ -0,0 +1,365 @@ +From 12d73d53026d219be67c0d5353010ba08ab49e98 Mon Sep 17 00:00:00 2001 +From: Oyvind Albrigtsen +Date: Tue, 28 May 2024 09:45:55 +0200 +Subject: [PATCH 1/3] findif.sh: add metric for IPv6 support and fail when + matching more than 1 route + +--- + heartbeat/findif.sh | 19 ++++++++++++++++--- + 1 file changed, 16 insertions(+), 3 deletions(-) + +diff --git a/heartbeat/findif.sh b/heartbeat/findif.sh +index 13484f827..ca5d1a5c1 100644 +--- a/heartbeat/findif.sh ++++ b/heartbeat/findif.sh +@@ -196,10 +196,13 @@ findif() + { + local match="$OCF_RESKEY_ip" + local family ++ local proto + local scope + local nic="$OCF_RESKEY_nic" + local netmask="$OCF_RESKEY_cidr_netmask" + local brdcast="$OCF_RESKEY_broadcast" ++ local metric ++ local routematch + + echo $match | grep -qs ":" + if [ $? = 0 ] ; then +@@ -215,10 +218,19 @@ findif() + fi + if [ -n "$nic" ] ; then + # NIC supports more than two. +- set -- $(ip -o -f $family route list match $match $scope | grep "dev $nic " | sed -e 's,^\([0-9.]\+\) ,\1/32 ,;s,^\([0-9a-f:]\+\) ,\1/128 ,' | sort -t/ -k2,2nr) ++ routematch=$(ip -o -f $family route list match $match $proto $scope | grep "dev $nic " | sed -e 's,^\([0-9.]\+\) ,\1/32 ,;s,^\([0-9a-f:]\+\) ,\1/128 ,' | sort -t/ -k2,2nr) + else +- set -- $(ip -o -f $family route list match $match $scope | sed -e 's,^\([0-9.]\+\) ,\1/32 ,;s,^\([0-9a-f:]\+\) ,\1/128 ,' | sort -t/ -k2,2nr) ++ routematch=$(ip -o -f $family route list match $match $proto $scope | sed -e 's,^\([0-9.]\+\) ,\1/32 ,;s,^\([0-9a-f:]\+\) ,\1/128 ,' | sort -t/ -k2,2nr) + fi ++ if [ "$family" = "inet6" ]; then ++ routematch=$(echo "$routematch" | grep -v "^default") ++ fi ++ ++ if [ $(echo "$routematch" | wc -l) -gt 1 ]; then ++ ocf_exit_reason "More than 1 routes match $match. Unable to decide which route to use." ++ return $OCF_ERR_GENERIC ++ fi ++ set -- $routematch + if [ $# = 0 ] ; then + case $OCF_RESKEY_ip in + 127.*) +@@ -255,6 +267,7 @@ findif() + return $OCF_ERR_GENERIC + fi + fi +- echo "$nic netmask $netmask broadcast $brdcast" ++ metric=$(echo "$@" | sed "s/.*metric[[:blank:]]\([^ ]\+\).*/\1/") ++ echo "$nic netmask $netmask broadcast $brdcast metric $metric" + return $OCF_SUCCESS + } + +From 488c096d63fe0f7e15938e65483ba20628080198 Mon Sep 17 00:00:00 2001 +From: Oyvind Albrigtsen +Date: Tue, 28 May 2024 09:47:11 +0200 +Subject: [PATCH 2/3] IPaddr2: use metric for IPv6 + +--- + heartbeat/IPaddr2 | 11 ++++++++--- + 1 file changed, 8 insertions(+), 3 deletions(-) + +diff --git a/heartbeat/IPaddr2 b/heartbeat/IPaddr2 +index 5f30b8f98..091bea418 100755 +--- a/heartbeat/IPaddr2 ++++ b/heartbeat/IPaddr2 +@@ -561,10 +561,11 @@ ip_init() { + if + [ $rc -eq 0 ] + then +- NICINFO=`echo "$NICINFO" | sed -e 's/netmask\ //;s/broadcast\ //'` ++ NICINFO=`echo "$NICINFO" | sed -e 's/netmask\ //;s/broadcast\ //;s/metric\ //'` + NIC=`echo "$NICINFO" | cut -d" " -f1` + NETMASK=`echo "$NICINFO" | cut -d" " -f2` + BRDCAST=`echo "$NICINFO" | cut -d" " -f3` ++ METRIC=`echo "$NICINFO" | cut -d" " -f4` + else + # findif couldn't find the interface + if ocf_is_probe; then +@@ -659,13 +660,14 @@ delete_interface () { + # Add an interface + # + add_interface () { +- local cmd msg extra_opts ipaddr netmask broadcast iface label ++ local cmd msg extra_opts ipaddr netmask broadcast iface label metric + + ipaddr="$1" + netmask="$2" + broadcast="$3" + iface="$4" + label="$5" ++ metric="$6" + + if [ "$FAMILY" = "inet" ] && ocf_is_true $OCF_RESKEY_run_arping && + check_binary arping; then +@@ -688,6 +690,9 @@ add_interface () { + fi + + extra_opts="" ++ if [ "$FAMILY" = "inet6" ]; then ++ extra_opts="$extra_opts metric $metric" ++ fi + if [ "$FAMILY" = "inet6" ] && ocf_is_true "${OCF_RESKEY_nodad}"; then + extra_opts="$extra_opts nodad" + fi +@@ -1083,7 +1088,7 @@ ip_start() { + done + fi + +- add_interface $OCF_RESKEY_ip $NETMASK ${BRDCAST:-none} $NIC $IFLABEL ++ add_interface "$OCF_RESKEY_ip" "$NETMASK" "${BRDCAST:-none}" "$NIC" "$IFLABEL" "$METRIC" + rc=$? + + if [ $rc -ne $OCF_SUCCESS ]; then + +From d1c4d1969381d3e35cfaaaaae522e5687a9ed88a Mon Sep 17 00:00:00 2001 +From: Oyvind Albrigtsen +Date: Tue, 28 May 2024 09:47:56 +0200 +Subject: [PATCH 3/3] IPsrcaddr: add IPv6 support + +--- + heartbeat/IPsrcaddr | 116 ++++++++++++++++++++++++++++++++------------ + 1 file changed, 85 insertions(+), 31 deletions(-) + +diff --git a/heartbeat/IPsrcaddr b/heartbeat/IPsrcaddr +index c732ce8df..1c87d5b7f 100755 +--- a/heartbeat/IPsrcaddr ++++ b/heartbeat/IPsrcaddr +@@ -60,6 +60,7 @@ OCF_RESKEY_cidr_netmask_default="" + OCF_RESKEY_destination_default="0.0.0.0/0" + OCF_RESKEY_proto_default="" + OCF_RESKEY_metric_default="" ++OCF_RESKEY_pref_default="" + OCF_RESKEY_table_default="" + + : ${OCF_RESKEY_ipaddress=${OCF_RESKEY_ipaddress_default}} +@@ -67,6 +68,7 @@ OCF_RESKEY_table_default="" + : ${OCF_RESKEY_destination=${OCF_RESKEY_destination_default}} + : ${OCF_RESKEY_proto=${OCF_RESKEY_proto_default}} + : ${OCF_RESKEY_metric=${OCF_RESKEY_metric_default}} ++: ${OCF_RESKEY_pref=${OCF_RESKEY_pref_default}} + : ${OCF_RESKEY_table=${OCF_RESKEY_table_default}} + ####################################################################### + +@@ -75,10 +77,13 @@ OCF_RESKEY_table_default="" + + USAGE="usage: $0 {start|stop|status|monitor|validate-all|meta-data}"; + +- CMDSHOW="$IP2UTIL route show $TABLE to exact $OCF_RESKEY_destination" +-CMDCHANGE="$IP2UTIL route change to " ++echo "$OCF_RESKEY_ipaddress" | grep -q ":" && FAMILY="inet6" || FAMILY="inet" ++[ "$FAMILY" = "inet6" ] && [ "$OCF_RESKEY_destination" = "0.0.0.0/0" ] && OCF_RESKEY_destination="::/0" + +-if [ "$OCF_RESKEY_destination" != "0.0.0.0/0" ]; then ++ CMDSHOW="$IP2UTIL -f $FAMILY route show $TABLE to exact $OCF_RESKEY_destination" ++CMDCHANGE="$IP2UTIL -f $FAMILY route change to " ++ ++if [ "$OCF_RESKEY_destination" != "0.0.0.0/0" ] && [ "$OCF_RESKEY_destination" != "::/0" ]; then + CMDSHOW="$CMDSHOW src $OCF_RESKEY_ipaddress" + fi + +@@ -153,6 +158,14 @@ Metric. Only needed if incorrect metric value is used. + + + ++ ++ ++IPv6 route preference (low, medium or high). Only needed if incorrect pref value is used. ++ ++IPv6 route preference. ++ ++ ++ + + + Table to modify and use for interface lookup. E.g. "local". +@@ -196,12 +209,21 @@ errorexit() { + # where the src clause "src Y.Y.Y.Y" may or may not be present + + WS="[[:blank:]]" +-OCTET="[0-9]\{1,3\}" +-IPADDR="\($OCTET\.\)\{3\}$OCTET" ++case "$FAMILY" in ++ inet) ++ GROUP="[0-9]\{1,3\}" ++ IPADDR="\($GROUP\.\)\{3\}$GROUP" ++ ;; ++ inet6) ++ GROUP="[0-9a-f]\{0,4\}" ++ IPADDR="\($GROUP\:\)\{0,\}$GROUP" ++ ;; ++esac + SRCCLAUSE="src$WS$WS*\($IPADDR\)" +-MATCHROUTE="\(.*${WS}\)\($SRCCLAUSE\)\($WS.*\|$\)" +-METRICCLAUSE=".*\(metric$WS[^ ]\+\)" ++MATCHROUTE="\(.*${WS}\)proto [^ ]\+\(.*${WS}\)\($SRCCLAUSE\)\($WS.*\|$\)" ++METRICCLAUSE=".*\(metric$WS[^ ]\+\).*" + PROTOCLAUSE=".*\(proto$WS[^ ]\+\).*" ++PREFCLAUSE=".*\(pref$WS[^ ]\+\).*" + FINDIF=findif + + # findif needs that to be set +@@ -216,17 +238,17 @@ srca_read() { + errorexit "more than 1 matching route exists" + + # But there might still be no matching route +- [ "$OCF_RESKEY_destination" = "0.0.0.0/0" ] && [ -z "$ROUTE" ] && \ ++ ([ "$OCF_RESKEY_destination" = "0.0.0.0/0" ] || [ "$OCF_RESKEY_destination" = "::/0" ]) && [ -z "$ROUTE" ] && \ + ! ocf_is_probe && [ "$__OCF_ACTION" != stop ] && errorexit "no matching route exists" + + # Sed out the source ip address if it exists +- SRCIP=`echo $ROUTE | sed -n "s/$MATCHROUTE/\3/p"` ++ SRCIP=`echo $ROUTE | sed -n "s/$MATCHROUTE/\4/p"` + + # and what remains after stripping out the source ip address clause +- ROUTE_WO_SRC=`echo $ROUTE | sed "s/$MATCHROUTE/\1\5/"` ++ ROUTE_WO_SRC=`echo $ROUTE | sed "s/$MATCHROUTE/\1\2\6/"` + + # using "src " only returns output if there's a match +- if [ "$OCF_RESKEY_destination" != "0.0.0.0/0" ]; then ++ if [ "$OCF_RESKEY_destination" != "0.0.0.0/0" ] && [ "$OCF_RESKEY_destination" != "::/0" ]; then + [ -z "$ROUTE" ] && return 1 || return 0 + fi + +@@ -249,12 +271,15 @@ srca_start() { + rc=$OCF_SUCCESS + ocf_log info "The ip route has been already set.($NETWORK, $INTERFACE, $ROUTE_WO_SRC)" + else +- $IP2UTIL route replace $TABLE $NETWORK dev $INTERFACE $PROTO src $1 $METRIC || \ +- errorexit "command 'ip route replace $TABLE $NETWORK dev $INTERFACE $PROTO src $1 $METRIC' failed" ++ # NetworkManager manages routes with proto static/kernel ++ [ -z "$OCF_RESKEY_proto" ] && echo "$PROTO" | grep -q "proto \(kernel\|static\)" && PROTO="proto keepalived" + +- if [ "$OCF_RESKEY_destination" = "0.0.0.0/0" ] ;then +- $CMDCHANGE $ROUTE_WO_SRC src $1 || \ +- errorexit "command '$CMDCHANGE $ROUTE_WO_SRC src $1' failed" ++ $IP2UTIL route replace $TABLE $NETWORK dev $INTERFACE $PROTO src $1 $METRIC $PREF || \ ++ errorexit "command 'ip route replace $TABLE $NETWORK dev $INTERFACE $PROTO src $1 $METRIC $PREF' failed" ++ ++ if [ "$OCF_RESKEY_destination" = "0.0.0.0/0" ] || [ "$OCF_RESKEY_destination" = "::/0" ]; then ++ $CMDCHANGE $ROUTE_WO_SRC $PROTO src $1 || \ ++ errorexit "command '$CMDCHANGE $ROUTE_WO_SRC $PROTO src $1' failed" + fi + rc=$? + fi +@@ -290,14 +315,15 @@ srca_stop() { + fi + + PRIMARY_IP="$($IP2UTIL -4 -o addr show dev $INTERFACE primary | awk '{split($4,a,"/");print a[1]}')" +- OPTS="proto kernel scope $SCOPE src $PRIMARY_IP" ++ OPTS="proto kernel scope $SCOPE" ++ [ "$FAMILY" = "inet" ] && OPTS="$OPTS src $PRIMARY_IP" + +- $IP2UTIL route replace $TABLE $NETWORK dev $INTERFACE $OPTS $METRIC || \ +- errorexit "command 'ip route replace $TABLE $NETWORK dev $INTERFACE $OPTS $METRIC' failed" ++ $IP2UTIL route replace $TABLE $NETWORK dev $INTERFACE $OPTS $METRIC $PREF || \ ++ errorexit "command 'ip route replace $TABLE $NETWORK dev $INTERFACE $OPTS $METRIC $PREF' failed" + +- if [ "$OCF_RESKEY_destination" = "0.0.0.0/0" ] ;then +- $CMDCHANGE $ROUTE_WO_SRC src $PRIMARY_IP || \ +- errorexit "command '$CMDCHANGE $ROUTE_WO_SRC src $PRIMARY_IP' failed" ++ if [ "$OCF_RESKEY_destination" = "0.0.0.0/0" ] || [ "$OCF_RESKEY_destination" = "::/0" ]; then ++ $CMDCHANGE $ROUTE_WO_SRC proto static || \ ++ errorexit "command '$CMDCHANGE $ROUTE_WO_SRC proto static' failed" + fi + + return $? +@@ -330,7 +356,7 @@ CheckIP() { + case $ip in + *[!0-9.]*) #got invalid char + false;; +- .*|*.) #begin or end by ".", which is invalid ++ .*|*.) #begin or end with ".", which is invalid + false;; + *..*) #consecutive ".", which is invalid + false;; +@@ -356,6 +382,18 @@ CheckIP() { + return $? # This return is unnecessary, this comment too :) + } + ++CheckIP6() { ++ ip="$1" ++ case $ip in ++ *[!0-9a-f:]*) #got invalid char ++ false;; ++ *:::*) # more than 2 consecutive ":", which is invalid ++ false;; ++ *::*::*) # more than 1 "::", which is invalid ++ false;; ++ esac ++} ++ + # + # Find out which interface or alias serves the given IP address + # The argument is an IP address, and its output +@@ -396,8 +434,7 @@ find_interface_solaris() { + # is an (aliased) interface name (e.g., "eth0" and "eth0:0"). + # + find_interface_generic() { +- +- local iface=`$IP2UTIL -o -f inet addr show | grep "\ $BASEIP" \ ++ local iface=`$IP2UTIL -o -f $FAMILY addr show | grep "\ $BASEIP" \ + | cut -d ' ' -f2 | grep -v '^ipsec[0-9][0-9]*$'` + if [ -z "$iface" ]; then + return $OCF_ERR_GENERIC +@@ -502,7 +539,9 @@ srca_validate_all() { + + # The IP address should be in good shape + if CheckIP "$ipaddress"; then +- : ++ : ++ elif CheckIP6 "$ipaddress"; then ++ : + else + ocf_exit_reason "Invalid IP address [$ipaddress]" + return $OCF_ERR_CONFIGURED +@@ -570,21 +609,36 @@ rc=$? + } + + INTERFACE=`echo $findif_out | awk '{print $1}'` +-LISTROUTE=`$IP2UTIL route list dev $INTERFACE scope link $PROTO match $ipaddress` ++case "$FAMILY" in ++ inet) ++ LISTCMD="$IP2UTIL -f $FAMILY route list dev $INTERFACE scope link $PROTO match $ipaddress" ++ ;; ++ inet6) ++ LISTCMD="$IP2UTIL -f $FAMILY route list dev $INTERFACE $PROTO match $ipaddress" ++ ;; ++esac ++LISTROUTE=`$LISTCMD` ++ + [ -z "$PROTO" ] && PROTO=`echo $LISTROUTE | sed -n "s/$PROTOCLAUSE/\1/p"` + if [ -n "$OCF_RESKEY_metric" ]; then + METRIC="metric $OCF_RESKEY_metric" +-elif [ -z "$TABLE" ] || [ "${TABLE#table }" = "main" ]; then ++elif [ -z "$TABLE" ] || [ "${TABLE#table }" = "main" ] || [ "$FAMILY" = "inet6" ]; then + METRIC=`echo $LISTROUTE | sed -n "s/$METRICCLAUSE/\1/p"` + else + METRIC="" + fi +-if [ "$OCF_RESKEY_destination" = "0.0.0.0/0" ] ;then ++if [ "$FAMILY" = "inet6" ]; then ++ if [ -z "$OCF_RESKEY_pref" ]; then ++ PREF=`echo $LISTROUTE | sed -n "s/$PREFCLAUSE/\1/p"` ++ else ++ PREF="pref $OCF_RESKEY_pref" ++ fi ++fi ++if [ "$OCF_RESKEY_destination" = "0.0.0.0/0" ] || [ "$OCF_RESKEY_destination" = "::/0" ] ;then + NETWORK=`echo $LISTROUTE | grep -m 1 -o '^[^ ]*'` + + if [ -z "$NETWORK" ]; then +- err_str="command '$IP2UTIL route list dev $INTERFACE scope link $PROTO" +- err_str="$err_str match $ipaddress' failed to find a matching route" ++ err_str="command '$LISTCMD' failed to find a matching route" + + if [ "$__OCF_ACTION" = "start" ]; then + ocf_exit_reason "$err_str" diff --git a/SOURCES/RHEL-32265-3-IPaddr2-only-set-metric-value-for-IPv6-when-detected.patch b/SOURCES/RHEL-32265-3-IPaddr2-only-set-metric-value-for-IPv6-when-detected.patch new file mode 100644 index 0000000..fd16286 --- /dev/null +++ b/SOURCES/RHEL-32265-3-IPaddr2-only-set-metric-value-for-IPv6-when-detected.patch @@ -0,0 +1,22 @@ +From 4075aff88776e2811ebc83b735b2a70bcf46247f Mon Sep 17 00:00:00 2001 +From: Oyvind Albrigtsen +Date: Mon, 24 Jun 2024 09:45:29 +0200 +Subject: [PATCH] IPaddr2: only set metric value for IPv6 when detected + +--- + heartbeat/IPaddr2 | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/heartbeat/IPaddr2 b/heartbeat/IPaddr2 +index 091bea418..3bc5abec1 100755 +--- a/heartbeat/IPaddr2 ++++ b/heartbeat/IPaddr2 +@@ -690,7 +690,7 @@ add_interface () { + fi + + extra_opts="" +- if [ "$FAMILY" = "inet6" ]; then ++ if [ "$FAMILY" = "inet6" ] && [ -n "$metric" ]; then + extra_opts="$extra_opts metric $metric" + fi + if [ "$FAMILY" = "inet6" ] && ocf_is_true "${OCF_RESKEY_nodad}"; then diff --git a/SOURCES/RHEL-32265-4-findif.sh-ignore-unreachable-blackhole-prohibit-routes.patch b/SOURCES/RHEL-32265-4-findif.sh-ignore-unreachable-blackhole-prohibit-routes.patch new file mode 100644 index 0000000..f955350 --- /dev/null +++ b/SOURCES/RHEL-32265-4-findif.sh-ignore-unreachable-blackhole-prohibit-routes.patch @@ -0,0 +1,25 @@ +From f561e272e9b7fe94ba598b70c6d2f44d034446ed Mon Sep 17 00:00:00 2001 +From: Oyvind Albrigtsen +Date: Wed, 14 Aug 2024 12:05:54 +0200 +Subject: [PATCH] findif.sh: ignore unreachable, blackhole, and prohibit routes + +--- + heartbeat/findif.sh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/heartbeat/findif.sh b/heartbeat/findif.sh +index ca5d1a5c1..7b817f75c 100644 +--- a/heartbeat/findif.sh ++++ b/heartbeat/findif.sh +@@ -218,9 +218,9 @@ findif() + fi + if [ -n "$nic" ] ; then + # NIC supports more than two. +- routematch=$(ip -o -f $family route list match $match $proto $scope | grep "dev $nic " | sed -e 's,^\([0-9.]\+\) ,\1/32 ,;s,^\([0-9a-f:]\+\) ,\1/128 ,' | sort -t/ -k2,2nr) ++ routematch=$(ip -o -f $family route list match $match $proto $scope | grep -v "^\(unreachable\|prohibit\|blackhole\)" | grep "dev $nic " | sed -e 's,^\([0-9.]\+\) ,\1/32 ,;s,^\([0-9a-f:]\+\) ,\1/128 ,' | sort -t/ -k2,2nr) + else +- routematch=$(ip -o -f $family route list match $match $proto $scope | sed -e 's,^\([0-9.]\+\) ,\1/32 ,;s,^\([0-9a-f:]\+\) ,\1/128 ,' | sort -t/ -k2,2nr) ++ routematch=$(ip -o -f $family route list match $match $proto $scope | grep -v "^\(unreachable\|prohibit\|blackhole\)" | sed -e 's,^\([0-9.]\+\) ,\1/32 ,;s,^\([0-9a-f:]\+\) ,\1/128 ,' | sort -t/ -k2,2nr) + fi + if [ "$family" = "inet6" ]; then + routematch=$(echo "$routematch" | grep -v "^default") diff --git a/SOURCES/RHEL-32265-5-IPsrcaddr-specify-dev-for-default-route.patch b/SOURCES/RHEL-32265-5-IPsrcaddr-specify-dev-for-default-route.patch new file mode 100644 index 0000000..c94bd27 --- /dev/null +++ b/SOURCES/RHEL-32265-5-IPsrcaddr-specify-dev-for-default-route.patch @@ -0,0 +1,36 @@ +From f23ae9c1e9ff9a44a053c7c2378975ac5b807478 Mon Sep 17 00:00:00 2001 +From: Oyvind Albrigtsen +Date: Thu, 29 Aug 2024 16:24:02 +0200 +Subject: [PATCH] IPsrcaddr: specify dev for default route, as e.g. fe80:: + routes can be present on multiple interfaces + +--- + heartbeat/IPsrcaddr | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/heartbeat/IPsrcaddr b/heartbeat/IPsrcaddr +index 1c87d5b7f..58d89a280 100755 +--- a/heartbeat/IPsrcaddr ++++ b/heartbeat/IPsrcaddr +@@ -278,8 +278,8 @@ srca_start() { + errorexit "command 'ip route replace $TABLE $NETWORK dev $INTERFACE $PROTO src $1 $METRIC $PREF' failed" + + if [ "$OCF_RESKEY_destination" = "0.0.0.0/0" ] || [ "$OCF_RESKEY_destination" = "::/0" ]; then +- $CMDCHANGE $ROUTE_WO_SRC $PROTO src $1 || \ +- errorexit "command '$CMDCHANGE $ROUTE_WO_SRC $PROTO src $1' failed" ++ $CMDCHANGE $ROUTE_WO_SRC dev $INTERFACE $PROTO src $1 || \ ++ errorexit "command '$CMDCHANGE $ROUTE_WO_SRC dev $INTERFACE $PROTO src $1' failed" + fi + rc=$? + fi +@@ -322,8 +322,8 @@ srca_stop() { + errorexit "command 'ip route replace $TABLE $NETWORK dev $INTERFACE $OPTS $METRIC $PREF' failed" + + if [ "$OCF_RESKEY_destination" = "0.0.0.0/0" ] || [ "$OCF_RESKEY_destination" = "::/0" ]; then +- $CMDCHANGE $ROUTE_WO_SRC proto static || \ +- errorexit "command '$CMDCHANGE $ROUTE_WO_SRC proto static' failed" ++ $CMDCHANGE $ROUTE_WO_SRC dev $INTERFACE proto static || \ ++ errorexit "command '$CMDCHANGE $ROUTE_WO_SRC dev $INTERFACE proto static' failed" + fi + + return $? diff --git a/SOURCES/RHEL-32829-db2-fix-OCF_SUCESS-typo.patch b/SOURCES/RHEL-32829-db2-fix-OCF_SUCESS-typo.patch new file mode 100644 index 0000000..bbe2847 --- /dev/null +++ b/SOURCES/RHEL-32829-db2-fix-OCF_SUCESS-typo.patch @@ -0,0 +1,23 @@ +From a9c4aeb971e9f4963345d0e215b729def62dd27c Mon Sep 17 00:00:00 2001 +From: pepadelic <162310096+pepadelic@users.noreply.github.com> +Date: Mon, 15 Apr 2024 13:52:54 +0200 +Subject: [PATCH] Update db2: fix OCF_SUCESS name in db2_notify + +fix OCF_SUCESS to OCF_SUCCESS in db2_notify +--- + heartbeat/db2 | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/heartbeat/db2 b/heartbeat/db2 +index 95447ab6cb..1cd66f15af 100755 +--- a/heartbeat/db2 ++++ b/heartbeat/db2 +@@ -848,7 +848,7 @@ db2_notify() { + + # only interested in pre-start + [ $OCF_RESKEY_CRM_meta_notify_type = pre \ +- -a $OCF_RESKEY_CRM_meta_notify_operation = start ] || return $OCF_SUCESS ++ -a $OCF_RESKEY_CRM_meta_notify_operation = start ] || return $OCF_SUCCESS + + # gets FIRST_ACTIVE_LOG + db2_get_cfg $dblist || return $? diff --git a/SOURCES/RHEL-34777-Filesystem-fail-when-incorrect-device-mounted.patch b/SOURCES/RHEL-34777-Filesystem-fail-when-incorrect-device-mounted.patch new file mode 100644 index 0000000..5f54e66 --- /dev/null +++ b/SOURCES/RHEL-34777-Filesystem-fail-when-incorrect-device-mounted.patch @@ -0,0 +1,110 @@ +From 66a5308d2e8f61093716a076f4386416dc18045c Mon Sep 17 00:00:00 2001 +From: Oyvind Albrigtsen +Date: Mon, 22 Apr 2024 11:26:09 +0200 +Subject: [PATCH] Filesystem: fail when incorrect device mounted on mountpoint, + and dont unmount the mountpoint in this case, or if mountpoint set to "/" + +--- + heartbeat/Filesystem | 71 ++++++++++++++++++++++++++++++++++++-------- + 1 file changed, 58 insertions(+), 13 deletions(-) + +diff --git a/heartbeat/Filesystem b/heartbeat/Filesystem +index e1378f781..cec71f1a6 100755 +--- a/heartbeat/Filesystem ++++ b/heartbeat/Filesystem +@@ -582,10 +582,16 @@ Filesystem_start() + fi + + # See if the device is already mounted. +- if Filesystem_status >/dev/null 2>&1 ; then +- ocf_log info "Filesystem $MOUNTPOINT is already mounted." +- return $OCF_SUCCESS +- fi ++ Filesystem_status ++ case "$?" in ++ $OCF_SUCCESS) ++ ocf_log info "Filesystem $MOUNTPOINT is already mounted." ++ return $OCF_SUCCESS ++ ;; ++ $OCF_ERR_CONFIGURED) ++ return $OCF_ERR_CONFIGURED ++ ;; ++ esac + + fstype_supported || exit $OCF_ERR_INSTALLED + +@@ -801,10 +807,42 @@ Filesystem_stop() + # + Filesystem_status() + { +- match_string="${TAB}${CANONICALIZED_MOUNTPOINT}${TAB}" +- if list_mounts | grep "$match_string" >/dev/null 2>&1; then +- rc=$OCF_SUCCESS +- msg="$MOUNTPOINT is mounted (running)" ++ local match_string="${TAB}${CANONICALIZED_MOUNTPOINT}${TAB}" ++ local mounted_device=$(list_mounts | grep "$match_string" | awk '{print $1}') ++ ++ if [ -n "$mounted_device" ]; then ++ if [ "X$blockdevice" = "Xyes" ]; then ++ if [ -e "$DEVICE" ] ; then ++ local canonicalized_device="$(readlink -f "$DEVICE")" ++ if [ $? -ne 0 ]; then ++ ocf_exit_reason "Could not canonicalize $DEVICE because readlink failed" ++ exit $OCF_ERR_GENERIC ++ fi ++ else ++ local canonicalized_device="$DEVICE" ++ fi ++ if [ -e "$mounted_device" ] ; then ++ local canonicalized_mounted_device="$(readlink -f "$mounted_device")" ++ if [ $? -ne 0 ]; then ++ ocf_exit_reason "Could not canonicalize $mounted_device because readlink failed" ++ exit $OCF_ERR_GENERIC ++ fi ++ else ++ local canonicalized_mounted_device="$mounted_device" ++ fi ++ if [ "$canonicalized_device" != "$canonicalized_mounted_device" ]; then ++ if ocf_is_probe || [ "$__OCF_ACTION" = "stop" ]; then ++ ocf_log debug "Another device ($mounted_device) is already mounted on $MOUNTPOINT" ++ rc=$OCF_NOT_RUNNING ++ else ++ ocf_exit_reason "Another device ($mounted_device) is already mounted on $MOUNTPOINT" ++ rc=$OCF_ERR_CONFIGURED ++ fi ++ fi ++ else ++ rc=$OCF_SUCCESS ++ msg="$MOUNTPOINT is mounted (running)" ++ fi + else + rc=$OCF_NOT_RUNNING + msg="$MOUNTPOINT is unmounted (stopped)" +@@ -1041,9 +1079,18 @@ else + else + CANONICALIZED_MOUNTPOINT="$MOUNTPOINT" + fi +- # At this stage, $MOUNTPOINT does not contain trailing "/" unless it is "/" +- # TODO: / mounted via Filesystem sounds dangerous. On stop, we'll +- # kill the whole system. Is that a good idea? ++ ++ if echo "$CANONICALIZED_MOUNTPOINT" | grep -q "^\s*/\s*$"; then ++ if ocf_is_probe; then ++ ocf_log debug "/ cannot be managed in a cluster" ++ exit $OCF_NOT_RUNNING ++ elif [ "$__OCF_ACTION" = "start" ] || [ "$__OCF_ACTION" = "monitor" ] || [ "$__OCF_ACTION" = "status" ]; then ++ ocf_exit_reason "/ cannot be managed in a cluster" ++ exit $OCF_ERR_CONFIGURED ++ elif [ "$__OCF_ACTION" = "stop" ]; then ++ exit $OCF_SUCCESS ++ fi ++ fi + fi + + # Check to make sure the utilites are found +@@ -1124,5 +1171,3 @@ case $OP in + ;; + esac + exit $? +- +- diff --git a/SOURCES/RHEL-40393-Filesystem-1-dont-kill-unrelated-processes.patch b/SOURCES/RHEL-40393-Filesystem-1-dont-kill-unrelated-processes.patch new file mode 100644 index 0000000..ca24f32 --- /dev/null +++ b/SOURCES/RHEL-40393-Filesystem-1-dont-kill-unrelated-processes.patch @@ -0,0 +1,22 @@ +From 4b09b3e467a7f8076bbf20f5b027efecf16303e7 Mon Sep 17 00:00:00 2001 +From: Gianluca Piccolo +Date: Thu, 6 Jun 2024 17:34:41 +0200 +Subject: [PATCH] Fix #1944 + +--- + heartbeat/Filesystem | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/heartbeat/Filesystem b/heartbeat/Filesystem +index a445349b9..59b6c1b51 100755 +--- a/heartbeat/Filesystem ++++ b/heartbeat/Filesystem +@@ -664,7 +664,7 @@ get_pids() + if [ "X${HOSTOS}" = "XOpenBSD" ];then + fstat | grep $dir | awk '{print $3}' + else +- $FUSER -m $dir 2>/dev/null ++ $FUSER -Mm $dir 2>/dev/null + fi + elif [ "$FORCE_UNMOUNT" = "safe" ]; then + procs=$(find /proc/[0-9]*/ -type l -lname "${dir}/*" -or -lname "${dir}" 2>/dev/null | awk -F/ '{print $3}') diff --git a/SOURCES/RHEL-40393-Filesystem-2-update-bsd-logic.patch b/SOURCES/RHEL-40393-Filesystem-2-update-bsd-logic.patch new file mode 100644 index 0000000..8299fa8 --- /dev/null +++ b/SOURCES/RHEL-40393-Filesystem-2-update-bsd-logic.patch @@ -0,0 +1,26 @@ +From c9ba6ac66ee27a70c69e1156f17aa6beac277bc5 Mon Sep 17 00:00:00 2001 +From: Oyvind Albrigtsen +Date: Fri, 7 Jun 2024 14:23:28 +0200 +Subject: [PATCH] Filesystem: use fuser -c on FreeBSD, as -m and -M are used + for other functionality + +--- + heartbeat/Filesystem | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/heartbeat/Filesystem b/heartbeat/Filesystem +index 59b6c1b51..88fe2e2eb 100755 +--- a/heartbeat/Filesystem ++++ b/heartbeat/Filesystem +@@ -661,8 +661,10 @@ get_pids() + fi + + if ocf_is_true "$FORCE_UNMOUNT"; then +- if [ "X${HOSTOS}" = "XOpenBSD" ];then ++ if [ "X${HOSTOS}" = "XOpenBSD" ]; then + fstat | grep $dir | awk '{print $3}' ++ elif [ "X${HOSTOS}" = "XFreeBSD" ]; then ++ $FUSER -c $dir 2>/dev/null + else + $FUSER -Mm $dir 2>/dev/null + fi diff --git a/SOURCES/RHEL-43579-galera-mysql-redis-remove-Unpromoted-monitor-action.patch b/SOURCES/RHEL-43579-galera-mysql-redis-remove-Unpromoted-monitor-action.patch new file mode 100644 index 0000000..a7cd5ed --- /dev/null +++ b/SOURCES/RHEL-43579-galera-mysql-redis-remove-Unpromoted-monitor-action.patch @@ -0,0 +1,61 @@ +From 481672f73d05666ab20a883cf8fc746cb1f3050f Mon Sep 17 00:00:00 2001 +From: Oyvind Albrigtsen +Date: Thu, 20 Jun 2024 09:29:21 +0200 +Subject: [PATCH] galera/mariadb/mysql/redis: remove Unpromoted monitor-action, + as it's covered by the regular monitor-action + +--- + heartbeat/galera.in | 1 - + heartbeat/mariadb.in | 1 - + heartbeat/mysql | 1 - + heartbeat/redis.in | 1 - + 4 files changed, 4 deletions(-) + +diff --git a/heartbeat/galera.in b/heartbeat/galera.in +index b518595cb0..b29d68bf73 100755 +--- a/heartbeat/galera.in ++++ b/heartbeat/galera.in +@@ -299,7 +299,6 @@ Use it with caution! (and fencing) + + + +- + + + +diff --git a/heartbeat/mariadb.in b/heartbeat/mariadb.in +index e0f1f3c9f1..1dca98ba68 100644 +--- a/heartbeat/mariadb.in ++++ b/heartbeat/mariadb.in +@@ -255,7 +255,6 @@ The port on which the Promoted MariaDB instance is listening. + + + +- + + + +diff --git a/heartbeat/mysql b/heartbeat/mysql +index 1df2fc0f28..6b00889ff4 100755 +--- a/heartbeat/mysql ++++ b/heartbeat/mysql +@@ -322,7 +322,6 @@ whether a node is usable for clients to read from. + + + +- + + + +diff --git a/heartbeat/redis.in b/heartbeat/redis.in +index 6429477e11..1e541f13d5 100755 +--- a/heartbeat/redis.in ++++ b/heartbeat/redis.in +@@ -221,7 +221,6 @@ is in use. + + + +- + + + diff --git a/SOURCES/ha-cloud-support-aliyun.patch b/SOURCES/ha-cloud-support-aliyun.patch index 93d78aa..d714729 100644 --- a/SOURCES/ha-cloud-support-aliyun.patch +++ b/SOURCES/ha-cloud-support-aliyun.patch @@ -6,7 +6,7 @@ diff --color -uNr a/heartbeat/aliyun-vpc-move-ip b/heartbeat/aliyun-vpc-move-ip OCF_RESKEY_profile_default="default" OCF_RESKEY_endpoint_default="vpc.aliyuncs.com" -OCF_RESKEY_aliyuncli_default="detect" -+OCF_RESKEY_aliyuncli_default="/usr/lib/fence-agents/support/aliyun/bin/aliyuncli" ++OCF_RESKEY_aliyuncli_default="/usr/lib/fence-agents/support/aliyun/aliyun-cli/aliyun" : ${OCF_RESKEY_address=${OCF_RESKEY_address_default}} diff --git a/SPECS/resource-agents.spec b/SPECS/resource-agents.spec index 5d11b08..03148ea 100644 --- a/SPECS/resource-agents.spec +++ b/SPECS/resource-agents.spec @@ -45,7 +45,7 @@ Name: resource-agents Summary: Open Source HA Reusable Cluster Resource Scripts Version: 4.10.0 -Release: 52%{?rcver:%{rcver}}%{?numcomm:.%{numcomm}}%{?alphatag:.%{alphatag}}%{?dirty:.%{dirty}}%{?dist} +Release: 64%{?rcver:%{rcver}}%{?numcomm:.%{numcomm}}%{?alphatag:.%{alphatag}}%{?dirty:.%{dirty}}%{?dist} License: GPLv2+ and LGPLv2+ URL: https://github.com/ClusterLabs/resource-agents Source0: %{upstream_prefix}-%{upstream_version}.tar.gz @@ -119,6 +119,21 @@ Patch66: RHEL-16247-aws-vpc-move-ip-aws-vpc-route53-awseip-awsvip-auth_type-role Patch67: RHEL-17072-1-storage_mon-findif-leak-unitialized-values-EOS-fixes.patch Patch68: RHEL-17072-2-storage_mon-use-memset-to-fix-covscan-error.patch Patch69: RHEL-15304-2-findif.sh-dont-use-table-parameter.patch +Patch70: RHEL-31763-galera-fix-joiner-promotion-fails-issue.patch +Patch71: RHEL-16246-aws-agents-use-curl_retry.patch +Patch72: RHEL-34777-Filesystem-fail-when-incorrect-device-mounted.patch +Patch73: RHEL-24683-1-Filesystem-fail-leading-trailing-whitespace.patch +Patch74: RHEL-24683-2-Filesystem-return-success-stop-action.patch +Patch75: RHEL-32265-1-findif.sh-fix-corner-cases.patch +Patch76: RHEL-32265-2-IPsrcaddr-add-IPv6-support.patch +Patch77: RHEL-32265-3-IPaddr2-only-set-metric-value-for-IPv6-when-detected.patch +Patch78: RHEL-32265-4-findif.sh-ignore-unreachable-blackhole-prohibit-routes.patch +Patch79: RHEL-32265-5-IPsrcaddr-specify-dev-for-default-route.patch +Patch80: RHEL-40393-Filesystem-1-dont-kill-unrelated-processes.patch +Patch81: RHEL-40393-Filesystem-2-update-bsd-logic.patch +Patch82: RHEL-32829-db2-fix-OCF_SUCESS-typo.patch +Patch83: RHEL-43579-galera-mysql-redis-remove-Unpromoted-monitor-action.patch +Patch84: RHEL-22715-LVM-activate-fix-false-positive.patch # bundled ha-cloud-support libs Patch500: ha-cloud-support-aws.patch @@ -214,7 +229,7 @@ service managers. License: GPLv2+ and LGPLv2+ Summary: Cloud resource agents Requires: %{name} = %{version}-%{release} -Requires: ha-cloud-support +Requires: ha-cloud-support >= 4.10.0-63 Requires: socat Provides: resource-agents-aliyun Obsoletes: resource-agents-aliyun <= %{version} @@ -312,6 +327,21 @@ exit 1 %patch -p1 -P 67 %patch -p1 -P 68 %patch -p1 -P 69 +%patch -p1 -P 70 +%patch -p1 -P 71 +%patch -p1 -P 72 +%patch -p1 -P 73 +%patch -p1 -P 74 +%patch -p1 -P 75 +%patch -p1 -P 76 +%patch -p1 -P 77 +%patch -p1 -P 78 +%patch -p1 -P 79 +%patch -p1 -P 80 +%patch -p1 -P 81 +%patch -p1 -P 82 +%patch -p1 -P 83 +%patch -p1 -P 84 # bundled ha-cloud-support libs %patch -p1 -P 500 @@ -633,6 +663,58 @@ rm -rf %{buildroot}/usr/share/doc/resource-agents %{_usr}/lib/ocf/lib/heartbeat/OCF_*.pm %changelog +* Thu Aug 29 2024 Oyvind Albrigtsen - 4.10.0-64 +- IPsrcaddr: add IPv6 support + + Resolves: RHEL-32265 + +* Tue Aug 13 2024 Oyvind Albrigtsen - 4.10.0-61 +- LVM-activate: fail when both "system_id_source" and "volume_list" + are set in lvm.conf to avoid false positive activation of the VG + + Resolves: RHEL-22715 + +* Fri Jun 28 2024 Oyvind Albrigtsen - 4.10.0-60 +- galera/mysql/redis: remove Unpromoted monitor-action + + Resolves: RHEL-43579 + +* Tue Jun 25 2024 Oyvind Albrigtsen - 4.10.0-59 +- Filesystem: fail when leading or trailing whitespace is present in + device or directory parameters + + Resolves: RHEL-24683 + +* Tue Jun 11 2024 Oyvind Albrigtsen - 4.10.0-58 +- Filesystem: dont kill unrelated processes during stop-action +- db2: fix OCF_SUCESS typo + + Resolves: RHEL-40393 + Resolves: RHEL-32829 + +* Wed May 15 2024 Oyvind Albrigtsen - 4.10.0-57 +- Filesystem: fail when incorrect device mounted on mountpoint, and + dont unmount the mountpoint in this case, or if mountpoint set to "/" + + Resolves: RHEL-34777 + +* Tue Apr 30 2024 Oyvind Albrigtsen - 4.10.0-56 +- AWS agents: retry failed metadata requests to avoid instantly + failing when there is a hiccup in the network or metadata service + + Resolves: RHEL-16246 + +* Wed Apr 10 2024 Oyvind Albrigtsen - 4.10.0-54 +- galera: fix issue where joiner promotion fails is the node reports + being in non-primary state + + Resolves: RHEL-31763 + +* Wed Mar 6 2024 Oyvind Albrigtsen - 4.10.0-53 +- aliyun-vpc-move-ip: use new aliyun-cli + + Resolves: RHEL-26666 + * Thu Feb 8 2024 Oyvind Albrigtsen - 4.10.0-52 - findif.sh: fix loopback IP handling