Простой счетчик трафика с отчетами.

Здесь выкладываем скрипты
Ответить
Galeoner
Сообщения: 10
Зарегистрирован: 11 июл 2012, 14:27

22 сен 2019, 12:23

Добрый день!
В век безлимитных интернетов столкнулся с ситуацией когда нужно считать трафик). Расположенный в датацентре сервер решили вывести на большую скорость, но предоставляемый гигабит в секунду лимитировали 10ТБ... На всякий решил прикрутить счетчик трафика. В качестве роутера используется Mikrotik CHR. Для получения отчетов использую телеграмм. Огромная благодарность за напутствие и вдохновение сайт asp24.ru (не реклама)
И так, приступим...
Цель получить ежедневный и ежемесячный отчет по скачанному-переданному трафику и его суммы.
Не буду рассказывать как прикручивать телеграмм бот и чат айди, интернет завален инструкциями.
Что будем делать? Создаем 1 простую очередь (/queue/simple) у меня интерфейс интернета ether1
 1.Создание очереди
/queue simple
add dst=ether1 name=TrafficCounter queue=default/default target="" total-queue=default
Далее добавляем скрипт в планировщик который считает трафик в любой заданный вами диапазон и сохраняет его как комментарий на себе же). Данный скрипт считывает значения очереди из первого пункта и сохраняет их. Имя задания в планировщике "TrafficCounters", можете поменять его на др. но соответственно измените первую переменную в скрипте.
 2.Скрипт "счетчик"
:local SchedulerName "TrafficCounters"
:local CurTraffic [/queue simple get "TrafficCounter" byte]
:local CurUp [:pick $CurTraffic 0 ([:find $CurTraffic "/"])]
:local CurDown [:pick $CurTraffic ([:find $CurTraffic "/"]+1) [:len $CurTraffic]]
:local CurUpM ($CurUp / 1048576)
:local CurDownM ($CurDown / 1048576)
:local CurTotal ($CurUpM + $CurDownM)

/queue simple reset-counters [find where name="TrafficCounter"]

:local PrevTraffic [/system scheduler get [find where name="$SchedulerName"] comment]
:local PrevUp [:pick $PrevTraffic 0 ([:find $PrevTraffic "/"])]
:local PrevDown [:pick $PrevTraffic ([:find $PrevTraffic "/"]+1) [:len $PrevTraffic]]
:local PrevUpM ($PrevUp / 1048576)
:local PrevDownM ($PrevDown / 1048576)
:local PrevTotal ($PrevUpM + $PrevDownM)

:local NewUp ($CurUp + $PrevUp)
:local NewDown ($CurDown + $PrevDown)
:local NewUpM ($NewUp / 1048576)
:local NewDownM ($NewDown / 1048576)
:local NewTraffic ($NewUp."/".$NewDown)
/system scheduler set [find where name="TrafficCounters"] comment="$NewTraffic"
#:log warning ("Traffic: Previcios Up is ".$PrevUpM."Mb\nTraffic: Previcios Down is ".$PrevDownM."Mb\nCurrent Up is ".$CurUpM."Mb\nCurrent Down is ".$CurDownM."Mb\nNew Up is ".$NewUpM."Mb\nNew Down is ".$NewDownM."Mb")
Ну и итог данного баловства - отчет. Заводим еще одно задание в планировщик с периодом в один день (каждый на свое усмотрение может изменить параметр)
Что он делает?
1) берет комментарий из "TrafficCounters" и плюсует к своим показателям,
2) очищает в конце дня комментарий "TrafficCounters" и в конце месяца очищает свой счетчик
3) отправляет в телегу ежедневно отчет с трафиком за день и за весь период с начала, в конце месяца итоговый отчет
Даем название ему "TrafficReport" указываем Telegram Api key и Chat ID и все работает.
 3. Скрипт "отчет"
###################################
:local TGBotID "Telegram Bot Api Key"
:local TGChatID "Telegram Chat ID"
###################################
:local DayToReport "01"
:local StartTime "00:00:00"
:local FinishTime "00:15:00"
:local SchedCountName "TrafficCounters"
:local SchedRepName "TrafficReport"
:local ident [/system identity get name]

:local PrevDayTraffic [/system scheduler get [find where name="$SchedCountName"] comment]
:local PrevDayUp [:pick $PrevDayTraffic 0 ([:find $PrevDayTraffic "/"])]
:local PrevDayDown [:pick $PrevDayTraffic ([:find $PrevDayTraffic "/"]+1) [:len $PrevDayTraffic]]
:local PrevDayUpM ($PrevDayUp / 1048576)
:local PrevDayDownM ($PrevDayDown / 1048576)
:local PrevDayTotal ($PrevDayUpM + $PrevDayDownM)

:local CounterTraffic [/system scheduler get [find where name="$SchedRepName"] comment]
:local CounterUp [:pick $CounterTraffic 0 ([:find $CounterTraffic "/"])]
:local CounterDown [:pick $CounterTraffic ([:find $CounterTraffic "/"]+1) [:len $CounterTraffic]]
:local CounterUpM ($CounterUp / 1048576)
:local CounterDownM ($CounterDown / 1048576)
:local CounterTotal ($CounterUpM + $CounterDownM)

:local MonthUp ($CounterUp + $PrevDayUp)
:local MonthDown ($CounterDown + $PrevDayDown)
:local MonthUpM ($MonthUp / 1048576)
:local MonthDownM ($MonthDown / 1048576)
:local MonthTotal ($MonthUpM + $MonthDownM)
:local MonthTraffic ($MonthUp."/".$MonthDown)

:local CurTime [/sys clock get time]
:local CurDate [/sys clock get date]
:local day [:pick $CurDate 4 6 ]
:local mounth [:pick $CurDate 0 3 ]
:local months {"jan"="01";"feb"="02";"mar"="03";"apr"="04";"may"="05";"jun"="06";"jul"="07";"aug"="08";"sep"="09";"oct"=10;"nov"=11;"dec"=12}
:set mounth (:$months->$mounth)
:local year [:pick $CurDate 7 11 ]
:local CurDate ($day.".".$mounth.".".$year)
:local CurDateTime ($CurDate." ".$CurTime)

if ($day = $DayToReport) do={
:log warning ("Send traffic start")
/tool fetch url="https://api.telegram.org/bot$TGBotID/se ... pre>$ident Server</pre>%0A<b> Daily Traffic Report</b>%0A<code>================================</code>%0A<code> $CurDateTime</code>%0A<code>================================</code>%0A<code> Upload: $PrevDayUpM Mb</code>%0A<code>Download: $PrevDayDownM Mb</code>%0A<code> Total: $PrevDayTotal Mb</code>%0A<code>================================</code>%0Axxx" keep-result=no
:delay 1
/tool fetch url="https://api.telegram.org/bot$TGBotID/se ... pre>$ident Server</pre>%0A<b> Monthly Traffic Report</b>%0A<code>================================</code>%0A<code> $CurDateTime</code>%0A<code>================================</code>%0A<code> Upload: $MonthUpM Mb</code>%0A<code>Download: $MonthDownM Mb</code>%0A<code> Total: $MonthTotal Mb</code>%0A<code>================================</code>%0Axxx" keep-result=no
/system scheduler set [find where name="$SchedRepName"] comment="0/0"
/system scheduler set [find where name="$SchedCountName"] comment="0/0"
} else={
:log warning ("Not date interval")
/tool fetch url="https://api.telegram.org/bot$TGBotID/se ... pre>$ident Server</pre>%0A<b> Daily Traffic Report</b>%0A<code>================================</code>%0A<code> $CurDateTime</code>%0A<code>================================</code>%0A<code> Previous day</code>%0A<code>--------------------------------</code>%0A<code> Upload: $PrevDayUpM Mb</code>%0A<code>Download: $PrevDayDownM Mb</code>%0A<code> Total: $PrevDayTotal Mb</code>%0A<code>================================</code>%0A<code> From period start</code>%0A<code>--------------------------------</code>%0A<code> Upload: $MonthUpM Mb</code>%0A<code>Download: $MonthDownM Mb</code>%0A<code> Total: $MonthTotal Mb</code>%0A<code>================================</code>%0Axxx" keep-result=no
/system scheduler set [find where name="$SchedCountName"] comment="0/0"
/system scheduler set [find where name="$SchedRepName"] comment="$MonthTraffic"
}
Постарался его красиво оформить) Не судите строго!


zakir
Сообщения: 4
Зарегистрирован: 14 ноя 2019, 12:57

20 янв 2020, 11:09

Можно ли данный скрипт прописать для получения по электронной почте?


Ответить