-
-
Save lgaetz/78c4e114952e79596c1ed4123559d3d3 to your computer and use it in GitHub Desktop.
; FreePBX Feature code prefix to allow spy/whisper/barge on | |
; the specified extension. | |
; | |
; Latest version: | |
; https://gist.github.com/lgaetz/78c4e114952e79596c1ed4123559d3d3 | |
; | |
; Usage: | |
; Dialplan goes in the file: | |
; /etc/asterisk/extensions_custom.conf | |
; Dial local extension with 556 prefix to spy. While spying on | |
; active channel use the following dtmf input to toggle modes: | |
; dtmf 4 - spy mode | |
; 5 - whisper mode | |
; 6 - barge mode | |
; | |
; License: GNU GPL2 | |
; | |
; Version History | |
; 2018-11-23 First commit by lgaetz | |
; 2019-03-05 update regex to prevent channels from returning multiple channel matches | |
; 2019-10-10 added support to loop thru all dialable devices for the extension, now supports Zulu/webrtc clients | |
; 2020-04-12 COVID-19 edition - supports prompt to request spyee extension | |
; 2020-07-23 add E option to ChanSpy application and add timeout | |
; 2021-03-08 add example line to block spying access to certain extensions | |
[from-internal-custom] | |
exten => 556,1,Noop(Entering user defined context from-internal-custom in extensions_custom.conf) | |
exten => 556,n,Read(spyee,please-enter-the&extension&number&followed_pound) | |
exten => 556,n,GoTo(targeted-chanspy,${spyee},1) | |
exten => _556.,1,Noop(Entering user defined context from-internal-custom in extensions_custom.conf) | |
exten => _556.,n,GoTo(targeted-chanspy,${EXTEN:3},1) ;strip off prefix | |
[targeted-chanspy] | |
exten => _.,1,Noop(Entering user defined context targeted-chanspy in extensions_custom.conf) | |
; exten => _.,n,ExecIF($["${EXTEN}"="100"]?Hangup) ; if you want to block spying access to certain extensions you can do that with this line, one per ext | |
exten => _.,n,Set(TIMEOUT(absolute)=3600) ; prevent hung channel by setting 1 hour timeout recommended if using infinite loop | |
exten => _.,n,Answer | |
exten => _.,n(once-upon-a-time),Wait(1) | |
exten => _.,n,set(spy_target=) ; initialize target var | |
; get list of dialable devices for extension | |
exten => _.,n,Set(DEVS=${DB(AMPUSER/${EXTEN}/device)}) ; & delimited list of devices | |
exten => _.,n,Set(DEVS=${STRREPLACE(DEVS,&,\,)}) ; comma delimited list of devices | |
; step thru each device and look for an active channel | |
exten => _.,n,While($["${SET(DEV=${POP(DEVS)})}" != ""]) | |
exten => _.,n,noop(dev: ${DEV}) | |
; using a regex of SIP/${EXTEN}- will match both SIP and PJSIP channels, and the trailing - character should | |
; help to ensure there is only a single match. If multiple channels are returned the chanspy application will fail | |
exten => _.,n,set(spy_target=${CHANNELS(SIP/${DEV}-)}) | |
exten => _.,n,ExecIf($["${spy_target}"!=""]?ExitWhile) ; if an active channel is found exit the loop | |
exten => _.,n,EndWhile() | |
exten => _.,n,ExecIF($["${spy_target}"!=""]?ChanSpy(${spy_target},dnqE)) ; q option suppresses channel announce on barge | |
exten => _.,n,Hangup() ;comment this line with a semicolon to do infinite loop | |
exten => _.,n,GoTo(once-upon-a-time) | |
exten => _.,n,Hangup() | |
exten => h,1,Hangup() | |
exten => s,1,Hangup() | |
exten => T,1,Hangup() ; timeout destination |
@lgaetz - hope all is well! Wanted to run something by you:
I wanted to change the prefix to be *222 specifically. I replaced 556 with *222 in all entries under [from-internal-custom]. It works but only when dialing the feature code and then I get prompted to enter the extension number followed by #.
However, it does not work when I try to speed dial the code. For example, if I want to spy on extension 204, and I dial *222204, it connects but then immediately hangs up. However, if I switch the prefix back to 556, then I can dial 556204 and it connects just fine.
Is the issue here the * ?
Any help/guidance will be greatly appreciated.
You are changing the prefix from 3 to 4 characters, so you'll need to strip 4 characters from the dial string before going to targeted-chanspy
exten => _556.,n,GoTo(targeted-chanspy,${EXTEN:4},1) ;strip off 4 digit prefix
If that's not it, then start a thread at https://community.freepbx.org/ with details
You are changing the prefix from 3 to 4 characters, so you'll need to strip 4 characters from the dial string before going to targeted-chanspy
exten => _556.,n,GoTo(targeted-chanspy,${EXTEN:4},1) ;strip off 4 digit prefix
If that's not it, then start a thread at https://community.freepbx.org/ with details
That's it! Thank you so much!
Hey @lgaetz have try it with PJSIP but dosent Work have u any Tip Here?
This dialplan was developed for FreePBX with pjsip extensions. If you are having issues, open a discussion thread on the freepbx forum with a call trace.
@lgaetz
Hi
tnx for this amazing code
but while i use it
in whisper mode the other guy i want talk to him hear my voice very noisy
and i can't find what is problem
can u help me please?
Hi,
@lgaetz Thanks a lot for the configuration.
I need a configuration that it's like the opposite of @adell444 's , I want to create a chanspy extension for sell department that the sell manager can dial and authenticate it's self then he could only spy on the sell extensions.
Example scenario :
Sell manager extension : 301
Sell users extensions : 302-303-304
chanspy extension : 310
What I need is when 301 dials the chanspy (310) he could only spy on sell users (302-303-304) and if any other extension entered either hangup the call or play a access denied recording and ask again for the extension.
And since I want a chanspy for each department it's not that good to use the exten => _.,n,ExecIF($["${EXTEN}"="XXX"]?Hangup)
to exclude all the extensions except the users in that department.
Thanks in advance.
I too am looking for an opposite flag, limit the extensions FROM which channels can be spied on.
For example we will allow only extensions 101,102,103 to spy on all extensions (excluding those excluded)
Couple ways that could be done. Suggest you open a thread on the FreePBX forum for ideas. https://community.freepbx.org/
This is absolutely brilliant, works perfectly and I hope one day this is included in FreePBX.
For anyone who uses this in the UK, edit "followed_pound" to "astcc-followed-by-the-hash-key" for the UK voice, otherwise it speaks the UK language for the first part of the instructions, then the US one for the hash key part.
@lgaetz Great code, it works as intended. Thank you so much for your hard work on this.
One quick question, this only seems to work when the extensions are on the same PBX, but how would it work if I have 2 PBX's, connected via a PJSIP trunk?
When I try to barge on the remote extensions, it just hangs up.
The exteniosn are OK, as I can make calls to and from and it works.
Would this code work for this instance, any modifications that I might have to do?
Thank you again!
Greetings and thanks for the code. Is it expected that the exclusion statement < ExecIF(
exclusion statement ... will handle traditional dialplan wild cards?
No. To do that you'll want to investigate the REGEX dialplan function.
Yeah that line was added in his March 8 revision after I opened this forum post about it. Works a charm.