Форум обсуждения систем  

Вернуться   Форум обсуждения систем "Умный дом", проектов Ардуино, OpenWRT и других DIY устройств > Форум умного дома > Сделай сам > OpenWRT/LEDE

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 18.10.2015, 22:56   #1
cmp
Junior Member
 
Регистрация: 18.10.2015
Сообщений: 3
Вес репутации: 0
cmp is an unknown quantity at this point
По умолчанию Отслеживание линков на портах роутера

Привет всем. Появилась необходимость запускать разные скрипты на события изменения линков от провайдера и от проводных клиентов.

и также хотелось бы как-то узнавать номер порта. допустим если отключили кабель от порта 3, то запуск скрипта 1. если подключили кабель к порту WAN - запуск скрипта 2.

роутер: dir-620. h/w rev: A1
OpenWrt: 15 версия.

На другом форуме советовали копать мануалы ubus и procd. но ничего накопать дельного я не смог (разве что только как переключать leds).

подскажите, куда копать
cmp вне форума   Ответить с цитированием
Старый 19.10.2015, 00:26   #2
khseal
Senior Member
 
Регистрация: 19.09.2014
Сообщений: 220
Вес репутации: 0
khseal is a glorious beacon of lightkhseal is a glorious beacon of lightkhseal is a glorious beacon of lightkhseal is a glorious beacon of lightkhseal is a glorious beacon of lightkhseal is a glorious beacon of light
По умолчанию Re: Отслеживание линков на портах роутера

Берешь да грепаешь дмесг на худой конец. А в целом надо по светодиодам смотреть.
Либо так
cat /sys/class/net/eth0/operstate
up
Хотя у меня в mr3020 один порт...
Пишешь условие торкаешь его в крон. В кроне указываешь время опроса. Можно скрипт конечно и зациклить, но это на любителя. Упал линк условие сработало на запуск скрипта или запустился сам скрипт.
В целом для решения этой задачи надо 15 минут погуглить...
Возможно еще придется юзать swconfig и писать что то типа
swconfig dev eth0 show
а там уже писать вывод в файл и его грепать.

Последний раз редактировалось khseal; 19.10.2015 в 00:52.
khseal вне форума   Ответить с цитированием
Старый 19.10.2015, 20:11   #3
cmp
Junior Member
 
Регистрация: 18.10.2015
Сообщений: 3
Вес репутации: 0
cmp is an unknown quantity at this point
По умолчанию Re: Отслеживание линков на портах роутера

если бы решение проблемы было бы и правда в 15 минутах гугления - то я бы сюда не писал. но тут не все так просто:

1)если смотреть состояния линков в /sys/class/net/eth*/carrier или в /sys/class/net/eth*/operstate, то на всех интерфейсах в первом файле будет "1", а во втором либо "unknown", либо "up". и при смене линка (от провайдера, от локальных машин) изменений в этих файлах не происходит.
на забугорных форумах покопал - сказали: "роутеры думают, что линки всегда подняты. а подключения детектят уже софтово, например демон каждые 2 секунды опрашивает порт.".
не поверил им - пошел копать дальше
2)попробовал привязаться к leds - благо файлик со значением их яркости лежит в папке /sys/devices/gpio-leds/leds/LED_NAME (это начиная с версии 14 или 15 openwrt чтоль).
но вот интересно - в файле светодиода wan в яркости стоит "1", независимо от того, есть линк или нет. хотя сам светодиод своё состояние меняет при изменении линка.
и да, другие светодиоды верно сообщают этими файликами своё состояние.
3)каждые 10 секунд грепать дмесг - не думаю, что хорошая идея. как минимум не хочу каждые 10 секунд запускать лишние процессы.
хотя движения в дмесге при изменении линков есть:
[57747.110000] rt305x-esw 10110000.esw: link changed 0x00
[57804.440000] rt305x-esw 10110000.esw: link changed 0x10
то есть происходит какое-то событие все-таки, которое заставляет записать пару строк в логи.
4)swconfig - вот за это спасибо, хорошая тема. (только вместо eth0 там надо имя свитча указать). работает оно хоть и не со всеми роутерами, но с моим завелось (поддерживаемые свитчи тут http://wiki.openwrt.org/doc/techref/swconfig ).
в моём dir-620а1 линки определяет исправно.
но вот теперь остался главный вопрос:
я конечно могу каждые 10 секунд запускать swconfig и грепать его, но наверно все-таки есть какое-нить событие в системе при изменении линков, на которое можно поставить запуск скрипта. чтобы не мучить роутер каждые 10 секунд запуском swconfig.

может быть есть какой-нить deamon, который сидит в памяти и по событию изменения линка может запустить скриптик?
в логи же пишутся изменения линков.
как думаете?

up
скрипт все-таки придется циклить думаю, так как не нашёл я способов, чтобы в кроне скрипт стартовал каждые 10 секунд

Последний раз редактировалось cmp; 19.10.2015 в 20:14.
cmp вне форума   Ответить с цитированием
Старый 19.10.2015, 20:42   #4
cmp
Junior Member
 
Регистрация: 18.10.2015
Сообщений: 3
Вес репутации: 0
cmp is an unknown quantity at this point
По умолчанию Re: Отслеживание линков на портах роутера

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

Цитата:
On the low level, these events can be caught using rtnetlink sockets ( http://man7.org/linux/man-pages/man7/rtnetlink.7.html ), without any polling. Side note: if you use rtnetlink, you have to work together with udev, or your program may get confused when udev renames a new network interface.

The problem with doing network configurations with shell scripts is that shell scripts are terrible for event handling (such as a network cable being plugged in and out). If you need something more powerful, take a look at my NCD programming language, a programming language designed for network configurations.

For example, a simple NCD script that will print "cable in" and "cable out" to stdout (assuming the interface is already up):

process foo {
# Wait for device to appear and be configured by udev.
net.backend.waitdevice("eth0");
# Wait for cable to be plugged in.
net.backend.waitlink("eth0");
# Print "cable in" when we reach this point, and "cable out"
# when we regress.
println("cable in"); # or pop_bubble("Network cable in.");
rprintln("cable out"); # or rpop_bubble("Network cable out!");
# just joking, there's no pop_bubble() in NCD yet
}
(internally, net.backend.waitlink() uses rtnetlink, and net.backend.waitdevice() uses udev)

The idea of NCD is that you use it exclusively to configure the network, so normally, configuration commands would come in between, such as:

process foo {
# Wait for device to appear and be configured by udev.
net.backend.waitdevice("eth0");
# Set device up.
net.up("eth0");
# Wait for cable to be plugged in.
net.backend.waitlink("eth0");
# Add IP address to device.
net.ipv4.addr("eth0", "192.168.1.61", "24");
}
The important part to note is that execution is allowed to regress; in the second example, for instance, if the cable is pulled out, the IP address will automatically be removed.
но как запустить на роутере ncd скрипт так и не разобрался
cmp вне форума   Ответить с цитированием
Старый 06.11.2015, 19:16   #5
sunny
Senior Member
 
Аватар для sunny
 
Регистрация: 22.10.2015
Адрес: Там где сосны и песок
Сообщений: 1,534
Вес репутации: 1600
sunny is a name known to allsunny is a name known to allsunny is a name known to allsunny is a name known to allsunny is a name known to allsunny is a name known to all
По умолчанию Re: Отслеживание линков на портах роутера

cmp
Про cron здесь:
http://cyber-place.ru/showpost.php?p=28292&postcount=2
Каждую минуту запускать скрипт:
Код:
*/1 * * * * /bin/script
или
*/1 * * * * /usr/bin/script
Как закинуть скрипт на роутер здесь:
http://cyber-place.ru/showpost.php?p=28866&postcount=14
или выше...
sunny вне форума   Ответить с цитированием
Ответ

Метки
event, link, openwr


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 18:18. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Яндекс.Метрика