#!/bin/sh
#Barry Kauler 2007 LGPL
#v405 overhauled.
#v408 rerwin: bugfix.
#Translated for Russian by Pro.

#[ ! $1 ] && exit
DEVM=$1
PARAM2=$2

MODEMDEV=""
if [ -h /dev/modem ];then
 MODEMDEV="`readlink /dev/modem`"
fi

#a fallback if user runs this script directly...
[ "$DEVM" = "" ] && [ "$MODEMDEV" = "" ] && exit
[ "$DEVM" = "" ] && [ "$MODEMDEV" != "" ] && DEVM="$MODEMDEV"

if [ "$PARAM2" = "initonly" ];then
 MSGSUCCESS="Отлично, модем был найден и от него получен ответ,для завершения \n
проверки модема, нужно определить подходящую строку инициализации.\n
Нажмите кнопку 'Yes' чтобы сделать это (рекомендуется), \n
или 'No' для отмены..."
else
 MSGSUCCESS="Отлично, получен ответ модема! \n
Нажмите кнопку 'yes' если вы хотите чтобы ссылка /dev/modem указывала на ${DEVM} и в файл\n
конфигурации /etc/wvdial.conf была записана строка 'Modem = /dev/${DEVM}. Будет сделана\n
также попытка определить соответствующую строку инициализации модема."
fi


#return the IRQ that respond to a given device...
irq_from_device_func() { #device passed in, ex: /dev/ttyS0
 #v1.0.2 it seems that setserial may be more trouble than its worth...
 #in the case of linmodems it often doesn't work...
 case ${1} in
  /dev/ttyS[0-9])
   set -- `setserial -v -b ${1} auto_irq skip_test autoconfig session_lockout`
   [ "$6" ] && echo $6 | tr -d \)
  ;;
  esac
}

#talk to modem, wait for response...
chat_with_func() { #device passed in.
 rm -f /tmp/answer.txt
 #TODO maybe send +++ to return modem to command-mode.
 #hangs if modem unplugged or turned off (contrary to what docs say)...
 modem-stats -c "ATZ" $1 > /tmp/answer.txt &
 sleep 3
 killall modem-stats
 if [ -e /tmp/answer.txt ];then
  if [ -s /tmp/answer.txt ];then #nonzero size.
   grep "^OK" /tmp/answer.txt > /dev/null 2>&1
   [ $? -eq 0 ] && return 0 #success
  fi
 fi
 return 1
}

modem_test_func() {
 [ "$DEVM" = "" ] && DEVM='invalid'
 #case $DEVM in
 #tty*)
  IRQM=$(irq_from_device_func /dev/${DEVM})
  fuser -k /dev/${DEVM} 2>/dev/null #kill processing attached to device.
  chat_with_func /dev/$DEVM
  if [ $? -eq 0 ];then
   if [ "$DEVM" = "$MODEMDEV" -a "$PARAM2" = "" ];then
    Xdialog --left --wmclass "pupdial" --title "PupDial: modem test" --no-cancel --msgbox "Отлично, получен ответ модема!" 0 0
   else 
    Xdialog --left --wmclass "pupdial" --title "PupDial: modem test" --no-cancel --yesno "${MSGSUCCESS}" 0 0
    if [ $? -eq 0 ];then
     yaf-splash -font "8x16" -outline 0 -margin 4 -bg orange -text "Пожалуйста подождите, обновление настроек..." &
     X9PID=$!
     ln -snf $DEVM /dev/modem
     #aPATTERN="s%^Modem = .*%Modem = ${DEVM}%"
     aPATTERN="s%^Modem = .*%Modem = /dev/${DEVM}%"  #v408 rerwin
     sed -e "$aPATTERN" /etc/wvdial.conf > /tmp/wvdial.conf.tmp
     [ $? -eq 0 ] && mv -f /tmp/wvdial.conf.tmp /etc/wvdial.conf
     waitmax 29 gen_modem_init_string > /dev/null #writes to /tmp/mymodeminitstring
     if [ -s /tmp/mymodeminitstring ];then
      INITSTRING="`cat /tmp/mymodeminitstring | tr '&' '~'`" #sed problem with &
      bPATTERN="s/^Init2.*/Init2 = ${INITSTRING}/"
      sed -e "$bPATTERN" /etc/wvdial.conf > /tmp/wvdial.conf.tmp
      if [ $? -eq 0 ];then
       cat /tmp/wvdial.conf.tmp | tr '~' '&' > /etc/wvdial.conf #restore &
      fi
     fi
     kill $X9PID
    fi
   fi
  else
   Xdialog --left --wmclass "pupdial" --title "PupDial: modem test" --no-cancel --msgbox "Извините, модем не был обнаружен." 0 0
  fi
 # ;;
 #*)
 #  Xdialog --center --wmclass "pupdial" --title "PupDial: modem test" --no-cancel --msgbox "There is no modem to test." 0 0
 # ;;
 #esac
}

modem_test_func

###END###
