{"id":392,"date":"2011-03-21T12:22:56","date_gmt":"2011-03-21T11:22:56","guid":{"rendered":""},"modified":"2018-11-01T10:29:46","modified_gmt":"2018-11-01T09:29:46","slug":"configuring-cpl-service-support-kamailio-31-howto","status":"publish","type":"post","link":"https:\/\/nil.uniza.sk\/en\/configuring-cpl-service-support-kamailio-31-howto\/","title":{"rendered":"Configuring CPL service support in Kamailio 3.1 &#8211; Howto"},"content":{"rendered":"<p>This article continue on series of articles about the Kamailio 3.1.x SIP&nbsp;proxy deployed on debian lenny and its features. In previous articles we have:<\/p>\n<p>1) <a href=\"https:\/\/nil.uniza.sk\/en\/sip\/kamailio\/installing-kamailio-31-debian-lenny\/\">installed clear Kamailio 3.1.x server <\/a><\/p>\n<p>2) <a href=\"..\/..\/..\/..\/..\/..\/sip\/kamailio\/adding-mysql-support-kamailio-31-debian-lenny\">added Mysql support <\/a>for persistance location storage<\/p>\n<p>3) <a href=\"..\/..\/..\/..\/..\/..\/sip\/kamailio\/installing-siremis-20-kamailio-web-management-interface-debian-lenny-how\">SIREMIS web management interface for our kamailio server<\/a>.<\/p>\n<p>4) Configuring IM and presence service on Kamailio 3.1 &#8211; Howto<\/p>\n<p>5) Configuring XCAP support for SIMPLE.<\/p>\n<p>6) Configuring the TLS support<\/p>\n<p>7) Configuring NAT traversal using Kamailio 3.1 and the Rtpproxy server<\/p>\n<p>and now we are focusing on the CPL service API, for which the kamailio has support inside of its modules.<\/p>\n<h2>\n\t<strong>Prerequisities<\/strong><\/h2>\n<ol>\n<li>\n\t\tInstalled and working <a class=\"urlextern\" href=\"http:\/\/www.kamailio.org\/\" rel=\"nofollow\" title=\"http:\/\/www.kamailio.org\">Kamailio (OpenSER) 3.1.0<\/a>&nbsp;server with <a href=\"https:\/\/nil.uniza.sk\/en\/sip\/kamailio\/adding-mysql-support-kamailio-31-debian-lenny\/\">Mysql enabled<\/a>.<\/li>\n<li>\n\t\tAnd from the kamailio web, following modules have to be loaded before the cpl module loading<\/li>\n<\/ol>\n<ul>\n<li>\n<p><span class=\"emphasis\"><em>any DB module- a DB module for interfacing the DB operations (modules like mysql, postgres, dbtext, etc) <\/em><\/span><\/p>\n<\/li>\n<li>\n<p><span class=\"emphasis\"><em>TM (Transaction) module- used for proxying\/forking requests <\/em><\/span><\/p>\n<\/li>\n<li>\n<p><span class=\"emphasis\"><em>SL (StateLess) module &#8211; used for sending stateless reply when responding to REGISTER request or for sending back error responses <\/em><\/span><\/p>\n<\/li>\n<li>\n<p><span class=\"emphasis\"><em>USRLOC (User Location) module &#8211; used for implementing lookup(&quot;registration&quot;) tag (adding into location set of the users&#39; contact) <\/em><\/span><\/p>\n<\/li>\n<\/ul>\n<p>Following libraries or applications must be also installed before running Kamailio with CPL module loaded:<\/p>\n<ul>\n<li>\n\t\t<span class=\"emphasis\"><em>libxml2 <\/em><\/span><\/li>\n<li>\n\t\t<span class=\"emphasis\"><em>libxml2-devel. <\/em><\/span><\/li>\n<\/ul>\n<pre>\r\napt-get install libxml2 libxml2-dev\r\n<\/pre>\n<h2>\n\tPreparation<\/h2>\n<p>First, we have to install kamailio <a href=\"http:\/\/kamailio.org\/docs\/modules\/stable\/modules_k\/cpl-c.html\">cpl-c<\/a> module with<\/p>\n<pre>\r\napt-get install kamailio-cpl-modules\r\n<\/pre>\n<p>which implement the CPL&nbsp;interpreter.<\/p>\n<p>&nbsp;<\/p>\n<h2>\n\tConfiguration of the Kamailio to use the CPL<\/h2>\n<p>The configuration will be inserted into the kamailio.cfg, so open the config file<\/p>\n<h3>\n\tLoading required modules<\/h3>\n<p>Inside of cfg file find sections where modules are loaded (many line which starts with loadmodule), and at the end, behind<\/p>\n<pre>\r\nloadmodule &quot;db_mysql.so&quot;\r\nloadmodule &quot;tm.so&quot;\r\nloadmodule &quot;sl.so&quot;\r\nloadmodule &quot;usrloc.so&quot;\r\n<\/pre>\n<p>place line with CPL&nbsp;module loading:<\/p>\n<pre>\r\nloadmodule &quot;cpl-c.so&quot;\r\n<\/pre>\n<h3>\n\tSetting up CPL module parameters<\/h3>\n<p>Now we will setup module parameters required for CPL module.<\/p>\n<p>\n\t1. First, we have to tell to the module where (in which DB) the CPL&nbsp;scripts are loaded. Because we have enabled the mysql DB , and during its installation we have specified DBRUL&nbsp;parameter which may look like this for example:<\/p>\n<pre>\r\n#!define DBURL &quot;mysql:\/\/openser:openserrw@localhost\/kamailio&quot;\r\n<\/pre>\n<p>we may write into our cfg file:<\/p>\n<pre>\r\nmodparam(&quot;cpl-c&quot;,&quot;db_url&quot;,DBURL)<\/pre>\n<p>&nbsp;<\/p>\n<p>2. Now we specify the location of the DTD file which contain the CPL&nbsp;grammar.&nbsp; The file have to be placed on the server. The questions is where to find such file. I have downloaded the <a href=\"http:\/\/sourceforge.net\/projects\/cpled\/\">CPLed<\/a>, the CPL&nbsp;editor from sourceforge, which contain the CPL&nbsp;definition file. then I have extracted the cpl.dtd and upload to my \/etc\/kamailio folder.<\/p>\n<p>As the other possibilities I found, the dtd file is located inside of the cpl-c module of the kamailio src package.<\/p>\n<pre>\r\nmodparam(&quot;cpl-c&quot;,&quot;cpl_dtd_file&quot;,&quot;\/etc\/kamailio\/cpl.dtd&quot;)\r\n<\/pre>\n<p>3. As the last step we will configure logging for better diagnostic, folders to which we are pointing on have to exist<\/p>\n<pre>\r\n<i>modparam(&quot;cpl-c&quot;, &quot;log_dir&quot;, &quot;\/var\/log\/kamamilio\/cpl&quot;)<\/i><\/pre>\n<p><font face=\"Arial, Helvetica, sans-serif\">modparam(&quot;cpl-c&quot;,&quot;<strong>proxy_recurse<\/strong>&quot;,2)<\/font><\/p>\n<h2>\n\tModifying route logic for using of CPL<\/h2>\n<p>As a first step we have to modify the REGISTER method handling. We react on the situation where the CPL&nbsp;script may be uploaded by the end user using the REGISTER&nbsp;method, for this purpose there is defined function <em><strong>cpl_process_register()<\/strong><\/em>.<\/p>\n<p>From the cpl-c module doc about cpl_process_register():<\/p>\n<blockquote>\n<p><cite>This function MUST be called only for REGISTER requests. It checks if the current REGISTER request is related or not with CPL script upload\/download\/ remove. If it is, all the needed operation will be done. For checking if the REGISTER is CPL related, the function looks fist to &quot;Content-Type&quot; header. If it exists and has a the mime type set to &quot;application\/cpl+xml&quot; means this is a CPL script upload\/remove operation. The distinction between to case is made by looking at &quot;Content-Disposition&quot; header; id its value is &quot;script;action=store&quot;, means it&#39;s an upload; if it&#39;s &quot;script;action=remove&quot;, means it&#39;s a remove operation; other values are considered to be errors. If no &quot;Content-Type&quot; header is present, the function looks to &quot;Accept&quot; header and if it contains the &quot;*&quot; or &quot;application\/cpl-xml&quot; the request it will be consider one for downloading CPL scripts. The functions returns to script only if the REGISTER is not related to CPL. In other case, the function will send by itself the necessary replies (stateless &#8211; using sl), including for errors.<\/cite><\/p>\n<\/blockquote>\n<p>&nbsp;<\/p>\n<p>Therefore inside of your kamailio.cfg file find route logic route[REGISTRAR], which is reponsible for registration handling. For kamailio 3.1 should look, where we put line (in <span>yellow)<\/span><\/p>\n<pre>\r\nroute[REGISTRAR] {\r\n        if (is_method(&quot;REGISTER&quot;))\r\n        {\r\n                <span>cpl_process_register();<\/span>\r\n                if(isflagset(FLT_NATS))\r\n                {\r\n                        setbflag(FLB_NATB);\r\n                        # uncomment next line to do SIP NAT pinging\r\n                        setbflag(FLB_NATSIPPING);\r\n                }\r\n                if (!save(&quot;location&quot;))\r\n                        sl_reply_error();\r\n\r\n                exit;\r\n        }\r\n}<\/pre>\n<h3>\n\t&nbsp;Modifying INVITE message handling<\/h3>\n<p>&nbsp;<\/p>\n<p>Then we modify INVITE message handling to invoke CPL script for incomming calls. I&#39;ve putted the line into main routing block of the Kamailio 3.1. cfg file.<\/p>\n<pre>\r\n# account only INVITEs\r\n        if (is_method(&quot;INVITE&quot;))\r\n        {\r\n                setflag(FLT_ACC); # do accounting\r\n                # invoke a cpl script ....\r\n                <span>if(!cpl_run_script(&quot;incoming&quot;,&quot;is_statefull&quot;))<\/span>\r\n                {\r\n                        # script execution failed\r\n                        t_reply(&quot;500&quot;,&quot;CPL script execution failed&quot;);\r\n                 };\r\n        }&nbsp;<\/pre>\n<p>&nbsp;<\/p>\n<p>&nbsp;And as the last step, restart the kamailio service.<\/p>\n<h2>\n\tTesting<\/h2>\n<p>I have prepared simple script which will reject any SIP&nbsp;call, it look like:<\/p>\n<pre>\r\n&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;\r\n&lt;cpl xmlns=&quot;urn:ietf:params:xml:ns:cpl&quot; xmlns:xsi=&quot;http:\/\/www.w3.org\/2001\/XMLSchema-instance&quot; xsi:schemaLocation=&quot;urn:ietf:params:xml:ns:cpl cpl.xsd&quot; &gt;\r\n&nbsp; &lt;incoming &gt;\r\n&nbsp;&nbsp;&nbsp; &lt;reject reason=&quot;CPL script reject the call&quot; status=&quot;reject&quot; \/&gt;\r\n&nbsp; &lt;\/incoming&gt;\r\n&lt;\/cpl&gt;\r\n<\/pre>\n<p>The script was made with the help of the <a href=\"http:\/\/sourceforge.net\/projects\/cpled\/files\/\">CPLed editor<\/a>, version 0.4, which should be downloaded from <a href=\"http:\/\/sourceforge.net\/projects\/cpled\/files\/\">sourceforge.net<\/a>.<\/p>\n<p>The CPLed is the only one visual CPL&nbsp;editor which I&nbsp;know about, and it also source of some kind of problems.<\/p>\n<p>1) CPLed support two possibilities how to upload a cpl script on a server, HTTP&nbsp;and SIP. For HTTP upload I did not configure the kamailio server yet. For SIP&nbsp;it is using REGISTER message, but the editor does not support SIP&nbsp;authentication, and upload of the script fail where the proxy challenge the editor for authentication (unauthorized fail).<\/p>\n<p>The solution is upload it manually with FTP or ssh (winscp) and then import it. Here for the user palo@ps.sip.uniza.sk. Command have to contain precisely defined SIP&nbsp;uri with <strong>sip: <\/strong>prefix (sip:palo@ps.sip.uniza.sk)<\/p>\n<pre>\r\nkamctl fifo LOAD_CPL sip:palo@ps.sip.uniza.sk \/home\/palo\/cpl\/skusk1-cpl.xml<\/pre>\n<p>2) Second problem is probably IT&nbsp;based.<\/p>\n<p>Scripts made by the CPLed contain the line:<\/p>\n<pre>\r\n&lt;cpl xmlns=&quot;urn:ietf:params:xml:ns:cpl&quot; xmlns:xsi=&quot;http:\/\/www.w3.org\/2001\/XMLSchema-instance&quot; xsi:schemaLocation=&quot;urn:ietf:params:xml:ns:cpl cpl.xsd&quot; &gt;<\/pre>\n<p>and during the manual import there is an error:<\/p>\n<pre>\r\nkamctl fifo LOAD_CPL sip:palo@ps.sip.uniza.sk \/home\/palo\/cpl\/skusk1-cpl.xml\r\ndatabase engine &#39;MYSQL&#39; loaded\r\nControl engine &#39;FIFO&#39; loaded\r\nentering fifo_cmd LOAD_CPL sip:palo@ps.sip.uniza.sk \/home\/palo\/cpl\/skusk1-cpl.xml\r\n<u><em>5<span><strong>00 Bad CPL file Log:: Error: CPL script is not a valid XML document<\/strong><\/span><\/em><\/u>\r\nFIFO command was:\r\n:LOAD_CPL:openser_receiver_18437\r\nsip:palo@ps.sip.uniza.sk\r\n\/home\/palo\/cpl\/skusk1-cpl.xml<\/pre>\n<p>The solution discovered by our students (thanks to <a href=\"https:\/\/nil.uniza.sk\/en\/sip\/services\/cpl\/story-o-opensere-cpl\/\">andrej<\/a>) proposed to modify the line (delete it, for example manually), so the script will look:<\/p>\n<pre>\r\n&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;\r\n&lt;cpl&gt;\r\n&nbsp; &lt;incoming &gt;\r\n&nbsp;&nbsp;&nbsp; &lt;reject reason=&quot;CPL script reject the call&quot; status=&quot;reject&quot; \/&gt;\r\n&nbsp; &lt;\/incoming&gt;\r\n&lt;\/cpl&gt;<\/pre>\n<p>after this smooth modification the import was sucessfull:<\/p>\n<pre>\r\nkamctl fifo LOAD_CPL sip:palo@ps.sip.uniza.sk \/home\/palo\/cpl\/skusk1-cpl.xml\r\ndatabase engine &#39;MYSQL&#39; loaded\r\nControl engine &#39;FIFO&#39; loaded\r\nentering fifo_cmd LOAD_CPL sip:palo@ps.sip.uniza.sk \/home\/palo\/cpl\/skusk1-cpl.xml\r\nFIFO command was:\r\n:LOAD_CPL:openser_receiver_18549\r\nsip:palo@ps.sip.uniza.sk\r\n\/home\/palo\/cpl\/skusk1-cpl.xml\r\n <\/pre>\n<p>&nbsp;as the control I will get the script for user palo@ back by using GET_CPL:<\/p>\n<pre>\r\npstest:\/etc\/kamailio# <span>kamctl fifo GET_CPL sip:palo@ps.sip.uniza.sk<\/span>\r\ndatabase engine &#39;MYSQL&#39; loaded\r\nControl engine &#39;FIFO&#39; loaded\r\nentering fifo_cmd GET_CPL sip:palo@ps.sip.uniza.sk\r\n<strong>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; &lt;cpl&gt; &lt;incoming &gt; &nbsp;&nbsp;&nbsp;  &lt;reject reason=&quot;<span>CPL script reject the call<\/span>&quot; status=&quot;reject&quot; \/&gt; &nbsp;  &lt;\/incoming&gt; &lt;\/cpl&gt;<\/strong>\r\nFIFO command was:\r\n:GET_CPL:openser_receiver_18571\r\nsip:palo@ps.sip.uniza.sk<\/pre>\n<p>&nbsp;so, it have to be there.<\/p>\n<p>Initiating the call on user palo@ps.sip.uniza.sk return message<\/p>\n<pre>\r\nCPL script reject the call<\/pre>\n<p>which declare that the script work!<\/p>\n<p>&nbsp;<\/p>\n<h3>\n\tRemove CPL&nbsp;script<\/h3>\n<p>The script is removed by:<\/p>\n<pre>\r\n<span>kamctl fifo REMOVE_CPL sip:palo@ps.sip.uniza.sk<\/span>\r\ndatabase engine &#39;MYSQL&#39; loaded\r\nControl engine &#39;FIFO&#39; loaded\r\nentering fifo_cmd REMOVE_CPL sip:palo@ps.sip.uniza.sk\r\nFIFO command was:\r\n:REMOVE_CPL:openser_receiver_19102\r\nsip:palo@ps.sip.uniza.sk\r\n\r\n<\/pre>\n<h3>\n\tCall flow<\/h3>\n<p>|Time&nbsp;&nbsp;&nbsp;&nbsp; | 192.168.1.102&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br \/>\n\t|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | 158.193.139.51&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br \/>\n\t|0,004&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INVITE SDP ( BV32 g711U g711A g729 telephone-e&#8230;t)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |SIP From: sip:pepe@ps.sip.uniza.sk To:sip:palo@ps.sip.uniza.sk<br \/>\n\t|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |(20018)&nbsp; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&gt;&nbsp; (5060)&nbsp;&nbsp; |<br \/>\n\t|0,061&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 407 Proxy Authentication Required&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |SIP Status<br \/>\n\t|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |(20018)&nbsp; &lt;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&nbsp; (5060)&nbsp;&nbsp; |<br \/>\n\t|0,170&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ACK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |SIP Request<br \/>\n\t|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |(20018)&nbsp; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&gt;&nbsp; (5060)&nbsp;&nbsp; |<br \/>\n\t|0,170&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INVITE SDP ( BV32 g711U g711A g729 telephone-e&#8230;t)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |SIP From: sip:pepe@ps.sip.uniza.sk To:sip:palo@ps.sip.uniza.sk<br \/>\n\t|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |(20018)&nbsp; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&gt;&nbsp; (5060)&nbsp;&nbsp; |<br \/>\n\t|0,236&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>603 CPL script reject the cal<\/span>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |SIP Status<br \/>\n\t|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |(20018)&nbsp; &lt;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&nbsp; (5060)&nbsp;&nbsp; |<br \/>\n\t|0,337&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ACK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |SIP Request<br \/>\n\t|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |(20018)&nbsp; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&gt;&nbsp; (5060)&nbsp;&nbsp; |<\/p>\n<p>\t&nbsp;<\/p>","protected":false},"excerpt":{"rendered":"<p>This article continue on series of articles about the Kamailio 3.1.x SIP&nbsp;proxy deployed on debian lenny and its features. In previous articles we have:<\/p>\n<p>1) <a href=\"https:\/\/nil-test.kis.fri.uniza.sk\/sip\/kamailio\/installing-kamailio-31-debian-lenny\">installed clear Kamailio 3.1.x server <\/a><\/p>\n<p>2) <a href=\"..\/..\/..\/..\/..\/..\/sip\/kamailio\/adding-mysql-support-kamailio-31-debian-lenny\">added Mysql support <\/a>for persistance location storage<\/p>","protected":false},"author":7,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_seopress_robots_primary_cat":"","_seopress_titles_title":"","_seopress_titles_desc":"","_seopress_robots_index":"","_kad_blocks_custom_css":"","_kad_blocks_head_custom_js":"","_kad_blocks_body_custom_js":"","_kad_blocks_footer_custom_js":"","_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"footnotes":""},"categories":[797,781],"tags":[],"class_list":["post-392","post","type-post","status-publish","format-standard","hentry","category-cpl-en","category-kamailio-en"],"taxonomy_info":{"category":[{"value":797,"label":"CPL"},{"value":781,"label":"Kamailio"}]},"featured_image_src_large":false,"author_info":{"display_name":"admin","author_link":"https:\/\/nil.uniza.sk\/en\/author\/admin\/"},"comment_info":3,"category_info":[{"term_id":797,"name":"CPL","slug":"cpl-en","term_group":0,"term_taxonomy_id":795,"taxonomy":"category","description":"","parent":795,"count":3,"filter":"raw","cat_ID":797,"category_count":3,"category_description":"","cat_name":"CPL","category_nicename":"cpl-en","category_parent":795},{"term_id":781,"name":"Kamailio","slug":"kamailio-en","term_group":0,"term_taxonomy_id":779,"taxonomy":"category","description":"","parent":771,"count":29,"filter":"raw","cat_ID":781,"category_count":29,"category_description":"","cat_name":"Kamailio","category_nicename":"kamailio-en","category_parent":771}],"tag_info":false,"_links":{"self":[{"href":"https:\/\/nil.uniza.sk\/en\/wp-json\/wp\/v2\/posts\/392","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nil.uniza.sk\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nil.uniza.sk\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nil.uniza.sk\/en\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/nil.uniza.sk\/en\/wp-json\/wp\/v2\/comments?post=392"}],"version-history":[{"count":0,"href":"https:\/\/nil.uniza.sk\/en\/wp-json\/wp\/v2\/posts\/392\/revisions"}],"wp:attachment":[{"href":"https:\/\/nil.uniza.sk\/en\/wp-json\/wp\/v2\/media?parent=392"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nil.uniza.sk\/en\/wp-json\/wp\/v2\/categories?post=392"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nil.uniza.sk\/en\/wp-json\/wp\/v2\/tags?post=392"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}