User Tools

Site Tools


doc:techref:rpcd

rpcd (OpenWrt ubus RPC backend server)

The code is published under ISC and can be found via git at git:nbd.name/luci2/rpcd.git or via http at http://nbd.name/gitweb.cgi?p=luci2/rpcd.git;a=summary. It's included in OpenWrt since r37877. ===== 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: <code> $ cat « EOF > /usr/libexec/rpcd/foo #!/bin/sh case "$1" in list) echo '{ "bar": { "arg1": true, "arg2": 32, "arg3": "str" }, "toto": { } }' ;; call) case "$2" in bar) # read the arguments read input; # optionally log the call logger -t "foo" "call" "$2" "$input" # return json object or an array echo '{ "hello": "world" }' ;; toto) # return json object or an array echo '[ "item1", "item2", "item3" ]' ;; esac ;; esac EOF $ chmod +x /usr/libexec/rpcd/foo </code> This will create new ubus functions which then can be used: <code> $ ubus list -v … 'foo' @686f0592 "bar":{"arg1":"Boolean","arg2":"Integer","arg3":"String"} "toto":{} … $ ubus call -S foo bar '{"arg1": true }' world $ ubus call -S foo toto {["item1","item2","item3"]} </code> 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). 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.

doc/techref/rpcd.txt · Last modified: 2014/06/04 10:33 by luka12345