#!/bin/bash
#(c) Copyright 2007 Barry Kauler www.puppylinux.com
#2007 Lesser GPL licence v2 (http://www.fsf.org/licensing/licenses/lgpl.html)
#written for Puppy Linux 2.17+
#BK v3.91: keep log if failed to connect, display in main status log.
#BK v3.98: improve create mono font in status log. bugfixes.
#BK v3.98: one bugfix had to be removed, which fixed another bugfix.
#BK v3.99: corrected handling of params for each isp.
#BK v3.99: added Stupid Mode and Auto reconnect checkboxes for each isp.
#BK v4.00: crash bugfix.
#HairyWill v4.00: handle init string with quotes, prevent gtkdialog crash.
#v405 updated. 
#v408 old pap-secrets, chap-secrets problem has returned, workaround applied.
#v408 rerwin: Make modem startup after 'erase' same as for first time with no conf file. 
#v409 rerwin: bugfix, need a delay for fast machines.
#v412 rerwin: increase sleep from 0.3 to 1.
#v465 rerwin: v413 add init strings for wireless modems
#v477 rerwin: v413 add 'Reading...' splash message during sleep.
#v424 rerwin: send PIN only on first wireless connection; move APNs to accounts; associate APN with dial accounts; retain dial type (DT/DP)
#v431 rerwin: retain account checkbox changes; ensure optional lines associated with an account; add APN-specific commands; handle Idle Seconds lines
#v433 rerwin: accomodate bluetooth-connected modems.
#v433 Collect monthly transmission data.
#101202 new script /usr/sbin/pupdial_init_hotpluggable, flag /var/local/pupdial/hotpluggable.
#101203 wvdialconf will ignore many devs that are not /dev/ttyS*, for example /dev/ttyAGS3 (agrmodem).
#101205 warning to wait 30 seconds after plugin.
#101206 innapropriate for another active network interface.
#101206 launch pupdial_wizard_helper after run wvdial.
#101211 update PupDial if modem changes.
#101217 new help button, for modem setup.
#101218 passed param if re-run this script do not do probe of hotpluggable modems.
#110107 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

#hint: for debugging, to force pupdial to ask all questions, delete /var/local/pupdial/hotpluggable

KERNVER="`uname -r`"
FLAGNEWPROBE='' #101203
PASSEDPARAM=''
[ $1 ] && PASSEDPARAM="$1" #101218

if [ "$PASSEDPARAM" = "" ];then #101218 do not probe if re-running pupdial.
 #101206 innapropriate for another active network interface...
 #note, could run 'modemdisconnect' if want to disconnect dialup interface.
 /usr/sbin/networkdisconnect #but not ppp interface.

 if [ ! -f /var/local/pupdial/hotpluggable ];then #101202
  FLAGNEWPROBE='yes' #101203 flag 1st boot, or 'erase' button got clicked in pupdial (latter exits from pupdial).
  export HOTDIALOG="
  <window title=\"$(gettext 'PupDial modem Internet dialer')\" icon-name=\"gtk-connect\">
   <vbox>
    <text><label>$(gettext 'Welcome! First, 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
 fi
 CHK_HOT="`cat /var/local/pupdial/hotpluggable`"
 if [ "$CHK_HOT" = "true" ];then
  #rm -f /dev/modem
  pupdial_init_hotpluggable
 fi
fi

MYDEVM="MYDEVM"
[ -h /dev/modem ] && MYDEVM='/dev/'"`readlink /dev/modem`"
[ "$MYDEVM" = "/dev/" ] && MYDEVM="MYDEVM" #101203

#101203 wvdialconf will ignore many devs that are not /dev/ttyS*, for example /dev/ttyAGS3 (agrmodem)...
#note, also have this code in /usr/sbin/modemprobe.
if [ "$MYDEVM" != "MYDEVM" ];then
 MODEMDEV="`echo -n "$MYDEVM" | sed -e 's%/dev/%%'`" #could be in a subdir, ex: modems/mwave
 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.
   MYDEVM='/dev/'"$SMODEMDEV" #probably not essential
  fi
 fi
fi

#note, MYDEVM is placeholder for '/dev/ttyS0' whereas DEVM is just 'ttyS0'.

#101203 logic reorganised...
REPLACE='no'
[ ! -s /etc/wvdial.conf ] && REPLACE='yes'
if [ "$REPLACE" = "yes" ];then
 echo "[Dialer Defaults]
Modem = ${MYDEVM}
Baud = 57600
Init1 = 
Init2 = ATZ
Init3 = 
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=" > /etc/wvdial.conf
fi

if [ "$MYDEVM" != "MYDEVM" ];then #modem detected; make config agree with /dev/modem.
 SEDSCRIPT1="s%MYDEVM%$MYDEVM%" #101211 fix.
 SEDSCRIPT2="s%/dev/modem%$MYDEVM%"
 sed -i -e "$SEDSCRIPT1" -e "$SEDSCRIPT2" /etc/wvdial.conf
fi

#101211 hotpluggable modem may have changed....
if [ "$FLAGNEWPROBE" != "yes" ];then
 if [ -h /dev/modem ];then
  if [ -f /etc/wvdial.conf ];then
   wvMODEM="`grep '^Modem =' /etc/wvdial.conf | head -n 1 | tr -s ' ' | cut -f 3 -d ' '`"
   newMODEM="/dev/`readlink /dev/modem | sed -e 's%/dev/%%'`"
   if [ -e ${newMODEM} ];then #precaution.
    if [ "$wvMODEM" != "$newMODEM" ];then
     Xdialog --left --wmclass "pupdial" --title "$(gettext 'PupDial: modem changed')" --ok-label "$(gettext 'UPDATE')" --yesno "`eval_gettext \"It seems that the modem has changed.\n
It was '\\\${wvMODEM}', it is now '\\\${newMODEM}'\n
Do you want to update PupDial?\n
Recommend click UPDATE button...\"`" 0 0
     [ $? -eq 0 ] && FLAGNEWPROBE='yes'
    fi
   fi
  fi
 fi
fi

#i also want this to rerun after 'erase' button pressed in pupdial...
if [ "$FLAGNEWPROBE" = "yes" ];then
 if [ "$MYDEVM" != "MYDEVM" -a "$MYDEVM" != "modem" ];then
  Xdialog --left --wmclass "pupdial" --title "$(gettext 'PupDial: modem found')" --ok-label "$(gettext 'TEST')" --yesno "`eval_gettext \"It seems that you have a modem, at port \\\${MYDEVM}\n
However, it is recommended that you now click the 'TEST' button\n
to test that it is working.\n
\n
Note 1: The test will also optionally probe for what is called an\n
'inialization string'. If you are running PupDial for the first time\n
or have changed modems, you will definitely need to click the 'TEST'\n
button and obtain an initialization string.\n
\n
Note 2: If you think that \\\${MYDEVM} might be the wrong modem,\n
click the 'No' button and the main PupDial GUI has a 'CHOOSE' button\n
that will enable you to test alternative modem interfaces.\n
\n
Recommend click 'TEST' to probe the modem...\"`" 0 0
  RETVAL=$?
  DEVM="`echo -n "$MYDEVM" | cut -f 3,4 -d '/'`"
  [ $RETVAL -eq 0 ] && modemtest $DEVM initonly
 fi
fi

#v413 Assure user...
#yaf-splash -font "8x16" -outline 0 -margin 4 -bg orange -text "Reading modem configuration file..." &
yaf-splash -font "8x16" -outline 0 -margin 4 -bg orange -text "$(gettext 'Reading modem configuration file...')" &
X1PID=$!
# ^^^^^^^^ yaf-splash changed for gettext rodin.s
#disconnect button...
STATECONb="disabled"
#v409 rerwin, bugfix...
#[ "`pidof pppd`" != "" ] && STATECONb="enabled"
if [ "`pidof pppd`" != "" ];then #v409
 [ ! -f /etc/ppp/peers/wvdial ] && sleep 1 #v409 allow kill completion and repeat test. v412 0.3 to 1.
 [ "`pidof pppd`" != "" ] && STATECONb="enabled"
fi #v409

MSG1="$(gettext 'WARNING! No modem detected! You cannot dialout!')"
STATECONa="disabled"
STATETEST="disabled" #101117
STATECCM="yes"
STATEDTM="yes"
STATEBCM="yes"
TESTMSG="MODEM"

#precaution...
cat /etc/wvdial.conf | tr '\t' ' ' | tr -s ' ' > /tmp/wvdial.conf
sync
#Rerwin: v4.05 Substitute /dev/modem target for /dev/modem
if [ "`grep '/dev/modem' /tmp/wvdial.conf`" != "" -a -h /dev/modem ];then #modem = /dev/modem & it exists
 SEDSCRIPT="s%/dev/modem%/dev/`readlink /dev/modem`%g"
 sed -i -e "$SEDSCRIPT" /tmp/wvdial.conf #replace device in-place
fi
mv -f /tmp/wvdial.conf /etc/wvdial.conf
sync #v413 ensure config updated

ISPM="`cat /etc/wvdial.conf | grep '^Phone = ' | head -n 2`"
ACC1ISP="`echo "$ISPM" | head -n 1 | cut -f 3-6 -d ' '`"
ACC2ISP="`echo "$ISPM" | tail -n 1 | cut -f 3-6 -d ' '`"
USERM="`cat /etc/wvdial.conf | grep '^Username = ' | head -n 2`"
ACC1USER="`echo "$USERM" | head -n 1 | cut -f 3 -d ' '`"
ACC2USER="`echo "$USERM" | tail -n 1 | cut -f 3 -d ' '`"
PASSM="`cat /etc/wvdial.conf | grep '^Password = ' | head -n 2`"
ACC1PASS="`echo "$PASSM" | head -n 1 | cut -f 3 -d ' '`"
ACC2PASS="`echo "$PASSM" | tail -n 1 | cut -f 3 -d ' '`"
INIT5M="`cat /etc/wvdial.conf | grep '^Init5 = AT+CGDCONT=' | head -n 2`"
[ "`grep '\[Dialer isp2apn\]' /etc/wvdial.conf`" = "" ] && INIT5M="`echo -e "$INIT5M\n"`"
ACC1PRFL="`echo "$INIT5M" | head -n 1 | cut -f 3 -d '=' | cut -f 1 -d ','`"
ACC2PRFL="`echo "$INIT5M" | tail -n 1 | cut -f 3 -d '=' | cut -f 1 -d ','`"
ACC1APN="`echo "$INIT5M" | head -n 1 | cut -f 4 -d '\"' | sed 's/\\$/\\\\$/g;'`"
ACC2APN="`echo "$INIT5M" | tail -n 1 | cut -f 4 -d '\"' | sed 's/\\$/\\\\$/g;'`"
[ "$ACC1PRFL" = "" ] && ACC1PRFL="1"; [ "$ACC2PRFL" = "" ] && ACC2PRFL="1"

#1st 'cut' fixes if the '/dev/' left off the device name...
#note, initialised wvdial.conf has 'Modem = MYDEVM' where MYDEVM needs to become
# '/dev/ttyS0' (for example)
DEVM="`cat /etc/wvdial.conf | grep '^Modem = ' | cut -f 3 -d ' ' | cut -f 3 -d '/'`"
DEVMALT="`cat /etc/wvdial.conf | grep '^#Modem = ' | tail -n 1 | cut -f 3 -d ' ' | cut -f 3 -d '/'`" #v432
[ "$DEVM" = "" ] && DEVM='MYDEVM' #v4.00 bugfix, crashed if no DEVM.
[ ! -f /tmp/pupdial.log ] && touch /tmp/pupdial.log #v408 rerwin, moved up.
if [ "${DEVM}" != "MYDEVM" ];then
 [ -f /tmp/.pupdial-modem_detected ] \
  && rm -f /tmp/.pupdial-modem_detected \
  && MSG1="$(gettext 'Modem detected! Device interface:') /dev/$DEVM" \
  || MSG1="$(gettext 'Selected modem device interface:') /dev/$DEVM" #v433
  #101117 Protect HSF/HCF connections from lockup - ensure nvm files installed.
 [ "`pidof pppd`" = "" ] \
  && STATETEST="enabled" \
  && [ "`echo "${DEVM}" | grep 'ttySHSF[0-9]'`" = "" -o -d /etc/hsfmodem/nvm ] \
  && [ "`echo "${DEVM}" | grep 'ttySHCF[0-9]'`" = "" -o -d /etc/hcfpcimodem/nvm ] \
  && STATECONa="enabled" #dialout button.
 [ "$DEVMALT" = "" ] \
  && TESTMSG="$DEVM" \
  || TESTMSG="$DEVMALT" #v433
 TESTDEVM="$TESTMSG" #v432
 #[ ! -f /tmp/pupdial.log ] && touch /tmp/pupdial.log
 [ "`grep 'MODEM WAS NOT AUTOMATICALLY DETECTED' /tmp/pupdial.log`" != "" ] && echo -n "" > /tmp/pupdial.log
 if [ "`grep 'Barry Kauler' /tmp/pupdial.log`" = "" ];then
  echo -n "`gettext \"Welcome to PupDial, written by Barry Kauler, with
contributions from Richard Erwin, for Puppy Linux.

There is a configuration file, /etc/wvdial.conf, that is read by
PupDial, and changes made to any of the above boxes will be saved
to wvdial.conf when you click the 'Exit' or 'Connect' buttons.
Note, you can also manually edit wvdial.conf with a text editor.

If you are using PupDial for the first time, it is recommended that
you click the help buttons, in particular the 'Modem setup' button.\"`" >> /tmp/pupdial.log
 fi
else
 if [ "`grep 'Barry Kauler' /tmp/pupdial.log`" = "" ];then
  echo "`gettext \"Welcome to PupDial, written by Barry Kauler, with
contributions from Richard Erwin, for Puppy Linux.

A MODEM WAS NOT AUTOMATICALLY DETECTED, SO YOU
NEED TO CLICK THE 'CHOOSE' BUTTON. DO THIS NOW!\"`
" > /tmp/pupdial.log
 fi
fi

 BAUDM="`cat /etc/wvdial.conf | grep '^Baud = ' | cut -f 3 -d ' '`"
 
 #v4.00 HairyWill fixes for embedded $ " characters...
 INIT1M="`cat /etc/wvdial.conf | grep '^Init1 =' | head -n 1 | cut -f 3-12 -d ' ' | grep -v 'AT+CPIN=' | sed 's/"/\\\\"/g;s/\\$/\\\\$/g;'`" #v413
 INIT2M="`cat /etc/wvdial.conf | grep '^Init2 = ' | cut -f 3-12 -d ' '| sed 's/"/\\\\"/g;s/\\$/\\\\$/g;'`"
 INIT3M="`cat /etc/wvdial.conf | grep '^Init3 = ' | cut -f 3-12 -d ' '| sed 's/"/\\\\"/g;s/\\$/\\\\$/g;'`" #v413
 #v413 If first Init1 not null, move contents to Init2, and Init2 to Init3, to reserve Init1 for wireless PIN.
 [ "$INIT1M" != "" ] && INIT3M="$INIT2M" && INIT2M="$INIT1M" && INIT1M="" #v413
 #v413 Get values for Init1, 4, 6-9.
 WPINM="`cat /etc/wvdial.conf | grep '^Init1 = ' | tail -n 1 | cut -f 3 -d '='`"
 INIT4M="`cat /etc/wvdial.conf | grep '^#*Init4 =' | sed 's/"/\\"/g;;s/\$/\\$/g;s/$$//g;'`"
 [ "$INIT4M" = "" ] && INIT4M="#Init4 = AT+COPS=0,0,\"MYOPS\","
 INIT69M="`cat /etc/wvdial.conf | grep '^#*Init[6-9] =' | sed -e 's/"/\\"/g' -e 's/\$/\\$/g' -e 's/$$//'`"
 [ "$INIT69M" = "" ] && INIT69M="#Init6 = AT+CGEQMIN=1,4,64,384,64,384
#Init7 = AT+CGEQREQ=1,4,64,384,64,384
#Init8 = AT+CGDCONT?
#Init9 = AT+COPS?"
 #v413 end
 
 DIALM="`cat /etc/wvdial.conf | grep '^Dial Command = ' | cut -f 4 -d ' '`"
 [ "`echo "$DIALM" | grep -E 'X3|X1'`" != "" ] && STATEDTM="no"
 [ "`echo "$DIALM" | grep -E 'X2|X1'`" != "" ] && STATEBCM="no"
 CCM="`cat /etc/wvdial.conf | grep '^Carrier Check = ' | cut -f 4 -d ' '`"
 [ "$CCM" = "no" ] && STATECCM="no"
 [ "`echo "$DIALM" | grep 'DP'`" = "" ] && DIALTYPE="DT" || DIALTYPE="DP" #v424
 
 #v3.99 there may be up to two of each of the above...
 ISPCNT=0 #v431
 echo -n "" > /tmp/pupdial_read
 cat /etc/wvdial.conf |
 while read ONELINE
 do
  ONELINE="`echo -n "$ONELINE" | tr '\t' ' ' | tr -s ' '`" #in case user puts in extra tabs and spaces.
  [ "$ONELINE" = "" -o "$ONELINE" = " " ] && continue
#v431 begin
  case $ONELINE in
   "[Dialer isp1]") ISPCNT=1 ;;
   "[Dialer isp1apn]") ISPCNT=0 ;;
   "[Dialer isp2]") ISPCNT=2 ;;
   "[Dialer isp2apn]") ISPCNT=0 ;;
  esac
  [ $ISPCNT -eq 0 ] && continue
#v431 end
  ONEPARAM="`echo -n "$ONELINE" | cut -f 1 -d '=' | sed -e 's/ $//'`"
  ONEVALUE="`echo -n "$ONELINE" | cut -f 2 -d '=' | sed -e 's/^ //'`"
  if [ "$ONEVALUE" != "" ];then
   case $ONEPARAM in
    "Dial Prefix") echo "DIAL_PREFIX${ISPCNT}='${ONEVALUE}'" >> /tmp/pupdial_read ;;
    "Login Prompt") echo "LOGIN_PROMPT${ISPCNT}='${ONEVALUE}'" >> /tmp/pupdial_read ;;
    "Password Prompt") echo "PASSWORD_PROMPT${ISPCNT}='${ONEVALUE}'" >> /tmp/pupdial_read ;;
    "Stupid Mode") echo "STUPID_MODE${ISPCNT}='${ONEVALUE}'" >> /tmp/pupdial_read ;;
    "Default Reply") echo "DEFAULT_REPLY${ISPCNT}='${ONEVALUE}'" >> /tmp/pupdial_read ;;
    "Auto Reconnect") echo "AUTO_RECONNECT${ISPCNT}='${ONEVALUE}'" >> /tmp/pupdial_read ;;
    "Idle Seconds") echo "IDLE_SECONDS${ISPCNT}='${ONEVALUE}'" >> /tmp/pupdial_read ;; #v431
   esac
  fi
 done
 eval "`cat /tmp/pupdial_read`"
 
 #v3.99
 ynSTUPID_MODE1=no
 [ "$STUPID_MODE1" = "1" -o "$STUPID_MODE1" = "yes" ] && ynSTUPID_MODE1=yes
 ynSTUPID_MODE2=no
 [ "$STUPID_MODE2" = "1" -o "$STUPID_MODE2" = "yes" ] && ynSTUPID_MODE2=yes
 ynAUTO_RECONNECT1=yes #default is on.
 [ "$AUTO_RECONNECT1" = "1" -o "$AUTO_RECONNECT1" = "yes" ] && ynAUTO_RECONNECT1=yes
 [ "$AUTO_RECONNECT1" = "0" -o "$AUTO_RECONNECT1" = "no" ] && ynAUTO_RECONNECT1=no
 ynAUTO_RECONNECT2=yes #default is on.
 [ "$AUTO_RECONNECT2" = "1" -o "$AUTO_RECONNECT2" = "yes" ] && ynAUTO_RECONNECT2=yes
 [ "$AUTO_RECONNECT2" = "0" -o "$AUTO_RECONNECT2" = "no" ] && ynAUTO_RECONNECT2=no

 #v4.00 HairyWill, replaced lines (see below), fix for quotes in string...
 #<     <default>\"${INIT2M}\"</default>
 #>     <input>echo \"${INIT2M}\"</input>
 #<     <default>\"${INIT3M}\"</default>
 #>     <input>echo \"${INIT3M}\"</input>

 MODEMINFO="
<hbox>
 <frame $(gettext 'Line status')>
  <vbox>
   <checkbox>
    <label>$(gettext 'Carrier check')</label>
    <variable>CHECKCC</variable>
    <default>${STATECCM}</default>
   </checkbox>
   <checkbox>
    <label>$(gettext 'Dialtone check')</label>
    <variable>CHECKDT</variable>
    <default>${STATEDTM}</default>
   </checkbox>
   <checkbox>
    <label>$(gettext 'Busy check')</label>
    <variable>CHECKBC</variable>
    <default>${STATEBCM}</default>
   </checkbox>
  </vbox>
 </frame>
 <vbox>
  <hbox>
   <text><label>$(gettext 'Initialisation string') 2:</label></text>
   <entry>
    <input>echo \"${INIT2M}\"</input>
    <variable>ENTRYINIT2M</variable>
   </entry>
  </hbox>
  <hbox>
   <text><label>$(gettext 'Initialisation string') 3:</label></text>
   <entry>
    <input>echo \"${INIT3M}\"</input>
    <variable>ENTRYINIT3M</variable>
   </entry>
  </hbox>
  <hbox>
   <text><label>$(gettext 'Max speed:')</label></text>
   <entry>
    <default>\"${BAUDM}\"</default>
    <variable>ENTRYBAUDM</variable>
   </entry>
   <text><label>SIM PIN:</label></text>
   <entry invisible_char=\"x\" visibility=\"false\">
    <input>echo \"${WPINM}\"</input>
    <variable>ENTRYWPINM</variable>
   </entry>
  </hbox>
 </vbox>
 <frame $(gettext 'Test/Select')>
  <vbox>
   <button>
    <label>${TESTMSG}</label>
    <visible>${STATETEST}</visible>
    <action>/usr/sbin/modemtest ${TESTDEVM}</action>
    <action type=\"exit\">reload</action>
   </button>
   <button>
    <label>$(gettext 'CHOOSE')</label>
    <action>/usr/sbin/modemprobe</action>
    <action>cat /tmp/logwvdialprobe > /tmp/pupdial.log 2> /dev/null</action>
    <action type=\"exit\">reload</action>
   </button>
  </vbox>
 </frame>
</hbox>
"


export MAINDIALOG="
<window title=\"$(gettext 'PupDial modem Internet dialer')\" icon-name=\"gtk-connect\">
 <vbox>
  <frame $(gettext 'Modem setup')>
   <text  use-markup=\"true\"><label>\"<b>$MSG1</b>\"</label></text>
   ${MODEMINFO}
  </frame>
  <hbox>
   <frame $(gettext 'Account') 1>
    <vbox>
     <hbox>
      <text><label>$(gettext 'Phone/Access number:')</label></text>
      <entry>
       <default>\"${ACC1ISP}\"</default>
       <variable>ENTRYACC1ISP</variable>
      </entry>
     </hbox>
     <hbox>
      <text><label>$(gettext 'Username:')</label></text>
      <entry>
       <default>\"${ACC1USER}\"</default>
       <variable>ENTRYACC1USER</variable>
      </entry>
     </hbox>
     <hbox>
      <text><label>$(gettext 'Password:')</label></text>
      <entry invisible_char=\"x\" visibility=\"false\">
       <default>\"${ACC1PASS}\"</default>
       <variable>ENTRYACC1PASS</variable>
      </entry>
     </hbox>
     <hbox>
      <text><label>$(gettext 'Wireless APN:')</label></text>
      <entry>
       <default>\"${ACC1APN}\"</default>
       <variable>ENTRYACC1APN</variable>
      </entry>
     </hbox>

     <hbox>
      <checkbox>
       <label>$(gettext 'Stupid mode')</label>
       <variable>ynSTUPID_MODE1</variable>
       <default>${ynSTUPID_MODE1}</default>
      </checkbox>
      <text><label>\" \"</label></text>
      <checkbox>
       <label>$(gettext 'Auto Reconnect')</label>
       <variable>ynAUTO_RECONNECT1</variable>
       <default>${ynAUTO_RECONNECT1}</default>
      </checkbox>
      <text><label>\" \"</label></text>
      <button>
       <label>$(gettext 'CONNECT')</label>
       <visible>${STATECONa}</visible>
       <action type=\"exit\">CONNECT1</action>
      </button>
     </hbox>
     
    </vbox>
   </frame>
   <frame $(gettext 'Account') 2>
    <vbox>
     <hbox>
      <text><label>$(gettext 'Phone/Access number:')</label></text>
      <entry>
       <default>\"${ACC2ISP}\"</default>
       <variable>ENTRYACC2ISP</variable>
      </entry>
     </hbox>
     <hbox>
      <text><label>$(gettext 'Username:')</label></text>
      <entry>
       <default>\"${ACC2USER}\"</default>
       <variable>ENTRYACC2USER</variable>
      </entry>
     </hbox>
     <hbox>
      <text><label>$(gettext 'Password:')</label></text>
      <entry invisible_char=\"x\" visibility=\"false\">
       <default>\"${ACC2PASS}\"</default>
       <variable>ENTRYACC2PASS</variable>
      </entry>
     </hbox>
     <hbox>
      <text><label>$(gettext 'Wireless APN:')</label></text>
      <entry>
       <default>\"${ACC2APN}\"</default>
       <variable>ENTRYACC2APN</variable>
      </entry>
     </hbox>

     <hbox>
      <checkbox>
       <label>$(gettext 'Stupid mode')</label>
       <variable>ynSTUPID_MODE2</variable>
       <default>${ynSTUPID_MODE2}</default>
      </checkbox>
      <text><label>\" \"</label></text>
      <checkbox>
       <label>$(gettext 'Auto Reconnect')</label>
       <variable>ynAUTO_RECONNECT2</variable>
       <default>${ynAUTO_RECONNECT2}</default>
      </checkbox>
      <text><label>\" \"</label></text>
      <button>
       <label>$(gettext 'CONNECT')</label>
       <visible>${STATECONa}</visible>
       <action type=\"exit\">CONNECT2</action>
      </button>
     </hbox>
    
    </vbox>
   </frame>
  </hbox>

  <frame>
  <hbox>
   <text><label>$(gettext 'WvDial run:')</label></text>
   <button>
    <input file>/usr/local/lib/X11/mini-icons/mini-question.xpm</input>
    <action>Xdialog --wmclass \"pupdial\" --title \"$(gettext 'WvDial documentation')\" --no-cancel --fixed-font --textbox /usr/share/doc/wvdial/wvdial.txt 0 0 & </action>
   </button>
   <text><label> $(gettext 'WvDial config:')</label></text>
   <button>
    <input file>/usr/local/lib/X11/mini-icons/mini-question.xpm</input>
    <action>Xdialog --wmclass \"pupdial\" --title \"$(gettext 'WvDial documentation')\" --no-cancel --fixed-font --textbox /usr/share/doc/wvdial/wvdial.conf.txt 0 0 &</action>
   </button>
   <text><label> $(gettext 'Modem setup:')</label></text>
   <button>
    <input file>/usr/local/lib/X11/mini-icons/mini-question.xpm</input>
    <action>defaulthtmlviewer file:///usr/share/doc/HOWTO_modem.htm &</action>
   </button>
   <text><label>\"         \"</label></text>
   <button>
    <label>$(gettext 'DISCONNECT from Internet')</label>
    <visible>${STATECONb}</visible>
    <action>/usr/sbin/modemdisconnect</action>
    <action>rm -f /tmp/pupdial.log</action>
    <action type=\"exit\">EXIT</action>
   </button>
   <text><label>\"         \"</label></text>
   <button>
    <label>$(gettext 'EXIT')</label>
    <action type=\"exit\">EXIT</action>
   </button>
  </hbox>
  </frame>
  
  <frame $(gettext 'Connection status log')>
   <edit editable=\"false\">
    <variable>INFO</variable>
    <input file>/tmp/pupdial.log</input>
    <width>600</width>
    <height>150</height>
   </edit>
  </frame>

 </vbox>
</window>
"

#       <action>wvdial &> /tmp/pupdial.log &</action>
#       <action>sleep 2</action>
#       <action>tail /tmp/pupdial.log > /tmp/pupdial.log.tail</action>
#       <action  type=\"refresh\">INFO</action>

#mono text for log box...
echo 'style "specialmono"
{
  font_name="Mono 12"
}

class "GtkText*" style "specialmono"' > /tmp/gtkrc_mono
export GTK2_RC_FILES=/tmp/gtkrc_mono:/root/.gtkrc-2.0

kill $X1PID #v413



#RETSTRING="`echo "$MAINDIALOG" | gtkdialog3 --stdin`"
RETSTRING="`gtkdialog3 --center --program=MAINDIALOG`"

#v4.00 to handle embedded quote, extract ENTRYINIT2M and ENTRYINIT3M separately...
ENTRYINIT2M="`echo "$RETSTRING" | grep '^ENTRYINIT2M=' | cut -f 2-9 -d '"' | sed -e 's/"$//'`" #'geany
ENTRYINIT3M="`echo "$RETSTRING" | grep '^ENTRYINIT3M=' | cut -f 2-9 -d '"' | sed -e 's/"$//'`" #'geany
ENTRYWPINM="`echo "$RETSTRING" | grep '^ENTRYWPINM=' | cut -f 2-9 -d '"' | sed -e 's/"$//' | tr -d ' '`" #no spaces
RETSTRING="`echo "$RETSTRING" | grep -v '^ENTRYINIT3M=' | grep -v '^ENTRYINIT2M=' | grep -v '^ENTRYWPINM='`"

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

eval "$xRETSTRING"

[ ! -f /etc/wvdial.conf ] && exit
if [ "$EXIT" = "abort" -o "$EXIT" = "" ];then
 rm -f /tmp/pupdial.log #v3.91
 exit
fi

[ "$EXIT" = "reload" ] && exec pupdial 2 #101218 pass param.

rm -f /tmp/pupdial.log #v3.91

#v3.99
STUPID_MODE1=""
STUPID_MODE2=""
[ "$ynSTUPID_MODE1" = "true" ] && STUPID_MODE1="yes"
[ "$ynSTUPID_MODE2" = "true" ] && STUPID_MODE2="yes"
[ "$ynAUTO_RECONNECT1" = "true" ] && AUTO_RECONNECT1=yes
[ "$ynAUTO_RECONNECT1" = "false" ] && AUTO_RECONNECT1=no
[ "$ynAUTO_RECONNECT2" = "true" ] && AUTO_RECONNECT2=yes
[ "$ynAUTO_RECONNECT2" = "false" ] && AUTO_RECONNECT2=no

USEREXTRA1="" #v3.99 bug fix...
[ "$DIAL_PREFIX1" != "" ] && USEREXTRA1="${USEREXTRA1}Dial Prefix = ${DIAL_PREFIX1}
"
[ "$LOGIN_PROMPT1" != "" ] && USEREXTRA1="${USEREXTRA1}Login Prompt = ${LOGIN_PROMPT1}
"
[ "$PASSWORD_PROMPT1" != "" ] && USEREXTRA1="${USEREXTRA1}Password Prompt = ${PASSWORD_PROMPT1}
"
[ "$STUPID_MODE1" != "" ] && USEREXTRA1="${USEREXTRA1}Stupid Mode = ${STUPID_MODE1}
"
[ "$DEFAULT_REPLY1" != "" ] && USEREXTRA1="${USEREXTRA1}Default Reply = ${DEFAULT_REPLY1}
"
[ "$AUTO_RECONNECT1" != "" ] && USEREXTRA1="${USEREXTRA1}Auto Reconnect = ${AUTO_RECONNECT1}
"
[ "$IDLE_SECONDS1" != "" ] && USEREXTRA1="${USEREXTRA1}Idle Seconds = ${IDLE_SECONDS1}
"

USEREXTRA2="" #v3.99 bugfix...
[ "$DIAL_PREFIX2" != "" ] && USEREXTRA2="${USEREXTRA2}Dial Prefix = ${DIAL_PREFIX2}
"
[ "$LOGIN_PROMPT2" != "" ] && USEREXTRA2="${USEREXTRA2}Login Prompt = ${LOGIN_PROMPT2}
"
[ "$PASSWORD_PROMPT2" != "" ] && USEREXTRA2="${USEREXTRA2}Password Prompt = ${PASSWORD_PROMPT2}
"
[ "$STUPID_MODE2" != "" ] && USEREXTRA2="${USEREXTRA2}Stupid Mode = ${STUPID_MODE2}
"
[ "$DEFAULT_REPLY2" != "" ] && USEREXTRA2="${USEREXTRA2}Default Reply = ${DEFAULT_REPLY2}
"
[ "$AUTO_RECONNECT2" != "" ] && USEREXTRA2="${USEREXTRA2}Auto Reconnect = ${AUTO_RECONNECT2}
"
[ "$IDLE_SECONDS2" != "" ] && USEREXTRA2="${USEREXTRA2}Idle Seconds = ${IDLE_SECONDS2}
"

[ "$CHECKCC" = "true" ] && CHECKCC="yes"
[ "$CHECKCC" = "false" ] && CHECKCC="no"
#v424 Retain original dial type, in case edited to DP.
DIALSTR="AT"
[ "$CHECKDT" = "true" -a "$CHECKBC" = "true" ] && DIALSTR="AT"
[ "$CHECKDT" = "false" -a "$CHECKBC" = "true" ] && DIALSTR="ATX3"
[ "$CHECKDT" = "false" -a "$CHECKBC" = "false" ] && DIALSTR="ATX1"
[ "$CHECKDT" = "true" -a "$CHECKBC" = "false" ] && DIALSTR="ATX2"
DIALSTR="${DIALSTR}${DIALTYPE}"
[ "$DEVMALT" = "" ] && DEVMALTLINE="" || DEVMALTLINE="#Modem = /dev/${DEVMALT}
"

echo '[Dialer Defaults]' > /etc/wvdial.conf
echo -n "Modem = /dev/${DEVM}
${DEVMALTLINE}Baud = ${ENTRYBAUDM}
Init1 = 
Init2 = ${ENTRYINIT2M}
Init3 = ${ENTRYINIT3M}
Carrier Check = ${CHECKCC}
Dial Command = ${DIALSTR}

[Dialer isp1]
Phone = ${ENTRYACC1ISP}
Username = ${ENTRYACC1USER}
Password = ${ENTRYACC1PASS}
${USEREXTRA1}
[Dialer isp1apn]
Init5 = AT+CGDCONT=${ACC1PRFL},\"IP\",\"${ENTRYACC1APN}\"

[Dialer isp2]
Phone = ${ENTRYACC2ISP}
Username = ${ENTRYACC2USER}
Password = ${ENTRYACC2PASS}
${USEREXTRA2}
[Dialer isp2apn]
Init5 = AT+CGDCONT=${ACC2PRFL},\"IP\",\"${ENTRYACC2APN}\"

[Dialer pin]
Init1 = AT+CPIN=${ENTRYWPINM}

[Dialer wireless]
#`gettext \"To force only 2G or 3G, uncomment the Init4 line and append 0 (2G) or 2 (3G), and substitute your operator's name for MYOPS.\"`
${INIT4M}
#$(gettext 'Init6-Init9 lines are available for user purposes; the commented examples can be used as described:')
#$(gettext 'To force the 3G quality of service level, uncomment the Init6/Init7 line pair and set value two places each, for 384k/144k/64k, omitting the \"k\" (e.g., =1,4,64,384,64,384).')
#$(gettext 'To list all the APNs stored in the modem, uncomment the Init8 line; check the Connection status log for lines beginning with +CGDCONT:.')
#$(gettext 'To list the operator identifier stored in the modem, uncomment the Init9 line; check the Connection status log for a line beginning with +COPS:').
${INIT69M}" >> /etc/wvdial.conf

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

if [ "$EXIT" = "CONNECT1" -o "$EXIT" = "CONNECT2" ];then
 [ "$EXIT" = "CONNECT1" ] && WVISP="isp1" || WVISP="isp2"
 ln -snf $WVISP /var/local/pupdial/isp #v433 for stats

 #v3.98 put this in, now remove... v408 back in...
 #v3.98 something wrong with wvdial, it is supposed to automatically write
 #to /etc/ppp/chap-secrets and pap-secrets but isn't...
 if [ "$WVISP" = "isp1" ];then
  echo -e "${ENTRYACC1USER}\t*\t${ENTRYACC1PASS}" > /etc/ppp/chap-secrets
  echo -e "${ENTRYACC1USER}\t*\t${ENTRYACC1PASS}" > /etc/ppp/pap-secrets
 else
  echo -e "${ENTRYACC2USER}\t*\t${ENTRYACC2PASS}" > /etc/ppp/chap-secrets
  echo -e "${ENTRYACC2USER}\t*\t${ENTRYACC2PASS}" > /etc/ppp/pap-secrets
 fi
 #v413 set wireless wvdial arguments, based on device, driver, PIN and APN fields; these do not include wireless modems that appear identical to wired analog modems.
 WVWRLS=""; WVPIN=""; WVAPN=""
 if [ "`echo "$DEVM" | grep -E 'ttyACM[0-9]|ttyUSB[0-9]|ttyHS[0-9]|ttynoz[0-9]|ttyIPWp[0-9]|rfcomm[0-9]'`" != "" ];then #v433 100929
   WVWRLS="wireless" #Include optional user-edited init strings
   if [ "$WVISP" = "isp1" ];then
    [ "$ENTRYACC1APN" != "" ] && WVAPN="${WVISP}apn" && APNSTRING="$ENTRYACC1APN" #v431
   else
    [ "$ENTRYACC2APN" != "" ] && WVAPN="${WVISP}apn" && APNSTRING="$ENTRYACC2APN" #v431
   fi
   if [ "$ENTRYWPINM" != "" ] && [ ! -e /tmp/.pupdial_pin_sent ];then
    WVPIN="pin"
    touch /tmp/.pupdial_pin_sent
   fi
 fi
 rm -f /tmp/pupdial.log

#v3.98 put this in, now remove...
 #v3.98 /etc/ppp/options can cause conflict for wvdial. 
 #(i think 'options' is used by roaring penguin) hide it...
# mv -f /etc/ppp/options /etc/ppp/optionsHIDE

 #/etc/ppp/peers/wvdial and wvdial-pipe are part of wvdial pkg, but these files
 #conflict with Gkdial. Therefore, in the Unleashed wvdial pkg these files are
 #kept in /etc/ppp/ and moved into peers/ as needed...
 cp -f /etc/ppp/wvdial /etc/ppp/peers/
 #v433 Substitute bluetooth wvdial options...
 if which rfcomm >/dev/null && which hcitool >/dev/null \
   && [ "`echo "$DEVM" | grep '^rfcomm[0-9]'`" != "" ];then
  [ -f /etc/wvdial_options/BT-wvdial ] \
   && cp -f /etc/wvdial_options/BT-wvdial /etc/ppp/peers/wvdial
  BDADDR="`rfcomm show $DEVM | grep 'connected' | cut -f 2 -d > | cut -f 2 -d ' '`"
  if [ "$BDADDR" != "" ];then
   BDNAME="`hcitool name $BDADDR | tr -s ' ' | tr ' ' _ | tr / _ | tr '$' _`"
   if [ "$BDNAME" != "" ];then
    [ -f /etc/wvdial_options/BT-$BDNAME ] \
     && cp -f /etc/wvdial_options/BT-$BDNAME /etc/ppp/peers/wvdial \
     || cp -f /etc/ppp/peers/wvdial /etc/wvdial_options/BT-$BDNAME
   fi
  fi
  echo -e "pupdial BT: DEVM: $DEVM  BDADDR: $BDADDR  /peers/wvdial:\n`cat /etc/ppp/peers/wvdial`" >> /tmp/udevtrace-modem.log  #DEBUG
 fi #433 end
 [ "${WVAPN}" != "" ] \
  && [ -f /etc/wvdial_options/APN-${APNSTRING} ] \
  && echo "`cat /etc/wvdial_options/APN-${APNSTRING}`" >> /etc/ppp/peers/wvdial #431
 [ -f /etc/ppp/wvdial-pipe ] \
  && cp -f /etc/ppp/wvdial-pipe /etc/ppp/peers/ #v3.98
 wvdial ${WVISP} ${WVPIN} ${WVAPN} ${WVWRLS} &> /tmp/pupdial.log & #v413
 [ ! -f /tmp/pupdial.log ] && sleep 1 
 [ ! -f /tmp/pupdial.log ] && sleep 1 
 /usr/sbin/pupdial_wizard_helper & #101206
 Xdialog --center --wmclass "pupdial" --backtitle "$(gettext 'NOTICE: If the log shows a failure to connect, please click left button')" --title "$(gettext 'PupDial: WvDial connection log')" --ok-label "$(gettext 'DISCONNECT or stop trying')" --cancel-label "$(gettext 'CLOSE window but stay online')" --fixed-font --tailbox /tmp/pupdial.log 20 80 
 if [ $? -eq 0 ];then
  /usr/sbin/modemdisconnect #v433
  echo '' >> /tmp/pupdial.log
  echo '------------------------------------------------------' >> /tmp/pupdial.log
  echo '' >> /tmp/pupdial.log
  exec pupdial 2 #v3.91 go back to main window. 101218 pass param.
 fi
fi

###END###
