summaryrefslogtreecommitdiff
path: root/recipes-core/multitech/config/chat_wrapper
blob: 9db31887caf230ca2a38f8779d0f5279daa355bd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#!/bin/bash

# Rules for chat scripts
# No comments allowed at the end of AT+CGDCONT in chat script
# The last AT+CGDCONT= must use the same context as the dialer.
# If desired, The AT+CGDCONT may be prefixed by #MT[[:space:]]+
# Example:
#MT AT+CGDCONT="IPV6","data","192.168.2.1",0,1,"EXTRA"
#
# If you do not use a comment, the entire AT+CGDCONT command
# must be surrounded by apostrophes.  This command will be executed
# twice, once in the chat wrapper, and a 2nd time in the chat
# itself.
#
# The space after "#MT" may be any number including tabs.
# If #MT AT+CGDCONT= is found, only the last one is chosen.
# Any uncommented AT+CGDCONT= is then ignored.
# If there are not #MT AT+CGDCONT= lines, then any line without
# a comment chararacter before AT+CGDONT= is accepted, but only the
# last one in the file.

NAME=chat_wrapper
CONFIG=/etc/default/${NAME}
function finish
{
        ${LOG} "Launch:" "$@"
	exec "$@"
        # NOTREACHED
}

[[ -f $CONFIG ]] || exit 1

. ${CONFIG} 

: ${REGWAITTIME:=300}
: ${FINALWAIT:=5}

: ${LOG:="/usr/bin/logger -t ${NAME} -p daemon.notice"}

${LOG} Timeout is $REGWAITTIME, execute "$@" 
((i=$#))
chatscript="${!i}"
${LOG} Parsing chat script "$chatscript"

# CONTEXT is last context string in chat script
CONTEXT=$(egrep "^#MT[[:space:]]+(AT\+CGDCONT=.*)" ${chatscript} | tail -1)
if ((${#CONTEXT} == 0)) ; then
    CONTEXT=$(egrep "^[^#]+AT\+CGDCONT=" ${chatscript} | tail -1)
    [[ $CONTEXT =~ \'(AT\+CGDCONT=([0-9]+)[^$\']+) ]]
else
    [[ $CONTEXT =~ (AT\+CGDCONT=([0-9]+).*)$ ]]
fi

# CONTEXTNUM is the context number that is configured in the dialer.
CONTEXT="${BASH_REMATCH[1]}"
if ((${#CONTEXT} == 0)) ; then
	${LOG} No context specifiction in the chat script
        finish "$@"
	# NOTREACHED
fi
((CONTEXTNUM=${BASH_REMATCH[2]}))


${LOG} "Using Context ${CONTEXTNUM} based on chat script: ${CONTEXT}"

# At this point if there is no context number, we can skip everything else.

# Get Modem's context settings
MCONTEXT=$(/usr/bin/radio-cmd -t10 'AT+CGDCONT?' 2>&1 | tr -d '\r')
[[ $MCONTEXT =~ \+CGDCONT:[[:space:]]+${CONTEXTNUM},\"([^\"]*)\",\"([^\"]*)\",\"([^\"]*)\",([0-9]+),([0-9]+)([^$'\n']*) ]]

MPDP="${BASH_REMATCH[1]}"
MAPN="${BASH_REMATCH[2]}"
MADDR="${BASH_REMATCH[3]}"
MDCOMP="${BASH_REMATCH[4]}"
MHCOMP="${BASH_REMATCH[5]}"
MFULLBOAT="${BASH_REMATCH[6]}"

[[ $CONTEXT =~ AT\+CGDCONT=${CONTEXTNUM},\"([^\"]*)\",\"([^\"]*)\"(,\"([^\"]*)\"(,([0-9]+)(,([0-9]+)(,[^\']*))*)*)* ]]
PDP="${BASH_REMATCH[1]}"
APN="${BASH_REMATCH[2]}"
ADDR="${BASH_REMATCH[4]}"  # Optional
DCOMP="${BASH_REMATCH[6]}"  # Optional
HCOMP="${BASH_REMATCH[8]}"  # Optional
FULLBOAT="${BASH_REMATCH[9]}"  # Optional

if ((${#DCOMP} == 0)) ; then
	((DCOMP=0))  # Default
fi
if ((${#HCOMP} == 0)) ; then
	((HCOMP=0))  # Default
fi

# Only update context on a mismatch between chat and modem.
if [[ $MPDP != $PDP ]] || [[ $MAPN != $APN ]] || \
	[[ $MADDR != $ADDR ]] || ((MDCOMP != DCOMP)) || \
	((MHCOMP != HCOMP)) || \
	[[ $MFULLBOAT != $FULLBOAT ]] ; then
   ${LOG} "Modem context $MPDP,$MAPN,$MADDR,$MDCOMP,$HCOMP does not match chat script"
   ${LOG} "$MCONTEXT"
   ${LOG} "Dropping registration with carrier to set context"
   # Need to deregister
   /usr/bin/radio-cmd -t10 'AT+COPS=2'
   /usr/bin/radio-cmd -t10 "AT+CGDCONT=${CONTEXTNUM},\"${PDP}\",\"${APN}\",\"${ADDR}\",$DCOMP,${HCOMP}${FULLBOAT}"
   /usr/bin/radio-cmd -t10 'AT+COPS=0'
   ${LOG} "New context is set.  Wait up to $REGWAITTIME seconds to register"
   # Wait for registration
   uptime=$(cat /proc/uptime)
   [[ $uptime =~ ^([^\.]*) ]]
   t0=${BASH_REMATCH[1]}
   while ! [[ $(/usr/bin/radio-query --netreg) =~ ^REGISTERED$ ]] ; do
      sleep 5
      uptime=$(cat /proc/uptime)
      [[ $uptime =~ ^([^\.]*) ]]
      t1=${BASH_REMATCH[1]}
      if ((t1-t0 > REGWAITTIME)) ; then
	   ${LOG} "$((t1-t0)) seconds has expired"
      fi	
   done
   uptime=$(cat /proc/uptime)
   [[ $uptime =~ ^([^\.]*) ]]
   t1=${BASH_REMATCH[1]}
   ${LOG} "Re-registered in $((t1-t0)) seconds -- wait 5 more seconds"
   sleep $FINALWAIT
else
   ${LOG} "Context $CONTEXTNUM matches and nothing to do."
fi
finish "$@"
# NOTREACHED