dist_information.sh 4.24 KB
##
# \file

# To each interface a set of caller functions exist, that take an instance
# of an object and then in turn call the implementation for the class of
# this object. If there is none within the class it looks into its
# parent class and so forth.
#
# This is somewhat similar to late binding in real OOP languages, but
# by far not so elaborated. This is not a real object oriented language
# and will surely never ever provide all features these have.
#
# That said it has proven very usefull for me to orgnize code and prevent
# code duplication.
#
# \author	Georg Hopp
#
# \copyright
# Copyright © 2014 Georg Hopp
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#

##
# if we are on a linux try to figure out wich distribution we are
# running.
# First look what kind of realease file we have:
#   
#   00 01 - Novell SuSE   ---> /etc/SuSE-release
#   00 02 - Red Hat       ---> /etc/redhat-release, /etc/redhat_version
#   00 04 - Fedora        ---> /etc/fedora-release
#   00 08 - Slackware     ---> /etc/slackware-release, /etc/slackware-version
#   00 10 - Debian        ---> /etc/debian_release, /etc/debian_version
#   00 20 - Mandrake      ---> /etc/mandrake-release
#   00 40 - Yellow dog    ---> /etc/yellowdog-release
#   00 80 - Sun JDS       ---> /etc/sun-release
#   01 00 - Solaris/Sparc ---> /etc/release
#   02 00 - Gentoo        ---> /etc/gentoo-release
#
# Here I follow a pessimistic way because I prefere to have no
# identification at all over a wrong one...so I check for all these files.
# If I can't find any or find multiple of them I assume this system
# as unidentified. Anyway when I found one I still check the content...
# Here I need some help as I don't know the valid content of these files.
# For now I assume that at least the name of the distribution is in
# the file.
#
gather_dist_info() {
	[ -z "${DIST}" ] || return

	case "${OS}" in 
		*Linux*)
			local SUSE=1
			local REDHAT=2
			local FEDORA=4
			local SLACKWARE=8
			local DEBIAN=16
			local MANDRAKE=32
			local YELLOWDOG=64
			local SUNJDS=128
			local GENTOO=256
			local SOLARIS=512

			local LAST=${SOLARIS}

			local CHK=$((SUSE|REDHAT|FEDORA|SLACKWARE|DEBIAN|MANDRAKE|\
				YELLOWDOG|SUNJDS|GENTOO|SOLARIS))

			eval local FILES_${SUSE}=\'/etc/SuSE-release\'
			eval local FILES_${REDHAT}=\'/etc/redhat-release /etc/redhat_version\'
			eval local FILES_${FEDORA}=\'/etc/fedora-release\'
			eval local FILES_${SLACKWARE}=\'/etc/slackware-release /etc/slackware-version\'
			eval local FILES_${DEBIAN}=\'/etc/debian_release /etc/debian_version\'
			eval local FILES_${MANDRAKE}=\'/etc/mandrake-release\'
			eval local FILES_${YELLOWDOG}=\'/etc/yellowdog-release\'
			eval local FILES_${SUNJDS}=\'/etc/sun-release\'
			eval local FILES_${GENTOO}=\'/etc/gentoo-release\'
			eval local FILES_${SOLARIS}=\'/etc/release\'

			local CUR=1
			while [ ${CUR} -le ${LAST} ]
			do
				local DIR

				eval local FILES=\"\${FILES_${CUR}}\"

				for DIR in ${FILES}
				do
					[ -f ${DIR} ] || CHK=$((CHK&~CUR))
				done

				CUR=$((CUR*2))
			done

			DIST="Unknown"

			[ ${CHK} -eq ${SUSE} ]      && DIST="Suse"
			[ ${CHK} -eq ${REDHAT} ]    && DIST="Redhat"
			[ ${CHK} -eq ${FEDORA} ]    && DIST="Fedora"
			[ ${CHK} -eq ${SLACKWARE} ] && DIST="Slakware"
			[ ${CHK} -eq ${DEBIAN} ]    && DIST="Debian"
			[ ${CHK} -eq ${MANDRAKE} ]  && DIST="Mandrake"
			[ ${CHK} -eq ${YELLOWDOG} ] && DIST="Yellowdog"
			[ ${CHK} -eq ${SUNJDS} ]    && DIST="Sun"
			[ ${CHK} -eq ${GENTOO} ]    && DIST="Gentoo"
			[ ${CHK} -eq ${SOLARIS} ]   && DIST="Solaris"

			if [ 'Unknown' != "${DIST}" ]
			then
				eval ${GREP} -iq ${DIST} \${FILES_${CHK}} || DIST="Unknown"
			fi

			set_class ${DIST};;
		*)
			DIST="${OS}"
	esac

	export DIST
}

# vim: set ts=4 sw=4: