#!/bin/sh
#(c) Copyright Barry Kauler Nov. 2010. License: GPL v3 /usr/share/doc/legal.
#called from /lib/udev/usb_modeswitch, which in turn is called by udev rule when a 3G modem inserted.
#101208 rewrite, simpler.
#101209 switch has occurred, but sometimes (my ZTE K3571-Z modem) usbserial.ko fails to attach to usb interface.

#all of the uevent env. variables are visible here. ex (my Optus 3G modem):
#ACTION=add
#DEVICE=/proc/bus/usb/001/005
#DEVPATH=/devices/pci0000:00/0000:00:1d.7/usb1/1-2/1-2:1.5
#DEVTYPE=usb_interface
#MODALIAS=usb:v12D1p140Cd0000dc00dsc00dp00ic08isc06ip50
#PRODUCT=12d1/140c/0
#SEQNUM=1332
#SUBSYSTEM=usb
# 06.03.11 rodin.s i18n

export TEXTDOMAIN=pupdial
export TEXTDOMAINDIR=/usr/share/locale
export OUTPUT_CHARSET=UTF-8
eval_gettext () {
  local myMESSAGE=$(gettext "$1")
  eval echo \"$myMESSAGE\"
}
export LANGORG=$LANG

rm -f /tmp/usb_modeswitch_status_flag_success 2>/dev/null

DISPLAY=":0" yaf-splash -placement center -close never -bg yellow -fontsize large -text "$(gettext '3G USB modem inserted, please wait, configuring...')" &
yPID=$!

BRKCNT=0
while [ $BRKCNT -lt 30 ];do
 sleep 1
 LOGS="`cat /var/log/usb_modeswitch_*`"
 [ "`echo "$LOGS" | grep 'Mode switch succeeded'`" ] && break
 BRKCNT=$(($BRKCNT+1))
done

if [ $BRKCNT -lt 30 ];then
 #101209 switch has occurred, but sometimes (my ZTE K3571-Z modem) usbserial.ko fails to attach to usb interface...
 sleep 2
 if [ "`lsmod | grep '^usbserial '`" != "" ];then
  if ! ls /dev/ttyUSB* 2>/dev/null;then
   sleep 2
   if ! ls /dev/ttyUSB* 2>/dev/null;then
    VENDOR="`echo -n "$PRODUCT" | cut -f 1 -d '/'`"
    #101210 keep this simple, only one usb modem plugged in, claiming usbserial.ko...
    modREGEX="v${VENDOR}p[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]"
    CHIPNO="`cat /sys/bus/usb/devices/*/modalias | grep -i -o "$modREGEX" | cut -f 2 -d 'p' | tail -n 1`"
    UPMOD="`lsmod | grep '^usbserial ' | tr -s ' ' | cut -f 4 -d ' ' | cut -f 1 -d ','`"
    if [ -e /sys/bus/usb-serial/drivers/${UPMOD}1/new_id ];then
     echo "$VENDOR $CHIPNO" > /sys/bus/usb-serial/drivers/${UPMOD}1/new_id
     sleep 2
    fi
    if ! ls /dev/ttyUSB* 2>/dev/null;then
     rmmod $UPMOD
     rmmod usbserial
     modprobe usbserial vendor=0x${VENDOR} product=0x${CHIPNO}
     modprobe $UPMOD
    fi
   fi
  fi
 fi
 kill $yPID
 DISPLAY=":0" yaf-splash -placement center -close never -timeout 12 -bg green -fontsize large -text "$(gettext '3G USB modem now ready for use')" &
 touch /tmp/usb_modeswitch_status_flag_success
else
 #do not display an error msg. in case no modeswitch was required?
 echo
fi

mkdir /tmp/usb_modeswitch${$}
mv -f /var/log/usb_modeswitch_* /tmp/usb_modeswitch${$}/
sleep 50 #just in case /lib/udev/usb_modeswitch tries to rerun this script.
kill $yPID
###END###
