The installation guides for Siremis v1.x and 2.0 have been relocated to our wiki system, click on next link to access it:
The content that follows in this page is obsoleted and will be removed soon.
Accounting Panel
Kamailio (OpenSER) does event-based accounting, storing the START and STOP events for each call. By default the SIP server stores a very limited number of details for each event. Therefore you have to extend the tables to store the information you need.
Config file
Changes in file kamailio.cfg
- make sure acc is configured with MySQL support
- set db_extra parameter
modparam("acc", "db_extra",
"src_user=$fU;src_domain=$fd;dst_user=$rU;dst_domain=$rd;src_ip=$si")
Database
Delete acc and missed_calls tables created by default and replace them using following definitions:
CREATE TABLE `acc` ( `id` int(10) unsigned NOT NULL auto_increment, `method` varchar(16) NOT NULL default '', `from_tag` varchar(64) NOT NULL default '', `to_tag` varchar(64) NOT NULL default '', `callid` varchar(128) NOT NULL default '', `sip_code` char(3) NOT NULL default '', `sip_reason` varchar(32) NOT NULL default '', `time` datetime NOT NULL default '0000-00-00 00:00:00', `src_ip` varchar(64) NOT NULL default '', `dst_user` varchar(64) NOT NULL default '', `dst_domain` varchar(128) NOT NULL default '', `src_user` varchar(64) NOT NULL default '', `src_domain` varchar(128) NOT NULL default '', `cdr_id` integer NOT NULL default '0', INDEX acc_callid (`callid`), PRIMARY KEY (`id`) ); CREATE TABLE `missed_calls` ( `id` int(10) unsigned NOT NULL auto_increment, `method` varchar(16) NOT NULL default '', `from_tag` varchar(64) NOT NULL default '', `to_tag` varchar(64) NOT NULL default '', `callid` varchar(128) NOT NULL default '', `sip_code` char(3) NOT NULL default '', `sip_reason` varchar(32) NOT NULL default '', `time` datetime NOT NULL default '0000-00-00 00:00:00', `src_ip` varchar(64) NOT NULL default '', `dst_user` varchar(64) NOT NULL default '', `dst_domain` varchar(128) NOT NULL default '', `src_user` varchar(64) NOT NULL default '', `src_domain` varchar(128) NOT NULL default '', `cdr_id` integer NOT NULL default '0', INDEX mc_callid (`callid`), PRIMARY KEY (`id`) );
Create CDRS table:
CREATE TABLE `cdrs` ( `cdr_id` bigint(20) NOT NULL auto_increment, `src_username` varchar(64) NOT NULL default '', `src_domain` varchar(128) NOT NULL default '', `dst_username` varchar(64) NOT NULL default '', `dst_domain` varchar(128) NOT NULL default '', `call_start_time` datetime NOT NULL default '0000-00-00 00:00:00', `duration` int(10) unsigned NOT NULL default '0', `sip_call_id` varchar(128) NOT NULL default '', `sip_from_tag` varchar(128) NOT NULL default '', `sip_to_tag` varchar(128) NOT NULL default '', `src_ip` varchar(64) NOT NULL default '', `created` datetime NOT NULL, PRIMARY KEY (`cdr_id`), UNIQUE KEY `uk_cft` (`sip_call_id`,`sip_from_tag`,`sip_to_tag`) );
Stored procedure
Create the stored procedure to be used to aggregate START and STOP accounting events:
DELIMITER //
CREATE PROCEDURE `kamailio_cdrs`()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE bye_record INT DEFAULT 0;
DECLARE v_src_user,v_src_domain,v_dst_user,v_dst_domain,v_callid,v_from_tag,
v_to_tag,v_src_ip VARCHAR(64);
DECLARE v_inv_time, v_bye_time DATETIME;
DECLARE inv_cursor CURSOR FOR SELECT src_user, src_domain, dst_user,
dst_domain, time, callid,from_tag, to_tag, src_ip FROM acc
where method='INVITE' and cdr_id='0';
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
OPEN inv_cursor;
REPEAT
FETCH inv_cursor INTO v_src_user, v_src_domain, v_dst_user, v_dst_domain,
v_inv_time, v_callid, v_from_tag, v_to_tag, v_src_ip;
IF NOT done THEN
SET bye_record = 0;
SELECT 1, time INTO bye_record, v_bye_time FROM acc WHERE
method='BYE' AND callid=v_callid AND ((from_tag=v_from_tag
AND to_tag=v_to_tag)
OR (from_tag=v_to_tag AND to_tag=v_from_tag))
ORDER BY time ASC LIMIT 1;
IF bye_record = 1 THEN
INSERT INTO cdrs (src_username,src_domain,dst_username,
dst_domain,call_start_time,duration,sip_call_id,sip_from_tag,
sip_to_tag,src_ip,created) VALUES (v_src_user,v_src_domain,
v_dst_user,v_dst_domain,v_inv_time,
UNIX_TIMESTAMP(v_bye_time)-UNIX_TIMESTAMP(v_inv_time),
v_callid,v_from_tag,v_to_tag,v_src_ip,NOW());
UPDATE acc SET cdr_id=last_insert_id() WHERE callid=v_callid
AND from_tag=v_from_tag AND to_tag=v_to_tag;
END IF;
SET done = 0;
END IF;
UNTIL done END REPEAT;
END
//
DELIMITER ;
You should schedule a job in cron.d to run the stored procedure every minute.
Do not forget to restart Kamailio (OpenSER) SIP server.