#!/bin/bash

THISPATH=/etc/init.d/zaptel
LSPCI=lspci
LSMOD=lsmod
MODPROBE=modprobe
RMMOD=rmmod
DMESG=dmesg

ANAmod=wctdm
ANArmmod=wcfxs
PRI1mod=wct1xxp
PRI4mod=wxt4xxp

PRI1cards=0
PRI4cards=0
ANAcards=0
	
IFS=$'\n'
	

function scan_analog_modules {

	if ${LSMOD} | grep ${ANArmmod} > /dev/null ; then
		echo "[ i] unloading module: ${ANArmmod}"
		eval "${RMMOD} ${ANArmmod}"
		unloaded="1"
	fi
	
	${DMESG} -c > /dev/null

	echo "[ i] loading module: ${ANAmod}"
	eval "${MODPROBE} ${ANAmod}"

	index=1
	for line in $(${DMESG} | sed -ne '/Module/{s/^Module [0123]: \(.*\)$/\1/p}'); do
		ANAmodules[${index}]=${line}
		let "index = ${index} + 1"
	done
	
	if [ "${unloaded}" == "" ]; then
		echo "[ i] unloading module: ${ANArmmod}"
		eval "${RMMOD} ${ANArmmod}"
	fi
}

function scan_cards {
	for line in $(${LSPCI} -n -d "e159:0001"); do
		busslot=$(echo ${line} | sed -e 's/[^:]*:\([^ ]*\).*/\1/')
		subid=$(${LSPCI} -nv -s "${busslot}" | sed -ne '/.*Subsystem: /{s/.*Subsystem: \(....\):.*/\1/;p}')
		case "${subid}" in
			a159|e159|b100|b1d9|b119|a9fd|a8fd|a800|a801|a908|a901)
				let "ANAcards = ${ANAcards} + 1"
			;;
			6159)
				let "PRI1cards = ${PRI1cards} + 1"
			;;
		esac
	done
	for line in $(${LSPCI} -n -d "10ee:0314"); do
		let "PRI4cards = ${PRI4cards} + 1"
	done
	for line in $(${LSPCI} -n -d "d161:*"); do
		devid=$(echo ${line} | sed -e 's/.*\(....\)$/\1/')
		case "${devid}" in
			0410|0405|0205|0210)
				let "PRI4cards = ${PRI4cards} + 1"
				;;
		esac
	done
}

function load_modules {
	
	scan_cards
	
	function load_module {
		if [ -z ${2} ]; then
			2=${1}
		fi
		if ${LSMOD} | grep ${2} > /dev/null; then
			echo "[ i] module already loaded: ${2}"
		else
			echo "[ i] loading module: ${1}"
			eval "${MODPROBE} ${1}"
		fi
	}

	if [ ${PRI1cards} -gt 0 ]; then
		load_module ${PRI1mod}
	fi
	if [ ${PRI4cards} -gt 0 ]; then
		load_module ${PRI4mod}
	fi
	if [ ${ANAcards} -gt 0 ]; then
		load_module ${ANAmod} ${ANArmmod}
	fi
}

function unload_modules {
	for mod in $(${LSMOD} | sed -ne '/Module/!{s/\([^ ]*\).*/\1/;p}');
	do
		case "${mod}" in
			${ANArmmod}|${PRI1mod}|${PRI4mod})
				echo "[ i] unloading module: ${mod}"
				eval "${RMMOD} ${mod}"
			;;
		esac
	done
}

case "$1" in
	
	start|--start)
		load_modules
		;;
	stop|--stop)
		unload_modules
		;;
	restart|--restart)
		unload_modules
		sleep 1
		load_modules
		;;
	scan|--scan)
		scan_cards
		echo "-------------"
		echo "[ i] scan results:"
		echo "     Analog (${ANAmod}) cards: ${ANAcards}"
		echo "     PRI 1-Port (${PRI1mod}) cards: ${PRI1cards}"
		echo "     PRI 4-Port (${PRI4mod}) cards: ${PRI4cards}"
		if [ ${ANAcards} -gt 0 ]; then
			echo ""		
			echo "[ i] To scan the modules on your analog"
			echo "     card(s), run \"${THISPATH} deepscan\"."
		fi
		;;
	deepscan|--deepscan)
		scan_cards
		if [ ${ANAcards} -gt 0 ]; then
			scan_analog_modules
		fi
		echo "-------------"
		echo "[ i] scan results:"
		echo "     Analog (${ANAmod}) cards: ${ANAcards}"
		index=1
		while [ ! -z ${ANAmodules[${index}]} ]; do
			echo "        Module ${index}: ${ANAmodules[${index}]}"
			let "index = ${index} + 1"
		done
		echo "     PRI 1-Port (${PRI1mod}) cards: ${PRI1cards}"
		echo "     PRI 4-Port (${PRI4mod}) cards: ${PRI4cards}"
		;;
	*)
		echo "usage: ${THISPATH} start|stop|restart|scan|deepscan|config|help"
		;;
esac
