[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