Еще один скрипт оповещения в Телеграмм

Здесь выкладываем скрипты
Правила форума
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
Ответить
Sertik
Сообщения: 1601
Зарегистрирован: 15 сен 2017, 09:03

Вот самый короткий и самый нормальный скрипт оповещения в Телеграмм (найден на просторах интернета, где точно не могу уже сказать). Работает как часы, процессор не грузит. Просто и со вкусом. И нечего копья ломать.

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

:global lastTime;
:global output;
:global mtIdentity [/system identity get name];
:global botID "bot745519499:AAEkTGXKD-_Jqrq6uA9E_EXJ9uX067zCXyA";
:global myChatID "709934561";
:local LogGet [ :toarray [ /log find topics~"system" || message~"login failure" || message~"logged" || message~"connected" || message~"[Ff]ailure" ]];
:local LogtLineCount [ :len $LogGet ];
if ($LogtLineCount > 0) do={
   :local currentTime "$[ /log get [ :pick $LogGet ($LogtLineCount -1) ] time ]";
   :if ([:len $currentTime] = 10 ) do={
      :set currentTime [ :pick $currentTime 0 10 ];
   }
   :set output "$currentTime - $[/log get [ :pick $LogGet ($LogtLineCount-1) ] message]";
   :if (([:len $lastTime] < 1) || (([:len $lastTime] > 0) && ($lastTime != $currentTime))) do={
      :set lastTime $currentTime ;
         :tool fetch url=("https://api.telegram.org/$botID/sendmessage\?chat_id=$myChatID&text=%E2%9B%BA\"$mtIdentity\" :  $output") keep-result=no
   }
}


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Аватара пользователя
Virtue
Сообщения: 142
Зарегистрирован: 07 мар 2014, 10:17

Sertik писал(а): 21 дек 2020, 22:29 Вот самый короткий и самый нормальный скрипт оповещения в Телеграмм
Ну что же, посмотрел я код, сравнил со своим и знаете, тут я с вами готов поспорить..

1 насчет "самый короткий" тут я с вами соглашусь, хотя если я в своем коде уберу фишку (определение по маку устройства), нужно будет еще сравнить..

2 насчет "самый нормальный" вот тут началось :hi_hi_hi:

Чем вы определяли "нормальность" данного скрипта? Или же вы сделали такой вывод из первого пункта? (типа чем короче, тем лучше)
А теперь сравнение.
"процессор не грузит" тут я не согласен от слова совсем, данный вами скрипт при каждом своем выполнении "перелопачивает" абсолютно все записи логов, на поиск ключевых topics или message /log find topics~... В моём же скрипте поиск осуществляется только в записях лога за прошедшую минуту /log find time >= ($timeNow - 00:01:00)
При этом разница в нагрузке на процессор будет более выражена при большом количестве записей.

3 Если в логи упало несколько записей, ваш скрипт берет только последнюю, пропуская предыдущие (в моем варианте он отрабатывает все новые записи)

4 Ну и еще: ваш скрипт, я подозреваю, не избавлен от "ночных дублирующих сообщений", по крайней мере этого в коде нет.

5 К тому же в данном скрипте зачем-то используют глобальные переменные, непонятно зачем, если можно было делать локальные...


Sertik
Сообщения: 1601
Зарегистрирован: 15 сен 2017, 09:03

Это не мой скрипт, я же написал, что "найден". Работает хорошо. Можно поправить в нём, чтобы отрабатывал только "последние логи".
Ваш слишком "подраздут". Рационализируете код, мы будет рады признать Ваш скрипт лучшим.


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Аватара пользователя
Virtue
Сообщения: 142
Зарегистрирован: 07 мар 2014, 10:17

Sertik писал(а): 22 дек 2020, 08:47 Это не мой скрипт
Под словом "ваш" я имею ввиду "представленный вами"

Насчет "подраздутости"
Если сейчас начать фиксить "ваш" код, то поверьте, он тоже "подраздуется"..
Свой же код я делал таким образом, что полностью он отрабатывает только по необходимости, в основном же идет условие, при котором основная часть кода опускается. Таким образом его "подраздутая" часть в подавляющем большинстве даже не обрабатывается.

Насчет рационализации я всегда обеими руками ЗА, по этому всегда готов обсудить рациональные предложения.


Sertik
Сообщения: 1601
Зарегистрирован: 15 сен 2017, 09:03

Рационализаторские предложения по Вашему скрипту:
Уберите лишние переменные.

:local logAll [/log find]
:foreach h in=$logAll do={

сразу можно
:foreach h in=[/log find] do={

Определяйте все переменные в начале скрипта, так делают профи на всех языках программирования

Нафига Вам :local mac [/ip dhcp-server lease get $k value-name=mac-address]
можно без всяких "value-name"
:local mac [/ip dhcp-server lease get $k mac-address]

Ну и так далее, про ветвления и задержки я уж не пишу.
А вообще как хотите. Это же Ваш скрипт ...


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Аватара пользователя
Virtue
Сообщения: 142
Зарегистрирован: 07 мар 2014, 10:17

Sertik писал(а): 22 дек 2020, 09:37 Рационализаторские предложения по Вашему скрипту
Пока что могу ответить на ту часть, где вы пишите про гуру и что они объявляют все переменные вначале.
Тут я руководствовался следующей логикой: "зачем сразу объявлять переменную, если не факт, что она будет задействована в данном выполнении скрипта". Тоесть я объявлял переменные непосредственно перед их выполнением.

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


pepelxl
Сообщения: 161
Зарегистрирован: 23 июл 2013, 18:47

Sertik писал(а): 22 дек 2020, 09:37

Определяйте все переменные в начале скрипта, так делают профи на всех языках программирования

Не городите чушь. Читайте предписание тех , кто действительно работает годами.
В начале эпохи программирования действительно рекомендовалось объявлять всё сразу. Но от этого сразу ушли и сейчас принято глобально инициализировать сразу, локально как можно ближе к первому объявлению. Причина довольно проста - когда другой человек читает ваш код , ему не приходится бегать по строкам в поисках инициализации переменной.


Sertik
Сообщения: 1601
Зарегистрирован: 15 сен 2017, 09:03

В его скрипте не 10000 строк. Чего там не понять и куда лазить ?


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Ответить