#!/bin/sh
# Author: Vitaly Lipatov <lav@etersoft.ru>
# 2007, 2009, 2010 (c) Etersoft
# 2007 Public domain

# Print the distro version
# Welcome to send updates!

# You can set ROOTDIR to your root dir
#ROOTDIR=
# TODO: /bin/lsb_release

# Check for DISTRO specific file in /etc
distro()
{
	#[ -n "$ROOTDIR" ] || return
	# fill global DISTROFILE
	DISTROFILE="$ROOTDIR/etc/$1"
	[ -f "$DISTROFILE" ]
}

# Has DISTRO file specified word?
has()
{
	[ -n "$DISTROFILE" ] || exit 1
	grep "$1" "$DISTROFILE" >/dev/null 2>&1
}

# Translate DISTRIB_ID in vendor name
rpmvendor()
{
	[ "$DISTRIB_ID" = "ALTLinux" ] && echo "alt" && return
	[ "$DISTRIB_ID" = "LinuxXP" ] && echo "lxp" && return
#	[ "$DISTRIB_ID" = "Mandriva" ] && echo "mdv" && return
	echo "$DISTRIB_ID" | tr "[A-Z]" "[a-z]"
}

# Print DISTRIB_ID name in package manner
pkgvendor()
{
	[ "$DISTRIB_ID" = "ALTLinux" ] && echo "alt" && return
	[ "$DISTRIB_ID" = "LinuxXP" ] && echo "lxp" && return
	[ "$DISTRIB_ID" = "Mandriva" ] && echo "mdv" && return
	echo "$DISTRIB_ID" | tr "[A-Z]" "[a-z]"
}

get_var()
{
	grep -i "^$1 *=" | head -n 1 | sed -e "s/^[^=]*[ \t]*=[ \t]*//"

}

# 2010.1 -> 2010
get_major_version()
{
	echo "$1" | sed -e "s/\..*//g"
}

# Set DISTRIB_ID
# default
DISTRIB_ID="Generic"
DISTRIB_RELEASE=""

if distro lsb-release ; then
	DISTRIB_ID=`cat $DISTROFILE | get_var DISTRIB_ID`
	DISTRIB_RELEASE=`cat $DISTROFILE | get_var DISTRIB_RELEASE`
fi

# ALT Linux based
if distro altlinux-release ; then
	DISTRIB_ID="ALTLinux"
	if has Strawberry ; then DISTRIB_RELEASE="2.3"
	elif has Citron   ; then DISTRIB_RELEASE="2.4"
	elif has 20050723 ; then DISTRIB_RELEASE="3.0"
	elif has Ajuga    ; then DISTRIB_RELEASE="4.0"
	elif has 20070810 ; then DISTRIB_RELEASE="4.0"
	elif has Walnut   ; then DISTRIB_RELEASE="4.0"
	elif has 5.0      ; then DISTRIB_RELEASE="5.0"
	elif has Desktop  ; then DISTRIB_RELEASE="4.0"
	elif has 5.1      ; then DISTRIB_RELEASE="5.1"
	elif has Ziziphora ; then DISTRIB_RELEASE="5.1"
	elif has 6.0      ; then DISTRIB_RELEASE="p6"
	elif has Centaurea ; then DISTRIB_RELEASE="p6"
	elif has Sisyphus ; then DISTRIB_RELEASE="Sisyphus"
	fi

# fixme: can we detect by some file?
elif [ `uname` = "FreeBSD" ] ; then
	DISTRIB_ID="FreeBSD"
	UNAME=$(uname -r)
	DISTRIB_RELEASE=$(echo "$UNAME" | grep RELEASE | sed -e "s|\([0-9]\.[0-9]\)-RELEASE|\1|g")

elif distro gentoo-release ; then
	DISTRIB_ID="Gentoo"
	DISTRIB_RELEASE=`basename $(readlink $ROOTDIR/etc/make.profile)`

# Slackware based
elif distro mopslinux-version ; then
	DISTRIB_ID="MOPSLinux"
	if   has 4.0 ; then DISTRIB_RELEASE="4.0"
	elif has 5.0 ; then DISTRIB_RELEASE="5.0"
	elif has 5.1 ; then DISTRIB_RELEASE="5.1"
	elif has 6.0 ; then DISTRIB_RELEASE="6.0"
	elif has 6.1 ; then DISTRIB_RELEASE="6.1"
	fi
elif distro slackware-version ; then
	DISTRIB_ID="Slackware"
	if   has 10.2 ; then DISTRIB_RELEASE="10.2"
	elif has 11 ; then DISTRIB_RELEASE="11"
	elif has 11.1 ; then DISTRIB_RELEASE="11.1"
	elif has 12 ; then DISTRIB_RELEASE="12"
	fi

elif distro arch-release ; then
	DISTRIB_ID="ArchLinux"
	DISTRIB_RELEASE="2010"
	if grep 2011 -q $ROOTDIR/etc/pacman.d/mirrorlist ; then
		DISTRIB_RELEASE="2011"
	fi

# for Ubuntu use standard LSB info
elif [ "$DISTRIB_ID" = "Ubuntu" ] && [ -n "$DISTRIB_RELEASE" ]; then
	# use LSB version
	true

# Debian based
elif distro debian_version ; then
	DISTRIB_ID="Debian"
	DISTRIB_RELEASE=`cat $DISTROFILE`


# Mandriva based
elif distro pclinuxos-release ; then
	DISTRIB_ID="PCLinux"
	if   has "2007" ; then DISTRIB_RELEASE="2007"
	elif has "2008" ; then DISTRIB_RELEASE="2008"
	elif has "2010" ; then DISTRIB_RELEASE="2010"
	fi

elif distro mandriva-release || distro mandrake-release ; then
	DISTRIB_ID="Mandriva"
	if   has 2005 ; then DISTRIB_RELEASE="2005"
	elif has 2006 ; then DISTRIB_RELEASE="2006"
	elif has 2007 ; then DISTRIB_RELEASE="2007"
	elif has 2008 ; then DISTRIB_RELEASE="2008"
	elif has 2009.0 ; then DISTRIB_RELEASE="2009.0"
	elif has 2009.1 ; then DISTRIB_RELEASE="2009.1"
	else
		# use /etc/lsb-release info by default
		true
	fi

# make old as generic
#elif distro mandrake-release ; then
#	DISTRIB_ID="Mandriva"

# Fedora based
elif distro linux-xp-release || distro lxp-release; then
	DISTRIB_ID="LinuxXP"
	if has "Attack of the Clones" ; then DISTRIB_RELEASE="2006"
	elif has "2007" ; then DISTRIB_RELEASE="2007"
	elif has "2008" ; then DISTRIB_RELEASE="2008"
	elif has "2009" ; then DISTRIB_RELEASE="2009"
	fi

elif distro asplinux-release ; then
	DISTRIB_ID="ASPLinux"
	if   has Karelia ; then DISTRIB_RELEASE="10"
	elif has Seliger ; then DISTRIB_RELEASE="11"
	elif has "11.1" ; then DISTRIB_RELEASE="11.1"
	elif has Ladoga ; then DISTRIB_RELEASE="11.2"
	elif has "11.2" ; then DISTRIB_RELEASE="11.2"
	elif has "12" ; then DISTRIB_RELEASE="12"
	elif has "13" ; then DISTRIB_RELEASE="13"
	elif has "14" ; then DISTRIB_RELEASE="14"
	elif has "15" ; then DISTRIB_RELEASE="15"
	fi

elif distro MCBC-release ; then
	DISTRIB_ID="MCBC"
	if   has 3.0 ; then DISTRIB_RELEASE="3.0"
	elif has 3.1 ; then DISTRIB_RELEASE="3.1"
	fi

elif distro fedora-release ; then
	DISTRIB_ID="Fedora"
	if   has Stentz ; then DISTRIB_RELEASE="4"
	elif has Bordeaux ; then DISTRIB_RELEASE="5"
	elif has Zod ; then DISTRIB_RELEASE="6"
	elif has Moonshine ; then DISTRIB_RELEASE="7"
	elif has Werewolf ; then DISTRIB_RELEASE="8"
	elif has Sulphur ; then DISTRIB_RELEASE="9"
	elif has Cambridge ; then DISTRIB_RELEASE="10"
	else
		DISTRIB_RELEASE=$(cat "$DISTROFILE" | grep "release" | sed -e "s|.*release \([0-9]*\).*|\1|g")
	fi

elif distro redhat-release ; then
	# FIXME if need
	# actually in the original RHEL: Red Hat Enterprise Linux .. release N
	DISTRIB_ID="RHEL"
	if has CentOS ; then
		DISTRIB_ID="CentOS"
	elif has Scientific ; then
		DISTRIB_ID="Scientific"
	fi
	if has Beryllium ; then
		DISTRIB_ID="Scientific"
		DISTRIB_RELEASE="4.1"
	elif has Shrike ; then
		DISTRIB_ID="RedHat"
		DISTRIB_RELEASE="9"
	elif has Taroon ; then 	DISTRIB_RELEASE="3"
	elif has "release 4" ; then DISTRIB_RELEASE="4"
	elif has "release 5" ; then DISTRIB_RELEASE="5"
	elif has "release 6" ; then DISTRIB_RELEASE="6"
	elif has "release 7" ; then DISTRIB_RELEASE="7"
	fi

# SUSE based
elif distro SuSe-release || distro SuSE-release ; then
	DISTRIB_ID="SUSE"
	if   has "Desktop 9" ; then
		DISTRIB_ID="NLD"
		DISTRIB_RELEASE="9"
	elif has "10.1" ; then DISTRIB_RELEASE="10.1"
	elif has "10.2" ; then DISTRIB_RELEASE="10.2"
	elif has "10.3" ; then DISTRIB_RELEASE="10.3"
	elif has "10.4" ; then DISTRIB_RELEASE="10.4"
	elif has "10" ; then DISTRIB_RELEASE="10"
	elif has "11.1" ; then DISTRIB_RELEASE="11.1"
	elif has "11.2" ; then DISTRIB_RELEASE="11.2"
	elif has "11.3" ; then DISTRIB_RELEASE="11.3"
	elif has "11.4" ; then DISTRIB_RELEASE="11.4"
	elif has "11" ; then DISTRIB_RELEASE="11"
	elif has "12" ; then DISTRIB_RELEASE="12"
	elif has "13" ; then DISTRIB_RELEASE="13"
	fi

# try use standart LSB info
elif distro lsb-release && [ -n "$DISTRIB_RELEASE" ]; then
	# use LSB
	true
fi

case $1 in
	-p)
		# overrider DISTRIB_ID
		test -n "$2" && DISTRIB_ID="$2"
		case `pkgvendor` in
			freebsd) echo "pkg" ;;
			slackware|mopslinux) echo "tgz" ;;
			archlinux) echo "tar.xz" ;;
			gentoo) echo "tbz2" ;;
			debian|ubuntu) echo "deb" ;;
			alt|asplinux|suse|madriva|mandrake|pclinux)
				echo "rpm" ;;
			fedora|redhat|scientific|centos|rhel)
				echo "rpm" ;;
			*)  echo "rpm" ;;
		esac
		exit 0
		;;
	-h)
		echo "-p print type of packaging system"
		echo "-d print distro name"
		echo "-v print version of distro"
		echo "-e print full name of distro with version (by default)"
		echo "-s print name of distro for build system"
		echo "-n print vendor name (as _vendor macros in rpm)"
		echo "-h this help"
		exit 0
		;;
	-d)
		echo $DISTRIB_ID
		;;
	-v)
		echo $DISTRIB_RELEASE
		;;
	-s)
		pkgvendor
		exit 0
		;;
	-n)
		rpmvendor
		exit 0
		;;
	*)
		[ -n "$DISTRIB_RELEASE" ] && echo $DISTRIB_ID/$DISTRIB_RELEASE || echo $DISTRIB_ID
		;;
esac

