Hi Jaap,
Here is a portion of my coding. Hope I didn't 'break' anything in
moving
sections around.
I tried to leave only what is material to answering your question.
One caveat - I did add the CALL FILE functionality on my V1.6.0 (branch
SVN)
asterisk box; so, maybe they changed some 'underlying' code that would
be
different from V1.4.x. But, go ahead and try it. The obvious syntax change
I've noted in the comments below.
[voicepulse-in]; this is an incoming PSTN call from the VOIP provider
; VoicePulse Connect, which from their servers
; in either SIP or IAX protocol.
; .........................................................
; This section catches calls coming in through VoicePulse.
; The EXTEN here is only of interest if I subscribe to multiple
; PSTN-SIP/IAX lines from VoicePulse CONNECT.
; .........................................................
exten => _XX.,1,Set(GLOBAL(VP_CALLERIDNUM)=${CALLERID(num)})
exten => _XX.,n,Set(GLOBAL(VP_CALLERIDNAME)=${CALLERID(name)})
exten => _XX.,n,Set(GLOBAL(VP_TRUNKINNUM)=${EXTEN})
exten => _XX.,n,Set(ALLOWJERRY_ALL=2)
. ; all I do here is verify that I have a known/approved user dialing in
. ; or invalid user
.
exten => _XX.,n,Log(
NOTICE|CALLINLOG vp-in id=${CALLERID(num)} nam=${CALLERID(name)})
exten => _XX.,n(dobckgrd),NoOp()
exten => _XX.,n,GoTo(process-digit-vpin,s,1)
[process-digit-vpin]
; prompt and wait for digits to be entered
exten => s,1,Answer()
exten => s,n,Macro(sayhi,${CALLERID(num)})
exten => s,n,Background(pls-entr-num-uwish2-call,m)
exten => s,n,WaitExten()
;check if we are making a local call
;
exten => *,1,Playback(star)
.
. ; set up for calls to local phone extensions
.
exten => *,n,GoTo(call-local,s,1)
;check for long distance & INTERNAT call-US-canada
;users always enter 10digit number for ld
;
exten => _NXXNXXXXXX,1,NoOp()
exten => _NXXNXXXXXX,n,Set(newnumber=${EXTEN})
.
. ; just some housekeeping
.
;exten => _NXXNXXXXXX,n,GoTo(dial-long-dist)
exten => _0X.,1,NoOp()
.
. ; just some housekeeping
.
exten => _0X.,n,GoTo(call-asia,s,1)
; RINGBACK SECTION-
;
exten => _1*,1,NoOp() ; this is local call with ringback
.
.
exten => _1NXXNXXXXXX,1,NoOp() ; this is Long Distance call with ringback
exten => _1NXXNXXXXXX,n,Set(GLOBAL(CallERringbackID)=${CALLERID(num)})
exten => _1NXXNXXXXXX,n,Set(GLOBAL(CallERringbackNAME)=${CALLERID(name)})
; the next variable is the number to call
exten => _1NXXNXXXXXX,n,Set(GLOBAL(CallEEringbackID)=${EXTEN:1})
;exten => _1NXXNXXXXXX,n,Playback(jp-hup-and-will-call-back-10sec)
;exten => _1NXXNXXXXXX,n,Wait(2)
exten => _1NXXNXXXXXX,n,GoTo(process-ringbacknum,s,1)
exten => _10X.*,1,NoOp() ; this is International call with ringback
.
.
exten => i,1,Playback(vm-goodbye)
exten => i,n,Hangup()
exten => t,1,Playback(connection-timed-out)
exten => t,n,Hangup()
; FOR RINGBACK- CallerID=CallERringbackID- CalleeID=CallEEringbackID
;
[process-ringbacknum]
exten => s,1,Verbose(SSS- entered context process-ringbacknum)
; get a NEW UNIQUE path+file name, such as "/tmp/ringback17.call"
;
exten => s,n,Macro(AdvCallFileNum)
exten => s,n,Set(_CurCallfileName=${GLOBAL(CUR_CALLFILE_NAME)})
; NOTE-need to find out where caller is, and where he wants to call
; as some outgoing lines are cheaper for international calls
; also, determine if channels are available, etc.
;
.
. ; logic for accomplishing the above NOTE - is site-dependent
.
. ; NOTE-2- the follow exten is my 'development' call with
'constants',
. ; so you will want to use variables for the paramters
. ; Also, believe GOSUB with parameters was new in asterisk V1.6.0,
. ; so, in an earlier version you can easily make the adjustment
.
exten =>
s,n,GoSub(write-callfile,s,1("Zap/3/1407474xxxx","20","1","1",
"doringback","s","1","Jerry
4074747xxxx","DialNumber=407474xxxx",
"whatever documentation for write callfile",${CurCallfileName}))
exten => s,n,Hangup() ;done with setup, so hangup the caller
[write-callfile] ; GOSUB for writing a CALL FILE
;you may wish to check return status from the system calls
;
exten => s,1,Verbose(WCWC-reached context write-callfile)
exten => s,n,Set(FromPathFile=${ARG11})
exten => s,n,TrySystem(echo "Channel: ${ARG1} \n" >
${FromPathFile})
exten => s,n,TrySystem(echo "WaitTime: ${ARG2} \n" >>
${FromPathFile})
exten => s,n,TrySystem(echo "RetryTime: ${ARG3} \n" >>
${FromPathFile})
exten => s,n,TrySystem(echo "MaxRetries: ${ARG4} \n" >>
${FromPathFile})
exten => s,n,TrySystem(echo "Context: ${ARG5} \n" >>
${FromPathFile})
exten => s,n,TrySystem(echo "Extension: ${ARG6} \n" >>
${FromPathFile})
exten => s,n,TrySystem(echo "Priority: ${ARG7} \n" >>
${FromPathFile})
exten => s,n,TrySystem(echo "CallerID: ${ARG8} \n" >>
${FromPathFile})
exten => s,n,TrySystem(echo "SetVar: ${ARG9} \n" >>
${FromPathFile})
exten => s,n,TrySystem(echo "Account: ${ARG10} \n" >>
${FromPathFile})
exten => s,n,Set(DestPathFile=${FromPathFile})
exten => s,n,Set(DestPathFile=${CALLFILE_PATH}${DestPathFile:4})
exten => s,n,System(nohup
"${AGI_BIN_PATH}"/agi-exec-bckgd-for-move.sh
"${FromPathFile}" "${DestPathFile}" 1>/dev/null
2>&1 &);one long line
exten => s,n,Return()
[doringback] ; in a NEW CHANNEL NOW-the call-file created channel Zap/3
exten => s,1,Verbose(== in context doringback ready to dial ring back
caller)
; THE Zap/2 CALL WILL OCCUR (USUALLY) BEFORE THE CALL-FILE CALL
;
exten => s,n,Dial(Zap/2,20,r)
; check DIALSTATUS etc
exten => s,n,Hangup()
Hope this helps,
Gerald Harshany
>> -------- Original Message --------
>> Subject: [SPAM] Re: [asterisk-users] Roaming callback?
>> From: SIP <sip at arcdiv.com>
>> Date: Mon, April 28, 2008 1:25 pm
>> To: Asterisk Users Mailing List - Non-Commercial Discussion
>> <asterisk-users at lists.digium.com>
>> Cc: Jerry Harshany <ger at JerryH.us>
>> Jaap Winius wrote:
>> > Quoting Jerry Harshany <ger at JerryH.us>:
>> >
>> >
>> >> There is an additional alternative for a ringback to a caller,
which
>> >> is to use the Call File capability as noted in Van
Meggelen's
>> >> "Future of Telephone"; 2nd ed, p306.
>> >>
>> >
>> > As it says in the book, call files allow calls to be created
through
>> > the Linux shell. If you've used this to create a roaming
callback
>> > service, then you must have created something that allows users to
>> > submit a phone number to be called back on, after which a .call
file
>> > is created and moved to the /var/spool/asterisk/outgoing/
directory.
>> >
>> >
>> >> sleep 8s
>> >> mv "$1" "$2"
>> >> exit 0
>> >>
>> >
>> > This looks like the step that moves the newly created call file to
the
>> > aforementioned directory.
>> >
>> >
>> >> In my case, when the caller calls in to 'asterisk', he
is prompted
>> >> for the number he wishes to call. The caller can be at a US or
>> >> international number, and he can call any US or international
>> >> number, WITH or WITHOUT ringback. In other words the caller
>> >> designates whether this is a direct connect call, or a
ringback (and
>> >> then bridge the called number). I have the complete
flexibility of
>> >> my dial plan extensions to do as I wish with the phone
numbers.
>> >>
>> >
>> > This is what I'm really interested in! How did you manage
this? Would
>> > you be willing to share how you did this?
>> >
>> >
>> I would imagine if it's a callback, it creates a callfile. If
it's not,
>> it just connects the call as it would normally. We have a similar thing
>> for our business customers built using a reasonably simple agi script
to
>> do verification of the caller/account and creation of the call files. A
>> rather simple Dial command can handle the direct connection after
>> verification, and a rather simple call file can handle the callback.
The
>> hardest part was getting the DTMF reading to work well. ;)
>> N.