Работа с данным типа id (internal ID)

Обсуждение ПО и его настройки
Lurker
Сообщения: 159
Зарегистрирован: 29 апр 2021, 10:45

Спасибо и за ссылку и за функцию.
Пойду писать алгоритм... и, наверно, обратную функцию.


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

Да, и результат покажите, если не трудно. Мы бы посмотрели... :-)


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

Lurker писал(а): 29 июл 2021, 12:56 Пойду писать алгоритм... и, наверно, обратную функцию.
Обратная мне вчера тоже на официальном форуме попадалась на глаза.


Telegram: @thexvo
Lurker
Сообщения: 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 переменная, но зато минус целая функция.


xvo
Сообщения: 4204
Зарегистрирован: 25 фев 2018, 22:41
Откуда: Москва

https://forum.mikrotik.com/viewtopic.ph ... 98#p295501

И кстати, там пишут, что вроде как встроенная :tonum тоже переваривает hex, то есть от id достаточно * отрезать.


Telegram: @thexvo
Lurker
Сообщения: 159
Зарегистрирован: 29 апр 2021, 10:45

xvo писал(а): 29 июл 2021, 14:56 И кстати, там пишут, что вроде как встроенная :tonum тоже переваривает hex, то есть от id достаточно * отрезать.
Не догадался отрезать * но по идее работать не будет. скорее всего он преобразует 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


Lurker
Сообщения: 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

И не понимаю что я делаю не так.


Lurker
Сообщения: 159
Зарегистрирован: 29 апр 2021, 10:45

Так и не понял почему выводился неправильно, поправил костылём. Встречайте RC2 версию.
Замеченные проблемы:
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
Модератор
Сообщения: 4355
Зарегистрирован: 11 фев 2012, 18:49
Откуда: МО

Отлично, появился ещё один пытливый ум ))) Спасибо за скриптик. Завтра перенесу в скрипты тему....


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