From 2ac35536b38918bc83fafe0e8563e95ab3fc774b Mon Sep 17 00:00:00 2001 From: Sergey Safarov Date: Tue, 7 Nov 2017 12:58:01 +0100 Subject: [PATCH] pkg/kamailio/obs: added package for sipcapture daemon - includes config and system files - worked from PR #1106 --- misc/examples/pkg/sipcapture.cfg | 986 ++++++++++++++++++++++++++ pkg/kamailio/obs/kamailio.spec | 41 +- pkg/kamailio/obs/sipcapture.service | 26 + pkg/kamailio/obs/sipcapture.sysconfig | 12 + pkg/kamailio/obs/sipcapture.tmpfiles | 1 + src/Makefile | 18 +- 6 files changed, 1082 insertions(+), 2 deletions(-) create mode 100644 misc/examples/pkg/sipcapture.cfg create mode 100644 pkg/kamailio/obs/sipcapture.service create mode 100644 pkg/kamailio/obs/sipcapture.sysconfig create mode 100644 pkg/kamailio/obs/sipcapture.tmpfiles diff --git a/misc/examples/pkg/sipcapture.cfg b/misc/examples/pkg/sipcapture.cfg new file mode 100644 index 00000000000..0003e532331 --- /dev/null +++ b/misc/examples/pkg/sipcapture.cfg @@ -0,0 +1,986 @@ +#!KAMAILIO +# +# Example configuration file for a sipcapture node +# + +####### Global Parameters definitions ######### +# +# Please, make all your configuration changes here +# +# *** To enable extra stats +# - define WITH_STATISTIC_METHOD_EXTRA +# - define WITH_STATISTIC_INVITE_1XX + + + +#!substdef "!HOMER_DB_USER!homer_user!g" +#!substdef "!HOMER_DB_PASSWORD!homer_password!g" +#!substdef "!HOMER_LISTEN_PROTO!udp!g" +#!substdef "!HOMER_LISTEN_IF!0.0.0.0!g" +#!substdef "!HOMER_LISTEN_PORT!9060!g" +#!substdef "!HOMER_STATS_SERVER!tcp:HOMER_LISTEN_IF:8888!g" + +####### Global Parameters ######### + +debug=1 +log_stderror=no +log_name="homer" + +memdbg=5 +memlog=5 + +##!define WITH_HOMER_GEO +##!define WITH_HOMER_CUSTOM_STATS #enable it for HTTP custom stats + +log_facility=LOG_LOCAL1 + +fork=yes +children=5 + +/* uncomment the next line to disable TCP (default on) */ +disable_tcp=no + +tcp_accept_no_cl=yes + +/* IP and port for HEP capturing) */ +listen=HOMER_LISTEN_PROTO:HOMER_LISTEN_IF:HOMER_LISTEN_PORT + +listen=tcp:0.0.0.0:9061 + +#!ifdef WITH_HOMER_CUSTOM_STATS +listen=HOMER_STATS_SERVER +#!endif + +#Max loops +max_while_loops=100 + +# set paths to location of modules (to sources or installation folders) +#!ifdef WITH_SRCPATH +mpath="modules" +#!else +mpath="/usr/local/lib/kamailio/modules/" +#!endif + +loadmodule "pv.so" +loadmodule "db_mysql.so" +loadmodule "sipcapture.so" +loadmodule "textops.so" +loadmodule "rtimer.so" +loadmodule "xlog.so" +loadmodule "sqlops.so" +loadmodule "htable.so" +loadmodule "tm.so" +loadmodule "sl.so" +loadmodule "siputils.so" +loadmodule "exec.so" + +#!ifdef WITH_HOMER_GEO +loadmodule "geoip.so" +#!endif + +#!ifdef WITH_HOMER_CUSTOM_STATS +loadmodule "xhttp.so" +loadmodule "jansson.so" +loadmodule "avpops.so" +#!endif + + +modparam("htable", "htable", "a=>size=8;autoexpire=400") +modparam("htable", "htable", "b=>size=8;autoexpire=31") +# TODO: tune autoexpire setting for htable "c" +modparam("htable", "htable", "c=>size=8;autoexpire=31") + +#!ifdef WITH_HOMER_CUSTOM_STATS +modparam("htable", "htable", "d=>size=8;autoexpire=400") +modparam("xhttp", "url_match", "^/api/v1/stat") +#!endif + +modparam("rtimer", "timer", "name=ta;interval=60;mode=1;") +modparam("rtimer", "exec", "timer=ta;route=TIMER_STATS") + +modparam("sqlops","sqlcon","cb=>mysql://HOMER_DB_USER:HOMER_DB_PASSWORD@127.0.0.1/homer_statistic") +modparam("sqlops","sqlcon","wc=>mysql://HOMER_DB_USER:HOMER_DB_PASSWORD@127.0.0.1/homer_data") + +# ----- mi_fifo params ----- + +####### Routing Logic ######## +modparam("sipcapture", "db_url", "mysql://HOMER_DB_USER:HOMER_DB_PASSWORD@127.0.0.1/homer_data") +modparam("sipcapture", "capture_on", 1) +modparam("sipcapture", "hep_capture_on", 1) +modparam("sipcapture", "insert_retries", 5) +modparam("sipcapture", "insert_retry_timeout", 10) +#modparam("sipcapture", "capture_node", "homer01") +modparam("sipcapture", "nonsip_hook", 1) + + +#!ifdef WITH_HOMER_GEO +modparam("geoip", "path", "/usr/share/GeoIP/GeoIP.dat") +#!endif + +#Stats time +stats.min = 5 desc "My stats TIME min" + + +# Main SIP request routing logic +# - processing of any incoming SIP request starts with this route +route { + + if($sht(a=>method::total) == $null) $sht(a=>method::total) = 0; + $sht(a=>method::total) = $sht(a=>method::total) + 1; + if($sht(a=>packet::count) == $null) $sht(a=>packet::count) = 0; + if($sht(a=>packet::size) == $null) $sht(a=>packet::size) = 0; + + #Packets + $sht(a=>packet::count) = $sht(a=>packet::count) + 1; + $sht(a=>packet::size) = $sht(a=>packet::size) + $ml; + + + if($sht(b=>$rm::$cs::$ci) != $null) { + #$var(a) = "sip_capture_call" + "_%Y%m%d"; + #Store + route(STORE); + drop; + } + + $sht(b=>$rm::$cs::$ci) = 1; + if($sht(a=>method::all) == $null) $sht(a=>method::all) = 0; + $sht(a=>method::all) = $sht(a=>method::all) + 1; + + if (is_method("INVITE|REGISTER")) { + + if($ua =~ "(friendly-scanner|sipvicious|sipcli)") { + sql_query("cb", "INSERT INTO alarm_data_mem (create_date, type, total, source_ip, description) VALUES(NOW(), 'scanner', 1, '$si', 'Friendly scanner alarm!') ON DUPLICATE KEY UPDATE total=total+1"); + route(KILL_VICIOUS); + } + + #IP Method + sql_query("cb", "INSERT INTO stats_ip_mem ( method, source_ip, total) VALUES('$rm', '$si', 1) ON DUPLICATE KEY UPDATE total=total+1"); + +#!ifdef WITH_HOMER_GEO + if(geoip_match("$si", "src")) { + xlog("REGISTER|INVITE SIP message [$si] from: $gip(src=>cc)\n"); + sql_query("cb", "INSERT INTO stats_geo_mem ( method, country, lat, lon, total) VALUES('$rm', '$gip(src=>cc)', '$gip(src=>lat)', '$gip(src=>lon)', 1) ON DUPLICATE KEY UPDATE total=total+1"); + } +#!endif + + + if($au != $null) $var(anumber) = $au; + else $var(anumber) = $fU; + + if($(var(anumber){s.substr,0,5}) == "+204231") { + if($sht(a=>alarm::scam) == $null) $sht(a=>alarm::scam) = 0; + $sht(a=>alarm::scam) = $sht(a=>alarm::scam) + 1; + } + + if($(rU{s.substr,0,5}) == "+204231") { + if($sht(a=>alarm::scam) == $null) $sht(a=>alarm::scam) = 0; + $sht(a=>alarm::scam) = $sht(a=>alarm::scam) + 1; + } + + + #if($sel(contact.uri.host) =~ "^([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))$") { + if($sel(contact.uri.host) =~ "^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$") { + if($sht(a=>alarm::dns) == $null) $sht(a=>alarm::dns) = 0; + $sht(a=>alarm::dns) = $sht(a=>alarm::dns) + 1; + } + + + if($sel(contact.uri.host) != $si) { + if($sht(a=>alarm::spoofing) == $null) $sht(a=>alarm::spoofing) = 0; + $sht(a=>alarm::spoofing) = $sht(a=>alarm::spoofing) + 1; + } + + if($au =~ "(\=)|(\-\-)|(\')|(\#)|(\%27)|(\%24)") { + if($sht(a=>alarm::sqlinjection) == $null) $sht(a=>alarm::sqlinjection) = 0; + $sht(a=>alarm::sqlinjection) = $sht(a=>alarm::sqlinjection) + 1; + } + + if($(hdr(Record-Route)[0]{nameaddr.uri}) != $si) { + if($sht(a=>alarm::spoofing) == $null) $sht(a=>alarm::spoofing) = 0; + $sht(a=>alarm::spoofing) = $sht(a=>alarm::spoofing) + 1; + } + + + if (is_method("INVITE")) { + + if (has_totag()) { + if($sht(a=>method::reinvite) == $null) $sht(a=>method::reinvite) = 0; + $sht(a=>method::reinvite) = $sht(a=>method::reinvite) + 1; + } + else { + if($sht(a=>method::invite) == $null) $sht(a=>method::invite) = 0; + $sht(a=>method::invite) = $sht(a=>method::invite) + 1; + if($adu != $null) { + if($sht(a=>method::invite::auth) == $null) $sht(a=>method::invite::auth) = 0; + $sht(a=>method::invite::auth) = $sht(a=>method::invite::auth) + 1; + } + + if($ua != $null) { + sql_query("cb", "INSERT INTO stats_useragent_mem (useragent, method, total) VALUES('$ua', 'INVITE', 1) ON DUPLICATE KEY UPDATE total=total+1"); + } + + } + } + else { + if($sht(a=>method::register) == $null) $sht(a=>method::register) = 0; + $sht(a=>method::register) = $sht(a=>method::register) + 1; + + if($adu != $null) { + if($sht(a=>method::register::auth) == $null) $sht(a=>method::register::auth) = 0; + $sht(a=>method::register::auth) = $sht(a=>method::register::auth) + 1; + } + + if($ua != $null) { + sql_query("cb", "INSERT INTO stats_useragent_mem (useragent, method, total) VALUES('$ua', 'REGISTER', 1) ON DUPLICATE KEY UPDATE total=total+1"); + } + } + + } + else if(is_method("BYE")) { + if($sht(a=>method::bye) == $null) $sht(a=>method::bye) = 0; + $sht(a=>method::bye) = $sht(a=>method::bye) + 1; + if(is_present_hf("Reason")) { + $var(cause) = $(hdr(Reason){param.value,cause}{s.int}); + if($var(cause) != 16 && $var(cause) !=17) { + if($sht(a=>stats::sdf) == $null) $sht(a=>stats::sdf) = 0; + $sht(a=>stats::sdf) = $sht(a=>stats::sdf) + 1; + } + } + +# if($si != $sht(a=>ipinit::aleg::$ci) && $si != $sht(a=>ipinit::bleg::$ci)) { +# if($sht(a=>alarm::sessiontd) == $null) $sht(a=>alarm::sessiontd) = 0; +# $sht(a=>alarm::sessiontd) = $sht(a=>alarm::sessiontd) + 1; +# } + + } + else if(is_method("CANCEL")) { + if($sht(a=>method::cancel) == $null) $sht(a=>method::cancel) = 0; + $sht(a=>method::cancel) = $sht(a=>method::cancel) + 1; + + } + else if(is_method("OPTIONS")) { + if($sht(a=>method::options) == $null) $sht(a=>method::options) = 0; + $sht(a=>method::options) = $sht(a=>method::options) + 1; + #xlog("OPTIONS COUNTING.... $sht(a=>method::options)\n"); + + } + else if(is_method("REFER")) { + if($sht(a=>method::refer) == $null) $sht(a=>method::refer) = 0; + $sht(a=>method::refer) = $sht(a=>method::refer) + 1; + + } + else if(is_method("UPDATE")) { + if($sht(a=>method::update) == $null) $sht(a=>method::update) = 0; + $sht(a=>method::update) = $sht(a=>method::update) + 1; + } + +#!ifdef WITH_STATISTIC_METHOD_EXTRA + else if(is_method("ACK")) { + if($sht(a=>method::ack) == $null) $sht(a=>method::ack) = 0; + $sht(a=>method::ack) = $sht(a=>method::ack) + 1; + } + else { + if($sht(a=>method::unknown) == $null) $sht(a=>method::unknown) = 0; + $sht(a=>method::unknown) = $sht(a=>method::uknown) + 1; + } +#!endif + + else if(is_method("PUBLISH")) + { + if(has_body("application/vq-rtcpxr") && $(rb{s.substr,0,1}) != "x") { + $var(table) = "report_capture"; + $var(callid) = $(rb{re.subst,/(.*)CallID:([0-9A-Za-z@-]{5,120})(.*)$/\2/s}); + #xlog("CALLID: $var(callid)"); +#!ifdef KAMAILIO_4_3 + xlog("report_capture is not in < 4.3"); +#!else + report_capture("$var(table)", "$var(callid)"); +#!endif + drop; + } + } + + #Store + route(STORE); + drop; +} + +onreply_route { + + if($sht(a=>method::total) == $null) $sht(a=>method::total) = 0; + $sht(a=>method::total) = $sht(a=>method::total) + 1; + + if($sht(b=>$rs::$cs::$rm::$ci) != $null) { + #Store + route(STORE); + drop; + } + + $sht(b=>$rs::$cs::$rm::$ci) = 1; + + if($sht(a=>method::all) == $null) $sht(a=>method::all) = 0; + $sht(a=>method::all) = $sht(a=>method::all) + 1; + + #413 Too large + if(status == "413") { + if($sht(a=>response::413) == $null) $sht(a=>response::413) = 0; + $sht(a=>response::413) = $sht(a=>response::413) + 1; + + if($sht(a=>alarm::413) == $null) $sht(a=>alarm::413) = 0; + $sht(a=>alarm::413) = $sht(a=>alarm::413) + 1; + } + #403 Unauthorize + else if(status == "403") { + if($sht(a=>response::403) == $null) $sht(a=>response::403) = 0; + $sht(a=>response::403) = $sht(a=>response::403) + 1; + + if($sht(a=>alarm::403) == $null) $sht(a=>alarm::403) = 0; + $sht(a=>alarm::403) = $sht(a=>alarm::403) + 1; + } + # Too many hops + else if(status == "483") { + if($sht(a=>response::483) == $null) $sht(a=>response::483) = 0; + $sht(a=>response::483) = $sht(a=>response::483) + 1; + + if($sht(a=>alarm::483) == $null) $sht(a=>alarm::483) = 0; + $sht(a=>alarm::483) = $sht(a=>alarm::483) + 1; + + } + # loops + else if(status == "482") { + if($sht(a=>response::482) == $null) $sht(a=>response::482) = 0; + $sht(a=>response::482) = $sht(a=>response::482) + 1; + + if($sht(a=>alarm::482) == $null) $sht(a=>alarm::482) = 0; + $sht(a=>alarm::482) = $sht(a=>alarm::482) + 1; + + } + # Call Transaction Does not exist + else if(status == "481") { + if($sht(a=>alarm::481) == $null) $sht(a=>alarm::481) = 0; + $sht(a=>alarm::481) = $sht(a=>alarm::481) + 1; + } + # 408 Timeout + else if(status == "408") { + if($sht(a=>alarm::408) == $null) $sht(a=>alarm::408) = 0; + $sht(a=>alarm::408) = $sht(a=>alarm::408) + 1; + } + # 400 + else if(status == "400") { + + if($sht(a=>alarm::400) == $null) $sht(a=>alarm::400) = 0; + $sht(a=>alarm::400) = $sht(a=>alarm::400) + 1; + + } + # MOVED + else if(status =~ "^(30[012])$") { + if($sht(a=>response::300) == $null) $sht(a=>response::300) = 0; + $sht(a=>response::300) = $sht(a=>response::300) + 1; + } + + if($rm == "INVITE") { + #ISA + if(status =~ "^(408|50[03])$") { + if($sht(a=>stats::isa) == $null) $sht(a=>stats::isa) = 0; + $sht(a=>stats::isa) = $sht(a=>stats::isa) + 1; + } + #Bad486 + if(status =~ "^(486|487|603)$") { + if($sht(a=>stats::bad::invite) == $null) $sht(a=>stats::bad::invite) = 0; + $sht(a=>stats::bad::invite) = $sht(a=>stats::bad::invite) + 1; + } + + #SD + if(status =~ "^(50[034])$") { + if($sht(a=>stats::sd) == $null) $sht(a=>stats::sd) = 0; + $sht(a=>stats::sd) = $sht(a=>stats::sd) + 1; + } + + if(status == "407") { + if($sht(a=>response::407::invite) == $null) $sht(a=>response::407::invite)= 0; + $sht(a=>response::407::invite) = $sht(a=>response::407::invite) + 1; + } + else if(status == "401") { + if($sht(a=>response::401::invite) == $null) $sht(a=>response::401::invite)= 0; + $sht(a=>response::401::invite) = $sht(a=>response::401::invite) + 1; + } + else if(status == "200") { + if($sht(a=>response::200::invite) == $null) $sht(a=>response::200::invite)= 0; + $sht(a=>response::200::invite) = $sht(a=>response::200::invite) + 1; + } + #Aditional stats +#!ifdef WITH_STATISTIC_INVITE_1XX + else if(status == "100") { + if($sht(a=>response::100::invite) == $null) $sht(a=>response::100::invite)= 0; + $sht(a=>response::100::invite) = $sht(a=>response::100::invite) + 1; + } + else if(status == "180") { + if($sht(a=>response::180::invite) == $null) $sht(a=>response::180::invite)= 0; + $sht(a=>response::180::invite) = $sht(a=>response::180::invite) + 1; + } + else if(status == "183") { + if($sht(a=>response::183::invite) == $null) $sht(a=>response::183::invite)= 0; + $sht(a=>response::183::invite) = $sht(a=>response::183::invite) + 1; + } +#!endif + } + else if($rm == "BYE") { + + if(status == "407") { + if($sht(a=>response::407::bye) == $null) $sht(a=>response::407::bye) = 0; + $sht(a=>response::407::bye) = $sht(a=>response::407::bye) + 1; + } + else if(status == "401") { + if($sht(a=>response::401::bye) == $null) $sht(a=>response::401::bye) = 0; + $sht(a=>response::401::bye) = $sht(a=>response::401::bye) + 1; + } + else if(status == "200") { + if($sht(a=>response::200::bye) == $null) $sht(a=>response::200::bye) = 0; + $sht(a=>response::200::bye) = $sht(a=>response::200::bye) + 1; + } + } + + #Store + route(STORE); + drop; +} + +route[KILL_VICIOUS] { + xlog("Kill-Vicious ! si : $si ru : $ru ua : $ua\n"); + return; +} + +route[STATS_BY_IP] { + if($sht(c=>$rs::$sel(via[1].host)) == $null) $sht(c=>$rs::$sel(via[1].host)) = 0; + $sht(c=>$rs::$sel(via[1].host)) = $sht(c=>$rs::$sel(via[1].host)) + 1; +} + +route[PARSE_STATS_IP] { + sht_iterator_start("i1", "c"); + while(sht_iterator_next("i1")) { + $var(sipcode) = $(shtitkey(i1){s.select,0,:}); + $var(ip) = $(shtitkey(i1){s.select,2,:}); + + if($shtitval(i1) > $avp($var(sipcode))) { + sql_query("cb", "INSERT INTO alarm_data (create_date, type, total, source_ip, description) VALUES(NOW(), 'Too Many $var(sipcode)', $shtitval(i1), '$var(ip)', 'Too Many $var(sipcode)')"); + } + } + sht_iterator_end("i1"); + sht_rm_name_re("c=>.*"); +} + +route[TIMER_STATS] { + + #xlog("timer routine: time is $TS\n"); + + route(CHECK_ALARM); + #Check statistics + route(CHECK_STATS); + +} + + +route[SEND_ALARM] { + exec_msg('echo "Value: $var(thvalue), Type: $var(atype), Desc: $var(aname)" | mail -s "Homer Alarm $var(atype) - $var(thvalue)" $var(aemail) ') ; +} + +route[CHECK_ALARM] +{ + + #POPULATE ALARM THRESHOLDS + #Homer 5 sql schema + sql_query("cb", "SELECT type,value,name,notify,email FROM alarm_config WHERE NOW() between startdate AND stopdate AND active = 1", "ra"); + if($dbr(ra=>rows)>0) + { + $var(i) = 0; + while($var(i)<$dbr(ra=>rows)) + { + $var(atype) = $dbr(ra=>[$var(i),0]); + $var(avalue) = $dbr(ra=>[$var(i),1]); + $var(aname) = $dbr(ra=>[$var(i),2]); + $var(anotify) = $(dbr(ra=>[$var(i),3]){s.int}); + $var(aemail) = $dbr(ra=>[$var(i),4]); + $avp($var(atype)) = $var(avalue); + + if($sht(a=>alarm::$var(atype)) != $null) { + $var(thvalue) = $sht(a=>alarm::$var(atype)); + } + + #If Alarm - go here + if($var(thvalue) > $var(avalue)) { + + sql_query("cb", "INSERT INTO alarm_data (create_date, type, total, description) VALUES(NOW(), '$var(aname)', $var(thvalue), '$var(aname) - $var(atype)');"); + #Notify + if($var(anotify) == 1) { + route(SEND_ALARM); + } + } + + #Alarm for Scanner; + if($var(atype) == "scanner") { + sql_query("cb", "DELETE FROM alarm_data_mem WHERE type='scanner' AND total < $var(avalue)"); + if($var(anotify) == 1) + { + sql_query("cb", "SELECT * FROM alarm_data_mem WHERE type='scanner' AND total >= $var(avalue) LIMIT 2", "rd"); + if($dbr(rd=>rows) > 0) { + route(SEND_ALARM); + } + + sql_result_free("rd"); + } + } + + $sht(a=>alarm::$var(atype)) = 0; + $var(i) = $var(i) + 1; + } + + } + + + sql_result_free("ra"); + + + #if(sql_xquery("cb", "select type,value,name,notify,email from alarm_config WHERE startdate > NOW() AND stopdate < NOW() AND active = 1", "trigger") == 1) { + # $var(i) = 0; + # while($xavp(trigger[$var(i)]) != $null) { + # $avp($xavp(trigger[$var(i)]=>type)) = $xavp(trigger[$var(i)]=>value); + # $avp($xavp(trigger[$var(i)]=>type)+"_notify") = $xavp(trigger[$var(i)]=>notify); + # $avp($xavp(trigger[$var(i)]=>type)+"_email") = $xavp(trigger[$var(i)]=>email); + # $var(i) = $var(i) + 1; + # } + #} + + route(PARSE_STATS_IP); + + #delete old alarms + sql_query("cb", "DELETE FROM alarm_data WHERE create_date < DATE_SUB(NOW(), INTERVAL 5 DAY)"); +} + + +route[CHECK_STATS] { + + #SQL STATS + $var(tm) = ($time(min) mod 10); + if($var(tm) != 0 && $var(tm) != $sel(cfg_get.stats.min)) return; + + $var(t1) = $TS; + $var(t2) = $var(t1) - ($sel(cfg_get.stats.min)*60); + + $var(t_date) = "FROM_UNIXTIME(" + $var(t1) + ", '%Y-%m-%d %H:%i:00')"; + $var(f_date) = "FROM_UNIXTIME(" + $var(t2) + ", '%Y-%m-%d %H:%i:00')"; + + #ALARM SCANNERS + sql_query("cb", "INSERT INTO alarm_data (create_date, type, total, source_ip, description) SELECT create_date, type, total, source_ip, description FROM alarm_data_mem;"); + sql_query("cb", "TRUNCATE TABLE alarm_data_mem"); + + #STATS Useragent + sql_query("cb", "INSERT INTO stats_useragent (from_date, to_date, useragent, method, total) SELECT $var(f_date) as from_date, $var(t_date) as to_date, useragent, method, total FROM stats_useragent_mem;"); + sql_query("cb", "TRUNCATE TABLE stats_useragent_mem"); + + #STATS IP + sql_query("cb", "INSERT INTO stats_ip (from_date, to_date, method, source_ip, total) SELECT $var(f_date) as from_date, $var(t_date) as to_date, method, source_ip, total FROM stats_ip_mem;"); + sql_query("cb", "TRUNCATE TABLE stats_ip_mem"); + +#!ifdef WITH_HOMER_GEO + sql_query("cb", "INSERT INTO stats_geo (from_date, to_date, method, country, lat, lon, total) SELECT $var(f_date) as from_date, $var(t_date) as to_date, method, country, lat, lon, total FROM stats_geo_mem;"); + sql_query("cb", "TRUNCATE TABLE stats_geo_mem"); +#!endif + + #INSERT SQL STATS + #Packet HEP stats + if($sht(a=>packet::count) != $null && $sht(a=>packet::count) > 0) { + sql_query("cb", "INSERT INTO stats_data (from_date, to_date, type, total) VALUES($var(f_date), $var(t_date), 'packet_count', $sht(a=>packet::count)) ON DUPLICATE KEY UPDATE total=total+$sht(a=>packet::count)"); + $sht(a=>packet::count) = 0; + } + if($sht(a=>packet::size) != $null && $sht(a=>packet::size) > 0) { + sql_query("cb", "INSERT INTO stats_data (from_date, to_date, type, total) VALUES($var(f_date), $var(t_date), 'packet_size', $sht(a=>packet::size)) ON DUPLICATE KEY UPDATE total=total+$sht(a=>packet::size)"); + $sht(a=>packet::size) = 0; + } + + #SDF + if($sht(a=>stats::sdf) != $null && $sht(a=>stats::sdf) > 0) { + sql_query("cb", "INSERT INTO stats_data (from_date, to_date, type, total) VALUES($var(f_date), $var(t_date), 'sdf', $sht(a=>stats::sdf)) ON DUPLICATE KEY UPDATE total=total+$sht(a=>stats::sdf)"); + $sht(a=>stats::sdf) = 0; + } + + #ISA + if($sht(a=>stats::isa) != $null && $sht(a=>stats::isa) > 0) { + sql_query("cb", "INSERT INTO stats_data (from_date, to_date, type, total) VALUES($var(f_date), $var(t_date), 'isa', $sht(a=>stats::isa)) ON DUPLICATE KEY UPDATE total=total+$sht(a=>stats::isa)"); + $sht(a=>stats::isa) = 0; + } + + #SD + if($sht(a=>stats::sd) != $null && $sht(a=>stats::sd) > 0) { + sql_query("cb", "INSERT INTO stats_data (from_date, to_date, type, total) VALUES($var(f_date), $var(t_date), 'isa', $sht(a=>stats::sd)) ON DUPLICATE KEY UPDATE total=total+$sht(a=>stats::sd)"); + $sht(a=>stats::sd) = 0; + } + + #SSR + if($sht(a=>stats::ssr) != $null && $sht(a=>stats::ssr) > 0) { + sql_query("cb", "INSERT INTO stats_data (from_date, to_date, type, total) VALUES($var(f_date), $var(t_date), 'ssr', $sht(a=>stats::ssr)) ON DUPLICATE KEY UPDATE total=total+$sht(a=>stats::ssr)"); + $sht(a=>stats::ssr) = 0; + } + + #ASR + $var(asr) = 0; + #if($sht(a=>response::200::invite) > 0) { + if($sht(a=>method::invite) > 0) { + if($sht(a=>response::407::invite) == $null) $sht(a=>response::407::invite) = 0; + if($sht(a=>response::200::invite) == $null) $sht(a=>response::200::invite) = 0; + $var(d) = $sht(a=>method::invite) - $sht(a=>response::407::invite); + if($var(d) > 0) { + $var(asr) = $sht(a=>response::200::invite) * 100 / $var(d); + if($var(asr) > 100) $var(asr) = 100; + } + } + + #Stats DATA + sql_query("cb", "INSERT INTO stats_data (from_date, to_date, type, total) VALUES($var(f_date), $var(t_date), 'asr', $var(asr)) ON DUPLICATE KEY UPDATE total=(total+$var(asr))/2"); + + + #NER + $var(ner) = 0; + #if($sht(a=>response::200::invite) > 0 || $sht(a=>stats::bad::invite) > 0) { + if($sht(a=>method::invite) > 0) { + + if($sht(a=>response::200::invite) == $null) $sht(a=>response::200::invite) = 0; + if($sht(a=>response::bad::invite) == $null) $sht(a=>response::bad::invite) = 0; + if($sht(a=>response::407::invite) == $null) $sht(a=>response::407::invite) = 0; + + $var(d) = $sht(a=>method::invite) - $sht(a=>response::407::invite); + + if($var(d) > 0) { + $var(ner) = ($sht(a=>response::200::invite) + $sht(a=>stats::bad::invite)) * 100 / $var(d); + if($var(ner) > 100) $var(ner) = 100; + } + } + + sql_query("cb", "INSERT INTO stats_data (from_date, to_date, type, total) VALUES($var(f_date), $var(t_date), 'ner', $var(ner)) ON DUPLICATE KEY UPDATE total=(total+$var(ner))/2"); + + #INVITE + if($sht(a=>method::reinvite) > 0) { + sql_query("cb", "INSERT INTO stats_method (from_date, to_date, method, totag, total) VALUES($var(f_date), $var(t_date),'INVITE', 1, $sht(a=>method::reinvite)) ON DUPLICATE KEY UPDATE total=total+$sht(a=>method::reinvite)"); + $sht(a=>method::reinvite) = 0; + } + + #INVITE + if($sht(a=>method::invite) > 0) { + sql_query("cb", "INSERT INTO stats_method (from_date, to_date, method, total) VALUES($var(f_date), $var(t_date), 'INVITE', $sht(a=>method::invite)) ON DUPLICATE KEY UPDATE total=total+$sht(a=>method::invite)"); + $sht(a=>method::invite) = 0; + } + + #INVITE AUTH + if($sht(a=>method::invite::auth) > 0) { + sql_query("cb", "INSERT INTO stats_method (from_date, to_date, method, auth, total) VALUES($var(f_date), $var(t_date), 'INVITE', 1, $sht(a=>method::invite::auth)) ON DUPLICATE KEY UPDATE total=total+$sht(a=>method::invite::auth)"); + $sht(a=>method::invite::auth) = 0; + } + + #REGISTER + if($sht(a=>method::register) > 0) { + sql_query("cb", "INSERT INTO stats_method (from_date, to_date, method, total) VALUES($var(f_date), $var(t_date), 'REGISTER', $sht(a=>method::register)) ON DUPLICATE KEY UPDATE total=total+$sht(a=>method::register)"); + $sht(a=>method::register) = 0; + } + + #REGISTER AUTH + if($sht(a=>method::register::auth) > 0) { + sql_query("cb", "INSERT INTO stats_method (from_date, to_date, method, auth, total) VALUES($var(f_date), $var(t_date), 'REGISTER', 1, $sht(a=>method::register::auth)) ON DUPLICATE KEY UPDATE total=total+$sht(a=>method::register::auth)"); + $sht(a=>method::register::auth) = 0; + } + + #BYE + if($sht(a=>method::bye) > 0) { + sql_query("cb", "INSERT INTO stats_method (from_date, to_date, method, total) VALUES($var(f_date), $var(t_date), 'BYE', $sht(a=>method::bye)) ON DUPLICATE KEY UPDATE total=total+$sht(a=>method::bye)"); + $sht(a=>method::bye) = 0; + } + + #CANCEL + if($sht(a=>method::cancel) > 0) { + sql_query("cb", "INSERT INTO stats_method (from_date, to_date, method, total) VALUES($var(f_date), $var(t_date), 'CANCEL', $sht(a=>method::cancel)) ON DUPLICATE KEY UPDATE total=total+$sht(a=>method::cancel)"); + $sht(a=>method::cancel) = 0; + } + + #OPTIONS + if($sht(a=>method::options) > 0) { + sql_query("cb", "INSERT INTO stats_method (from_date, to_date, method, total) VALUES($var(f_date), $var(t_date), 'OPTIONS', $sht(a=>method::options)) ON DUPLICATE KEY UPDATE total=total+$sht(a=>method::options)"); + $sht(a=>method::options) = 0; + } + +#!ifdef WITH_STATISTIC_METHOD_EXTRA + #UNKNOWN + if($sht(a=>method::unknown) > 0) { + sql_query("cb", "INSERT INTO stats_method (from_date, to_date, method, total) VALUES($var(f_date), $var(t_date), 'UNKNOWN', $sht(a=>method::unknown)) ON DUPLICATE KEY UPDATE total=total+$sht(a=>method::unknown)"); + $sht(a=>method::unknown) = 0; + } + + #ACK + if($sht(a=>method::ack) > 0) { + sql_query("cb", "INSERT INTO stats_method (from_date, to_date, method, total) VALUES($var(f_date), $var(t_date), 'ACK', $sht(a=>method::ack)) ON DUPLICATE KEY UPDATE total=total+$sht(a=>method::ack)"); + $sht(a=>method::ack) = 0; + } +#!endif + + #REFER + if($sht(a=>method::refer) > 0) { + sql_query("cb", "INSERT INTO stats_method (from_date, to_date, method, total) VALUES($var(f_date), $var(t_date), 'REFER', $sht(a=>method::refer)) ON DUPLICATE KEY UPDATE total=total+$sht(a=>method::refer)"); + $sht(a=>method::refer) = 0; + } + + #UPDATE + if($sht(a=>method::update) > 0) { + sql_query("cb", "INSERT INTO stats_method (from_date, to_date, method, total) VALUES($var(f_date), $var(t_date), 'UPDATE', $sht(a=>method::update)) ON DUPLICATE KEY UPDATE total=total+$sht(a=>method::update)"); + $sht(a=>method::update) = 0; + } + + #RESPONSE + + #300 + if($sht(a=>response::300) > 0) { + sql_query("cb", "INSERT INTO stats_method (from_date, to_date, method, total) VALUES($var(f_date), $var(t_date), '300', $sht(a=>response::300)) ON DUPLICATE KEY UPDATE total=total+$sht(a=>response::300)"); + $sht(a=>response::300) = 0; + } + + #407 INVITE + if($sht(a=>response::407::invite) > 0) { + sql_query("cb", "INSERT INTO stats_method (from_date, to_date, method, cseq, total) VALUES($var(f_date), $var(t_date), '407', 'INVITE', $sht(a=>response::407::invite)) ON DUPLICATE KEY UPDATE total=total+$sht(a=>response::407::invite)"); + $sht(a=>response::407::invite) = 0; + } + + #401 INVITE + if($sht(a=>response::401::invite) > 0) { + sql_query("cb", "INSERT INTO stats_method (from_date, to_date, method, cseq, total) VALUES($var(f_date), $var(t_date), '401', 'INVITE', $sht(a=>response::401::invite)) ON DUPLICATE KEY UPDATE total=total+$sht(a=>response::401::invite)"); + $sht(a=>response::401::invite) = 0; + } + +#!ifdef WITH_STATISTIC_INVITE_1XX + #100 INVITE + if($sht(a=>response::100::invite) > 0) { + sql_query("cb", "INSERT INTO stats_method (from_date, to_date, method, cseq, total) VALUES($var(f_date), $var(t_date), '100', 'INVITE', $sht(a=>response::100::invite)) ON DUPLICATE KEY UPDATE total=total+$sht(a=>response::100::i + $sht(a=>response::100::invite) = 0; + } + + #180 INVITE + if($sht(a=>response::180::invite) > 0) { + sql_query("cb", "INSERT INTO stats_method (from_date, to_date, method, cseq, total) VALUES($var(f_date), $var(t_date), '180', 'INVITE', $sht(a=>response::180::invite)) ON DUPLICATE KEY UPDATE total=total+$sht(a=>response::180::i + $sht(a=>response::180::invite) = 0; + } + + #183 INVITE + if($sht(a=>response::183::invite) > 0) { + sql_query("cb", "INSERT INTO stats_method (from_date, to_date, method, cseq, total) VALUES($var(f_date), $var(t_date), '183', 'INVITE', $sht(a=>response::183::invite)) ON DUPLICATE KEY UPDATE total=total+$sht(a=>response::183::i + $sht(a=>response::183::invite) = 0; + } + +#!endif + + #200 INVITE + if($sht(a=>response::200::invite) > 0) { + sql_query("cb", "INSERT INTO stats_method (from_date, to_date, method, cseq, total) VALUES($var(f_date), $var(t_date), '200', 'INVITE', $sht(a=>response::200::invite)) ON DUPLICATE KEY UPDATE total=total+$sht(a=>response::200::invite)"); + $sht(a=>response::200::invite) = 0; + } + + #407 BYE + if($sht(a=>response::407::bye) > 0) { + sql_query("cb", "INSERT INTO stats_method (from_date, to_date, method, cseq, total) VALUES($var(f_date), $var(t_date), '407', 'BYE', $sht(a=>response::407::bye)) ON DUPLICATE KEY UPDATE total=total+$sht(a=>response::407::bye)"); + $sht(a=>response::407::bye) = 0; + } + + #401 BYE + if($sht(a=>response::401::bye) > 0) { + sql_query("cb", "INSERT INTO stats_method (from_date, to_date, method, cseq, total) VALUES($var(f_date), $var(t_date), '401', 'BYE', $sht(a=>response::401::bye)) ON DUPLICATE KEY UPDATE total=total+$sht(a=>response::401::bye)"); + $sht(a=>response::401::bye) = 0; + } + + #200 BYE + if($sht(a=>response::200::bye) > 0) { + sql_query("cb", "INSERT INTO stats_method (from_date, to_date, method, cseq, total) VALUES($var(f_date), $var(t_date), '200', 'BYE', $sht(a=>response::200::bye)) ON DUPLICATE KEY UPDATE total=total+$sht(a=>response::200::bye)"); + $sht(a=>response::200::bye) = 0; + } + + #ALL TRANSACTIONS MESSAGES + if($sht(a=>method::all) > 0) { + sql_query("cb", "INSERT INTO stats_method (from_date, to_date, method, total) VALUES($var(f_date), $var(t_date), 'ALL', $sht(a=>method::all)) ON DUPLICATE KEY UPDATE total=total+$sht(a=>method::all)"); + $sht(a=>method::all) = 0; + } + + #ALL MESSAGES ON INTERFACE + if($sht(a=>method::total) > 0) { + sql_query("cb", "INSERT INTO stats_method (from_date, to_date, method, total) VALUES($var(f_date), $var(t_date), 'TOTAL', $sht(a=>method::total)) ON DUPLICATE KEY UPDATE total=total+$sht(a=>method::total)"); + $sht(a=>method::total) = 0; + } + +#!ifdef WITH_HOMER_CUSTOM_STATS + #Generic stats + sht_iterator_start("i1", "d"); + while(sht_iterator_next("i1")) { + $var(key) = $(shtitkey(i1){s.select,2,:}); + sql_query("cb", "INSERT INTO stats_generic (from_date, to_date, type, total) VALUES($var(f_date), $var(t_date), '$var(key)', $shtitval(i1)) ON DUPLICATE KEY UPDATE total=(total+$shtitval(i1))/2"); + } + sht_iterator_end("i1"); + sht_rm_name_re("d=>.*"); +#!endif + +} + + +route[STORE] { + + if($rm == "REGISTER") { + $var(table) = "sip_capture_registration"; + } + else if($rm =~ "(INVITE|UPDATE|BYE|ACK|PRACK|REFER|CANCEL)$") + { + $var(table) = "sip_capture_call"; + } + else if($rm =~ "(NOTIFY)$" && is_present_hf("Event") && $hdr(Event)=~"refer;") + { + $var(table) = "sip_capture_call"; + } + else if($rm =~ "(INFO)$") + { + $var(table) = "sip_capture_call"; + } + else if($rm =~ "(OPTIONS)$" ) + { + $var(table) = "sip_capture_rest"; + } + else { + $var(table) = "sip_capture_rest"; + } + + +#!ifdef KAMAILIO_4_3 + #For old models. Not accurate insert time. System vs capture time. + #$var(utc) = $timef(%Y%m%d); + #as workaround for kamailio < 4.4 + sql_query("cb", "SELECT UTC_DATE()+0;", "ra"); + if($dbr(ra=>rows)>0) { + $var(utc) = $dbr(ra=>[0,0]); + } + sql_result_free("ra"); +#!else + #for Kamailio >=4.4 please uncomment this parameters: + # New utimef can fix the timediff issue. But unfortunately only kamailio 4.4 + $var(utc) = $utimef(%Y%m%d); + # or sipcapture style + #$var(utc) = "%Y%m%d"; +#!endif + + $var(a) = $var(table) + "_" + $var(utc); + sip_capture("$var(a)"); +} + +#!ifdef WITH_HOMER_CUSTOM_STATS +event_route[xhttp:request] { + set_reply_close(); + set_reply_no_connect(); + xlog("L_WARN", "HTTP request received on $Rp, $hu\n"); + if($hu =~ "/api/v1/stats/push") { + #Json is our body + $var(json) = $rb; + jansson_get("type", $var(json), "$var(n)"); + xlog("L_WARN","Type is $var(n)"); + if($var(n) == "rtp_stat") { + $var(i) = 0; + $(avp(x)[0]) = 'interval'; + $(avp(x)[1]) = 'streams'; + $(avp(x)[2]) = 'packets'; + $(avp(x)[3]) = 'lost'; + $(avp(x)[4]) = 'late'; + $(avp(x)[5]) = 'lost_perc'; + $(avp(x)[6]) = 'late_perc'; + $(avp(x)[7]) = 'out_of_seq'; + $(avp(x)[8]) = 'delay_min'; + $(avp(x)[9]) = 'delay_max'; + while(is_avp_set("$(avp(x)[$var(i)])")) { + xlog("L_INFO", "Array value [$var(i)]: $(avp(x)[$var(i)])\n"); + jansson_get("$(avp(x)[$var(i)])", $var(json), "$var(d)"); + $var(n) = $(var(d){s.int}); + if($sht(d=>generic::$(avp(x)[$var(i)])) == $null) $sht(d=>generic::$(avp(x)[$var(i)])) = $var(n); + else $sht(d=>generic::$(avp(x)[$var(i)])) = ($sht(d=>generic::$(avp(x)[$var(i)])) + $var(n))/2; + $var(i) = $var(i) + 1; + } + } + xhttp_reply("200", "Ok", "done", ""); + exit; + } + + xhttp_reply("403", "Forbidden", "", ""); + exit; +} +#!endif + +event_route[sipcapture:request] { + + #xlog("HEP Request!\n"); + #xlog("received sipcapture request from $si:$sp\r\n"); + #xlog("HEP VERSION $hep(version) request from $si:$sp\r\n"); + #xlog("HEP CHUNK Source IP $hep(0x002) request from $si:$sp\r\n"); + #xlog("HEP CHUNK Type: $hep(0x00b)\r\n"); + #Is it SIP ? + if($hep(0x00b) == 1){ + + #Do parsing internal + #$var(data) = $hep(0x00f); + #$var(family) = $hep(0x001); + ##$var(proto) = $hep(0x002); + #$var(proto) = 17; + #$var(srcip) = $hep(0x003); + #$var(dstip) = $hep(0x004); + #$var(srcport) = $hep(0x007); + #$var(dstport) = $hep(0x008); + ##$#var(timesec) = $hep(0x009); + ##$var(timeusec) = $hep(0x00a); + #$var(correlation_id) = $hep(0x011); + #$var(type) = $hep(0x00b); + #xlog("HEP CHUNK SIP PAYLOAD $var(data) request from $si:$sp: Time: $var(timesec), $var(timeusec), Proto: $var(proto), Family: $var(family), SRC:$var(srcip) $var(srcport), DST: $var(dstip) $var(dstport) \r\n"); + return 1; + } + #####################RTCP############################### + else if($hep(0x00b) == 5){ + + #If report lets proceed here with payload + #xlog("HEP RTCP CHUNK PAYLOAD $hep(0x00f) request from $si:$sp\r\n"); + #Do parsing internal + $var(utc) = $utimef(%Y%m%d); + $var(table) = "rtcp_capture_all_" + $var(utc); + #$var(table) = "rtcp_capture"; + + $var(json) = $hep(0x00f); + $var(family) = $hep(0x001); + $var(proto) = 17; + #$var(proto) = $hep(0x002); + $var(srcip) = $hep(0x003); + $var(dstip) = $hep(0x004); + $var(srcport) = $hep(0x007); + $var(dstport) = $hep(0x008); + $var(timesec) = $hep(0x009); + $var(timeusec) = $hep(0x00a); + $var(correlation_id) = $hep(0x011); + $var(type) = $hep(0x00b); + + $var(node) = "prototype"; + + #$var(millisec) = ""+$var(timesec)+$var(timeusec); + $var(t_date) = "FROM_UNIXTIME(" + $var(timesec) + ", '%Y-%m-%d %H:%i:%S')"; + + #xlog("HEP CHUNK RTCP JSON PAYLOAD $var(json) request from $si:$sp: $var(table),$var(family),$var(proto),$var(srcip),$var(dstip), $var(srcport), $var(dstport), $var(correlation_id)\r\n"); + + #if(!jansson_get("timestamp", $var(json), "$var(millisec)")) + #{ + # $var(millisec) = "MICROSECOND(NOW())"; + #} + #$var(millisec) = "(($var(timesec)*1000+$var(timeusec))*1000)"; + $var(millisec) = "(("+$var(timesec)+"*1000+"+$var(timeusec)+")*1000)"; + + #xlog("HEP RTCP JSON PAYLOAD [$var(json)]. Id: $var(correlation_id)\r\n"); + sql_query("wc", "INSERT INTO $var(table) (date, micro_ts, correlation_id, source_ip, source_port, destination_ip, destination_port, proto, family, type, node, msg) VALUES($var(t_date), $var(millisec), '$var(correlation_id)','$var(srcip)',$var(srcport),'$var(dstip)',$var(dstport),$var(proto),$var(family),$var(type),'$var(node)','$var(json)')"); + return 0; + } + else + { + $var(data) = $hep(0x00f); + #xlog("ANOTHER HEP CHUNK JSON PAYLOAD $var(data) request from $si:$sp:\r\n"); + xlog("ANOTHER HEP CHUNK TYPE: $hep(0x00b);\r\n"); + return 0; + } +} diff --git a/pkg/kamailio/obs/kamailio.spec b/pkg/kamailio/obs/kamailio.spec index b57c602e46a..5204f8501f2 100644 --- a/pkg/kamailio/obs/kamailio.spec +++ b/pkg/kamailio/obs/kamailio.spec @@ -655,6 +655,15 @@ SCTP transport for Kamailio. %endif +%package sipcapture-daemon-config +Summary: reference config for sipcapture daemon. +Group: System Environment/Daemons +Requires: kamailio-sipcapture = %ver + +%description sipcapture-daemon-config +reference config for sipcapture daemon. + + %package smsops Summary: Tools for handling SMS packets in SIP messages Group: System Environment/Daemons @@ -990,6 +999,8 @@ make install-modules-all skip_modules="app_mono db_cassandra db_oracle \ %endif kxml kxmpp kuuid" +make install-cfg-pkg + %if "%{?_unitdir}" == "" # On RedHat 6 like mkdir -p %{buildroot}%{_sysconfdir}/rc.d/init.d @@ -999,17 +1010,23 @@ install -m755 pkg/kamailio/%{dist_name}/%{dist_version}/kamailio.init \ # systemd install -d %{buildroot}%{_unitdir} install -Dpm 0644 pkg/kamailio/%{dist_name}/%{dist_version}/kamailio.service %{buildroot}%{_unitdir}/kamailio.service +install -Dpm 0644 pkg/kamailio/%{dist_name}/%{dist_version}/sipcapture.service %{buildroot}%{_unitdir}/sipcapture.service install -Dpm 0644 pkg/kamailio/%{dist_name}/%{dist_version}/kamailio.tmpfiles %{buildroot}%{_tmpfilesdir}/kamailio.conf +install -Dpm 0644 pkg/kamailio/%{dist_name}/%{dist_version}/sipcapture.tmpfiles %{buildroot}%{_tmpfilesdir}/sipcapture.conf %endif %if 0%{?suse_version} mkdir -p %{buildroot}/var/adm/fillup-templates/ install -m644 pkg/kamailio/%{dist_name}/%{dist_version}/kamailio.sysconfig \ %{buildroot}/var/adm/fillup-templates/sysconfig.kamailio +install -m644 pkg/kamailio/%{dist_name}/%{dist_version}/sipcapture.sysconfig \ + %{buildroot}/var/adm/fillup-templates/sysconfig.sipcapture %else mkdir -p %{buildroot}%{_sysconfdir}/sysconfig install -m644 pkg/kamailio/%{dist_name}/%{dist_version}/kamailio.sysconfig \ %{buildroot}%{_sysconfdir}/sysconfig/kamailio +install -m644 pkg/kamailio/%{dist_name}/%{dist_version}/sipcapture.sysconfig \ + %{buildroot}%{_sysconfdir}/sysconfig/sipcapture %endif %if 0%{?suse_version} @@ -1045,6 +1062,13 @@ chown kamailio:daemon %{_var}/run/kamailio 2> /dev/null %endif +%if "%{?_unitdir}" != "" +%post sipcapture-daemon-config +%tmpfiles_create sipcapture.conf +/usr/bin/systemctl -q enable sipcapture.service +%endif + + %preun if [ $1 = 0 ]; then %if "%{?_unitdir}" == "" @@ -1179,7 +1203,13 @@ fi %dir %attr(-,kamailio,kamailio) %{_sysconfdir}/kamailio -%config(noreplace) %{_sysconfdir}/kamailio/* +%config(noreplace) %{_sysconfdir}/kamailio/dictionary.kamailio +%config(noreplace) %{_sysconfdir}/kamailio/kamailio-advanced.cfg +%config(noreplace) %{_sysconfdir}/kamailio/kamailio-basic.cfg +%config(noreplace) %{_sysconfdir}/kamailio/kamailio.cfg +%config(noreplace) %{_sysconfdir}/kamailio/kamctlrc +%config(noreplace) %{_sysconfdir}/kamailio/pi_framework.xml +%config(noreplace) %{_sysconfdir}/kamailio/tls.cfg %if 0%{?suse_version} /var/adm/fillup-templates/sysconfig.kamailio %else @@ -1674,6 +1704,15 @@ fi %{_libdir}/kamailio/modules/rtjson.so +%files sipcapture-daemon-config +%defattr(-,root,root) +%config(noreplace) %{_sysconfdir}/kamailio/kamailio-sipcapture.cfg +%if "%{?_unitdir}" != "" +%{_unitdir}/sipcapture.service +%{_tmpfilesdir}/sipcapture.conf +%endif + + %if %{with sctp} %files sctp %defattr(-,root,root) diff --git a/pkg/kamailio/obs/sipcapture.service b/pkg/kamailio/obs/sipcapture.service new file mode 100644 index 00000000000..b6f18cb3ae3 --- /dev/null +++ b/pkg/kamailio/obs/sipcapture.service @@ -0,0 +1,26 @@ +[Unit] +Description=Kamailio SIP router server daemon for sipcapture +Wants=network-online.target +After=network-online.target +After=syslog.target +After=auditd.service +After=mysqld.service + +[Service] +Type=simple +WorkingDirectory=/run/sipcapture +Environment='CFGFILE=/etc/kamailio/kamailio-sipcapture.cfg' +Environment='SHM_MEMORY=32' +Environment='PKG_MEMORY=4' +EnvironmentFile=-/etc/sysconfig/sipcapture +# PIDFile requires a full absolute path +PIDFile=/run/sipcapture/sipcapture.pid +# ExecStart requires a full absolute path +ExecStart=/usr/sbin/kamailio -DD -P /run/sipcapture/sipcapture.pid -f $CFGFILE -m $SHM_MEMORY -M $PKG_MEMORY +Restart=on-failure +User=kamailio +Group=daemon + + +[Install] +WantedBy=multi-user.target diff --git a/pkg/kamailio/obs/sipcapture.sysconfig b/pkg/kamailio/obs/sipcapture.sysconfig new file mode 100644 index 00000000000..0e65a6a5645 --- /dev/null +++ b/pkg/kamailio/obs/sipcapture.sysconfig @@ -0,0 +1,12 @@ +# +# sipcapture startup options +# + +# Amount of shared memory to allocate for the running Kamailio server (in Mb) +#SHM_MEMORY=64 + +# Amount of per-process (package) memory to allocate for Kamailio (in Mb) +#PKG_MEMORY=4 + +# sipcapture config file +#CFGFILE=/etc/kamailio/kamailio-sipcapture.cfg diff --git a/pkg/kamailio/obs/sipcapture.tmpfiles b/pkg/kamailio/obs/sipcapture.tmpfiles new file mode 100644 index 00000000000..17567963a87 --- /dev/null +++ b/pkg/kamailio/obs/sipcapture.tmpfiles @@ -0,0 +1 @@ +D /run/sipcapture 0700 kamailio daemon - diff --git a/src/Makefile b/src/Makefile index c590e5c9f0e..dd68f0bf7c3 100644 --- a/src/Makefile +++ b/src/Makefile @@ -700,7 +700,7 @@ $(man_prefix)/$(man_dir)/man7: $(man_prefix)/$(man_dir)/man5: mkdir -p $(man_prefix)/$(man_dir)/man5 -# note: sed with POSIX.1 regex doesn't support |, + or ? (darwin, solaris ...) +# note: sed with POSIX.1 regex doesn't support |, + or ? (darwin, solaris ...) install-cfg: $(cfg_prefix)/$(cfg_dir) @if [ -f ../etc/$(CFG_NAME).cfg ]; then \ sed $(foreach m,$(modules_dirs),\ @@ -771,6 +771,22 @@ install-cfg: $(cfg_prefix)/$(cfg_dir) @$(INSTALL_CFG) ../etc/dictionary.$(CFG_NAME) $(cfg_prefix)/$(cfg_dir) @echo "config files installed" +install-cfg-pkg: $(cfg_prefix)/$(cfg_dir) + @if [ -f ../misc/examples/pkg/sipcapture.cfg ]; then \ + sed $(foreach m,$(modules_dirs),\ + -e "s#/usr/[^:]*lib/$(CFG_NAME)/$(m)\([:/\"]\)#$($(m)_target)\1#g") \ + -e "s#/usr/local/etc/$(CFG_NAME)/#$(cfg_target)#g" \ + < ../misc/examples/pkg/sipcapture.cfg \ + > $(cfg_prefix)/$(cfg_dir)$(MAIN_NAME)-sipcapture.cfg.sample; \ + chmod 644 $(cfg_prefix)/$(cfg_dir)$(MAIN_NAME)-sipcapture.cfg.sample; \ + if [ -z "${skip_cfg_install}" -a \ + ! -f $(cfg_prefix)/$(cfg_dir)$(MAIN_NAME)-sipcapture.cfg ]; \ + then \ + mv -f $(cfg_prefix)/$(cfg_dir)$(MAIN_NAME)-sipcapture.cfg.sample \ + $(cfg_prefix)/$(cfg_dir)$(MAIN_NAME)-sipcapture.cfg; \ + fi; \ + fi + install-bin: $(bin_prefix)/$(bin_dir) $(NAME) $(INSTALL_TOUCH) $(bin_prefix)/$(bin_dir)/$(NAME) $(INSTALL_BIN) $(NAME) $(bin_prefix)/$(bin_dir)