OpenWrt - rpcd

rpcd (OpenWrt ubus RPC backend server)//Openwrt ubus RPC后端服务

The code is published under ISC and can be found via git at

plugin executables //可执行插件

It is possible to expose shell script functionality over ubus by using rpcd plugin executables functionality. Executables stored in /usr/libexec/rpcd/ directory will be runned by rpcd. Lets look at the following example:


$ cat << EOF > /usr/libexec/rpcd/foo

case "$1" in
        echo '{ "bar": { "arg1": true, "arg2": 32, "arg3": "str" }, "toto": { } }'
        case "$2" in
                # read the arguments
                read input;

                # optionally log the call
                logger -t "foo" "call" "$2" "$input"

                # return json object or an array
                echo '{ "hello": "world" }'
                # return json object or an array
                echo '[ "item1", "item2", "item3" ]'
$ chmod +x /usr/libexec/rpcd/foo

This will create new ubus functions which then can be used (after restarting rpcd):


$ ubus list -v
'foo' @686f0592
$ ubus call -S foo bar '{"arg1": true }'
$ ubus call -S foo toto

On startup rpcd will call all executables in /usr/libexec/rpcd/ with argv[1] set to “list”. For a plugin, which responds with a valid list of methods and signatures, ubus method with appropriate arguments will be created. When a method provided by the plugin is about to be invoked, rpcd calls the binary with argv[1] set to “call” and argv[2] set to the invoked method name. The actual data is then sent by the ubus client via stdin.


The method signature is a simple object containing key:value pairs. The argument type is inferred from the value. If the value is a string (regardless of the contents) it is registered as string, if the value is a bool true or false, its registered as bool, if the value is an integer, it is registered as either int8, int16, int32 or int64 depending on the value (“foo”: 16 will be INT16, “foo”: 64 will be INT64, “foo”: 8 will be INT8 and everything else will be INT32).

方法标签是一个简单的对象,包含键:value pairs。参数类型由值推测。如果值是一个字符串(不理会内容),它的寄存器作为字符串,如果值是一个bool true/false,它的寄存器是bool,如果值是一个integer,它的寄存器既可以是int8,int16,int32,也可以是int64,依赖值(“foo”:16是INT16,“foo”:64是INT64,“foo”:8是INT8其它的是INT32)。

It is enough to issue ‘/etc/init.d/rpcd reload’ to make it pick up new plugin executables, that way one does not lose active sessions.

执行/etc/init.d/rpcd reload可以开始执行新的可执行插件,这个方法不会丢掉激活的部分。