How to – Fix Apache not starting on ViciBox

Artificial intelligence

How to – Fix Apache not starting on ViciBox

There is a new issue with ViciBox 9, 10 or 11 where Apache will not start up after installations. The error message is calling for mod_deflate which seems to not be there. The easy fix for this is to delete the include for it.

nano /etc/apache2/vhosts/dynportal.conf - Then go to line 16 and delete "Include /etc/apache2/conf.d/mod_deflate.conf"

Do the same for dynportal-ssl.conf

If you have nay questions feel free to join our discord: https://discord.gg/ymGZJvF6hK

Chris aka carpenox

How to – Use the full functionality of the ViciDial installer by carpenox

CyburDial Installer

How to – Use the full functionality of the ViciDial installer by carpenox

Vicidial administrators, take note: the Carpenox Auto Installer is about to change the game. This tool transforms the usually complex setup of Vicidial into a smooth, hassle-free experience. Let me go over some post installation steps and key things to take note of and changes I suggest you make after the fact of using the installer. I will give you a few steps to do first:

This assumes you have installed already through this article: How to – Install Vicidial on Alma Linux 9 with my new auto installer

Step 1 – Login to the admin GUI and change the default password

After you reboot the server, which should only be done once you have attached the FQDN(Fully Qualified Domain Name) for the SSL cert in the very last step of the installation process. This step is important and I advise you don’t skip it if you plan to use webphones that are built into the installer. If you do skip this step, make sure you turn the firewall off before trying to run it post the initial install or certbot wont be able to get through to create the SSL. The command is “service firewalld stop” and then start it back again after you install the SSL. This being said, then login to that domain in your browser. For example: https://my.dialer.one (Use your domain this is NOT real)
The default login is 6666 and password 1234 – make sure you change this password and then go into users and give yourself all the permissions possible.

If you do decide to not use webphones and can not or will not be installing SSL, you will need to login still through the https port with https://192.168.1.1 (your IP) and change the password the same. You will need need to add the http port to your trusted zone as well as the dynamic portal non SSL port to public which is 81. You can do so with the following commands:

firewall-cmd --permanent --add-port=81/tcp
firewall-cmd --add-service=http --zone=trusted --permanent
firewall-cmd --reload

Step 2 – Lock the firewall down

Hackers these days are quick, like I mean I have had servers provisioned from well known hosting companies like Hetzner, Vultr, DigitalOcean, OVH Cloud, IONOS, Contabo and many others within 15 minutes. They scan these known IP ranges and go for known vulnerabilities very quick and will install rootkits, crypto miners, DDOS bots and other malware. The firewall rules I have set in place leave the needed ports to be open to use the dialer in the “trusted” zone, however I have left port 443(https) open to public zone so you can login and change the default password, because you can not use the dynamic portal to validate your IP until after the default password has been changed.

So, now that you’ve changed that password, lets remove the https port 443 from the public zone. To do so type the following commands: You can also see more use for the firewall here: How to – Use Firewalld via command line

firewall-cmd --permanent --remove-service=https
firewall-cmd --reload

You also need to update the dynamic portal redirect link with this command:

nano /var/www/vhosts/dynportal/valid8.php

Change the https://cyburdial.com/agc/cyburdial.php to https://yourdomain.com/agc/vicidial.php

Dynamic Portal settings

You should not be able to get to your domain at this point, you will need to use the dynamic portal login to validate your IP. You can find the URL for this at https://my.dialer.one:446/valid8.php (Again, use your domain) or for those of you that are only using IP – http://192.168.1.1:81/valid8.php. When you go to that page you will see a login area that looks like the image below:

Dynamic Portal

If you have followed the previous steps you should now be redirected to the ViciDial agent page to login with your username and password. Just browse to the admin area by removing the /agc/vicidial.php part. Some more advanced steps would be to change the Dynamic portal port off of 446 to something above the 50000 range as it takes more time for hackers to scan this high and they typically will not waste the time. Changing the name of the valid8.php file is also a good standard operating procedure to put in place, however this take some other changes in the template file as well, that I will not go over on this article. If you would like to see an article for that, post a comment below.

Step 3 – Setup your ViciDial instance

At this point, most of you should know how to setup your your Vicidial configurations and setup. If not make sure to check out a few of my friends YouTube pages with lots of content regarding this:

If you do decide to use the standard-db.sh file on my github, there is one thing that I messed up on the original design that needs to be fixed post import. Adding an “a” to the phone login on each user account. To run the standard-db file which comes pre-configured with everything ready to go other than adding DID’s and your VoIP carrier IP, simply run the commands below:

cd /usr/src/vicidial-install-scripts
chmod +x standard-db.sh
./standard-db.sh

Once you use this file, your new password to get into the 6666 user will be “CyburDial2024”

After this go into each user account an add the letter “a” to the phone login area as shown below:

User Account

Step 4 – Add DID’s and Carrier IP

This next step is going on the thought of using the standard-db file on my github, but for those of you that do the config’s yourself, don’t forget the bulk tools area is a great way for adding your DID’s in bulk.

Admin Utils

The next step is to add your DID’s, you can do so easily through the bulk tools in Admin > Reports > admin utilities

After this go Admin Bulk Tools

Click the highlighted area and the first area you see will be to copy DID’s, select the one I have there that says Copy this DID as shown below and paste your DID’s in the area available, then click submit.

Bulk Tools
Copy DID's

Paste them in this box and click submit

The second part of this is to change the carrier IP in admin > carriers > carrier

Carrier IP change

That’s it, you can start dialing. Now lets go over a few tools I have added to help manage and debug your systems:

  • sngrep – a command-line tool used for capturing and analyzing SIP (Session Initiation Protocol) packets
  • htop – an interactive system monitor and process viewer for Unix system
  • iftop – a similar tool used for the network card interface
  • postfix – a free and open-source mail transfer agent (MTA) that routes and delivers email
  • dovecot – an open-source IMAP and POP3 email server for Unix-like operating systems
  • roundcubemail – a web based GUI for email
  • inxi – detailed hardware information (inxi -Fxz)

Hopefully this helps with some of the questions I have been asked and common issues people run into. If you have any other questions, feel free to join my discord channel: https://discord.gg/ymGZJvF6hK or comment below.

Chris aka carpenox

How to – Decrease SDP(short duration percent) in ViciDial

Short Duration Percent

How to – Decrease SDP(short duration percent) in ViciDial

There is a new feature in ViciDial as of SVN 3878 that will allow you to increase the call handle time through the AMD system which would lower your Short Duration Percent(SDP) in your carrier stats. Doing so can typically save you hundreds if not thousands per month in VoIP fees for being below their SDP requirements. Adding one line to you carrier dialplan as show below will do this for you. Doing so will also save your DID’s (Caller ID’s).

Short Duration Percent

This example will add 7 seconds to each call.

exten => _8567.,1,AGI(agi://127.0.0.1:4577/call_log)
exten => _8567.,n,Set(__AMDMINLEN=7)
exten => _8567.,n,Dial(SIP/carrier/${EXTEN:4},,tToR)
exten => _8567.,n,Hangup

I hope this helps

-Chris aka carpenox

August 2024 VICIdial Security Update

Security Update needed

August 2024 VICIdial Security Update

Please read this carefully as it contains important information regarding the security of your VICIdial system.

The ViciDial Group recently conducted a security audit of VICIdial which resulted in the identification of severe vulnerabilities. We have patched these and submitted these changes to the code-base. Any system that is at SVN version 3848 or greater already has them. If your system is below that version, we strongly recommend that you upgrade to address these concerns. If you would like us to upgrade your system for you, please send a new email to support@cyburdial.com and put “Security Upgrade” in the subject. A typical upgrade takes about 15 to 30 minutes of support time. You can see the seriousness of these exploit here: https://packetstormsecurity.com/files/181461/VICIdial-2.14-917a-Remote-Code-Execution.html
https://packetstormsecurity.com/files/181460/VICIdial-2.14-917a-SQL-Injection.html

To find the SVN version of your VICIdial installation, log into your administator account and go to “Admin”, then click on “System Settings”. It will be the second line from the top, on the right, under “SVN Version”.

Please note, if your setup contains customizations done directly to VICIdial’s code, further review of your system will be needed as it may not be possible to upgrade you.

image

You can update your SVN by following this article: How to – Update your Vicidial version with subversion

Chris aka carpenox

How to – Fix the “You don’t have permission to access /RECORDINGS/MP3/” error within ViciDial

Artificial intelligence

How to – Fix the “You don’t have permission to access /RECORDINGS/MP3/” error within ViciDial

A problem arises when people do a scratch install of ViciDial and you do not set the proper permissions for the directory that the recordings are stored. I will go over a couple of things to check and/or set to make sure they work properly.

The usual suspect is not setting proper permissions on the folder for the recordings, to fix this simply type the commands below:

Redhat(Alma, Rocky or CentOS):
chmod -R 755 /var/spool/asterisk/monitorDONE
chown -R apache:apache /var/spool/asterisk/monitorDONE

OpenSuSE(Tumpleweed, Leap ViciBox):
chmod -R 755 /var/spool/asterisk/monitorDONE
chown -R wwwrun:www /var/spool/asterisk/monitorDONE

The other issue could be not having a proper alias/vhost set for apache. To fix this simply paste the lines below at the bottom of your http.conf file

CustomLog /dev/null common

Alias /RECORDINGS/MP3 "/var/spool/asterisk/monitorDONE/MP3/"

<Directory "/var/spool/asterisk/monitorDONE/MP3/">
    Options Indexes MultiViews
    AllowOverride None
    Require all granted
</Directory>

For Redhat this goes in /etc/httpd/conf/httpd.conf

For OpenSuSE this goes in /etc/apache2/httpd.conf

I hope this helps, as always if you have any questions feel free to drop by our live chat support on Skype or discord through the links below.

Skype – https://join.skype.com/ujkQ7i5lV78O

Discord – https://discord.gg/FjpDQbUs

-Chris aka carpenox

How to – Setup a ViciDial Cluster with scratch installs

Vicidial cluster

How to – Setup a ViciDial Cluster with scratch installs

This article is going to go over the steps I suggest to take in order to setup a ViciDial Cluster when using scratch install methods. I do things a little different when it comes to this to prepare for worst case scenario that a server may have problems and have to be taken offline, I install all services to each server, such as apache, mysql and asterisk this way if need be, they each can take on additional roles to cover for a server having to be taken out of production. Obviously this is going to assume you have ViciDial already installed on each server with all roles ready to go. To do so you can follow any one of my articles for scratch installs. I suggest using my auto installer for Alma Linux 9.

ViciDial Cluster
ViciDial Cluster

Step 1 – Install Vicidial on each server

Install ViciDial with the auto installer on each server.

Repeat this process on each server and then move on to step 2.

Step 2 – Turn off services not needed on each server role

Now we need to disable services not needed on each server to save on resources, but this way they are there if they are needed in the future.

  • DB Server: systemctl disable httpd
  • Web Server: systemctl disable mysql
  • Asterisk Servers: systemctl disable mysql

We want to leave apache running on the asterisk servers so we can install webrtc for webphones

Step 3 – Run the install.pl script on each server

Now we want to link them all together by running the install.pl script located in the source directory for vicidial, follow the following commands to get to and run it:

cd /usr/src/astguiclient/trunk
perl install.pl

Now follow the prompt and answer them accordingly. The pictures below will show the choices needed for each server role except make sure you set the IP for the DB server on all the rest instead of localhost.

DB Server and Web Server

image 7
DB Server

For the web server make sure you put the DB server IP instead of localhost

Asterisk Servers

image 8
Only use 5 and 7 on ONE asterisk server, not all, the rest put 123468

Make sure you only put 5 and 7 keepalives on one asterisk server, the rest you should only choose 123468.

Step 4 – Add them to the GUI for ViciDial

Now we need to add them into the GUI for Vicidial by going to Admin then servers

image 9
Go to Servers in the Admin area

Once you are here, click “Add a new server”

Once you are here, click "Add a new server"
Once you are here, click “Add a new server”

Fill out the fields accordingly and click submit

image 12
Add a new server

Now for the DB and web server turn the options to N(no) where you see highlighted below:

image 13
Active server, Active Asterisk server and Active agent server set to N

Step 5 – Add conferences

Add conferences for each asterisk server by following these instructions

Now reboot all servers and then check your reports page to make sure all servers are set to green like shown below

ViciDial Cluster
ViciDial Cluster

That’s all there is to it, not as hard as you thought it would be, right? If you have any questions feel free to join our live support on Skype:

I hope this helps!

Chris aka carpenox

How to – Set Up Asterisk 18 with ConfBridge for ViciDial with Bug fixes for monitoring

ConfBridge

How to – Set Up Asterisk 18 with ConfBridge for ViciDial with Bug fixes for monitoring

For this article, I will go over how you can install Asterisk 18 to use with ViciDial and using ConfBridge instead of MeetMe. There is a few bugs in the monitor function for use with ViciDial, however I have debugged it and will share this fix with all of you today.

Step 1 – Install and patch Asterisk 18

cd /usr/src/asterisk/
wget https://downloads.asterisk.org/pub/telephony/asterisk/old-releases/asterisk-18.18.1.tar.gz
tar -xzvf asterisk-18.18.1.tar.gz

cd /usr/src/asterisk/asterisk-18.18.1/
wget http://download.vicidial.com/asterisk-patches/Asterisk-18/amd_stats-18.patch
wget http://download.vicidial.com/asterisk-patches/Asterisk-18/iax_peer_status-18.patch
wget http://download.vicidial.com/asterisk-patches/Asterisk-18/sip_peer_status-18.patch
wget http://download.vicidial.com/asterisk-patches/Asterisk-18/timeout_reset_dial_app-18.patch
wget http://download.vicidial.com/asterisk-patches/Asterisk-18/timeout_reset_dial_core-18.patch
cd apps/
wget http://download.vicidial.com/asterisk-patches/Asterisk-18/enter.h
wget http://download.vicidial.com/asterisk-patches/Asterisk-18/leave.h
yes | cp -rf enter.h.1 enter.h
yes | cp -rf leave.h.1 leave.h

cd /usr/src/asterisk/asterisk-18.18.1/
patch < amd_stats-18.patch apps/app_amd.c
patch < iax_peer_status-18.patch channels/chan_iax2.c
patch < sip_peer_status-18.patch channels/chan_sip.c
patch < timeout_reset_dial_app-18.patch apps/app_dial.c
patch < timeout_reset_dial_core-18.patch main/dial.c

Step 2 – Compile Asterisk

: ${JOBS:=$(( $(nproc) + $(nproc) / 2 ))}
./configure --libdir=/usr/lib64 --with-gsm=internal --enable-opus --enable-srtp --with-ssl --enable-asteriskssl --with-pjproject-bundled --with-jansson-bundled

make menuselect/menuselect menuselect-tree menuselect.makeopts
#enable app_meetme
menuselect/menuselect --enable app_meetme menuselect.makeopts
#enable res_http_websocket
menuselect/menuselect --enable res_http_websocket menuselect.makeopts
#enable res_srtp
menuselect/menuselect --enable res_srtp menuselect.makeopts
make samples
sed -i 's|noload = chan_sip.so|;noload = chan_sip.so|g' /etc/asterisk/modules.conf
make -j ${JOBS} all
make install

Step 3 – Add ConfBridge to use with ViciDial

Lets add the extensions we need to use confbridges with ViciDial with the following commands:

cd /etc/asterisk
nano extensions.conf

Add the following lines below the [default] area:

; --------------------------
; ConfBridge Extensions
; --------------------------

; use to send a agent channel into the conference
exten => _9600XXX,1,Answer()
exten => _9600XXX,n,Playback(sip-silence)
exten => _9600XXX,n,ConfBridge(${EXTEN},vici_agent_bridge,vici_customer_user)
exten => _9600XXX,n,Hangup()

;; used to send an customer channel into the conference
exten => _29600XXX,1,Answer()
exten => _29600XXX,n,Playback(sip-silence)
exten => _29600XXX,n,ConfBridge(${EXTEN:1},vici_agent_bridge,vici_agent_user)
exten => _29600XXX,n,Hangup()

;; used by an admin to enter the confernece
exten => _39600XXX,1,Answer()
exten => _39600XXX,n,Playback(sip-silence)
exten => _39600XXX,n,ConfBridge(${EXTEN:1},vici_agent_bridge,vici_admin_user)
exten => _39600XXX,n,Hangup()

;; used to monitor a conference
exten => _49600XXX,1,Answer()
exten => _49600XXX,n,Playback(sip-silence)
exten => _49600XXX,n,ConfBridge(${EXTEN:1},vici_agent_bridge,vici_monitor_user)
exten => _49600XXX,n,Hangup()

;; used to record into a conference
exten => _59600XXX,1,Answer()
exten => _59600XXX,n,Playback(sip-silence)
exten => _59600XXX,n,ConfBridge(${EXTEN:1},vici_agent_bridge,vici_recording_user)
exten => _59600XXX,n,Hangup()

;; used to barge a conference
exten => _69600XXX,1,Answer()
exten => _69600XXX,n,Playback(sip-silence)
exten => _69600XXX,n,ConfBridge(${EXTEN:1},vici_agent_bridge,vici_barge_user)
exten => _69600XXX,n,Hangup()

;; used to trigger DTMF tones in a conference
exten => _79600XXX,1,Answer()
exten => _79600XXX,n,Playback(sip-silence)
exten => _79600XXX,n,ConfBridge(${EXTEN:1},vici_agent_bridge,vici_dtmf_user)
exten => _79600XXX,n,Hangup()

;; used to play an audio file to a conference
exten => _89600XXX,1,Answer()
exten => _89600XXX,n,Playback(sip-silence)
exten => _89600XXX,n,ConfBridge(${EXTEN:1},vici_agent_bridge,vici_audio_user)
exten => _89600XXX,n,Hangup()

;; used to kick all channels from a conference
exten => _99600XXX,1,ConfKick(${EXTEN:1},all)
exten => _99600XXX,2,Hangup()
exten => _55559600XXX,1,ConfKick(${EXTEN:4},all)
exten => _55559600XXX,2,Hangup()

While we are in this file, lets go ahead and address and fix one of the bugs, which is not being able to listen or barge on calls through the real-time report. Search for “08600X” in extensions.conf which is at line 119 and should look like the picture below:

image

BUG Fix: Change the 86 to 96

Step 4 – Add confbridge functions

nano /etc/asterisk/confbridge.conf and paste this at the bottom:
#include confbridge-vicidial.conf

Now create a new file called confbridge-vicidial.conf and add the following lines:

; Bridge Profile for agent conferences
[vici_agent_bridge]
type=bridge
max_members=10
record_conference=no
internal_sample_rate=8000
mixing_interval=40
video_mode=none
sound_join=enter
sound_leave=leave
sound_has_joined=sip-silence
sound_has_left=sip-silence
sound_kicked=sip-silence
sound_muted=sip-silence
sound_unmuted=sip-silence
sound_only_person=confbridge-only-participant
sound_only_one=sip-silence
sound_there_are=sip-silence
sound_other_in_party=sip-silence
sound_begin=sip-silence
sound_wait_for_leader=sip-silence
sound_leader_has_left=sip-silence
sound_get_pin=sip-silence
sound_invalid_pin=sip-silence
sound_locked=sip-silence
sound_locked_now=sip-silence
sound_unlocked_now=sip-silence
sound_error_menu=sip-silence
sound_participants_muted=sip-silence


; User Profile for agent channels
[vici_agent_user]
type=user
admin=no
quiet=no
startmuted=no
marked=yes
dtmf_passthrough=yes
hear_own_join_sound=yes
dsp_drop_silence=yes

; User Profile for admin channels
[vici_admin_user]
type=user
admin=yes
quiet=no
startmuted=no
marked=yes
dtmf_passthrough=yes
dsp_drop_silence=yes

; User Profile for monitoring
[vici_monitor_user]
type=user
admin=no
quiet=yes
startmuted=yes
marked=no
dtmf_passthrough=no
dsp_drop_silence=yes

; User Profile for barging
[vici_barge_user]
type=user
admin=no
quiet=no
startmuted=no
marked=no
dtmf_passthrough=yes
dsp_drop_silence=yes

; User Profile for customers channels
[vici_customer_user]
type=user
admin=no
quiet=no
startmuted=no
marked=yes
dtmf_passthrough=yes
hear_own_join_sound=no
dsp_drop_silence=yes

; User Profile for call recording channels
[vici_recording_user]
type=user
admin=no
quiet=yes
startmuted=yes
marked=no
dtmf_passthrough=no
dsp_drop_silence=yes

; User Profile for audio playback channels
[vici_audio_user]
type=user
admin=no
quiet=yes
startmuted=yes
marked=no
dtmf_passthrough=no
dsp_drop_silence=yes

; User Profile for triggering DTMF
[vici_dtmf_user]
type=user
admin=no
quiet=yes
startmuted=yes
marked=no
dtmf_passthrough=yes
dsp_drop_silence=yes

Step 5 – Add ConfBridge conferences into Asterisk database

mysql -A asterisk
INSERT INTO `vicidial_confbridges` VALUES 
(9600000,'10.10.10.17','','0',NULL),
(9600001,'10.10.10.17','','0',NULL),
(9600002,'10.10.10.17','','0',NULL),
(9600003,'10.10.10.17','','0',NULL),
(9600004,'10.10.10.17','','0',NULL),
(9600005,'10.10.10.17','','0',NULL),
(9600006,'10.10.10.17','','0',NULL),
(9600007,'10.10.10.17','','0',NULL),
(9600008,'10.10.10.17','','0',NULL),
(9600009,'10.10.10.17','','0',NULL),
(9600010,'10.10.10.17','','0',NULL),
(9600011,'10.10.10.17','','0',NULL),
(9600012,'10.10.10.17','','0',NULL),
(9600013,'10.10.10.17','','0',NULL),
(9600014,'10.10.10.17','','0',NULL),
(9600015,'10.10.10.17','','0',NULL),
(9600016,'10.10.10.17','','0',NULL),
(9600017,'10.10.10.17','','0',NULL),
(9600018,'10.10.10.17','','0',NULL),
(9600019,'10.10.10.17','','0',NULL),
(9600020,'10.10.10.17','','0',NULL),
(9600021,'10.10.10.17','','0',NULL),
(9600022,'10.10.10.17','','0',NULL),
(9600023,'10.10.10.17','','0',NULL),
(9600024,'10.10.10.17','','0',NULL),
(9600025,'10.10.10.17','','0',NULL),
(9600026,'10.10.10.17','','0',NULL),
(9600027,'10.10.10.17','','0',NULL),
(9600028,'10.10.10.17','','0',NULL),
(9600029,'10.10.10.17','','0',NULL),
(9600030,'10.10.10.17','','0',NULL),
(9600031,'10.10.10.17','','0',NULL),
(9600032,'10.10.10.17','','0',NULL),
(9600033,'10.10.10.17','','0',NULL),
(9600034,'10.10.10.17','','0',NULL),
(9600035,'10.10.10.17','','0',NULL),
(9600036,'10.10.10.17','','0',NULL),
(9600037,'10.10.10.17','','0',NULL),
(9600038,'10.10.10.17','','0',NULL),
(9600039,'10.10.10.17','','0',NULL),
(9600040,'10.10.10.17','','0',NULL),
(9600041,'10.10.10.17','','0',NULL),
(9600042,'10.10.10.17','','0',NULL),
(9600043,'10.10.10.17','','0',NULL),
(9600044,'10.10.10.17','','0',NULL),
(9600045,'10.10.10.17','','0',NULL),
(9600046,'10.10.10.17','','0',NULL),
(9600047,'10.10.10.17','','0',NULL),
(9600048,'10.10.10.17','','0',NULL),
(9600049,'10.10.10.17','','0',NULL),
(9600050,'10.10.10.17','','0',NULL),
(9600051,'10.10.10.17','','0',NULL),
(9600052,'10.10.10.17','','0',NULL),
(9600053,'10.10.10.17','','0',NULL),
(9600054,'10.10.10.17','','0',NULL),
(9600055,'10.10.10.17','','0',NULL),
(9600056,'10.10.10.17','','0',NULL),
(9600057,'10.10.10.17','','0',NULL),
(9600058,'10.10.10.17','','0',NULL),
(9600059,'10.10.10.17','','0',NULL),
(9600060,'10.10.10.17','','0',NULL),
(9600061,'10.10.10.17','','0',NULL),
(9600062,'10.10.10.17','','0',NULL),
(9600063,'10.10.10.17','','0',NULL),
(9600064,'10.10.10.17','','0',NULL),
(9600065,'10.10.10.17','','0',NULL),
(9600066,'10.10.10.17','','0',NULL),
(9600067,'10.10.10.17','','0',NULL),
(9600068,'10.10.10.17','','0',NULL),
(9600069,'10.10.10.17','','0',NULL),
(9600070,'10.10.10.17','','0',NULL),
(9600071,'10.10.10.17','','0',NULL),
(9600072,'10.10.10.17','','0',NULL),
(9600073,'10.10.10.17','','0',NULL),
(9600074,'10.10.10.17','','0',NULL),
(9600075,'10.10.10.17','','0',NULL),
(9600076,'10.10.10.17','','0',NULL),
(9600077,'10.10.10.17','','0',NULL),
(9600078,'10.10.10.17','','0',NULL),
(9600079,'10.10.10.17','','0',NULL),
(9600080,'10.10.10.17','','0',NULL),
(9600081,'10.10.10.17','','0',NULL),
(9600082,'10.10.10.17','','0',NULL),
(9600083,'10.10.10.17','','0',NULL),
(9600084,'10.10.10.17','','0',NULL),
(9600085,'10.10.10.17','','0',NULL),
(9600086,'10.10.10.17','','0',NULL),
(9600087,'10.10.10.17','','0',NULL),
(9600088,'10.10.10.17','','0',NULL),
(9600089,'10.10.10.17','','0',NULL),
(9600090,'10.10.10.17','','0',NULL),
(9600091,'10.10.10.17','','0',NULL),
(9600092,'10.10.10.17','','0',NULL),
(9600093,'10.10.10.17','','0',NULL),
(9600094,'10.10.10.17','','0',NULL),
(9600095,'10.10.10.17','','0',NULL),
(9600096,'10.10.10.17','','0',NULL),
(9600097,'10.10.10.17','','0',NULL),
(9600098,'10.10.10.17','','0',NULL),
(9600099,'10.10.10.17','','0',NULL),
(9600100,'10.10.10.17','','0',NULL),
(9600101,'10.10.10.17','','0',NULL),
(9600102,'10.10.10.17','','0',NULL),
(9600103,'10.10.10.17','','0',NULL),
(9600104,'10.10.10.17','','0',NULL),
(9600105,'10.10.10.17','','0',NULL),
(9600106,'10.10.10.17','','0',NULL),
(9600107,'10.10.10.17','','0',NULL),
(9600108,'10.10.10.17','','0',NULL),
(9600109,'10.10.10.17','','0',NULL),
(9600110,'10.10.10.17','','0',NULL),
(9600111,'10.10.10.17','','0',NULL),
(9600112,'10.10.10.17','','0',NULL),
(9600113,'10.10.10.17','','0',NULL),
(9600114,'10.10.10.17','','0',NULL),
(9600115,'10.10.10.17','','0',NULL),
(9600116,'10.10.10.17','','0',NULL),
(9600117,'10.10.10.17','','0',NULL),
(9600118,'10.10.10.17','','0',NULL),
(9600119,'10.10.10.17','','0',NULL),
(9600120,'10.10.10.17','','0',NULL),
(9600121,'10.10.10.17','','0',NULL),
(9600122,'10.10.10.17','','0',NULL),
(9600123,'10.10.10.17','','0',NULL),
(9600124,'10.10.10.17','','0',NULL),
(9600125,'10.10.10.17','','0',NULL),
(9600126,'10.10.10.17','','0',NULL),
(9600127,'10.10.10.17','','0',NULL),
(9600128,'10.10.10.17','','0',NULL),
(9600129,'10.10.10.17','','0',NULL),
(9600130,'10.10.10.17','','0',NULL),
(9600131,'10.10.10.17','','0',NULL),
(9600132,'10.10.10.17','','0',NULL),
(9600133,'10.10.10.17','','0',NULL),
(9600134,'10.10.10.17','','0',NULL),
(9600135,'10.10.10.17','','0',NULL),
(9600136,'10.10.10.17','','0',NULL),
(9600137,'10.10.10.17','','0',NULL),
(9600138,'10.10.10.17','','0',NULL),
(9600139,'10.10.10.17','','0',NULL),
(9600140,'10.10.10.17','','0',NULL),
(9600141,'10.10.10.17','','0',NULL),
(9600142,'10.10.10.17','','0',NULL),
(9600143,'10.10.10.17','','0',NULL),
(9600144,'10.10.10.17','','0',NULL),
(9600145,'10.10.10.17','','0',NULL),
(9600146,'10.10.10.17','','0',NULL),
(9600147,'10.10.10.17','','0',NULL),
(9600148,'10.10.10.17','','0',NULL),
(9600149,'10.10.10.17','','0',NULL),
(9600150,'10.10.10.17','','0',NULL),
(9600151,'10.10.10.17','','0',NULL),
(9600152,'10.10.10.17','','0',NULL),
(9600153,'10.10.10.17','','0',NULL),
(9600154,'10.10.10.17','','0',NULL),
(9600155,'10.10.10.17','','0',NULL),
(9600156,'10.10.10.17','','0',NULL),
(9600157,'10.10.10.17','','0',NULL),
(9600158,'10.10.10.17','','0',NULL),
(9600159,'10.10.10.17','','0',NULL),
(9600160,'10.10.10.17','','0',NULL),
(9600161,'10.10.10.17','','0',NULL),
(9600162,'10.10.10.17','','0',NULL),
(9600163,'10.10.10.17','','0',NULL),
(9600164,'10.10.10.17','','0',NULL),
(9600165,'10.10.10.17','','0',NULL),
(9600166,'10.10.10.17','','0',NULL),
(9600167,'10.10.10.17','','0',NULL),
(9600168,'10.10.10.17','','0',NULL),
(9600169,'10.10.10.17','','0',NULL),
(9600170,'10.10.10.17','','0',NULL),
(9600171,'10.10.10.17','','0',NULL),
(9600172,'10.10.10.17','','0',NULL),
(9600173,'10.10.10.17','','0',NULL),
(9600174,'10.10.10.17','','0',NULL),
(9600175,'10.10.10.17','','0',NULL),
(9600176,'10.10.10.17','','0',NULL),
(9600177,'10.10.10.17','','0',NULL),
(9600178,'10.10.10.17','','0',NULL),
(9600179,'10.10.10.17','','0',NULL),
(9600180,'10.10.10.17','','0',NULL),
(9600181,'10.10.10.17','','0',NULL),
(9600182,'10.10.10.17','','0',NULL),
(9600183,'10.10.10.17','','0',NULL),
(9600184,'10.10.10.17','','0',NULL),
(9600185,'10.10.10.17','','0',NULL),
(9600186,'10.10.10.17','','0',NULL),
(9600187,'10.10.10.17','','0',NULL),
(9600188,'10.10.10.17','','0',NULL),
(9600189,'10.10.10.17','','0',NULL),
(9600190,'10.10.10.17','','0',NULL),
(9600191,'10.10.10.17','','0',NULL),
(9600192,'10.10.10.17','','0',NULL),
(9600193,'10.10.10.17','','0',NULL),
(9600194,'10.10.10.17','','0',NULL),
(9600195,'10.10.10.17','','0',NULL),
(9600196,'10.10.10.17','','0',NULL),
(9600197,'10.10.10.17','','0',NULL),
(9600198,'10.10.10.17','','0',NULL),
(9600199,'10.10.10.17','','0',NULL),
(9600200,'10.10.10.17','','0',NULL),
(9600201,'10.10.10.17','','0',NULL),
(9600202,'10.10.10.17','','0',NULL),
(9600203,'10.10.10.17','','0',NULL),
(9600204,'10.10.10.17','','0',NULL),
(9600205,'10.10.10.17','','0',NULL),
(9600206,'10.10.10.17','','0',NULL),
(9600207,'10.10.10.17','','0',NULL),
(9600208,'10.10.10.17','','0',NULL),
(9600209,'10.10.10.17','','0',NULL),
(9600210,'10.10.10.17','','0',NULL),
(9600211,'10.10.10.17','','0',NULL),
(9600212,'10.10.10.17','','0',NULL),
(9600213,'10.10.10.17','','0',NULL),
(9600214,'10.10.10.17','','0',NULL),
(9600215,'10.10.10.17','','0',NULL),
(9600216,'10.10.10.17','','0',NULL),
(9600217,'10.10.10.17','','0',NULL),
(9600218,'10.10.10.17','','0',NULL),
(9600219,'10.10.10.17','','0',NULL),
(9600220,'10.10.10.17','','0',NULL),
(9600221,'10.10.10.17','','0',NULL),
(9600222,'10.10.10.17','','0',NULL),
(9600223,'10.10.10.17','','0',NULL),
(9600224,'10.10.10.17','','0',NULL),
(9600225,'10.10.10.17','','0',NULL),
(9600226,'10.10.10.17','','0',NULL),
(9600227,'10.10.10.17','','0',NULL),
(9600228,'10.10.10.17','','0',NULL),
(9600229,'10.10.10.17','','0',NULL),
(9600230,'10.10.10.17','','0',NULL),
(9600231,'10.10.10.17','','0',NULL),
(9600232,'10.10.10.17','','0',NULL),
(9600233,'10.10.10.17','','0',NULL),
(9600234,'10.10.10.17','','0',NULL),
(9600235,'10.10.10.17','','0',NULL),
(9600236,'10.10.10.17','','0',NULL),
(9600237,'10.10.10.17','','0',NULL),
(9600238,'10.10.10.17','','0',NULL),
(9600239,'10.10.10.17','','0',NULL),
(9600240,'10.10.10.17','','0',NULL),
(9600241,'10.10.10.17','','0',NULL),
(9600242,'10.10.10.17','','0',NULL),
(9600243,'10.10.10.17','','0',NULL),
(9600244,'10.10.10.17','','0',NULL),
(9600245,'10.10.10.17','','0',NULL),
(9600246,'10.10.10.17','','0',NULL),
(9600247,'10.10.10.17','','0',NULL),
(9600248,'10.10.10.17','','0',NULL),
(9600249,'10.10.10.17','','0',NULL),
(9600250,'10.10.10.17','','0',NULL),
(9600251,'10.10.10.17','','0',NULL),
(9600252,'10.10.10.17','','0',NULL),
(9600253,'10.10.10.17','','0',NULL),
(9600254,'10.10.10.17','','0',NULL),
(9600255,'10.10.10.17','','0',NULL),
(9600256,'10.10.10.17','','0',NULL),
(9600257,'10.10.10.17','','0',NULL),
(9600258,'10.10.10.17','','0',NULL),
(9600259,'10.10.10.17','','0',NULL),
(9600260,'10.10.10.17','','0',NULL),
(9600261,'10.10.10.17','','0',NULL),
(9600262,'10.10.10.17','','0',NULL),
(9600263,'10.10.10.17','','0',NULL),
(9600264,'10.10.10.17','','0',NULL),
(9600265,'10.10.10.17','','0',NULL),
(9600266,'10.10.10.17','','0',NULL),
(9600267,'10.10.10.17','','0',NULL),
(9600268,'10.10.10.17','','0',NULL),
(9600269,'10.10.10.17','','0',NULL),
(9600270,'10.10.10.17','','0',NULL),
(9600271,'10.10.10.17','','0',NULL),
(9600272,'10.10.10.17','','0',NULL),
(9600273,'10.10.10.17','','0',NULL),
(9600274,'10.10.10.17','','0',NULL),
(9600275,'10.10.10.17','','0',NULL),
(9600276,'10.10.10.17','','0',NULL),
(9600277,'10.10.10.17','','0',NULL),
(9600278,'10.10.10.17','','0',NULL),
(9600279,'10.10.10.17','','0',NULL),
(9600280,'10.10.10.17','','0',NULL),
(9600281,'10.10.10.17','','0',NULL),
(9600282,'10.10.10.17','','0',NULL),
(9600283,'10.10.10.17','','0',NULL),
(9600284,'10.10.10.17','','0',NULL),
(9600285,'10.10.10.17','','0',NULL),
(9600286,'10.10.10.17','','0',NULL),
(9600287,'10.10.10.17','','0',NULL),
(9600288,'10.10.10.17','','0',NULL),
(9600289,'10.10.10.17','','0',NULL),
(9600290,'10.10.10.17','','0',NULL),
(9600291,'10.10.10.17','','0',NULL),
(9600292,'10.10.10.17','','0',NULL),
(9600293,'10.10.10.17','','0',NULL),
(9600294,'10.10.10.17','','0',NULL),
(9600295,'10.10.10.17','','0',NULL),
(9600296,'10.10.10.17','','0',NULL),
(9600297,'10.10.10.17','','0',NULL),
(9600298,'10.10.10.17','','0',NULL),
(9600299,'10.10.10.17','','0',NULL);
exit

Step 6 – Update the IP to your Server IP

Run the following command:

/usr/share/astguiclient/ADMIN_update_server_ip.pl –old-server_ip=10.10.10.17

image 1

Step 7 – Patch the files for ViciDial to be able to use confbridges

cd /usr/src/astguiclient/trunk/extras/ConfBridge/
cp * /usr/share/astguiclient/
cd /usr/share/astguiclient/
mv manager_send.php.diff vdc_db_query.php.diff vicidial.php.diff /var/www/html/agc/
patch -p0 < ADMIN_keepalive_ALL.pl.diff
patch -p0 < ADMIN_update_server_ip.pl.diff
patch -p0 < AST_DB_optimize.pl.diff
chmod +x AST_conf_update_screen.pl
patch -p0 < AST_reset_mysql_vars.pl.diff
cd /var/www/html/agc/
patch -p0 < manager_send.php.diff
patch -p0 < vdc_db_query.php.diff
patch -p0 < vicidial.php.diff

Step 8 – Change the screens for Vicidial being used

A new screen session has been added called ‘AST_conf_update_screen.pl’. This screen session replaces both the AST_conf_update.pl and AST_conf_update_3way.pl scripts. It checks both MeetMe and ConfBridge conferences for unnecessary channels and removes them. For instance if an agent does a Leave 3way and a few minutes later one of the remaining channels hangs up. This script will remove the remaining channel and free the conference for use by Vicidial. This screen session is optional for use with MeetMe but is required to be used with ConfBridge.

image 2

Step 9 – Change /etc/astguiclient.conf

To enable this screen session you need to add a ‘C’ to the ‘VARactive_keepalives’ variable in the ‘/etc/astguiclient.conf’ on your dialers, and comment out the following line from your crontab:

### updater for conference validator #* * * * * /usr/share/astguiclient/AST_conf_update.pl

You can configure the refresh interval for how often the screen session checks for unnecessary channels by changing “Conf Update Interval” in Admin -> Servers.

image 3

Step 10- Make the needed changes in ViciDial GUI

Login to the ViciDial Admin GUI and go to Admin > Servers and click on the server(s) that are dialers and change the conferencing engine to “CONFBRIDGE” as shown above.

Step 11 – Add confbridge to manager.conf

nano /etc/asterisk/manager.conf
Go to the bottom and paste:

[confcron]
secret = 1234
read = command,reporting
write = command,reporting

eventfilter=Event: Meetme
eventfilter=Event: Confbridge

Step 12 – Fix the last bug to get “listen” and “barge” working

OK, so now we have to do some source code changes that will fix the issues with monitoring through the ViciDial real-time report. We’re going to be editing the non_agent_api.php in /your web directory.

For OpenSUSE its in /srv/www/htdocs/vicidial and for RedHat such as CentOS, Alma or Rocky its in /var/www/html/vicidial.

nano /var/www/html/vicidial/non_agent_api.php
Line 3295: Change vicidial_conferences to vicidial_confbridges like you see below:

image 4

You should now have your setup able to use confbridge.

-Chris

How to – Use ViciDial’s AGI’s

AGI

How to – Use ViciDIal’s AGI’s


In the dynamic world of call centers, staying ahead of the curve requires constant innovation. One groundbreaking technology that’s been quietly shaping the industry is VICIdial AGI (Asterisk Gateway Interface). AGIs are the unsung heroes behind the scenes, making complex call center operations look seamless and effortless.
What is VICIdial AGI?
VICIdial, a popular open-source call center suite, employs AGI to interact with Asterisk, the underlying telephony platform. This interface empowers VICIdial to communicate with external systems and execute a wide range of tasks during live calls, offering call centers an unprecedented level of automation and customization.
The Power of Automation
VICIdial AGIs can automate repetitive and time-consuming tasks, such as call routing, data retrieval, and post-call actions. This automation significantly reduces the workload on agents, allowing them to focus on providing top-notch customer service.
Enhancing the Customer Experience
AGIs are the magic behind personalized customer experiences. They can pull up customer data in real-time, enabling agents to greet callers by name and access their history and preferences. This level of personalization can transform a routine call into a memorable interaction.
Unleashing Real-time Insights
VICIdial AGIs are adept at gathering and analyzing data during live calls. This real-time insight is invaluable for call center managers. It provides a window into agent performance, customer sentiment, and call outcomes, helping in immediate decision-making and performance optimization.
Customizing to Perfection
One of the greatest strengths of VICIdial AGIs is their ability to be tailored to meet the specific needs of a call center. From custom scripts to integration with external databases and applications, AGIs offer a world of possibilities.
Challenges and Expertise
While VICIdial AGIs offer immense potential, they do require a level of technical expertise to configure and maintain. Call centers often seek the support of experienced professionals who can harness the full power of AGIs.
The Future of VICIdial AGIs
As call centers continue to evolve, VICIdial AGIs are set to play an even more significant role. They are the driving force behind efficient, personalized, and data-driven customer interactions.
In conclusion, VICIdial AGIs are a true game-changer in the call center industry, providing automation, personalization, and real-time insights that redefine customer service. As businesses strive for excellence, AGIs are becoming a critical component in the pursuit of superior customer experiences.


In this article, I will just display some information from each AGI so there is a useful resource to see what each AGI’s function(s) are plus an example of how to use them. Keep in mind, these can all be changed within the source code to customize solutions you may be trying to accomplish. They can all be found here: /var/lib/asterisk/agi-bin/


agent-monitor.agi

# agent_monitor.agi      version 2.14
#
# NOTE! - To use this script you MUST have entries in the System Settings
#         "Custom Dialplan Entry" for this to work.
#         Read the AGENT_MONITOR.txt document for more information.
#
# This script is designed to allow managers to listen to agent sessions by
# dialing a phone exten number or user ID number. For this to work, the user ID
# or phone extension must be only digits. If you are using the phone extension,
# then all phone extensions on the system must be unique.
#
# user is prompted for a user ID or phone login then press #
# then the user is forwarded to monitor the active vicidial agent session
#
# ; settings for this script:
# ; 1. USER, PHONE, PLOGIN, REDIRECT or RANDOM, lookup by user id, phone extension or phone login (default is USER)
# ; 2. Y or N, log in api log (default is N)
# ; 3. BARGE or LISTEN, (default is LISTEN)
# ; 4. Prepopulated ID, for use in context by itself
# ; 5. Campaign limits, double-dash-delimited, i.e. "TEST--TEST2", (default is disabled)
# ; 6. Y or N, play user IDs to listen to (default is N)
#
# can be added as an AGI to a Call Menu, or just a direct extension transfer:
#
# ; call menu AGI with options:
#  agent_monitor.agi,USER---N---LISTEN------TEST--TEST2---N
#
# ; or as extension transfer to "up_monitor" context and "s" extension

agi-AGENT_dial_in.agi

# agi-AGENT_dial_in.agi      version 2.6
#
# This script is designed to allow agents the ability to dial in to an extension
# to establish the phone connection to their VICIDIAL session. The user login
# and password must be only digits and nothing but digits to use this utility.
#
# user is prompted for their user ID then press #
# user is prompted for their passcode then press #
# then the user is forwarded to the active vicidial agent session
#
# ; settings for this script:
# ; 1. allow user_id only login (disabled by default)
# ;     Y - allow user ID only with no password
# ;     CONTACTS - lookup the user ID as the 'office_num' field in the contact_information table
# ;     N or (blank) - require password (default)
# ; 2. forward to A or B within Call Menu instead of logging into an agent session
# ;     Y - forward to A option on valid user ID or B option on invalid user ID
# ;     N or (blank) - go to agent session (default)
#
# can be added as an AGI to a Call Menu, or as below:
# ;agent dial-in:
#exten => 2345,1,Answer         ; Answer the line
#exten => 2345,2,AGI(agi-AGENT_dial_in.agi)
#exten => 2345,3,Hangup
#
# ; call menu with options:
#       agi-AGENT_dial_in.agi,Y---Y

agi-AGENT_route.agi

# agi-AGENT_route.agi version 2.14
#
# for use with a Call Menu in the custom dialplan section or as an AGI route.
#
# ; settings for this script:
# ; 1. DID pattern to use for In-group initiation settings ('default' is default)
# ; 2. the agentdirect in-group to send the calls to ('AGENTDIRECT' is default)
# ; 3. transfer only to ACTIVE in the system agent or vicidial LOGGED_IN agent
# ;             ('ACTIVE' is default)
# ; 4. prompt for user ID, if this is filled in with a filename it will ask,
# ;             otherwise it will assume $extension is the user ID
# ; 5. number of digits required for user ID validation, X will allow anything,
# ;             this will only be enforced if "prompt for user ID" prompt is populated
# ; 6. audio filename for invalid selection, agent not available ('invalid' is default)
# ; 7. audio filename for invalid user id re-enter prompt, agent not available
# ; 8. number of retry attempts to enter a valid user ID
# ;             this will only be enforced if "prompt for user ID" prompt is populated
# ; 9. in-group to send the call to if there is no valid agent, if none is
# ;             defined, then the call will be directed to 's' exten
# ; 10. audio filename before sending call to no-agent route
# ; 11. audio filename before sending call to no-agent route if agent active but
# ;             not logged-in to vicidial
#
#; example in CallMenu AGI route with all options
# "agi-AGENT_route.agi,default---AGENTDIRECT---LOGGED_IN---if-u-know-ext-dial---X---invalid---please-try-again---3---TEST_IN3---pbxtransfer---outside-transf>
#; example with 4-digit agent IDs
# exten => _XXXX,1,AGI(agi-AGENT_route.agi,default---AGENTDIRECT---ACTIVE)

agi-CALLCARD_dial_in.agi

# agi-CALLCARD_dial_in.agi      version 2.6
#
# This script is designed to allow customers the ability to dial in to a DID and
# enter in a PIN number that would look up their account and send on to a
# specified in-group if pin is valid
#
# user is prompted for their PIN number only (no pound '#' required)
# then the user is forwarded to the active vicidial agent session
#
# can be added as an AGI to a Call Menu, or as below:
# Call Menu Entry: "agi-CALLCARD_dial_in.agi,en---3---callcard_pin_enter---callcard_pin_invalid---default"
# ;agent dial-in:
#exten => 2346,1,Answer         ; Answer the line
#exten => 2346,2,AGI(agi-CALLCARD_dial_in.agi,en---3---callcard_pin_enter---callcard_pin_invalid---default)
#exten => 2346,3,Hangup
#
# ; Below are the parameters needed for the script to be run properly
# ; 1. language
# ;     - en -                  English <default>
# ;     - es -                  Spanish
# ;     - fr -                  French, not fully supported
# ; 2. maximum attempts before hangup:
# ;     - 3        <default>
# ; 3. audio file enter pin number prompt:
# ;     - callcard_pin_enter        <default>
# ; 4. audio file invalid pin number prompt:
# ;     - callcard_pin_invalid      <default>
# ; 5. DID pattern to use for in-group forwarding settings:
# ;     - default      <default>
# ;         - USE-ORIGINATING-DID - this option will look up the DID the customer dialed in on and use those settings
#
# other audio files used:
# - pin-number-accepted
# - vm-youhave
# - callcard_minutes_left

agi-CANADA_PRI_CIDname.agi

# agi-CANADA_PRI_CIDname.agi version 0.1
#
# Runs after call goes through IAX loop to send out custom CallerIDname on
# Canadian PRIs that allow dynamic setting of CIDname with call initiation
#
# You need to have lines similar to those below in your extensions.conf file:
#
# ;outbound VICIDIAL calls:
#exten => _91NXXNXXXXXX,1,AGI(call_log.agi,${EXTEN})
#exten => _91NXXNXXXXXX,2,AGI(agi-CANADA_PRI_CIDname.agi,${EXTEN})
#exten => _91NXXNXXXXXX,3,Dial(${TRUNKX}/${EXTEN:1},55,tTo)
#exten => _91NXXNXXXXXX,4,Hangup

agi-DID_route.agi

# agi-DID_route.agi version 2.14
#
# runs when a call comes into an inbound context on a trunk. This script will
# send the calls to various places depending on the settings for each DID.
#
# You need to put a line similar to this below in your extensions.conf file in
# the context for where incoming calls go from your trunks (for example, the
# trunkinbound context which is present in the default dialplan):
#
#[trunkinbound]
# ;inbound DID catch-all:
#exten => _X.,1,AGI(agi-DID_route.agi)

agi-dtmf.agi

# agi-dtmf.agi - script for playing DTMF tones or signals received as the callerid field or in the command CLI
#
# DTMF sound files must be in /var/lib/asterisk/sounds for this to work
#
# Accepted values are: 1 2 3 4 5 6 7 8 9 0 # * ,
# comma means pause for 1 second (use 'S' for pause in CLI mode)
#
# exten => 8500998,1,Answer
# exten => 8500998,2,Playback(silence)
# exten => 8500998,3,AGI(agi-dtmf.agi)
#; exten => 8500998,3,AGI(agi-dtmf.agi,signalonly) ; optional signal only DTMF
# exten => 8500998,4,Hangup
#
# Can also be used in a Call Menu: agi-dtmf.agi,signalonly---12345   # optional signal only DTMF with CLI-defined DTMF values

agi-ingroup_survey.agi

# agi-ingroup_survey.agi version 2.14
#
# runs after a call gets transferred from an agent to ask a question, then
# optionally transfer to a call menu. Takes settings from an In-Group

agi-IVR_recording_verification.agi

# agi-IVR_recording_verification.agi      version 2.6
#
# This script is designed to function as a complete automated 3rd party
# verification IVR recording system. This script will work by optionally asking
# for a company ID and/or a customer phone number, then it will play through the
# listed prompts asking for a single digit press (i.e. 1 for a yes or a 3 for a
# no, hash/pound/star/zero/0 are not accepted only 1-9 is valid for these steps).
# All data for these calls will be logged to the vicidial_ivr table as well as
# optionally to a log file  in the standard astguiclient log file directory
# and/or STDERR output on the asterisk process. This script uses the
# /etc/astguiclient.conf file for database connection settings, logging data and
# for logfile path information only.
#
# With a modified VDAD agi transfer script, this script could also be used to do
# automated outbound surveys as well. Feature under development.
#
# ; 1. the DNIS or inbound number called
# ; 2. play the recording ID (Y|N) with prompt leading up to it
# ; 3. record this call(Y|N)
# ; 4. ask for a company code(Y|N) with the number of digits in that company code and the prompt
# ; 5. ask for a user code(Y|N) with the number of digits in that user code and the prompt
# ; 6. ask for the customer phone number(Y|N) with the number of digits in that phone number and the prompt (Y-10-85100001)
# ; 7. speak the current date (Y|N) with prompt announcing the date
# ; 8. a dash-delimited list of prompts that expect responses(85100002-85100003)
# ; 9. a "your recording ID is..." prompt (85100004)
# ; 10. logging/output (FILE|STDERR|BOTH|NONE)
#
# ;inbound IVR call:
#exten => 1234,1,Ringing        ; call ringing
#exten => 1234,2,Wait(1)        ; Wait 1 second for CID delivery from PRI
#exten => 1234,3,Answer         ; Answer the line
#exten => 1234,4,AGI(agi-IVR_recording_verification.agi,7274506620---Y-85100004---Y---Y-1-85100016---N---N---Y-85100007---85100009-600--85100012-30--8510001>
#exten => 1234,5,Hangup
#
# ;inbound IVR call from a VICIDIAL transfer:
#exten => _83002*.,1,Ringing            ; call ringing
#exten => _83002*.,2,Wait(1)            ; Wait 1 second for CID delivery
#exten => _83002*.,3,Answer             ; Answer the line
#exten => _83002*.,4,AGI(agi-IVR_recording_verification.agi,7275551234---N---Y---N---N---Y-10-85100001---N---85100002-85100003---85100004---BOTH)
#exten => _83002*.,5,Hangup

agi-LCR-Route.agi

# agi-LCR-Route.agi version 2.2.0
#
# This script looks up the NPANXX in the lcr table and sets
# the LCRTRUNK dialplan variable to the carrier string
# with the cheapest rate. If no carrier is found for this NPANXX
# the variable is unchanged so you should set it with the default
# previously.
#
# [globals]
# LCRTRUNK=SIP/provider1    ; default LCR trunk
#
# [default]
# ;outbound VICIDIAL calls:
# exten => _91NXXNXXXXXX,1,AGI(agi://127.0.0.1:4577/call_log)
# exten => _91NXXNXXXXXX,n,AGI(agi-LCR-Route.agi,${EXTEN:2:6})
# exten => _91NXXNXXXXXX,n,Dial(${LCRTRUNK}/${EXTEN:2},,To)
# exten => _91NXXNXXXXXX,n,Hangup
#
# Here is the SQL to create the lcr table:
#
# create table if not exists lcr (
#        npanxx mediumint not null,
#        rate varchar(10) not null,
#        carrier_string varchar(20) not null
# );
# alter table lcr add unique index (npanxx, rate, carrier_string);
#
# A typical npanxx from this table should look like:
#
# mysql> select npanxx,rate,carrier_string from lcr where npanxx='734223';
# +--------+--------+----------------+
# | npanxx | rate   | carrier_string |
# +--------+--------+----------------+
# | 734223 | 0.0064 | SIP/provider1  |
# | 734223 | 0.0076 | SIP/provider2  |
# +--------+--------+----------------+
#
# Unfortunately these rate sheets are not in a standard format.
# You will have to write a custom loading script to populate this table.
# An exampe loading script is provided in the extras directory of the
# astguiclient source code called lcr_loader_example.pl

agi-NVA_recording.agi

# agi-NVA_recording.agi version 2.12
#
# This script is designed to give recording ability to agents not the using
# ViciDial agent screen
#
# ; 1. logging output (NONE|STDERR|FILE|BOTH)
# ; 2. the ViciDial user ID, if empty it defaults to accountcode(usually phone extension) or vicidial_live_agents user who launched the call
# ; 3. log this call in user_call_log (Y|N) default N
# ; 4. log this call in call_log (Y|N) default N, ONLY NEEDED FOR INBOUND AND INTERSYSTEM CALLS!!!
# ; 5. audio record this call (Y|N) default N
# ; 6. double-log this call in call_log (Y|N) default N, ONLY NEEDED FOR INBOUND CALLMENU FORWARDED CALLS!!!
# ; 7. play the recording ID of this call before recording starts
# ; 8. include the recording ID in the filename
# ; 9. search vicidial_list for phone number dialed (Y|N) default N, assumes 10 digit phone numbers
# ; 10. if 9 is Y, this is search method (ALLLISTS|PHONE) default ALLLISTS, search all lists, use phone setting, CURRENTLY DOES NOTHING
# ; 11. error out and end call if phone number is not found (Y|N) default N
# ; 12. run the phone entry's NVA Call URL (Y|N) default N
# ; 13. if 9 is Y, and phone number is not found, insert into phone's NVA List ID (Y|N) default N
# ; 14. if 13 is Y, override phone's NVA List ID with this list ID when lead is inserted
# ; 15. if 13 is Y, override phone's NVA Phone Code with this phone code when lead is inserted
# ; 16. if 13 is Y, override phone's NVA Status with this status when lead is inserted
#
#
# ;custom dialplan entry example: (similar to the defaultlog Call Menu)
#exten => _X.,1,AGI(agi-NVA_recording.agi,BOTH------Y---N---Y---N---N---N)
#exten => _X.,n,Goto(default,${EXTEN},1)
#exten => _X.,n,Hangup
#
# ;inbound to agent example:
#exten => 5678,1,AGI(agi-NVA_recording.agi,BOTH------Y---Y---Y---N---N---N)
#exten => 5678,n,Goto(vicidial-auto,5678,1)
#exten => 5678,n,Hangup
#
# ; example of dial prefix of 94 in System Settings Custom Dialplan to default log
#exten => _941NXXNXXXXXX,1,Goto(defaultlog,9${EXTEN:2},1)
#
# ; example of using as Call Menu prompt to record with playing of recording id
#agi-NVA_recording.agi,BOTH------Y---N---Y---N---Y---Y
#
# ; example of using as Call Menu prompt to record, search for phone number, run NVA call URL and error if not found
#agi-NVA_recording.agi,BOTH------Y---N---Y---N---N---N---Y---ALLLISTS---Y---Y
#
# ;custom dialplan entry example: (similar to the defaultlog Call Menu) with NVA options
#exten => _X.,1,AGI(agi-NVA_recording.agi,BOTH------Y---N---Y---N---N---N---Y---ALLLISTS---N---Y---Y)
#exten => _X.,n,Goto(default,${EXTEN},1)
#exten => _X.,n,Hangup

agi-NVA_recording_MIX.agi

# agi-NVA_recording_MIX.agi version 2.14
#
# This script is designed to give recording ability to agents not the using
# ViciDial agent screen. This version is designed for Asterisk 16 (MixMonitor)
#
# ; 1. logging output (NONE|STDERR|FILE|BOTH)
# ; 2. the ViciDial user ID, if empty it defaults to accountcode(usually phone extension) or vicidial_live_agents user who launched the call
# ; 3. log this call in user_call_log (Y|N) default N
# ; 4. log this call in call_log (Y|N) default N, ONLY NEEDED FOR INBOUND AND INTERSYSTEM CALLS!!!
# ; 5. audio record this call (Y|N) default N
# ; 6. double-log this call in call_log (Y|N) default N, ONLY NEEDED FOR INBOUND CALLMENU FORWARDED CALLS!!!
# ; 7. play the recording ID of this call before recording starts
# ; 8. include the recording ID in the filename
# ; 9. search vicidial_list for phone number dialed (Y|N) default N, assumes 10 digit phone numbers
# ; 10. if 9 is Y, this is search method (ALLLISTS|PHONE) default ALLLISTS, search all lists, use phone setting, CURRENTLY DOES NOTHING
# ; 11. error out and end call if phone number is not found (Y|N) default N
# ; 12. run the phone entry's NVA Call URL (Y|N) default N
# ; 13. if 9 is Y, and phone number is not found, insert into phone's NVA List ID (Y|N) default N
# ; 14. if 13 is Y, override phone's NVA List ID with this list ID when lead is inserted
# ; 15. if 13 is Y, override phone's NVA Phone Code with this phone code when lead is inserted
# ; 16. if 13 is Y, override phone's NVA Status with this status when lead is inserted
#
#
# ;custom dialplan entry example: (similar to the defaultlog Call Menu)
#exten => _X.,1,AGI(agi-NVA_recording_MIX.agi,BOTH------Y---N---Y---N---N---N)
#exten => _X.,n,Goto(default,${EXTEN},1)
#exten => _X.,n,Hangup
#
# ;inbound to agent example:
#exten => 5678,1,AGI(agi-NVA_recording_MIX.agi,BOTH------Y---Y---Y---N---N---N)
#exten => 5678,n,Goto(vicidial-auto,5678,1)
#exten => 5678,n,Hangup
#
# ; example of dial prefix of 94 in System Settings Custom Dialplan to default log
#exten => _941NXXNXXXXXX,1,Goto(defaultlog,9${EXTEN:2},1)
#
# ; example of using as Call Menu prompt to record with playing of recording id
#agi-NVA_recording_MIX.agi,BOTH------Y---N---Y---N---Y---Y
#
# ; example of using as Call Menu prompt to record, search for phone number, run NVA call URL and error if not found
#agi-NVA_recording_MIX.agi,BOTH------Y---N---Y---N---N---N---Y---ALLLISTS---Y---Y
#
# ;custom dialplan entry example: (similar to the defaultlog Call Menu) with NVA options
#exten => _X.,1,AGI(agi-NVA_recording_MIX.agi,BOTH------Y---N---Y---N---N---N---Y---ALLLISTS---N---Y---Y)
#exten => _X.,n,Goto(default,${EXTEN},1)
#exten => _X.,n,Hangup

agi-phone_monitor.agi

# agi-phone_monitor.agi      version 2.8
#
# NOTE! - To use this script you MUST have entries in the System Settings
#         "Custom Dialplan Entry" for this to work.
#         Read the AGENT_MONITOR.txt document for more information.
#
# This script is designed to allow managers to listen to agent sessions by
# dialing a phone exten number or user ID number. For this to work, the user ID
# or phone extension must be only digits. If you are using the phone extension,
# then all phone extensions on the system must be unique.
#
# user is prompted for a user ID or phone login then press #
# then the user is forwarded to monitor the active vicidial agent session
#
# ; settings for this script:
# ; 1. USER, PHONE or PLOGIN, lookup by user id, phone extension or phone login (default is USER)
# ; 2. Y or N, log in api log (default is N)
# ; 3. BARGE or LISTEN, (default is LISTEN)
# ; 4. Prepopulated ID, for use in context by itself
#
# can be added as an AGI to a Call Menu, or just a direct extension transfer:
#
# ; call menu AGI with options:
#  agi-phone_monitor.agi,USER---N---LISTEN---
#
# ; or as extension transfer to "up_monitor_exit" context and "s" extension

agi-record_prompts.agi

# agi-record_prompts.agi      version 2.12
#
# for recording prompts to GSM file over the phone
# Saves recordings with 8-digit filenames to be played when exten is dialed
#
#       ; prompts for recording AGI script, ID is 4321
#   ; first variable is format (gsm/wav)
#       ; second variable is timeout in milliseconds (default is 360000 [6 minutes])
#       exten => 8167,1,Answer
#       exten => 8167,2,AGI(agi-record_prompts.agi,wav-----360000)
#       exten => 8167,3,Hangup
#       exten => 8168,1,Answer
#       exten => 8168,2,AGI(agi-record_prompts.agi,gsm-----360000)
#       exten => 8168,3,Hangup
#
#       ; playback of recorded prompts
#       exten => _851XXXXX,1,Answer
#       exten => _851XXXXX,2,Playback(${EXTEN})
#       exten => _851XXXXX,3,Hangup
#
#       GSM Sound Files used:
#       - ld_welcome_pin_number
#       - ld_invalid_pin_number
#       - vm-rec-generic
#       - auth-thankyou
#       - vm-review
#       - vm-msgsaved
#       - vm-goodbye

agi-set_variables.agi

# agi-set_variables.agi version 2.14
#
# runs after a call_log before call is placed out the trunk and sets all
# vicidial_list fields as variables for the call
#
# You need to put lines similar to those below in your extensions.conf file:
#
# ; VICIDIAL_auto_dialer transfer script AMD with Load Balanced:
# exten => _91NXXNXXXXXX,1,AGI(agi://127.0.0.1:4577/call_log)
# exten => _91NXXNXXXXXX,n,AGI(agi-set_variables.agi,)
# exten => _91NXXNXXXXXX,n,Verbose("phone_code:${phone_code}, phone_number:${phone_number}, lead_id:${lead_id}")
# exten => _91NXXNXXXXXX,n,Dial(${TESTSIPTRUNK}/${EXTEN:2},,tTor)
# exten => _91NXXNXXXXXX,n,Hangup

agi-TILTX_SHAKEN.agi

# agi-TILTX_SHAKEN.agi version 2.14
#
# Runs before a call goes to a carrier for optional DNC/Disconnect check as well
# as CID check and STIR/SHAKEN SIP call Identity tagging through TILTX service
#
# You need to put lines similar to those below in your VICIdial carrier dialplan entry:
#
# exten => _91NXXNXXXXXX,n,AGI(/var/lib/asterisk/agi-bin/agi-TILTX_SHAKEN.agi,${EXTEN:-10}-----${CALLERID(num)}-----YES-----)
#
# CLI FLAG OPTIONS:
# 1. Phone number being called
# 2. CallerID number being sent with call
# 3. (YES/NO) whether to speak error messages or not, default 'NO'
# 4. Settings Container ID to use for TILTX API settings, default 'TILTX_SHAKEN_API_KEY'

agi-VDAD_ALL_inbound.agi

# agi-VDAD_ALL_inbound.agi version 2.14
#
# runs when a call comes in from an inbound call. This script will
# send the calls out to the closers that are logged in.
# ## THIS SCRIPT CONSOLIDATES THIRTEEN SEPARATE VDAD closer inbound SCRIPTS ##
#
#
# You need to put lines similar to those below in your extensions.conf file:
# ; Below are the parameters needed for the script to be run properly
# ; 1. the method of call handling for the script:
# ;     - CID -         CID received, add record with phone number
# ;     - CIDLOOKUP -   Lookup CID to find record in whole system
# ;     - CIDLOOKUPRL - Restrict lookup to one list
# ;     - CIDLOOKUPRC - Restrict lookup to one campaign's lists
# ;     - CIDLOOKUPALT -        Lookup CID to find record in whole system by phone number then alt_phone
# ;     - CIDLOOKUPRLALT -      Restrict lookup to one list by phone number then alt_phone
# ;     - CIDLOOKUPRCALT -      Restrict lookup to one campaign's lists by phone number then alt_phone
# ;     - CIDLOOKUPADDR3 -      Lookup CID to find record in whole system by phone number then address3
# ;     - CIDLOOKUPRLADDR3 -    Restrict lookup to one list by phone number then address3
# ;     - CIDLOOKUPRCADDR3 -    Restrict lookup to one campaign's lists by phone number then address3
# ;     - CIDLOOKUPALTADDR3 -   Lookup CID to find record in whole system by phone number then alt_phone then address3
# ;     - CIDLOOKUPRLALTADDR3 - Restrict lookup to one list by phone number then alt_phone then address3
# ;     - CIDLOOKUPRCALTADDR3 - Restrict lookup to one campaign's lists by phone number then alt_phone then address3
# ;     - CLOSER -      Closer calls from VICIDIAL fronters(and previous in-group calls)
# ;     - ANI -         ANI received, add record with phone number (based on RBS T1s)
# ;     - ANILOOKUP -   Lookup ANI to find record in whole system
# ;     - ANILOOKUPRL - Restrict lookup to one list
# ;     - ANILOOKUPRC - Restrict lookup to one campaign's lists
# ;     - VID -         Add record with Vendor Lead Code received as argument 12
# ;     - VIDLOOKUP -   Lookup Vendor Lead Code received as argument 12 to find record in whole system
# ;     - VIDLOOKUPRL - Restrict lookup to one list (argument 12)
# ;     - VIDLOOKUPRC - Restrict lookup to one campaign's lists (argument 12)
# ;     - VIDPROMPT -   Prompt Vendor Lead Code to User with IVR to add record with Vendor Lead Code
# ;     - VIDPROMPTLOOKUP -     Prompt Vendor Lead Code to User with IVR to find record in whole system
# ;     - VIDPROMPTLOOKUPRL -   Restrict lookup to one list
# ;     - VIDPROMPTLOOKUPRC -   Restrict lookup to one campaign's lists
# ;     - 3DIGITID -    Enter 3 digit code to go to agent
# ;     - 4DIGITID -    Enter 4 digit code to go to agent
# ;     - XDIGITID -    Enter X digit code to go to agent(variable, i.e. 9DIGITID, 12DIGITID, etc...)
# ; 2. the method of searching for an available agent:
# ;     - LO - Load Balance Overflow only (priority to home server)
# ;     - LB - <default> Load Balance total system
# ;     - SO - Home server only
# ; 3. the full name of the IN GROUP to be used in vicidial for the inbound call
# ; 4. the phone number that was called, for the log entry
# ; 5. the callerID or lead_id of the person that called(usually overridden)
# ; 6. the park extension audio file name if used
# ; 7. the status of the call initially(usually not used)
# ; 8. the list_id to insert the new lead under if it is new (and CID/ANI available)
# ; 9. the phone dialing code to insert with the new lead if new (and CID/ANI available)
# ; 10. the campaign_id to search within lists if CIDLOOKUPRC
# ; 11. the user to queue the call to for AGENTDIRECT in-group calls
# ; 12. vendor_lead_code if external mechanism like custom IVR is used to prompt user for ID
# ;              you can also set the vendor_lead_code variable instead if you are using VIDPROMPT
# ; 13. VID enter prompt filename to play if method is set to a VID* option
# ; 14. VID you-have-entered filename to play if method is set to a VID* option
# ; 15. VID confirm prompt filename to play if method is set to a VID* option
# ; 16. VID digit length validation to use if method is set to a VID* option, set to empty or X to disable
#
# ;inbound VICIDIAL calls:
#exten => 1234,1,Answer                  ; Answer the line
#exten => 1234,2,AGI(agi-VDAD_ALL_inbound.agi,CID-----LB-----INB-----7274515134-----Closer-----park----------999-----1-----OUTB)
#exten => 1234,3,Hangup
#
# ;inbound with removal of first digit of callerID on all calls:
#exten => 1234,1,Answer                  ; Answer the line
#exten => 1234,n,set(CALLERID(num)=${CALLERID(num):1})
#exten => 1234,n,AGI(agi-VDAD_ALL_inbound.agi,CID-----LB-----INB-----7274515134-----Closer-----park----------999-----1-----OUTB)
#exten => 1234,n,Hangup
#
#; inbound VICIDIAL transfer calls [can arrive through PRI T1 crossover, IAX or SIP channel]
#exten => _90009.,1,Answer                  ; Answer the line
#exten => _90009.,2,AGI(agi-VDAD_ALL_inbound.agi,CLOSER-----LB-----CL_TESTCAMP-----7275551212-----Closer-----park----------999-----1)
#exten => _90009.,3,Hangup
#exten => _990009.,1,Answer                  ; Answer the line
#exten => _990009.,2,AGI(agi-VDAD_ALL_inbound.agi,CLOSER-----LB-----CL_TESTCAMP-----7275551212-----Closer-----park----------999-----1)
#exten => _990009.,3,Hangup
#; DID forwarded calls
#exten => _99909*.,1,Answer
#exten => _99909*.,2,AGI(agi-VDAD_ALL_inbound.agi)
#exten => _99909*.,3,Hangup

agi-VDAD_ALL_outbound.agi

# agi-VDAD_ALL_outbound.agi version 2.14
#
# runs when an outbound call is answered. This script will
# send the calls out to the agents that are logged in.
# ## THIS SCRIPT CONSOLIDATES EIGHT SEPARATE VDAD outbound transfer SCRIPTS ##
#
#
# You need to put lines similar to those below in your extensions.conf file:
# ; Below are the parameters needed for the script to be run properly
# ; 1. the method of call handling for the script:
# ;     - NORMAL -              <default> Standard outbound routing to agent
# ;     - TEST -                For performance testing only
# ;     - BROADCAST -   For no-agent broadcast dialing
# ;     - SURVEY -              For survery question then on to agent
# ;     - SURVEYCAMP -  For survery question using campaign settings
# ;     - SURVEYCAMPCEP - Survery question, campaign settings, cepstral name
# ;     - REMINDER -    Reminder campaign
# ;     - REMINDX -             Reminder with transfer to agent
# ; 2. the method of searching for an available agent: (agent_search_method)
# ;     - LB - <default> Load Balance total system
# ;     - LO - Load Balance Overflow only (priority to home server)
# ;     - SO - Home server only
# ; 3. The Connected Line Name to solve CID Name change issues.
# ; 4. the sound file to play when doing a SURVEY, REMINDER, REMINDX campaign
# ; 5. the acceptible dtmf digits for a SURVEY
# ; 6. the out-opt digit for a SURVEY (must be in the digit map)
# ; 7. the sound file to play for a SURVEY when transfering to an agent
# ; 8. the sound file to play for a SURVEY when DNCing the call
# ; 9. OPTIN or OPTOUT: if OPTIN call is only sent to agent with button press
# ;     if OPTOUT call is sent to agent if no button press at all
# ; 10. the status that is use for a SURVEY when someone opts out
# ;     if the status is DNC it will also add them to the internal dnc table
#
#; VICIDIAL_auto_dialer transfer script Load Balanced:
#exten => 8368,1,AGI(agi://127.0.0.1:4577/call_log)
#exten => 8368,n,AGI(agi-VDAD_ALL_outbound.agi,NORMAL-----LB-----${CONNECTEDLINE(name)})
#exten => 8368,n,Hangup()
#
# ;outbound VICIDIAL SURVEY calls:
#exten => 8366,1,AGI(agi://127.0.0.1:4577/call_log)
#exten => 8366,2,AGI(agi-VDAD_ALL_outbound.agi,SURVEY-----LB-----US_pol_survey_hello-----1238-----8-----US_pol_survey_transfer-----US_thanks_no_contact----->
#exten => 8366,3,AGI(agi-VDAD_ALL_outbound.agi,SURVEY-----LB-----US_pol_survey_hello-----1238-----8-----US_pol_survey_transfer-----US_thanks_no_contact----->
#exten => 8366,4,AGI(agi-VDAD_ALL_outbound.agi,SURVEY-----LB-----US_pol_survey_hello-----1238-----8-----US_pol_survey_transfer-----US_thanks_no_contact----->
#exten => 8366,5,Hangup

agi-VDAD_ALL_outboundBETA2.agi

# agi-VDAD_ALL_outboundBETA2.agi version 2.14
#
# runs when an outbound call is answered. This script will
# send the calls out to the agents that are logged in.
# ## THIS SCRIPT CONSOLIDATES EIGHT SEPARATE VDAD outbound transfer SCRIPTS ##
#
#
# You need to put lines similar to those below in your extensions.conf file:
# ; Below are the parameters needed for the script to be run properly
# ; 1. the method of call handling for the script:
# ;     - NORMAL -              <default> Standard outbound routing to agent
# ;     - TEST -                For performance testing only
# ;     - BROADCAST -   For no-agent broadcast dialing
# ;     - SURVEY -              For survery question then on to agent
# ;     - SURVEYCAMP -  For survery question using campaign settings
# ;     - SURVEYCAMPCEP - Survery question, campaign settings, cepstral name
# ;     - REMINDER -    Reminder campaign
# ;     - REMINDX -             Reminder with transfer to agent
# ; 2. the method of searching for an available agent:
# ;     - LB - <default> Load Balance total system
# ;     - LO - Load Balance Overflow only (priority to home server)
# ;     - SO - Home server only
# ; 3. the sound file to play when doing a SURVEY, REMINDER, REMINDX campaign
# ; 4. the acceptible dtmf digits for a SURVEY
# ; 5. the out-opt digit for a SURVEY (must be in the digit map)
# ; 6. the sound file to play for a SURVEY when transfering to an agent
# ; 7. the sound file to play for a SURVEY when DNCing the call
# ; 8. OPTIN or OPTOUT: if OPTIN call is only sent to agent with button press
# ;     if OPTOUT call is sent to agent if no button press at all
# ; 9. the status that is used for a SURVEY when someone opts out
# ;     if the status is DNC it will also add them to the internal dnc table
#
# ;outbound VICIDIAL calls:
#exten => 8368,1,AGI(agi://127.0.0.1:4577/call_log)
#exten => 8368,2,AGI(agi-VDAD_ALL_outbound.agi,NORMAL-----LB)
#exten => 8368,3,AGI(agi-VDAD_ALL_outbound.agi,NORMAL-----LB)
#exten => 8368,4,AGI(agi-VDAD_ALL_outbound.agi,NORMAL-----LB)
#exten => 8368,5,Hangup
#
# ;outbound VICIDIAL SURVEY calls:
#exten => 8366,1,AGI(agi://127.0.0.1:4577/call_log)
#exten => 8366,2,AGI(agi-VDAD_ALL_outbound.agi,SURVEY-----LB-----US_pol_survey_hello-----1238-----8-----US_pol_survey_transfer-----US_thanks_no_contact----->
#exten => 8366,3,AGI(agi-VDAD_ALL_outbound.agi,SURVEY-----LB-----US_pol_survey_hello-----1238-----8-----US_pol_survey_transfer-----US_thanks_no_contact----->
#exten => 8366,4,AGI(agi-VDAD_ALL_outbound.agi,SURVEY-----LB-----US_pol_survey_hello-----1238-----8-----US_pol_survey_transfer-----US_thanks_no_contact----->
#exten => 8366,5,Hangup

agi-VDAD_ALL_outboundBETA.agi

# agi-VDAD_ALL_outboundBETA.agi version 2.14
#
# runs when an outbound call is answered. This script will
# send the calls out to the agents that are logged in.
# ## THIS SCRIPT CONSOLIDATES EIGHT SEPARATE VDAD outbound transfer SCRIPTS ##
#
#
# You need to put lines similar to those below in your extensions.conf file:
# ; Below are the parameters needed for the script to be run properly
# ; 1. the method of call handling for the script:
# ;     - NORMAL -              <default> Standard outbound routing to agent
# ;     - TEST -                For performance testing only
# ;     - BROADCAST -   For no-agent broadcast dialing
# ;     - SURVEY -              For survery question then on to agent
# ;     - SURVEYCAMP -  For survery question using campaign settings
# ;     - SURVEYCAMPCEP - Survery question, campaign settings, cepstral name
# ;     - REMINDER -    Reminder campaign
# ;     - REMINDX -             Reminder with transfer to agent
# ; 2. the method of searching for an available agent:
# ;     - LB - <default> Load Balance total system
# ;     - LO - Load Balance Overflow only (priority to home server)
# ;     - SO - Home server only
# ; 3. the sound file to play when doing a SURVEY, REMINDER, REMINDX campaign
# ; 4. the acceptible dtmf digits for a SURVEY
# ; 5. the out-opt digit for a SURVEY (must be in the digit map)
# ; 6. the sound file to play for a SURVEY when transfering to an agent
# ; 7. the sound file to play for a SURVEY when DNCing the call
# ; 8. OPTIN or OPTOUT: if OPTIN call is only sent to agent with button press
# ;     if OPTOUT call is sent to agent if no button press at all
# ; 9. the status that is used for a SURVEY when someone opts out
# ;     if the status is DNC it will also add them to the internal dnc table
#
# ;outbound VICIDIAL calls:
#exten => 8368,1,AGI(agi://127.0.0.1:4577/call_log)
#exten => 8368,2,AGI(agi-VDAD_ALL_outbound.agi,NORMAL-----LB)
#exten => 8368,3,AGI(agi-VDAD_ALL_outbound.agi,NORMAL-----LB)
#exten => 8368,4,AGI(agi-VDAD_ALL_outbound.agi,NORMAL-----LB)
#exten => 8368,5,Hangup
#
# ;outbound VICIDIAL SURVEY calls:
#exten => 8366,1,AGI(agi://127.0.0.1:4577/call_log)
#exten => 8366,2,AGI(agi-VDAD_ALL_outbound.agi,SURVEY-----LB-----US_pol_survey_hello-----1238-----8-----US_pol_survey_transfer-----US_thanks_no_contact----->
#exten => 8366,3,AGI(agi-VDAD_ALL_outbound.agi,SURVEY-----LB-----US_pol_survey_hello-----1238-----8-----US_pol_survey_transfer-----US_thanks_no_contact----->
#exten => 8366,4,AGI(agi-VDAD_ALL_outbound.agi,SURVEY-----LB-----US_pol_survey_hello-----1238-----8-----US_pol_survey_transfer-----US_thanks_no_contact----->
#exten => 8366,5,Hangup

agi-VDADautoREMINDER.agi

# agi-VDADautoREMINDER.agi      version 2.6
#
# runs when a call comes in from the VICIDIAL auto_dialer. This script will
# send the calls out to specified voicemail boxes in if called person presses key.
# The voicemail box is defined per-lead in the vicidial_list.security_phrase field
# This campaign does not send calls to live agents.
#
#   Call statuses from this script:
#       N- Call was picked up, didn't finish initial message
#       MP- Initial message was played
#       VM- call was sent to voicemail
#       CALLBK- customer selected to be called back
#
# It is recommended that you run this campaign at a dial level of 1.0
# It is recommended that you use remote_agents for activation of this script
#
# You need to put lines similar to those below in your extensions.conf file:
#
# ;VICIDIAL_auto_dialer transfer script:
# exten => 8372,1,AGI(call_log.agi,${EXTEN})
# exten => 8372,2,AGI(agi-VDADautoREMINDER.agi,${EXTEN})


agi-VDADautoREMINDERxfer.agi

# agi-VDADautoREMINDERxfer.agi      version 2.6
#
# runs when a call comes in from the VICIDIAL auto_dialer. This script will
# send the calls out to specified voicemail boxes or specified extensions if
# called person presses specified key(1,2,3).
# The voicemail box is defined per-lead in the vicidial_list.security_phrase field
# The exten xfer number is defined per-lead in the vicidial_list.comments field
#
#   Call statuses from this script:
#       N- Call was picked up, didn't finish initial message
#       MP- Initial message was played
#       VM- call was sent to voicemail
#       XFER- call was sent to specified extension
#       CALLBK- customer selected to be called back
#
# It is recommended that you run this campaign at a dial level of 1.0
# It is recommended that you use remote_agents for activation of this script
#
# You need to put lines similar to those below in your extensions.conf file:
#
# ;VICIDIAL_auto_dialer transfer script:
# exten => 8372,1,AGI(call_log.agi,${EXTEN})
# exten => 8372,2,AGI(agi-VDADautoREMINDERxfer.agi,${EXTEN})

agi-VDADfixCXFER.agi

# agi-VDADfixCXFER.agi      version 2.6
#
# runs when a Consultative transfer is released by the vicidial fronter as the
# call arrives on another channel so that the vicidial_live_agents record is
# updated to be accurate.
#
# You need to put lines similar to those below in your extensions.conf file:
#
# ;VICIDIAL Consultative Xfer fix script:
# exten => _8600XXX*.,1,AGI(agi-VDADfixCXFER.agi)
# exten => _010*010*010*015*8600XXX*.,1,AGI(agi-VDADfixCXFER.agi)

agi-VDAD_inbound_calltime_check.agi

# agi-VDAD_inbound_calltime_check.agi   version 2.14
#
# Runs when a call comes in from an inbound call. This script will check the
# settings of the defined calltime scheme in VICIDIAL and either send the call
# to the after-hours method for the defined IN-GROUP or exit to let the call
# continue. This script is also used by Call Menus.
#
# You need to put lines similar to those below in your extensions.conf file:
# ; Below are the parameters needed for the script to be run properly
# ; 1. the in-group to take settings from
# ; 2. whether to log the call into the vicidial_auto_calls table:
# ;             - YES - insert the call as status IVR
# ;             - NO  - do not insert call into vac table
# ; 3. note to put in the comment_b field when record inserted into the
# ;    live_inbound_log table, no spaces in this field, use underscore '_'
# ;    default if not populated is NONE
# ; 4. call time scheme override
# ; 5. call route after hours override
# ; 6. call route value after hours override
# ; 7. call route context after hours override
# ; 8. vicidial_list query qualification (YES/NO, default is NO)
# ;    * only works with lead_id-populated calleridname phone calls.
# ;    This option allows you to specify a SQL fragment used to do a count(*)
# ;    against the vicidial_list table for the lead and other field values
# ;    This feature will look for the qualify_sql in the call menu record
# ; 9. play sip-silence audio, YES/NO, default is YES
# ;
# ;inbound calls check calltime:
#exten => 1234,1,Answer                  ; Answer the line
#exten => 1234,2,AGI(agi-VDAD_inbound_calltime_check.agi,INBOUND-----YES-----START-----24hours-----EXTENSION-----101-----default-----NO-----YES)
#exten => 1234,3,Hangup

agi-VDADinbound_NI_DNC_CIDlookup.agi

# NOTE: IT IS RECOMMENDED THAT YOU USE cm_dnc.agi THROUGH A CALL MENU INSTEAD!
#
# agi-VDADinbound_NI_DNC_CIDlookup.agi version 2.0.5   *DBI-version*
#
# runs when a call comes in from an inbound call. This script will
# play a message and take input to automatically change customer lead to NI or DNC.
#  *** This version detects inbound callerID over PRI ***
#
# Flag Options:
# 1- default to insert into the vicidial_dnc table for DNC selections (Default=YES)
# 2- campaign to take dnc settings from(overrides option 1)
#
# ;inbound call from outbound CID callbacks from VICIDIAL calls:
#exten => 1234,1,Ringing                 ; call ringing
#exten => 1234,2,Wait(1)                 ; Wait 1 second for CID delivery from PRI
#exten => 1234,3,Answer                  ; Answer the line
#exten => 1234,4,AGI(agi-VDADinbound_NI_DNC_CIDlookup.agi,YES-----TESTCAMP)
#exten => 1234,5,Hangup

agi-VDADlisten_DTMF.agi

# agi-VDADlisten_DTMF.agi version 2.0.5   *DBI-version*
#
# To be initiated by an agent so during a call. Agent will click a PIN NUMBER
# link on a web form webpage that will Originate a new call to this script
#
# This script plays a beep and waits for entry of 4 digits then inserts record
#
# ***** THIS SCRIPT ONLY WORKS WITH A CROSSOVER T1 CABLE FROM ONE T1 PORT *****
# ***** TO ANOTHER T1 PORT WHETHER ON THE SAME SERVER OR DIFFERENT ONE    *****
#
# IN THE CAMPAIGN OR IN-GROUP NUMBER PRESET FIELD:
# AXFER83009
#
# ON THE SERVER ORIGINATING THE CALL:
#;outbound DTMF VICIDIAL calls:
#exten => _983009.,1,AGI(call_log.agi,${EXTEN})
#exten => _983009.,2,Dial(${TRUNKY}/${EXTEN:1},60)
#exten => _983009.,3,Hangup
#
# ON THE SERVER THAT HAS THIS SCRIPT:
#;inbound DTMF VICIDIAL calls:
#exten => _83009.,1,AGI(agi-VDADlisten_DTMF.agi,${EXTEN})
#exten => _83009.,2,Hangup

agi-VDAD_local_optimize.agi

# agi_VDAD_local_optimize.agi
#
# This script looks up the Local channel in the cid_channels_recent table
# and redirects the actual channel to the current extension with the first
# two digits stripped off. IE 138368 -> 8368. This is to overcome the change
# to Local channels in Asterisk 12 and later.

agi-VDAD_pin_IVR.agi

# agi-VDAD_pin_IVR.agi version 2.0.5   *DBI-version*
#
# At the end of a call, the agent transfers customer to this script
#
# This script plays a beep then plays the first portion of the message
# then logs the portion as listened to in the vicidial_list_pins table
# then plays second portion and hangs up.
#
# IN THE CAMPAIGN OR IN-GROUP NUMBER PRESET FIELD:
# AXFER83209
#
# ON THE SERVER ORIGINATING THE CALL:
#;outbound IVR play VICIDIAL calls:
#exten => _983209.,1,AGI(call_log.agi,${EXTEN})
#exten => _983209.,2,Dial(${TRUNKY}/${EXTEN:1},60)
#exten => _983209.,3,Hangup
#
# ON THE SERVER THAT HAS THIS SCRIPT:
#;inbound IVR play VICIDIAL calls:
#exten => _83209.,1,Answer
#exten => _83209.,2,AGI(agi-VDAD_pin_IVR.agi,${EXTEN})
#exten => _83209.,3,Hangup

agi-VDAD_RINGALL.agi

# agi-VDAD_RINGALL.agi version 2.8
#
# NOTE: this script is used for on-hook agents to be connected to customer calls
# when they answer their ringing phones
#
# In the default dialplan context, this is set to the following:
# ; these are used for the ring_all function in VICIDIAL
# exten => _8331*.,1,Playback(sip-silence)
# exten => _8331*.,n,AGI(agi-VDAD_RINGALL.agi,${EXTEN})
# exten => _8331*.,n,AGI(agi-VDAD_RINGALL.agi,${EXTEN})
# exten => _8331*.,n,Hangup

agi-VDADselective_CID.agi

# agi-VDADselective_CID.agi version 0.1   *NO DB Connection*
#
# Runs before a call is placed outbound to filter outgoing callerIDnumber
#
# You need to put lines similar to those below in your extensions.conf file:
#
# ;outbound VICIDIAL calls:
#exten => _91NXXNXXXXXX,1,AGI(call_log.agi,${EXTEN})
#exten => _91NXXNXXXXXX,2,AGI(agi-VDADselective_CID.agi,${EXTEN})
#exten => _91NXXNXXXXXX,3,Dial(${TRUNKX}/${EXTEN:1},55,tTo)
#exten => _91NXXNXXXXXX,4,Hangup

agi-VDADselective_CID_hangup.agi

# agi-VDADselective_CID_hangup.agi      version 2.6
#
# Will hangup a call if it is not within the specified area codes
#
# You need to put lines similar to those below in your extensions.conf file:
#
# ;outbound VICIDIAL calls:
#exten => 8352,1,AGI(agi-VDADselective_CID_hangup.agi,${EXTEN})
#exten => 8352,2,Playback(85100001)
#exten => 8352,3,Hangup

agi-VICIrecGateway.agi

# agi-VICIrecGateway.agi version 2.14
#
# Designed to work on a stand-alone Asterisk server and record calls in stereo
#
# You need to put a line similar to this below in your extensions.conf file in
# the context for where incoming calls go from your trunks (for example, the
# trunkinbound context which is present in the default dialplan):
#
#[handler]
#exten => addheader,1,Set(PJSIP_HEADER(add,X-VICIrecGatewayID)=${VICIrecGatewayID})
#exten => addheader,n,Return()
#
#[stereo-rec-inbound]
#exten => _X.,1,Progress()
#exten => _X.,n,Noop(${CALLERID(num)})
#exten => _X.,n,AGI(agi-VICIrecGateway.agi)
#exten => _X.,n,Noop(${CARRIER_FILENAME})
#exten => _X.,n,Noop(${DIALER_FILENAME})
#exten => _X.,n,MixMonitor(,r(${CARRIER_FILENAME})t(${DIALER_FILENAME})S)
#exten => _X.,n,Dial(PJSIP/${EXTEN}@pjdial147,,Tob(handler^addheader^1))
#
#[stereo-rec-outbound]
#exten => _X.,1,Progress()
#exten => _X.,n,Noop(${CALLERID(num)})
#exten => _X.,n,AGI(agi-VICIrecGateway.agi)
#exten => _X.,n,Noop(${CARRIER_FILENAME})
#exten => _X.,n,Noop(${DIALER_FILENAME})
#exten => _X.,n,MixMonitor(,t(${CARRIER_FILENAME})r(${DIALER_FILENAME})S)
#exten => _X.,n,Dial(PJSIP/${EXTEN}@pjsgw1,,To)

call_inbound.agi

# call_inbound.agi      version 2.6
#
# runs at the beginning and ending of every inbound call received
#
# You need to put lines similar to those below in your extensions.conf file:
#
# parameters for call_inbound.agi (7 fields separated by five dashes "-----"):
# 1. the extension of the phone to ring as defined in the asterisk.phones table
# 2. the phone number that was called, for the live_inbound/_log entry
# 3. a text description of the number that was called in
# 4-7. optional fields, they are also passed as fields in the GUI to web browser
#
# ;inbound calls:
#exten => _*NXXNXXXXXX*3429,3,AGI(call_inbound.agi,spa2000-----8005553429-----Inbound 800-----x-----y-----z-----w)

cepstral_generate.pl

# cepstral_generate.pl    version 2.2.0
#
# Text-To-Speech files will be cached for later use.
#
# Call this script like this:
# /var/lib/asterisk/agi-bin/cepstral_generate.pl --debug --voice=Allison-8kHz --dialog=Hello\ There

cm.agi

# cm.agi   version 2.14
#
# Used by Call Menus to log digit presses if enabled in the settings. You should
# not need to manually use this script, it is used by the dialplan builder.
#
# You need to put lines similar to those below in your extensions.conf file:
# ; Below are the parameters needed for the script to be run properly
# ; 1. the in-group to take settings from
# ; 2. digit pressed
# ; 3. field(in vicidial_list) to update with DTMF pressed (only if lead_id populated)
# ; 4. alt-log(enable alternate logging)
# ; 5. question number used if alt-logging is enabled
# ;
# ;inbound calls check calltime:
#exten => 1,1,AGI(cm.agi,INBOUND-----1-----province----------)
#exten => 1,2,...
#
# ;to allow for multi-digit entries, put similar entry in the Custom Dialplan Entry:
#exten => _XXXXX,1,AGI(cm.agi,INBOUND-----${EXTEN}-----postal_code)
#exten => _XXXXX,n,Goto(next_callmenu_here,s,1)

cm_areacode.agi

# cm_areacode.agi version 2.12
#
# Designed to work with Call Menus to allow searching of the areacode of the
# caller ID phone number the customer called in on, to be searched within the
# vicidial_phone_codes table to gather the state, then search the
# vicidial_inbound_dids table for that state in the did_carrier_description
# field and send the call on to the did that matches.
#
# If areacode is not found call will go to the 'D' option in the call menu
# If state DID is not found call will go to the 'C' option in the call menu
#
# Flag Options:
# 1- Country code to search the areacode within, default 1
# 2- Length of areacode in digits, default 3
# 3- DID prefix to filter by in searching for DIDs, default 999
#
# example of what to set in the Call Menu:
# Set the prompt to "sip-silence"
# Set the Timeout to 1 second
# Option: "Timeout" Route: "AGI" AGI: "cm_areacode.agi,1---3---999"

cm_cid_change.agi

# cm_cid_change.agi version 2.14
#
# Designed to allow you to change the CID of a call to either a fixed number or
# a combination of CUSTOMER, CLOSER just like the in-group Action Transfer CID
# feature. Script is designed to handle calls already assigned to leads, not
# new inbound calls that only have a phone number.
#
# Flag Options:
# 1- Fixed CID number, or CUSTOMER or CUSTOMERCLOSER
#
# example of what to put in the AGI entry for a Call Menu AGI route:
# cm_cid_change.agi,CUSTOMERCLOSER

cm_date.agi

# cm_date.agi   version 2.6
#
# Can be used in a call menu prompt to play a date string as defined by the settings below
#
# ; Below are the parameters needed for the script to be run properly
# ; the "SAY DATETIME" parameters for what to say separated by three dashes
# ; 1. offset from current epoch in seconds, positive or negative
# ;             1 hour is 3600
# ;             1 day is 86400
# ;             1 week is 604800
# ;             30 days is 2592000
# ;             1 year is 31536000
# ; 2. format of the date to say, i.e. "ABdY":
# ;     A: Day of the week
# ;     B: Month (Full Text)
# ;     m: Month (Numeric)
# ;     d: Day of the month
# ;     Y: Year
# ;     I: Hour (12-hour format)
# ;     H: Hour (24-hour format)
# ;     M: Minutes
# ;     P: AM/PM
# ;     Q: Shorthand for Today, Yesterday or ABdY
# ;     R: Shorthand for HM
# ;     S: Seconds
# ;     T: Timezone
#
# ;inbound calls check calltime:
# ;   (this example is for yesterday and says "Monday March 25th 2013")
# cm_date.agi,-86400---ABdY

cm_dnc.agi

# cm_dnc.agi version 2.14
#
# Designed to work with Cell Menus to allow setting of a number as DNC or NI
# This script is meant as a replacement for the agi-VDADinbound_NI_DNC_CIDlookup.agi
# script. It is designed to work easily in the Call Menu framework, it plays no
# audio itself, and it has more options.
#
# Flag Options:
# 1- run as DNC status or NI status (Default=NI)
# 2- default to insert into the vicidial_dnc table for DNC selections (Default=YES)
# 3- campaign to take dnc settings from(overrides option 2)
# 4- call menu option to send the call to after executing (Default=B)
# 5- if option 3 is used, search for lead in campaign lists or whole system(CAMP or SYS) (Default=SYS)
#
# example of what to put in the AGI entry for a Call Menu AGI route:
# cm_dnc.agi,DNC---YES---TESTCAMP---B---CAMP

cm_dnc_new.agi

# cm_dnc_new.agi version 2.12
#
# Designed to work with Cell Menus to allow setting of a number as DNC or NI
# This script is meant as a replacecment for the agi-VDADinbound_NI_DNC_CIDlookup.agi
# script. It is designed to work easily in the Call Menu framework, it plays no
# audio itself, and it has more options.
#
# Flag Options:
# 1- run as DNC status or ANY OTHER status (Default=NI)
# 2- default to insert into the vicidial_dnc table for DNC selections (Default=YES)
# 3- campaigns to take dnc settings from(overrides option 2) multiple campaigns separated by single dash
# 4- call menu option to send the call to after executing (Default=B)
# 5- if option 3 is used, search for lead in campaign lists or whole system(CAMP or SYS) (Default=SYS)
# 6- optional audio store file to play
#
# example of what to put in the AGI entry for a Call Menu AGI route:
# cm_dnc_new.agi,DNC---YES---TESTCAMP---B---CAMP---auth-thankyou

cm_fpg.agi

# cm_fpg.agi version 2.14
#
# Designed to work with Cell Menus to allow the entry of a CID number into a
# Filter Phone Group. It is designed to work easily in the Call Menu framework,
# it plays no audio itself, and it has more options.
#
# Flag Options:
# 1- Filter Phone Group ID to insert into
# 2- call menu option to send the call to after executing (Default=B)
# 3- (optional) number to enter instead of CIDnumber
#
# example of what to put in the AGI entry for a Call Menu AGI route(CID method):
# cm_fpg.agi,TEST_FPG---B
#
# example of what to put in the Custom Dialplan Entry of a Call Menu (caller entry of number method):
# exten => _XXXXXXXXXX,1,cm_fpg.agi,99test---C---${EXTEN}

cm_lookup.agi

# cm_lookup.agi version 2.6
#
# for use with a Call Menu in the custom dialplan section.
#
# ; settings for this script:
# ; 1. The vicidial_list field to do a lookup on ('vendor_lead_code' is default)
# ; 2. Type of lookup to do: (default is SYSTEM)
# ;     SYSTEM will search the entire system
# ;     CAMPAIGNLISTS will search inside all of the active lists within the campaign
# ;     CAMPLISTSALL will search inside all of the active and inactive lists within the campaign
# ;     LIST will search only within the specified List ID
# ; 3. If CAMPAIGN or LIST is used above, this is the campaign_id or list_id to be used
# ; 4. TTS confirmation of name (1 for yes, 2 for no) put in TTS prompt ID
# ; 5. Update the vicidial_list record phone number with the callerID of the caller:
# ;     Y - update the record with the phone number
# ;     N - Do nothing (default)
# ; 6. Update lead's address3 field to the uniqueid of the call
# ;     Y - update the record with the uniqueid
# ;     N - Do nothing (default)
# ; 7. Update the lead's record with the call's agent_user_id variable
# ;     Y - update the lead record's 'user' field with the agent_user_id variable
# ;     COMMENTS - update the lead record's 'comments' field with the agent_user_id variable
# ;     N - Do nothing (default)
# ; 8. Update the lead's record with the call's title variable
# ;     Y - update the lead record's 'title' field with the call's title variable
# ;     N - Do nothing (default)
#
# Found entries will send the call to the 'A' option in the source call menu
# Not-Found entries will send the call to the 'B' option in the source call menu
#
#; example with 8-digit vendor lead codes
# exten => _XXXXXXXX,1,AGI(cm_lookup.agi,vendor_lead_code---CAMPLISTSALL---TESTCAMP---lastname_oneyestwono---N---N---Y---N)
#
#; example with 8-digit vendor lead codes
# exten => _XXXXXXXX,1,AGI(cm_lookup.agi,vendor_lead_code---CAMPLISTSALL---TESTCAMP---lastname_oneyestwono---N---N---Y---N)

cm_phonesearch.agi

# cm_phonesearch.agi version 2.14
#
# Designed to work with Call Menus to allow searching of the caller ID phone
# number the customer called in with against the vicidial_list table, and
# finding the list of the most recent match, the campaign tied to that list and
# the default transfer in-group of that campaign, then transferring the call to
# that in-group
#
# If phone number is not found, call will go to the 'D' option in the call menu
# If default in-group is not found, call will go to the 'C' option in the call menu
# If default in-group is found, call will go to the 'B' option in the call menu
#    (NOTE: you MUST set the In-Group to DYNAMIC_INGROUP_VAR for 'B' option)
#
# Flag Options:
# 1- Country code to search the areacode within, default 1
# 2- Match lead order, default: "entry_newest"
#          entry_newest, entry_oldest, modify_newest, modify_oldest, call_newest, call_oldest, rank_highest, rank_lowest
# example of what to set in the Call Menu:
# Set the prompt to "sip-silence"
# Set the Timeout to 1 second
# Option: "Timeout" Route: "AGI" AGI: "cm_phonesearch.agi,1---entry_newest"
#    OR JUST
# Set the prompt to "sip-silence|cm_phonesearch.agi,1---entry_oldest"

cm_postal.agi

# cm_postal.agi version 2.12
#
# Designed to work with Cell Menus to allow searching of the number entered by
# the customer to be searched within the vicidial_postal_codes table to gather
# the state, then search the vicidial_inbound_dids table for that state in the
# did_carrier_description field and send the call on to the did that matches.
#
# If postal code is not found call will go to the 'D' option in the call menu
# If state DID is not found call will go to the 'C' option in the call menu
#
# Flag Options:
# 1- minimum number of digits allowed in postal code, default 5
# 2- DID prefix to filter by in searching for DIDs, default 999
#
# example of what to put in the Custom Dialplan entry for a Call Menu:
#exten => _XXXXX,1,AGI(cm_postal.agi,5---999)

cm_sc_areacode.agi

# cm_sc_areacode.agi version 2.14
#
# Designed to work with Call Menus to allow searching of the areacode of the
# caller ID phone number the customer called in with to be searched within the
# vicidial_phone_codes table to gather the state, or use the lead_id of the
# already-established call, then use the settings container ID to gather the
# state routing parameters to find the destination for that state
#
# If areacode is not found, call will go to the 'D' option in the call menu
# If destination is not found, call will go to the 'C' option in the call menu
#
# Flag Options:
# 1- Country code to search the areacode within, default 1
# 2- Length of areacode in digits, default 3
# 3- container_id for settings container with state and routing parameters
#
# example of what to set in the Call Menu:
# Set the prompt to "sip-silence"
# Set the Timeout to 1 second
# Option: "Timeout" Route: "AGI" AGI: "cm_sc_areacode.agi,1---3---east_west"
#
# example of what to put in settings container:
# NOTE: if you want any state non-matches to go to a destination, put that line FIRST
#<destination type>|<destination>|<states list separated by spaces>
#DID|9998881111|--NOMATCHES--
#DID|9998882222|FL TX NY CA
#EXTEN|919998887112|AL MS MO TN KY
#CALLMENU|test_menu|IL MN WI MI IA

cm_sc_ccc_lookup_insert.agi

# cm_sc_ccc_lookup_insert.agi version 2.14
#
# Designed to work with Call Menus to send a URL defined in a Settings Container
# for a call with a call_id associated with it for calls coming from an external
# VICIdial system on a private IAX trunk so that the lead information can be
# copied to this destination cluster.
#
# If container is not found, call will go to the 'C' option in the call menu
# If call_id is not defined, call will go to the 'D' option in the call menu
# If lead is not found on external system, call will go to the 'B' option in the call menu
# If lead is found on external system, call will go to the 'A' option in the call menu
#
# Flag Options:  (separated by triple-pipe: "---")
# 1- container_id for settings container with URL to send
# 2- local list_id to insert lead into(if not populated, will use external list_id)
#
# example of what to set in the Call Menu:
# Set the prompt to "wait-moment|cm_sc_ccc_lookup_insert.agi,ccc_test---8199"

cm_sc_send_url.agi

# cm_sc_send_url.agi version 2.14
#
# Designed to work with Call Menus to send a URL defined in a Settings Container
# for a call with a lead_id associated with it(use CUSTOMERCLOSER in the In-Group
# Action Transfer CID field!).
#
# If container is not found, call will go to the 'C' option in the call menu
# If lead_id is not defined, call will go to the 'D' option in the call menu
# After URL is sent, call will go to the 'B' option in the call menu
#
# Flag Options:
# 1- container_id for settings container with URL to send
#
# example of what to set in the Call Menu:
# Set the prompt to "sip-silence|cm_sc_send_url.agi,test_cm_url"
#
# The URL that you define in the Settings Container can use most of the
# variables you can use in the Dispo Call URL fields. The 'user' and 'status'
# fields as well as the talk_time, talk_time_min and ivr_time fields that are
# also available will all use the last vicidial_agent_log entry for it's values.

cm_sc_send_url_status.agi

# cm_sc_send_url_status.agi version 2.14
#
# Designed to work with Call Menus to send a URL defined in a Settings Container
# for a call with a lead_id associated with it(use CUSTOMERCLOSER in the In-Group
# Action Transfer CID field!).
#
# If container is not found, call will go to the 'C' option in the call menu
# If lead_id is not defined, call will go to the 'D' option in the call menu
# After URL is sent, call will go to the 'B' option in the call menu
#
# Flag Options: (separated by 3 dashes '---')
# 1- container_id for settings container with URL to send
# 2- GET or POST (send URL method, defaults to GET)
# 3- status to change lead to <optional>
#
# example of what to set in the Call Menu Prompt:
# Set the prompt to "sip-silence|cm_sc_send_url_status.agi,test_cm_url---POST---BGOOD"
#
# example of what to set in a Call Menu AGI option:
# Set the prompt to "cm_sc_send_url_status.agi,test_cm_url---POST---BGOOD"
#
# The URL that you define in the Settings Container can use most of the
# variables you can use in the Dispo Call URL fields. The 'user' and 'status'
# fields as well as the talk_time, talk_time_min and ivr_time fields that are
# also available, it will all use the last vicidial_agent_log entry for it's values.

cm_speak_var.agi

# cm_speak_var.agi version 2.14
#
# runs after a call has lead_id assigned to it, speaks letters/numbers
#
# You need to put lines similar to those below in your Custom Dialplan:
#
# exten => 8412,1,Answer
# exten => 8412,n,AGI(cm_speak_var.agi,say_digits---security_phrase---DB)
# exten => 8412,n,Hangup
#
# CLI FLAG OPTIONS:
# 1. function: (say_digits, say_number, say_alpha, say_datetime, say_phonetic, stream_file)
# 2. field: (any vicidial_list field)
# 3. variable type: DB(default) or DP(Asterisk Dialplan Variable)

cm_status_dial.agi

# cm_status_dial.agi   version 2.14
#
# Used as a Call Menu AGI option route to alter status of a lead before dialing.
# The lead is only updated if the call is tagged with a lead_id before this script.
#
# You need to put lines similar to those below in your extensions.conf file or
# a Custom Dialplan entry:
# ; Below are the parameters needed for the script to be run properly
# ; 1. the status to change the lead to
# ; 2. the phone number or extension to dial
# ; 3. the context to dial in
# ;
# ;inbound calls check calltime:
#cm_status_dial.agi,XFER-----917275551212-----default

cm_VID_SPECIAL.agi

# cm_VID_SPECIAL.agi version 2.14
#
# runs when a call comes from a Call Menu VIDPROMPTSPECIAL... INGROUP option.
# This script will send calls to various In-Groups or Call Menu options based
# on settings in a Settings Container and results of a lead search.
#
#
# You need to put lines similar to those below in your extensions.conf file:
# ; Below are the parameters needed for the script to be run properly
# ; 1. the method of call handling for the script:
# ;     - VIDPROMPTSPECIALLOOKUP -      Prompt Vendor Lead Code to User with IVR to find record in whole system
# ;     - VIDPROMPTSPECIALLOOKUPRL -    Restrict lookup to one list
# ;     - VIDPROMPTSPECIALLOOKUPRC -    Restrict lookup to one campaign's lists
# ; 2. the method of searching for an available agent:
# ;     - LO - Load Balance Overflow only (priority to home server)
# ;     - LB - <default> Load Balance total system
# ;     - SO - Home server only
# ; 3. the list_id to insert the new lead under if it is new (and CID/ANI available)
# ; 4. the phone dialing code to insert with the new lead if new (and CID/ANI available)
# ; 5. the campaign_id to search within lists if CIDLOOKUPRC
# ; 6. VID enter prompt filename to play if method is set to a VID* option
# ; 7. VID you-have-entered filename to play if method is set to a VID* option
# ; 8. VID confirm prompt filename to play if method is set to a VID* option
# ; 9. VID digit length validation to use if method is set to a VID* option, set to empty or X to disable
# ; 10. Settings Container to use for settings for this script, must be CM_VIDPROMPT_SPECIAL container type
#
# ;inbound VICIDIAL calls:
#exten => 1234,1,Answer                  ; Answer the line
#exten => 1234,2,AGI(cm_VID_SPECIAL.agi,VIDPROMPTSPECIALLOOKUP---LB---999---1---TESTCAMP---x---y---z---X---VID_special_test)
#exten => 1234,3,Hangup

cm_wait.agi

# cm_wait.agi version 2.14
#
# Designed to make a call wait for X milliseconds before exiting
#
# Flag Options:
# 1- milliseconds to wait, default 1000
#
# example of what to set in the Call Menu:
# Set the prompt to "cm_wait.agi,1000"

debug_speak.agi

# debug_speak.agi version 2.0.5
#
# runs during any extension and speaks the extension sent to it while
# printing the extension as well as lots of info about the call to STDERR
#
# You need to put lines similar to those below in your extensions.conf file:
#
# ;inbound errors with speaking of extension:
#exten => _XXXX,1,AGI(debug_speak.agi,${EXTEN})
#exten => _XXXX,3,Hangup

getAGENTchannel.agi

# getAGENTchannel.agi by Omar Rodriguez  www.ItContinental.com
# Copyright (C) 2016  Matt Florell <vicidial@gmail.com>    LICENSE: AGPLv2
# This script is able to return the name of the channel that belongs to the agent,
# to allow administrators to whisper to the agents
# Has been made using Vicidial code as Base

invalid_speak.agi

# invalid_speak.agi version 2.0.5
#
# runs during an invalid extension and speaks the extension sent to it while printing to STDERR
#
# You need to put lines similar to those below in your extensions.conf file:
#
# ;inbound errors with speaking of extension:
#exten => _XXXX,1,AGI(invalid_speak.agi,${EXTEN})
#exten => _XXXX,2,Playback(invalid)
#exten => _XXXX,3,Hangup
#
#exten => _*XXXXXXXXXX*XXXX,1,AGI(invalid_speak.agi,${EXTEN})
#exten => _*XXXXXXXXXX*XXXX,2,Playback(invalid)
#exten => _*XXXXXXXXXX*XXXX,3,Hangup
#
#exten => _*XXXXXXXXXX*XXXX*,1,AGI(invalid_speak.agi,${EXTEN})
#exten => _*XXXXXXXXXX*XXXX*,2,Playback(invalid)
#exten => _*XXXXXXXXXX*XXXX*,3,Hangup
#
#exten => _**XXXX,1,AGI(invalid_speak.agi,${EXTEN})
#exten => _**XXXX,2,Playback(invalid)
#exten => _**XXXX,3,Hangup
#
#exten => _**XXXX*,1,AGI(invalid_speak.agi,${EXTEN})
#exten => _**XXXX*,2,Playback(invalid)
#exten => _**XXXX*,3,Hangup

park_call_IVR_cf_collect.agi

# park_call_IVR_cf_collect.agi version 2.12
#
# NOTE: this script is to be used with the Park Call IVR feature in campaigns.
# The purpose of this script is to allow the agent to park a call on this IVR
# and have the customer enter in sensitive numbers. This script should not
# require any modification to work.
#
# Defined in the Park Call AGI IVR field of a campaign, this script will ask
# customer for their ID and then populate it in the custom fiels defined in the
# variable below and then send the call back to the agent. If the customer
# enters nothing X number of times then the call can be kicked out to a separate
# in-group
#
# Here is a list of the variables that you can set:
#  1.  Language - default: en (English), other options are es-Spanish, fr-French
#  2.  First prompt - default: please_enter_id_number
#  3.  You-Entered prompt - default: you-entered
#  4.  Confirmation prompt - default: confirm_id_number
#  5.  Thank you prompt - default: auth-thankyou
#  6.  Invalid prompt - default: buzz
#  7.  Attempts before kick-out - default: 2
#  8.  Kick-out prompt - default: outside-transfer
#  9.  Kick-out In-Group
#  10. Custom Field to populate
#
# Example Park Call AGI IVR field:
# park_call_IVR_cf_collect.agi,en---please_enter_id_number---you-entered---confirm_id_number---auth-thankyou---buzz---2---outside-transfer---TEST_IN---test2

park_call_IVR_example.agi

# park_call_IVR_example.agi version 2.4
#
# NOTE: this script is an example of how you can use a custom AGI script with
# the new Park Call IVR feature in campaigns. You will most likely need to
# significantly alter this script to suit your specific needs
#
# Defined in the Park Call AGI IVR field of a campaign, this script will ask
# customer for their ID and then populate it in the vicidial_list table and then
# send the call back to the agent. If the customer enters nothing X number of
# times then the call can be kicked out to a separate in-group
#
# Here is a list of the variables that you can set:
#  1.  Language - default: en (English), other options are es-Spanish, fr-French
#  2.  First prompt - default: please_enter_id_number
#  3.  You-Entered prompt - default: you-entered
#  4.  Confirmation prompt - default: confirm_id_number
#  5.  Thank you prompt - default: auth-thankyou
#  6.  Invalid prompt - default: buzz
#  7.  Attempts before kick-out - default: 2
#  8.  Kick-out prompt - default: outside-transfer
#  9.  Kick-out In-Group
#
# Example Park Call AGI IVR field:
# park_call_IVR_example.agi|en---please_enter_id_number---you-entered---confirm_id_number---auth-thankyou---buzz---2---outside-transfer---TEST_IN
#
# NOTE: For Asterisk 1.8 and higher, use a comma instead of a pipe in the Park Call AGI IVR field

park_CID.agi

# park_CID.agi version 2.14
#
# runs before the park extension to populate the parked_channels entry with the channel's callerid
#
# You need to put lines similar to those below in your extensions.conf file:
#
# ;outbound dialing:
# exten => 8301,1,Answer
# exten => 8301,2,AGI(park_CID.agi)
# exten => 8301,3,Playback(park)
# exten => 8301,4,Hangup

phone_alt_CID.agi

# phone_alt_CID.agi
#
# Changes the CID number on calls that pass through it to the Alternate defined
# in the 'phones' record for the phone that placed the call
#
# You need to have lines similar to those below in your Custom Dialplan:
#
#;use alternate CID, if defined:
#exten => _91NXXNXXXXXX,1,AGI(phone_alt_CID.agi,${EXTEN})
#exten => _91NXXNXXXXXX,n,Goto(default,${EXTEN},1)
#
# The easiest way to set this up for a phone is to create a new Call Menu and
# then put the above Custom Dialplan into it, then set the Phone's
# 'phone context' to the call menu ID that you just created.

timer_rebeep.agi

# timer_rebeep.agi
#
# This script is designed to be launched from the in-group/campaign timer
# setting to set another trigger event for the next X seconds. Often used for
# calls that need to have a periodic beep signifying that the call is being
# recorded
#
# Just add the following to the System Settings Custom Dialplan Entry
# and set rebuild conf=Y
# exten => 8399,1,Answer
# exten => 8399,n,Wait(1)
# exten => 8399,n,Playback(beep)
# exten => 8399,n,AGI(timer_rebeep.agi,20---D1_DIAL_QUIET)
# exten => 8399,n,Hangup
#
# ; Below are the parameters needed for the script to be run properly
# ; 1. seconds delay before next trigger goes
# ; 2. timer action to launch
#
# Then set the in-groups/campaigns that you want to have this enabled
#   "Timer Action" = D1_DIAL_QUIET
#   "Timer Action Seconds" = 20
#   "Transfer Conf Number 1" = 8399

VD_amd.agi

# VD_amd.agi version 2.14
#
# runs after a call goes through AMD in extensions.conf to send the call on to
# it's proper destination, or when agent sends to VM message
#
# You need to put lines similar to those below in your extensions.conf file:
#
# ; VICIDIAL_auto_dialer transfer script AMD with Load Balanced:
# exten => 8369,1,AGI(call_log.agi,${EXTEN})
# exten => 8369,2,(AMD),AMD
# exten => 8369,3,AGI(VD_amd.agi,${EXTEN}-----NO)
# exten => 8369,4,AGI(agi-VDAD_LB_transfer.agi,${EXTEN})
# exten => 8369,5,AGI(agi-VDAD_LB_transfer.agi,${EXTEN})
# exten => 8369,6,AGI(agi-VDAD_LB_transfer.agi,${EXTEN})
# exten => 8369,7,Hangup
#
# exten => 8320,1,AGI(VD_amd.agi,${EXTEN}-----YES)
# exten => 8320,2,Hangup
# exten => _8320*.,1,AGI(VD_amd.agi,${EXTEN}-----YES)
# exten => _8320*.,2,Hangup

VD_auto_post_VERIFY.agi

# VD_auto_post_VERIFY.agi version 2.0.5   *DBI-version*
#
# NOTE: This script is only used with auto-message campaigns with dynamic data
#
# runs after a call is answered
#
# You need to put lines similar to those below in your extensions.conf file:
#
# ; VICIDIAL_auto_dialer transfer script AMD with Load Balanced:
#exten => 8320,1,WaitForSilence(2000,2) ; wait for 2 seconds of silence
#exten => 8320,2,AGI(VD_auto_post_VERIFY.agi,${EXTEN})
#exten => 8320,3,Hangup

VDL_CID_lookup.agi

# VDL_CID_lookup.agi      version 2.6
#
# runs after a call goes through AMD in extensions.conf to send the call on to
# it's proper destination
#
# You need to put lines similar to those below in your extensions.conf file:
#
# ; VICIDIAL_auto_dialer transfer script AMD with Load Balanced:
# exten => 8369,1,Ringing
# exten => 8369,2,Wait(1)
# exten => 8369,3,Answer
# exten => 8369,4,AGI(VDL_CID_lookup.agi)
# exten => 8369,5,AGI(agi-VDAD_ALL_inbound.agi,CID-----LB-----IN_TEST-----7275551212-----Closer-----park----------999-----1)
# exten => 8369,6,Hangup
# exten => 8369,7,AGI(call_logCID.agi,${EXTEN}-----${CALLERID}-----${CALLERIDNUM}-----${CALLERIDNAME})
# exten => 8369,8,AGI(agi-VDADinbound_NI_DNC_CIDlookup.agi)
# exten => 8369,9,Hangup

How to – Create a simple CDR report for ViciDial

ViciDial Custom Report

How to – Create a simple CDR report for ViciDial

This article will go over how to create a simple CDR report for ViciDial using MySQL and PHP. I will provide the code I’ve used to accomplish this report which can be altered to fit your needs. First off, I have to thank Nik from www.amdy.io for helping me with the MySQL query for it. Check out his site and his amazing AMD(Answering Machine Detection) service they offer for ViciDial and other dialer systems. Ok so lets get started.

Step 1 – Create the directory on your web server

First move into your web directory by the following commands for both RedHat(CentOS, Alma or Rocky) and OpenSuSE(Leap) distros.

RedHat:

cd /var/www/html
mkdir reports
cd reports

OpenSuSE:

cd /srv/www/htdocs
mkdir reports
cd reports

Step 2 – Copy the code below and create the PHP file to serve it up

Now just copy and paste the code below into a .php file to use with ViciDial after typing the following command: nano cdr-report.php

<?php

$servername = "localhost";
$username = "cron";
$password = "1234";
$dbname = "asterisk";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
  die("Connection failed: " . $conn->connect_error);
}

$sql = "SELECT vc.`lead_id`, `campaign_id`, va.`user`, `phone_number`, `first_name`, `last_name`, `outbound_cid`, vd.`call_date`, `dial_time`, va.`status` FROM vicidial_carrier_log vc,  vicidial_agent_log va, vicidial_list vl, vicidial_dial_log vd WHERE vc.`lead_id`= vl.`lead_id` AND va.uniqueid = vc.uniqueid AND vl.lead_id = vd.lead_id and va.`status` NOT LIKE 'NEW'  and vc.caller_code = vd.caller_code;";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
  // output data of each row
  while($row = $result->fetch_assoc()) {
    echo "<b><font color=red>Lead ID:</b></font> " . $row["lead_id"]. " -|- <b><font color=red>Campaign:</font></b> " . $row["campaign_id"]. " -|- <font color=red><b>Agent:</b></font> " . $row["user"]. " -|- <b><font color=red>Customer Number:</b></font> " . $row["phone_number"]. " -|- <b><font color=red>First Name:</b></font> " . $row["first_name"]. " -|- <b><font color=red>Last Name:</b></font> " . $row["last_name"]. " -|- <b><font color=red>Outbound Caller ID:</b></font> " . $row["outbound_cid"]. " -|- <b><font color=red>Dial Time:</b></font> " . $row["dial_time"]. " -|- <b><font color=red>Dispo:</b></font> " . $row["status"]. " -|- <b><font color=red>Call Date:</b></font> " . $row["call_date"]. "<br>";
  }
} else {
  echo "0 results";
}
$conn->close();
?>

After you save and exit, you should be able to access this page by going to https://yourserver.com/reports/cdr-report.php and you should see something like the image below:

CDR Report

Step 3 – Add this report into ViciDial through custom reports

  • Login to your admin panel and go to the reports page
  • Click on Admin Utilities as shown below
ViciDial Admin Utilities
  • Click on “Custom Reports Admin Page”
Custom Reports Admin Page
  • Fill out the first line with “CDR Report”
  • Fill out the third line with “../reports/cdr-report.php
Create Custom Report

Step 4 – Update User Group Permissions

Now you need to make sure the User Groups that you want to have access to this new report have the proper permissions.

  1. Click on User Groups and “Show User Groups”
  2. Click on the User Group you want to have access to this report
  3. Scroll down to the “Allowed Cutom Reports” area and click on “All Reports” or specify the new report we just created only.
Allowed Custom Reports

Step 5 – Check the Reports page for your newly created Custom Report

CDR Report

That’s it, You’ve now created a custom report to retrieve your CDR details. This article can be followed to create other custom reports as well, just modify the code as needed or create links to outside web pages or links to access through your reports page within ViciDial. I hope you will find this useful. Feel free to join our Skype Live Support if you need assistance.

-Chris aka carpenox