Call recordings in Asterisk using MixMonitor - asterisk

I'm just starting out with Asterisk and following the O'Reilly Guide to set up a test Asterisk server. I have set up a VM with CentOS 6.4, which has 1GB RAM and 50 GB HDD.
After installation, I set up soft phones successfully on 2 PCs which were able to call each other. I have to record these calls now - on searching, I found this site and ediiting my extensions.conf accordingly.
Here's my extensions.conf
[globals]
EXT_TESTTWO=SIP/0000FFFF0002
EXT_TESTONE=SIP/0000FFFF0001
[default]
exten => 0000FFFF0001,hint,SIP/0000FFFF0001
exten => 0000FFFF0002,hint,SIP/0000FFFF0002
[Queues]
exten => 7001,1,Verbose(2,${CALLERID(all)} entering the support queue)
same => n,Queue(support)
same => n,Hangup()
exten => 7002,1,Verbose(2,${CALLERID(all)} entering the sales queue)
same => n,Queue(sales)
same => n,Hangup()
[macro-automon]
exten => s,1,Set(MONITOR_FILENAME=${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)}-${CALLERID(num)})
same => n,Playback(beep) ; optional - hear when recording starts
same => n,MixMonitor(${MONITOR_FILENAME}.wav,b)
[LocalSets]
include => Queues ; allow phones to call queues
exten => 101,1,Dial(${EXT_TESTONE},20,m) ; Replace 0000FFFF0001 with your device name
same => n,Playback(vm-nobodyavail) ; Play "no one's available"
same => n,Hangup()
exten => 102,1,Noop(Dialing 102);
exten => 102,n,Macro(automon) ; start monitor
exten => 102,n,Dial(SIP/0000FFFF0002,30) ; 30 secs
exten => 102,n,Goto(s-${DIALSTATUS},1) ; Jump based on status (NOANSWER,BUSY,CHANUNAVAIL,CONGESTION,ANSWER)
exten => 102-NOANSWER,1,Voicemail(20,us) ; If unavailable, send to voicemail w/ unavail announce
exten => 102-NOANSWER,n,Playback(vm-goodbye)
exten => 102-NOANSWER,n,Hangup
exten => 102-BUSY,1,Voicemail(${MACRO_EXTEN},bs) ; If busy, send to voicemail w/ busy announce
exten => 102-BUSY,n,Playback(vm-goodbye)
exten => 102-BUSY,n,Hangup
exten => _102-.,1,Goto(s-NOANSWER,1) ; Treat anything else as no answer
;exten => 102,1,Dial(${EXT_TESTTWO},20,m) ;Replace 0000FFFF0002 with your device name
;same => n,Playback(vm-nobodyavail) ; Play "no one's available"
;same => n,Hangup()
The calling from 101 to 102 and 102 to 101 work fine. But there are no recordings which come under /var/spool/asterisk/monitor. Moreover, during the call, I get the following debug output:
Read factory 0x7f971001f428 was pretty quick last time, waiting for them.
Read factory 0x7f971001f428 and write factory 0x7f9710020068 both fail to provide 160 samples
No remote address on RTP instance '0x7f9710009258' so dropping frame
Read factory 0x7f971001f428 was pretty quick last time, waiting for them.
Read factory 0x7f971001f428 and write factory 0x7f9710020068 both fail to provide 160 samples
No remote address on RTP instance '0x7f9710009258' so dropping frame
Read factory 0x7f971001f428 was pretty quick last time, waiting for them.
Read factory 0x7f971001f428 and write factory 0x7f9710020068 both fail to provide 160 samples
No remote address on RTP instance '0x7f9710009258' so dropping frame
Read factory 0x7f971001f428 was pretty quick last time, waiting for them.
Read factory 0x7f971001f428 and write factory 0x7f9710020068 both fail to provide 160 samples
No remote address on RTP instance '0x7f9710009258' so dropping frame
Read factory 0x7f971001f428 was pretty quick last time, waiting for them.
Read factory 0x7f971001f428 and write factory 0x7f9710020068 both fail to provide 160 samples
No remote address on RTP instance '0x7f9710009258' so dropping frame
Read factory 0x7f971001f428 was pretty quick last time, waiting for them.
What am I doing wrong here? How can I enable call recordings for both incoming and outgoing calls on a particular extension?

When you using mixmonitor you have check that your sip devices have
directmedia=no
Also you can have more info by enabling debugging

If you have followed the O'Reilly book as is, it asks you to create a user called asteriskpbx and run the rest of the configurations as that user. As a result, during the installation process in the beginning, the /var/spool/asterisk/monitor folder may have write permissions only for root. You need to give write permissions to for the user/ group which is actually writing into the folder (i.e writing the .wav file to that location).
chmod -R 775 /var/spool/asterisk/monitor
This should fix it for you. hope this helps.

Related

How to automatically add users to confbridge asterisk from dialplan?

[play-context]
exten => _X.,1,Answer()
exten => _X.,n,NoOp('Exten:')
exten => _X.,n,NoOp(${EXTEN})
exten => _X.,n,ConfBridge(dconf-${EXTEN}-${STRFTIME(${EPOCH},,%d.%m.%Y-%H:%M:%S)})
exten => _X.,n,Originate(SIP/5678,exten,conferences,100,1)
[conferences]
exten => _X.,1,NoOp(${EXTEN})
exten => _X.,n,ConfBridge(dconf-${EXTEN}-${STRFTIME(${EPOCH},,%d.%m.%Y-%H:%M:%S)})
when i create a new confBridge conference, i want to join some users in it. How i can do it automaticaly? I try this config, but it dont worked. Before this line
exten => _X.,n,Originate(SIP/5678,exten,conferences,100,1)
just does not reach. I do not understand why.
Please, help.
Your channel (your audio when you call the number of the conference) will enter in the conference when it comes to the Confbridge statement in your dialplan. The problem with Confbridge is that once the dialplan has arrived to the Confbridge statement, you will remain there until you exit from it. If you wanted to find there some friends you should have made some previous tasks
Check if the conference is stablished (if there are already other parties in them, see function CONFBRIDGE_INFO) and, if it is, simply add yourself to it
If not, stablish the conference inviting the guys you want to and add yourself to the conference
So, dialplan for conferences is usually not trivial. Let us assume that you do not want to make the first check. So, you are including a guy as you stablish the conference. In order to simplify and to avoid some headaches I am going to use a name for the conference that do not depend on the second at which the dialplan is read (depending on how do you mantain the dialplan your conference could be different from the conference at which you invite your mate), let us suppose that the conference has a name that only depends on the EXTEN dialed. You should do something similar to:
exten => _X,1,Answer()
...
same => n,Originate(SIP/5678,app,ConfBridge,"${EXTEN},rest-of-parameters-for-5678")
... (Check ORIGINATE_STATUS if you do really need your friend)
same => n,ConfBridge(${EXTEN},rest-of-parameters-for-youself)
Here I have used originate with the parameter app. You can, of course, follow the hint of #arheops and use exten with a Local channel. But if you do so, be carefull with the seconds ;).
If you want to stablish automatically the conferences as asterisk starts, consider including some originate statements in cli.conf.
When you do
Confbridge
it now in bridge and not go next extension until you exit bridge.
So you have do Originate BEFORE that or do it in other thread(via Local channel) in parallel.

How to install an application on Elastix?

Does anyone know, how to install an application on Elastix? In my case it is Answering Machine Detection(AMD). I need this application to detect outgoing calls, and if the answering machine is fax, hangup.
I tried to modify config files(modules.conf, extensions.conf, extensions_override_elastix.conf, amd.conf) as it is told in Asterisk documentation and forums, but non of it worked. CLI console doesn't show AMD output, and I think that AMD isn't even enabled there.
I've been looking for the answer for 3 or 4 weeks now and found almost nothing.
There must be something I've overlooked.
Maybe I should change something in the database(asterisk) or Elastix PBX settings?
Here's what I did:
Modified /etc/asterisk/amd.conf file. Appended this to the end:
[general]
initial_silence = 2250
greeting = 1500
after_greeting_silence = 1250
total_analysis_time = 5000
min_word_length = 100
between_words_silence = 50
maximum_number_of_words = 8
silence_threshold = 256
Modified /etc/asterisk/modules.conf. Appended this to the end:
load = > app_amd.so
Modified /etc/asterisk/extensions_override_elastix.conf
[outgoing] ;context
exten => s,1,Answer()
exten => s,n,AMD()
exten => s,n,NoOp(${AMDSTATUS})
exten => s,n,GotoIf($[${AMDSTATUS}=HUMAN]?humn:mach)
exten => s,n(mach),WaitForSilence(3000,1,20)
exten => s,n,Playback(${VOICEFILE})
exten => s,n,Hangup()
exten => s,n(humn),WaitForSilence(500)
exten => s,n,Playback(${VOICEFILE})
exten => s,n,Hangup()
Seeking for settings in database, in case if Elastix works through its database. Elastix writes logs into asterisk.cdr table - that's the only useful thing I've found.
I suppose, the CLI console should "say" something related to AMD application when I am calling, but it works as usual, without AMD enabled.
Thank you in advance!
You should add at options page to dialling param "M(amd)"
After that you should create macro-amd like described in manual.
That macro will be fired on call after call answered and before call bridged to other peer.

Call hangup take time - asterisk dialplan

I wrote dialplan for my Asterisk system. The extension.conf is :
extensions.conf
[from-pstn]
exten =>s,1,Verbose(1, Caller ${CALLERID(all)} has entered the paf IVR)
same=>n,Answer()
same=>n,Wait(3)
same=>n,Playback(welcome)
same=>n,GoSub(post,ss,1)
same=>n,Playback(thanks)
same=>n,Hangup()
[post]
include => default_cont
exten => ss,1,Background(gud/post)
same=>n,WaitExten(5)
exten => 1,1,Set(CDR(aa)=136)
same=>n,Return()
exten => 2,1,Set(CDR(aa)=137)
same=>n,Return()
[default_cont]
exten => i,1,Playback(invalid)
same=> n,Hangup()
exten => t,1,Playback(timeout)
same=> n,Hangup()
exten => h,1,DeadAGI(convert_recordings.sh)
same=>n,DeadAGI(my_uploader.php,${var1},${CALLERID(num)},${CDR(var2)},${CDR(aa)})`
When i call to my asterisk system. it takes time to hangup after playing thanks audio file. Actually, call hangup after all AGI execution are completed and my_uploader.php execution takes time. But i need instant hangup after playing thanks message. System only executes AGI files after the call is completely hangup. How can i solve this problem ?
Thats becuase you have h extensions in your dialplan
So it will take time while you agi on h-extension ends.
You can use cdr info and run external script based on that. You can write dialplan on hexten(not agi). You can write faster(not blocking) agi.
Very likly your uploaded or conversion task take time. You have only notate somewhere in db what you have to do and do that in external thread, not in asterisk.
That way you will not block asterisk thread.

Asterisk CDR Report shows "s" in the destination field

I have had issue on an platform for quite sometime now, when somebody calls in to ivr system, the cdr report destination field shows an 's' in place of the called number.
The inbound route for the DID is set to the ivr menu.
Here is my dial plan:
"
exten => 800000031,1,Set(__FROM_DID=${EXTEN})
exten => 800000031,n,Gosub(app-blacklist-check,s,1)
exten => 800000031,n,ExecIf($[ "${CALLERID(name)}" = "" ] ?Set(CALLERID(name)=${CALLERID(num)}))
exten => 800000031,n,Set(__CALLINGPRES_SV=${CALLERPRES()})
exten => 800000031,n,Set(CALLERPRES()=allowed_not_screened)
exten => 800000031,n(dest-ext),Goto(ivr-3,s,1)*
"
I suspect the issue is on the last line but the file is not allowed to be edited directly.
Will appreciate any help.
s is the default extension in asterisk , go through the logs and try to find out on what context that call was executed. It usually happens when you do not create a context for any specific DID in extension.conf. then the call is being routed to asterisk default context
Use ${EXTEN} instead of s in Goto(ivr-3,s,1), Also in ivr-3 context create a dialplan using wildcard symbol. e.g
exten => 800000031,1,Set(__FROM_DID=${EXTEN})
exten => 800000031,n,Gosub(app-blacklist-check,${EXTEN},1)
exten => 800000031,n,ExecIf($[ "${CALLERID(name)}" = "" ] ?Set(CALLERID(name)=${CALLERID(num)}))
exten => 800000031,n,Set(__CALLINGPRES_SV=${CALLERPRES()})
exten => 800000031,n,Set(CALLERPRES()=allowed_not_screened)
exten => 800000031,n(dest-ext),Goto(ivr-3,${EXTEN},1)
[ivr-3]
exten => _X.,1,NoOp("Hello world")
We have an IVR. When an external caller listens to IVR and decides to hangup before IVR ends talking, in report we see "s" as Destination. Otherwise, in report we see extension dialed after or while IVR is talking. I guess it's normal. If You have been hacked You'd see other various destinations but not "s".
Solved on ours, there was no default destination set for the reception ring group. We pointed it back to the IVR and now no longer see the s destination.
Most likly that mean you have been hacked. Please check that you have no guest calls enabled, contact security expert to find hole and fix it.

Asterisk auto Call recording

We are running asterisk with 8 port FXO. FXO connects to our old PBX (Samsung Office Serv 100).
Now we want to record all calls routed through FXO (if it was dialed to outside or comming from outside).
Is there a simple way to do this?
Are you running plain Asterisk? If so you can modify your dial plan to start 'monitoring' the channel, which will record the call.
The monitor command's documentation: http://www.voip-info.org/wiki/view/Asterisk+cmd+monitor
Just for the sake of completion, here's the documentation:
[root#localhost ~]# asterisk -rx 'core show application monitor'
-= Info about application 'Monitor' =-
[Synopsis]
Monitor a channel
[Description]
Monitor([file_format[:urlbase],[fname_base],[options]]):
Used to start monitoring a channel. The channel's input and output
voice packets are logged to files until the channel hangs up or
monitoring is stopped by the StopMonitor application.
file_format optional, if not set, defaults to "wav"
fname_base if set, changes the filename used to the one specified.
options:
m - when the recording ends mix the two leg files into one and
delete the two leg files. If the variable MONITOR_EXEC is set, the
application referenced in it will be executed instead of
soxmix and the raw leg files will NOT be deleted automatically.
soxmix or MONITOR_EXEC is handed 3 arguments, the two leg files
and a target mixed file name which is the same as the leg file names
only without the in/out designator.
If MONITOR_EXEC_ARGS is set, the contents will be passed on as
additional arguments to MONITOR_EXEC
Both MONITOR_EXEC and the Mix flag can be set from the
administrator interface
b - Don't begin recording unless a call is bridged to another channel
i - Skip recording of input stream (disables m option)
o - Skip recording of output stream (disables m option)
By default, files are stored to /var/spool/asterisk/monitor/.
Returns -1 if monitor files can't be opened or if the channel is already
monitored, otherwise 0.
And here's a sample way you can use it:
; This fake context records all outgoing calls to /var/spool/asterisk/monitor in wav format.
[fake-outgoing-context]
exten => s,1,Answer()
exten => s,n,Monitor(wav,,b)
exten => s,n,Dial(DAHDI/g0/${EXTEN})
exten => s,n,Hangup()
Obviously you'd have to make changes to my code, but hopefully that gives you a good idea.
A real life example is
exten => _87X,1,NoOp()
exten => _87X,n,MixMonitor(${UNIQUEID}.wav,ab)
exten => _87X,n,Dial(SIP/${EXTEN},45)
exten => _87X,n,StopMixMonitor()
exten => _87X,n,Hangup()
It's good practise to always have NoOp - the first rule must start with 1, this way you can interchange the rules with the n step any way you want.
It's always best to use MixMonitor as opposed to Monitor - Monitor only records inbound or outbound audio - MixMonitor uses both.
Also wav is quite a good choice as a format - I also use a script to transform the wav files to OGG at the end of the day - the best compromise between size / quality and licensing issues.
With regards to the arguments
a is append
b is bridge (good for production - it will only record when the call is answered - not good for debugging)
With regards to StopMixMonitor(), I'm just being thorough, but for examples there are cases in which you would like to stop the recording, for example:
...
exten => _39[5-9],n,Dial(SIP/${EXTEN},45)
exten => _39[5-9],n,GotoIf($["${DIALSTATUS}" = "BUSY"]?busy:unavailable)
exten => _39[5-9],n(busy),NoOp()
exten => _39[5-9],n,StopMixMonitor()
exten => _39[5-9],n,Voicemail(${EXTEN},u)
exten => _39[5-9],n,Hangup()
exten => _39[5-9],n(unavailble),NoOp()
exten => _39[5-9],n,StopMixMonitor()
exten => _39[5-9],n,Hangup()
...
In this example, you would stop the recording of the voice mail interaction.
Hope this will bring some light on the matter.
Depending on the specifications of your Asterisk box you might find this hack useful too. Create a rather large ramdisk and mount /var/spool/asterisk/monitor to it. That way Asterisk records to memory not disk. Then write a script under cron to move the recordings to permanent storage every 15-30 minutes or so.

Resources