#! /bin/bash # # $Id$ # http://www.jankratochvil.net/project/line9k/ # Modem / Nokia 9110 incoming GSM data gate # # /etc/ppp/chap-secrets: # Secrets for authentication using CHAP # client server secret IP addresses # username1a line9k secret1a 192.168.90.11 # username1b line9k secret1b 192.168.90.11 # username2 linecr secret2 192.168.90.12 # # /etc/inittab: # l9:2345:respawn:/usr/local/sbin/line9k line9k # lc:2345:respawn:/usr/local/sbin/line9k linecr # # Charger scheme: # 1N4148 # RS232 DTR------|>|------ --------------+-------------- ----AC conn. # | | | | | # ) / | 1N4148 ) / # ) / ----|>|---- ) / # 680R ) -- | ) -- # ______ | | | | | # RS232 GND----|______|--- ----PS/2 +5V PS/2 GND-+-- ----AC conn. # RELSIA05-500 RAS-0515 # # Manual charge control: # /usr/local/sbin/line9k charge on # Force charging on # /usr/local/sbin/line9k charge off # Automatic charging # /usr/local/sbin/line9k charge # Query charging force device=$1 # Local IP address of setup pointtopoint interfaces LOCAL_IP=192.168.90.10 # Nameserver for remote clients: NS=192.168.90.10 # Percent of battery where charging starts charge_force_le=50; # Charger control port charge_ttyS=/dev/ttyS0 # Time in seconds to charge the battery after reaching 100% state max_limit_time=$[3*60*60]; case $device in line9k) PORT=/dev/ttyS4 # 9110 BAUD=19200 # Local IP address of setup pointtopoint interfaces REMOTE_IP=192.168.90.11 RINGS=1 OPTIONS="-crtscts xonxoff asyncmap a0000" # "server" field in /etc/ppp/chap-secrets AUTH_NAME=line9k CHARGE=true ;; linecr) PORT=/dev/ttyS3 # Courier BAUD=57600 REMOTE_IP=192.168.90.12 RINGS=7 OPTIONS="crtscts asyncmap 0" AUTH_NAME=linecr CHARGE=false ;; ############################################################################## # Configuration section ends here. ############################################################################## charge) function chargestate { echo -n "Charging force: " if test -f $charge_ttyS.charge;then echo "YES" else echo "NO" fi } chargestate if [ "$2" = on -o "$2" = yes ];then echo "CHANGED: YES" touch $charge_ttyS.charge baud=9600 elif [ "$2" = off -o "$2" = no ];then echo "CHANGED: NO" rm -f $charge_ttyS.charge baud=0 fi stty -F $charge_ttyS -hup clocal $baud 2>/dev/null [ -n "$2" ] && chargestate exit 0 ;; *) echo "Unknown device: $device" exit 1 esac RING1='"RING" "\c"' RINGSTR="" while [ $RINGS -gt 0 ];do # FIXME: timeout is not reset after stray ring(s) RINGSTR="$RINGSTR $RING1" RINGS=$[$RINGS-1] done LOGGER="logger -i -t $device" # Use single AT/OK after ATZ to set terminal speed for USRobotics Courier exec pppd "$PORT" "$BAUD" modem lock $OPTIONS $LOCAL_IP:$REMOTE_IP ms-dns "$NS" \ connect ' charge_val_last=-1; baud_last=0; limit_date_last=0; aborts='\'' ABORT "ERROR" ABORT "BUSY" ABORT "NO\sANSWER" ABORT "NO\sCARRIER" ABORT "NO\sDIAL\sTONE" ABORT "VOICE" '\''; rc=3; while test $rc -eq 3; do chat \ TIMEOUT 1 \ "" "ATZ" \ "OK-ATZ-OK" "AT" \ ABORT "+CBC: 0,0" \ ABORT "+CBC: 0,25" \ ABORT "+CBC: 0,50" \ ABORT "+CBC: 0,75" \ ABORT "+CBC: 0,100" \ "OK" \ '"`if $CHARGE;then echo "AT+CBC" NOTREACHED;fi`"' \ "\c" \ ; rc=$?; test $rc -eq 0 -o $rc -ge 4 || exit $rc; if '$CHARGE';then charge_arr=(0 25 50 75 100); charge_val=${charge_arr[$[$rc-4]]}; charge_force_le='$charge_force_le'; charge_limit_gt=99; max_limit_time='$max_limit_time'; baud=$baud_last; charge_ttyS='$charge_ttyS'; if test -f $charge_ttyS.charge;then baud=nocontrol; else if test $baud = nocontrol;then baud=0; fi; if test $charge_val -le $charge_force_le;then baud=9600;fi; if test $charge_val -gt $charge_limit_gt;then limit_date=$[`date +%s`]; if test $limit_date_last -eq 0;then limit_date_last=$limit_date; if test $baud -ne 0;then '"$LOGGER"' "CHARGE state: full-stage charging entered"; fi; else if test $baud -ne 0 -a $[$limit_date-$limit_date_last] -gt $max_limit_time;then '"$LOGGER"' "CHARGE state: full-stage charging terminated"; baud=0; fi; fi; else limit_date_last=0; fi; fi; if test $charge_val_last -ne $charge_val -o $baud_last '!=' $baud;then '"$LOGGER"' "CHARGE state: charge=$charge_val; baud=$baud"; fi; charge_val_last=$charge_val; baud_last=$baud; if test $baud '!=' nocontrol;then stty -F $charge_ttyS -hup clocal $baud 2>/dev/null; fi; fi; chat \ $aborts \ TIMEOUT 590 \ '"$RINGSTR"' \ ; rc=$?; test $rc -eq 0 -o $rc -eq 3 || exit $rc; done chat -v $aborts \ TIMEOUT 40 \ REPORT "CONNECT" \ "" "ATA" \ "CONNECT" "\c" \ "^M" "\c" \ ; rc=$?; test $rc -eq 0 || exit $rc; baud=9600; stty -F $charge_ttyS -hup clocal $baud 2>/dev/null; ' \ -ccp nodefaultroute lcp-echo-interval 30 lcp-echo-failure 4 lcp-max-configure 30 -detach debug nologfd kdebug 255 \ require-chap -pap auth name $AUTH_NAME