Приветствую!
Для своих нужд написал скрипт мониторинга состояния клиентов сети и теперь делюсь с сообществом... Скрипт подразумевает работу на устройстве с поднятыми сетевым мостом и DHCP-сервером, из которых черпается информация о клиентах сети и их активности (устройство в роли типового домашнего шлюза, на котором подняты все необходимые сетевые службы).
Во время работы скрипт формирует в памяти устройства базу клиентов и актуализирует её при каждом запуске. В случае смены статуса сетевого клиента, скрипт отправляет соответствующую запись в журнал устройства. Для дальнейшей отправки уведомлений в Телеграм можно задействовать скрипт TLGRM .
В скрипте имеется вспомогательная база клиентов, в которую при необходимости можно внести удобочитаемые имена клиентов или таких клиентов, которых нужно игнорировать.
Обкатка скрипта проводилась на актуальных версиях RouterOS 6.49.++ и 7.14.++ . Тело скрипта необходимо закинуть в 'System/Scripts' и настроить запуск по расписанию из 'System/Scheduler' с периодом 1 минуту.
Уверен, что скрипт не лишён косяков - замечания и конструктивная критика приветствуются!
Если скрипт Вам зашёл - отметьте его звездочкой. Вам не сложно, а мне приятно!
Скрипт отслеживания состояния сетевых клиентов
Правила форума
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
- drpioneer
- Сообщения: 175
- Зарегистрирован: 30 май 2013, 10:20
-
- Сообщения: 1657
- Зарегистрирован: 15 сен 2017, 09:03
Дружище ! Теперь вместо всего этого можно использовать /ip dhcp server liase print follow-only where [$sendToTelegram $name .... итд ...
Скрипт выходит раз в 10 короче
viewtopic.php?t=16951
Скрипт выходит раз в 10 короче
viewtopic.php?t=16951
фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
viewtopic.php?f=14&t=13947
- drpioneer
- Сообщения: 175
- Зарегистрирован: 30 май 2013, 10:20
Привет Сергей!Sertik писал(а): ↑04 сен 2024, 10:32 Дружище ! Теперь вместо всего этого можно использовать /ip dhcp server liase print follow-only where [$sendToTelegram $name .... итд ...
Скрипт выходит раз в 10 короче
viewtopic.php?t=16951
Тему про генерацию и обработку событий в ROS с твоим участием я видел.
Для полноценного перехода на событийную логику работы лично мне нужно больше примеров кода и свободное время, чем я пока не располагаю...
Предлагаю тебе поделиться с общественностью не условными строчками с полётом мысли художника, а рабочим скриптом, являющимся хорошим примером для подражания... Ветка же не спроста называется: "Готовые скрипты Mikrotik".
-
- Сообщения: 1657
- Зарегистрирован: 15 сен 2017, 09:03
Пример для таблицы wifi-registration:
Код: Выделить всё
:global wifiEventHandler do={
:local text "On $1 is added a new item $2 $3"
:log warning $text
/tool fetch url="https://api.telegram.org/$botID/sendmessage\?chat_id=$myChatID&parse_mode=$Tstyle&text=$text" keep-result=no;
:return []
}
:execute {
:global wifiEventHandler
/interface wireless registration-table print follow-only where uptime<5s & [$wifiVoiceEventHandler "wifi registration" $comment $interface]
}
фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
viewtopic.php?f=14&t=13947
- drpioneer
- Сообщения: 175
- Зарегистрирован: 30 май 2013, 10:20
Представленный пример демонстрирует лишь обработку появления новых элементов в таблице.
Остаются открытыми вопросы:
- как отследить исчезновение старых элементов из таблицы?
- как предотвратить одновременный запуск нескольких копий процесса отслеживания при запуске представленного примера несколько раз подряд?
- как обнаружить аварийно (или не аварийно) завершенный процесс отслеживания?
- как повторно стартовать аварийно (или не аварийно) завершенный процесс отслеживания?
-
- Сообщения: 1657
- Зарегистрирован: 15 сен 2017, 09:03
- При исчезновении записи из таблицы этот процесс тоже срабатывает
- Запускать его несколько раз не нужно. Система сама контролирует процесс
- Аварийно процесс не завершается никогда, если в скрипте нет ошибок т.к. его контролирует сама РОС. Он стабилен и постоянно висит в ожидании работы, в перезапуске необходимости не бывает (до перезагрузки роутера).
- Запускать его несколько раз не нужно. Система сама контролирует процесс
- Аварийно процесс не завершается никогда, если в скрипте нет ошибок т.к. его контролирует сама РОС. Он стабилен и постоянно висит в ожидании работы, в перезапуске необходимости не бывает (до перезагрузки роутера).
фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
viewtopic.php?f=14&t=13947
- drpioneer
- Сообщения: 175
- Зарегистрирован: 30 май 2013, 10:20
Нужен пример обработки исчезновения устаревшей записи из таблицы 'Bridge/Hosts'
Первоисточник гласит про отслеживание только новых записей:
follow-only >> print and track only new entries until ctrl-c is pressed, very useful when viewing log entries.
-
- Сообщения: 1657
- Зарегистрирован: 15 сен 2017, 09:03
:global wifiEventHandler do={
:local text "On $1 is added a new item $2 $3"
:if ([:len $3]>0) do={
:log warning $text
/tool fetch url="https://api.telegram.org/$botID/sendmes ... text=$text" keep-result=no}
:return []
}
:execute {
:global wifiEventHandler
/interface wireless registration-table print follow-only where [$wifiVoiceEventHandler "wifi registration" $comment $interface]
}
Андрей, можно использовать тот же пример. При исчезновении записи в зависимости от таблицы часть параметров утрачиваются (становятся пустыми), по этому свойству можно различить произошло появление новой записи или удаление записи. Я ввёл в пример проверку параметра $3 (имя интерфейса wifi в данном случае). Как только клиент отключается все поля в его записи таблицы становятся пустыми, в том числе и название интерфейса. В данном примере при подключении уходит сообщение в Телегу, при отключении - ничего не делается. Ты можешь сделать отправку разных сообщений.
В таблице Bridge сам попробуй.
:local text "On $1 is added a new item $2 $3"
:if ([:len $3]>0) do={
:log warning $text
/tool fetch url="https://api.telegram.org/$botID/sendmes ... text=$text" keep-result=no}
:return []
}
:execute {
:global wifiEventHandler
/interface wireless registration-table print follow-only where [$wifiVoiceEventHandler "wifi registration" $comment $interface]
}
Андрей, можно использовать тот же пример. При исчезновении записи в зависимости от таблицы часть параметров утрачиваются (становятся пустыми), по этому свойству можно различить произошло появление новой записи или удаление записи. Я ввёл в пример проверку параметра $3 (имя интерфейса wifi в данном случае). Как только клиент отключается все поля в его записи таблицы становятся пустыми, в том числе и название интерфейса. В данном примере при подключении уходит сообщение в Телегу, при отключении - ничего не делается. Ты можешь сделать отправку разных сообщений.
В таблице Bridge сам попробуй.
фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
viewtopic.php?f=14&t=13947
- drpioneer
- Сообщения: 175
- Зарегистрирован: 30 май 2013, 10:20
В целом работает как ты описал, правда натурные испытания показали, что не всегда и не везде...
Меняется только логика работы - те же куски кода перетасовываются в ином порядке. С чего ему стать короче?
Использование событийной логики уместно, когда требуется моментальная реакция на события. Платой за это выступят постоянно крутящиеся процессы в памяти. К тому же существует вероятность эти процессы случайно грохнуть или наплодить, если их не контролировать.
Считаю, что для мониторинга сетевых клиентов эти изыскания ни к чему.
-
- Сообщения: 1657
- Зарегистрирован: 15 сен 2017, 09:03
Отпадает надобность перебирать все записи журнала циклами :foreach.
Поиск новых записей ложится на саму систему, а это быстрее.
Процесс висит и выполняется в многопоточном режиме - это надежнее.
От "наплодить" процессов спасает простая вещь - если процесс уже есть, аналогичный - убить. Делается по .id в Ros6 и :jobname в Ros7.
Скрипт может стать короче, ну может не в десять раз но в двое точно.
Поиск новых записей ложится на саму систему, а это быстрее.
Процесс висит и выполняется в многопоточном режиме - это надежнее.
От "наплодить" процессов спасает простая вещь - если процесс уже есть, аналогичный - убить. Делается по .id в Ros6 и :jobname в Ros7.
Скрипт может стать короче, ну может не в десять раз но в двое точно.
фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
viewtopic.php?f=14&t=13947