#!/bin/sh
#############################################################
# Copyright 2005, All Rights Reserved, Matrox Graphics Inc. #
#############################################################
# original heavily edited by David E. Anderson danderso@well.com
# tested on Ubuntu Dapper, but nothing else 07/03/2006


#############################################################
#
# Vars Setup Starts Here
#
#############################################################

BACKUP_SUFFIX="mgabak"
BACKUP_DIR=/usr/share/matrox
UNDO=0
RESTORE=0
OVERWRITE=0
XPRESENT=0
DISPLAYHELP=0
INSTALLXDRIVER=0
INSTALLXHALDRIVER=0
INSTALLUSINGINSTALL=0
MD5SUMBIN=`which md5sum 2> /dev/null`

BLACK='\E[30m'
RED='\E[31m'
GREEN='\E[32m'
BLUE='\E[34m'
MAGENTA='\E[35m'
CYAN='\E[36m'
WHITE='\E[37m'

#############################################################
#
# Script Functions Start Here
#
#############################################################

function IsRoot
{
    # check for superuser mode
    if ! test -r /proc/kmsg ; then
        echo "---------------------------------------------------------"
        echo -e "$RED\033[1mERROR\033[0m: \033[1mYou must be logged in as Root to run this program.\033[0m"
        echo "---------------------------------------------------------"
        echo ""
        exit 1
    fi
}

function UseInstall
{
    WHEREIS=`whereis install 2> /dev/null`
    field=`echo $WHEREIS | grep -s '/usr/bin/install'`
    if [ "$field" != "" ]; then
        INSTALLUSINGINSTALL=1
    fi
}

function ParseOptions
{
    n=$#
    i=0
    for arg in $* ; do
        param=`echo $arg | cut -d'=' -f1`
        value=`echo $arg | cut -d'=' -f2`
        case $param in
            "-h") DISPLAYHELP=1 ;;
            "-uninstall") UNDO=1 ;;
            "-restore") RESTORE=1 ;;
            "-overwrite") OVERWRITE=1 ;;
	    *) echo "unrecognized argument $param.  exiting..." ; exit 1 ;;
        esac;
    done
}

function GetXPath
{
        XPRESENT=0
	UNAME=`uname -m`
	if [ "$UNAME" = "x86_64" ]; then
  	  LIBPATH=lib64
	else
  	  LIBPATH=lib
	fi

        if test -e /usr/X11R6/$LIBPATH ; then
          XPATH="/usr/X11R6/$LIBPATH"
	fi

	# if xorg is present, whether or not xfree is present, use it
        if test -e /usr/$LIBPATH/xorg ; then
          XPATH="/usr/$LIBPATH/xorg"
        fi

        if  test -z $XPATH ; then
            echo -e "$RED\033[1mERROR\033[0m: \033[1mX path could not be found. Please make"
            echo -e "       sure that an X server is installed.\033[0m"
            echo ""
            echo -e "\033[1mPlease enter the full path to your current X directory above the modules directory: "
            echo -e "Examples: /usr/$LIBPATH/xorg or /usr/X11R6/$LIBPATH\033[0m"
            read XPATH
	    echo ""
        fi

        if  ! test -e $XPATH/modules/drivers ; then
            echo -e "$RED\033[1mERROR\033[0m: \033[1mModule and drivers could not be found on path $XPATH. Please make"
            echo -e "       sure that an X server is installed.\033[0m"
            echo ""
	    exit 1
	fi

        export XINSTALLDIR=$XPATH/modules/drivers

	if test -e $XPATH/modules/extensions/libglx.so; then
  	  EXTENSION="so"
	else
  	  EXTENSION="o"
	fi

        export XPATH
    
}

function GetXVersion
{
    XVERSION=`X -version 2>&1 | grep -s "XFree86 Version" | cut -d" " -f3 | sed -e "s/\([^\.]*\.[^\.]*\.[^\.]*\)\.[^\.]*/\1/"`

    if test -z $XVERSION ; then 
        XVERSION=`X -version 2>&1 | grep -s "X Protocol Version" | sed -e "s/Revision[^0-9]*\([0-9]*\), Release[^0-9]*\([0-9.]*\)/\2\.\1/" | cut -d" " -f 5-`
    fi
    
    if test -z $XVERSION ; then
	echo -e "\033[1mno X version found... exiting."
	echo ""
        exit 1
    fi
    export XVERSION

    if ! test -e ./xserver/$XVERSION ; then
	# HACK fix for SuSE 9.1
	if [ "$XVERSION" == "4.3.99" ]; then
            XPRESENT=1
            XVERSION="6.7.0"
	elif [ "$XVERSION" == "4.3.99.902" ]; then
            XPRESENT=1
            XVERSION="6.7.0"
	# HACK fix for Distros that use XFree86 4.4.0
	elif [ "$XVERSION" == "4.4.0" ]; then
	    XPRESENT=1
        XVERSION="6.7.0"
	elif [ "$XVERSION" == "6.8.1.0" ]; then
	    XPRESENT=1
        XVERSION="6.8.1"
	elif [ "$XVERSION" == "6.8.2.0" ]; then
	    XPRESENT=1
        XVERSION="6.8.2"
	else
            echo -e "$RED\033[1mERROR\033[0m: \033[1mThe X server drivers included in this installation package"
            echo -e "       do not support the current version of your X server.\033[0m"
    	    echo ""
            exit 1
	fi
    else
        XPRESENT=1
    fi
}

function SetFilenames
{
    export XDRIVER="mga_drv.$EXTENSION"
    export XHALDRIVER="mga_hal_drv.$EXTENSION"
}

function InstallXDriver
{

        echo -e "\033[1mYou are about to install the X server driver,"
        echo -en "do you wish to continue? (y/n)\033[0m "
        read STRCONT 
        echo ""
        if [ $STRCONT != 'y' -a $STRCONT != 'Y' ]; then
            echo -e "\033[1mAborting X server driver installation as requested.\033[0m"
            echo ""
	    exit 0
	fi

        #######################################
        # has the driver been installed before?
        #######################################

	   if test -e ./xserver/$XVERSION/$XDRIVER ; then
	     if test -e $XINSTALLDIR/$XDRIVER ; then
               TEST1="`$MD5SUMBIN -b ./xserver/$XVERSION/$XDRIVER | cut -b 1-32`"
               TEST2="`$MD5SUMBIN -b $XINSTALLDIR/$XDRIVER | cut -b 1-32`"
               if [ "$TEST1" == "$TEST2" ]; then
                 echo -e "\033[1mInstalled X driver is the same as the installer "
                 echo -e "version, not installing driver file.\033[0m"
                 echo ""
	       else
                if [ "$OVERWRITE" != "1" ]; then
	            echo -e "\033[1mAn X driver exists.  Not overwriting... use -overwrite to override)\033[0m"
                    echo ""
		else
		  INSTALLXDRIVER=1
		fi
	       fi
	     else
	       INSTALLXDRIVER=1
	     fi
	   fi

	  if test -e ./xserver/$XVERSION/$XHALDRIVER ; then
	    if test -e $XINSTALLDIR/$XHALDRIVER ; then
              TEST1="`$MD5SUMBIN -b ./xserver/$XVERSION/$XHALDRIVER | cut -b 1-32`"
              TEST2="`$MD5SUMBIN -b $XINSTALLDIR/$XHALDRIVER| cut -b 1-32`"
              if [ "$TEST1" == "$TEST2" ]; then
                 echo -e "\033[1mInstalled X HAL driver is the same as the installer "
                 echo -e "version, not installing HAL driver file.\033[0m"
                 echo ""
	      else
                if [ "$OVERWRITE" != "1" ]; then
	            echo -e "\033[1mA HAL driver exists.  Not overwriting... use -overwrite to override)\033[0m"
                    echo ""
		else
		  INSTALLXHALDRIVER=1
	        fi
	      fi
	    else
		INSTALLXHALDRIVER=1
	    fi
	  fi

        ####################################
        # Is there a backup dir
        ####################################
        if ! test -e $BACKUP_DIR ; then
          mkdir $BACKUP_DIR
	fi
    

	if [ "$INSTALLXDRIVER" = "1" ] ; then
	  if test -e $BACKUP_DIR/$XDRIVER.$BACKUP_SUFFIX ; then
	   if test -e $XINSTALLDIR/$XDRIVER ; then
             TEST1="`$MD5SUMBIN -b $BACKUP_DIR/$XDRIVER.$BACKUP_SUFFIX | cut -b 1-32`"
             TEST2="`$MD5SUMBIN -b $XINSTALLDIR/$XDRIVER | cut -b 1-32`"
             if [ "$TEST1" == "$TEST2" ] ; then
               ####################################
               # Yes they are so do nothing
               ####################################
               echo -e "\033[1mCurrently installed driver is the same as the backup file."
               echo -e "No backup performed.\033[0m"
               echo ""
	     else
		echo -e "\033[1mCreating a new X server driver backup file"
        	echo -e "$XDRIVER.$BACKUP_SUFFIX in $BACKUP_DIR.\033[0m"
        	echo ""
                CURRENTDATE=`date +%y%m%d%H%M%S`
                echo -e "\033[1mRenaming current X server driver backup file"
                echo -e "$XDRIVER.$CURRENTDATE in $BACKUP_DIR.\033[0m"
                echo ""
                mv $BACKUP_DIR/$XDRIVER.$BACKUP_SUFFIX $BACKUP_DIR/$XDRIVER.$CURRENTDATE
                mv $XINSTALLDIR/$XDRIVER $BACKUP_DIR/$XDRIVER.$BACKUP_SUFFIX
	     fi
	    else
		echo -e "\033[1mThere is a backup driver but no installed driver.  "
		echo -e "Continuing with installation...\033[0m"
		echo "" 
	    fi
	  else
	    if test -e $XINSTALLDIR/$XDRIVER ; then
              echo -e "\033[1mBacking up current X server driver to backup file"
              echo -e " $BACKUP_DIR/$XDRIVER.$BACKUP_SUFFIX.\033[0m"
              echo ""
              mv $XINSTALLDIR/$XDRIVER $BACKUP_DIR/$XDRIVER.$BACKUP_SUFFIX
	    fi
	  fi
	fi

	if [ "$INSTALLXHALDRIVER" = "1" ] ; then
	  if test -e $BACKUP_DIR/$XHALDRIVER.$BACKUP_SUFFIX ; then
	     if test -e $XINSTALLDIR/$XHALDRIVER ; then
               TEST1="`$MD5SUMBIN -b $BACKUP_DIR/$XHALDRIVER.$BACKUP_SUFFIX | cut -b 1-32`"
               TEST2="`$MD5SUMBIN -b $XINSTALLDIR/$XHALDRIVER | cut -b 1-32`"
               if [ "$TEST1" == "$TEST2" ] ; then
                 ####################################
                 # Yes they are so do nothing
                 ####################################
                 echo -e "\033[1mCurrently installed HAL driver is the same as the backup file."
                 echo -e "No backup performed.\033[0m"
                 echo ""
	       else
                  CURRENTDATE=`date +%y%m%d%H%M%S`
                  echo -e "\033[1mRenaming current X server HAL driver backup file"
                  echo -e " to $XHALDRIVER.$CURRENTDATE in $BACKUP_DIR.\033[0m"
                  echo ""
        	  echo -e "\033[1mCreating a new X server HAL driver backup file"
        	  echo -e " $XHALDRIVER.$BACKUP_SUFFIX in $BACKUP_DIR.\033[0m"
        	  echo ""
                  mv $BACKUP_DIR/$XHALDRIVER.$BACKUP_SUFFIX $BACKUP_DIR/$XHALDRIVER.$CURRENTDATE
                  mv $XINSTALLDIR/$XHALDRIVER $BACKUP_DIR/$XHALDRIVER.$BACKUP_SUFFIX
	       fi
	      else
		echo -e "\033[1mThere is a backup HAL driver but no installed driver.  "
		echo -e "Continuing with installation...\033[0m"
		echo "" 
	      fi
	  else
	    if test -e $XINSTALLDIR/$XHALDRIVER ; then
              echo -e "\033[1mBacking up current X server HAL driver to backup file "
              echo -e "$XHALDRIVER.$BACKUP_SUFFIX in $BACKUP_DIR.\033[0m"
              echo ""
              mv $XINSTALLDIR/$XHALDRIVER $BACKUP_DIR/$XHALDRIVER.$BACKUP_SUFFIX
	    fi
	  fi
	 fi

        ####################################
        # Install the driver(s)
        ####################################

	if [ "$INSTALLXDRIVER" = "1" ] ; then
	  echo -e "\033[1mInstalling X driver...\033[0m"
	  echo ""
          if [ "$INSTALLUSINGINSTALL" = "1" ]; then
            install -p -m 755 xserver/$XVERSION/$XDRIVER $XINSTALLDIR
          else
            cp -f xserver/$XVERSION/$XDRIVER $XINSTALLDIR/$XDRIVER
	  fi
	fi

        if [ "$INSTALLXHALDRIVER" = "1" ] ; then
	  echo -e "\033[1mInstalling HAL driver...\033[0m"
	  echo ""
          if [ "$INSTALLUSINGINSTALL" = "1" ]; then
              install -p -m 755 ./xserver/$XVERSION/$XHALDRIVER $XINSTALLDIR
	  else
              cp -f xserver/$XVERSION/$XHALDRIVER $XINSTALLDIR/$XHALDRIVER
          fi
        fi
    
}

function Uninstall
{
            echo -e "\033[1mDo you wish to uninstall or recover"
            echo -en "a backup or cancel (u/r)\033[0m"
            read YESNOCANCEL
            echo ""
            if [ $YESNOCANCEL == 'u' -o $YESNOCANCEL == 'U' ]; then
		UNINSTALLED=0
                if test -e $XINSTALLDIR/$XDRIVER ; then 
                    echo "Uninstalling X driver"
                    rm -f $XINSTALLDIR/$XDRIVER
		    UNINSTALLED=1
                fi
                if test -e $XINSTALLDIR/$XHALDRIVER ; then 
                    echo "Uninstalling X HAL driver"
                    rm -f $XINSTALLDIR/$XHALDRIVER
		    UNINSTALLED=1
                fi

		if [ "$UNINSTALLED" = "1" ] ; then
                  echo ""
                  echo "Uninstallation complete"
                  echo ""
		else
		  echo "Nothing uninstalled.  Exiting..."
		  echo ""
		  exit 1
		fi

                echo -e "\033[1mDo you wish to restore a backup version"
                echo -en "(if available) (y/n)\033[0m? "
                read YESNOCANCEL
                echo ""
                if [ $YESNOCANCEL = 'y' -o $YESNOCANCEL = 'Y' ]; then
		  Restore
		fi
		echo "exiting..."
		exit 0
	    else
		if [ $YESNOCANCEL = 'r' -o $YESNOCANCEL = 'R' ]; then
	         Restore
		fi
	        exit 0
            fi
}

function Restore
{
  if test -e $BACKUP_DIR/$XDRIVER.$BACKUP_SUFFIX ; then 
    echo "Restoring X driver..."
    if [ "$INSTALLUSINGINSTALL" = "1" ]; then
      install -p -m 755 $BACKUP_DIR/$XDRIVER.$BACKUP_SUFFIX $XINSTALLDIR
    else
      cp -f $BACKUP_DIR/$XDRIVER.$BACKUP_SUFFIX $XINSTALLDIR/$XDRIVER
    fi
    rm -f $BACKUP_DIR/$XDRIVER.$BACKUP_SUFFIX
    echo "X driver restoration complete"
    echo ""
 else
   echo "No X driver backup file found..."
   echo ""
 fi

 if test -e $BACKUP_DIR/$XHALDRIVER.$BACKUP_SUFFIX ; then 
   if [ "$INSTALLUSINGINSTALL" = "1" ]; then
     install -p -m 755 $BACKUP_DIR/$XHALDRIVER.$BACKUP_SUFFIX $XINSTALLDIR
   else
     cp -f $BACKUP_DIR/$XHALDRIVER.$BACKUP_SUFFIX $XINSTALLDIR/$XHALDRIVER
   fi
   rm -f $BACKUP_DIR/$XHALDRIVER.$BACKUP_SUFFIX
   echo "X HAL driver restoration complete..."
   echo ""
 else
   echo "No HAL backup file found..."
   echo ""
 fi
 exit 0
}


#############################################################
#
# Script Starts Here
#
#############################################################

clear
echo -e $GREEN"\033[1m"
echo "========================================"
echo "   Matrox Linux Driver Install Script   "
echo "========================================"
echo -e $GREEN"\033[0m"

#################################
# verify if user has root access
#################################
IsRoot

#################################
# verify if we can use install
#################################
UseInstall

#################################
# Parse command line options
#################################
ParseOptions $*

if [ "$DISPLAYHELP" = "1" ] ; then
    echo "Options :"
    echo ""
    echo "    -h            Displays this message."
    echo "    -overwrite    Used to force driver installation."
    echo "    -uninstall    Reinstalls a backup (if available) or"
    echo "                  uninstall the current driver."
    echo "    -restore      Reinstalls a backup (if available)"
    echo ""
    exit 0
fi

    #################################
    # Get installed X path
    #################################
    GetXPath
    
    #################################
    # Get installed X version
    #################################
    GetXVersion
    
    #################################
    # Setup File Vars
    #################################
    SetFilenames
    
if [ "$UNDO" = "1" ]; then
    Uninstall
    exit 0
elif [ "$RESTORE" = "1" ]; then
 echo "calling Restore"
 Restore
else
 if [ "$OVERWRITE" = "1" ]; then
        echo -e "$RED\033[1mOverwrite option enabled."
        echo -en "  Do you wish to continue? (y/n)\033[0m "
        read STRCONT 
        echo ""
        if [ $STRCONT != 'y' -a $STRCONT != 'Y' -a $STRCONT != 'yes' -a $STRCONT != 'YES' ]; then
            exit 1
        fi
 fi    
 InstallXDriver
fi       
 

