iFinder Posted October 29, 2019 Share Posted October 29, 2019 В настройках 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 с учётом какая кнопка нажата ? Quote Link to comment Share on other sites More sharing options...
keenet07 Posted October 29, 2019 Share Posted October 29, 2019 Если вдруг не заметили, для запуска Гостевой сети там уже есть предустановка. Скрипт не требуется. Quote Link to comment Share on other sites More sharing options...
iFinder Posted October 29, 2019 Author Share Posted October 29, 2019 1 минуту назад, keenet07 сказал: Если вдруг не заметили, для запуска Гостевой сети там уже есть предустановка. Скрипт не требуется. Не только заметил, а несколько лет пользуюсь. Указал для примера: удобно контролировать и у всех есть. Quote Link to comment Share on other sites More sharing options...
keenet07 Posted October 29, 2019 Share Posted October 29, 2019 Понятно. ) А то я смотрю на скрипт и думаю, как же в с ним будете жить. Включить Гостевую можно, а выключить нет. )) Quote Link to comment Share on other sites More sharing options...
iFinder Posted October 29, 2019 Author Share Posted October 29, 2019 1 минуту назад, keenet07 сказал: Включить Гостевую можно, а выключить нет. )) В том то и дело, как написать,чтобы при одном типе нажатия включалась, а при другом отключалась ? Quote Link to comment Share on other sites More sharing options...
dexter Posted October 29, 2019 Share Posted October 29, 2019 Написать 2 скрипта. 1 Quote Link to comment Share on other sites More sharing options...
keenet07 Posted October 29, 2019 Share Posted October 29, 2019 (edited) Зачем два? А в одном разве нельзя что-то вроде триггера сделать. Одну переменную куда-нибудь сохранить ведь можно? Увеличивать её значение на единицу с каждым нажатием кнопки. Если четное значение, то включаем, если нечетное, то отключаем. Это один из возможных вариантов реализации. Edited October 29, 2019 by keenet07 Quote Link to comment Share on other sites More sharing options...
dexter Posted October 29, 2019 Share Posted October 29, 2019 Нужно у знавать у разработчиков, что передает кнопка при нажатии. Quote Link to comment Share on other sites More sharing options...
r13 Posted October 29, 2019 Share Posted October 29, 2019 (edited) Пишем скрипт, в чем вам нравится, логику работы сами придумываем https://github.com/ndmsystems/packages/wiki/Opkg-Component#ndmbuttond настраивать из скрипта что-то в ndms можно либо через утилиту ndmq(поискать по форуму) либо дергая rest api, опять же поискать по форуму. Edited October 29, 2019 by r13 1 Quote Link to comment Share on other sites More sharing options...
r13 Posted October 29, 2019 Share Posted October 29, 2019 4 минуты назад, dexter сказал: Нужно у знавать у разработчиков, что передает кнопка при нажатии. Че там узнавать, все задокументировано, ссылка выше. Quote Link to comment Share on other sites More sharing options...
iFinder Posted October 29, 2019 Author Share Posted October 29, 2019 (edited) #!/opt/bin/bash echo "button=$button" #interface WifiMaster0/AccessPoint1 up #echo "Гостевая сеть запущена !" Ничего не происходит при нажатии кнопки. Что делать ? Edited October 29, 2019 by iFinder Quote Link to comment Share on other sites More sharing options...
r13 Posted October 29, 2019 Share Posted October 29, 2019 3 минуты назад, iFinder сказал: #!/opt/bin/bash echo "button=$button" #interface WifiMaster0/AccessPoint1 up #echo "Гостевая сеть запущена !" Ничего не происходит при нажатии кнопки. Что делать ? А что вы ожидаете? Ваш скрипт печатает строку в stdout и все. 1 Quote Link to comment Share on other sites More sharing options...
iFinder Posted October 29, 2019 Author Share Posted October 29, 2019 (edited) 1 минуту назад, r13 сказал: Ваш скрипт печатает строку в stdout и все. Но в CLI/SSH ничего не появляется ! В данном случае разве stdout и CLI/SSH не одно и тоже ? Edited October 29, 2019 by iFinder Quote Link to comment Share on other sites More sharing options...
r13 Posted October 29, 2019 Share Posted October 29, 2019 6 минут назад, iFinder сказал: Но в CLI/SSH ничего не появляется ! В данном случае разве stdout и CLI/SSH не одно и тоже ? Не появляется в вашей сессии. Скрипт просто выполняется и все. Если вместо echo использовать logger , то результат увидите в логе кинетика. 1 Quote Link to comment Share on other sites More sharing options...
iFinder Posted October 29, 2019 Author Share Posted October 29, 2019 #!/opt/bin/bash logger "button=$button" #interface WifiMaster0/AccessPoint1 up #echo "Гостевая сеть запущена !" В логе кинетика по-прежнему ничего нет Quote Link to comment Share on other sites More sharing options...
iFinder Posted October 29, 2019 Author Share Posted October 29, 2019 5 минут назад, r13 сказал: Если вместо echo использовать logger , то результат увидите в логе кинетика. #!/opt/bin/bash logger "button=$button" #interface WifiMaster0/AccessPoint1 up #echo "Гостевая сеть запущена !" В логе кинетика по-прежнему ничего нет Quote Link to comment Share on other sites More sharing options...
keenet07 Posted October 29, 2019 Share Posted October 29, 2019 (edited) Проверьте на всякий случай ещё раз права на файле скрипта. Разрешение на запуск. И убедитесь, что вы правильную кнопку нажимаете в правильной комбинации нажатий подряд. Да и скрипт вроде должен быть в файле button.d а не buttons.sh если я не ошибаюсь. Edited October 29, 2019 by keenet07 1 Quote Link to comment Share on other sites More sharing options...
r13 Posted October 29, 2019 Share Posted October 29, 2019 9 минут назад, iFinder сказал: #!/opt/bin/bash logger "button=$button" #interface WifiMaster0/AccessPoint1 up #echo "Гостевая сеть запущена !" В логе кинетика по-прежнему ничего нет Просто в ssh сессии скрипт запускать пробовали? Работает? Quote Link to comment Share on other sites More sharing options...
iFinder Posted October 29, 2019 Author Share Posted October 29, 2019 6 минут назад, keenet07 сказал: Проверьте на всякий случай ещё раз права на файле скрипта. Разрешение на запуск. И убедитесь, что вы правильную кнопку нажимаете в правильной комбинации нажатий подряд. Получилось, оказалось перепутал кнопки FN: Окт 29 15:27:24 root button=FN1 Дальше дело техники ! Quote Link to comment Share on other sites More sharing options...
iFinder Posted October 29, 2019 Author Share Posted October 29, 2019 8 минут назад, keenet07 сказал: Да и скрипт вроде должен быть в файле button.d а не buttons.sh если я не ошибаюсь. У меня скрипт был и есть /opt/etc/ndm/button.d/PressButtons.bash Quote Link to comment Share on other sites More sharing options...
iFinder Posted October 29, 2019 Author Share Posted October 29, 2019 (edited) Итак подвожу итоги: СОЗДАНИЕ СКРИПТА РЕАКЦИИ НА НАЖАТИЕ КНОПКИ 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 October 29, 2019 by iFinder Quote Link to comment Share on other sites More sharing options...
ajs Posted October 29, 2019 Share Posted October 29, 2019 7 минут назад, iFinder сказал: Может кто знает, в чём причина ? Как по мне, одного fi не хватает Quote Link to comment Share on other sites More sharing options...
iFinder Posted October 29, 2019 Author Share Posted October 29, 2019 (edited) 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 October 29, 2019 by iFinder Quote Link to comment Share on other sites More sharing options...
ajs Posted October 29, 2019 Share Posted October 29, 2019 5 минут назад, iFinder сказал: И при тестовом запуске из CLI/SSH всё нормально. В конце попробуйте exit 0 1 Quote Link to comment Share on other sites More sharing options...
iFinder Posted October 29, 2019 Author Share Posted October 29, 2019 24 минуты назад, iFinder сказал: Может кто знает, в чём причина ? 5 минут назад, ajs сказал: В конце попробуйте exit 0 В итоге ПОМОГЛО ! Надо в конце добавить: exit 0 1 Quote Link to comment Share on other sites More sharing options...
ajs Posted October 29, 2019 Share Posted October 29, 2019 (edited) 13 минуты назад, iFinder сказал: elif -- это краткая форма записи конструкции else if. Применяется для построения многоярусных инструкций if/then. Это в большом баше, как тут не знаю, но я бы попробовал или заменить таки на elif, или добавил бы fi, или вообще убрал else if т.к. оно там по большому счету не надо, оставил бы 2-а подряд идущих if ... Если exit 0 не поможет Edited October 29, 2019 by ajs Quote Link to comment Share on other sites More sharing options...
iFinder Posted October 29, 2019 Author Share Posted October 29, 2019 Только что, ajs сказал: 2-а подряд идущих if тоже работает. Но первый Ваш совет содержательнее: он показал, что есть разница в написании скриптов! Quote Link to comment Share on other sites More sharing options...
ajs Posted October 29, 2019 Share Posted October 29, 2019 Только что, 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 (или еще что-то) в случае долгого нажатия на кнопку (скрипт не умеет отрабатывать данное событие) 1 Quote Link to comment Share on other sites More sharing options...
iFinder Posted October 29, 2019 Author Share Posted October 29, 2019 Ну а теперь верх хотелок: У меня три WiFi-сетки. Две управляются кнопкой стандартно. Короткое нажатие - Гостевая сеть, Двойное - Служебная сеть. Логично было бы переключать третью (Домашнюю) сеть Долгим нажатием кнопки. Именно переключать, а не задействовать два разных нажатия кнопки как в моём скрипте выше. Но как можно узнать текущее состояние интерфейса в скрипте ? Напишите пожалуйста, кто знает, строчку или две кода для этого. Quote Link to comment Share on other sites More sharing options...
keenet07 Posted October 29, 2019 Share Posted October 29, 2019 (edited) А как я вам выше предлагал не подойдет? Никакого состояния не выяснять а тупо на каждое долгое нажатие либо включать, либо выключать. Через раз. По счетчику четное/нечетное нажатие или как-нибудь ещё. На четное нажатие включаем, на не четное выключаем. Edited October 29, 2019 by keenet07 Quote Link to comment Share on other sites More sharing options...
Recommended Posts
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.