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

Reply via email to