#!/bin/sh
#Barry Kauler GPL 2007.
#called from pupdial.
#v405 july 2008: total overhaul.
#v465 rerwin: v413 added module names for wireless modems
#v477 rerwin: v413 handle both lspci formats (replacing v003).
#v477 rerwin: v413 added more module names for wireless modems
#101202 bk: choose erase, remove /var/local/pupdial/hotpluggable (see pupdial).
#101203 wvdialconf will ignore many devs that are not /dev/ttyS*, for example /dev/ttyAGS3 (agrmodem).
#101206 changes to pupdial_init_hotpluggable.
#110106 add gettext rodin.s
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

MODEMDEV=""
if [ -h /dev/modem ];then
 MODEMDEV="`readlink /dev/modem`"
 MSGMDM3="
$(gettext 'PORT: /dev/modem is currently linked to port') ${MODEMDEV}."
fi

#find all loaded modem modules...
KERNVER=`uname -r` #v433
ALSAMODEMINFO="`cat /proc/asound/pcm 2>/dev/null | grep ' Modem :'`"
USBSERIALMODS="" #v433
lsmod | grep -q '^usbserial ' \
 && USBSERIALMODS=" `grep -w 'usbserial.ko' /lib/modules/$KERNVER/modules.dep | grep -o '^[^:]*' | rev | cut -f 1 -d / | rev | sed -e 's/\.ko$//' -e 's/^/\|\^/' | tr '\n' ' '`" #v433
MODEMMODS="`lsmod | grep -E "^agrmodem |^cdc_acm |^esscom |^Intel536 |^[iI]ntel537 |^intel537[ES][AP] |^ltmodem |^martian_dev |^mwave |^pctel |^slamr |^slusb |^snd_via82xx_modem |^snd_atiixp_modem |^snd_intel8x0m |^snd_hda_intel |^dgcusbdcp |^hso |^ipwireless |^nozomi |^hcfpcihw |^hsfcadmus2 |^hsfcadmus2smart |^hsfmc97ali |^hsfmc97ati |^hsfmc97ich |^hsfmc97sis |^hsfmc97via |^hsfpcibasic2 |^hsfpcibasic2bry |^hsfpcibasic2hsfi |^hsfpcibasic2smart |^hsfpcibasic3 |^hsfusbcd2 |^rfcomm$USBSERIALMODS" | cut -f 1 -d ' '`" #v413 v416 v432 v433
[ "$ALSAMODEMINFO" = "" ] && MODEMMODS="`echo "$MODEMMODS" | grep -v '^snd_'`"
SNDMOD="`echo "$MODEMMODS" | grep '^snd_' | head -n 1`"
#v413 For usbserial, reject it unless force-loaded with vendor ID (for usb modems).
[ "`grep '^ADDLIST=' /etc/rc.d/MODULESCONFIG | grep ' usbserial:vendor='`" = "" ] && MODEMMODS="`echo "$MODEMMODS" | grep -v '^usbserial$'`" #v413
MODEMMODS="`echo "$MODEMMODS" | sort | tr '\n' ' '`"
MMCNT=`echo "$MODEMMODS" | wc -w`

MSGMDM2=""
#if [ "$SNDMOD" != "" ];then
# MSGMDM2="
#Note that ${SNDMOD} is an ALSA sound driver but it also supports an on-board modem (port ttySL0)."
#fi

case $MMCNT in
 0)
#v412 Check for any driver of a modem that is not detected automatically.
#v433 This check is no longer valid, since any such modem is now supported through the udev rules file /etc/udev/rules.d/60-dialup-modem.rules and, thus, will have its driver loaded. Logic removed.
 MSGMDM1="$(gettext 'Well, Puppy did not detect anything at bootup, so if the modem was turned-on then it probably is not supported by any of the drivers in Puppy. Tough, you need to get another modem -- an old serial modem is best. There are some USB modems that work well.')"
 ;;
 1)
  MSGMDM1="$(gettext 'Puppy did detect a modem at bootup, and loaded this driver:')
${MODEMMODS}${MSGMDM2}${MSGMDM3}"
 ;;
 *)
  MSGMDM1="$(gettext 'Puppy detected more than one modem at bootup and and loaded these drivers:')
${MODEMMODS}${MSGMDM2}${MSGMDM3}"
 ;;
esac



export MAINDIALOG="
<window title=\"$(gettext 'PupDial modem selection')\" icon-name=\"gtk-connect\">
 <vbox>

  <frame $(gettext 'Automatic probing')>
   <hbox>
    <text  use-markup=\"true\"><label>\"<b>`gettext \"Click this button to use the 'wvdialconf' program to automatically probe and setup a modem for use by PupDial. If successful will create or update /etc/wvdial.conf and will set /dev/modem as a link to the correct modem port:\"`</b>\"</label></text>
    <button>
     <label>$(gettext 'PROBE')</label>
     <action type=\"exit\">SETUP</action>
    </button>
   </hbox>
  </frame>
  
  <frame $(gettext 'Automatic detection')>
   <hbox>
    <text><label>\"$(gettext 'Most modems are autodetected by Puppy at bootup, but it has to be turned on! (or plugged in).') ${MSGMDM1}\"</label></text>
    
    <vbox>
    <button>
     <label>$(gettext 'HELP')</label>
     <action>/usr/sbin/modemprobe_help &</action>
    </button>
    </vbox>
   </hbox>
  
   <frame $(gettext 'Detection control')>
   <hbox>
    <text><label>$(gettext 'Click this button to blacklist a modem module. Note that you will then have to click the ERASE button, then reboot Puppy so that autodetection can re-occur.')</label></text>
    <vbox>
    <button>
     <label>$(gettext 'BLACKLIST')</label>
     <action>/usr/sbin/bootmanager blacklist & </action>
    </button>
    </vbox>
   </hbox>

   <hbox>
    <text><label>`gettext \"Click this button to erase current modem settings. This will delete /dev/modem thus allowing a fresh auto-probe and will cancel the 'Modem' entry in /etc/wvdial.conf. CLICKING THIS BUTTON WILL CAUSE EXIT FROM PupDial. A REBOOT WILL THEN BE REQUIRED TO PROPERLY RE-DETECT INTERNAL MODEMS (for external modem not essential to reboot)\"`</label></text>
    <vbox>
    <button>
     <label>$(gettext 'ERASE')</label>
     <action>/usr/sbin/modemprobe_erase</action>
    </button>
    </vbox>
   </hbox>
   </frame>
  </frame>
 
 <frame $(gettext 'Manual probing')>
 
  <text><label>$(gettext 'The PROBE button does a fully automatic probe.  But if it is unsatisfactory you can consider some manual probing...')</label></text>
 
  <frame $(gettext 'Serial hardware modem')>
  <hbox>
   <text><label>`gettext \"If you have a true-hardware external serial or internal ISA card (or in some rare cases an internal PCI card), or think you might, click a button to probe. Note that 'ttyS0' is the same as 'com1' in DOS/Windows. Note also, 'ttyS0' is the most likely port, unless you have some other serial device such as a mouse. If the test is succesful then you will be offered to set /dev/modem and basic setup of /etc/wvdial.conf. (Note that these modems are not autodetected at bootup by Puppy, but are probed by the automatic PROBE button above)\"`</label></text>
   <vbox>
    <button>
     <label>ttyS0</label>
     <action>/usr/sbin/modemtest ttyS0 &</action>
     <action type=\"exit\">TTYSN</action>
    </button>
    <button>
     <label>ttyS1</label>
     <action>/usr/sbin/modemtest ttyS1 &</action>
     <action type=\"exit\">TTYSN</action>
    </button>
    <button>
     <label>ttyS2</label>
     <action>/usr/sbin/modemtest ttyS2 &</action>
     <action type=\"exit\">TTYSN</action>
    </button>
    <button>
     <label>ttyS3</label>
     <action>/usr/sbin/modemtest ttyS3 &</action>
     <action type=\"exit\">TTYSN</action>
    </button>
    <button>
     <label>ttyS4</label>
     <action>/usr/sbin/modemtest ttyS4 &</action>
     <action type=\"exit\">TTYSN</action>
    </button>
   </vbox>
  </hbox>
  </frame>
 
 </frame>
  
 </vbox>
</window>
"

#echo "$MAINDIALOG" >/tmp/MAINDIALOG
RETSTRING="`gtkdialog3 --center --program=MAINDIALOG`"
#echo "RETSTRING=$RETSTRING"

#v405 getting some weird stuff on stdout from gtkdialog3, fix...
#all lines must have format: variable="value" ...
xRETSTRING="`echo "$RETSTRING" | grep -E '^[a-zA-Z0-9]+=\".*\"$'`"

eval "$xRETSTRING"

[ "$EXIT" != "SETUP" ] && exit

#101202
if [ ! -f /var/local/pupdial/hotpluggable ];then #101202 see also pupdial, erase button above.
 export HOTDIALOG="
 <window title=\"$(gettext 'PupDial modem Internet dialer')\" icon-name=\"gtk-connect\">
  <vbox>
   <text><label>$(gettext 'Before probing, a basic question: do you want to connect to the Internet using an internal fixed modem, or a removable (USB, serial, PCMCIA) modem?')</label></text>
   <text><label>`gettext \"The reason for asking this, is an internal modem will have been detected at bootup, but a 'hotpluggable' external modem may not have have been detected if plugged in after bootup. Also, if you have both, say an internal analog dialup modem, plus a USB modem, PupDial may choose the wrong one -- ticking or unticking the checkbox here will avoid that confusion...\"`</label></text>
   <checkbox><label>$(gettext 'Tick checkbox if external modem')</label><variable>CHK_HOT</variable></checkbox>
   <hbox><button ok></button></hbox>
  </vbox>
 </window>"
 RETSTRING="`gtkdialog3 --center --program=HOTDIALOG`"
 CHK_HOT="`echo "$RETSTRING" | grep '^CHK_HOT' | cut -f 2 -d '"'`" #'geany
 [ "$CHK_HOT" = "" ] && CHK_HOT='false'
 echo -n "$CHK_HOT" > /var/local/pupdial/hotpluggable
 if [ "$CHK_HOT" = "true" ];then
  #rm -f /dev/modem
  pupdial_init_hotpluggable
 fi
fi
MODEMDEV=''
[ -h /dev/modem ] && MODEMDEV="`readlink /dev/modem`"

#101203 wvdialconf will ignore many devs that are not /dev/ttyS*, for example /dev/ttyAGS3 (agrmodem)...
#note, also have this same code in /usr/sbin/pupdial.
if [ "$MODEMDEV" ];then
 MODEMDEV="`echo -n "$MODEMDEV" | sed -e 's%/dev/%%'`"
 MODEMBASE="`basename $MODEMDEV`" #ex: modems/mwave becomes: mwave
 if [ "`echo -n "$MODEMBASE" | cut -c 1-4`" != "ttyS" ];then
  #some that are recognised by wvdialconf: ttyUSB* (v1.51), ttyLT* (v1.50), ttyACM*, ttyI* (v0.12)
  OK=0
  if [ "`echo -n "$MODEMBASE" | cut -c 1-3`" = "tty" ];then
   CHARS3="`echo -n "$MODEMBASE" | cut -c 4-6`"
   case $CHARS3 in
    USB) OK=1 ;;
    LT*) OK=1 ;;
    ACM) OK=1 ;;
    I*)  OK=1 ;;
   esac
  fi
  if [ $OK -eq 0 ];then
   SMODEMDEV='ttyS_'"`echo -n "$MODEMBASE" | sed -e 's%^tty%%' | cut -c 1-20`"
   ln -snf $MODEMDEV /dev/$SMODEMDEV
   ln -snf $SMODEMDEV /dev/modem #so that wvdialconf will look here first.
   MODEMDEV="$SMODEMDEV"
  fi
 fi
fi

yaf-splash -placement center -bg orange -text "$(gettext 'Please wait, probing for modems...')" &
X1PID=$!

#100918 If no modem selected, check bluetooth modem and set as /dev/modem...
if [ "$MODEMDEV" = "" ] && which rfcomm >/dev/null;then
 BTMODEMDEVS="`get_bluetooth_connection DUN`"
 for ONEBTMODEMDEV in $BTMODEMDEVS;do
  RFCOMMNUM="`echo "$ONEBTMODEMDEV" | grep -o [0-9]*`"
  if [ "`rfcomm $RFCOMMNUM | grep 'clean'`" != "" ];then
   rfcomm $ONEBTMODEMDEV connect &
   X10PID=$!
   sleep 5
  fi
  [ "`rfcomm $RFCOMMNUM | grep 'connected'`" != "" ] \
   && ln -snf $BTMODEMDEV /dev/modem \
   && break
 done
fi

rm -f /tmp/wvdial.conf 2>/dev/null
##[ "$MODEMDEV" != "" ] && [ "`grep 'SYMLINK="modem"' /etc/udev/rules.d/00-*`" = "" ] && echo 'KERNEL=="$MODEMDEV", SYMLINK="modem"' > /etc/udev/rules.d/00-modem_symlink.rules #v416

#v4.06 begin
DEVM=""
[ -f /etc/wvdial.conf ] && CONFDIR="etc" || CONFDIR="tmp"
wvdialconf /$CONFDIR/wvdial.conf >/tmp/logwvdialprobe 2>&1
RETVAL=$?
if [ $RETVAL -eq 0 ];then #found a modem and set it in wvdial.conf
 if [ "`grep '/dev/modem' /$CONFDIR/wvdial.conf`" != "" ];then #modem = /dev/modem - substitute /dev/modem target
  SEDSCRIPT="s%/dev/modem%/dev/`readlink /dev/modem`%" #v416
  sed -i -e "$SEDSCRIPT" /$CONFDIR/wvdial.conf #v416
 elif [ "`grep '/dev/ttyS_' /$CONFDIR/wvdial.conf`" != "" ];then
  #Convert ttyS_ link name to actual node name (e.g., ttyS_536ep -> 536ep)
  TMPDEVM="`cat /$CONFDIR/wvdial.conf | tr -s ' ' | grep '^Modem = ' | head -n 1 | cut -f 3 -d ' ' | cut -f 3 -d '/'`" #file name
  if [ -h /dev/$TMPDEVM ];then #it's a link to the correct device node name
   SEDSCRIPT="s%/dev/$TMPDEVM%/dev/`readlink /dev/$TMPDEVM`%" #v416
   sed -i -e "$SEDSCRIPT" /$CONFDIR/wvdial.conf #v416
  fi
 fi
 DEVM="`cat /$CONFDIR/wvdial.conf | tr -s ' ' | grep '^Modem = ' | head -n 1 | cut -f 3,4 -d '/'`" #v433
#v432 Add possible alternate modem device
 sed -i -e '/#Modem =/d' /$CONFDIR/wvdial.conf
 DEVMALT="`get_modem_alternate_device $DEVM`"
 [ "$DEVMALT" != "" ] \
  && aPATTERN="s%^Modem = .*%&\n#Modem = /dev/${DEVMALT}%" \
  && sed -i -e "$aPATTERN" /$CONFDIR/wvdial.conf #v432 end
else #v433
 [ "$MODEMDEV" = "" ] && rm -f /dev/modem #v433
fi
#v4.06 end

kill $X1PID

if [ "$DEVM" != "" ];then #4.06 probe found a modem (and not /dev/modem)
 ln -snf $DEVM /dev/modem #v4.06 v433
 touch /tmp/.pupdial-modem_detected #v433
 
 if [ -f /tmp/wvdial.conf ];then
  grep -v '^;' /tmp/wvdial.conf > /etc/wvdial.conf
  rm -f /tmp/wvdial.conf
  echo 'Carrier Check = no
Dial Command = ATDT

[Dialer isp1]
Phone = MYISPPHONENUM
Username = MYUSERNAME
Password = MYPASSWORD

[Dialer isp1apn]
Init5 = AT+CGDCONT=1,\"IP\",\"\"

[Dialer isp2]
Phone = MY2ISPPHONENUM
Username = MY2USERNAME
Password = MY2PASSWORD

[Dialer isp2apn]
Init5 = AT+CGDCONT=1,\"IP\",\"\"

[Dialer pin]
Init1 = AT+CPIN=

[Dialer wireless]
#Init4 = AT+COPS=0,0,\"MYOPS\",
#Init6 = AT+CGEQMIN=1,4,64,384,64,384
#Init7 = AT+CGEQREQ=1,4,64,384,64,384
#Init8 = AT+CGDCONT?
#Init9 = AT+COPS?' >> /etc/wvdial.conf
 fi
else #v433
 rm -f /tmp/.pupdial-modem_detected #v433
fi

sync
#leafpad /tmp/logwvdialprobe
exit $RETVAL #v4.06 Notify caller whether wvdialconf found a modem
