Здравствуйте.
У меня в "подопечных" несколько точек на спутниковом интернете. Приходится постоянно следить за объемом трафика, дабы не упала телефонная связь по sip. Я пробовал использовать mikro-bill, в принципе очень гибкая штука но никто сейчас не рассчитывает, что трафик надо считать помегабайтно, да еще и входящий\исходящий. Ну и если сервер с биллингом умирает - трафик никто не ограничивает, что черевато. А в тайге с электричеством и бесперебойниками может произойти всякое.
Таким образом я пришел к системе скриптов следующего вида:
1) скрипт, обходящий очереди (/queue simple) и там, где в комментариях прописан трафик он сравнивает число из комментариев со счетчиком очереди, в случае необходимости выключает запись клиента в arp таблице (на точках устройства, не занесенные в эту таблицу, не имеют доступа в интернет, на bridge-local выставлен arp reply-only). Если трафик очереди меньше - включает. Скрипт оббегает все имеющиеся очереди, раньше на каждую очередь был свой скрипт, но так надежнее.
Избыток put остался со времен отладки скрипта :)
:local n;
:local upload;
:local download;
:local totaltraf;
:local realtraff;
:local limit;
:local clientip;
:local clientiparray;
:for y from=0 to=([/queue simple print count-only]-1) do={
:put "==============================================================================================";
:put $y;
:set $upload 0;
:set $download 0;
:set $totaltraf 0;
:set $realtraff 0;
:set $limit 0;
:set n [/queue simple get number=$y name];
:put $n;
:set $realtraff [/queue simple get "$n" byte];
:put $realtraff;
:set $limit [/queue simple get "$n" comment];
:set $upload [:pick $realtraff 0 ([:find $realtraff "/"])];
:put ($upload / 1048576);
:set download [:pick $realtraff ([:find $realtraff "/"]+1) [:len $realtraff]];
:put ($download / 1048576 );
:set totaltraf (($upload + $download) / 1048576 + $totaltraf);
:put ("traffic: ".$totaltraf);
:put ("limit: ".$limit);
:if (limit != "no") do={:if ($totaltraf >= $limit) do={:set clientiparray [/queue simple get number=$y target]; for i from 0 to=([:len [/queue simple get number=$y target]]-1) do={:set clientip [:pick $clientiparray $i]; /ip arp set [find address=[:pick $clientip 0 [:find $clientip "/32"]]] disable=yes; put "zablokirovano";}} else={:set clientiparray [/queue simple get number=$y target]; for i from 0 to=([:len [/queue simple get number=$y target]]-1) do={:set clientip [:pick $clientiparray $i];:set clientip [:pick $clientip 0 [find $clientip "/32"]]; /ip arp set [find address=$clientip] disable=no; put "razblokirovano";}}
}}
2) скрипт, собирающий с очередей статистику с очередей.
:local inFile;
:local toFile;
:local upload;
:local download;
:local totaltraf;
:local realtraff;
:local limit;
:local name [/system identity get name];
:for y from=0 to=([/queue simple print count-only]-1) do={
:set realtraff [/queue simple get number=$y byte];
:set upload [:pick $realtraff 0 ([:find $realtraff "/"])];
:set download [:pick $realtraff ([:find $realtraff "/"]+1) [:len $realtraff]];
:set totaltraf (($upload + $download) / 1048576);
:set inFile [/queue simple get number=$y name];
:put "$inFile\r\t\t$totaltraf\tMB";
:set toFile "$toFile\r\n$inFile\r\t\t$totaltraf\tMB\n";
};
:local date [/system clock get date];
:local filename ($name."_"."traffic"."_".[:pick $date 7 11] . [:pick $date 0 3] . [:pick $date 4 6].".log" );
:local date [/system clock get date];
:local time [/system clock get time];
:local datetime ("$date\r\n$time");
/file print file="$filename";
:put "delay on one";
:delay delay-time=2;
/file set "$filename" contents="$datetime\r\n$toFile";
:delay delay-time=2;
/tool fetch address=192.168.1.36 src-path="$filename" user=mikrotik mode=ftp password=***** dst-path="home/trafficstat/$filename" upload=yes;
К сожалению, микротик не может оперировать файлами длиннее 4096 байт, что слегка неудобно, но пока хватает.
3) уже не скрипт, а просто команда в шедуллере - /system reboot;
Перезагружает микротик и сбрасывает счетчики. Я знаю, что счетчики сбрасываются простой командой, но так оно надежнее, на мой взгляд. И перезагрузки время от времени микротику нужны, бывают виснут они у меня.
Так вот, в чем вопрос. На данный момент микротик прекрасно справляется с подсчетом трафика и есть только один, существенный, недостаток в этой системе. В случае перезагрузки микротика статистика по трафику сбрасывается, соответственно микротик начинает копить данные с нуля. Это может быть чревато выходом за суточный лимит трафика, а перезагрузить микротик так или иначе на точке не проблема, да и свет периодически гаснет.
Я никак не могу продумать алгоритм сохранения суточной статистики по трафику в файлы на микротике, дабы он мог "не оглядываться" на перезагрузки. Может, вы что подскажете?