оповещение в телегу

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

iBuddha писал(а): 08 ноя 2021, 16:46 ...
Блуждая по интернетам нашел еще один простенький скрипт для DHCP сервера
...
Он делает лог с выдачей адресов чуть более читабельным (для меня), например:
script, info Device: yandex-station-lite was given an address 192.168.88.19
Собственно вопрос: можно ли ваш скрипт переориентировать с MAC на IP?
Подправил актуальную версию скрипта с учётом Вашего пожелания:
viewtopic.php?p=81945#p81945


Ax3l
Сообщения: 3
Зарегистрирован: 22 авг 2022, 09:11

Оригинальный скрипт работал прекрасно на ros 6, как только обновился на ros 7.4.1 приходят повторные сообщения каждую минуту после 03:00. Возможно, в 7 версии производитель что-то поменял в механизме отображения логов и времени. Не могу разобраться, что изменить в верхней части скрипта, связанной со временем. Думаю, может попробовать удалить часть кода, ответственную за корректировку времени.


Ax3l
Сообщения: 3
Зарегистрирован: 22 авг 2022, 09:11

Попробовал убрать эту часть скрипта:

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

:if ([:pick $timeNow 0 2] < 03) do={
:local date [/system clock get date]
:foreach h in=[/log find] do={
:local htime [/log get $h time]
:if (($htime ~ [:pick $date 0 6]) and ([:pick $htime 7 15] > ($timeNow - 00:01:00))) do={
:set logs ($logs, $h)
  }
 }
} else={
}
Теперь повторные сообщения событий за предыдущий день приходят после 00:00. Куда копать?
Еще заметил такую штуку: в отображении логов в ROS7 в поле time вроде как пробел есть перед первым символом, а в ROS6 нет. Возможно, значения в pick нужно на 1 увеличить. Помогите с корректировкой плиз.
 
Изображение
Изображение


Аватара пользователя
Virtue
Сообщения: 142
Зарегистрирован: 07 мар 2014, 10:17

Ax3l писал(а): 25 авг 2022, 07:14 Попробовал убрать эту часть скрипта:
вы говорите приходили сообщения после 3х ночи? а до какого часа они приходят?
ничего не вырезайте из кода, а просто поменяйте в этой же части кода тройку на 4 или 5 смотря до какого часа приходят повторы


Ax3l
Сообщения: 3
Зарегистрирован: 22 авг 2022, 09:11

Получается, что если часть скипта убрать, то повторы идут каждую минуту с 00:01, если поменять 3 на 4, то с 04:01, если на 5, то соответственно с 05:01. Пробовал такие варианты. Повторы шли каждую минуту по планировщику. Потом уже 30 мин поставил. До какого времени не могу сказать, вероятно, весь день будут приходить. Утром в 7-8 часов просто удаляю логи.
В телеге повтор выглядит так:
aug/25 09:13:33 user admin logged in from 192.168.88.99 via winbox
а целевое сообщение так:
09:13:33 user admin logged in from 192.168.88.99 via winbox

Причем, повторы идут по времени планировщика, а новые сообщения не приходят


Mk51
Сообщения: 13
Зарегистрирован: 03 май 2022, 16:54

Здравствуйте.
Очень давно наткнулся на вашего бота, немножко его адаптировал под свои нужны, но сама логика работы осталась неизменной. А именно "шапка"
 

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

:delay 10
:local timeNow [/system clock get time]
:local logs
:if ([:pick $timeNow 0 2] < 03) do={
:local date [/system clock get date]
:foreach h in=[/log find] do={
:local htime [/log get $h time]
:if (($htime ~ [:pick $date 0 6]) and ([:pick $htime 7 15] > ($timeNow - 00:01:00))) do={
:set logs ($logs, $h)
  }
 }
} else={
:set logs [/log find time >= ($timeNow - 00:01:00)]
}
:if ([:len $logs] > 0 ) do={
:local messages
:local conToMT
:foreach i in=$logs do={
:local CTime [/log get $i time]
:local imessage [/log get $i message]
:if ($imessage ~"telnet" and $imessage ~"logged in") do={} else={
# ---1--- log object / WiFi Logger
:local topics [/log get $i topics]
:if ($topics ~"dhcp" and $imessage ~"assigned" and $imessage ~"for") do={
:if ($topics ~"dhcp" and $imessage ~"deassigned" and $imessage ~"for") do={} else={
:if ($imessage ~ "[0-F][0-F]:[0-F][0-F]:[0-F][0-F]:[0-F][0-F]:[0-F][0-F]:[0-F][0-F]") do={
:foreach k in=[/ip dhcp-server lease find] do={
:local mac [/ip dhcp-server lease get $k mac-address]
:local ExpTime [/ip dhcp-server lease get $k expires-after];
:local Ipclient [/ip dhcp-server lease get $k address];
:local ThisExpTime "58";
#:log info ($mac." ".$ExpTime." ".$Ipclient);
:if ($imessage ~ "$mac" and ([:pick $ExpTime 3 5] >= $ThisExpTime)) do={
:set imessage ([/ip dhcp-server lease get $k address])
      }
     }
    }
:set messages ($imessage)
:log info ($messages);

......}}}
Изменения:
1. На выходе мы получали поиск ip адреса клиента, который, числится в списке lease, получивший самый свежий ip, тк его lease time будет вида 23:58:00 и переменная "ThisExpTime" с проверкой

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

and ([:pick $ExpTime 3 5] >= $ThisExpTime)
отсеют другие статические записи под одним и тем же мак адресом. Абонент в теории может получись адрес из разных подсетей.
2. Изменения вывода логов в ROS7 привело к тому, что бот уже не может просто так смотреть в строчку "assigned to"
Ибо при подключении и отключении клиента раньше писалось assignet to и deassigned from, а сейчас assignet for и deassigned for, что привело к тому, что скрипт отписывал инфо статус клиента 2 раза.
Пришлось добавить

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

:if ($topics ~"dhcp" and $imessage ~"assigned" and $imessage ~"for") do={
:if ($topics ~"dhcp" and $imessage ~"deassigned" and $imessage ~"for") do={} else={
Отсеяв логи с deassigned


Поддерживаю предыдущего человека.
Скрипт отлично работал на ROS6, при переходе на ROS7, скрипт ведет себя очень странно:

1. После 3х ночи стабильно начинает глючить и выдавать в логи то, что фактически нет. В моем случае он просто дублировал "создавал" (хотя в его коде нет такой функции) строчку с dhcp assigned, хотя по факту никто не подключался. Данный ip первый в строчке lease dhcp.
Изображение
В целях проверки, удалил все остальное, отвечающее за оповещение, оставив только

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

:log info ($messages);
дабы видеть, что именно скрипт черпает с логов. И он успешно работал, до поры до времени. До 3х ночи.
Возможно в данном случае в переменную imessage записался результат успешного условия
:if ($topics ~"dhcp" and $imessage ~"assigned" and $imessage ~"for") do={
но не отработал
:if ($imessage ~ "[0-F][0-F]:[0-F][0-F]:[0-F][0-F]:[0-F][0-F]:[0-F][0-F]:[0-F][0-F]") do={

Хотя каким образом скрипт отработал, увидев вообще данные в логах строчку вида "assigned", если в логах пусто...

2. В случае какой либо проблемы с результатом операция выключение скрипта, ожидание нескольких минут простоя работы бота, дабы окончательно "очистить скриптовые мозги" не помогает. Если скрипт умрет, то только полная очистка логов помогает оживить его. Ну или рестарт системы.
Глюкнув раз, скрипт начинает отрабатывать совершенно непонятные вещи. А главное - время, время, которое он выдает в отчете совершенно не совпадает с реальным временем.

Изображение
Сейчас 21:34, отписал в 7:29
В оповещение информация времени хранится в переменной CTime
:local CTime [/log get $i time], что берется из логов и соответствия массиву данных.

Очень прошу помощи в решении этой проблемы на ROS7. Что-то мне подсказывает, что бот не правильно понимает текущее время в логах.

С уважением.

Обновлено
Хоть и скрипт работает на ROS6 исправно и работал на ROS7 частично, все никак не пойму, почему вызывая переменную htime
([:pick $htime 7 15]
зачем выбирать опцию 7-15, ведь результат переменной данного кода будет в формате 00:00:00, а не в Jun/14/2023 00:00:00. Ведь нужно было 0-8? ([:pick $htime 0 8]
 

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

:local timeNow [/system clock get time]
#:log info ($timeNow);
:local one
:local two
:local date [/system clock get date]
:foreach h in=[/log find] do={
:local htime [/log get $h time]
#:log info ($htime);
#:log info ($date);
set one [:pick $htime 7 15]
set two [:pick $date 0 6]
:log info ($one);
#:log info ($two);
}
В результате, в логах, единственная и последняя цифра текущего времени...


Аватара пользователя
Virtue
Сообщения: 142
Зарегистрирован: 07 мар 2014, 10:17

Mk51 писал(а): 14 июн 2023, 22:04 Хоть и скрипт работает на ROS6 исправно и работал на ROS7 частично, все никак не пойму, почему вызывая переменную htime
([:pick $htime 7 15]
зачем выбирать опцию 7-15, ведь результат переменной данного кода будет в формате 00:00:00, а не в Jun/14/2023 00:00:00. Ведь нужно было 0-8? ([:pick $htime 0 8]
данная переменная забирает именно время (дату мы уже положили в переменную date)

а кстати причем тут вообще 0-8? например команда в терминале
put [/log get number=*01 time]
выдаст
jun/12 04:01:03
тогда уж логичнее использовать 0-6 для забора даты, либо как у меня 7-15 для забора времени


Mk51
Сообщения: 13
Зарегистрирован: 03 май 2022, 16:54

Virtue писал(а): 15 июн 2023, 00:39
Добрый день.

Я обратился я в данную ветку в надежде получить рабочее решение по работе скрипта на ROS7. У меня нет углубленных знаний, чтобы пофиксить данную проблему. Скажите, у вас все нормально работает на ROS7? Не могли бы вы скинуть ваш скрипт, а я б сравнил посимвольно.
Virtue писал(а): 15 июн 2023, 00:39 данная переменная забирает именно время (дату мы уже положили в переменную date)...
Верно. Я не хочу спорить, я просто пытался своими силами как-то пофиксить и мне показалось, что всему виной неправильно записываемой переменной htime, относительно которой ведется все отсчеты времени в коде
Дату мы подцепили с

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

:local date [/system clock get date]
и получили переменную содержащую дату формата jun/15/2023
А время цепляете с

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

:foreach h in=[/log find] do={
:local htime [/log get $h time]
Выведите в лог переменную htime. Вы не получите ответ в виде jun/12 04:01:03, вы получите просто 04:01:03. И вы от этой переменной берете 7-15 для забора времени.

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

set one [:pick $htime 7 15]
Возьмите и получите на выходе последний символ времени. Просто цифру 3 в логах.

Попробуйте сами, под предыдущем сообщении код. Прогоните у себя. Может я что-то не понимаю.


Аватара пользователя
Virtue
Сообщения: 142
Зарегистрирован: 07 мар 2014, 10:17

Mk51 писал(а): 15 июн 2023, 13:13 Попробуйте сами, под предыдущем сообщении код. Прогоните у себя. Может я что-то не понимаю.
дело в том что у меня нет 7ки


Sheva
Сообщения: 15
Зарегистрирован: 06 фев 2023, 17:29

Так же была "хотелка" видеть новых клиентов сети в телеграме, получивших динамический IP от микротика. Реализовал без скрипта телеграм через DHCP Server / DHCP / deconf / Script:

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

:if ($leaseBound = 1 && [/ip dhcp-server lease get [find address=$leaseActIP] dynamic ]=true) do={
   :local Time [/system clock get time];
   :local Date [/system clock get date];
   :local Comment [/ip dhcp-server lease get value-name=comment number=[/ip dhcp-server lease find address=$leaseActIP]]
   :local DeviceName [/system identity get name];

     /tool fetch "https://api.telegram.org/botXXX/sendMessage?chat_id=-10XXXX&text=\F0\9F\9F\A2 $DeviceName: %D0%9D%D0%BE%D0%B2%D0%BE%D0%B5+%D1%83%D1%81%D1%82%D1%80%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%BE+%D0%B2+%D1%81%D0%B5%D1%82%D0%B8%3A $"lease-hostname" [$Comment]+IP: $leaseActIP+MAC: $leaseActMAC" output=none;
}

работает на 7й версии/

смотрится так: Изображение


Ответить