скриптинг (общее, вопросы 'обо' всем)

Раздел для тех, кто начинает знакомиться с MikroTik
Правила форума
Как правильно оформить вопрос.
Прежде чем начать настройку роутера, представьте, как это работает. Попробуйте почитать статьи об устройстве интернет-сетей. Убедитесь, что всё, что Вы задумали выполнимо вообще и на данном оборудовании в частности.
Не нужно изначально строить Наполеоновских планов. Попробуйте настроить простейшую конфигурацию, а усложнения добавлять в случае успеха постепенно.
Пожалуйста, не игнорируйте правила русского языка. Отсутствие знаков препинания и неграмотность автора топика для многих гуру достаточный повод проигнорировать топик вообще.

1. Назовите технологию подключения (динамический DHCP, L2TP, PPTP или что-то иное)
2. Изучите темку "Действия до настройки роутера".
viewtopic.php?f=15&t=2083
3. Настройте согласно выбранного Вами мануала
4. Дочитайте мануал до конца и без пропусков, в 70% случаев люди просто не до конца читают статью и пропускают важные моменты.
5. Если не получается, в Winbox открываем терминал и вбиваем там /export hide-sensitive. Результат в топик под кат, интимные подробности типа личных IP изменить на другие, пароль забить звездочками.
6. Нарисуйте Вашу сеть, рисунок (схему) сюда. На словах может быть одно, в действительности другое.
Аватара пользователя
podarok66
Модератор
Сообщения: 4355
Зарегистрирован: 11 фев 2012, 18:49
Откуда: МО

При чем здесь, работает или нет! В первую руку Вы должны заботиться о читаемости кода. Вы сами опубликовали его в варианте в одну строку. Вот теперь представьте, что прошел год или два. И уже ничего не помните. И скрипт в пару-тройку страниц. И не один, а их штук пять. И все друг от друга зависят, используют общие переменные. Вот там и запоёте об этих значках и правилах.
Уважайте свой труд :-):


Мануалы изучил и нигде не ошибся? Фаервол отключил? Очереди погасил? Витая пара проверена? ... Тогда Netinstal'ом железку прошей и настрой ее заново. Что, все равно не фурычит? Тогда к нам. Если не подскажем, хоть посочувствуем...
-user-
Сообщения: 30
Зарегистрирован: 21 мар 2013, 10:05

podarok66 писал(а):...

ок, учёл :-):


Аватара пользователя
podarok66
Модератор
Сообщения: 4355
Зарегистрирован: 11 фев 2012, 18:49
Откуда: МО

Так, и чтобы не плодить ненужные темы, сам задам вопрос тем, кто в курсе.
Столкнулся с задачей проверки на наличие файла на микротике. Вот такой код:

Код: Выделить всё

{:local ytr [/file get [/file find name=rx.txt] name]; :put $ytr

Если файла не существует, в ответ получаю стандартный

Код: Выделить всё

no such item

Но данный ответ невозможно использовать в скрипте. Подскажите обходное решение
* Проверка на наличие файла
* Если есть, одни действия
* Если нет, действия другие...
В пятой версии вроде бы прокатывало что-то типа:

Код: Выделить всё

:if ([/file get [/file find name=rx.txt] content]!="nil") do={...
} else={...
}

Сейчас же у меня эта связка не работает. Есть ли выход?


Мануалы изучил и нигде не ошибся? Фаервол отключил? Очереди погасил? Витая пара проверена? ... Тогда Netinstal'ом железку прошей и настрой ее заново. Что, все равно не фурычит? Тогда к нам. Если не подскажем, хоть посочувствуем...
-user-
Сообщения: 30
Зарегистрирован: 21 мар 2013, 10:05

podarok66 писал(а):наличие файла
если я правильно понял задачу, то вроде это делает то, что нужно:

Код: Выделить всё

:if ([:len [/file find name=rx.txt]]>0) do={:put "good"} else={:put "bad"}


тут конечно, :len [...] дает результат немножко не тот, который ожидал я, но конечный результат одинаков.

PS: по идее это могло быть попроще и с false/true - но я не понял как они в МТ работают, без явного их "присвоения", загодя до проверки (а такой вариант уже проще НЕ становится)...


Аватара пользователя
podarok66
Модератор
Сообщения: 4355
Зарегистрирован: 11 фев 2012, 18:49
Откуда: МО

-user- писал(а):тут конечно, :len [...] дает результат немножко не тот, который ожидал я, но конечный результат одинаков.

Нет-нет, именно этот результат мне и нужен. Спасибо огромное!!! Пойду писать дальше, еще много осталось... :-)
Если все заработает, как хотелось бы или приближенно к желаемому, скриптом поделюсь непременно. Только проверки ждать пару месяцев надо, не меньше :-) Тут уж не обессудьте, в противном случае смысла нет в скрипте...


Мануалы изучил и нигде не ошибся? Фаервол отключил? Очереди погасил? Витая пара проверена? ... Тогда Netinstal'ом железку прошей и настрой ее заново. Что, все равно не фурычит? Тогда к нам. Если не подскажем, хоть посочувствуем...
Аватара пользователя
podarok66
Модератор
Сообщения: 4355
Зарегистрирован: 11 фев 2012, 18:49
Откуда: МО

Так, в черновую набросал скриптик.
 Скриптик, так сказать...

Код: Выделить всё

{
:global temprx ;
:global temptx ;
:local rx [/interface get [find name=ether2] rx-byte]  ;
:local tx [/interface get [find name=ether2] tx-byte]  ;
:if ([:len [/file find name=rx.txt]]>0) do={/file set [/file find name=rx.txt] content=(( $rx - $temprx ) + [/file get [find name=rx.txt] content]) ;
}   else={/file print file=rx.txt;
:delay 5 ;
/file set [/file find name=rx.txt] content=$rx ;
}
:if ([:len [/file find name=tx.txt]]>0) do={/file set [/file find name=tx.txt] content=(( $tx - $temptx ) + [/file get [find name=tx.txt] content]) ;
}   else={/file print file=tx.txt ;
:delay 5 ; 
/file set [/file find name=tx.txt] content=$tx ;
}
:set temprx $rx ;
# :put "temprx=$temprx" ;
:set temptx $tx ;
# :put "temptx=$temptx" ;
:local rdata "01"
:local year [:pick [system clock get date] 7 11 ];
:local months [:toarray "jan,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec"] ;

:local month [:pick [system clock get date] 0 3 ];
:local month2 ;

:for mindex from=0 to=[:len $months] do={
  :if ([:pick $months $mindex] = $month) do={:set month2 ($mindex-1) }
};
:if ($month2 = -1) do={:set month2 11 ; :set year ([:pick [system clock get date] 7 11 ] - 1) };
# :put [:pick $months $month2];
# :put   [$year];
:if  ([:pick [system clock get date] 4 6 ] = $rdata) do={:local smtpserv [:resolve "smtp.gmail.com"];
:local Eaccount "MYADDRESS@gmail.com";
:local pass "PASSWORD";
:local reporttheme  ("Traffic Report " .  [:pick [/system clock get date] 7 11] . "-" . [:pick [/system clock get date] 0 3] . "-" . [:pick [/system clock get date] 4 6]);
:local rxreport [/file get [/file find name=rx.txt] content];
:local simplKbrxreport ($rxreport / 1024);
:local lowKbrxreport ((($rxreport - ($simplKbrxreport * 1024)) * 1000) / 1024);
:local Kbrxreport ("$[$simplKbrxreport]".",".[:pick "$[$lowKbrxreport]" 0 2] );
# :put $Kbrxreport
:local simplMbrxreport ($rxreport / 1048576);
:local lowMbrxreport  ((($rxreport - ($simplMbrxreport * 1048576)) *1000000) /  1048576);
:local Mbrxreport ("$[$simplMbrxreport]".",".[:pick "$[$lowMbrxreport]" 0 2] );
# :put $Mbrxreport;
:local simplGbrxreport ($rxreport / 1073741824);
:local lowGbrxreport  ((($rxreport - ($simplGbrxreport * 1073741824)) *1000000000) /  1048576);
:local Gbrxreport ("$[$simplGbrxreport]".",".[:pick "$[$lowGbrxreport]" 0 2] );
# :put $Gbrxreport;
:local txreport [/file get [/file find name=tx.txt] content];
:local simplKbtxreport ($txreport / 1024);
:local lowKbtxreport ((($txreport - ($simplKbtxreport * 1024)) * 1000) / 1024);
:local Kbtxreport ("$[$simplKbtxreport]".",".[:pick "$[$lowKbtxreport]" 0 2] );
# :put $Kbtxreport;
:local simplMbtxreport ($txreport / 1048576);
:local lowMbtxreport  ((($txreport - ($simplMbtxreport * 1048576)) *1000000) /  1048576);
:local Mbtxreport ("$[$simplMbtxreport]".",".[:pick "$[$lowMbtxreport]" 0 2] );
# :put $Mbtxreport;
:local simplGbtxreport ($txreport / 1073741824);
:local lowGbtxreport  ((($txreport - ($simplGbtxreport * 1073741824)) *1000000000) /  1048576);
:local Gbtxreport ("$[$simplGbtxreport]".",".[:pick "$[$lowGbtxreport]" 0 2] );
# :put $Gbtxreport;
/file remove [find name=report.txt];
:delay 3;
/file print file=report.txt;
:delay 5;
/file set [find name=report.txt] content=("Traffic Report for " . [:pick $months $month2] . "-" . [:if ([:pick $months $month2]!="dec") do={[:pick [/system clock get date] 7 11]} else={[([:pick [/system clock get date] 7 11 ] - 1)]}] . "
 Incoming traffic - " . $Kbrxreport . "Kb" . ";" . "
" . $Mbrxreport . "Mb" . ";" . "
" . $Gbrxreport . "Gb" . "." . "
" . "Outbound traffic - "  . $Kbtxreport . "Kb" . ";" . "
" . $Mbtxreport . "Mb" . ";" . "
" . $Gbtxreport . "Gb" . ".") ;
:delay 5;
/tool e-mail send from="<$Eaccount>" to=$Eaccount server=$smtpserv port=587 user=$Eaccount password=$pass start-tls=yes file=report.txt subject=$reporttheme body=("Traffic Report for " . [:pick $months $month2] . "-" . [:if ([:pick $months $month2]!="dec") do={[:pick [/system clock get date] 7 11]} else={[([:pick [/system clock get date] 7 11 ] - 1)]}] . "
 Incoming traffic - " . $Kbrxreport . "Kb" . ";" . "
" . $Mbrxreport . "Mb" . ";" . "
" . $Gbrxreport . "Gb" . "." . "
" . "Outbound traffic - "  . $Kbtxreport . "Kb" . ";" . "
" . $Mbtxreport . "Mb" . ";" . "
" . $Gbtxreport . "Gb" . ".") ;
:delay 20;
 /file remove [find name=rx.txt];
 /file remove [find name=tx.txt]
}
}

То -user-, вот Вам пример, где без комментариев через год я сам буду разбираться далеко не пять минут, что и куда я прикручивал. Достаточно сложно просто будет понять, что этот скрипт делает :-)
К сообществу вопрос:
При отработке условия с почтовой отправкой и сообщение и прикрепленный файл формируются почему-то дублированной записью типа:

Код: Выделить всё

Traffic Report for aug-
 Incoming traffic - 146952335,27Kb;
143508,13Mb;
140,14Gb.
Outbound traffic - 96919587,84Kb;
94648,35Mb;
92,44Gb.;Traffic Report for aug-2014
 Incoming traffic - 146952335,27Kb;
143508,13Mb;
140,14Gb.
Outbound traffic - 96919587,84Kb;
94648,35Mb;
92,44Gb.

Почему информация дублируется и куда пропадает значение года отчета в первой части сообщения?


Мануалы изучил и нигде не ошибся? Фаервол отключил? Очереди погасил? Витая пара проверена? ... Тогда Netinstal'ом железку прошей и настрой ее заново. Что, все равно не фурычит? Тогда к нам. Если не подскажем, хоть посочувствуем...
Аватара пользователя
podarok66
Модератор
Сообщения: 4355
Зарегистрирован: 11 фев 2012, 18:49
Откуда: МО

Да, забыл сказать. Скрипт снимает показания трафика, который пропустил через себя заданный интерфейс в ту и другую сторону и записывает в файл. Если до этого в файле была запись показаний, трафик пересчитывается. В заданный день раз в месяц отчет отсылается на почту, перед этим суммарный трафик за месяц переводится в Гигабайты, Мегабайты и Килобайты (Ненужное можно просто выбросить из скрипта).
Если кому-то интересно станет, могу выложить версию с комментариями...


Мануалы изучил и нигде не ошибся? Фаервол отключил? Очереди погасил? Витая пара проверена? ... Тогда Netinstal'ом железку прошей и настрой ее заново. Что, все равно не фурычит? Тогда к нам. Если не подскажем, хоть посочувствуем...
-user-
Сообщения: 30
Зарегистрирован: 21 мар 2013, 10:05

podarok66 писал(а):выложить версию с комментариями...
не надо, вроде, доступно все... читАемо... понятно. :a_g_a:

podarok66 писал(а):Почему информация дублируется и куда пропадает значение года отчета в первой части сообщения?
наверное будет проще, Вам у себя добавить put или log перед записью в файл и отправкой и посмотреть в каком месте именно появляется "дубль"... (он появляется и в письме и в файле?) Так же и с годом, который не появляется в "отчете", предварительно его через put всей строки скрипта проверить... В одном месте нету косой черты "/" перед "system" в [:pick [system clock get date] 7 11 ] , но на врядли это на что-то влияет, потому что и так скрипт отрабатывает... :ne_vi_del:


скромно :smu:sche_nie: выложу это тут для наглядности (этот "тест" имитирует применение в скрипте повторяющихся запросов у МТ и для сравнения второй показывает одиночное использование запроса а дальше оперирование переменной которой результат был присвоен):

 "тест"

Код: Выделить всё

# 1
:put [:time {

local x1

:for i from=1 to=1000 do={

[/system clock get date]

}}];


# 2
:put [:time {

local x1
local y1

set $x1 [/system clock get date]

:for i from=1 to=1000 do={

set y1 x1

}}];
или одной строчкой:
 "тест"

Код: Выделить всё

:put [:time {[local x1] [:for i from=1 to=1000 do={[/system clock get date]}]}];
00:00:20.510531
:put [:time {[local x1] [local y1] [set $x1 [/system clock get date]] [:for i from=1 to=1000 do={set y1 x1}]}];
00:00:00.472048
это я к тому, что запрос времени выполняется на порядок дольше, чем просто присвоение переменным... да и вопрос не во времени даже, постоянный запрос более ресурсоемок для CPU, специально не тестил для наглядности, но почему-то уверен в этом на 99%
Тоже применимо и к pick [:pick [/system clock get date] 7 11 ] - предположу, что его длительность и ресурсоёмкость будет еще больше... наверное лучше повторяющиеся/одинаковые запросы у системы сделать в начале скрипта и присвоить переменной, а потом уже использовать эту переменную....
С уважением.


Аватара пользователя
podarok66
Модератор
Сообщения: 4355
Зарегистрирован: 11 фев 2012, 18:49
Откуда: МО

-user- писал(а):предположу, что его длительность и ресурсоёмкость будет еще больше...

Да, вполне возможно. Будем смотреть, но уже не сегодня... В любом случае резон в использовании переменной есть, и я это понял))) Спасибо...


Мануалы изучил и нигде не ошибся? Фаервол отключил? Очереди погасил? Витая пара проверена? ... Тогда Netinstal'ом железку прошей и настрой ее заново. Что, все равно не фурычит? Тогда к нам. Если не подскажем, хоть посочувствуем...
Аватара пользователя
podarok66
Модератор
Сообщения: 4355
Зарегистрирован: 11 фев 2012, 18:49
Откуда: МО

Ну вроде бы нашел я причину удвоения текста. У меня есть там вот такая связочка:

Код: Выделить всё

[:if ([:pick $months $month2]!="dec") do={[:pick [/system clock get date] 7 11]} else={[([:pick [/system clock get date] 7 11 ] - 1)]}]

Так вот она давала результат: ;2014
Подобное поведение скриптового языка уже описывалось вот тут одним из наших пытливых и внимательных пользователей. Если немного изменить строчку на такую:

Код: Выделить всё

[:pick [:if ([:pick $months $month2]!="dec") do={[:pick [/system clock get date] 7 11]} else={[([:pick [/system clock get date] 7 11 ] - 1)]}] 1 5]

и проблема исчезает...


Мануалы изучил и нигде не ошибся? Фаервол отключил? Очереди погасил? Витая пара проверена? ... Тогда Netinstal'ом железку прошей и настрой ее заново. Что, все равно не фурычит? Тогда к нам. Если не подскажем, хоть посочувствуем...
Ответить