Привет. Недавно нам понадобился скрипт, который бы сигнализировал, если интерфейс передаёт трафик больше X. Всё работало нормально с traffic-monitor… но стоило появиться пиковому трафику всего на 1 секунду — и мне тут же пришло уведомление. Поэтому я сделал скрипт, который запускается через traffic-monitor и начинает анализ. Если условия выполняются — отправляет отчёт на Telegram-аккаунт. И решил им поделиться. Так что те, кому нужно что-то подобное, смогут использовать это легко.
Пример учитывает:
ether1-wan как интерфейс
WAN как алиас интерфейса
100Mbps — лимит трафика
90 секунд — длительность непрерывного трафика для отчёта
10 минут — интервал между повторными отчётами (если трафик продолжается)
wan-monitor — имя триггера (traffic-monitor)
monitor-ether1 — имя скрипта
Этот скрипт проверяет входящий трафик (то есть RX).
Вам нужно создать traffic-monitor вот так:
Это будет триггером для запуска скрипта
/tool traffic-monitor
add interface=ether1-wan name=wan-monitor on-event=monitor-ether1 traffic=received threshold=100M
Теперь создайте скрипт в /system script с выбранным вами именем и вставьте в него следующий код (замените переменные по необходимости):
# ------------------- header -------------------------------------------
# Сценарий анализа трафика и отчёт в Telegram
# Автор: Andre Almeida
# Тестировался на RouterOS 6.40.3
# Создан 23/10/2017
# Пожалуйста, не удаляйте этот заголовок, если используете скрипт. Спасибо
# ------------------- end header ---------------------------------------
#-----------------------------------------------------------------------
# ЗДЕСЬ ОПРЕДЕЛИТЕ ВАШИ ПЕРЕМЕННЫЕ
#-----------------------------------------------------------------------
# Имя интерфейса для мониторинга
:local intmon "ether1-wan";
# Дружелюбное имя интерфейса
:local ifalias "WAN";
# Лимит трафика в Mbps
:local limittraffic "100";
# Время в секундах для непрерывного превышения трафика для отчёта
:local limittime "90";
# Интервал между отчётами в минутах
:local reportinterval "10";
# Имя триггера из /tool traffic-monitor
:local triggers "wan-monitor";
# ChatID в Telegram, куда будут слаться отчёты
:local chat "0123456789";
# API токен Telegram BOT
:local bot "01234567:AbcdEfGhijklmnOPQrstuvXWY-z";
#-----------------------------------------------------------------------
# ДАЛЬШЕ НЕ РЕДАКТИРУЙТЕ
#-----------------------------------------------------------------------
# Отключаем триггер
/tool traffic-monitor set [find name="$triggers"] disabled=yes;
#-----------------------------------------------------------------------
# Начинается сам скрипт анализа трафика
#-----------------------------------------------------------------------
# Сбрасываем счётчик
:local counter 0;
:local recbits;
# Получаем текущее значение трафика
:set $recbits ([/interface monitor-traffic [find name="$intmon"] as-value once]->"rx-bits-per-second");
:while ($recbits > ($limittraffic * 1000000)) do={
:while ($counter < $limittime) do={
# Обновляем трафик
:set $recbits ([/interface monitor-traffic [find name="$intmon"] as-value once]->"rx-bits-per-second");
# Проверяем, что трафик всё ещё высокий
:if ($recbits > ($limittraffic * 1000000)) do={
:set $counter ( $counter + 1);
:delay 1s;} else={
:set $counter ($limittime + 10);
};
}; # <--- Конец второго цикла while
# Снова проверяем трафик
:set $recbits ([/interface monitor-traffic [find name="$intmon"] as-value once]->"rx-bits-per-second");
# Проверяем счётчик
:if ($counter < ($limittime + 10)) do={
# Сбрасываем счётчик
:set $counter 0;
# Отправляем сообщение в Telegram, если условие выполнено
# НЕ ЗАМЕНЯЙТЕ НИЧЕГО ЗДЕСЬ
# Формируем сообщение
:local initel "https://api.telegram.org/bot";
:local endtel "&text=";
:local newline "%0D%0A";
:local who "$[/system identity get name]";
:local datetime "$[/system clock get date] $[/system clock get time]";
:local message "Интерфейс $ifalias превысил $newline $limittraffic Mbps в течение $limittime секунд$newline Текущий трафик $($recbits / 1000000) Mbps";
:local messagefinal " $who ОТЧЁТ$newline $newline $message $newline $newline $datetime $newline $newline Если трафик сохранится, новый отчёт придёт через $reportinterval минут";
/tool fetch url="$initel$bot/sendMessage\?chat_id=$chat$endtel$messagefinal" keep-result=no;
:log warning "Интерфейс $ifalias превысил $limittraffic Mbps на протяжении $limittime секунд -- Текущий трафик $($recbits / 1000000) Mbps";
:delay ((($reportinterval * 60) - $limittime) . s);
}; # <--- Конец проверки счётчика
}; # <--- Конец внешнего цикла while
# Включаем триггер обратно
/tool traffic-monitor set [find name="$triggers"] disabled=no;
#-----------------------------------------------------------------------
# К О Н Е Ц
#-----------------------------------------------------------------------
Для каждого интерфейса, который хотите мониторить, переименуйте триггер в уникальное имя и измените его в скрипте. Отчёты будут приходить на ваш Telegram-аккаунт (тот, что указан в chat ID) в таком виде:
Пример учитывает:
ether1-wan как интерфейс
WAN как алиас интерфейса
100Mbps — лимит трафика
90 секунд — длительность непрерывного трафика для отчёта
10 минут — интервал между повторными отчётами (если трафик продолжается)
wan-monitor — имя триггера (traffic-monitor)
monitor-ether1 — имя скрипта
Этот скрипт проверяет входящий трафик (то есть RX).
Вам нужно создать traffic-monitor вот так:
Это будет триггером для запуска скрипта
/tool traffic-monitor
add interface=ether1-wan name=wan-monitor on-event=monitor-ether1 traffic=received threshold=100M
Теперь создайте скрипт в /system script с выбранным вами именем и вставьте в него следующий код (замените переменные по необходимости):
# ------------------- header -------------------------------------------
# Сценарий анализа трафика и отчёт в Telegram
# Автор: Andre Almeida
# Тестировался на RouterOS 6.40.3
# Создан 23/10/2017
# Пожалуйста, не удаляйте этот заголовок, если используете скрипт. Спасибо
# ------------------- end header ---------------------------------------
#-----------------------------------------------------------------------
# ЗДЕСЬ ОПРЕДЕЛИТЕ ВАШИ ПЕРЕМЕННЫЕ
#-----------------------------------------------------------------------
# Имя интерфейса для мониторинга
:local intmon "ether1-wan";
# Дружелюбное имя интерфейса
:local ifalias "WAN";
# Лимит трафика в Mbps
:local limittraffic "100";
# Время в секундах для непрерывного превышения трафика для отчёта
:local limittime "90";
# Интервал между отчётами в минутах
:local reportinterval "10";
# Имя триггера из /tool traffic-monitor
:local triggers "wan-monitor";
# ChatID в Telegram, куда будут слаться отчёты
:local chat "0123456789";
# API токен Telegram BOT
:local bot "01234567:AbcdEfGhijklmnOPQrstuvXWY-z";
#-----------------------------------------------------------------------
# ДАЛЬШЕ НЕ РЕДАКТИРУЙТЕ
#-----------------------------------------------------------------------
# Отключаем триггер
/tool traffic-monitor set [find name="$triggers"] disabled=yes;
#-----------------------------------------------------------------------
# Начинается сам скрипт анализа трафика
#-----------------------------------------------------------------------
# Сбрасываем счётчик
:local counter 0;
:local recbits;
# Получаем текущее значение трафика
:set $recbits ([/interface monitor-traffic [find name="$intmon"] as-value once]->"rx-bits-per-second");
:while ($recbits > ($limittraffic * 1000000)) do={
:while ($counter < $limittime) do={
# Обновляем трафик
:set $recbits ([/interface monitor-traffic [find name="$intmon"] as-value once]->"rx-bits-per-second");
# Проверяем, что трафик всё ещё высокий
:if ($recbits > ($limittraffic * 1000000)) do={
:set $counter ( $counter + 1);
:delay 1s;} else={
:set $counter ($limittime + 10);
};
}; # <--- Конец второго цикла while
# Снова проверяем трафик
:set $recbits ([/interface monitor-traffic [find name="$intmon"] as-value once]->"rx-bits-per-second");
# Проверяем счётчик
:if ($counter < ($limittime + 10)) do={
# Сбрасываем счётчик
:set $counter 0;
# Отправляем сообщение в Telegram, если условие выполнено
# НЕ ЗАМЕНЯЙТЕ НИЧЕГО ЗДЕСЬ
# Формируем сообщение
:local initel "https://api.telegram.org/bot";
:local endtel "&text=";
:local newline "%0D%0A";
:local who "$[/system identity get name]";
:local datetime "$[/system clock get date] $[/system clock get time]";
:local message "Интерфейс $ifalias превысил $newline $limittraffic Mbps в течение $limittime секунд$newline Текущий трафик $($recbits / 1000000) Mbps";
:local messagefinal " $who ОТЧЁТ$newline $newline $message $newline $newline $datetime $newline $newline Если трафик сохранится, новый отчёт придёт через $reportinterval минут";
/tool fetch url="$initel$bot/sendMessage\?chat_id=$chat$endtel$messagefinal" keep-result=no;
:log warning "Интерфейс $ifalias превысил $limittraffic Mbps на протяжении $limittime секунд -- Текущий трафик $($recbits / 1000000) Mbps";
:delay ((($reportinterval * 60) - $limittime) . s);
}; # <--- Конец проверки счётчика
}; # <--- Конец внешнего цикла while
# Включаем триггер обратно
/tool traffic-monitor set [find name="$triggers"] disabled=no;
#-----------------------------------------------------------------------
# К О Н Е Ц
#-----------------------------------------------------------------------
Для каждого интерфейса, который хотите мониторить, переименуйте триггер в уникальное имя и измените его в скрипте. Отчёты будут приходить на ваш Telegram-аккаунт (тот, что указан в chat ID) в таком виде:
