#! /bin/sh

if [ "`id -u`" != 0 ]; then
  echo "You must be root to switch nvidia drivers."
  exit 1
fi

available=`ls /usr/lib64/xorg/modules/extensions/nvidia-graphics-*/libglx.so 2>/dev/null | sed -e's,.*/nvidia-graphics-\([-.0-9]*\)/libglx.so,\1,' | tr '\n' ' '`

if [ -z "$available" ]; then
  echo There are no available nvidia graphics drivers on your system.
  exit 1
fi

if echo $1 | grep '^[0-9][0-9][0-9][0-9]$' > /dev/null; then
  NVversion=1.0-$1
else
  NVversion=$1
fi

if [ "$1" = "" ]; then
  echo "Usage: $0 <driver>"
  echo "       where <driver> is one of $available"
  exit
elif [ ! -e /usr/lib64/xorg/modules/extensions/nvidia-graphics-${NVversion}/libglx.so ]; then
  echo "Driver $1 is not available."
  exit 1
fi

NVfolder=nvidia-graphics-${NVversion}
NVmodule=nvidia-`echo ${NVversion} | sed -e's,\.,_,g'`

cp -a /etc/ld.so.conf /etc/ld.so.conf.backup
(echo /usr/lib64/$NVfolder; \
 echo /usr/lib64/$NVfolder; \
 grep -v nvidia-graphics /etc/ld.so.conf.backup) | uniq > /etc/ld.so.conf

rm -fr /usr/lib64/xorg/modules/extensions/nvidia > /dev/null 2>&1 || :
ln -s $NVfolder /usr/lib64/xorg/modules/extensions/nvidia

rm -f /usr/lib64/xorg/modules/drivers/nvidia_drv.*o 2>&1 || :
if [ -f /usr/lib64/xorg/modules/drivers/$NVfolder/nvidia-graphics-${NVversion}_drv.so ]; then
  ln -s /usr/lib64/xorg/modules/drivers/$NVfolder/nvidia-graphics-${NVversion}_drv.so /usr/lib64/xorg/modules/drivers/nvidia_drv.so
fi
if [ -f /usr/lib64/xorg/modules/drivers/$NVfolder/nvidia_drv.o ]; then
  ln -s /usr/lib64/xorg/modules/drivers/nvidia-${NVversion}_drv.o /usr/lib64/xorg/modules/drivers/nvidia_drv.o
fi

if [ -f /usr/lib64/xorg/modules/$NVfolder/libwfb.so ]; then
  rm -f /usr/lib64/xorg/modules/libwfb.so
  ln -s $NVfolder/libwfb.so /usr/lib64/xorg/modules/libwfb.so
fi

for file in nvidia-settings nvidia-xconfig nvidia-smi; do
  rm -f /usr/bin/$file
  if [ -e /usr/bin/${file}-${NVversion} ]; then
    ln -s ${file}-${NVversion} /usr/bin/${file}
  fi
done

/sbin/ldconfig

file=/etc/modprobe.d/nvidia.conf
if [ -e $file ]; then
    mv $file $file.backup
    grep -Ev '(NVdriver|nvidia|nouveau)' < $file.backup > $file
    mv -f $file.backup /tmp
else
    touch $file
fi

echo "# put nouveau out of the game" >> $file
echo "blacklist nouveau" >> $file
echo "# nvidia kernel module" >> $file
for NVavail in $available; do
    if [ "$NVavail" != "$NVversion" ]; then
         echo "blacklist nvidia-$NVavail" | sed -e's,\.,_,g' >> $file
    fi
done
echo "alias char-major-195 $NVmodule" >> $file
echo "alias nvidia $NVmodule" >> $file

/sbin/depmod -a

/sbin/rmmod `/sbin/lsmod | grep ^nvidia` >/dev/null 2>&1
/sbin/modprobe char-major-195 >/dev/null 2>&1

/usr/bin/nvidia-xconfig > /dev/null 2>&1 < /dev/null
/usr/lib64/nvidia-graphics-helpers/nvidia-config-x.py
exit 0
