Страница 1 из 3

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

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

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

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

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

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

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



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

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

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


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

Добавлено: 12 авг 2014, 14:29
23q
вопрос :-) :
если сделать

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

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

так и надо, или я туплю?

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

Добавлено: 12 авг 2014, 17:24
podarok66
А цель-то какая? Что Вы хотели увидеть? А то как-то непонятненько, что окромя адреса Вы хотели получить из резолва.

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

Добавлено: 12 авг 2014, 17:48
vqd
Человек имеет в виду что непонятно откуда берется ";"

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

Добавлено: 12 авг 2014, 18:52
podarok66
А-а-а-а, я думал очепятка. Домой приду, попробую...

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

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

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

failure: dns server failure

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

Добавлено: 13 авг 2014, 01:29
23q
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 }

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

Добавлено: 13 авг 2014, 07:08
vqd
Вообще на пустую?

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

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

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

Добавлено: 13 авг 2014, 10:16
23q
vqd писал(а):Вообще на пустую?

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

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

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

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

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

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

Добавлено: 21 авг 2014, 18:17
23q
по первым двум траблам, передана программистам, по третьей привожу дословный ответ:

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

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