[asterisk-users] How do I do this?
Ade Vickers
javickers at solutionengineers.com
Thu Dec 13 08:32:19 CST 2007
> -----Original Message-----
> From: asterisk-users-bounces at lists.digium.com
> [mailto:asterisk-users-bounces at lists.digium.com] On Behalf Of
> Steve Totaro
> Sent: 13 December 2007 14:35
> To: Asterisk Users Mailing List - Non-Commercial Discussion
> Subject: Re: [asterisk-users] How do I do this?
>
>
> ----- Original Message -----
> From: "Ade Vickers" <javickers at solutionengineers.com>
> To: "'Asterisk Users Mailing List - Non-Commercial Discussion'"
> <asterisk-users at lists.digium.com>
> Sent: Thursday, December 13, 2007 7:49 AM
> Subject: [asterisk-users] How do I do this?
>
>
> >I have 2 asterisk servers - serverA and serverC - connected via IAX2.
> >
> > On serverA, I have a "telemarketer hold" extension which,
> if I transfer a
> > caller into it, loops around playing music & "please wait"
> messages, until
> > they give up & hang up the phone.
> >
> > Also on serverA, I have a custom devstate, which lights a
> lamp on a phone
> > connected to serverA, which tells me if someone is
> currently held in that
> > loop. When they hang up, the devstate is re-set & the lamp goes out.
> >
> > On serverC, I have a similar devstate, and a couple of
> extensions - one to
> > turn the lamp on & one to turn it off.
> >
> > What happens is this:
> >
> > 1) A call arrives @ Asterisk, and calls a phone on serverA,
> and a phone on
> > serverC.
> > 2) I answer on serverC, determine it's a telemarketer, and
> transfer to the
> > "telemarketer hold" extension on serverA
> > 3) The call enters the loop, and the devstate is set on
> serverA. As it
> > enters the loop, it calls the "turn on" extension on
> serverC, which sets
> > the
> > serverC devstate, and hangs up with an "all extensions are
> busy" response.
> > 4) The call, then, stays parked on serverA until the caller
> hangs up.
> > 5) The "h" extension on serverA detects the hangup, and re-sets the
> > serverA
> > devstate.
> > 6) Simultaneously, it calls the "turn off" extension on
> serverC, which
> > re-sets the devstate & returns a "all extensions are busy" response.
> > 7) serverA then hangs up the call 'officially' by calling Hangup()
> >
> > Unfortunately: Step 6 doesn't do anything on serverC... you
> can see it
> > being
> > executed on serverA, but the call never arrives at serverC.
> >
> > I'm guessing this is because the caller has already hung up; so, in
> > effect,
> > there's no call to transfer...
> >
> > My question, then, is how to get Asterisk to generate a
> "new" call, to
> > tell
> > serverC to switch off it's lamp?
> >
>
> Use the h exten? Would you mind sharing more details about
> your setup such
> as the dialplan or/or apps you are using? I guess you really hate
> telemarketers ;-)
Hi Steve,
It's not just telemarketers; I find it's a useful "dumping ground" for any
caller I don't particularly want to speak to ;)
OK: There are 2 servers involved:
serverA
- Located in the UK, has a connection to a POTS line via an AX100P card.
- Handles any 5xxx extension locally, plus a couple of others
- Talks to serverC via IAX2 channel
- Running Asterisk v1.4.5 + custom devstate patch
serverC
- Located in Spain, has only an internet connection
- Handles any 62xx extension locally, plus the special "teledeath_on" and
"teledeath_off" extensions
- Talks to serverA via IAX2 channel
- Running Asterisk v1.4.11 + custom devstate patch
So; in serverA, the following bits of the dialplan are relevant:
[default]
exten => 5555,hint,custom:telepark
;
----------------------------------------------------------------------------
-
; When an internal phone dials, this section defines what happens to the
calls
;
----------------------------------------------------------------------------
-
[internal]
;other destinations cut from here
;Death to telemarketers
exten => 5555,1,Goto,teledeath|s|1
[teledeath]
exten => s,1,Answer()
exten => s,2,Set(DEVSTATE(Custom:telepark)=INUSE)
exten => s,3,Dial(IAX2/serverC/teledeath_on)
exten => s,4,WaitMusicOnHold(15)
exten => s,5,Wait(1)
exten => s,6,Playback(pls-hold-while-try)
exten => s,7,Wait(0.25)
exten => s,8,Goto,4
exten => h,1,Set(DEVSTATE(Custom:telepark)=NOT_INUSE)
exten => h,n,Dial(IAX2/serverC/teledeath_off)
exten => h,n,Hangup()
; If anything goes wrong, quit the loop
exten => i,1,Set(DEVSTATE(Custom:telepark)=NOT_INUSE)
exten => i,n,Dial(IAX2/serverC/teledeath_off)
exten => i,n,Hangup()
Thus; when I transfer the call to 5555; it jumps into teledeath|s, which
sets the devstate locally; dials the special extension
"IAX2/serverC/teledeath_on" to set the serverC busy lamp; then loops around
music/announcements.
When the caller hangs up, teledeath|h is executed; turning off the local
lamp & calling "IAX2/serverC/teledeath_off" - which SHOULD turn off the
serverC lamp, but doesn't - because the call never arrives on serverC...
Here is serverC's extensions.conf file (again, non-pertinent bits removed):
[default]
exten => 5555,hint,custom:telepark
[internal]
include => outbound
include => default
;Internal phones (local (62xx) & remote (everything else)
exten => _[57]XXX,1,Goto,external_extensions|6000${EXTEN}|1
;Death to telemarketers status marker
exten => teledeath_on,1,Set(DEVSTATE(Custom:telepark)=INUSE)
exten => teledeath_on,n,Set(HANGUPCAUSE=17)
exten => teledeath_on,n,Hangup()
exten => teledeath_off,1,Set(DEVSTATE(Custom:telepark)=NOT_INUSE)
;exten => teledeath_off,n,Set(HANGUPCAUSE=17)
;exten => teledeath_off,n,Hangup()
[external_extensions]
exten => _6000XXXX,1,Dial(IAX2/serverA/${EXTEN:4},30)
So, here's what happens on serverA:
-- Executing [5555 at internal:1] Goto("IAX2/serverC-2", "teledeath|s|1")
in new stack
-- Goto (teledeath,s,1)
-- Executing [s at teledeath:1] Answer("IAX2/serverC-2", "") in new stack
-- Executing [s at teledeath:2] Set("IAX2/serverC-2",
"DEVSTATE(Custom:telepark)=INUSE") in new stack
Extension Changed 5555 new state InUse for Notify User 5100
-- Executing [s at teledeath:3] Dial("IAX2/serverC-2",
"IAX2/serverC/teledeath_on") in new stack
-- Called serverC/teledeath_on
-- Call accepted by 88.xxx.xxx.xxx (format ulaw)
-- Format for call is ulaw
-- Hungup 'IAX2/serverC-5'
-- No one is available to answer at this time (1:0/0/0)
-- Executing [s at teledeath:4] WaitMusicOnHold("IAX2/serverC-2", "15") in
new stack
-- Started music on hold, class 'default', on channel 'IAX2/serverC-2'
-- Channel 'IAX2/serverC-2' unable to transfer
-- Hungup 'IAX2/serverC-8'
== Spawn extension (sjs, s, 3) exited non-zero on 'Zap/1-1'
-- Executing [h at sjs:1] Hangup("Zap/1-1", "") in new stack
== Spawn extension (sjs, h, 1) exited non-zero on 'Zap/1-1'
-- Hungup 'Zap/1-1'
-- Stopped music on hold on IAX2/serverC-2
== Spawn extension (teledeath, s, 4) exited non-zero on 'IAX2/serverC-2'
-- Executing [h at teledeath:1] Set("IAX2/serverC-2",
"DEVSTATE(Custom:telepark)=NOT_INUSE") in new stack
Extension Changed 5555 new state Idle for Notify User 5100
-- Executing [h at teledeath:2] Dial("IAX2/serverC-2",
"IAX2/serverC/teledeath_off") in new stack
-- Called serverC/teledeath_off
-- Hungup 'IAX2/serverC-4'
== Spawn extension (teledeath, h, 2) exited non-zero on 'IAX2/serverC-2'
-- Hungup 'IAX2/serverC-2'
and, on serverC:
== Spawn extension (internal, 5555, 0) exited non-zero on 'IAX2/serverC-5'
-- Executing [5555 at internal:1] Goto("IAX2/serverC-5",
"external_extensions|60005555|1") in new stack
-- Goto (external_extensions,60005555,1)
-- Executing [60005555 at external_extensions:1] Dial("IAX2/serverC-5",
"IAX2/serverA/5555|30") in new stack
-- Called serverA/5555
-- Call accepted by 87.xxx.xxx.xxx (format ulaw)
-- Format for call is ulaw
-- IAX2/serverA-1 answered IAX2/serverC-5
-- Accepting AUTHENTICATED call from 87.xxx.xxx.xxx:
> requested format = ulaw,
> requested prefs = (ulaw|alaw|gsm),
> actual format = ulaw,
> host prefs = (ulaw|alaw|gsm),
> priority = mine
-- Executing [teledeath_on at internal:1] Set("IAX2/serverC-2",
"DEVSTATE(Custom:telepark)=INUSE") in new stack
-- Executing [teledeath_on at internal:2] Set("IAX2/serverC-2",
"HANGUPCAUSE=17") in new stack
-- Executing [teledeath_on at internal:3] Hangup("IAX2/serverC-2", "") in
new stack
== Spawn extension (internal, teledeath_on, 3) exited non-zero on
'IAX2/serverC-2'
-- Hungup 'IAX2/serverC-2'
-- Channel 'IAX2/serverC-5' unable to transfer
-- Channel 'IAX2/serverA-1' unable to transfer
-- Hungup 'IAX2/serverA-1'
== Spawn extension (external_extensions, 60005555, 1) exited non-zero on
'IAX2/serverC-5'
-- Hungup 'IAX2/serverC-5'
So..... any ideas?
Cheers,
Ade.
No virus found in this outgoing message.
Checked by AVG Free Edition.
Version: 7.5.503 / Virus Database: 269.17.1/1182 - Release Date: 12/12/2007
11:29
More information about the asterisk-users
mailing list