pupdial_init_hotpluggable 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. #!/bin/sh
  2. #(c) Copyright Barry Kauler Dec. 2010. License GPL v3 /usr/share/doc/legal.
  3. #called from pupdial. Based upon earlier scripts by Richard Erwin.
  4. #there were scripts in /etc/init.d created by Richard, now moved to here.
  5. #101205 use modem-stats to eliminate non-responsive ttyUSB ports.
  6. #101206 wait. remember previous modem.
  7. #101207 if usb-modeswitch has already set /dev/gsmmodem, use it.
  8. #101207 modem plugged in at bootup, may not trigger usb-modeswitch, replay uevents.
  9. #101210, 101211 tweaks.
  10. #110302 wasn't getting the right uevents for my 3g modem, use 'udevadm trigger'.
  11. #120202 internationalized.
  12. #120908 rerwin: Removed Dgcmodem logic, already handled by Cdcacm section; moved Hso section to eliminate need for flag to maintain priority (used in init scripts to override execution sequence by script name). Code moved, shifted or deleted, but not otherwise changed, except for "probe order" variables.
  13. export TEXTDOMAIN=pupdial_init_hotpluggable
  14. export OUTPUT_CHARSET=UTF-8
  15. #hso.ko: this site http://www.pharscape.org/hso.html states that the hso driver is in kernel
  16. #2.6.27. Yes, it is in kernel/drivers/net/usb/hso.ko. It is also in the 2.6.30.* kernel.
  17. #however it is missing from 2.6.31 and later kernels...
  18. #oh, i see why. I have configured 2.6.31 and later with 'rfkill' turned off, which
  19. #hso requires: in kernel source drivers/net/usb/Kconfig:
  20. #config USB_HSO
  21. # tristate "Option USB High Speed Mobile Devices"
  22. # depends on USB && RFKILL
  23. #101210 ...I was able to compile it separately, have put it in zzz pkg, for testing.
  24. #110302 2.6.32.28 kernel has rfkill and hso enabled. no longer using zzz pkg.
  25. #101206
  26. prevMODEM=''
  27. if [ -h /dev/modem ];then #maybe set by internal modem detected at bootup, or previous run of pupdial this session.
  28. prevMODEM="`readlink /dev/modem | sed -e 's%/dev/%%'`"
  29. rm -f /dev/modem
  30. fi
  31. chat_with_func() { #device passed in, ex: ttyUSB0
  32. rm -f /tmp/pupdial_port_test 2> /dev/null
  33. #TODO maybe send +++ to return modem to command-mode.
  34. #hangs if modem unplugged or turned off (contrary to what docs say)...
  35. modem-stats -c "ATZ" $1 > /tmp/pupdial_port_test &
  36. sleep 5 #v413
  37. killall modem-stats
  38. if [ -e /tmp/pupdial_port_test ];then
  39. if [ -s /tmp/pupdial_port_test ];then #nonzero size.
  40. grep "^OK" /tmp/pupdial_port_test > /dev/null 2>&1
  41. [ $? -eq 0 ] && return 0 #success
  42. fi
  43. fi
  44. return 1
  45. }
  46. MODEM=''
  47. hPID=0 #101211 do not display msg on 2nd entry...
  48. if [ ! $1 ];then
  49. /usr/lib/gtkdialog/box_splash -placement center -close never -fontsize large -text "$(gettext 'Please wait, probing for hotpluggable (external) modems...')" &
  50. hPID=$!
  51. fi
  52. #101206 wait...
  53. BRKCNT=0
  54. while [ $BRKCNT -lt 40 ];do #101211 bump 30 to 40.
  55. OK=0
  56. [ "`ls -1 /pinstall.*.sh 2>/dev/null`" = "" ] && [ "`pidof usb_modeswitch`" = "" ] && [ "`pidof usb_modeswitch_status`" = "" ] && OK=$(($OK+1))
  57. sleep 1
  58. [ "`ls -1 /pinstall.*.sh 2>/dev/null`" = "" ] && [ "`pidof usb_modeswitch`" = "" ] && [ "`pidof usb_modeswitch_status`" = "" ] && OK=$(($OK+1))
  59. [ -f /tmp/usb_modeswitch_status_flag_success ] && OK=2 #see usb_modeswitch_status.
  60. [ $OK -eq 2 ] && break
  61. BRKCNT=$(($BRKCNT+1))
  62. done
  63. #101207 if usb-modeswitch has already set this, use it...
  64. if [ -h /dev/gsmmodem ];then
  65. gMODEM="`readlink /dev/gsmmodem`"
  66. if [ -e /dev/${gMODEM} ];then
  67. ln -snf $gMODEM /dev/modem
  68. [ $hPID -ne 0 ] && kill $hPID
  69. exit
  70. else
  71. rm -f /dev/gsmmodem
  72. fi
  73. fi
  74. #101206 has anything changed?...
  75. prevUSBIDS=''
  76. USBIDS="`lsusb 2>/dev/null | tr -s ' ' | cut -f 6 -d ' ' | sort -u | tr '\n' ' '`"
  77. [ -f /var/local/pupdial/usbids ] && prevUSBIDS="`cat /var/local/pupdial/usbids`"
  78. echo -n "$USBIDS" > /var/local/pupdial/usbids
  79. #hso.ko not always present... well check them all...
  80. USBSERIAL='' ; CDC_ACM='' ; HSO='' ; NOZOMI='' ; IPWIRELESS='' #120908
  81. if modinfo usbserial >/dev/null 2>&1 ;then USBSERIAL=usbserial ;fi
  82. if modinfo cdc_acm >/dev/null 2>&1 ;then CDC_ACM=cdc_cm ;fi
  83. if modinfo hso >/dev/null 2>&1 ;then HSO=hso ;fi
  84. if modinfo nozomi >/dev/null 2>&1 ;then NOZOMI=nozomi ;fi
  85. if modinfo ipwireless >/dev/null 2>&1 ;then IPWIRELESS=ipwireless ;fi
  86. USBMODEMS="$HSO $USBSERIAL $CDC_ACM" #120908...
  87. PCMCIAMODEMS="$IPWIRELESS $NOZOMI"
  88. #listed in order that we should probe... $HSO $USBSERIAL $CDC_ACM $IPWIRELESS $NOZOMI
  89. #####Hso#####
  90. if [ "$HSO" ];then
  91. MODEM=''
  92. [ -h /dev/modem ] && MODEM="`readlink /dev/modem | grep -v '^ttyHS[0-9]$'`"
  93. if [ "$MODEM" = "" ];then #If a different modem selected, quit.
  94. if lsmod | grep '^hso ' >/dev/null ;then
  95. WAITCNT=0 ; WAITMAX=10
  96. until [ "$MODEM" != "" ];do
  97. MODEM="`grep -l -s 'Modem' /sys/class/tty/ttyHS[0-9][0-9]*/hsotype | head -n 1 | cut -f 5 -d /`"
  98. if [ "$MODEM" = "" ];then
  99. WAITCNT=`expr $WAITCNT + 1`
  100. [ $WAITCNT -gt $WAITMAX ] && break
  101. sleep 1
  102. fi
  103. done
  104. if [ $WAITCNT -le $WAITMAX ];then
  105. #Even if /dev/modem already set, ensure it matches detected modem.
  106. [ -h /dev/modem ] && rm /dev/modem
  107. ln -snf $MODEM /dev/modem
  108. [ -h /dev/ttyS_HS ] && rm /dev/ttyS_HS
  109. ln -snf $MODEM /dev/ttyS_HS #for pupdial probe
  110. fi
  111. fi
  112. fi
  113. fi
  114. #####Allusbserial#####
  115. if [ "$USBSERIAL" ];then
  116. if [ ! -h /dev/modem ];then #If a different modem selected, quit.
  117. if lsmod | grep '^usbserial ' >/dev/null ;then
  118. #Select interrupt-type device - first one or one identified in log as modem.
  119. INTERRUPTLIST="`grep -H -s 'Interrupt' /sys/bus/usb/devices/*-*:*.*/ep_??/type | cut -f 1-6 -d /`"
  120. DEVLISTUSB="`ls -1 -d /sys/bus/usb/devices/*-*:*.*/tty????* 2>/dev/null | sed 's/ /\n/g' | grep -F "$INTERRUPTLIST" | cut -f 7 -d / | sed 's/\(tty...\)\([0-9]$\)/\10\2/' | sort | sed 's/\(tty...\)\(0\)/\1/'`"
  121. DEVMLIST="`grep -s 'converter now attached' /var/log/messages | grep ' modem ' | grep -o 'ttyUSB[0-9][0-9]*' | sort -u`"
  122. if [ "$DEVLISTUSB" != "" ] && [ "$DEVMLIST" != "" ];then
  123. MODEMS="`echo "$DEVLISTUSB" | grep -F "$DEVMLIST"`"
  124. else
  125. MODEMS="$DEVMLIST"
  126. fi
  127. if [ "$MODEMS" != "" ];then #101205
  128. #101206 avoid unecessary modem probing...
  129. prevUSBMODEM=''
  130. [ -f /var/local/pupdial/usb_modem_port ] && prevUSBMODEM="`cat /var/local/pupdial/usb_modem_port`"
  131. [ "$USBIDS" = "$prevUSBIDS" ] && [ "$prevUSBMODEM" ] && [ "`echo "$MODEMS" | grep "$prevUSBMODEM"`" != "" ] && ln -snf $prevUSBMODEM /dev/modem
  132. if [ ! -h /dev/modem ];then
  133. for MODEM in $MODEMS
  134. do
  135. chat_with_func /dev/${MODEM}
  136. [ $? -eq 0 ] && break
  137. MODEM=''
  138. done
  139. if [ "$MODEM" != "" ];then
  140. ln -snf $MODEM /dev/modem
  141. echo -n "$MODEM" > /var/local/pupdial/usb_modem_port
  142. fi
  143. fi
  144. fi
  145. fi
  146. fi
  147. fi
  148. #####Cdcacm/Dgcmodem#####
  149. if [ "$CDC_ACM" ];then
  150. if [ ! -h /dev/modem ];then #If a different modem selected, quit.
  151. if lsmod | grep '^cdc_acm ' >/dev/null ;then
  152. #Select interrupt-type device - first one or one identified in log as modem.
  153. INTERRUPTLIST="`grep -H -s 'Interrupt' /sys/bus/usb/devices/*-*:*.*/ep_??/type | cut -f 1-6 -d /`"
  154. DEVLISTACM="`ls -1 -d /sys/bus/usb/devices/*-*:*.*/tty/tty????* 2>/dev/null | sed 's/ /\n/g' | grep -F "$INTERRUPTLIST" | cut -f 8 -d / | sed 's/\(tty...\)\([0-9]$\)/\10\2/' | sort | sed 's/\(tty...\)\(0\)/\1/'`"
  155. DEVMLIST="`grep -s ': USB ACM device$' /var/log/messages | grep -o 'ttyACM[0-9][0-9]*' | sort -u`"
  156. if [ "$DEVLISTACM" != "" ] && [ "$DEVMLIST" != "" ];then
  157. MODEM="`echo "$DEVLISTACM" | grep -F "$DEVMLIST" | head -n 1`"
  158. else
  159. MODEM="`echo "$DEVMLIST" | head -n 1`"
  160. fi
  161. if [ "$MODEM" != "" ];then
  162. [ ! -e /dev/$MODEM ] && [ -e /dev/input/$MODEM ] && ln -snf input/$MODEM /dev/$MODEM #device name for pupdial
  163. ln -snf $MODEM /dev/modem
  164. fi
  165. fi
  166. fi
  167. fi #120908 end
  168. #####Ipwireless#####
  169. if [ "$IPWIRELESS" ];then
  170. if [ ! -h /dev/modem ];then #If a different modem selected, quit.
  171. if lsmod | grep '^ipwireless ' >/dev/null ;then
  172. ln -snf ttyIPWp0 ttyS_ttyIPWp0
  173. ln -snf ttyS_IPWp0 /dev/modem
  174. fi
  175. fi
  176. fi
  177. #####Nozomi#####
  178. if [ "$NOZOMI" ];then
  179. if [ ! -h /dev/modem ];then #If a different modem selected, quit.
  180. if lsmod | grep '^nozomi ' >/dev/null ;then
  181. ln -snf noz0 /dev/modem
  182. ln -snf noz0 /dev/ttyS_NOZ0 #for pupdial probe
  183. fi
  184. fi
  185. fi
  186. #110302 have modified /etc/rc.d/rc.sysinit so this section probably not needed...
  187. #101207 modem plugged in at bootup, may not trigger usb-modeswitch, replay uevents...
  188. if [ ! $1 ];then #101211 gets reentered, see below.
  189. if [ ! -h /dev/modem ];then
  190. [ -e /sys/bus/pcmcia/devices ] && NEWPCMCIA="`ls /sys/bus/pcmcia/devices/*/uevent 2>/dev/null | tr '\n' ' '`"
  191. #110302 usb done differently below...
  192. for ONEUEVENT in ${NEWPCMCIA}${NEWUSB}
  193. do
  194. ONEPATH="`dirname $ONEUEVENT`"
  195. #the check for 'modalias' file is maybe needed for old kernel?...
  196. [ ! -e ${ONEPATH}/modalias ] && [ "`grep 'MODALIAS' $ONEUEVENT`" = "" ] && continue
  197. echo add > $ONEUEVENT
  198. sleep 0.1
  199. done
  200. #110302 wasn't getting the right uevents for my 3g modem...
  201. udevadm trigger --action=add --subsystem-match=usb
  202. sleep 2 #4 #101211 give plenty of time for usb-modeswitch to start.
  203. kill $hPID #101211
  204. /usr/sbin/pupdial_init_hotpluggable 2
  205. else
  206. kill $hPID
  207. fi
  208. fi
  209. ###END###