== Installation == Binary packages are available for Debian on i386 and amd64 architectures. To install add the following lines to /etc/apt/sources.list: {{{ deb http://ag-projects.com/debian unstable main deb-src http://ag-projects.com/debian unstable main }}} Install AG Projects debian repository signing key: {{{ wget http://download.ag-projects.com/agp-debian-gpg.key sudo apt-key add agp-debian-gpg.key }}} To install the software: {{{ sudo apt-get update sudo apt-get install callcontrol }}} For non Debian installations you must perform the following steps: For non Debian installations, you must install the following dependencies: * python-application (>= 1.0.9) * python-twisted-core * python-sqlobject You may run the software from its own directory or install it in a directory anywhere in the system. The software can be downloaded as a tar archive from: http://download.ag-projects.com/CallControl/ Extract it using tar xzvf callcontrol-version.tar.gz and change directory to the newly created callcontrol directory. The source code is managed using darcs version control tool. The darcs repository can be fetched with: {{{ darcs get http://devel.ag-projects.com/repositories/callcontrol }}} To obtain the incremental changes after the initial get: {{{ cd callcontrol darcs pull -a }}} Install the software: {{{ cd callcontrol sudo python setup.py install }}} == Configure the software == You need to setup the following components: * OpenSIPS callcontrol module, version >=1.5 * Call Control application (this software) * CDRTool rating engine, version >=6.7.0 === OpenSIPS configuration === {{{ loadmodule "mi_fifo.so" loadmodule "mi_datagram.so" loadmodule "sl.so" loadmodule "tm.so" loadmodule "dialog.so" loadmodule "call_control.so" modparam("call_control", "disable", 0) route { ... if ((method=="INVITE" && !has_totag())) { # you need to call this function at the first INVITE call_control(); switch ($retcode) { case 2: # Call with no limit case 1: # Call with a limit under callcontrol management (either prepaid or postpaid) break; case -1: # Not enough credit (prepaid call) xlog("L_INFO", "Call control: not enough credit for prepaid call\n"); acc_rad_request("402"); sl_send_reply("402", "Not enough credit"); exit; break; case -2: # Locked by call in progress (prepaid call) xlog("L_INFO", "Call control: prepaid call locked by another call in progress\n"); acc_rad_request("403"); sl_send_reply("403", "Call locked by another call in progress"); exit; break; default: # Internal error (message parsing, communication, ...) xlog("L_INFO", "Call control: internal server error\n"); acc_rad_request("500"); sl_send_reply("500", "Internal server error"); exit; } } ... } }}} === Call Control configuration === For all configuration options and their description see [source:config.ini.sample config.ini.sample] The application is searching for its configuration file config.ini in its current directory and in /etc/callcontrol/config.ini Copy config.ini.sample to /etc/callcontrol/config.ini and edit the file to suit your environment: {{{ [CallControl] ; how to detect sessions that have media timeout without BYE timeout_detection=dialog [CDRTool] ; connection to cdrtool rating engine for MaxSessionTime() and DebitBalance() address = cdrtool.hostname [OpenSIPS] ; connection to OpenSIPS call_control module ; socket_path = /var/run/opensips/socket max_connections = 10 }}} === CDRTool rating engine configuration === {{{ $RatingEngine=array( "socketIP" => "0", "socketPort" => "9024", "cdr_source" => "opensips_radius" ); }}} See the documentation of CDRTool project for how to setup the rating tables. == Start the server == {{{ /etc/init.d/callcontrol start }}} The server logs its messages to syslog. === Monitoring active sessions === {{{ /etc/init.d/callcontrol sessions }}} Overview of the ongoing sessions, generation of prepaid cards and prepaid accounts can be managed from CDRTool rating tables web interface. === Display details about an active session === {{{ /etc/init.d/callcontrol session id }}} === Terminating a session === {{{ /etc/init.d/callcontrol terminate id }}}