Скрипт отслеживания состояния сетевых клиентов

Здесь выкладываем скрипты
Правила форума
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
Аватара пользователя
drpioneer
Сообщения: 175
Зарегистрирован: 30 май 2013, 10:20

Приветствую!
Для своих нужд написал скрипт мониторинга состояния клиентов сети и теперь делюсь с сообществом... Скрипт подразумевает работу на устройстве с поднятыми сетевым мостом и DHCP-сервером, из которых черпается информация о клиентах сети и их активности (устройство в роли типового домашнего шлюза, на котором подняты все необходимые сетевые службы).
Во время работы скрипт формирует в памяти устройства базу клиентов и актуализирует её при каждом запуске. В случае смены статуса сетевого клиента, скрипт отправляет соответствующую запись в журнал устройства. Для дальнейшей отправки уведомлений в Телеграм можно задействовать скрипт TLGRM .
В скрипте имеется вспомогательная база клиентов, в которую при необходимости можно внести удобочитаемые имена клиентов или таких клиентов, которых нужно игнорировать.
Обкатка скрипта проводилась на актуальных версиях RouterOS 6.49.++ и 7.14.++ . Тело скрипта необходимо закинуть в 'System/Scripts' и настроить запуск по расписанию из 'System/Scheduler' с периодом 1 минуту.
Уверен, что скрипт не лишён косяков - замечания и конструктивная критика приветствуются!
Если скрипт Вам зашёл - отметьте его звездочкой. Вам не сложно, а мне приятно!
Последний раз редактировалось drpioneer 04 сен 2024, 11:50, всего редактировалось 2 раза.


Sertik
Сообщения: 1657
Зарегистрирован: 15 сен 2017, 09:03

Дружище ! Теперь вместо всего этого можно использовать /ip dhcp server liase print follow-only where [$sendToTelegram $name .... итд ...
Скрипт выходит раз в 10 короче

viewtopic.php?t=16951


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
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".


Sertik
Сообщения: 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
Аватара пользователя
drpioneer
Сообщения: 175
Зарегистрирован: 30 май 2013, 10:20

Sertik писал(а): 04 сен 2024, 15:01 Пример для таблицы wifi-registration:
Представленный пример демонстрирует лишь обработку появления новых элементов в таблице.

Остаются открытыми вопросы:
  • как отследить исчезновение старых элементов из таблицы?
  • как предотвратить одновременный запуск нескольких копий процесса отслеживания при запуске представленного примера несколько раз подряд?
  • как обнаружить аварийно (или не аварийно) завершенный процесс отслеживания?
  • как повторно стартовать аварийно (или не аварийно) завершенный процесс отслеживания?
После решения этих вопросов можно будет рассуждать об использовании событийной логики работы и сокращении кода в 10 раз...


Sertik
Сообщения: 1657
Зарегистрирован: 15 сен 2017, 09:03

- При исчезновении записи из таблицы этот процесс тоже срабатывает
- Запускать его несколько раз не нужно. Система сама контролирует процесс
- Аварийно процесс не завершается никогда, если в скрипте нет ошибок т.к. его контролирует сама РОС. Он стабилен и постоянно висит в ожидании работы, в перезапуске необходимости не бывает (до перезагрузки роутера).


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Аватара пользователя
drpioneer
Сообщения: 175
Зарегистрирован: 30 май 2013, 10:20

Sertik писал(а): 05 сен 2024, 11:26 - При исчезновении записи из таблицы этот процесс тоже срабатывает
Нужен пример обработки исчезновения устаревшей записи из таблицы 'Bridge/Hosts'

Первоисточник гласит про отслеживание только новых записей:
follow-only >> print and track only new entries until ctrl-c is pressed, very useful when viewing log entries.


Sertik
Сообщения: 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 сам попробуй.


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Аватара пользователя
drpioneer
Сообщения: 175
Зарегистрирован: 30 май 2013, 10:20

Sertik писал(а): 06 сен 2024, 12:04 ...
При исчезновении записи в зависимости от таблицы часть параметров утрачиваются (становятся пустыми), по этому свойству можно различить произошло появление новой записи или удаление записи.
...
В целом работает как ты описал, правда натурные испытания показали, что не всегда и не везде...
Sertik писал(а): 04 сен 2024, 10:32 ...
Скрипт выходит раз в 10 короче
...
Меняется только логика работы - те же куски кода перетасовываются в ином порядке. С чего ему стать короче?

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


Sertik
Сообщения: 1657
Зарегистрирован: 15 сен 2017, 09:03

Отпадает надобность перебирать все записи журнала циклами :foreach.
Поиск новых записей ложится на саму систему, а это быстрее.
Процесс висит и выполняется в многопоточном режиме - это надежнее.
От "наплодить" процессов спасает простая вещь - если процесс уже есть, аналогичный - убить. Делается по .id в Ros6 и :jobname в Ros7.
Скрипт может стать короче, ну может не в десять раз но в двое точно.


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Ответить