Jump to content

Запуск скрипта по нажатию на кнопки Keenetic


Recommended Posts

В настройках Keenetic можно указать действие по нажатию кнопок: OPKG - Запуск скриптов button.d

Предполагаю, что реализации этой возможности надо:

1. Выбрать в WEB-интерфейсе Keenetic для конкретной кнопки "OPKG - Запуск скриптов button.d"

2. Создать файл /opt/etc/ndm/button.d/buttons.sh

3. Написать скрипт в файле buttons.sh:

- Из скрипта будут доступны дополнительные переменные окружения:

button — название кнопкина
action — тип нажатия

- Задача будет, например, запустить Гостевую сеть

Вот набросок того, что предполагаю:

#!/opt/bin/bash

interface WifiMaster0/AccessPoint1 up

echo "Гостевая сеть запущена !"

4. Сделать скрипт исполняемым:

chmod +x /opt/etc/ndm/button.d/buttons.sh

Вопросы:

1. Соответствует ли действительности указанный выше подход ?

2. Как должен выглядеть скрипт buttons.sh ?

3. Как должен выглядеть скрипт buttons.sh с учётом какая кнопка нажата ?

Link to comment
Share on other sites

1 минуту назад, keenet07 сказал:

Если вдруг не заметили, для запуска Гостевой сети там уже есть предустановка. Скрипт не требуется.

Не только заметил, а несколько лет пользуюсь. Указал для примера: удобно контролировать и у всех есть.

Link to comment
Share on other sites

1 минуту назад, keenet07 сказал:

Включить Гостевую можно, а выключить нет. ))

В том то и дело, как написать,чтобы при одном типе нажатия включалась, а при другом отключалась ?

 

Link to comment
Share on other sites

Зачем два? А в одном разве нельзя что-то вроде триггера сделать. Одну переменную куда-нибудь сохранить ведь можно? Увеличивать её значение на единицу с каждым нажатием кнопки. Если четное значение, то включаем, если нечетное, то отключаем. Это один из возможных вариантов реализации.

Edited by keenet07
Link to comment
Share on other sites

Пишем скрипт, в чем вам нравится, логику работы сами придумываем  

https://github.com/ndmsystems/packages/wiki/Opkg-Component#ndmbuttond

настраивать из скрипта что-то в ndms можно либо через утилиту ndmq(поискать по форуму) либо дергая rest api, опять же поискать по форуму. 

Edited by r13
  • Thanks 1
Link to comment
Share on other sites

4 минуты назад, dexter сказал:

Нужно у знавать у разработчиков, что передает кнопка при нажатии.

Че там узнавать, все задокументировано, ссылка выше. 

Link to comment
Share on other sites

#!/opt/bin/bash
echo "button=$button"
#interface WifiMaster0/AccessPoint1 up
#echo "Гостевая сеть запущена !"

Ничего не происходит при нажатии кнопки. Что делать ?

Edited by iFinder
Link to comment
Share on other sites

3 минуты назад, iFinder сказал:

#!/opt/bin/bash
echo "button=$button"
#interface WifiMaster0/AccessPoint1 up
#echo "Гостевая сеть запущена !"

Ничего не происходит при нажатии кнопки. Что делать ?

А что вы ожидаете?

Ваш скрипт печатает строку в stdout и все. 

  • Upvote 1
Link to comment
Share on other sites

1 минуту назад, r13 сказал:

Ваш скрипт печатает строку в stdout и все. 

Но в CLI/SSH ничего не появляется ! В данном случае разве stdout и CLI/SSH не одно и тоже ?

Edited by iFinder
Link to comment
Share on other sites

6 минут назад, iFinder сказал:

Но в CLI/SSH ничего не появляется ! В данном случае разве stdout и CLI/SSH не одно и тоже ?

Не появляется в вашей сессии. Скрипт просто выполняется и все. Если вместо echo использовать logger , то результат увидите в логе кинетика. 

  • Thanks 1
Link to comment
Share on other sites

5 минут назад, r13 сказал:

Если вместо echo использовать logger , то результат увидите в логе кинетика. 

#!/opt/bin/bash
logger "button=$button"
#interface WifiMaster0/AccessPoint1 up
#echo "Гостевая сеть запущена !"

В логе кинетика по-прежнему ничего нет

 

 

Link to comment
Share on other sites

Проверьте на всякий случай ещё раз права на файле скрипта. Разрешение на запуск.

И убедитесь, что вы правильную кнопку нажимаете в правильной комбинации нажатий подряд.

Да и скрипт вроде должен быть в файле button.d а не buttons.sh если я не ошибаюсь.

Edited by keenet07
  • Thanks 1
Link to comment
Share on other sites

9 минут назад, iFinder сказал:

#!/opt/bin/bash
logger "button=$button"
#interface WifiMaster0/AccessPoint1 up
#echo "Гостевая сеть запущена !"

В логе кинетика по-прежнему ничего нет

 

 

Просто в ssh сессии скрипт запускать пробовали? Работает?

Link to comment
Share on other sites

6 минут назад, keenet07 сказал:

Проверьте на всякий случай ещё раз права на файле скрипта. Разрешение на запуск.

И убедитесь, что вы правильную кнопку нажимаете в правильной комбинации нажатий подряд.

Получилось, оказалось перепутал кнопки FN: 

Окт 29 15:27:24

 

root
button=FN1
Дальше дело техники !
Link to comment
Share on other sites

8 минут назад, keenet07 сказал:

Да и скрипт вроде должен быть в файле button.d а не buttons.sh если я не ошибаюсь.

У меня скрипт был и есть /opt/etc/ndm/button.d/PressButtons.bash

Link to comment
Share on other sites

Итак подвожу итоги:

СОЗДАНИЕ СКРИПТА РЕАКЦИИ НА НАЖАТИЕ КНОПКИ KEENETIC

1. Создаю файл скрипта: /opt/etc/ndm/button.d/PressButtons.bash

2. Наполняю его содержимым:
 

Скрытый текст

#!/opt/bin/bash
# Версия 010 (Тесты)

# ====== Записываем в журнал Keenetic для истории и отладки
#logger "button=$button"   # Варианты: WLAN, FN1, FN2
#logger "action=$action"   # Варианты: click, double-click, hold
logger "button=$button  action=$action"

# ++++++ Нажата кнопка FN1 - Анализируем тип нажатия
if [ "$button" == "FN1" ]
then
    # +++ Кнопка FN1 один раз - Включаем WiFi-сеть  # Можно elif
    if [ "$action" == "click" ]
    then
        #ndmq -x -p "interface WifiMaster0/AccessPoint1 up"
        #logger "Гостевая WiFi-сеть включена одним нажатием кнопки FN1."
        ndmq -x -p "interface WifiMaster0/AccessPoint0 up"
        logger "Домашняя WiFi-сеть включена одним нажатием кнопки FN1."
        #continue
    # +++ Кнопка FN1 два раза - Отключаем WiFi-сеть
    else if [ "$action" == "double-click" ]
    then
        #ndmq -x -p "interface WifiMaster0/AccessPoint1 down"
        #logger "Гостевая WiFi-сеть отключена двойным нажатием кнопки FN1."
        ndmq -x -p "interface WifiMaster0/AccessPoint0 down"
        logger "Домашняя WiFi-сеть отключена двойным нажатием кнопки FN1."
    fi
fi

 

3. Делаю его исполняемым:

chmod +x /opt/etc/ndm/button.d/PressButtons.bash

4. Указываю в Настройках Keenetic реакцию на нажатие кнопки FN1:

Однократное нажатие =  "OPKG - Запуск скриптов button.d"

Двукратное нажатие =  "OPKG - Запуск скриптов button.d"

5. Проверил запуском из CLI/SSH

/opt/etc/ndm/button.d/PressButtons.bash

НО ПРИ НАЖАТИИ КНОПКИ FN1 в журнале Keenetic появились записи:

Окт 29 17:56:28
 
root
button=FN1 action=click
Окт 29 17:56:28
 
ndm
Opkg::Manager: /opt/etc/ndm/button.d/PressButtons.bash: /opt/etc/ndm/button.d/PressButtons.bash: line 34: syntax error: unexpected end of file.
Окт 29 17:56:28
 
ndm
Opkg::Manager: /opt/etc/ndm/button.d/PressButtons.bash: exit code 2.

 

Может кто знает, в чём причина ?

Edited by iFinder
Link to comment
Share on other sites

5 минут назад, ajs сказал:

Как по мне, одного fi не хватает

Вот описание:

Else if и elif

elif

elif -- это краткая форма записи конструкции else if. Применяется для построения многоярусных инструкций if/then.

if [ condition1 ]
then
   command1
   command2
   command3
elif [ condition2 ]
# То же самое, что и else if
then
   command4
   command5
else
   default-command
fi

И при тестовом запуске из CLI/SSH всё нормально.

Edited by iFinder
Link to comment
Share on other sites

24 минуты назад, iFinder сказал:

Может кто знает, в чём причина ?

5 минут назад, ajs сказал:

В конце попробуйте exit 0

В итоге ПОМОГЛО ! Надо в конце добавить:

exit 0

 

  • Upvote 1
Link to comment
Share on other sites

13 минуты назад, iFinder сказал:

elif -- это краткая форма записи конструкции else if. Применяется для построения многоярусных инструкций if/then.

Это в большом баше, как тут не знаю, но я бы попробовал или заменить таки на elif, или добавил бы fi, или вообще убрал else if т.к. оно там по большому счету не надо, оставил бы 2-а подряд идущих if ... Если exit 0 не поможет :)

Edited by ajs
Link to comment
Share on other sites

Только что, ajs сказал:

2-а подряд идущих if

тоже работает. Но первый Ваш совет содержательнее: он показал, что есть разница в написании скриптов!

Link to comment
Share on other sites

Только что, iFinder сказал:

Но первый Ваш совет содержательнее: он показал, что есть разница в написании скриптов!

Думаю тут нет разницы особой, просто система ожидает отклик на запуск скрипта, и когда его не получает ругается:

30 минут назад, iFinder сказал:

Opkg::Manager: /opt/etc/ndm/button.d/PressButtons.bash: exit code 2.

А когда Вы сообщили что в скрипте все хорошо exit 0, оно успокоилось :)

2 минуты назад, iFinder сказал:

тоже работает.

А чего бы ему не работать? Просто в варианте 2 if в том виде как у Вас, было бы 2 проверки при любом нажатии, в Вашем варианте 2 проверки только при дойном нажатии, но и это решаемо вызовом exit 0 после действия в каждом блоке if и допустим вызовом в конце exit 1 (или еще что-то) в случае долгого нажатия на кнопку (скрипт не умеет отрабатывать данное событие) :)

  • Upvote 1
Link to comment
Share on other sites

Ну а теперь верх хотелок:

У меня три WiFi-сетки. Две управляются кнопкой стандартно. Короткое нажатие - Гостевая сеть, Двойное - Служебная сеть.

Логично было бы переключать третью (Домашнюю) сеть Долгим нажатием кнопки.

Именно переключать, а не задействовать два разных нажатия кнопки как в моём скрипте выше.

Но как можно узнать текущее состояние интерфейса в скрипте ?

Напишите пожалуйста, кто знает, строчку или две кода для этого. 

Link to comment
Share on other sites

А как я вам выше предлагал не подойдет? 

Никакого состояния не выяснять а тупо на каждое долгое нажатие либо включать, либо выключать. Через раз. По счетчику четное/нечетное нажатие или как-нибудь ещё. На четное нажатие включаем, на не четное выключаем.

Edited by keenet07
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...