Спасибо и за ссылку и за функцию.
Пойду писать алгоритм... и, наверно, обратную функцию.
Работа с данным типа id (internal ID)
- podarok66
- Модератор
- Сообщения: 4361
- Зарегистрирован: 11 фев 2012, 18:49
- Откуда: МО
Да, и результат покажите, если не трудно. Мы бы посмотрели...
Мануалы изучил и нигде не ошибся? Фаервол отключил? Очереди погасил? Витая пара проверена? ... Тогда Netinstal'ом железку прошей и настрой ее заново. Что, все равно не фурычит? Тогда к нам. Если не подскажем, хоть посочувствуем...
-
- Сообщения: 4204
- Зарегистрирован: 25 фев 2018, 22:41
- Откуда: Москва
-
- Сообщения: 159
- Зарегистрирован: 29 апр 2021, 10:45
Обратную тоже не нашёл... хз как вам так попадаются на глаза.
Прототип:
:global telegram
:global HexToNum
:global NumToHex
:local idd *1
local logarray
#$telegram ("ß çàãðóçèëñÿ â " . [/log get [/log find where message="router rebooted"] time])
while (true) do={
set logarray [log get $idd]
if ($logarray != "") do={
put ([pick $logarray 3] . " " . [pick $logarray 2])
set $idd [$HexToNum $idd]
set $idd [$NumToHex ($idd+1)] } else {
delay 10
}
}
Но функции NumToHex пока нет для проверки. Пока вижу только 2 неочевидных момента, которые надо будет поправить:
1)idd надо делать глобальным и присваивать значение при старте роутера, а не этого скрипта дабы в случае перезапуска скрипта не терять значение
2)если в лог засрут сообщениями так, что $idd станет указывать на уже удалённый элемент скрипт остановится. Но это скорее проблема настройки лога.
P.S. А вообще HexToNum функция вообще не нужна. По идее надо просто крутить счётчик на +1, и из него делать hex.
Тогда всего +1 переменная, но зато минус целая функция.
Прототип:
:global telegram
:global HexToNum
:global NumToHex
:local idd *1
local logarray
#$telegram ("ß çàãðóçèëñÿ â " . [/log get [/log find where message="router rebooted"] time])
while (true) do={
set logarray [log get $idd]
if ($logarray != "") do={
put ([pick $logarray 3] . " " . [pick $logarray 2])
set $idd [$HexToNum $idd]
set $idd [$NumToHex ($idd+1)] } else {
delay 10
}
}
Но функции NumToHex пока нет для проверки. Пока вижу только 2 неочевидных момента, которые надо будет поправить:
1)idd надо делать глобальным и присваивать значение при старте роутера, а не этого скрипта дабы в случае перезапуска скрипта не терять значение
2)если в лог засрут сообщениями так, что $idd станет указывать на уже удалённый элемент скрипт остановится. Но это скорее проблема настройки лога.
P.S. А вообще HexToNum функция вообще не нужна. По идее надо просто крутить счётчик на +1, и из него делать hex.
Тогда всего +1 переменная, но зато минус целая функция.
-
- Сообщения: 4204
- Зарегистрирован: 25 фев 2018, 22:41
- Откуда: Москва
https://forum.mikrotik.com/viewtopic.ph ... 98#p295501
И кстати, там пишут, что вроде как встроенная :tonum тоже переваривает hex, то есть от id достаточно * отрезать.
И кстати, там пишут, что вроде как встроенная :tonum тоже переваривает hex, то есть от id достаточно * отрезать.
Telegram: @thexvo
-
- Сообщения: 159
- Зарегистрирован: 29 апр 2021, 10:45
Не догадался отрезать * но по идее работать не будет. скорее всего он преобразует 10 в 10, а не в 16 т.к. тип я так понимаю str будет.
Первый работающий прототип. вывод в телеграм заменён на put
:global telegram
:global HexToNum
:global num2hex
:local idd *1
local logarray
#$telegram ("ß çàãðóçèëñÿ â " . [/log get [/log find where message="router rebooted"] time])
while (true) do={
set logarray [log get $idd]
if ([typeof [pick $logarray 1]] != "nil") do={
put ([pick $logarray 3] . " " . [pick $logarray 2])
#$telegram ([/log get $i time] . " " . [tostr [/log get $i topics]] . " " . [/log get $i message])
set $idd [$HexToNum $idd]
set $idd [$num2hex ($idd+1)]
set $idd [pick $idd 2 99]
set $idd ("*" . $idd)} else {
delay 1
}
}
До меня таки дошло что за сэйф моде было в терминале :(
Но к сожалению только после того как я закрыл терминал.
RC1 версия RIP
-
- Сообщения: 159
- Зарегистрирован: 29 апр 2021, 10:45
Я на финишной прямой, не получается разобраться с форматированием вывода
put [log get *8 topics]
put [log get *8 time]
put ([log get *8 time] . [log get *8 topics])
вывод 8-й записи в логе
Получаю
route;bgp;info
09:18:52
09:18:52route;09:18:52bgp;09:18:52info
А хочу
route;bgp;info
09:18:52
09:18:52route;bgp;info
И не понимаю что я делаю не так.
put [log get *8 topics]
put [log get *8 time]
put ([log get *8 time] . [log get *8 topics])
вывод 8-й записи в логе
Получаю
route;bgp;info
09:18:52
09:18:52route;09:18:52bgp;09:18:52info
А хочу
route;bgp;info
09:18:52
09:18:52route;bgp;info
И не понимаю что я делаю не так.
-
- Сообщения: 159
- Зарегистрирован: 29 апр 2021, 10:45
Так и не понял почему выводился неправильно, поправил костылём. Встречайте RC2 версию.
Замеченные проблемы:
1)не всегда запускается при старте системы(задержка 20 сек стоит)
2)бывает скрипт по непонятным причинам вырубается.
Похоже надо писать шедулер, проверяющий работу скриптов.
функции(в функции перевода в кириллицу скорее всего собьётся кодировка, правьте символы руками):
Замеченные проблемы:
1)не всегда запускается при старте системы(задержка 20 сек стоит)
2)бывает скрипт по непонятным причинам вырубается.
Похоже надо писать шедулер, проверяющий работу скриптов.
Код: Выделить всё
#idd номер записи лога с которого стартовать должен быть задан глобально до запуска данного скрипта
#в данном скрипте нет защиты от ситуации если ВСЕ записи в логах будут иметь номер больше, чем текущий idd. т.к. данная ситуация не должна случиться при нормальном использовании а писать проверку влом.
#используются функции telegram и num2id
#переменные: Idd и idh: id digital и id hex т.е. формате id. logarray-запись лога
:global telegram
:global num2id
:global idd
local logarray
if (idd=0) do={
$telegram ([/log get *0 time] . " я включился")
#put ([/log get *0 time] . " я включился")
set $idd ($idd+1)
}
:local idh [$num2id $idd]
while (true) do={
set logarray [log get $idh]
if ([typeof [pick $logarray 1]] != "nil") do={
if ([pick $logarray 2] != "changed script settings by admin" and ([pick $logarray 2] != "user admin logged in from 192.168.67.3 via telnet")) do={
#строка для отладки вывод в консоль вместо телеграмма.
#put ([pick $logarray 3] . " |" . [pick $logarray 4] . " |" . [pick $logarray 2])
#put ([pick $logarray 3] . " |" . [tostr [pick $logarray 4]] . " |" . [pick $logarray 2])
$telegram ([pick $logarray 3] . "%0A" . [tostr [pick $logarray 4]] . "%0A" . [pick $logarray 2])
}
set $idd ($idd+1)
set $idh [$num2id $idd]} else {
delay 10
}
}
Код: Выделить всё
:global telegram do={
:global FuncStrToTele
:global mikrotikbot
:global mikrotikchat
set $1 [$FuncStrToTele $1]
:tool fetch url=("https://api.telegram.org/$mikrotikbot/sendmessage\?chat_id=$mikrotikchat&text=$1") keep-result=no
}
# Function Converter of Russian characters for sending in Telegram
# by Sertik 09/09/2020
# usage [$FuncStrToTele «?????? String .,!+»]
:global FuncStrToTele do={
:local string; :set $string $1;
# table of the codes of Russian letters UTF8
:local rsimv [:toarray {"А"="D090"; "Б"="D091"; "В"="D092"; "Г"="D093"; "Д"="D094"; "Е"="D095"; "Ж"="D096"; "З"="D097"; "И"="D098"; "Й"="D099"; "К"="D09A"; "Л"="D09B"; "М"="D09C"; "Н"="D09D"; "О"="D09E"; "П"="D09F"; "Р"="D0A0"; "С"="D0A1"; "Т"="D0A2"; "У"="D0A3"; "Ф"="D0A4"; "Х"="D0A5"; "Ц"="D0A6"; "Ч"="D0A7"; "Ш"="D0A8"; "Щ"="D0A9"; "Ъ"="D0AA"; "Ы"="D0AB"; "Ь"="D0AC"; "Э"="D0AD"; "Ю"="D0AE"; "Я"="D0AF"; "а"="D0B0"; "б"="D0B1"; "в"="D0B2"; "г"="D0B3"; "д"="D0B4"; "е"="D0B5"; "ж"="D0B6"; "з"="D0B7"; "и"="D0B8"; "й"="D0B9"; "к"="D0BA"; "л"="D0BB"; "м"="D0BC"; "н"="D0BD"; "о"="D0BE"; "п"="D0BF"; "р"="D180"; "с"="D181"; "т"="D182"; "у"="D183"; "ф"="D184"; "х"="D185"; "ц"="D186"; "ч"="D187"; "ш"="D188"; "щ"="D189"; "ъ"="D18A"; "ы"="D18B"; "ь"="D18C"; "э"="D18D"; "ю"="D18E"; "я"="D18F"; "Ё"="D001"; "ё"="D191"; "№"="0023"}]
# encoding of the symbols and ?ssembly line
:local StrTele ""; :local code "";
:for i from=0 to=([:len $string]-1) do={:local keys [:pick $string $i (1+$i)]; :local key ($rsimv->$keys); if ([:len $key]!=0) do={:set $code ("%"."$[:pick ($rsimv->$keys) 0 2]"."%"."$[:pick ($rsimv->$keys) 2 4]");} else={:set $code $keys}; :set $StrTele ("$StrTele"."$code")}
:return $StrTele;
}
# convert from hex (string) to num
global HexToNum do={
:local Input [ :tostr $1 ];
:local Hex "0123456789abcdef0123456789ABCDEF";
:local Multi 1;
:local Return 0;
:for I from=([ :len $Input ] - 1) to=0 do={
:set Return ($Return + (([ :find $Hex [ :pick $Input $I ] ] % 16) * $Multi));
:set Multi ($Multi * 16);
}
:return $Return;
}
:global num2hex do={
:local number [:tonum $1]
:local hexadec "0"
:local remainder 0
:local hexChars "0123456789ABCDEF"
:if ($number > 0) do={:set hexadec ""}
:while ( $number > 0 ) do={
:set remainder ($number % 16)
:set number (($number-$remainder) / 16)
:set hexadec ([:pick $hexChars $remainder].$hexadec)
}
:return "0x$hexadec"
}
global num2id do={
global num2hex
set $1 ("*" . [pick [$num2hex $1] 2 99])
return $1
}
- podarok66
- Модератор
- Сообщения: 4361
- Зарегистрирован: 11 фев 2012, 18:49
- Откуда: МО
Отлично, появился ещё один пытливый ум ))) Спасибо за скриптик. Завтра перенесу в скрипты тему....
Мануалы изучил и нигде не ошибся? Фаервол отключил? Очереди погасил? Витая пара проверена? ... Тогда Netinstal'ом железку прошей и настрой ее заново. Что, все равно не фурычит? Тогда к нам. Если не подскажем, хоть посочувствуем...