mayun
1
你好, 我配置了若干wireguard线路,因为密码是不透露给用户的, 因此不能通过web界面切换。 现在想通过双击power按钮(或其他更好的方案)在wireguard线路列表中循环切换,即到达最后一个wireguard配置时切换回第一条。
这包含了两个对于我来说无法解决的问题, 虽然我有一定基础的linux开发经验,但对于openwrt我是门外汉,这两个问题分别是:
-
如何响应power按钮双击?
我知道在/etc/rc.button/power是电源按钮的响应脚本,但谷歌没找到响应按钮双击的先例。
-
如何循环切换wireguard线路?
我知道是通过/etc/init.d/wireguard切换,config_load "wireguard"加载配置,我对uci命令不熟悉,猜想应该是web界面触发保存了wireguard的配置,然后调用config_load才是新线路的配置,这些不知道如何通过脚本实现?
1 Like
alzhao
2
应该是 /etc/rc.button/reset 脚本。不过你要双击的话就麻烦了,要自己检测双击。要记录每一个按钮时间并且检测间隔。不是很推荐。
循环这个我也不是很熟了。主要是uci跟config_load,这个都是openwrt里面的东西,需要您自己一边写一边试。
mayun
4
感谢你的回答, 我的设备是GL-MIFI,在所有/etc/rc.button的脚本上加上
echo “按钮名称” >> /root/button.log
按下电源按钮没有日志, 用针按reset能够记录到/etc/rc.button/reset响应了。
请问电源按钮无法响应吗?
mayun
6
感谢你的回答, 那请教一下第二个问题, 3.0固件的wireguard配置保存在哪里, 网盘有什么办法读取到下一条配置, 因为在脚本中用config_load只能读取到当前界面选中的配置项。
保存在 /etc/config/wireguard
mayun
8
多谢提供技术支持, 已经可以切换了, 美中不足的是电源键不可编程,只能通过reset切换。 分享一下切换脚本, 以帮助后来有需要的人:
wireguard_nextpeer.sh, 调用即切换下一个peer,如果已经到达最后一个,则跳到第一个:
#!/bin/sh
. /lib/functions.sh
next_peer()
{
local main_server=$(uci get wireguard.@proxy[0].main_server)
local meet_main_server=0
local first_server=""
local next_server=""
local sections=$(uci show wireguard | sed -n 's/\(.*\).name='.*'/\1/p')
[ -n "$sections" ] || return 1
for section in $sections; do
name=$(uci get $section.name)
if [ "$first_server" == "" ];then
first_server=$name
fi
if [ "$name" != "" -a "$name" == "$main_server" ];then
meet_main_server=1
elif [ "$meet_main_server" != 0 -a "$next_server" == "" ];then
next_server=$name
fi
done
if [ "$next_server" == "" -a "$first_server" != "" ];then
next_server=$first_server
fi
[ "$next_server" != "" -a "$next_server" != "$main_server" ] || return 1
uci set wireguard.@proxy[0].enable='1'
uci set wireguard.@proxy[0].main_server="$next_server"
uci commit wireguard
/etc/init.d/wireguard restart &
}
next_peer