#! /bin/sh

opendiva=0
diva_dir="/usr/share/eicon"
dialog="${diva_dir}/dialog"
diva_proc="/proc/net/eicon"
load_maint_drv="modprobe diva_mnt"
unload_maint_drv="rmmod diva_mnt"
log_dir="/var/log"
ditrace="/sbin/divactrl ditrace"
mlog="/sbin/divactrl mlog"
tmp="${diva_dir}/trace.tmp"
dlg="${diva_dir}/trace.dlg"
hlp="${diva_dir}/trace.hlp"
trc="/var/log/ditrace.bin"
help=""
hlp_base="${diva_dir}/help.txt"

if [ ! -f ${hlp_base} ]
then
	echo > ${hlp_base}
fi

exit_message="none"
unload_maint=0
backtitle="Diva Trace Assistant Copyright (c) by Eicon Networks 1993 - 2002"
trace_length=16
trace_pid=0

set_help_id()
{
	ident="$1"
	help=""

	sed -ne "/<$ident>/,/<$ident\/>/p" ${hlp_base} | sed -e "/<$ident>/d" -e "/<$ident\/>/d" - > ${hlp}
	if [ $(($?)) -eq 0 ]
	then
		if [ -s ${hlp} ]
		then
			help="--helptag ${hlp}"
		fi
	fi

}


clean_files()
{
  rm -f ${diva_dir}/trace.dlg ${diva_dir}/trace.tmp

  if [ $((unload_maint)) -eq 1 ]
  then
		${unload_maint_drv}
  fi
}

fatal_exit()
{
  $dialog --title "Trace configuration aborted" --backtitle "$backtitle" \
      --clear --msgbox "$exit_message" 5 70

  setterm -default
  setterm -clear

  clean_files

  exit 1
}

detect_trace_running()
{
	trace_pid=0
	running=$(pidof divactrl)

	for cur in ${running}
	do
		ls -l /proc/${cur}/fd | grep "/var/log/ditrace\.bin" > /dev/null 2>&1
		if [ $(($?)) -eq $((0)) ]
		then
			trace_pid=$((cur))
			break
		fi
	done
}

# -----------------------------------------------------
#   Look if trace daemon already running
# -----------------------------------------------------
detect_trace_running
if [ $((trace_pid)) -ne 0 ]
then
	compress_file=0
	unused_input=0
	msg=""
	msg="$msg\"S\" \"Stop trace daemon and compress trace file\" on "
	msg="$msg\"T\" \"Stop trace daemon\" off "
	msg="$msg\"X\" \"Exit without changes\" off "
	set_help_id trace_stop
	msg="$dialog ${help} \
							--title \"Trace daemon is already running\" --backtitle \"$backtitle\" \
							--clear --radiolist \"Terminate trace process ?\" 10 70 3 $msg"
	echo "$msg 2>${tmp}" > ${dlg}
	sh ${dlg}
	if [ $(($?)) -ne 0 ]
	then
		exit_message="Trace configuration aborted by user"
		fatal_exit
	fi
	msg=$(cat ${tmp})
	case "${msg}" in
		'S') compress_file=1
			;;
		'T') compress_file=0
			;;
		*) exit_message="Trace configuration aborted by user"
			 fatal_exit
			;;
	esac
	kill ${trace_pid} 2>&1
	if [ $(($?)) -ne 0 ]
	then
		exit_message="Can't stop trace daemon"
		fatal_exit
	fi
	if [ $((compress_file)) -eq 1 ]
	then
		rm -f ${trc}.gz
		rm -f ${trc}.bz2
		$dialog --backtitle "$backtitle" \
						--infobox "Compress trace file ..." 3 70
		bzip2 -9 ${trc} > /dev/null 2>&1
		if [ $(($?)) -eq 0 ]
		then
			trc="${trc}.bz2"
		else
			gzip -9 ${trc} dev/null 2>&1
			if [ $(($?)) -eq 0 ]
			then
				trc="${trc}.gz"
			fi
		fi
	fi
	sync
	${unload_maint_drv}

	echo "" > ${tmp}
	echo "Trace file: '${trc}'" >> ${tmp}
	echo "" >> ${tmp}
	echo "Please use 'divactrl ditrace -i ditrace.bin'" >> ${tmp}
	echo "to read/filter trace messages." >>  ${tmp}

	$dialog --title "Trace process complete" \
					--backtitle "$backtitle" \
					--clear --textbox ${tmp} 18 70
	setterm -default
	setterm -clear

	clean_files
	exit 0
fi

# -----------------------------------------------------
#   Proceed with driver start procedure
# -----------------------------------------------------
$dialog --backtitle "$backtitle" \
				--infobox "Load debug driver ..." 3 70

if [ ! -f ${diva_proc}/divadidd ]
then
	exit_message="Diva drivers not loaded"
	fatal_exit
fi

sync
maint_active=$(lsmod | grep "^diva_mnt" | wc -l)
if [ $maint_active -eq 0 ]
then
  ${load_maint_drv} > /dev/null 2>&1
  if [ $(($?)) -ne 0 ]
  then
		exit_message="Failed to load MAINT driver"
		fatal_exit
  fi
fi

# -----------------------------------------------------------------
#  NOW COUNT REGISTERED DEVICE DRIVERS
# -----------------------------------------------------------------
i=1
driver=1
capi_present=0
tty_present=0
adapter_present=0
DrvId[$((driver))]=-1

while [ $((i)) -lt 128 ]
do
if [ $((i)) -lt 10 ]
then
drv=$(${ditrace} -l | sed -ne "/ 0$((i)) - /p" - | sed -e "s/^.* - //" -e "s/ .*$//" -e "s/(.*$//" -)
else
drv=$(${ditrace} -l | sed -ne "/ $((i)) - /p" - | sed -e "s/^.* - //" -e "s/ .*$//" -e "s/(.*$//" -)
fi

if [ -z "$drv" ]
then
  i=$(($i+1))
  continue
fi

j=1
while [ $((j)) -lt 128 ]
do
  if [ "$drv" = "ADAPTER:$((j))" ]
  then
		adapter_present=1
		DrvId[$((driver))]=$((i))
		DrvADAPTER[$((driver))]=$((j))
		DrvNAME[$((driver))]=$(/sbin/divactrl load -c $((j)) -CardName)
		DrvSN[$((driver))]=$(/sbin/divactrl load -c $((j)) -SerialNumber)
		sn=${DrvSN[$((driver))]}
		name=${DrvNAME[$((driver))]}
		echo "${name}" > ${tmp}
		i=$(($i+1))
		drv=""
    grep -i 4b ${tmp} > /dev/null 2>&1
		if [ $(($?)) -eq 0 ]
		then
			DrvNAME[$((driver))]="${name} - PORT 1"
			DrvSN[$((driver))]="${sn}-0"
		  driver=$(($driver+1))
			k=1
			while [ $((k)) -lt 4 ]
			do
				DrvId[$((driver))]=$((i))
				DrvADAPTER[$((driver))]=$((j))
				DrvNAME[$((driver))]="${name} - PORT $(($k+1))"
				DrvSN[$((driver))]="${sn}-$(($k+1))"
		  	driver=$(($driver+1))
				k=$(($k+1))
				j=$(($j+1))
				i=$(($i+1))
			done
    else
		  driver=$(($driver+1))
		fi
		break
  fi
  j=$(($j+1))
done

if [ -z "$drv" ]
then
  continue
fi

# ---------------------------------
#  Now select drivers of interest
# ---------------------------------
case "$drv" in
	'CAPI20')
					DrvId[$((driver))]=$((i))
					DrvADAPTER[$((driver))]=0
					DrvNAME[$((driver))]="CAPI20"
					driver=$(($driver+1))
					capi_present=1
					;;
	'TTY')
					DrvId[$((driver))]=$((i))
					DrvADAPTER[$((driver))]=0
					DrvNAME[$((driver))]="TTY"
					driver=$(($driver+1))
					tty_present=1
					;;
	'DIVAS')
					DrvId[$((driver))]=$((i))
					DrvADAPTER[$((driver))]=0
					DrvNAME[$((driver))]="DIVAS"
					driver=$(($driver+1))
					tty_present=1
					;;
esac

i=$(($i+1))
done

DrvId[$((driver))]=-1

if [ $((driver)) -le 1 ]
then
	exit_message="Diva interface drivers not found"
	fatal_exit
fi

# ----------------------------------------------------------------
#   Trace mesk selection
# ----------------------------------------------------------------
set_trace_mask()
{
	drv_name="$1"
	drv_mask="$2"
	i=1

	while [ $((${DrvId[$((i))]})) -ne 0 ]
	do
		if [ "${DrvNAME[$((i))]}" = "$drv_name" ]
		then
			${ditrace} -d $((${DrvId[$((i))]})) -m $drv_mask > /dev/null 2>&1
			if [ $(($?)) -ne $((0)) ]
			then
				exit_message="Can't access MAINT driver"
				fatal_exit
			else
				return
			fi
		fi
		i=$(($i+1))
	done

}

set_adapters_mask()
{
	i=1
	drv_mask="$1"

	while [ $((${DrvId[$((i))]})) -gt 0 ]
	do
		if [ $((${DrvADAPTER[$((i))]})) -gt 0 ]
		then
			${ditrace} -d $((${DrvId[$((i))]})) -m $drv_mask > /dev/null 2>&1
		fi
		i=$(($i+1))
	done
}


# ----------------------------------------------------------------
#   Select Debug Profile
# ----------------------------------------------------------------
msg=""
i=1
msg="$msg\"s\" \"Standard trace level\" on "
msg="$msg\"S\" \"Standard trace level + B-channel\" off "
msg="$msg\"A\" \"Audio Tap (Fax, Modem)\" off "
i=$(($i+3))
if [ $((tty_present)) -eq 1 ]
then
msg="$msg\"t\" \"Diva TTY interface\" off "
msg="$msg\"T\" \"Diva TTY interface   + B-channel\" off "
msg="$msg\"Y\" \"Diva TTY interface,    detailed\" off "
i=$(($i+3))
fi
if [ $((capi_present)) -eq 1 ]
then
msg="$msg\"c\" \"CAPI2.0 interface\" off "
msg="$msg\"C\" \"CAPI2.0 interface    + B-channel\" off "
msg="$msg\"D\" \"CAPI2.0 interface    + data\" off "
msg="$msg\"F\" \"CAPI2.0 interface,     detailed\" off "
i=$(($i+3))
fi

#
# msg="$msg\"X\" \"Custom trace level\" off "
#
set_help_id trace_profile
msg="$dialog ${help} \
					 --title \"Please select trace profile\" --backtitle \"$backtitle\" \
					 --clear --radiolist \"Avaliable trace profiles\" $(($i+7)) 70 $((i)) $msg"
echo "$msg 2>${tmp}" > ${dlg}
sh ${dlg}
if [ $(($?)) -ne 0 ]
then
	exit_message="Trace configuration aborted by user"
	fatal_exit
fi
trace_profile=$(cat $tmp)

case "$trace_profile" in
	's')
			set_trace_mask "TTY"    "0x19f"
			set_trace_mask "CAPI20" "0x2197"
			set_trace_mask "DIVAS"  "0x197"
			set_adapters_mask       "0x1ff"
		;;
  'S')
			set_trace_mask "TTY"    "0x19f"
			set_trace_mask "CAPI20" "0x2197"
			set_trace_mask "DIVAS"  "0x197"
			set_adapters_mask       "0x3ff"
    ;;
	't')
			set_trace_mask "TTY"    "0x19f"
			set_trace_mask "CAPI20" "0x00"
			set_trace_mask "DIVAS"  "0x197"
			set_adapters_mask "0x1ff"
		;;
	'T')
			set_trace_mask "TTY"    "0x19f"
			set_trace_mask "CAPI20" "0x00"
			set_trace_mask "DIVAS"  "0x197"
			set_adapters_mask "0x3ff"
		;;
	'Y')
			set_trace_mask "TTY"    "0x19f"
			set_trace_mask "CAPI20" "0x00"
			set_trace_mask "DIVAS"  "0x8019f"
			set_adapters_mask "0x3ff"
		;;
	'c')
			set_trace_mask "TTY"    "0x00"
			set_trace_mask "CAPI20" "0x2197"
			set_trace_mask "DIVAS"  "0x197"
			set_adapters_mask "0x1ff"
		;;
	'C')
			set_trace_mask "TTY"    "0x00"
			set_trace_mask "CAPI20" "0x219f"
			set_trace_mask "DIVAS"  "0x197"
			set_adapters_mask "0x3ff"
		;;
	'D')
			set_trace_mask "TTY"    "0x00"
			set_trace_mask "CAPI20" "0x7fffffff"
			set_trace_mask "DIVAS"  "0x197"
			set_adapters_mask "0x3ff"
		;;
	'F')
			set_trace_mask "TTY"    "0x00"
			set_trace_mask "CAPI20" "0x7fffffff"
			set_trace_mask "DIVAS"  "0x8019f"
			set_adapters_mask "0x3ff"
		;;
	'A')
			set_trace_mask "TTY"    "0x00"
			set_trace_mask "CAPI20" "0x00"
			set_trace_mask "DIVAS"  "0x00"
			set_adapters_mask "0x7ff"
		;;
	*)
		;;
esac


# ------------------------------------
#  Select ring buffer length
# ------------------------------------
len1=0
while [ $((len1)) -eq  0 ]
do
	$dialog --clear --title "Please enter trace ring buffer size in megabytes" \
		  --backtitle "$backtitle" \
		  --inputbox "Suggested value: 16" 8 70 ${trace_length} 2>${tmp}
	if [ $(($?)) -ne 0 ]
	then
		exit_message="Trace configuration aborted by user"
		fatal_exit
	fi
	len1=$(cat ${tmp})
	if [ $((len1)) -lt 4 ]
	then
		len1=0
	fi
	if [ $((len1)) -gt 500 ]
	then
		len1=500
	fi
done
trace_length=$((len1))

# -------------------------------------
#  Start Trace Utility
# -------------------------------------
rm -f ${trc}
if [ -f ${trc} ]
then
	exit_message="Can't create trace log file '${trc}'"
	fatal_exit
fi
${ditrace} -w $(($trace_length*1024)) -File ${trc} -p -Silent > /dev/null 2>&1 &
if [ $(($?)) -ne 0 ]
then
	exit_message="Failed to start trace daemon"
	fatal_exit
fi

$dialog --backtitle "$backtitle" \
				--infobox "Start trace daemon ..." 3 70

detect_trace_running
if [ $((trace_pid)) -eq 0 ]
then
	exit_message="Failed to start trace daemon"
	fatal_exit
fi

echo "Trace file      : '${trc}'" >> ${tmp}
echo "Trace daemon pid: '$((trace_pid))'" >> ${tmp}
echo "" >> ${tmp}
echo "Please use 'Trace' to stop trace process." >>  ${tmp}

$dialog --title "Trace process activated" \
				--backtitle "$backtitle" \
				--clear --textbox ${tmp} 18 70
setterm -default
setterm -clear

clean_files
exit 0

