This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
devel:config-engines [2016/04/15 11:34] miconda |
devel:config-engines [2016/04/19 15:32] miconda [Configuration File Engines] |
||
---|---|---|---|
Line 5: | Line 5: | ||
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: | 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: | ||
- | * Lua, implemented by app_lua module, as " | + | * Lua - implemented by app_lua module, as "lua" config engine |
+ | * Python - implemented by app_python module, as " | ||
Setting a configuration engine can be done with the global setting: | Setting a configuration engine can be done with the global setting: | ||
Line 239: | Line 240: | ||
end | end | ||
+ | </ | ||
+ | |||
+ | ===== 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 **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, | ||
+ | * **ksr_reply_route(self, | ||
+ | * **ksr_onsend_route(self, | ||
+ | * 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/ | ||
+ | |||
+ | The following objects are available inside the Python script: | ||
+ | |||
+ | * **Router** - provided by the old way of exporting functions to Python (https:// | ||
+ | * **KSR** - provided via KEMI interface (not many functions exported at this moment, but expected to take over all **Python** 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:// | ||
+ | # | ||
+ | ####### Global Parameters ######### | ||
+ | |||
+ | debug=4 | ||
+ | log_stderror=yes | ||
+ | fork=yes | ||
+ | children=2 | ||
+ | |||
+ | memdbg=5 | ||
+ | memlog=5 | ||
+ | |||
+ | auto_aliases=no | ||
+ | |||
+ | listen=udp: | ||
+ | |||
+ | mpath=" | ||
+ | |||
+ | loadmodule " | ||
+ | loadmodule " | ||
+ | loadmodule " | ||
+ | loadmodule " | ||
+ | loadmodule " | ||
+ | loadmodule " | ||
+ | loadmodule " | ||
+ | loadmodule " | ||
+ | loadmodule " | ||
+ | loadmodule " | ||
+ | loadmodule " | ||
+ | loadmodule " | ||
+ | loadmodule " | ||
+ | |||
+ | # ----------------- setting module-specific parameters --------------- | ||
+ | |||
+ | # ----- mi_fifo params ----- | ||
+ | modparam(" | ||
+ | |||
+ | |||
+ | # ----- tm params ----- | ||
+ | # auto-discard branches from previous serial forking leg | ||
+ | modparam(" | ||
+ | # default retransmission timeout: 30sec | ||
+ | modparam(" | ||
+ | # default invite retransmission timeout after 1xx: 120sec | ||
+ | modparam(" | ||
+ | |||
+ | # ----- debugger params ----- | ||
+ | modparam(" | ||
+ | |||
+ | ####### Routing Logic ######## | ||
+ | |||
+ | modparam(" | ||
+ | |||
+ | cfgengine " | ||
+ | </ | ||
+ | |||
+ | The **/ | ||
+ | |||
+ | <code python> | ||
+ | import sys | ||
+ | import Router.Logger as Logger | ||
+ | import KSR as KSR | ||
+ | |||
+ | def dumpObj(obj): | ||
+ | for attr in dir(obj): | ||
+ | # KSR.info(" | ||
+ | Logger.LM_INFO(" | ||
+ | |||
+ | def mod_init(): | ||
+ | KSR.info(" | ||
+ | # dumpObj(KSR); | ||
+ | return kamailio(); | ||
+ | |||
+ | class kamailio: | ||
+ | def __init__(self): | ||
+ | KSR.info(' | ||
+ | |||
+ | def child_init(self, | ||
+ | KSR.info(' | ||
+ | return 0 | ||
+ | |||
+ | def ksr_request_route(self, | ||
+ | KSR.info(" | ||
+ | msg.rewrite_ruri(" | ||
+ | KSR.tm.t_on_branch(" | ||
+ | KSR.tm.t_on_reply(" | ||
+ | KSR.tm.t_on_failure(" | ||
+ | KSR.sl.send_reply(100, | ||
+ | if KSR.tm.t_relay() < 0 : | ||
+ | KSR.sl.send_reply(500, | ||
+ | return 1; | ||
+ | |||
+ | def ksr_reply_route(self, | ||
+ | KSR.info(" | ||
+ | return 1; | ||
+ | |||
+ | def ksr_branch_route_one(self, | ||
+ | KSR.info(" | ||
+ | return 1; | ||
+ | |||
+ | def ksr_onreply_route_one(self, | ||
+ | KSR.info(" | ||
+ | return 1; | ||
+ | |||
+ | def ksr_failure_route_one(self, | ||
+ | KSR.info(" | ||
+ | return 1; | ||
</ | </ | ||