#!/bin/bash

# card database

CARD_COUNT=5

CARD_NAME[1]="FRITZ!Card DSL"
CARD_BUS[1]=PCI
CARD_ID[1]=1131:5402
CARD_DRIVER[1]=fcdsl-suse8.2-03.11.02.tar.gz
CARD_URL[1]=ftp://ftp.avm.de/cardware/fritzcrd.dsl/linux/suse.82/
CARD_FIRMWARE[1]=fdslbase.bin
CARD_MODULE[1]=fcdsl

CARD_NAME[2]="FRITZ!Card DSL v2.0"
CARD_BUS[2]=PCI
CARD_ID[2]=1244:2900
CARD_DRIVER[2]=fcdsl2-suse8.2-03.11.03.tar.gz
CARD_URL[2]=ftp://ftp.avm.de/cardware/fritzcrd.dsl_v20/linux/suse.82/
CARD_FIRMWARE[2]=fds2base.bin
CARD_MODULE[2]=fcdsl2

CARD_NAME[3]="FRITZ!Card DSL SL"
CARD_BUS[3]=PCI
CARD_ID[3]=1244:2700
CARD_DRIVER[3]=fcdslsl-suse8.2-03.11.02.tar.gz
CARD_URL[3]=ftp://ftp.avm.de/cardware/fritzcrd.dsl_sl/linux/suse.82/
CARD_FIRMWARE[3]=fdssbase.bin
CARD_MODULE[3]=fcdslsl

CARD_NAME[4]="FRITZ!Card DSL USB"
CARD_BUS[4]=USB
CARD_ID[4]=057c:2300
CARD_DRIVER[4]=fcdslusb-suse8.2-03.11.02.tar.gz
CARD_URL[4]=ftp://ftp.avm.de/cardware/fritzcrd.dsl_usb/linux/suse.82/
CARD_FIRMWARE[4]=fdsubase.frm
CARD_MODULE[4]=fcdslusb

CARD_NAME[5]="FRITZ!Card DSL SL USB"
CARD_BUS[5]=USB
CARD_ID[5]=057c:3500
CARD_DRIVER[5]=fcdslslusb-suse9.0-03.11.04.tar.gz
CARD_URL[5]=ftp://ftp.avm.de/cardware/fritzcrd.dsl_sl_usb/linux/suse.90/
CARD_FIRMWARE[5]=fdlubase.frm
CARD_MODULE[5]=fcdslslusb

function card-info {
 # show all info for specified card
 echo ${CARD_NAME[$1]}
 echo ${CARD_BUS[$1]}
 echo ${CARD_ID[$1]}
 echo ${CARD_DRIVER[$1]}
 echo ${CARD_URL[$1]}
 echo ${CARD_FIRMWARE[$1]}
 echo ${CARD_MODULE[$1]}
}

function card-detect {
 # return card number or 0 if not detected
 PCI_ID="$(awk '{print $2}' /proc/bus/pci/devices|perl -pe 's/(....)(....)/\1:\2/')" 
 USB_ID=""
 [ -f /proc/bus/usb/devices ] && USB_ID=$(awk '/Vendor/{print $2"="$3}' /proc/bus/usb/devices|cut -d= -f2,4|sed s/=/:/)
 for (( card=1 ; card<=$CARD_COUNT; card++ )) do
  check_id=""
  case ${CARD_BUS[$card]} in
   PCI) check_id="$PCI_ID" ;;
   USB) check_id="$USB_ID" ;;
  esac
  for id in $check_id; do
   if [ "$id" = "${CARD_ID[$card]}" ]; then
    echo Found: ${CARD_NAME[$card]}
    return $card
   fi
  done
 done
 return 0
}

card-detect
CARD=$?

if [ $CARD == 0 ]; then
 echo Error: No FRITZ!Card DSL detected!
 exit 3
fi
if [ $(id -u) != 0 ]; then
 echo Error: You must be root to run this script!
 exit 4
fi
cd /usr/src
rm -rf fritz/
if ! [ -e ${CARD_DRIVER[$CARD]} ]; then
 echo Error: Driver package is missing. Get this file
 echo ${CARD_URL[$CARD]}${CARD_DRIVER[$CARD]}
 echo and put it into the /usr/src directory. Then restart this script.
 exit 1
fi
tar zxf ${CARD_DRIVER[$CARD]} &>/dev/null || (
 rm -f ${CARD_DRIVER[$CARD]}
 echo Error: ${CARD_DRIVER[$CARD]} could not be extracted
 echo and has been deleted. Please get this file again
 echo and restart this script.
 exit 2
) || exit $?
cd fritz
# patch driver for 2.4.23+
perl -pi -e 's/(KERNEL_VERSION)\(2, 5, 0\)/\1\(2, 4, 23\)/' src.drv/defs.h
CC=gcc-$(perl -pe '($_)=/gcc.[Vv]ersion\s(3\.\d|2\.\d+)/;' /proc/version)
if [ -e /usr/bin/$CC ]; then
 make install CC=/usr/bin/$CC
else
 make install
fi
if [ $? -gt 0 ]; then
 cd ..
 rm -rf fritz
 echo Error: Could not compile kernel module!
 exit 5
fi
mkdir -p /usr/share/isdn
cp ${CARD_FIRMWARE[$CARD]} /usr/share/isdn
mkdir -p /etc/isdn
if ! [ -e /etc/isdn/capi.conf.1st ]; then
 [ -e /etc/isdn/capi.conf ] && cp /etc/isdn/capi.conf /etc/isdn/capi.conf.1st
fi
perl -pi -e "s/^([^#])/#\1/;s/^.*${CARD_MODULE[$CARD]}.*//;s/^\n//" /etc/isdn/capi.conf
echo -e "${CARD_MODULE[$CARD]}\t${CARD_FIRMWARE[$CARD]}\t-\t-\t-\t-\t-" >> /etc/isdn/capi.conf
update-rc.d -f isdnactivecards remove
update-rc.d isdnactivecards defaults 13 15
mkdir -p /etc/drdsl
rm -f /etc/drdsl/adsl.conf
rm -f /etc/drdsl/modules.inc
rm -f /etc/modutils/fcdsl
update-modules
poff -a > /dev/null
/etc/init.d/isdnactivecards stop
/etc/init.d/isdnactivecards start
./drdsl
cp /etc/drdsl/modules.inc /etc/modutils/fcdsl
update-modules
/etc/init.d/isdnactivecards stop
/etc/init.d/isdnactivecards start
cd ..
rm -rf fritz
