задача по мониторингу состояния хостов в сети древняя, у меня было несколько реализаций, какую-то реализацию делал некий Влад (судя по коду может и не один), но собравший с остатками здравомыслия пришел я к следующему проекту:
1. Перечень хостов и их названий хранится в файле.
2. Мы отслеживаем отключение либо включение хоста в сети (по протоколу icmp)
3. Сообщения "уходят" в телеграмм, так как задач несколько, с ним мы работаем на модульном уровне, как в результат сложилось - используем глобальную переменную для сообщения, а в теле вызываем скрипт.
4. Периодически проверяем состояние и работоспособность самого скрипта, например в начале рабочего времени и в конце.
Программу решил писать не я, а стать архитектором, поручив Искусственному интеллекту реализацию идей, и был я довольно раздосадован....с ROS неважно работает ИИ, а сколько раз он указывал что мой скрипт работать не будет и мне нужно обновиться на 7ю версию ROS и без этого вообще никак.....но результат положительный есть, и опыт у ИИ есть, получал я седые волосы с Gemni и Grok, кстати второй очень неплохо пишет короткий код, а вот в многострочный проектах его дерзость в принятии спорных решений просто убивает желание с ним работать, он тот самый неуч:) который может всё, а вот Gemni почти наоборот, и плохо что я не почувствовал явного прогресса от ИИ, иногда приходилось возвращаться по коду, так они не могли воспроизвести уже отработанный рабочий код. Да скрипт в ROS это специфическое, но не Perl и т.п. в конце концов...
начнем:
файл в котором хранятся данные
=================== host_data.txt ========================
192.168.0.2;comp1
192.168.0.3;comp10
====================================================
файл самого скрипта...
===================skript1
:local filePath "flash/host_data.txt" :local fileCheckResult [/file find name=$filePath] :global telegramMessage :global hostStatus :if ([:typeof $hostStatus] = "nothing") do={ :set hostStatus [:toarray ""] :local i :for i from=0 to=129 do={ :set ($hostStatus->$i) -1 } } #:log info "MONITORING_START: Skript zapushen dlya monitoringa uzlov i otpravki Telegram." :if ($fileCheckResult = "") do={ :set telegramMessage "MONITORING_ERROR: FAIL flash/host_ping.txt NE NAIDEN!" :log error $telegramMessage :log info "MONITORING_TELEGRAM_FILE_ALERT: Vyzyvayu telegram_api_get dlya faila." /system script run telegram_api_get :log info "MONITORING_TELEGRAM_FILE_ALERT: telegram_api_get vyzvan dlya faila." :return } :local fileContent [/file get $filePath contents] :local remainingContent $fileContent :local lineCount 0 :local currentLine "" :local newlinePos 0 :while ([:len $remainingContent] > 0) do={ :set newlinePos [:find $remainingContent "\n"] :if ($newlinePos != -1) do={ :set currentLine [:pick $remainingContent 0 $newlinePos] :set remainingContent [:pick $remainingContent ($newlinePos + 1) [:len $remainingContent]] # :log info $newlinePos } else={ :set currentLine $remainingContent :set remainingContent "" } :set lineCount ($lineCount + 1) # Ïðîïóñêàåì ïóñòûå ñòðîêè :if ([:len $currentLine] = 0) do={:continue} # Ïðîâåðêà íà ïðåâûøåíèå ìàêñèìàëüíîãî êîëè÷åñòâà ýëåìåíòîâ :if ($lineCount > 130) do={ :set telegramMessage ("MONITORING_ERROR: Prevyøåí limit v 130 uzlov v faile " . $filePath . "!") :log error $telegramMessage :log info "MONITORING_TELEGRAM_LIMIT_ALERT: Vyzyvayu telegram_api_get dlya oshibki limita." /system script run telegram_api_get :log info "MONITORING_TELEGRAM_LIMIT_ALERT: telegram_api_get vyzvan dlya oshibki limita." :return } :local ipAddress "" :local nodeName "" :local semicolonPos [:find $currentLine ";"] :if ($semicolonPos != -1) do={ :set ipAddress [:pick $currentLine 0 $semicolonPos] :set nodeName [:pick $currentLine ($semicolonPos + 1) [:len $currentLine]] # :log info ("MONITORING_INFO: Obrabotka uzla: " . $nodeName . " (" . $ipAddress . ")") } else={ :set telegramMessage ("MONITORING_WARNING: Nepravilniy format stroki #" . $lineCount . ": '" . $currentLine . "'. Propuskaem.") # :log warning $telegramMessage # :log info "MONITORING_TELEGRAM_FORMAT_ALERT: Vyzyvayu telegram_api_get dlya oshibki formata." /system script run telegram_api_get # :log info "MONITORING_TELEGRAM_FORMAT_ALERT: telegram_api_get vyzvan dlya oshibki formata." :continue } :local pingCommandResult [/ping $ipAddress count=3 interface=bridge] :local currentStatus :if ($pingCommandResult = 0) do={ :set currentStatus 0 } else={ :set currentStatus 1 } :local arrayIndex ($lineCount - 1) :local previousStatus ($hostStatus->$arrayIndex) :if ($currentStatus != $previousStatus) do={ :if ($currentStatus = 0) do={ :set telegramMessage ("MONITORING_ALERT: UZEL NE OTVETCHAET: " . $nodeName . " (" . $ipAddress . ")!") /system script run telegram_api_get } else={ :set telegramMessage ("MONITORING_STATUS: UZEL " . $nodeName . " (" . $ipAddress . ") - VOSSTANOVLEN!") /system script run telegram_api_get } } else={ :if ($currentStatus = 0) do={ # :log info ("MONITORING_STATUS: UZEL " . $nodeName . " (" . $ipAddress . ") - OSTAYETSYA NEDOSTUPNYM.") } else={ # :log info ("MONITORING_STATUS: UZEL " . $nodeName . " (" . $ipAddress . ") - OSTAYETSYA DOSTUPNYM.") } } :set ($hostStatus->$arrayIndex) $currentStatus } #:log info "MONITORING_COMPLETE: Skript zavershen."
========================
:global hostStatus :if ([:typeof $hostStatus] != "array") do={ :log warning "UPDATE_HOST_STATUS: non massiv." :return } :local arrayLength [:len $hostStatus] :local i 0 :while ($i < $arrayLength) do={ :local currentValue ($hostStatus->$i) :if ($currentValue = 0) do={ :do { :set ($hostStatus->$i) -1 } on-error={ :log error "UPDATE_HOST_STATUS: error update" } :log info "UPDATE_HOST_STATUS: update" } else={ :log info "UPDATE_HOST_STATUS: non update" } :set i ($i + 1) }
====================
Дальше думаем о sheduler