From 6f279feb071f1371da5558e55eabb421cfa16b7b Mon Sep 17 00:00:00 2001 From: Sarah Wang Date: Wed, 30 Sep 2026 15:44:31 -0400 Subject: [PATCH 1/2] handle missing `redhat-release` metadata Some Red Hat-family images can be detected through `system-release` or `os-release`, but the install path still parsed the major version only from `/etc/redhat-release`. Fall back through the same host metadata before keeping the existing default to `7`. --- install_script.sh.template | 32 ++++++++++++++++--- unit_tests/test_install_script.sh | 53 +++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+), 4 deletions(-) diff --git a/install_script.sh.template b/install_script.sh.template index 9e0de8b5..0225397f 100644 --- a/install_script.sh.template +++ b/install_script.sh.template @@ -347,6 +347,33 @@ function remove_rpm_gpg_keys() { done } +function get_redhat_release_version() { + local release_file + local version="" + + for release_file in "${1:-/etc/redhat-release}" "${2:-/etc/system-release}"; do + if [ -r "$release_file" ]; then + version=$(grep -oE '[0-9]+' <"$release_file" | head -1) + if [ -n "$version" ]; then + printf '%s' "$version" + return 0 + fi + fi + done + + for release_file in "${3:-/etc/os-release}" "${4:-/usr/lib/os-release}"; do + if [ -r "$release_file" ]; then + version=$(grep -E '^VERSION_ID=' <"$release_file" | head -1 | cut -d = -f 2 | grep -oE '[0-9]+' | head -1) + if [ -n "$version" ]; then + printf '%s' "$version" + return 0 + fi + fi + done + + printf '7' +} + # Emulate hashmap with simple switch case function getMapData() { @@ -1397,10 +1424,7 @@ if [ "$OS" == "Red Hat" ]; then fi # NOTE: CentOS/RHEL 6 don't have /etc/os-release. /etc/centos-release and /etc/redhat-release # aren't necessarily on the system, so this is not 100 % reliable, but best we can do - release_version=$(grep -oE '[0-9]+' /dev/null | head -1) - if [ -z "$release_version" ]; then - release_version=7 - fi + release_version=$(get_redhat_release_version) if { [ "$DISTRIBUTION" == "Red Hat" ] || [ "$DISTRIBUTION" == "CentOS" ]; } && [ "$release_version" -lt 7 ]; then if [ -n "$agent_minor_version_without_patch" ]; then if [ "$agent_minor_version_without_patch" -ge "52" ]; then diff --git a/unit_tests/test_install_script.sh b/unit_tests/test_install_script.sh index 8f5d017c..e861f643 100755 --- a/unit_tests/test_install_script.sh +++ b/unit_tests/test_install_script.sh @@ -418,6 +418,59 @@ testParEnabledWithoutApiKeyOnlyEnrollment() { assertEquals "$(sudo yq eval '.private_action_runner.api_key_only_enrollment' $config_file)" "null" } +### get_redhat_release_version +setUpReleaseFiles() { + release_dir=$(mktemp -d) + missing="$release_dir/missing" + redhat_release="$release_dir/redhat-release" + system_release="$release_dir/system-release" + os_release="$release_dir/os-release" + usr_lib_os_release="$release_dir/usr-lib-os-release" +} +testRedhatReleasePreferred() { + setUpReleaseFiles + echo "CentOS Linux release 7.9.2009 (Core)" > "$redhat_release" + echo "Amazon Linux release 2 (Karoo)" > "$system_release" + echo 'VERSION_ID="9.4"' > "$os_release" + assertEquals "7" "$(get_redhat_release_version "$redhat_release" "$system_release" "$os_release" "$usr_lib_os_release")" +} +testSystemReleaseUsedWhenRedhatReleaseMissing() { + setUpReleaseFiles + echo "Amazon Linux release 2 (Karoo)" > "$system_release" + echo 'VERSION_ID="9.4"' > "$os_release" + assertEquals "2" "$(get_redhat_release_version "$missing" "$system_release" "$os_release" "$usr_lib_os_release")" +} +testOsReleaseUsedWhenReleaseFilesMissing() { + setUpReleaseFiles + echo 'VERSION_ID="9.4"' > "$os_release" + assertEquals "9" "$(get_redhat_release_version "$missing" "$missing" "$os_release" "$usr_lib_os_release")" +} +testUsrLibOsReleaseUsedAsLastSource() { + setUpReleaseFiles + echo 'VERSION_ID=8' > "$usr_lib_os_release" + assertEquals "8" "$(get_redhat_release_version "$missing" "$missing" "$missing" "$usr_lib_os_release")" +} +testFallsBackToSevenWhenNothingAvailable() { + setUpReleaseFiles + assertEquals "7" "$(get_redhat_release_version "$missing" "$missing" "$missing" "$missing")" +} +testEmptyFilesFallThroughToNextSource() { + setUpReleaseFiles + : > "$redhat_release" + : > "$system_release" + echo 'VERSION_ID="9.4"' > "$os_release" + assertEquals "9" "$(get_redhat_release_version "$redhat_release" "$system_release" "$os_release" "$usr_lib_os_release")" +} +testNonNumericOsReleaseFallsBack() { + setUpReleaseFiles + echo 'VERSION_ID=rawhide' > "$os_release" + assertEquals "7" "$(get_redhat_release_version "$missing" "$missing" "$os_release" "$missing")" +} +testMissingRedhatReleaseIsSilent() { + setUpReleaseFiles + assertEquals "" "$(get_redhat_release_version "$missing" "$missing" "$missing" "$missing" 2>&1 >/dev/null)" +} + ### install_apm_ssi getApmSsiInstallerURL() { ( From ac977c287fcf2f82d3931ab4d1d753a72fa7dddd Mon Sep 17 00:00:00 2001 From: Sarah Wang Date: Wed, 30 Sep 2026 15:49:48 -0400 Subject: [PATCH 2/2] pass release metadata paths to helper Shellcheck warns when a function references positional arguments but the production call site passes none. Pass the default release metadata paths explicitly so generated scripts keep the testable helper without triggering SC2119/SC2120. --- install_script.sh.template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install_script.sh.template b/install_script.sh.template index 0225397f..7b3a9b26 100644 --- a/install_script.sh.template +++ b/install_script.sh.template @@ -1424,7 +1424,7 @@ if [ "$OS" == "Red Hat" ]; then fi # NOTE: CentOS/RHEL 6 don't have /etc/os-release. /etc/centos-release and /etc/redhat-release # aren't necessarily on the system, so this is not 100 % reliable, but best we can do - release_version=$(get_redhat_release_version) + release_version=$(get_redhat_release_version /etc/redhat-release /etc/system-release /etc/os-release /usr/lib/os-release) if { [ "$DISTRIBUTION" == "Red Hat" ] || [ "$DISTRIBUTION" == "CentOS" ]; } && [ "$release_version" -lt 7 ]; then if [ -n "$agent_minor_version_without_patch" ]; then if [ "$agent_minor_version_without_patch" -ge "52" ]; then