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

Здесь выкладываем скрипты
Правила форума
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
vqd
Модератор
Сообщения: 3605
Зарегистрирован: 26 сен 2013, 14:20
Откуда: НСК
Контактная информация:

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

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

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

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

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

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
Модератор
Сообщения: 4355
Зарегистрирован: 11 фев 2012, 18:49
Откуда: МО

А цель-то какая? Что Вы хотели увидеть? А то как-то непонятненько, что окромя адреса Вы хотели получить из резолва.


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

Человек имеет в виду что непонятно откуда берется ";"


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

А-а-а-а, я думал очепятка. Домой приду, попробую...


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

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

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

failure: dns server failure


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

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
Модератор
Сообщения: 3605
Зарегистрирован: 26 сен 2013, 14:20
Откуда: НСК
Контактная информация:

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

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

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


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

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

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

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

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

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

global 45
:if ($45="") do={log info 45}


23q
Сообщения: 57
Зарегистрирован: 16 май 2013, 11:21

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

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

> > Работает:
 > > {
 > > 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}


Ответить