Xiaomi AX3000T

Устанавливаем модуль ядра для работы с кнопками, создаём папку для скриптов кнопок и создаём основной скрипт обработки нажатий кнопки.

opkg update && opkg install kmod-button-hotplug
mkdir -p /etc/hotplug.d/button
cat << "EOF" > /etc/hotplug.d/button/00-button
source /lib/functions.sh
 
do_button () {
    local button
    local action
    local handler
    local min
    local max
 
    config_get button "${1}" button
    config_get action "${1}" action
    config_get handler "${1}" handler
    config_get min "${1}" min
    config_get max "${1}" max
 
    [ "${ACTION}" = "${action}" -a "${BUTTON}" = "${button}" -a -n "${handler}" ] && {
        [ -z "${min}" -o -z "${max}" ] && eval ${handler}
        [ -n "${min}" -a -n "${max}" ] && {
            [ "${min}" -le "${SEEN}" -a "${max}" -ge "${SEEN}" ] && eval ${handler}
        }
    }
}
 
config_load system
config_foreach do_button button
EOF
chmod 755 /etc/hotplug.d/button/00-button

Создаём скрипт переключения сервиса

Он проверяет, если сервис работает, то выключает его, если сервис выключен - то включает его.

cat << "EOF" > /etc/toggle_service.sh
SERVICE_NAME="clash"

check_service_status() {
    /etc/init.d/$SERVICE_NAME status | grep -q "running"
}

if check_service_status; then
    echo "$SERVICE_NAME is running. Stopping it..."
    /etc/init.d/$SERVICE_NAME stop
    /etc/init.d/$SERVICE_NAME disable
else
	echo "$SERVICE_NAME is not running. Starting it..."
    /etc/init.d/$SERVICE_NAME enable
    /etc/init.d/$SERVICE_NAME start
fi
EOF
chmod 755 /etc/toggle_service.sh

Добавляем команду в систему

uci add system button
uci set system.@button[-1].button="BTN_9"
uci set system.@button[-1].action="pressed"
uci set system.@button[-1].handler="/etc/toggle_service.sh"
uci commit system

В handler задаётся любая команда или скрипт, который должен исполниться, если action="pressed" - кнопка нажата (утоплена). action="released" - кнопку отпустили.

На заводской gl.iNet GL-MT3000

В фирменной оболочке gl.inet меню переключателей лежит в /etc/gl-switch.d/

nano /etc/gl-switch.d/clash.sh

Сам скрипт:

#!/bin/sh

action=$1

if [ "$action" = "on" ];then
	service clash enable && service clash start
fi

if [ "$action" = "off" ];then
	service clash stop && service clash disable
fi

sleep 5

Выдаём права на исполнение:

chmod 755 /etc/gl-switch.d/clash.sh

На чистых OpenWRT gl.inet GL-MT3000

Переключатель работает как одна BTN_0 кнопка в состоянии pressed (положение влево с точкой) и released (положение вправо)