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

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

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

никто мне не отвечает на мои глупые вопросы... решил отвлечься от очередей и приоритетов... родилось это :-) :
 тест

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

{:put [:time {[:local match] [:local iter] [set match 0] [set iter 200] [:local ar1 [:toarray ""]; for v1 from=1 to=$iter do={set ar1 ($ar1, $v1)}] [:local ar2 [:toarray ""]; for v2 from=$iter to=($iter+$iter) do={set ar2 ($ar2, $v2)}] [:foreach data1 in=$ar1 do={:foreach data2 in=$ar2 do={:if (data1=data2) do={set match ($match+1)}}}]}]}
Скрипт показывает время за которое сравнивается два массива. Количество элементов в массиве задается тут - [set iter 200] Больше цифра - дольше перебирает - более точен результат сравнения двух МТ_роутеров.
Интересно, будет ли загружено более одного ядра в многоядерных МТ_роутерах (имеется ввиду полноценно, а не просто перекидывание задачи по ядрам).


результаты на Микротиковских Демках:
 
    массивы из 400:
    1) 680 MHz (http://demo2.mt.lv/) RB433UAH
    00:00:36.840563
    00:00:32.854128
    00:00:34.579667
    00:00:36.305826

    массивы из 200:
    1) 680 MHz (http://demo2.mt.lv/) RB433UAH
    00:00:07.295267
    00:00:07.012183
    00:00:07.679998

    2) 300 MHz (http://demo.mt.lv/) RB433
    00:00:27.626822
    00:00:25.724782
    00:00:26.391050

Пока не понял почему увеличение частоты проца в ~два раза. дает ускорение сравнения в ~4 раза, наверное элементарное объяснение, но что-то я туплю.


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

Ваша манера писать скрипты меня дезориентирует :)-(:
Как бы все в одну строку - это просто жесть. Насколько проще в плане восприятия такой вид:

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

{
:put [:time {
:local match;
:local iter;
:set match 0;
:set iter 200;
:local ar1;
:toarray "";
:for v1 from=1 to=$iter do={
:set ar1 ($ar1, $v1)
}
:local ar2;
:toarray "";
:for v2 from=$iter to=($iter+$iter) do={
:set ar2 ($ar2, $v2)
}
:foreach data1 in=$ar1 do={
:foreach data2 in=$ar2 do={
:if (data1=data2) do={
:set match ($match+1)
}
}
}
}]
}

И, простите, зачем Вам такое количество квадратных скобок? И почему перед командами Вы не ставите двоеточие?
Хотите, я Вам файл синтаксиса скину для Notepad++? Не полный, но хоть как-то и что-то раскрашивает... Всё более наглядно можно видеть...


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

podarok66 писал(а):Как бы все в одну строку - это просто жесть.
есть программа (TypeText) которая набивает только одну строку в месте нахождения курсора в другом окне... эту программу приходиться использовать чтобы не набивать в ручную в терминале в http://demo2.mt.lv/ так как копипастинг в этом терминале не работает :-):

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

podarok66 писал(а):И, простите, зачем Вам такое количество квадратных скобок?
потому что их проще ставить чем пару - двоеточие+точка с запятой

podarok66 писал(а):И почему перед командами Вы не ставите двоеточие?

потому что терминалМТ не ругается на скрипт без этих знаков (при использовании квадратных скобок), а дурацкое правило в голове: получить тот же результат при меньших трудозатратах мешает ставить их самому.


Сори всем, кому докучал :mi_ga_et: больше не буду. Скрипт выложил просто чтобы запустил кто-нибудь как-есть и показал просто результат на выходе.
Удачи.


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

-user- писал(а):Сори всем, кому докучал больше не буду. Скрипт выложил просто чтобы запустил кто-нибудь как-есть и показал просто результат на выходе.
Удачи.

Как это не будете? Очень даже будете. Не надо пропадать, Вы очень даже ко двору здесь :hi_hi_hi: С Вами не скучно и интересно.


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

Кстати, у меня результат крутится около 7 секунд. Это RB951Ui-2HnD на частоте 500 и у RB951-2n около 8 секунд на частоте 400


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

Продолжаю эту интереснейшую тему, вернее подниму ее в связи с поиском совета.
Прошу не пинать, желания у меня иногда странные и к действительности отношения имеют мало. Короче, в наши железки постоянно ломятся, чаще всего с адресов, закрепленных за родным нашим, не побоюсь этого слова, Китаем. У меня есть скрипт, который заносит очень настойчивых в черный список на несколько дней, но потом все начинается сначала. И вот я подумал, а зачем мне вообще эти китайские адреса в диапазоне доступа на роутер. Ну запрет на цепочку input для адрес-листа написать не составляет труда никому, а вот занести большинство этих адресов в список, это уже интереснее. Но их там... почти 5 тысяч http://www.ipdeny.com/ipblocks/data/countries/cn.zone Вот я и подумал, а как бы автоматизировать сей процесс. Наваял наскоро несколько строк:

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

{

:local con [/file get [/file find name=list3.txt] contents];

:local conlen [:len $con];

:local linelen1 0;
:local linelen2 "";
:local linelen3 0;

:do {
:set linelen1 [:find $con "\r\n" $linelen3];
:set linelen2 [:pick $con $linelen3 $linelen1];
:set linelen3 ($linelen1 + 2);

:if ($linelen2 != "") do={

/ip firewall address-list add address=$linelen2 list="ChinaIP";

}
} while ($linelen1 < $conlen)
}

Больше 249 строк не обрабатывает, зараза, но я так подозреваю, что это пресловутое ограничение на файл не более 4 кб размером. Это фиг бы с ним, я и по 200 строк за раз бы обрабатывал, мне хватит, но есть несколько моментов, которые сегодня мне не дались и мне активно не нравяться.
* раз файлов со списками будет несколько, то хотелось бы прикрутить строчку, которая бы искала в подобных именах ( list1.txt, list2.txt, list3.txt...) те, которые еще не обработаны и запускала в обработку.
* там у меня ищутся знаки перевода каретки и начала новой строки "\r\n" . Так вот если в последней строке этих знаков нет, то последний адрес не заносит в списки. Как бы мне и с этим разобраться.


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

Почитай про регулярные выражения.
Судя по документации микрот умеет но сам не разбирался с ними

“~” binary operator that matches value against POSIX extended regular expression Print all routes which gateway ends with 202
/ip route print where gateway~"^[0-9 \\.]*202"


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

Ну в общем, не так страшен оказался черт, каким выглядел поначалу.
Значит описываю всё по порядку. Имеет список адресов http://www.ipdeny.com/ipblocks/data/countries/cn.zone предположительно из китайской зоны. Это 4837 диапазонов (!) адресов. Хочется занести их в один список, чтобы проводить с ними различные манипуляции, в том числе и запретительного характера. Если забивать адреса руками, работа окажется просто невероятно долгой, если не невозможной вообще. Не мудрствуя лукаво, копирую все адреса с приведенной страницы в созданный мной текстовый файл list.txt , размещенный в отдельной папке (ну для удобства, чтобы не собирать потом все новый файлы по общей папке), в эту же папку помещаю bat-файл (взято отсюда) следующего содержания:

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

@echo off
set $n=200

for /f "tokens=1* delims=[]" %%i in ('find /v /n "" ^<list.txt') do set "$j=%%j"& call :sub %%i
exit
:sub
set /a $m=(%~1-1)/%$n%+1
set $m=0%$m%
set $m=%$m:~-2%

if not "%$i%"=="%$m%" type nul >list%$m%.txt
>>list%$m%.txt echo.%$j%
set $i=%$m%& exit /b

Запускаю это батник и у меня в этой папке создаются больше двух десятков файлов по 200 строк с названиями вида list01.txt, list02.txt, list03.txt и т. д. Эти файлы я скидываю на Микротик, на нем открываю терминал и там запускаю скрипт:

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

{
:local findfile [/file find name~"list*"];
:foreach i in=$findfile do={
:local con [/file get $i contents];

:local conlen [:len $con];

:local linelen1 0;
:local linelen2 "";
:local linelen3 0;

:do {
:set linelen1 [:find $con "\r\n" $linelen3];
:set linelen2 [:pick $con $linelen3 $linelen1];
:set linelen3 ($linelen1 + 2);

:if ($linelen2 != "") do={

/ip firewall address-list add address=$linelen2 list="ChinaIP";

}
} while ($linelen1 < $conlen);
/file remove $i;
}
}

Отработка идет секунд 10, всё-таки объем нешуточный. В итоге у нас создается адрес-лист ChinaIP с 4837 записями. Ну а уж с ним можно делать всё, что душа пожелает. Обработанные файлы будут удалены.
Регулярки меня пугают, если честно. Нет ни малейшего желания с ними разбираться, не мой это уровень. Я в них плавать буду долго и безрезультатно. А если результаты и будут, то мне их просто применять негде. Одним словом результат не будет стоить приложенных усилий.


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

Скажите пожалуйста а как можно получить значение между двумя знаками. В частности нужно получить последний октет ip адреса.
192.168.1.1/24 или может быть 10.16.1.121/24. как получить то что находится между последней "." и "/" ?


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

gregy писал(а): 17 сен 2023, 13:51 Скажите пожалуйста а как можно получить значение между двумя знаками. В частности нужно получить последний октет ip адреса.
192.168.1.1/24 или может быть 10.16.1.121/24. как получить то что находится между последней "." и "/" ?
Говорим спасибо Illinory, который любезно сочинил скрипт под вашу хотелку

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

:global ipaddress 10.1.101.99/24;
:global j 0;
:for i from=( [:len $ipaddress] - 1) to=0 do={ 
  :if ( [:pick $ipaddress $i] = "/") do={ 
    :set j $i;
    :while ([:pick $ipaddress $j] != ".") do={
      :set j ( $j - 1 );
    };
    :put [:pick $ipaddress ($j+1) $i];
  } ;
};


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