Hello Daniel, Sorry, I was out of the office and could make a test only now. As you told, the HTTP request is now processed differently. Unfortunately, I can no longer start call recording. I tried the following options and got the "rtpp_function_call(): can't get From tag" error message each time.
1. /usr/bin/curl -H "Content-Type: text" " http://localhost:8088/CALL_RECORD_START/249ae6300da4b1393be203e21068f6a2@127.0.0.1:5080.0 " 2. /usr/bin/curl -H "Content-Type: text" " http://localhost:8088/CALL_RECORD_START/249ae6300da4b1393be203e21068f6a2@127.0.0.1:5080.0" -H "From: <sip:123@127.0.0.1:5080>;tag=1" 3. /usr/bin/curl -H "Content-Type: text" " http://localhost:8088/CALL_RECORD_START/249ae6300da4b1393be203e21068f6a2@127.0.0.1:5080.0" -H "Call-Id: 249ae6300da4b1393be203e21068f6a2@127.0.0.1:5080.0" -H "To: sip:456@127.0.0.1:5060" -H "From: <sip:123@127.0.0.1:5080>;tag=1" *May 5 14:40:43 test /usr/sbin/kamailio[19603]: DEBUG: <core> [core/parser/parse_fline.c:250]: parse_first_line(): first line type 1 (request) flags 2* *May 5 14:40:43 test /usr/sbin/kamailio[19603]: DEBUG: <core> [core/parser/msg_parser.c:677]: parse_msg(): SIP Request:* *May 5 14:40:43 test /usr/sbin/kamailio[19603]: DEBUG: <core> [core/parser/msg_parser.c:679]: parse_msg(): method: <GET>* *May 5 14:40:43 test /usr/sbin/kamailio[19603]: DEBUG: <core> [core/parser/msg_parser.c:681]: parse_msg(): uri: </CALL_RECORD_START/249ae6300da4b1393be203e21068f6a2@127.0.0.1:5080.0>* *May 5 14:40:43 test /usr/sbin/kamailio[19603]: DEBUG: <core> [core/parser/msg_parser.c:683]: parse_msg(): version: <HTTP/1.1>* *May 5 14:40:43 test /usr/sbin/kamailio[19603]: DEBUG: <core> [core/parser/parse_hname2.c:294]: parse_sip_header_name(): parsed header name [Via] type 1* *May 5 14:40:43 test /usr/sbin/kamailio[19603]: DEBUG: <core> [core/parser/parse_via.c:2639]: parse_via(): end of header reached, state=5* *May 5 14:40:43 test /usr/sbin/kamailio[19603]: DEBUG: <core> [core/parser/msg_parser.c:555]: parse_headers(): Via found, flags=2* *May 5 14:40:43 test /usr/sbin/kamailio[19603]: DEBUG: <core> [core/parser/msg_parser.c:557]: parse_headers(): this is the first via* *May 5 14:40:43 test /usr/sbin/kamailio[19603]: DEBUG: <script>: == TRACE. xhttp:request* *May 5 14:40:43 test /usr/sbin/kamailio[19603]: DEBUG: <script>: == TRACE. xhttp:request. HTTP Request Received* *May 5 14:40:43 test /usr/sbin/kamailio[19603]: DEBUG: <script>: == TRACE. xhttp:request. hu is: /CALL_RECORD_START/249ae6300da4b1393be203e21068f6a2@127.0.0.1:5080.0* *May 5 14:40:43 test /usr/sbin/kamailio[19603]: DEBUG: <script>: call-id=249ae6300da4b1393be203e21068f6a2@127.0.0.1:5080.0 1111111111* *May 5 14:40:43 test /usr/sbin/kamailio[19603]: ERROR: rtpengine [rtpengine.c:2547]: rtpp_function_call(): can't get From tag* *May 5 14:40:43 test /usr/sbin/kamailio[19603]: DEBUG: xhttp [xhttp_mod.c:420]: xhttp_send_reply(): sending out response: 200 OK* *May 5 14:40:43 test /usr/sbin/kamailio[19603]: DEBUG: <core> [core/parser/parse_hname2.c:294]: parse_sip_header_name(): parsed header name [Host] type 0* *May 5 14:40:43 test /usr/sbin/kamailio[19603]: DEBUG: <core> [core/parser/parse_hname2.c:294]: parse_sip_header_name(): parsed header name [User-Agent] type 28* *May 5 14:40:43 test /usr/sbin/kamailio[19603]: DEBUG: <core> [core/parser/parse_hname2.c:294]: parse_sip_header_name(): parsed header name [Accept] type 23* *May 5 14:40:43 test /usr/sbin/kamailio[19603]: DEBUG: <core> [core/parser/parse_hname2.c:294]: parse_sip_header_name(): parsed header name [Content-Type] type 11* *May 5 14:40:43 test /usr/sbin/kamailio[19603]: DEBUG: <core> [core/parser/msg_parser.c:91]: get_hdr_field(): found end of header* *May 5 14:40:43 test /usr/sbin/kamailio[19603]: DEBUG: <core> [core/msg_translator.c:162]: check_via_address(): (127.0.0.1, 127.0.0.1, 0)* *May 5 14:40:43 test /usr/sbin/kamailio[19603]: DEBUG: <core> [core/tcp_main.c:1590]: _tcpconn_find(): found connection by id: 5* *May 5 14:40:43 test /usr/sbin/kamailio[19603]: DEBUG: <core> [core/tcp_main.c:2472]: tcpconn_send_put(): send from reader (19603 (27)), reusing fd* *May 5 14:40:43 test /usr/sbin/kamailio[19603]: DEBUG: <core> [core/tcp_main.c:2706]: tcpconn_do_send(): sending...* *May 5 14:40:43 test /usr/sbin/kamailio[19603]: DEBUG: <core> [core/tcp_main.c:2739]: tcpconn_do_send(): after real write: c= 0x7f4ba719cd70 n=118 fd=10* *May 5 14:40:43 test /usr/sbin/kamailio[19603]: DEBUG: <core> [core/tcp_main.c:2740]: tcpconn_do_send(): buf=* Thank you! пт, 30 квіт. 2021 о 17:53 Daniel-Constantin Mierla <mico...@gmail.com> пише: > I pushed a commit to master branch that should make it work to use the > function for non-SIP message processing, by giving call-id=... and > from-tag=... via flags parameter -- these two attributes seemed to be used > by expecting to be set, even if the rtpengine application may ignore one of > them. > > If you have a chance to test, let me know the result. > > Cheers, > Daniel > On 29.04.21 16:38, Daniel-Constantin Mierla wrote: > > I looked in the code and indeed it first takes the values from headers for > Call-Id, To (tag), From (tag), failing if the headers are not found, but > then it updates the values from the flags parameter. So the call-id can be > anything in the headers if you provide it as "call-id=xyz" parameter. > > Maybe the code should be reworked a bit to parse first the flags > parameters and if values are not found for the sip attributes, then try to > get them from headers. > > Cheers, > Daniel > On 29.04.21 15:39, Володимир Іванець wrote: > > I run Kamailio with debug=3 and Rtpengine with LOG_LEVEL=6. > > Rtpengine logs offers, answers and deletes but there is nothing when I > trigger *start_recording* with HTTP request. Below is the full Kamailio > log for the request. It looks to be failing right on the *start_recording* > function and I don't see any other issues except empty Call-Id here: > "receive_msg(): --- received sip message - request - call-id: [] - cseq: > []". > > I tried to add Call-Id header to my HTTP request and found out that now > rtpengine module will complain about missing To header. With tries and > errors, I specified all required headers and Rtpengine started call > recording: > > */usr/bin/curl -H "Content-Type: text" > "http://localhost:8088/CALL_RECORD_START/38687ab466a031d20d852706710d2b4f@127.0.0.1:5080.1 > <http://localhost:8088/CALL_RECORD_START/38687ab466a031d20d852706710d2b4f@127.0.0.1:5080.1>" > -H "Call-Id: 38687ab466a031d20d852706710d2b4f@127.0.0.1:5080.1 > <38687ab466a031d20d852706710d2b4f@127.0.0.1:5080.1>" -H "To: > sip:200-test@127.0.0.1:5060 <http://sip:200-test@127.0.0.1:5060>" -H "From: > <sip:2564286000@127.0.0.1:5080 > <http://sip:2564286000@127.0.0.1:5080>>;tag=as7a92114c"* > > > It also looks like rtpengine module does not care about actual header > values. Function *start_recording* called with Call-Id value is enough to > start call recording even if all headers contain random invalid values: > > * /usr/bin/curl -H "Content-Type: text" > "http://localhost:8088/CALL_RECORD_START/6559572e21e08e0a41503ba5779c6604@127.0.0.1:5080.0 > <http://localhost:8088/CALL_RECORD_START/6559572e21e08e0a41503ba5779c6604@127.0.0.1:5080.0>" > -H "Call-Id: does_mot_matter" -H "To: sip:456@127.0.0.1:5060 > <http://sip:456@127.0.0.1:5060>" -H "From: <sip:123@127.0.0.1:5080 > <http://sip:123@127.0.0.1:5080>>;tag=1"* > > > *Thank you very much for your help!* > > > > *Apr 29 16:01:47 test /usr/sbin/kamailio[24120]: DEBUG: <core> > [core/ip_addr.c:229]: print_ip(): tcpconn_new: new tcp connection: > 127.0.0.1* > *Apr 29 16:01:47 test /usr/sbin/kamailio[24120]: DEBUG: <core> > [core/tcp_main.c:1175]: tcpconn_new(): on port 42782, type 2, socket 64* > *Apr 29 16:01:47 test /usr/sbin/kamailio[24120]: DEBUG: <core> > [core/tcp_main.c:1498]: tcpconn_add(): hashes: 1710:1616:2551, 1* > *Apr 29 16:01:47 test /usr/sbin/kamailio[24120]: DEBUG: <core> > [core/io_wait.h:375]: io_watch_add(): DBG: io_watch_add(0xae63a0, 64, 2, > 0x7f943ba04ac0), fd_no=50* > *Apr 29 16:01:47 test /usr/sbin/kamailio[24120]: DEBUG: <core> > [core/io_wait.h:600]: io_watch_del(): DBG: io_watch_del (0xae63a0, 64, -1, > 0x0) fd_no=51 called* > *Apr 29 16:01:47 test /usr/sbin/kamailio[24120]: DEBUG: <core> > [core/tcp_main.c:4457]: handle_tcpconn_ev(): sending to child, events 1* > *Apr 29 16:01:47 test /usr/sbin/kamailio[24120]: DEBUG: <core> > [core/tcp_main.c:4130]: send2child(): selected tcp worker idx:0 proc:35 > pid:24116 for activity on [tcp:127.0.0.1:8088 <http://127.0.0.1:8088>], > 0x7f943ba04ac0* > *Apr 29 16:01:47 test /usr/sbin/kamailio[24116]: DEBUG: <core> > [core/tcp_read.c:1749]: handle_io(): received n=8 con=0x7f943ba04ac0, fd=13* > *Apr 29 16:01:47 test /usr/sbin/kamailio[24116]: DEBUG: <core> > [core/parser/msg_parser.c:610]: parse_msg(): SIP Request:* > *Apr 29 16:01:47 test /usr/sbin/kamailio[24116]: DEBUG: <core> > [core/parser/msg_parser.c:612]: parse_msg(): method: <GET>* > *Apr 29 16:01:47 test /usr/sbin/kamailio[24116]: DEBUG: <core> > [core/parser/msg_parser.c:614]: parse_msg(): uri: > </CALL_RECORD_START/7a444c165953cf0a196e10e50d0b611e@127.0.0.1:5080.0> > </CALL_RECORD_START/7a444c165953cf0a196e10e50d0b611e@127.0.0.1:5080.0>* > *Apr 29 16:01:47 test /usr/sbin/kamailio[24116]: DEBUG: <core> > [core/parser/msg_parser.c:616]: parse_msg(): version: <HTTP/1.1>* > *Apr 29 16:01:47 test /usr/sbin/kamailio[24116]: DEBUG: <core> > [core/parser/msg_parser.c:89]: get_hdr_field(): found end of header* > *Apr 29 16:01:47 test /usr/sbin/kamailio[24116]: DEBUG: <core> > [core/receive.c:324]: receive_msg(): --- received sip message - request - > call-id: [] - cseq: []* > *Apr 29 16:01:47 test /usr/sbin/kamailio[24116]: DEBUG: xhttp > [xhttp_mod.c:382]: xhttp_handler(): new fake msg created (286 bytes):* > *Apr 29 16:01:47 test /usr/sbin/kamailio[24116]: DEBUG: <core> > [core/parser/msg_parser.c:610]: parse_msg(): SIP Request:* > *Apr 29 16:01:47 test /usr/sbin/kamailio[24116]: DEBUG: <core> > [core/parser/msg_parser.c:612]: parse_msg(): method: <GET>* > *Apr 29 16:01:47 test /usr/sbin/kamailio[24116]: DEBUG: <core> > [core/parser/msg_parser.c:614]: parse_msg(): uri: > </CALL_RECORD_START/7a444c165953cf0a196e10e50d0b611e@127.0.0.1:5080.0> > </CALL_RECORD_START/7a444c165953cf0a196e10e50d0b611e@127.0.0.1:5080.0>* > *Apr 29 16:01:47 test /usr/sbin/kamailio[24116]: DEBUG: <core> > [core/parser/msg_parser.c:616]: parse_msg(): version: <HTTP/1.1>* > *Apr 29 16:01:47 test /usr/sbin/kamailio[24116]: DEBUG: <core> > [core/parser/parse_via.c:2639]: parse_via(): end of header reached, state=5* > *Apr 29 16:01:47 test /usr/sbin/kamailio[24116]: DEBUG: <core> > [core/parser/msg_parser.c:498]: parse_headers(): Via found, flags=2* > *Apr 29 16:01:47 test /usr/sbin/kamailio[24116]: DEBUG: <core> > [core/parser/msg_parser.c:500]: parse_headers(): this is the first via* > *Apr 29 16:01:47 test /usr/sbin/kamailio[24116]: DEBUG: <script>: == > TRACE. xhttp:request* > *Apr 29 16:01:47 test /usr/sbin/kamailio[24116]: DEBUG: <script>: == > TRACE. xhttp:request. HTTP Request Received* > *Apr 29 16:01:47 test /usr/sbin/kamailio[24116]: DEBUG: <script>: == > TRACE. xhttp:request. hu is: > /CALL_RECORD_START/7a444c165953cf0a196e10e50d0b611e@127.0.0.1:5080.0* > *Apr 29 16:01:47 test /usr/sbin/kamailio[24116]: DEBUG: <script>: > call-id=7a444c165953cf0a196e10e50d0b611e@127.0.0.1:5080.0 > <call-id=7a444c165953cf0a196e10e50d0b611e@127.0.0.1:5080.0>* > *Apr 29 16:01:47 test /usr/sbin/kamailio[24116]: DEBUG: <core> > [core/parser/msg_parser.c:89]: get_hdr_field(): found end of header* > *Apr 29 16:01:47 test /usr/sbin/kamailio[24116]: ERROR: rtpengine > [rtpengine_funcs.c:294]: get_callid(): call-id not found* > *Apr 29 16:01:47 test /usr/sbin/kamailio[24116]: ERROR: rtpengine > [rtpengine.c:2383]: rtpp_function_call(): can't get Call-Id field* > *Apr 29 16:01:47 test /usr/sbin/kamailio[24116]: DEBUG: xhttp > [xhttp_mod.c:441]: xhttp_send_reply(): sending out response: 200 OK* > *Apr 29 16:01:47 test /usr/sbin/kamailio[24116]: DEBUG: <core> > [core/msg_translator.c:161]: check_via_address(): (127.0.0.1, 127.0.0.1, 0)* > *Apr 29 16:01:47 test /usr/sbin/kamailio[24116]: DEBUG: <core> > [core/tcp_main.c:1590]: _tcpconn_find(): found connection by id: 1* > *Apr 29 16:01:47 test /usr/sbin/kamailio[24116]: DEBUG: <core> > [core/tcp_main.c:2472]: tcpconn_send_put(): send from reader (24116 (35)), > reusing fd* > *Apr 29 16:01:47 test /usr/sbin/kamailio[24116]: DEBUG: <core> > [core/tcp_main.c:2706]: tcpconn_do_send(): sending...* > *Apr 29 16:01:47 test /usr/sbin/kamailio[24116]: DEBUG: <core> > [core/tcp_main.c:2739]: tcpconn_do_send(): after real write: c= > 0x7f943ba04ac0 n=113 fd=13* > *Apr 29 16:01:47 test /usr/sbin/kamailio[24116]: DEBUG: <core> > [core/tcp_main.c:2740]: tcpconn_do_send(): buf=* > *Apr 29 16:01:47 test /usr/sbin/kamailio[24116]: DEBUG: <core> > [core/usr_avp.c:636]: destroy_avp_list(): destroying list (nil)* > *Apr 29 16:01:47 test /usr/sbin/kamailio[24116]: DEBUG: <core> > [core/usr_avp.c:636]: destroy_avp_list(): destroying list (nil)* > *Apr 29 16:01:47 test /usr/sbin/kamailio[24116]: DEBUG: <core> > [core/usr_avp.c:636]: destroy_avp_list(): destroying list (nil)* > *Apr 29 16:01:47 test /usr/sbin/kamailio[24116]: DEBUG: <core> > [core/usr_avp.c:636]: destroy_avp_list(): destroying list (nil)* > *Apr 29 16:01:47 test /usr/sbin/kamailio[24116]: DEBUG: <core> > [core/usr_avp.c:636]: destroy_avp_list(): destroying list (nil)* > *Apr 29 16:01:47 test /usr/sbin/kamailio[24116]: DEBUG: <core> > [core/usr_avp.c:636]: destroy_avp_list(): destroying list (nil)* > *Apr 29 16:01:47 test /usr/sbin/kamailio[24116]: DEBUG: <core> > [core/xavp.c:539]: xavp_destroy_list(): destroying xavp list (nil)* > *Apr 29 16:01:47 test /usr/sbin/kamailio[24116]: DEBUG: <core> > [core/xavp.c:539]: xavp_destroy_list(): destroying xavp list (nil)* > *Apr 29 16:01:47 test /usr/sbin/kamailio[24116]: DEBUG: <core> > [core/xavp.c:539]: xavp_destroy_list(): destroying xavp list (nil)* > *Apr 29 16:01:47 test /usr/sbin/kamailio[24116]: DEBUG: <core> > [core/receive.c:528]: receive_msg(): cleaning up* > *Apr 29 16:01:47 test /usr/sbin/kamailio[24116]: DEBUG: <core> > [core/io_wait.h:375]: io_watch_add(): DBG: io_watch_add(0xb2a640, 13, 2, > 0x7f943ba04ac0), fd_no=1* > *Apr 29 16:01:47 test /usr/sbin/kamailio[24120]: DEBUG: <core> > [core/tcp_main.c:3793]: handle_ser_child(): read response= 7f943ba04ac0, > -1, fd -1 from 35 (24116)* > *Apr 29 16:01:47 test /usr/sbin/kamailio[24116]: DEBUG: <core> > [core/io_wait.h:600]: io_watch_del(): DBG: io_watch_del (0xb2a640, 13, -1, > 0x10) fd_no=2 called* > *Apr 29 16:01:47 test /usr/sbin/kamailio[24116]: DEBUG: <core> > [core/tcp_read.c:1890]: handle_io(): removing from list 0x7f943ba04ac0 id 1 > fd 13, state -1, flags 4028, main fd -1, refcnt 1 ([127.0.0.1]:42782 -> > [127.0.0.1]:8088)* > *Apr 29 16:01:47 test /usr/sbin/kamailio[24116]: DEBUG: <core> > [core/tcp_read.c:1671]: release_tcpconn(): releasing con 0x7f943ba04ac0, > state -2, fd=13, id=1 ([127.0.0.1]:42782 -> [127.0.0.1]:8088)* > *Apr 29 16:01:47 test /usr/sbin/kamailio[24116]: DEBUG: <core> > [core/tcp_read.c:1672]: release_tcpconn(): extra_data (nil)* > *Apr 29 16:01:47 test /usr/sbin/kamailio[24120]: DEBUG: <core> > [core/tcp_main.c:3560]: handle_tcp_child(): reader response= 7f943ba04ac0, > -2 from 0* > > > чт, 29 квіт. 2021 о 13:17 Daniel-Constantin Mierla <mico...@gmail.com> > пише: > >> Ohhh, blindly missed the assignment before. You should run both kamailio >> and rtpengine with higher debug level and see if you get any hints from the >> log messages. >> >> Cheers, >> Daniel >> On 29.04.21 11:51, Володимир Іванець wrote: >> >> Hello Daniel, >> >> That is correct. My *$var(call_id)* variable contains concatenation of >> the "call-id=" string and a Call-Id value. >> >> *Apr 27 18:25:00 test /usr/sbin/kamailio[5347]: DEBUG: <script>: >> call-id=3de74068278ede4417086eb82bdf5a06@127.0.0.1:5080.0 >> <call-id=3de74068278ede4417086eb82bdf5a06@127.0.0.1:5080.0>* >> >> >> Thank you! >> >> чт, 29 квіт. 2021 о 09:58 Daniel-Constantin Mierla <mico...@gmail.com> >> пише: >> >>> Hello, >>> >>> related to the initial config snippet example, the call-id is expected >>> to be provide as a named flag, like: >>> >>> start_recording("call-id=$var(call_id)"); >>> >>> See the readme of the rtpengine module for more details. >>> >>> Cheers, >>> Daniel >>> On 29.04.21 08:23, Володимир Іванець wrote: >>> >>> Hello Richard, >>> >>> Thank you very much for the suggestion! I will give it a try. >>> >>> ср, 28 квіт. 2021, 20:00 користувач Richard Fuchs <rfu...@sipwise.com> >>> пише: >>> >>>> On 28/04/2021 10.53, [ EXT ] Володимир Іванець wrote: >>>> >>>> Hello! >>>> >>>> I'm testing call recording with Rtpengine. It works fine when the >>>> "record-call=on" flag is added to the *rtpengine_offer* or >>>> *start_recording* is used in the *request_route*. >>>> >>>> But I was wondering if the call recording can be managed by a separate >>>> application. So I add the following lines to the >>>> *event_route[xhttp:request]* and triggered it with an HTTP request >>>> after the call was established. The call-id value was taken from the >>>> Rtpengine log and sent with the request. >>>> >>>> * if ($hu =~ "^/CALL_RECORD_START/") {* >>>> * $var(call_id) = *"call-id=" + *$(hu{s.select,2,/});* >>>> xlog("L_DBG", "$var(call_id)"); >>>> * start_recording($var(call_id));* >>>> exit; >>>> * }* >>>> >>>> If you have to reason to go through Kamailio for this, you can simply >>>> trigger the command from any other external application. There's a sample >>>> script included in the repo that can be used for this purpose directly >>>> (making use of the Perl module that is also included): >>>> https://github.com/sipwise/rtpengine/blob/master/utils/rtpengine-ng-client >>>> >>>> There's also a nodejs client that I'm aware of: >>>> https://github.com/davehorton/rtpengine-client >>>> >>>> Or you can hand-roll the request and talk to rtpengine via HTTP or >>>> Websocket for example. >>>> >>>> Cheers >>>> __________________________________________________________ >>>> Kamailio - Users Mailing List - Non Commercial Discussions >>>> * sr-users@lists.kamailio.org >>>> Important: keep the mailing list in the recipients, do not reply only >>>> to the sender! >>>> Edit mailing list options or unsubscribe: >>>> * https://lists.kamailio.org/cgi-bin/mailman/listinfo/sr-users >>>> >>> >>> __________________________________________________________ >>> Kamailio - Users Mailing List - Non Commercial Discussions >>> * sr-users@lists.kamailio.org >>> Important: keep the mailing list in the recipients, do not reply only to >>> the sender! >>> Edit mailing list options or unsubscribe: >>> * https://lists.kamailio.org/cgi-bin/mailman/listinfo/sr-users >>> >>> -- >>> Daniel-Constantin Mierla -- www.asipto.comwww.twitter.com/miconda -- >>> www.linkedin.com/in/miconda >>> Kamailio Advanced Training - Online >>> May 17-20, 2021 (Europe Timezone) - June 7-10, 2021 (America Timezone) >>> * https://www.asipto.com/sw/kamailio-advanced-training-online/ >>> >>> -- >> Daniel-Constantin Mierla -- www.asipto.comwww.twitter.com/miconda -- >> www.linkedin.com/in/miconda >> Kamailio Advanced Training - Online >> May 17-20, 2021 (Europe Timezone) - June 7-10, 2021 (America Timezone) >> * https://www.asipto.com/sw/kamailio-advanced-training-online/ >> >> -- > Daniel-Constantin Mierla -- www.asipto.comwww.twitter.com/miconda -- > www.linkedin.com/in/miconda > Kamailio Advanced Training - Online > May 17-20, 2021 (Europe Timezone) - June 7-10, 2021 (America Timezone) > * https://www.asipto.com/sw/kamailio-advanced-training-online/ > > -- > Daniel-Constantin Mierla -- www.asipto.comwww.twitter.com/miconda -- > www.linkedin.com/in/miconda > Kamailio Advanced Training - Online > May 17-20, 2021 (Europe Timezone) - June 7-10, 2021 (America Timezone) > * https://www.asipto.com/sw/kamailio-advanced-training-online/ > >
__________________________________________________________ Kamailio - Users Mailing List - Non Commercial Discussions * sr-users@lists.kamailio.org Important: keep the mailing list in the recipients, do not reply only to the sender! Edit mailing list options or unsubscribe: * https://lists.kamailio.org/cgi-bin/mailman/listinfo/sr-users