rpcd (OpenWrt ubus RPC backend server)

The code is published under ISC and can be found via git at git://git.openwrt.org/project/rpcd.git or via http at http://git.openwrt.org/?p=project/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:

$ 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

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

$ ubus list -v
...
'foo' @686f0592
	"bar":{"arg1":"Boolean","arg2":"Integer","arg3":"String"}
	"toto":{}
...
$ ubus call -S foo bar '{"arg1": true }'
{{"hello":"world"}}
$ ubus -S call foo toto
{["item1","item2","item3"]}

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. Ie, If you're testing the script itself, you need to use echo '{"arg1": 42}' | yourscript call yourmethod. You cannot simply use yourscript call yourmethod '{"arg1": 42}' as you might have expected.

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. (NOTE: At least on CC builds, reload is not enough, and you must restart to pickup new plugins and changes to existing plugins)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值