3.0固件响应power按钮双击,切换wireguard线路

你好, 我配置了若干wireguard线路,因为密码是不透露给用户的, 因此不能通过web界面切换。 现在想通过双击power按钮(或其他更好的方案)在wireguard线路列表中循环切换,即到达最后一个wireguard配置时切换回第一条。

这包含了两个对于我来说无法解决的问题, 虽然我有一定基础的linux开发经验,但对于openwrt我是门外汉,这两个问题分别是:

  1. 如何响应power按钮双击?
    我知道在/etc/rc.button/power是电源按钮的响应脚本,但谷歌没找到响应按钮双击的先例。

  2. 如何循环切换wireguard线路?
    我知道是通过/etc/init.d/wireguard切换,config_load "wireguard"加载配置,我对uci命令不熟悉,猜想应该是web界面触发保存了wireguard的配置,然后调用config_load才是新线路的配置,这些不知道如何通过脚本实现?

1 Like

应该是 /etc/rc.button/reset 脚本。不过你要双击的话就麻烦了,要自己检测双击。要记录每一个按钮时间并且检测间隔。不是很推荐。

循环这个我也不是很熟了。主要是uci跟config_load,这个都是openwrt里面的东西,需要您自己一边写一边试。

感谢你的回答, 我的设备是GL-MIFI,在所有/etc/rc.button的脚本上加上
echo “按钮名称” >> /root/button.log

按下电源按钮没有日志, 用针按reset能够记录到/etc/rc.button/reset响应了。
请问电源按钮无法响应吗?

Mifi的电源键不能用做其他用途

不是接的gpio

1 Like

感谢你的回答, 那请教一下第二个问题, 3.0固件的wireguard配置保存在哪里, 网盘有什么办法读取到下一条配置, 因为在脚本中用config_load只能读取到当前界面选中的配置项。

保存在 /etc/config/wireguard

多谢提供技术支持, 已经可以切换了, 美中不足的是电源键不可编程,只能通过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

不错,多谢分享。

thanks very much.

1 Like