From 0bea9b0cfabe907fdc2dfdc9a11977cd6d2c20c8 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Fri, 22 Feb 2013 01:46:55 +0000 Subject: [PATCH] Sort the files gathered from `ls /etc/*[_-]release /etc/*[_-]version`. Fixes #55. Refs #54 and #56. Since we need a custom sorting order, there's a new function to do that job, `__sort_release_files`. Sorting is first done by knowledge. If we know a release file, it goes to the primary list. If it's unknown it goes to the secondary list. Afterwards the primary list gets sorted by maximum importance, ie, the CentOS files needs to come before the RedHat files. Afterwards, the primary list gets sorted again, but this time, by the lowest importance, ie, the lsb-release file should come last(it's handled separately). Finally, the function returns the primary list following the secondary list, and that will be the order for which we try to detect the distributions. --- bootstrap-salt.sh | 46 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git a/bootstrap-salt.sh b/bootstrap-salt.sh index 6f87525..7ae79d1 100755 --- a/bootstrap-salt.sh +++ b/bootstrap-salt.sh @@ -368,6 +368,47 @@ __parse_version_string() { } +#--- FUNCTION ---------------------------------------------------------------- +# NAME: __sort_release_files +# DESCRIPTION: Custom sort function. Alphabetical or numerical sort is not +# enough. +#------------------------------------------------------------------------------- +__sort_release_files() { + KNOWN_RELEASE_FILES="(arch|centos|debian|ubuntu|fedora|redhat|suse|\ + mandrake|mandriva|gentoo|slackware|turbolinux|unitedlinux|lsb)\ + (-|_)(release|version)" + primary_release_files="" + secondary_release_files="" + # Sort know VS un-known files first + for release_file in $(echo $@ | sed -r 's:[[:space:]]:\n:g' | sort --unique --ignore-case); do + match=$(echo $release_file | egrep -i ${KNOWN_RELEASE_FILES}) + if [ "x${match}" != "x" ]; then + primary_release_files="${primary_release_files} ${release_file}" + else + secondary_release_files="${secondary_release_files} ${release_file}" + fi + done + + # Now let's sort by know files importance, max important goes last in the max_prio list + max_prio="redhat-release centos-release" + for entry in $max_prio; do + if [ "x$(echo ${primary_release_files} | grep $entry)" != "x" ]; then + primary_release_files=$(echo ${primary_release_files} | sed -e "s:\(.*\)\($entry\)\(.*\):\2 \1 \3:g") + fi + done + # Now, least important goes last in the min_prio list + min_prio="lsb-release" + for entry in $max_prio; do + if [ "x$(echo ${primary_release_files} | grep $entry)" != "x" ]; then + primary_release_files=$(echo ${primary_release_files} | sed -e "s:\(.*\)\($entry\)\(.*\):\1 \3 \2:g") + fi + done + + # Echo the results collapsing multiple white-space into a single white-space + echo "${primary_release_files} ${secondary_release_files}" | sed -r 's:[[:space:]]:\n:g' +} + + #--- FUNCTION ---------------------------------------------------------------- # NAME: __gather_linux_system_info # DESCRIPTION: Discover Linux system information @@ -383,6 +424,7 @@ __gather_linux_system_info() { rv=$(lsb_release -sr) [ "${rv}x" != "x" ] && DISTRO_VERSION=$(__parse_version_string "$rv") elif [ -f /etc/lsb-release ]; then + # We don't have the lsb_release binary, though, we do have the file it parses DISTRO_NAME=$(grep DISTRIB_ID /etc/lsb-release | sed -e 's/.*=//') rv=$(grep DISTRIB_RELEASE /etc/lsb-release | sed -e 's/.*=//') [ "${rv}x" != "x" ] && DISTRO_VERSION=$(__parse_version_string "$rv") @@ -393,11 +435,11 @@ __gather_linux_system_info() { return fi - for rsource in $( + for rsource in $(__sort_release_files $( cd /etc && /bin/ls *[_-]release *[_-]version 2>/dev/null | env -i sort | \ sed -e '/^redhat-release$/d' -e '/^lsb-release$/d'; \ echo redhat-release lsb-release - ); do + )); do [ -L "/etc/${rsource}" ] && continue # Don't follow symlinks [ ! -f "/etc/${rsource}" ] && continue # Does not exist