#!/bin/sh

# Author : wwp <subscript@free.fr>
# Creation : 2002/10/16
# Goal : find modem's VIDs and PIDs
# License: GPL

version()
{
	echo "$VERSION"
	exit 0
}

commandlinehelp()
{
	echo "usage:"
	echo "          $BASE [<switch>..]"
	echo "switches:"
	echo "          --dry-run              test mode (only perform neutral operations)"
	echo "          --version or -v        show version number then exit"
	echo "          --help or -h           show this help then exit"
#	echo "          --smart                use smart mode: only show uninitialized devices"
##	echo "          --auto                 device auto selection"
	exit $1
}

display_device()
{
	test -n "$PRODUCT" && echo -n " $PRODUCT" || echo -n " ?"
	test -n "$MANUFACTURER" && echo -n "$MANUFACTURER"
	test -n "$ID" && echo " ($ID)" || echo " (?$SEP?)"
	test -n "$ID_TABLE" && ID_TABLE="$ID_TABLE|$ID" || ID_TABLE="$ID"
	test -n "$PRODUCT_TABLE" && PRODUCT_TABLE="$PRODUCT_TABLE|$PRODUCT" || PRODUCT_TABLE="$PRODUCT"
	test -n "$MANUFACTURER_TABLE" && MANUFACTURER_TABLE="$MANUFACTURER_TABLE|$MANUFACTURER" || MANUFACTURER_TABLE="$MANUFACTURER"
}

list_devices()
{
	CNT=0
	ID_TABLE=""
	PRODUCT_TABLE=""
	MANUFACTURER_TABLE=""
	local ID=""
	local PRODUCT=""
	local MANUFACTURER=""
	while read LINE
	do
		case "$(expr substr "$LINE" 1 2)"
		"T:")	
				test $CNT -ne 0 && display_device
				CNT=$((CNT + 1))
				echo -n "$CNT: "
				ID=""
				PRODUCT=""
				MANUFACTURER=""
				;;
		"P:")	
				if [ -z "$ID" ]
				then
					ID=$(echo "$LINE" | grep -i "prodid=" | awk '{print $2,$3}')
					if [ $? -eq 0 -a -n "$ID" ]
					then
						ID=$(echo "$ID" | tr -s ' ' '=' | cut -d '=' -f 2,4 | tr -s '=' $SEP)
					fi
				fi
				;;
		"S:")	
				if [ -z "$PRODUCT" ]
				then
					PRODUCT=$(echo "$LINE" | grep -i "product=" | cut -d '=' -f 2-)
				fi
				if [ -z "$MANUFACTURER" ]
				then
					MANUFACTURER=$(echo "$LINE" | grep -i "manufacturer=" | cut -d '=' -f 2-)
					if [ $? -eq 0 -a -n "$MANUFACTURER" ]
					then
						MANUFACTURER=" / $MANUFACTURER"
					fi
				fi
				;;
		esac
	done < $DEVICES
	test $CNT -ne 0 && display_device
	if [ $CNT -lt 1 ]
	then
		echo "no USB device found!"
		exit 1
	fi
}

get_ID()
{
	OLDIFS=$IFS
	IFS="|"
	CNT=0
	ID=""
	for LINE in $ID_TABLE
	do
		CNT=$((CNT + 1))
		if [ $CNT -eq $DEVNUM ]
		then
			test -n "$LINE" && ID="$LINE"
			break
		fi
	done
	IFS=$OLDIFS
}

get_product()
{
	OLDIFS=$IFS
	IFS="|"
	CNT=0
	PRODUCT="?"
	for LINE in $PRODUCT_TABLE
	do
		CNT=$((CNT + 1))
		if [ $CNT -eq $DEVNUM ]
		then
			test -n "$LINE" && PRODUCT="$LINE"
			break
		fi
	done
	IFS=$OLDIFS
}

get_manufacturer()
{
	OLDIFS=$IFS
	IFS="|"
	CNT=0
	MANUFACTURER=""
	for LINE in $MANUFACTURER_TABLE
	do
		CNT=$((CNT + 1))
		if [ $CNT -eq $DEVNUM ]
		then
			test -n "$LINE" && MANUFACTURER="$LINE"
			break
		fi
	done
	IFS=$OLDIFS
}

# <CONFIG>
BIN_DIR="/usr/local/bin"
ETC_DIR="/etc"
CONF_DIR="/etc/eciadsl"
PPPD_DIR="/etc/ppp"
VERSION=""
# </CONFIG>

BASE=${0##*/}
VID1_TABLE=""
VID2_TABLE=""
PID1_TABLE=""
PID2_TABLE=""
VID1="????"
PID1="????"
VID2="????"
PID2="????"

DEVICES=/proc/bus/usb/devices
SEP=":"
TESTONLY=0
RET=0
CNT=
#SMART=0
#AUTO=0

while [ -n "$1" ]
do
	case "$1" in
		"--dry-run")		TESTONLY=1;;
#		"--smart")			SMART=1;;
#		"--auto")			AUTO=1;;
		"--version"|"-v")	version;;
		"--help"|"-h")		commandlinehelp 0;;
		*)					echo "unrecognized switch $1"
							commandlinehelp 1
							;;
	esac
	shift
done

[ -n "$UID" ] || UID="$(id -ru)"
if [ $UID -ne 0 ]; then
then
	echo
	echo "you must be root to run this script!"
	exit 1
fi

# disclaimer
echo
echo "WARNING: before probing, please ensure that your USB devices are plugged in"
echo "and that your system's USB support is properly configured"
echo
echo "USB modem to probe must be UNinitialized, it will surely appear as an unknown"
echo "device (because it is not initialized yet), for instance: ? (0547:2131)"

FIRMWARE_OPTIONS=""
echo
if [ -f "$CONF_DIR/eciadsl.conf" ]; then
	FIRMWARE=`grep -E "^[ \t]*FIRMWARE[ \t]*=" "$CONF_DIR/eciadsl.conf" | tail -n 1 | cut -f 2 -d '=' | tr -s "\t" " "`
	FIRMWARE_OPTIONS=`grep -E "^[ \t]*FIRMWARE_OPTIONS[ \t]*=" "$CONF_DIR/eciadsl.conf" | tail -n 1 | cut -f 2 -d '=' | tr -s "\t" " "`
	echo "config read from $CONF_DIR/eciadsl.conf"
else
	echo "default config assumed"
fi
test -z "$FIRMWARE" && FIRMWARE=$CONF_DIR/firmware00.bin

if [ ! -f "$DEVICES" ]
then
	echo
	echo "USB devices file not found!"
	exit 1
fi

# list USB devices
echo
echo "your USB devices:"
list_devices

# prompt for a device number
echo
echo -n "enter device to probe (1-$CNT): "
read DEVNUM
while [ $DEVNUM -lt 1 -o $DEVNUM -gt $CNT ]
do
	echo "incorrect value"
	echo
	echo -n "enter device to probe (1-$LINES): "
	read DEVNUM
done

# get device info from table
get_ID
get_product
get_manufacturer

# get VID1/PID1
if [ ${#ID} -eq 9 -a "${ID#????$SEP}" != "$ID" ]
then
	VID2="$(expr substr 1 4)"
	PID2="$(expr substr 6 4)"
else
	echo
	echo "cannot determine VID1/PID1 for device $PRODUCT$MANUFACTURER ($ID)"
	exit 1
fi

type $BIN_DIR/eciadsl-firmware > /dev/null 2>&1
if [ $? -ne 0 ]
then
	echo
	echo "cannot find $BIN_DIR/eciadsl-firmware in \$PATH, test mode assumed"
	RET=$((RET + 1))
#	TESTONLY=1
fi

if [ $TESTONLY -eq 0 ]
then
	echo
	echo "probing, please wait.."
	$BIN_DIR/eciadsl-firmware $FIRMWARE_OPTIONS 0x$VID1 0x$PID1 0xDEAD 0xFACE $FIRMWARE > /dev/null 2>&1

	# list USB devices
	echo
	echo "your USB devices now:"
	list_devices

	# get device info from table
	get_ID
	get_product
	get_manufacturer

	if [ ${#ID} -eq 9 -a "${ID#????$SEP}" != "$ID" ]
	then
		VID2="$(expr substr 1 4)"
		PID2="$(expr substr 6 4)"
	else
		echo
		echo "cannot determine VID2/PID2 for device $PRODUCT$MANUFACTURER ($ID)"
		RET=$((RET + 1))
	fi
fi

# display results
echo
echo "probed USB device: $PRODUCT$MANUFACTURER"
echo "VID1=$VID1, PID1=$PID1"
echo "VID2=$VID2, PID2=$PID2"
if [ "$VID1" = "$VID2" -a "$PID1" = "$PID2" ]
then
	echo "Did you really unplug/replug your modem before launching this script?"
	RET=$((RET + 1))
fi

exit $RET
