Здравствуйте.
Очень давно наткнулся на вашего бота, немножко его адаптировал под свои нужны, но сама логика работы осталась неизменной. А именно "шапка"
Код: Выделить всё
: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" с проверкой
отсеют другие статические записи под одним и тем же мак адресом. Абонент в теории может получись адрес из разных подсетей.
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.
В целях проверки, удалил все остальное, отвечающее за оповещение, оставив только
дабы видеть, что именно скрипт черпает с логов. И он успешно работал, до поры до времени. До 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);
}
В результате, в логах, единственная и последняя цифра текущего времени...