解决LEDE固件的设备追踪

更换了LEDE路由器之后,Home Assistant的Device Tracker也需要更换,但是按照文档更换了配置之后,仍然一直找不到设备。查看日志,提示:

1
luci-mod-rpc: net.arptable - Method not found

用Postman测试了一下luci-mod-rpc这个模块,可以正常认证,模块的安装没有问题。于是开始查看Home Assistant的Openwrt包,#包位置在@/deps/lib/python3.7/site-packages/openwrt_lici_rpc

源码

这个包的原理是通过json-rpc请求路由信息,访问net.arptable这个接口来获取设备信息:

1
2
rpc_sys_arp_call = Constants.\
LUCI_RPC_SYS_PATH.format(self.host_api_url), 'net.arptable'

然而,作者还写了一个方法来判断Openwrt的版本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def _determine_if_legacy_version(self):
# get VERSION_ID from os-release if exists or get
# DISTRIB_RELEASE from openwrt_release
shell_command = "if [ -f \"/etc/os-release\" ]; \
then awk -F= '$1==\"VERSION_ID\" \
{ print $2 ;}' \
/etc/os-release; \
else awk -F= '$1==\"DISTRIB_RELEASE\" \
{ print $2 ;}' \
/etc/openwrt_release; fi | \
tr -d \\'\\\""

···

rpc_sys_arp_call = Constants.\
LUCI_RPC_SYS_PATH.format(self.host_api_url), 'net.arptable'
rpc_ip_call = Constants.\
LUCI_RPC_IP_PATH.format(
self.host_api_url), 'neighbors', {"family": 4}

if self.owrt_version < version.parse("18.06"):
return True, rpc_sys_arp_call
else:
return False, rpc_ip_call

通过检查/etc/os-release中VERSION_ID的字段输出情况来检测Openwrt的版本。当Openwrt版本大于18.06之后,就使用ip模块来获取设备信息。

具体的请求为:domian/cgi-bin/luci/rpc/ip/neighbors

果不其然,在#15792的Pull request中,Update luci.py device tracker to work with OpenWRT 18.06,作者移除了这个方法:

版本修订

并且我使用的LEDE固件是koolshare的改版固件,内核4.19.75,手动查看了一下版本信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
NAME="Openwrt Koolshare mod"
VERSION="V2.31"
ID="openwrt_koolshare_mod"
ID_LIKE="lede openwrt"
PRETTY_NAME="Openwrt Koolshare mod V2.31"
VERSION_ID="v2.31"
HOME_URL="http://openwrt.org/"
BUG_URL="http://koolshare.cn"
SUPPORT_URL="http://koolshare.cn"
LEDE_BOARD="x86/64"
LEDE_ARCH="x86_64"
LEDE_TAINTS="no-all busybox"
LEDE_DEVICE_MANUFACTURER="koolshare"
LEDE_DEVICE_MANUFACTURER_URL="http://koolshare.cn"
LEDE_DEVICE_PRODUCT="fw867"
LEDE_DEVICE_REVISION="V2"
LEDE_RELEASE="Openwrt Koolshare mod V2.31"

版本号V2.31…所以按照版本号比较之后,认为是旧版本从而请求net.arptable这个方法,肯定请求出错!😑

解决办法

解决方式也很粗暴,直接强制返回False,通过ip模块来查找设备,重启Home Assistant,又可以找到设备了~(或许可以开一个LEDE的分支来处理koolshare的问题?

最后

Openwrt要比小米路由器好用多了,🤭后悔没有早点入坑。找了好久也没有看到一个管理软件,既然有RPC,不如小程序可以做一个?(逃

🥳 加载Disqus评论