User Tools

Site Tools


devel:config-engines

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Next revision Both sides next revision
devel:config-engines [2016/04/14 21:59]
miconda [Lua Embedded Config Example]
devel:config-engines [2016/04/19 15:42]
miconda [Python Config KEMI Engine]
Line 1: Line 1:
 ====== Configuration File Engines ====== ====== Configuration File Engines ======
  
-Kamailio implements from scratch the interpreter for its configuration file (kamailio.cfg).+Kamailio implements from scratch the interpreter for its configuration file scripting language(used inside kamailio.cfg).
  
-Starting with v5.0.0, the routing blocks can be written in some of its embedded languages interpreter. Known to work:+Starting with v5.0.0, the routing blocks can be written in some other (well known) scripting languages and run via their embedded interpreters inside Kamailio. Known to work:
  
-  * Luaimplemented by app_lua module, as "lua" config engine+  * Lua implemented by app_lua module, as "lua" config engine 
 +  * Python - implemented by app_python module, as "python" config engine
  
 Setting a configuration engine can be done with the global setting: Setting a configuration engine can be done with the global setting:
Line 25: Line 26:
 </code> </code>
  
-The aim is that the runtime active part of kamailio.cfg (the routing blocks) to be implemented in an embedded scripting language. +The aim is that the runtime active part of kamailio.cfg (the routing blocks) to be implemented in an embedded scripting language. Core parameters, loading modules and modules parameters will still be set via kamailio.cfg. 
-  + 
-Internally, the support for implementing routing logic in an embedded language is codenamed **kemi** - Kamailio EMbedded Interface.+Among benefits of using different scripting languages: 
 + 
 +  * ability to benefit from what a well established language already provides: 
 +    * more people are expected to be familiar with 
 +    * an extended set of data types, expressions and statements already available 
 +    * a large set of extensions and libraries already available 
 +  * reload the SIP routing logic without restarting Kamailio 
 + 
 +Internally, the support for implementing routing logic in an embedded language is codenamed **KEMI** - Kamailio EMbedded Interface.
  
 ===== Exporting Functions To KEMI ===== ===== Exporting Functions To KEMI =====
Line 91: Line 100:
   * 1 param - can be int of str*   * 1 param - can be int of str*
   * 2 params - any combination of int or str*   * 2 params - any combination of int or str*
-  * 3 params - (to be added soon) any combination of int or str*+  * 3 params - any combination of int or str*
   * 4 params - all have to be str* (other combinations to be added as needed)   * 4 params - all have to be str* (other combinations to be added as needed)
   * 5 params - all have to be str* (other combinations to be added as needed)   * 5 params - all have to be str* (other combinations to be added as needed)
Line 105: Line 114:
   * **ksr_request_route()** - is executed by Kamailio core every time a SIP request is received. If this function is not defined, then Kamailio will write error messages. This is equivalent of request_route {} from kamailio.cfg.   * **ksr_request_route()** - is executed by Kamailio core every time a SIP request is received. If this function is not defined, then Kamailio will write error messages. This is equivalent of request_route {} from kamailio.cfg.
   * **ksr_reply_route()** - is executed by Kamailio core every time a SIP Response (reply) is received. If this function is not defined, then Kamailio will not write error messages. This is equivalent of reply_route {} from kamailio.cfg.   * **ksr_reply_route()** - is executed by Kamailio core every time a SIP Response (reply) is received. If this function is not defined, then Kamailio will not write error messages. This is equivalent of reply_route {} from kamailio.cfg.
-  * TBD: the options for branch_route, failure_route, onreply_route, onsend_route and event_route. Meanwhile, should work using hybrid configuration with request_route/reply_route in embedded interpreter and the other routing blocks in native kamailio.cfg.+  * **ksr_onsend_route()** - is executed by Kamailio core every time a SIP request (and optionally for a response) is sent out. If this function is not defined, then Kamailio will not write error messages. This is equivalent of onsend_route {} from kamailio.cfg. 
 +  * branch route callback - the name of the Lua function to be executed instead of a branch route has to be provided as parameter to KSR.tm.t_on_branch(...) 
 +  * onreply route callback - the name of the Lua function to be executed instead of an onreply route has to be provided as parameter to KSR.tm.t_on_reply(...) 
 +  * failure route callback - the name of the Lua function to be executed instead of a failure route has to be provided as parameter to KSR.tm.t_on_failure(...) 
 +  * branch failure route callback - the name of the Lua function to be executed instead of an event route for branch failure has to be provided as parameter to KSR.tm.t_on_branch_failure(...) 
 +  * TBD: the options for specific event_route blocks. Meanwhile, should work using hybrid configuration with request_route/reply_route/... in embedded interpreter and the other routing blocks in native kamailio.cfg.
  
 The following objects are available inside the Lua script: The following objects are available inside the Lua script:
Line 111: Line 125:
   * **sr** - provided by the old way of exporting functions to Lua (https://www.kamailio.org/wiki/embeddedapi/devel/lua)   * **sr** - provided by the old way of exporting functions to Lua (https://www.kamailio.org/wiki/embeddedapi/devel/lua)
   * **KSR** - provided via KEMI interface (not many functions exported at this moment, but expected to take over all **sr** module). The functions exported to KEMI are accessible as KSR.submodule.function(...). If submodule name is empty (reserved for core functions), then they are available as KSR.function(...).   * **KSR** - provided via KEMI interface (not many functions exported at this moment, but expected to take over all **sr** module). The functions exported to KEMI are accessible as KSR.submodule.function(...). If submodule name is empty (reserved for core functions), then they are available as KSR.function(...).
- 
 ==== Lua Embedded Config Example ==== ==== Lua Embedded Config Example ====
  
Line 227: Line 240:
 end end
  
 +</code>
 +
 +===== Python Config KEMI Engine =====
 +
 +The **app_python** module must be loaded and the Python script with routing logic must be set to its **script_name** parameter.
 +
 +The **kemi** engine is built reusing the exiting **app_python** way of executing C code from Kamailio. In the Python script you have to declare the global **mod_init()** method where to instantiate an object of a class that implements the other callback methods (functions) to be executed by Kamailio.
 +
 +Inside the new class, the following methods are relevant:
 +
 +  * **ksr_request_route(self, msg)** - is executed by Kamailio core every time a SIP request is received. If this function is not defined, then Kamailio will write error messages. This is equivalent of request_route {} from kamailio.cfg.
 +  * **ksr_reply_route(self, msg)** - is executed by Kamailio core every time a SIP Response (reply) is received. If this function is not defined, then Kamailio will not write error messages. This is equivalent of reply_route {} from kamailio.cfg.
 +  * **ksr_onsend_route(self, msg)** - is executed by Kamailio core every time a SIP request (and optionally for a response) is sent out. If this function is not defined, then Kamailio will not write error messages. This is equivalent of onsend_route {} from kamailio.cfg.
 +  * branch route callback - the name of the Python function to be executed instead of a branch route has to be provided as parameter to KSR.tm.t_on_branch(...)
 +  * onreply route callback - the name of the Python function to be executed instead of an onreply route has to be provided as parameter to KSR.tm.t_on_reply(...)
 +  * failure route callback - the name of the Python function to be executed instead of a failure route has to be provided as parameter to KSR.tm.t_on_failure(...)
 +  * branch failure route callback - the name of the Python function to be executed instead of an event route for branch failure has to be provided as parameter to KSR.tm.t_on_branch_failure(...)
 +  * TBD: the options for specific event_route blocks. Meanwhile, should work using hybrid configuration with request_route/reply_route/... in embedded interpreter and the other routing blocks in native kamailio.cfg.
 +
 +The following objects are available inside the Python script:
 +
 +  * **Router** - provided by the old way of exporting functions to Python (https://www.kamailio.org/wiki/embeddedapi/devel/python)
 +  * **KSR** - provided via KEMI interface (not many functions exported at this moment, but expected to take over all **Router** module). The functions exported to KEMI are accessible as KSR.submodule.function(...). If submodule name is empty (reserved for core functions), then they are available as KSR.function(...).
 +
 +
 +==== Python Embedded Config Example ====
 +
 +The kamailio.cfg with the global/core and modules settings:
 +
 +<code c>
 +#!KAMAILIO
 +#
 +# Kamailio (OpenSER) SIP Server v5.0
 +#     - web: http://www.kamailio.org
 +#
 +####### Global Parameters #########
 +
 +debug=4
 +log_stderror=yes
 +fork=yes
 +children=2
 +
 +memdbg=5
 +memlog=5
 +
 +auto_aliases=no
 +
 +listen=udp:127.0.0.1:5060
 +
 +mpath="modules"
 +
 +loadmodule "mi_fifo.so"
 +loadmodule "kex.so"
 +loadmodule "tm.so"
 +loadmodule "tmx.so"
 +loadmodule "sl.so"
 +loadmodule "pv.so"
 +loadmodule "maxfwd.so"
 +loadmodule "textops.so"
 +loadmodule "xlog.so"
 +loadmodule "ctl.so"
 +loadmodule "mi_rpc.so"
 +loadmodule "debugger.so"
 +loadmodule "app_python.so"
 +
 +# ----------------- setting module-specific parameters ---------------
 +
 +# ----- mi_fifo params -----
 +modparam("mi_fifo", "fifo_name", "/tmp/kamailio_fifo")
 +
 +
 +# ----- tm params -----
 +# auto-discard branches from previous serial forking leg
 +modparam("tm", "failure_reply_mode", 3)
 +# default retransmission timeout: 30sec
 +modparam("tm", "fr_timer", 30000)
 +# default invite retransmission timeout after 1xx: 120sec
 +modparam("tm", "fr_inv_timer", 120000)
 +
 +# ----- debugger params -----
 +modparam("debugger", "cfgtrace", 1)
 +
 +####### Routing Logic ########
 +
 +modparam("app_python", "script_name", "/etc/kamailio/kamailio.py")
 +
 +cfgengine "python"
 +</code>
 +
 +The **/etc/kamailio/kamailio.py** with the routing logic for runtime:
 +
 +<code python>
 +import sys
 +import Router.Logger as Logger
 +import KSR as KSR
 +
 +def dumpObj(obj):
 +    for attr in dir(obj):
 +        # KSR.info("obj.%s = %s\n" % (attr, getattr(obj, attr)));
 +        Logger.LM_INFO("obj.%s = %s\n" % (attr, getattr(obj, attr)));
 +
 +def mod_init():
 +    KSR.info("===== from Python mod init\n");
 +    # dumpObj(KSR);
 +    return kamailio();
 +
 +class kamailio:
 +    def __init__(self):
 +        KSR.info('===== kamailio.__init__\n')
 +
 +    def child_init(self, rank):
 +        KSR.info('===== kamailio.child_init(%d)\n' % rank)
 +        return 0
 +
 +    def ksr_request_route(self, msg):
 +        KSR.info("===== request - from kamailio python script\n");
 +        msg.rewrite_ruri("sip:alice@127.0.0.1:5080");
 +        KSR.tm.t_on_branch("ksr_branch_route_one");
 +        KSR.tm.t_on_reply("ksr_onreply_route_one");
 +        KSR.tm.t_on_failure("ksr_failure_route_one");
 +        KSR.sl.send_reply(100, "Trying")
 +        if KSR.tm.t_relay() < 0 :
 +            KSR.sl.send_reply(500, "Server error")
 +        return 1;
 +
 +    def ksr_reply_route(self, msg):
 +        KSR.info("===== response - from kamailio python script\n");
 +        return 1;
 +
 +    def ksr_branch_route_one(self, msg):
 +        KSR.info("===== branch route - from kamailio python script\n");
 +        return 1;
 +
 +    def ksr_onreply_route_one(self, msg):
 +        KSR.info("===== onreply route - from kamailio python script\n");
 +        return 1;
 +
 +    def ksr_failure_route_one(self, msg):
 +        KSR.info("===== failure route - from kamailio python script\n");
 +        return 1;
 </code> </code>
  
devel/config-engines.txt · Last modified: 2017/11/20 14:31 by miconda