Proposed Asterisk Dialplan
From LinuxMCE
Revision as of 14:51, 22 July 2013 by Foxi352 (Talk | contribs) (→Call to extension - Context: ext-local)
We desperately need to write a new Asterisk dial plan to replace the AMP generated one that has become far too bit-rotten to be of any substantial use. This page will track the conceptual flow of what will be needed for the new post Asterisk 1.8+ dialplan.
This is being added to, as I write more and more of the schema, and will get much...much bigger. --Tschak909 07:30, 18 July 2013 (CEST)
Contents
Dial Plan Flow
Call from outside line (1xx)
- Call comes in from outside line
- Get house mode and branch between five possible states:
- Ring extensions
- All checked extensions (2xx) are rung in parallel.
- Transfer to a specific user
- Transfer to specified (3xx) extension
- Go to a specific user's voicemail
- Transfer to selected user's voicemail
- Present a menu to select Home user (101)
- Is the number listed in Callers for me(?) for a user.
- Transfer to user extension. (3xx)
- Present menu audio, and select between options:
- If explicit extension is selected, ring said extension. (Do we want to allow all extensions to be pressed here?)
- If User number is selected, Transfer to user (3xx)
- If General Voicemail, drop to general voicemail box (100)
- Is the number listed in Callers for me(?) for a user.
- Transfer to outside number
- Dial outside #
- Ring extensions
- Get house mode and branch between five possible states:
Ring specific extension (2xx)
- Does current house mode allow extension to be rang?
- No? Bounce to Menu (101)
- Yes? ...then
- Ring specified extension
- While ringing, user has the opportunity to:
- Transfer to a specific phone (2xx)
- Transfer to a specific user (3xx)
- Transfer to an outside number (dial specified number given to dial pad)
- dial someone else in to conference before we all pick up (this is strange, but the button is there!)
- Send to General voicemail (100)
- Drop the call
- If extension does not pick up within specified IVR delay time, Transfer to (101) for IVR menu
- While ringing, user has the opportunity to:
- Ring specified extension
Ring specific user (3xx)
- Find user via AGI script, map to a list of (2xx) extensions.
- Is number on Priority caller list?
- No, it is a normal caller, Process normal caller routing (see normal/priority user routing below)
- Yes, it is a priority caller, Process priority caller routing (see normal/priority user routing below)
Normal/Priority User Routing
For each user, there is a set of routing steps to be executed serially, depending on if the user is a normal or priority caller, and then based on the current USER mode. A user is a priority caller if they are listed in the priority callers list. Any number of steps can be created, and a dial plan segment should be created for each one.
- Get house mode
- If Normal caller, select normal caller steps given house mode
- If Priority caller, select priority caller steps given house mode
- If checkbox is selected for give option for voicemail, play message, listen for "#"
- If checkbox selected, and If # pressed, go to user voicemail
- Execute next step which is one of four possible states: (TOP)
- Ring Extensions
- Parallel ring selected extensions (2xx)
- Transfer to another user
- Transfer call to specified (3xx) extension
- Go to user's voicemail
- Transfer call to specified user voicemail
- Transfer to an outside number
- Ring Extensions
- Loop back around to (TOP)
- If all instructions are carried out and still unresolved, drop back to menu (101)
Security Plugin Phone Extensions
Security Notfiications (999)
- run AGI to determine which rooms have been affected, generate audio message
- Determine priority in the following order
- Orbiters then Other numbers (uses one outgoing channel)
- Ring each orbiter for 15 seconds, if no answer, then ring the next orbiter
- If answer, Play Security IVR
- If no more orbiters, ring each "other number" for 15 seconds, if no answer, then ring next other number.
- If answer, Play security IVR
- (what to do here if everybody has been rung, and no answer?)
- Ring each orbiter for 15 seconds, if no answer, then ring the next orbiter
- Other numbers then Orbiters (uses one outgoing channel)
- Ring each "other number" for 15 seconds, if no answer, then ring the next number.
- If answer, Play security IVR
- If no more "other numbers", ring each Orbiter for 15 seconds, if no answer, then ring the next orbiter.
- Ring each "other number" for 15 seconds, if no answer, then ring the next number.
- Both orbiters and other numbers at the same time. (uses two outgoing channels)
- spawn two threads, one for "Orbiters" one for "Other numbers", for each thread
- Ring each number for 15 seconds, if no answer, then ring the next number.
- If answer, Play security IVR
- (What to do when all numbers have been rung?)
- Ring each number for 15 seconds, if no answer, then ring the next number.
- spawn two threads, one for "Orbiters" one for "Other numbers", for each thread
- Orbiters then Other numbers (uses one outgoing channel)
Security IVR
- 1 to Reset the Alarm
- Play "Alarm has been reset."
- 2 to Ignore the alarm
- 3 to call emergency contacts
- 4 to Notify neighbors
- 5 to speak to the person in the house
Lists for...
House Modes
- Armed - At Home
- Armed - Away
- Armed - Extended Away
- Entertaining
- Sleeping
- Unarmed - At Home
User Modes
- At Home
- Away
- Do Not Disturb
- Sleeping
Incoming Call extensions
- 100 - General Voicemail box
- 101 - IVR menu
Example Phone extensions
- 201 - Living Room
- 202 - Bedroom Master
- 203 - Den
- ...
Example User extensions
- 301 - Thom
- 302 - Lana
- 303 - Nina
- ...
Example User voicemail extensions
- 401 - Thom
- 402 - Lana
- 403 - Nina
Security Extensions
- 999 - Security
- 998 - Fire
- 997 - Air Quality
- 996 - Movement
- 995 - Information
- 994 - Doorbell
- 993 - Monitor Mode
- 992 - Babysitter Mode
- 991 - Speak to person inside house (this needs to be changed in all the code, this was 998)
Contexts
- from-trunk - Calls from outside lines
- from-internal - Calls originating from inside the system
Actual dialplan
Call to extension - Context: ext-local
- This is an example of a standard SIP phone extension 204
+-------+----------+--------+-------------------+ | exten | priority | app | appdata | +-------+----------+--------+-------------------+ | 204 | 1 | Macro | exten-vm,novm,204 | | 204 | 2 | Hangup | | +-------+----------+--------+-------------------+
- The macro itself is still in the extensions.conf file (flatfile)
[macro-exten-vm] exten => s,1,Macro(user-callerid) exten => s,n,Set(FROMCONTEXT=exten-vm) exten => s,n,Set(VMBOX=${ARG1}) exten => s,n,Set(EXTTOCALL=${ARG2}) exten => s,n,Set(CFUEXT=${DB(CFU/${EXTTOCALL})}) exten => s,n,Set(CFBEXT=${DB(CFB/${EXTTOCALL})}) exten => s,n,Set(RT=${IF($[$["${VMBOX}"!="novm"] | $["foo${CFUEXT}"!="foo"]]?${RINGTIMER}:"")}) exten => s,n,Macro(record-enable,${EXTTOCALL},IN) exten => s,n,Macro(dial,${RT},${DIAL_OPTIONS},${EXTTOCALL}) exten => s,n,Set(SV_DIALSTATUS=${DIALSTATUS}) exten => s,n,GosubIf($[$["${SV_DIALSTATUS}"="NOANSWER"] & $["foo${CFUEXT}"!="foo"]]?docfu,1) ; check for CFU in use on no answer exten => s,n,GosubIf($[$["${SV_DIALSTATUS}"="BUSY"] & $["foo${CFBEXT}"!="foo"]]?docfb,1) ; check for CFB in use on busy exten => s,n,Set(DIALSTATUS=${SV_DIALSTATUS}) exten => s,n,NoOp(Voicemail is '${VMBOX}') exten => s,n,GotoIf($["${VMBOX}" = "novm"]?s-${DIALSTATUS},1) ; no voicemail in use for this extension exten => s,n,NoOp(Sending to Voicemail box ${EXTTOCALL}) exten => s,n,Macro(vm,${VMBOX},${DIALSTATUS}) exten => docfu,1,Set(RTCFU=${IF($["${VMBOX}"!="novm"]?${RINGTIMER}:"")}) exten => docfu,n,Dial(Local/${CFUEXT}@from-internal/n,${RTCFU},${DIAL_OPTIONS}) exten => docfu,n,Return exten => docfb,1,Set(RTCFB=${IF($["${VMBOX}"!="novm"]?${RINGTIMER}:"")}) exten => docfb,n,Dial(Local/${CFBEXT}@from-internal/n,${RTCFB},${DIAL_OPTIONS}) exten => docfb,n,Return exten => s-BUSY,1,NoOp(Extension is reporting BUSY and not passing to Voicemail) exten => s-BUSY,n,Playtones(busy) exten => s-BUSY,n,Busy(20) exten => _s-.,1,Playtones(congestion) exten => _s-.,n,Congestion(10)
Call to user - Context: from-lmce-custom
- This context handles the call to a user, means 3xx number
- This is only an example. Actual dialplan depends on routing choosen in "Webadmin -> Telecom -> Call Routing"
+-------------------------------+----------+--------+----------------------------------------------------------------------------+ | exten | priority | app | appdata | +-------------------------------+----------+--------+----------------------------------------------------------------------------+ | 301 | 1 | AGI | lmce-getusermode.agi | | 301 | 2 | Goto | from-lmce-custom,301-um${USERMODE}-pri${PRIORITYCALLER},1 | | 301 | 3 | Hangup | | | 301-um1-pri0 | 1 | Goto | from-lmce-custom,301-um1-pri0-try1,1 | | 301-um1-pri0-try1 | 1 | Macro | vm,301,DIRECTDIAL | | 301-um1-pri0-try1 | 2 | Goto | from-lmce-custom,301-um1-pri0-try1-${DIALSTATUS},1 | | 301-um1-pri0-try1 | 3 | Hangup | | | 301-um1-pri0-try1-BUSY | 1 | Goto | from-lmce-custom,301-um1-pri0-try2,1 | | 301-um1-pri0-try1-CHANUNAVAIL | 1 | Goto | from-lmce-custom,301-um1-pri0-try2,1 | | 301-um1-pri0-try1-CONGESTION | 1 | Goto | from-lmce-custom,301-um1-pri0-try2,1 | | 301-um1-pri0-try1-NOANSWER | 1 | Goto | from-lmce-custom,301-um1-pri0-try2,1 | | 301-um1-pri0-try2 | 1 | Macro | vm,301,DIRECTDIAL | | 301-um1-pri0-try2 | 2 | Hangup | | | 301-um2-pri0 | 1 | Goto | from-lmce-custom,301-um2-pri0-try1,1 | | 301-um2-pri0-try1 | 1 | Macro | vm,301,DIRECTDIAL | | 301-um2-pri0-try1 | 2 | Goto | from-lmce-custom,301-um2-pri0-try1-${DIALSTATUS},1 | | 301-um2-pri0-try1 | 3 | Hangup | | | 301-um2-pri0-try1-BUSY | 1 | Goto | from-lmce-custom,301-um2-pri0-try2,1 | | 301-um2-pri0-try1-CHANUNAVAIL | 1 | Goto | from-lmce-custom,301-um2-pri0-try2,1 | | 301-um2-pri0-try1-CONGESTION | 1 | Goto | from-lmce-custom,301-um2-pri0-try2,1 | | 301-um2-pri0-try1-NOANSWER | 1 | Goto | from-lmce-custom,301-um2-pri0-try2,1 | | 301-um2-pri0-try2 | 1 | Macro | vm,301,DIRECTDIAL | | 301-um2-pri0-try2 | 2 | Hangup | | | 301-um3-pri0 | 1 | Goto | from-lmce-custom,301-um3-pri0-try1,1 | | 301-um3-pri0-try1 | 1 | Macro | vm,301,DIRECTDIAL | | 301-um3-pri0-try1 | 2 | Goto | from-lmce-custom,301-um3-pri0-try1-${DIALSTATUS},1 | | 301-um3-pri0-try1 | 3 | Hangup | | | 301-um3-pri0-try1-BUSY | 1 | Goto | from-lmce-custom,301-um3-pri0-try2,1 | | 301-um3-pri0-try1-CHANUNAVAIL | 1 | Goto | from-lmce-custom,301-um3-pri0-try2,1 | | 301-um3-pri0-try1-CONGESTION | 1 | Goto | from-lmce-custom,301-um3-pri0-try2,1 | | 301-um3-pri0-try1-NOANSWER | 1 | Goto | from-lmce-custom,301-um3-pri0-try2,1 | | 301-um3-pri0-try2 | 1 | Macro | vm,301,DIRECTDIAL | | 301-um3-pri0-try2 | 2 | Hangup | | | 301-um3-pri1-try1 | 1 | Dial | Local/200@trusted&Local/202@trusted&Local/203@trusted&Local/204@trusted,15 | | 301-um3-pri1-try1 | 2 | Goto | from-lmce-custom,301-um3-pri1-try1-${DIALSTATUS},1 | | 301-um3-pri1-try1 | 3 | Hangup | | | 301-um3-pri1-try1-BUSY | 1 | Goto | from-lmce-custom,301-um3-pri1-try2,1 | | 301-um3-pri1-try1-CHANUNAVAIL | 1 | Goto | from-lmce-custom,301-um3-pri1-try2,1 | | 301-um3-pri1-try1-CONGESTION | 1 | Goto | from-lmce-custom,301-um3-pri1-try2,1 | | 301-um3-pri1-try1-NOANSWER | 1 | Goto | from-lmce-custom,301-um3-pri1-try2,1 | | 301-um3-pri1-try2 | 1 | Macro | vm,301,DIRECTDIAL | | 301-um3-pri1-try2 | 2 | Hangup | | | 301-um4-pri0 | 1 | Goto | from-lmce-custom,301-um4-pri0-try1,1 | | 301-um4-pri0-try1 | 1 | Macro | vm,301,DIRECTDIAL | | 301-um4-pri0-try1 | 2 | Goto | from-lmce-custom,301-um4-pri0-try1-${DIALSTATUS},1 | | 301-um4-pri0-try1 | 3 | Hangup | | | 301-um4-pri0-try1-BUSY | 1 | Goto | from-lmce-custom,301-um4-pri0-try2,1 | | 301-um4-pri0-try1-CHANUNAVAIL | 1 | Goto | from-lmce-custom,301-um4-pri0-try2,1 | | 301-um4-pri0-try1-CONGESTION | 1 | Goto | from-lmce-custom,301-um4-pri0-try2,1 | | 301-um4-pri0-try1-NOANSWER | 1 | Goto | from-lmce-custom,301-um4-pri0-try2,1 | | 301-um4-pri0-try2 | 1 | Macro | vm,301,DIRECTDIAL | | 301-um4-pri0-try2 | 2 | Hangup | | | 301-um4-pri1 | 1 | Goto | from-lmce-custom,301-um4-pri1-try1,1 | | 301-um4-pri1-try1 | 1 | Dial | Local/200@trusted&Local/202@trusted&Local/203@trusted&Local/204@trusted,15 | | 301-um4-pri1-try1 | 2 | Goto | from-lmce-custom,301-um4-pri1-try1-${DIALSTATUS},1 | | 301-um4-pri1-try1 | 3 | Hangup | | | 301-um4-pri1-try1-BUSY | 1 | Goto | from-lmce-custom,301-um4-pri1-try2,1 | | 301-um4-pri1-try1-CHANUNAVAIL | 1 | Goto | from-lmce-custom,301-um4-pri1-try2,1 | | 301-um4-pri1-try1-CONGESTION | 1 | Goto | from-lmce-custom,301-um4-pri1-try2,1 | | 301-um4-pri1-try1-NOANSWER | 1 | Goto | from-lmce-custom,301-um4-pri1-try2,1 | | 301-um4-pri1-try2 | 1 | Macro | vm,301,DIRECTDIAL | | 301-um4-pri1-try2 | 2 | Hangup | | +-------------------------------+----------+--------+----------------------------------------------------------------------------+
Context: applications
Extension: *43 - echotest
+----------+----------+---------------+ | priority | app | appdata | +----------+----------+---------------+ | 1 | Answer | | | 2 | Wait | 1 | | 3 | Playback | demo-echotest | | 4 | Playback | beep | | 5 | Echo | | | 6 | Playback | demo-echodone | | 7 | Hangup | | +----------+----------+---------------+
Extension: *60 - speaking clock
+----------+-------------+---------------------------------------+ | priority | app | appdata | +----------+-------------+---------------------------------------+ | 1 | Answer | | | 2 | Wait | 1 | | 3 | Set | NumLoops=0 | | 4 | Set | FutureTime=$[${EPOCH} + 11] | | 5 | Playback | at-tone-time-exactly | | 6 | GotoIf | $["${TIMEFORMAT}" = "kM"]?9 | | 7 | SayUnixTime | ${FutureTime},,IM 'and' S 'seconds' p | | 8 | Goto | 10 | | 9 | SayUnixTime | ${FutureTime},,kM 'and' S 'seconds' | | 10 | Set | TimeLeft=$[${FutureTime} - ${EPOCH}] | | 11 | GotoIf | $[${TimeLeft} < 1]?14 | | 12 | Wait | 1 | | 13 | Goto | 10 | | 14 | Playback | beep | | 15 | Wait | 5 | | 16 | Set | NumLoops=$[${NumLoops} + 1] | | 17 | GotoIf | $[${NumLoops} < 5]?4 | | 18 | Playback | goodbye | | 19 | Hangup | | +----------+-------------+---------------------------------------+
Extension: *65 - get current extension number
+----------+-----------+---------------+ | priority | app | appdata | +----------+-----------+---------------+ | 1 | Answer | | | 2 | Wait | 1 | | 3 | Macro | user-callerid | | 4 | Playback | your | | 5 | Playback | extension | | 6 | Playback | number | | 7 | Playback | is | | 8 | SayDigits | ${AMPUSER} | | 9 | Wait | 2 | | 10 | Hangup | | +----------+-----------+---------------+
Extension: *70 - incoming fax
+----------+------------+-------------------------------------------------------+ | priority | app | appdata | +----------+------------+-------------------------------------------------------+ | 1 | Answer | | | 2 | Wait | 6 | | 3 | Set | FAXFILE=/var/spool/asterisk/fax/${CALLERID(num)}.tif | | 4 | Set | FAXFILENOEXT=/var/spool/asterisk/fax/${CALLERID(num)} | | 5 | Receivefax | ${FAXFILE} | | 6 | Hangup | | | 1 | Answer | | | 2 | Noop | Receiving fax for DID ${CALLERID(DNID)} | | 3 | Wait | 3 | | 4 | Set | FAXFILE=/var/spool/asterisk/fax/${CALLERID(num)}.tif | | 5 | Set | FAXFILENOEXT=/var/spool/asterisk/fax/${CALLERID(num)} | | 6 | Receivefax | ${FAXFILE} | | 7 | Hangup | | +----------+------------+-------------------------------------------------------+
Extension: *96 - listen to music on hold
+----------+-------------+---------+ | priority | app | appdata | +----------+-------------+---------+ | 1 | Answer | | | 2 | Wait | 1 | | 3 | MusicOnHold | | | 4 | Hangup | | +----------+-------------+---------+
Actual config files in database
sip.conf
+------------+------------+----------+------------------+---------------------------------------+ | cat_metric | var_metric | category | var_name | var_val | +------------+------------+----------+------------------+---------------------------------------+ | 0 | 0 | general | bindport | 5060 | | 0 | 1 | general | bindaddr | 0.0.0.0 | | 0 | 2 | general | videosupport | yes | | 0 | 3 | general | disallow | all | | 0 | 4 | general | allow | alaw | | 0 | 5 | general | allow | ulaw | | 0 | 6 | general | allow | h263p | | 0 | 7 | general | allow | h263 | | 0 | 8 | general | context | from-sip-external | | 0 | 9 | general | callerid | Unknown | | 0 | 10 | general | tos | 0x68 | | 0 | 11 | general | notifyringing | yes | | 0 | 12 | general | notifyhold | yes | | 0 | 13 | general | limitonpeers | yes | | 0 | 14 | general | rtcachefriends | yes | | 0 | 15 | general | rtupdate | yes | | 0 | 16 | general | tcpenable | yes | | 0 | 17 | general | tcpbindaddr | 0.0.0.0 | | 0 | 18 | general | registerattempts | 0 | | 0 | 19 | general | registertimeout | 15 | | 0 | 20 | general | language | en | | 0 | 21 | general | alwaysauthreject | yes | | 0 | 101 | general | register | username:password@sipserver/extension | +------------+------------+----------+------------------+---------------------------------------+
iax.conf
+------------+------------+----------+-------------------+-------------------+ | cat_metric | var_metric | category | var_name | var_val | +------------+------------+----------+-------------------+-------------------+ | 0 | 0 | general | bindport | 4569 | | 0 | 1 | general | bindaddr | 0.0.0.0 | | 0 | 2 | general | disallow | all | | 0 | 3 | general | allow | alaw | | 0 | 4 | general | allow | ulaw | | 0 | 5 | general | allow | gsm | | 0 | 6 | general | context | from-sip-external | | 0 | 7 | general | mailboxdetail | yes | | 0 | 8 | general | iaxcompat | yes | | 0 | 9 | general | nochecksums | no | | 0 | 10 | general | delayreject | yes | | 0 | 11 | general | bandwidth | high | | 0 | 12 | general | dtmfmode | auto | | 0 | 13 | general | rtcachefriends | yes | | 0 | 14 | general | rtupdate | yes | | 0 | 15 | general | tos | 0x18 | | 0 | 16 | general | maxjitterbuffer | 1000 | | 0 | 17 | general | maxjitterinterps | 10 | | 0 | 18 | general | jitterbuffer | yes | | 0 | 19 | general | resyncthreshold | 1000 | | 0 | 20 | general | trunktimestamps | yes | | 0 | 21 | general | minregexpire | 120 | | 0 | 22 | general | maxregexpire | 300 | | 0 | 23 | general | iaxthreadcount | 256 | | 0 | 24 | general | iaxmaxthreadcount | 256 | +------------+------------+----------+-------------------+-------------------+
voicemail.conf
+------------+------------+--------------+------------------+-------------------------------------------------------------+ | cat_metric | var_metric | category | var_name | var_val | +------------+------------+--------------+------------------+-------------------------------------------------------------+ | 0 | 0 | general | format | wav|gsm | | 0 | 1 | general | serveremail | LinuxMCE@dcerouter | | 0 | 2 | general | maxlogins | 3 | | 0 | 3 | general | emaildateformat | %A, %B %d, %Y at %r | | 0 | 4 | general | sendvoicemail | yes | | 0 | 5 | general | skipms | 3000 | | 0 | 6 | general | maxsilence | 10 | | 0 | 7 | general | silencethreshold | 128 | | 0 | 8 | general | maxlogins | 3 | | 1 | 0 | zonemessages | eastern | America/New_York|'vm-received' Q 'digits/at' IMp | | 1 | 1 | zonemessages | central | America/Chicago|'vm-received' Q 'digits/at' IMp | | 1 | 2 | zonemessages | central24 | America/Chicago|'vm-received' q 'digits/at' H N 'hours' | | 1 | 3 | zonemessages | military | Zulu|'vm-received' q 'digits/at' H N 'hours' 'phonetic/z_p' | | 1 | 4 | zonemessages | european | Europe/Copenhagen|'vm-received' a d b 'digits/at' HM | +------------+------------+--------------+------------------+-------------------------------------------------------------+
musiconhold.conf
+------------+------------+----------+-----------+-------------------------------+ | cat_metric | var_metric | category | var_name | var_val | +------------+------------+----------+-----------+-------------------------------+ | 0 | 0 | default | mode | files | | 0 | 1 | default | directory | /var/lib/asterisk/mohmp3 | | 1 | 0 | none | mode | files | | 1 | 1 | none | directory | /var/lib/asterisk/mohmp3/none | +------------+------------+----------+-----------+-------------------------------+
cdr_mysql.conf
- This is for "Call Detail Records". In webadmin -> Telecom -> Call Detail Records is a parser interface
+------------+------------+----------+----------+-----------------------------+ | cat_metric | var_metric | category | var_name | var_val | +------------+------------+----------+----------+-----------------------------+ | 0 | 0 | global | dbname | asterisk | | 0 | 1 | global | table | cdr | | 0 | 2 | global | password | lmce | | 0 | 3 | global | user | asteriskuser | | 0 | 4 | global | sock | /var/run/mysqld/mysqld.sock | +------------+------------+----------+----------+-----------------------------+
google talk
- This is for google talk. Apparently the api's changed once again, and this is no more the recommended way of getting it to work. But for new modules i *think* we need asterisk 1.10+. This has to be researched and confirmed.
jabber.conf
+------------+------------+----------+--------------+---------+ | cat_metric | var_metric | category | var_name | var_val | +------------+------------+----------+--------------+---------+ | 0 | 0 | general | autoregister | yes | +------------+------------+----------+--------------+---------+
gtalk.conf
+------------+------------+----------+------------+------------+ | cat_metric | var_metric | category | var_name | var_val | +------------+------------+----------+------------+------------+ | 0 | 0 | general | context | from-trunk | | 0 | 1 | general | bindaddr | 0.0.0.0 | | 0 | 2 | general | allowguest | yes | | 1 | 0 | guest | disallow | all | | 1 | 1 | guest | allow | ulaw | | 1 | 2 | guest | context | from-trunk | | 1 | 3 | guest | connection | asterisk | +------------+------------+----------+------------+------------+