Пара полезный приемов при написании скрипта

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

Пара полезный приемов при написании скрипта

Сообщение vqd » 10 мар 2014, 21:15

В общем сидел весь вечер бился над скриптом который по ДНС именам генерирует белый список сайтов (контент не катит ибо много и юзеров много)

И вот когда писал наступил на пару грабель и обратился к документации где вычитал пару полезный приемов

1. Обработка ошибок
Допустим вы резолвите имя домена которого не существует либо у конторы НС сервера лежат, в общем ваш скрипт вылетит с ошибкой и выполнение остановится.

Лечится вот такой штукой

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

:do {
         :resolve domena.net
      } on-error={
          /log warning ("Error")
      }



2. неоднократно при написании больших скриптов не хватало мне функций. При очень больших проектах пользовался пародией на процедуры вызывая дополнительные скрипты, но не тут то было, оказывается и тут есть решение

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

[admin@MikroTik] > :global fun do={:put "YES!!!"}   
[admin@MikroTik] > $fun
YES!!!

Есть интересная задача и бюджет? http://mikrotik.site
23q
Сообщения: 57
Зарегистрирован: 16 май 2013, 11:21

Re: Пара полезный приемов при написании скрипта

Сообщение 23q » 12 авг 2014, 14:29

вопрос :-) :
если сделать

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

global 1 [resolve ya.ru]

ответ:
93.158.134.3
если сделать:

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

global 1 [:do {
         :resolve ya.ru
      } on-error={
          /log warning ("Error")
      }]


ответ:
;93.158.134.3

пришлось делать вот такую конструкцию:

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

global 1 [:pick [:do {
         :resolve ya.ru
      } on-error={
          /log warning ("Error")
      }] 1]

ответ: 93.158.134.3

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

Re: Пара полезный приемов при написании скрипта

Сообщение podarok66 » 12 авг 2014, 17:24

А цель-то какая? Что Вы хотели увидеть? А то как-то непонятненько, что окромя адреса Вы хотели получить из резолва.
Мануалы изучил и нигде не ошибся? Фаервол отключил? Очереди погасил? Витая пара проверена? ... Тогда Netinstal'ом железку прошей и настрой ее заново. Что, все равно не фурычит? Тогда к нам. Если не подскажем, хоть посочувствуем...
vqd
Модератор
Сообщения: 3790
Зарегистрирован: 26 сен 2013, 14:20
Откуда: НСК
Контактная информация:

Re: Пара полезный приемов при написании скрипта

Сообщение vqd » 12 авг 2014, 17:48

Человек имеет в виду что непонятно откуда берется ";"
Есть интересная задача и бюджет? http://mikrotik.site
podarok66
Модератор
Сообщения: 3249
Зарегистрирован: 11 фев 2012, 18:49
Откуда: МО

Re: Пара полезный приемов при написании скрипта

Сообщение podarok66 » 12 авг 2014, 18:52

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

Re: Пара полезный приемов при написании скрипта

Сообщение podarok66 » 12 авг 2014, 23:06

Да, действительно, странновато выводит.
И вот что еще, делаю резолв адреса, получаю результат. Отключаю интерфейс, связывающий микротик с внешним миром. Делаю резолв опять. Получаю результат!!! Результат сохраняется в кэше. Если пытаюсь получить результат на другой адрес, получаю :

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

failure: dns server failure
Мануалы изучил и нигде не ошибся? Фаервол отключил? Очереди погасил? Витая пара проверена? ... Тогда Netinstal'ом железку прошей и настрой ее заново. Что, все равно не фурычит? Тогда к нам. Если не подскажем, хоть посочувствуем...
23q
Сообщения: 57
Зарегистрирован: 16 май 2013, 11:21

Re: Пара полезный приемов при написании скрипта

Сообщение 23q » 13 авг 2014, 01:29

podarok66 писал(а):Отключаю интерфейс, связывающий микротик с внешним миром. Делаю резолв опять. Получаю результат!!! Результат сохраняется в кэше.

Это норма! Очистишь кеш - ничего не получишь!
А вот еще:
после

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

global 1 [:pick [:do {
         :resolve ya.ru
      } on-error={
          /log warning ("Error")
      }] 1]

если днс не резольвится мы получаем пустую переменную 1.
Потом, если выполнить
:global PingResult01 [/ping $1 count=3]
угадайте какой ответ мы получим? :-)
3!
:global PingResult01 [/ping $1 count=3]
HOST SIZE TTL TIME STATUS
no address was specified
no address was specified
no address was specified
sent=3 received=3 packet-loss=0% min-rtt=0ms avg-rtt=0ms max-rtt=0ms


И еще, может кто знает как выполнить проверку на пустую переменную? Офф форум говорит:

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

:global aaa;
:if (:typeof[$aaa] = "nil") do={
      ...
}

но не работает!
хотя можно пользоваться и

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

:if ([:len $MyVar] = 0) do={ some code }
vqd
Модератор
Сообщения: 3790
Зарегистрирован: 26 сен 2013, 14:20
Откуда: НСК
Контактная информация:

Re: Пара полезный приемов при написании скрипта

Сообщение vqd » 13 авг 2014, 07:08

Вообще на пустую?

Я обычно тупо :if ($p="") do={}

nil совсем недавно появился. Чуть ли не в последней прошивке вроде
Есть интересная задача и бюджет? http://mikrotik.site
23q
Сообщения: 57
Зарегистрирован: 16 май 2013, 11:21

Re: Пара полезный приемов при написании скрипта

Сообщение 23q » 13 авг 2014, 10:16

vqd писал(а):Вообще на пустую?

Я обычно тупо :if ($p="") do={}

nil совсем недавно появился. Чуть ли не в последней прошивке вроде

лично у меня, на 6.18, такой прием не работает:

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

global 45
:if ($45="") do={log info 45}
23q
Сообщения: 57
Зарегистрирован: 16 май 2013, 11:21

Re: Пара полезный приемов при написании скрипта

Сообщение 23q » 21 авг 2014, 18:17

по первым двум траблам, передана программистам, по третьей привожу дословный ответ:

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

> > Работает:
 > > {
 > > local aaa
 > > if condition=([/typeof $aaa] = "nothing") do={:put nothing} else={:put
 > > something}
 > > set $aaa "value"
 > > if condition=([/typeof $aaa] = "nothing") do={:put nothing} else={:put
 > > something}
 > > }
 > >
 > > Неработает:
 > > local aaa
 > > if condition=([/typeof $aaa] = "nothing") do={:put nothing} else={:put
 > > something}
 > > set $aaa "value"
 > > if condition=([/typeof $aaa] = "nothing") do={:put nothing} else={:put
 > > something}

Вернуться в «Готовые скрипты Mikrotik»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость