Skip to content

Instantly share code, notes, and snippets.

Last active February 14, 2023 14:36
What would you like to do?
FreePBX Feature code prefix to allow spy/whisper/barge on the specified extension
; FreePBX Feature code prefix to allow spy/whisper/barge on
; the specified extension.
; Latest version:
; 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
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
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
Copy link

@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.

Copy link

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)

Copy link

lgaetz commented Nov 9, 2022

Couple ways that could be done. Suggest you open a thread on the FreePBX forum for ideas.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment