summaryrefslogtreecommitdiffstats
path: root/heartbeat/ocf-distro
diff options
context:
space:
mode:
Diffstat (limited to 'heartbeat/ocf-distro')
-rw-r--r--heartbeat/ocf-distro209
1 files changed, 209 insertions, 0 deletions
diff --git a/heartbeat/ocf-distro b/heartbeat/ocf-distro
new file mode 100644
index 0000000..590c74e
--- /dev/null
+++ b/heartbeat/ocf-distro
@@ -0,0 +1,209 @@
+#
+# This is OCF Linux distribution query support
+#
+# Currently needed for the nfsserver RA which has some already
+# released RH specific stuff (/etc/sysconfig/nfs editing)
+#
+# These functions are intended to be POSIX-compliant for portability.
+#
+
+# systemd-based systems should all have an os-release file.
+_ETC_OS_RELEASE_FILE="/etc/os-release"
+_USR_OS_RELEASE_FILE="/usr/lib/os-release"
+
+# Legacy distro-specific files
+_DEBIAN_VERSION_FILE="/etc/debian_version"
+_REDHAT_RELEASE_FILE="/etc/redhat-release"
+_SUSE_RELEASE_FILE="/etc/SuSE-release"
+
+
+# Converts OS release ID to a standard form regardless of source.
+_process_os_release_id() {
+ _os="$1"
+
+ # Convert to lowercase, isolate distro name, remove whitespace
+ _os=$(echo "$_os" \
+ | tr "[:upper:]" "[:lower:]" \
+ | sed -e "s|\(gnu/\)*linux||" -e "s/server//" \
+ -e "s/release.*//" -e "s/[[:digit:]].*//" \
+ -e "s/[[:blank:]]//")
+
+ # Normalize known distros to os-release names
+ case "$_os" in
+ *alma*)
+ _os="almalinux"
+ ;;
+ *centos*)
+ _os="centos"
+ ;;
+ *debian*)
+ _os="debian"
+ ;;
+ *fedora*)
+ _os="fedora"
+ ;;
+ *ol*)
+ _os="ol"
+ ;;
+ *redhat*|*rhel*|*scientific*)
+ _os="rhel"
+ ;;
+ *rocky*)
+ _os="rocky"
+ ;;
+ *opensuse*)
+ _os="opensuse"
+ ;;
+ *suseenterprise*)
+ _os="sles"
+ ;;
+ *ubuntu*)
+ _os="ubuntu"
+ ;;
+ esac
+
+ echo "$_os"
+}
+
+# Converts OS version ID to a form that ocf_version_cmp() can handle.
+# Strips any garbage.
+_process_os_version_id() {
+ _ver="$1"
+ _fmt="[[:digit:]][[:digit:].-]*[[:alnum:].\+-]*"
+
+ echo "$_ver" | sed -e "s/[^[:digit:]]*\(${_fmt}\).*/\1/"
+}
+
+# Gets OS release ID (i.e., distro) or version ID from os-release file.
+# $_ETC_OS_RELEASE_FILE takes precedence over $_USR_OS_RELEASE_FILE.
+_get_val_from_os_release_file() {
+ _key=""
+ _value=""
+ _func=""
+
+ case "$1" in
+ id)
+ _key="ID"
+ _func="_process_os_release_id"
+ ;;
+ version_id)
+ _key="VERSION_ID"
+ _func="_process_os_version_id"
+ ;;
+ esac
+
+ if [ -n "$_key" ]; then
+ if [ -f "$_ETC_OS_RELEASE_FILE" ]; then
+ _value=$(awk -F "=" -v k="$_key" '$1 == k {print $2}' \
+ "$_ETC_OS_RELEASE_FILE" | tr -d \")
+ fi
+
+ if [ -z "$_value" ] && [ -f "$_USR_OS_RELEASE_FILE" ]; then
+ _value=$(awk -F "=" -v k="$_key" '$1 == k {print $2}' \
+ "$_USR_OS_RELEASE_FILE" | tr -d \")
+ fi
+ fi
+
+ # Ensure the value is in the correct format
+ [ -n "$_func" ] && _value=$("$_func" "$_value")
+
+ echo "$_value"
+}
+
+# Gets OS release ID from lsb_release command or legacy *-release files
+_get_os_from_legacy_source() {
+ _os=""
+
+ if which lsb_release >/dev/null 2>&1; then
+ _os=$(lsb_release -si)
+
+ elif [ -f "$_DEBIAN_VERSION_FILE" ]; then
+ _os="debian"
+
+ elif [ -f "$_REDHAT_RELEASE_FILE" ]; then
+ _os=$(head -n 1 "$_REDHAT_RELEASE_FILE")
+
+ elif [ -f "$_SUSE_RELEASE_FILE" ]; then
+ _os=$(head -n 1 "$_SUSE_RELEASE_FILE")
+
+ else
+ _os=$(uname -s)
+ fi
+
+ _process_os_release_id "$_os"
+}
+
+# Gets OS version from lsb_release command or legacy *-release files
+_get_version_from_legacy_source() {
+ _ver=""
+
+ if which lsb_release >/dev/null 2>&1; then
+ _ver=$(lsb_release -sr)
+
+ elif [ -f "$_DEBIAN_VERSION_FILE" ]; then
+ _ver=$(cat "$_DEBIAN_VERSION_FILE")
+
+ elif [ -f "$_REDHAT_RELEASE_FILE" ]; then
+ _ver=$(head -1 "$_REDHAT_RELEASE_FILE")
+
+ elif [ -f "$_SUSE_RELEASE_FILE" ]; then
+ _ver=$(awk '$1 == "VERSION" {print $3}' "$_SUSE_RELEASE_FILE")
+ _patchlevel=$(awk '$1 == "PATCHLEVEL" {print $3}' \
+ "$_SUSE_RELEASE_FILE")
+
+ [ -n "$_patchlevel" ] && _ver="${_ver}.${_patchlevel}"
+
+ else
+ _ver=$(uname -r)
+ fi
+
+ _process_os_version_id "$_ver"
+}
+
+# Prints OS release ID (i.e., distro name)
+get_release_id() {
+ _os=$(_get_val_from_os_release_file id)
+
+ if [ -z "$_os" ]; then
+ _os=$(_get_os_from_legacy_source)
+ fi
+
+ echo "$_os"
+}
+
+# Prints OS version ID
+get_os_version_id() {
+ _ver=$(_get_val_from_os_release_file version_id)
+
+ if [ -z "$_ver" ] || [ "$(get_release_id)" = "debian" ]; then
+ # Debian only includes major release in os-release.
+ # $_DEBIAN_VERSION_FILE has ${major}.${minor}.
+ _ver=$(_get_version_from_legacy_source)
+ fi
+
+ echo "$_ver"
+}
+
+# Returns true if the OS is Debian-based, otherwise false
+is_debian_based() {
+ get_release_id | grep -i -e "debian" -e "ubuntu" >/dev/null 2>&1
+}
+
+# Returns true if the OS is Red Hat-based, otherwise false
+is_redhat_based() {
+ get_release_id | grep -i -e "almalinux" -e "centos" -e "fedora" -e "ol" \
+ -e "redhat" -e "rhel" -e "rocky" -e "scientific" >/dev/null 2>&1
+}
+
+# Returns true if the OS is SUSE-based, otherwise false
+is_suse_based() {
+ get_release_id | grep -i -e "sles" -e "suse" >/dev/null 2>&1
+}
+
+# Sets global variables OS and VER.
+# get_os_ver() is currently unused upstream; maintained for backwards
+# compatibility.
+get_os_ver() {
+ OS=$(get_release_id)
+ VER=$(get_os_version_id)
+}