Как правильно написать скрипт в микротике

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

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

23 окт 2014, 17:15

Вы издеваетесь что ли?
Вам же написал микротик ошибку, вполне все ясно. Или вы переводчиками пользоваться не умеете?


Есть интересная задача и бюджет? http://mikrotik.site
Сержа
Сообщения: 39
Зарегистрирован: 03 июн 2013, 06:32

27 окт 2014, 16:45

Спасибо разобрался.


Vita077
Сообщения: 2
Зарегистрирован: 28 окт 2014, 19:28

02 дек 2014, 00:45

Чтобы не создавать тему, пишу в этой. Пожалуйста подскажите правильный скрипт, который бы оправлял ip интерфейса ppp-out1 с 3G модемом на email, при его смене. Почтовый клиент в микротике настроил, сообщения доходят, находил подобные скрипты, но они для предыдущей пятой версии RouterOS, в синтаксисе пока не силен. В данный момент на роутере использую версию 6.19.
 примерный скрипт для 5 версии
#Check if IP on interface have changed

:global currentIP;

:local newIP [/ip address get [find interface="ppp-out1"] address];

:if ($newIP != $currentIP) do={
:put "ip address $currentIP changed to $newIP";
:set currentIP $newIP;

#Send Message

/tool e-mail
set address=74.125.143.109
set port=587
set from=******@gmail.com
set user=******@gmail.com
set password=************

send to=******@gmail.com=("Mikrotik currentIP = ".[$currentIP]." ( ". [/system clock get date] ." ". [/system clock get time] ." ) " ) \ body=$currentIP start-tls=yes

:log info "Reports send currentIP OK"
}


Аватара пользователя
GDragon
Сообщения: 80
Зарегистрирован: 20 ноя 2014, 15:48

02 дек 2014, 02:54

Я сейчас использую вот такую конструкцию.
У меня 6.22 но я думаю должно работать. :)

p.s.
Делал в т.ч. и себе на будущее поэтому там много комментариев и сообщений в логи. (Соответственно можно подчистить - он станет короче).
Т.к. особо скриптингом на Mikrotik не занимался не исключаю что где то можно сделать проще/акуратнее.

Но работает. Шлёт на мыло письмо если IP изменился и не шлёт если нет :D.

 скрипт накатанный мной в 6.22
# Check ip and send to e-mail if changed
#---------- Config below this line ----------

# set WAN interface name
:local WAN "you WAN interface name here";
# set e-mail smtp server name
:local smtpserv [:resolve "you smtp server here"];
# set e-mail username
:local Eaccount "you e-mail here";
# set e-mail password
:local Epassword "you password here";

#---------- Config above this line ----------

:global StoredIP
:local sysname [/system identity get name];
:local sysver [/system package get system version];
:local CurrIP
:log info "Checking external ip & send IP to e-mail if changed"

# Get IP address

:set CurrIP [/ip address get [/ip address find interface=$WAN] address]
:set CurrIP [:pick [:tostr $CurrIP] 0 [:find [:tostr $CurrIP] "/"]]

:if ([:len $CurrIP] = 0) do={
:log error ("Could not get IP for interface " . $WAN)
:error ("Could not get IP for interface " . $WAN)
} else={:log info "IP from $WAN get."}

:log info "Checking & sending IP if needed."

# Check IP address & send if needed

:if ($StoredIP != $CurrIP) do={
/tool e-mail send from="<$Eaccount>" to="<$Eaccount>" server=$smtpserv \
port=587 user=$Eaccount password=$Epassword start-tls=yes \
subject=("Mikrotik $sysname IP changed (" . [/system clock get date] . \
")") body=("New $sysname IP: $CurrIP.\nRouterOS \
version: $sysver\nTime and Date stamp: " . [/system clock get time] . " \
" . [/system clock get date]);
:log info "Send new IP to e-mail complete"
:set StoredIP "$CurrIP"
:log info "Stored IP Updated"
} else={:log info "IP not changed"}


Аватара пользователя
GDragon
Сообщения: 80
Зарегистрирован: 20 ноя 2014, 15:48

02 дек 2014, 23:50

Кстати, гуру - подскажите как реализовать проверку на заполненность переменной внутри команды отправки?

Допустим переменная
:local Eccmail "";
если она пустая то команда отправки
/tool e-mail send from="sender" to="recipient" server=smtpserver port=587 user=mailuser password=mailpassword start-tls=yes subject=("subject") body=("body");
Если в ней что-то есть то команда отправки
/tool e-mail send from="sender" to="recipient" cc="$Eccmail" server=smtpserver port=587 user=mailuser password=mailpassword start-tls=yes subject=("subject") body=("body");

(И да я знаю что можно через if выбирать одну из двух команд но зочется покороче)

Возможно ли впихнуть проверку в саму команду?
Например /tool e-mail send from="sender" to="recipient" [:if ( $Eccmail != zero ) do={ cc="$Eccmail" } ] server=smtpserver port=587 user=mailuser password=mailpassword start-tls=yes subject=("subject") body=("body");
Все осложняет отсутствие вменяемых средств отладки в rOS :(


vqd
Модератор
Сообщения: 3434
Зарегистрирован: 26 сен 2013, 14:20
Откуда: НСК
Контактная информация:

03 дек 2014, 06:50

За утренним кофе особо делать было нечего. Конструкция такая, не проверял

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

:local Eccmail "";
:if ($Eccmail != "") do={:set Eccmail "cc=$Eccmail"}
[:parse "/tool e-mail send from=sender to=recipient $Eccmail server=smtpserver port=587 user=mailuser password=mailpassword start-tls=yes subject=\"subject\" body=\"123\""]



А если подумать то вообще можно сократить до

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

:local Eccmail "";
:if ($Eccmail != "") do={:set Eccmail "cc=$Eccmail"}
[:parse "/tool e-mail send to=recipient $Eccmail subject=\"subject\" body=\"123\""]


А если учесть тот факт что такая конструкция тоже работает

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

/tool e-mail send to=vqd2012@gmail.com cc="" subject="test" body="123" 


То соответственно имеем на выходе

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

/tool e-mail send to=recipient сс=$Eccmail subject="subject" body="123"


Все, кофе закончился, дальше читайте документацию, там все это есть


Есть интересная задача и бюджет? http://mikrotik.site
Аватара пользователя
GDragon
Сообщения: 80
Зарегистрирован: 20 ноя 2014, 15:48

03 дек 2014, 10:59

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

/tool e-mail send to=recipient cc="" subject="test" body="123" 

Неа... не работает :) во всяком случае у меня в 6.22 оно ругается на неверный синтаксис при отправке. в логах светится попытка отправки на пустой емейл и ругань почтового сервера на это.

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

:local Eccmail "";
:if ($Eccmail != "") do={:set Eccmail "cc=$Eccmail"}

Какое однако страшное шаманство >_<
Последний раз редактировалось GDragon 03 дек 2014, 11:12, всего редактировалось 1 раз.


vqd
Модератор
Сообщения: 3434
Зарегистрирован: 26 сен 2013, 14:20
Откуда: НСК
Контактная информация:

03 дек 2014, 11:06

все работает. Надо просто подумать


Есть интересная задача и бюджет? http://mikrotik.site
vqd
Модератор
Сообщения: 3434
Зарегистрирован: 26 сен 2013, 14:20
Откуда: НСК
Контактная информация:

03 дек 2014, 11:11

Сейчас специально на 6.22 попробовал. Все гуд


Есть интересная задача и бюджет? http://mikrotik.site
Аватара пользователя
GDragon
Сообщения: 80
Зарегистрирован: 20 ноя 2014, 15:48

03 дек 2014, 11:25

Да пардон, сам ошибся :)

Ещё 2 вопроса
зачем [:parse если в команде вычислений не производится?

и допустим дефолтная переменная не пустая а содержит текст
:local Eccmail "put additional recepients here, separate with , ";
тогда вариант с наличием cc="$Eccmail" в команде отправки не прокатит :Р

Внутри команды /tool e-mail вычисление и добавление по необходимости точно не сделать? Только снаружи? (Или вообще разделять две команды отправки?)


Ответить