Hi.
This looks better now, I still have some points though - sorry :)
Comments inline.
Index: openwrt/package/comgt/files/3g.sh
===================================================================
--- openwrt/package/comgt/files/3g.sh (revision 23584)
+++ openwrt/package/comgt/files/3g.sh (working copy)
@@ -11,8 +11,8 @@
local device
config_get device "$1" device
- # try to figure out the device if it's invalid
- [ -n "$device" -a -e "$device" ] || {
+ # try to figure out the device if it's not set
+ [ -n "$device" ] || {
for device in /dev/ttyUSB0 /dev/ttyUSB1 /dev/ttyUSB2 /dev/tts/2
/dev/usb/tts/0 /dev/noz0; do
[ -e "$device" ]&& {
config_set "$1" device "$device"
@@ -55,9 +55,41 @@
/sbin/insmod $module 2>&->&-
done
+ local initstring
+ config_get initstring "$config" initstring
+
local apn
config_get apn "$config" apn
+
+ local pdptype
+ config_get pdptype "$config" apnpdptype
+ [ -z "$pdptype" ]&& pdptype="IP"
+
+ local cid
+ config_get cid "$config" apncid
+ [ -z "$cid" ]&& cid=1
+
+ local apnextra1 apnextra2 apnextra3
+ local pdpaddr
+ config_get pdpaddr "$config" apnpdpaddr
+ [ -n "$pdpaddr" ]&& apnextra1=',\"'"$pdpaddr"'\"'
+
+ local dcomp
+ config_get dcomp "$config" dcomp
+ [ -n "$dcomp" ]&& apnextra2=",$dcomp"
+
+ local hcomp
+ config_get hcomp "$config" hcomp
+ [ -n "$hcomp" ]&& apnextra3=",$hcomp"
+ local username pppusername
+ config_get username "$config" username
+ [ -n "$username" ]&& pppusername="$username"
+
+ local password ppppassword
+ config_get password "$config" password
+ [ -n "$password" ]&& ppppassword="$password"
Username and password is handled in ppp.sh's start_pppd() already.
local service
config_get service "$config" service
@@ -104,7 +136,7 @@
esac
set_3g_led 1 0 0
- config_set "$config" "connect" "${apn:+USE_APN=$apn }/usr/sbin/chat -t5 -v
-E -f $chat"
+ config_set "$config" "connect" "${apn:+USE_APN=$apn } ATEXTRA='$initstring'
EXTRA=${apnextra1}${apnextra2}${apnextra3} ${cid:+CID=$cid } ${pdptype:+PDP=$pdptype } /usr/sbin/chat -t5 -v
-E -f $chat"
start_pppd "$config" \
noaccomp \
nopcomp \
@@ -114,5 +146,7 @@
lock \
crtscts \
${mtu:+mtu $mtu mru $mtu} \
+ ${pppusername:+user "$pppusername"} ${ppppassword:+password
"$ppppassword"} \
Dito.
115200 "$device"
}
+
Index: openwrt/package/comgt/files/serialmodem.hotplug
===================================================================
--- openwrt/package/comgt/files/serialmodem.hotplug (revision 0)
+++ openwrt/package/comgt/files/serialmodem.hotplug (revision 0)
@@ -0,0 +1,9 @@
+#!/bin/sh
+
+case "$ACTION" in
+ add)
+ # update LEDs
+ /etc/init.d/serialmodem start
This comment should be fixed.
+ ;;
+esac
+
Index: openwrt/package/comgt/files/serialmodem.init
===================================================================
--- openwrt/package/comgt/files/serialmodem.init (revision 0)
+++ openwrt/package/comgt/files/serialmodem.init (revision 0)
@@ -0,0 +1,239 @@
+#!/bin/sh /etc/rc.common
+# Copyright (C) 2006 OpenWrt.org
It's 2010 :) Also your own name is fine.
+
+START=95
+
+myname=serialmodem
+
+. /etc/functions.sh
+config_load $myname
+
+log1 () {
+ [ "$debug" -ge "1" ]&& logger -t "$myname" $logparm $*
+}
+log2 () {
+ [ "$debug" -ge "2" ]&& logger -t "$myname" $logparm $*
+}
+log () {
+ logger -t "$myname" $logparm $*
+}
Where is "$logparm" defined?
+shortdev () {
+ echo "$1" | tr '/' '_'
+}
Can be inlined and rewritten as "${var//"/"/_}".
+
+setstate () {
+ uci -q -P /var/state set serialmodem.$1
+}
+getstate () {
+ uci -q -P /var/state get serialmodem.$1
+}
There is already "uci_set_state" and "uci_get_state" imported by
functions.sh .
+open_port () {
+ local dev=$(shortdev "$1")
local dev="${1//"/"/_}"
+ setstate ${dev}=group
uci_set_state serialmodem "$dev" "" group
+ if [ "$(getstate ${dev}.found)" = "1" ]; then
uci_get_state serialmodem "$dev" found
+ log2 "$1 already found by another group. Skipping"
+ return 1
+ fi
+ if [ "$(getstate ${dev}.ismodem)" = "0" ]; then
dito.
+ log2 "$1 is not modem. Skipping"
+ return 1
+ fi
+ if ! gcom -d "$1" -s /etc/gcom/testport.gcom</dev/null>/dev/null; then
+ setstate ${dev}.ismodem=0
dito.
+ log2 "$1 is not modem. Skipping"
+ fi
+}
+
+unlock_sim () {
+ local dev=$(shortdev "$1")
Same as above, inline substitution
+ if [ "$(getstate ${dev}.unlocked)" = "1" ]; then
uci_get_state
+ log2 "$1 is already unlocked."
+ return 1
+ fi
+ if [ -n "$2" ]; then COMGTPIN="$2" gcom -d "$1"
PIN</dev/null>/dev/null; fi
+ setstate ${dev}.unlocked=1
uci_set_state
+ log2 "$1 unlocked. Sleeping for $regwait seconds"
+ sleep $regwait
+}
+
+device_found () {
+ local dev=$(shortdev "$1")
inline substitution
+ mkdir -p $(dirname "$2")
+ ln -sf "$1" "$2"
+ log "[$3]: Found $1 => $2"
+ setstate ${dev}.found=1
uci_set_state
+ [ -n "$4" ]&& { log "Triggering interface $4 up"
+ ifup "$4"
+ setstate ${dev}.ifup="$4"
uci_set_state
+ }
+}
+
+processgroup () {
+ local group=$1
+ local devices
+ local maxwait
+ local deviceonly="$2"
+
+ config_get type "$group" linkby
+ config_get maxwait "$group" maxwait 2
+ config_get pin "$group" pin
+ [ -z "$type" ]&& { log1 "No type in group $group. Skipping.";
continue; }
better use "return" here
+
+ log2 "Processing group [$group]"
+ local networkid
+ config_get networkid "$group" networkid
+ local imei
+ config_get imei "$group" imei
+ local cimi
+ config_get cimi "$group" cimi
+ local linkto
+ config_get linkto "$group" linkto
+ local extcmd
+ config_get extcmd "$group" extcmd
+ local ifup
+ config_get ifup "$group" ifup
+ devices=$(config_get "$group" devices)
uci_get_state is better suited here
+ log2 "[$group]: Searching by $type on devices ($devices)"
+
+ case $type in
+ comgt-networkid)
+ for d in $devices; do
+ if ! [ -r $d ]; then
+ log2 "[$group]: $d not readable"
+ continue
return
+ fi
+ if open_port $d; then
+ unlock_sim $d $pin
+ local dnetworkid=$(gcom -d $d reg | tee -a $base.log
| awk '/network:(.*)/ {print $5}' | tr -d '"')
if you have awk, you don't need tr ... please do the char deletion in
awk as well, saves an extra fork.
+ if [ "$networkid" == "$dnetworkid" ] || [ -z
"$networkid" ]; then
+ [ -z "$linkto" ]&&
linkto=/dev/gsm/$dnetworkid
+ device_found $d $linkto $group $ifup
+ break
+ fi
+ else
+ log2 "chat on $d exited with $?"
+ fi
+ done
+ ;;
+
+ comgt-imei)
+ if [ -z "$imei" ]; then
+ log1 "Missing imei option. Skipping group $group."
+ continue
return
+ fi
+ if [ -z "$linkto" ]; then
+ log1 "Missing linkto option. Skipping group $group."
+ continue
return
+ fi
+ local ifup
+ for d in $(config_get "$group" devices); do
+ if ! [ -r $d ]; then
+ log2 "[$group]: $d not readable"
+ continue
+ fi
+ if open_port $d; then
+ unlock_sim $d $pin
+ local dimei=$(gcom -d $d info | awk '/IMEI(.*)(\d*)/
{print $6}' | tr -d '"')
same, do it in awk and dump tr
+ if [ "$imei" == "$dimei" ]; then
+ device_found $d $linkto $group $ifup
+ break
+ fi
+ else
+ log2 "[$group]: chat on $d exited with $?"
+ fi
+ done
+ ;;
+
+ comgt-cimi)
+ if [ -z "$cimi" ]; then
+ log1 "Missing cimi option. Skipping group $group."
+ continue
return
+ fi
+ if [ -z "$linkto" ]; then
+ log1 "Missing linkto option. Skipping group $group."
+ continue
return
+ fi
+ for d in $(config_get "$group" devices); do
+ if ! [ -r $d ]; then
+ log2 "[$group]: $d not readable"
+ continue
+ fi
+ if open_port $d; then
+ unlock_sim $d $pin
+ local dcimi=$(gcom -d $d -s /etc/gcom/getcimi.gcom |
awk '/CIMI\:(.*)(\d*)/ {print $2}' | tr -d '"')
+ if echo $dcimi | grep -qE "^$cimi"; then
+ device_found $d $linkto $group $ifup
+ break
+ fi
+ else
+ log2 "[$group]: chat on $d exited with $?"
+ fi
+ done
+ ;;
+
+ extcmd)
+ if [ -z "$linkto" ]; then
+ log1 "Missing linkto option. Skipping group $group."
+ continue
return
+ fi
+ for d in $(config_get "$group" devices); do
+ if ! [ -r $d ]; then
+ log2 "[$group]: $d not readable"
+ continue
+ fi
+ if $extcmd<$d>$d; then
+ device_found $d $linkto $group $ifup
+ break
+ fi
+ done
+ echo
+ ;;
+ *)
+ log1 "[$group]: Unknown linkby option"
+ continue
return
+ ;;
+ esac
+ true
+}
+
+listgroups () {
+ echo "$1"
+}
+
+
+start () {
+ config_load $myname
+ local cfg=$(config_foreach listgroups globals)
That should be the same as local cfg="$CONFIG_SECTIONS" ...
+ config_get prewait $cfg prewait
... and that will fail if there are multiple "globals" sections.
Either keep "listgroups()" and abort the iteration early with "return 1"
or bail out here if > 1.
+ config_get regwait $cfg regwait
+ config_get debug $cfg debug
+ config_get_bool fork $cfg fork
+ if [ -z "$fork" ]; then
+ startfork $*&
+ else
+ startfork $*
+ fi
+}
I'm not sure whether its a good idea to give the user control over
forking or not forking, this is an init script which could halt the
whole boot process. I'd say always fork.
+startfork () {
+ if [ -n "$1" ]; then
+ base=$myname-$(basename "$1")
base="$myname-${1##*/}", one less subshell/fork.
+ else
+ base=$myname
+ fi
+ if [ -f /var/lock/$base.lock ]; then
+ log "Lock /var/lock/$base.lock active! Exiting. "; exit 1;
+ fi
+ touch /var/lock/$base.lock
Maybe consider /bin/lock here.
+ groups=$(config_foreach listgroups group)
This...
+ if [ -n "$prewait" ]; then
+ log "Sleeping for $prewait secs."; sleep $prewait;
+ fi
+ for g in $groups; do
+ processgroup "$g" "$1"
+ done
... and this could be changed to:
config_foreach processgroup groups "$1"
+ rm -f /var/lock/$base.lock
+}
+
Property changes on: openwrt/package/comgt/files/serialmodem.init
___________________________________________________________________
Added: svn:executable
+ *
Index: openwrt/package/comgt/files/getcimi.gcom
===================================================================
--- openwrt/package/comgt/files/getcimi.gcom (revision 0)
+++ openwrt/package/comgt/files/getcimi.gcom (revision 0)
@@ -0,0 +1,14 @@
+opengt
+ set com 115200n81
+ set comecho off
+ set senddelay 0.02
+ waitquiet 0.5 0.5
+ flash 0.1
+
+:start
+ send "AT+CIMI^m"
+ get 1 "" $s
+ print $s
+
+:continue
+ exit 0
Index: openwrt/package/comgt/files/3g.chat
===================================================================
--- openwrt/package/comgt/files/3g.chat (revision 23584)
+++ openwrt/package/comgt/files/3g.chat (working copy)
@@ -5,8 +5,10 @@
TIMEOUT 10
"" "AT&F"
OK "ATE1"
-OK 'AT+CGDCONT=1,"IP","$USE_APN"'
+OK "AT$ATEXTRA"
+OK 'AT+CGDCONT=$CID,"$PDP","$USE_APN"$EXTRA'
SAY "Calling UMTS/GPRS"
TIMEOUT 30
-OK "ATD*99***1#"
-CONNECT ' '
+OK "ATDT*99#"
+~ ' '
+
Index: openwrt/package/comgt/files/testport.gcom
===================================================================
--- openwrt/package/comgt/files/testport.gcom (revision 0)
+++ openwrt/package/comgt/files/testport.gcom (revision 0)
@@ -0,0 +1,16 @@
+opengt
+ set com 38400n81
+ set comecho off
+ set senddelay 0.02
+ waitquiet 0.2 0.2
+ flash 0.1
+
+:start
+ send "ATZ^m"
+ send "ATZ^m"
+ waitfor 3 "OK"
+ if % = 0 goto continue
+ exit 1
+
+:continue
+ exit 0
Index: openwrt/package/comgt/Makefile
===================================================================
--- openwrt/package/comgt/Makefile (revision 23584)
+++ openwrt/package/comgt/Makefile (working copy)
@@ -9,7 +9,7 @@
PKG_NAME:=comgt
PKG_VERSION:=0.32
-PKG_RELEASE:=4
+PKG_RELEASE:=6
PKG_SOURCE:=$(PKG_NAME).$(PKG_VERSION).tgz
PKG_SOURCE_URL:=...@sf/comgt
@@ -55,10 +55,16 @@
$(INSTALL_DIR) $(1)/etc/hotplug.d/iface
$(INSTALL_DATA) ./files/3g.iface $(1)/etc/hotplug.d/iface/05-3g
$(INSTALL_DIR) $(1)/etc/gcom
+ $(INSTALL_DIR) $(1)/etc/init.d
+ $(INSTALL_BIN) ./files/serialmodem.init $(1)/etc/init.d/serialmodem
+ $(INSTALL_DIR) $(1)/etc/hotplug.d/usb
+ $(INSTALL_BIN) ./files/serialmodem.hotplug
$(1)/etc/hotplug.d/usb/20-serialmodem
Hotplug scripts do not need to be executable.
$(INSTALL_DATA) ./files/setpin.gcom $(1)/etc/gcom/setpin.gcom
$(INSTALL_DATA) ./files/setmode.gcom $(1)/etc/gcom/setmode.gcom
$(INSTALL_DATA) ./files/getcardinfo.gcom $(1)/etc/gcom/getcardinfo.gcom
$(INSTALL_DATA) ./files/getstrength.gcom $(1)/etc/gcom/getstrength.gcom
+ $(INSTALL_DATA) ./files/testport.gcom $(1)/etc/gcom/testport.gcom
+ $(INSTALL_DATA) ./files/getcimi.gcom $(1)/etc/gcom/getcimi.gcom
endef
$(eval $(call BuildPackage,comgt))
_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel
_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel