#!/bin/sh
if test -z "`lspci|grep VGA|grep -i nvidia`"; then
 echo Error: No nVidia VGA adapter found.
 exit 3
fi
if test $(id -u) != 0; then
 echo Error: You must be root to run this script!
 exit 4
fi
INSTALLED=""
[ -e /KNOPPIX/bin/ash ] || INSTALLED="yes"
if [ -n "$INSTALLED" ]; then
 if test -n "$DISPLAY"; then
  echo Error: Can\`t be run within X! Use a text console \(ALT-CTRL-F1\)
  exit 5
 fi
else
 if grep -q unionfs /proc/mounts; then
  echo Unionfs found.
 else
  echo Activating Unionfs now.
  mkdir -p /tmp/union
  mount -t unionfs -o dirs=/tmp/union/:/KNOPPIX /none /KNOPPIX/ 2>&1 >/dev/null
 fi
fi
#VER=1.0-4620
#URL=http://www.sh.nu/download/nvidia/linux-2.4/
#VER=1.0-5328
#VER=1.0-5336
#VER=1.0-6106
#VER=1.0-6111
VER=1.0-6629
#VER=1.0-7167
#VER=1.0-7174
ARCH=""
[ "$(uname -m)" == "x86_64" ] && ARCH="_64"
URL=ftp://download.nvidia.com/XFree86/Linux-x86$ARCH/$VER/
PKG=0
PATCH=0
HACK=0
FW=1
cd /usr/src
[ -f NVIDIA-Linux-x86$ARCH-$VER-pkg$PKG.run ] || wget -Nc "$URL"NVIDIA-Linux-x86$ARCH-$VER-pkg$PKG.run
rm -rf NVIDIA-Linux-x86$ARCH-$VER-pkg$PKG
sh NVIDIA-Linux-x86$ARCH-$VER-pkg$PKG.run --extract-only &>/dev/null || (
 rm -f NVIDIA-Linux-x86$ARCH-$VER-pkg$PKG.run
 echo NVIDIA-Linux-x86$ARCH-$VER-pkg$PKG.run could not be extracted
 echo and has been deleted. Please restart this script.
 exit 1
) || exit $?
if test "$(kernelversion)" == "2.6" -a "$PATCH" == "1"; then
 wget -Nc http://www.minion.de/files/NVIDIA_kernel-$VER-2.6.diff
fi
if test -f /etc/modutils/1alsa; then
 mv /lib/modules/extra/alsa /lib/modules/`uname -r`/
 rm -f /etc/modutils/1alsa
 update-modules
fi
if [ -n "$INSTALLED" ]; then
DM=`cat /etc/X11/default-display-manager 2>/dev/null`
DM=`basename $DM 2>/dev/null`
if test -z "$DM"; then
 test -e /etc/init.d/kdm && /etc/init.d/kdm stop
else
 test -e /etc/init.d/$DM && /etc/init.d/$DM stop
fi
fi
rmmod nvidia &>/dev/null
rm -f /lib/modules/`uname -r`/kernel/drivers/video/nvidia.*o
cd NVIDIA-Linux-x86$ARCH-$VER-pkg$PKG
if test -x usr/bin/nvidia-settings; then
 rm -f /usr/bin/nvidia-settings
 rm -f /usr/local/bin/nvidia-settings
 cp usr/bin/nvidia-settings /usr/local/bin
fi
if test "$(kernelversion)" == "2.6"; then 
 if test "$PATCH" == "1"; then
  cd usr/src/nv
  patch -p1 < ../../../../NVIDIA_kernel-$VER-2.6.diff
  ln -s Makefile.kbuild Makefile
  cd ../../..
 fi
else
 # fix NVIDIA's stupid error in Makefile 
 perl -pi -e 's/"\$\$\?"/"\$\?"/' Makefile
fi
[ "$(uname -r|cut -d- -f1)" == "2.6.10" ] && perl -pi -e s/pci_find_class/pci_get_class/ usr/src/nv/nv.c
if [ "$(uname -r|grep -E '2.6.11')" != "" -a "$VER" == "1.0-6629" ]; then
 #PATCH_BASE_URL="http://www.minion.de/files/1.0-6629/"
 PATCH_BASE_URL="http://kanotix.com/files/1.0-6629/"
 PATCHES="NVIDIA_kernel-1.0-6629-1155389.diff NVIDIA_kernel-1.0-6629-1161283.diff NVIDIA_kernel-1.0-6629-1165235.diff NVIDIA_kernel-1.0-6629-1171869.diff NVIDIA_kernel-1.0-6629-1175225.diff NVIDIA_kernel-1.0-6629-1182399.diff NVIDIA_kernel-1.0-6629-1189413.diff NVIDIA_kernel-1.0-6629-1201042.diff"
 for p in $PATCHES; do
  #wget -qO- $PATCH_BASE_URL$p|patch -p0
  [ -f /usr/src/$p ] || wget -NqO/usr/src/$p $PATCH_BASE_URL$p
  patch -p0 </usr/src/$p || rm -f /usr/src/$p
 done
fi
if [ "$VER" == "1.0-7167" ]; then
 PATCH_BASE_URL="http://kanotix.com/files/1.0-7167/"
 PATCHES="NVIDIA_kernel-1.0-7167-1233959.diff NVIDIA_kernel-1.0-7167-1237815.diff"
 for p in $PATCHES; do
  #wget -qO- $PATCH_BASE_URL$p|patch -p0
  [ -f /usr/src/$p ] || wget -NqO/usr/src/$p $PATCH_BASE_URL$p
  patch -p0 </usr/src/$p || rm -f /usr/src/$p
 done
fi
if test "$FW" = "1"; then
 perl -pi -e 's/(NVreg_EnableAGPFW =) .*/\1 1;/' usr/src/nv/os-registry.c
fi
CC=gcc-$(perl -pe '($_)=/gcc.[Vv]ersion\s(3\.\d|2\.\d+)/;' /proc/version)
if test -e /usr/bin/$CC; then
 make install CC=/usr/bin/$CC IGNORE_CC_MISMATCH=1
else
 make install IGNORE_CC_MISMATCH=1
fi
cd ..
rm -rf NVIDIA-Linux-x86$ARCH-$VER-pkg$PKG
rm -f /etc/modutils/nvidia
perl -pi -e 's|.*char-major-195.*[\n]?||' /etc/modutils/aliases
perl -pi -e 's|[\n]?$|\n|' /etc/modutils/aliases
echo alias char-major-195 nvidia >> /etc/modutils/aliases
update-modules
if ! test -e /etc/X11/XF86Config-4.1st; then
 cp /etc/X11/XF86Config-4 /etc/X11/XF86Config-4.1st
fi
perl -p -e 's/^[\s]*Load\s*"GLcore"/#\tLoad  "GLcore"/;
            s/^[\s]*Load\s*"dri"/#\tLoad  "dri"/;
            s/^[\s]*#*[\s]*Load\s*"glx"/\tLoad  "glx"/;
            s/^[\s]*Driver\s*"nv"/\tDriver      "nvidia"/g;
            s/^[\s]*Driver\s*"fbdev"/\tDriver      "nvidia"/g;
            s/^[\s]*Driver\s*"vesa"/\tDriver      "nvidia"/g;
	    s/DefaultColorDepth.*/DefaultColorDepth 24/;
            s/^[\s]*Option\s*"sw_cursor"/\t#Option     "sw_cursor"/;
            s/^.*IgnoreDisplayDevices.*\n?//g;
	    s/^([\s]*Driver\s*"nvidia")/\1\n\tOption      "IgnoreDisplayDevices"\t"TV"/g' \
            < /etc/X11/XF86Config-4.1st > /etc/X11/XF86Config-4
test "$HACK" == "1" && rm -rf /usr/lib/tls
ldconfig
sync
if [ -n "$INSTALLED" ]; then
if test -z "$DM"; then
 test -e /etc/init.d/kdm && /etc/init.d/kdm start
else
 test -e /etc/init.d/$DM && /etc/init.d/$DM start
fi
else
 modprobe nvidia
 /etc/init.d/xsession restart
fi
