FreeSWITCH Loading Queues from Database
This has been a long due post waiting in my drafts for above two years now. This was done right after when I finished loading SIP users from Database in this blog post.
I always found myself at trouble when FreeSWITCH's MOD_XML_CURL was named together with loading configurations but as soon as I gave it a shot it became very easy and interesting.
Here is how to get started with loading queue from Database in just few minutes.
Here is what we need to get started:
1 - Database table containing Queue's parameters.
2 - A WebServer containing our DB-to-XML converter code
3 - FreeSWITCH with mod_xml_curl installed and configured.
Creating Table for Queue Parameters
So, first things first lets create a simple Database table:root@DBSERVER:# su - postgres postgres@DBSERVER:~$ psql psql (9.4.6) Type "help" for help. postgres=# \c freeswitch_configs You are now connected to database "freeswitch_configs" as user "postgres". freeswitch_configs=#
CREATE TABLE queues ( queue_id serial primary key, name VARCHAR(255) not null, strategy VARCHAR(100) default 'longest-idle-agent', moh_sound VARCHAR(255) default 'local_stream://moh', announce_sound VARCHAR(255) default NULL, announce_frequency VARCHAR(5) default NULL, time_base_score VARCHAR(255) DEFAULT 'queue' , tier_rules_apply VARCHAR(25) DEFAULT 'false', tier_rule_wait_second VARCHAR(4) DEFAULT '300', tier_rule_wait_multiply_level VARCHAR(5) DEFAULT 'true', tier_rule_no_agent_no_wait VARCHAR(255) DEFAULT 'false', discard_abandoned_after VARCHAR(5) DEFAULT '60', abandoned_resume_allowed VARCHAR(5) DEFAULT 'false', max_wait_time VARCHAR(25) DEFAULT '0', max_wait_time_with_no_agent VARCHAR(10) DEFAULT '0', max_wait_time_with_no_agent_time_reached VARCHAR(10) DEFAULT '0', record_template VARCHAR(255) DEFAULT NULL );
Once Table is created you can go ahead and create some queues in it via INSERT statements.
Setting up WebServer
Alright, we've some queues defined into our database table. Now, is the time to create a web service which will query the Database and pull required configurations. Once configurations are found for a queue we will put them nicely into the required XML format and reply back.
Take the PHP sample code from my github repo:
https://github.com/goharahmed/saevolgo/blob/master/getconfig.php
Configure the Database IP, Port, User, and Password as required and make sure there is no error in it.
Configure the Database IP, Port, User, and Password as required and make sure there is no error in it.
Once this is ready and running we can query to this web service and see that it returns an Error XML if no queue name is passed to it.
Test it:
http://ip.of.webserver:port/freeswitch/getconfig.php?CC-Queue=MyQueueName
If everything is configured properly and Queue: MyQueueName exists then it should print a fine XML - if that doesn't happen then check your PHP code, PHP PDO extension for PGSQL and verify that port is accessible and webserver is running.
http://ip.of.webserver:port/freeswitch/getconfig.php?CC-Queue=MyQueueName
If everything is configured properly and Queue: MyQueueName exists then it should print a fine XML - if that doesn't happen then check your PHP code, PHP PDO extension for PGSQL and verify that port is accessible and webserver is running.
Configuring MOD_XML_CURL
Assuming mod_xml_curl is installed on your FreeSwitch server now its time to configure its module xml_curl to pull configurations from webserver instead of local file.
root@FREESWITCH1:# cd /usr/local/freeswitch/conf root@FREESWITCH1:conf# cd autoload_configs/ root@FREESWITCH1:autoload_configs# vim xml_curl.conf.xml
<configuration name="xml_curl.conf" description="cURL XML Gateway"> <bindings> <binding name="configuration"> <param name="gateway-url" value="http://WEBSERVER/freeswitch/getconfig.php" bindings="configuration"/> </binding> </bindings> </configuration>
Ensure that there are no other configuration binding to conflict here.Save and exit. Go inside freeswitch console and reload mod_xml_curl
root@FREESWITCH1:# fs_cli fs_cli>reload mod_xml_curl +OK Reloading XML +OK module unloaded +OK module loaded
All set, now we are ready to load Queues from Database directly. To test things out issue this command
freeswitch@internal> callcenter_config queue load MynewQueue +OK freeswitch@internal> callcenter_config queue list name|strategy|moh_sound|time_base_score|tier_rules_apply|tier_rule_wait_second|tier_rule_wait_multiply_level|tier_rule_no_agent_no_wait|discard_abandoned_after|abandoned_resume_allowed|max_wait_time|max_wait_time_with_no_agent|max_wait_time_with_no_agent_time_reached|record_template support@default|longest-idle-agent|local_stream://moh|system|false|300|true|false|60|false|0|0|5| MynewQueue|longest-idle-agent||queue|false|0|false|true|60|false|0|0|5| +OK
To debug XML Curl
freeswitch@internal> xml_curl debug_on OK freeswitch@internal> callcenter_config queue load NOTMYQUEUE -ERR Invalid Queue not found! 2016-03-28 19:32:21.128783 [CONSOLE] mod_xml_curl.c:323 XML response is in /tmp/3337e053-077c-4f39-9c3f-0805c4896851.tmp.xml freeswitch@internal
root@FREESWITCH1:# cat /tmp/3337e053-077c-4f39-9c3f-0805c4896851.tmp.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <document type="freeswitch/xml"> <section name="result"><result status="not found" /> </document>
Conclusion
So, now we see how simple it is to pull configurations from Database - for a practice try this all with Conferences