Featured image of post kamailio exec和evrexec模块介绍

kamailio exec和evrexec模块介绍

背景介绍

execevrexec模块比较简单,所以就放在一章介绍。

  • exec 模块:用于执行外部命令。
  • evrexec 模块:用于执行event_route事件,比如:进程启动,收到RPC命令或者从udp端口收到数据。

官方文档地址:

  1. exec
  2. evrexec

本次测试的kamailio版本是:

version: kamailio 5.8.5 (x86_64/linux)

exec模块

参数解析

1
2
3
4
5
# 是否打开执行脚本来设置环境变量,默认:1
modparam("exec", "setvars", 1)

# 设置最长的执行时间,单位s,默认:0,如果超过这个时间,就会被杀死
modparam("exec", "time_to_kill", 20)

重要函数

exec_dset(command)

执行外部命令,并返回执行结果。当前的URI作为参数传递,返回的是设置后的URI.

只能用在: REQUEST_ROUTE, FAILURE_ROUTE

exec_msg(command)

执行外部命令,整个message作为参数传递,没有其他命令行参数添加.

只能用在: REQUEST_ROUTE, FAILURE_ROUTE

exec_avp(command [, avplist])

执行外部命令,每个输出结果存储在avplist中.

只能用在: REQUEST_ROUTE, FAILURE_ROUTE

exec_cmd(command)

执行外部命令,轻量版本,不传递SIP消息做参数,也不设置环境变量,也不使用输出的命令.

可以用在: ANY ROUTE

实战

  1. 配置文件:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
loadmodule "exec.so"
modparam("exec","setvars", 1)
modparam("exec", "time_to_kill",20)

...
request_route {
    ...
    $var(text) = exec_dset("echo TEST > /tmp/test.txt");
    xlog("L_INFO", "---$si---$fU--$var(text)--\n");
    exec_msg("echo test222 > /tmp/$(fU).txt");
    exec_cmd("echo abc > /tmp/abc.txt");
    ...
}
  1. 输出结果:

    syslog日志:

    1
    2
    
     3(1728) ERROR: |25-05-19 11:40:08|a2615f4bd775445386f2123bc458b299| exec [exec.c:190]: exec_str(): no uri from echo TEST > /tmp/test.txt 'sip:172.16.4.111:5460'
     3(1728) INFO: |25-05-19 11:40:08|a2615f4bd775445386f2123bc458b299| <script>: ---172.16.80.13---1004---1--
    

    tmp下的文件:

    1
    2
    3
    4
    5
    6
    
    [root@localhost tmp]# cat abc.txt 
    abc
    [root@localhost tmp]# cat 1004.txt 
    test222
    [root@localhost tmp]# cat test.txt 
    TEST sip:172.16.4.111:5460
    

    可以看到,exec_cmdexec_msg都成功了,exec_dset有错误日志,但是脚本执行成功了。

evrexec模块

参数解析

1
2
3
4
5
name: event_route执行名字
wait: 等待时间,单位ms,默认:1000
workers: 执行线程数,默认:1
sockaddr: udp socket addr
modparam("evrexec", "exec", "name=evrexec:timer;wait=1000;workers=1;")

实战

  1. 配置文件:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
loadmodule "evrexec.so"
modparam("evrexec", "exec", "name=evrexec:timer;wait=1000;workers=1;")
modparam("evrexec", "exec", "name=evrexec:udp;sockaddr=udp:127.0.0.1:4444;workers=1;")
...

event_route[evrexec:timer] {
  $var(x) = 0;
  xlog("L_INFO", "evrexectimer run...\n");
}

event_route[evrexec:udp] {
  xinfo("udp socket data: [$evr(data)] from [$evr(srcip)]\n");
}
  1. 输出结果:

    syslog日志:

    1
    2
    3
    
    37(2902) INFO: jsonrpcs [jsonrpcs_sock.c:471]: jsonrpc_dgram_process(): a new child 0/2902
    39(2904) INFO: ctl [io_listener.c:215]: io_listen_loop(): using epoll_lt io watch method (config)
    45(2910) INFO: <script>: evrexectimer run....
    

    evrexec:timer: 还是比较有用的,可以执行服务启动时就运行脚本的功能。 evrexec:udp: 可以监听udp端口,但是不能是listen的端口,要使用未监听的端口。

evrexec的参数有:

  • $evr(data): udp端口收到的数据
  • $evr(srcip): udp源ip
  • $evr(srcport): udp源端口的字符串值
  • $evr(srcportno): udp源端口整形值
本博客已稳定运行
发表了37篇文章 · 总计67.06k字
本站总访问量 次 · 您是本站第 位访问者
粤ICP备2025368587号-1| 使用 Hugo 构建
主题 StackJimmy 设计