koalvi.blogspot.com - другой мой блог "сойдет на троечку"

среда, 16 июля 2025 г.

Mikrotik. ROS. Мониторинг состояния хостов по icmp.

 задача по мониторингу состояния хостов в сети древняя, у меня было несколько реализаций, какую-то реализацию делал некий Влад (судя по коду может и не один), но собравший с остатками здравомыслия пришел я к следующему проекту:

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

воскресенье, 19 сентября 2021 г.

объединение двух тестовых фалов в Lazarus (Delphi) "по-старому"...

 Просто возмутило осложнение вариантов объединения двух текстовых файлов  в Lazarus (Delphi) во множестве вариантов поэтому поступили так:

var
tfOut,tfIn:textfile;
file_s1,file_s2:string;
...
AssignFile(tfOut, file_s1);
AssignFile(tfIn, file_s2);
reset(tfIn);
 try
append(tfOut);
while not eof(tfIn) do begin
readln(tfIn,body_file);
writeln(tfOut,body_file);
end;
   CloseFile(tfIn);
   CloseFile(tfOut);
 except
   on E: EInOutError do
    writeln('File error. Elaboration: ', E.Message);
 end;
===================================================
если говорить вообще об тестовом способе через консоль -
If ShellExecute(0,nil, PChar('cmd'),PChar('/c copy text1.txt+text2.txt /b text1.txt'),nil,1)=0 then;

 0/1 открывать окно консоли или нет, 
/С /K - закрывать/не закрывать окно консоли после выполнения
но при обработке тысяч файлов этот метод не справляется по скорости обработки, у меня происходит отказ доступа после какого-то времени

вторник, 2 февраля 2021 г.

изменяем в домене дефолтные прежде настройки паролей пользователей

===user.csv=============

SamAccountName

vova

misha

bobik

===============un_pass_neverexp.ps1=======

import-csv user.csv | ForEach-Object { Set-ADUser -Identity $_.SamAccountName -PasswordNeverExpires:$FALSE -CannotChangePassword:$FALSE}

позволяет убрать галочку о том что пароль никогда не состарится + разрешаем менять пароль самому пользователю


================== узнать у кого когда заканчиваются пароли

Get-ADUser -filter * -properties PasswordLastSet, UserPrincipalName, PasswordNeverExpires| ft Name, PasswordLastSet, PasswordNeverExpires | Export-csv -path c:\report\password.csv -Encoding UTF8

пятница, 9 ноября 2018 г.

сжатие sysdba

SET ISC_USER=SYSDBA
SET ISC_PASSWORD=masterke

copy /Y base1.gdb base1_original.gdb
gbak -b base1.gdb base1_pack.gdb
gbak -r 1b52_pack.gdb base1+.gdb


очень вероятно что нужно

gbak -b -g  base1.gdb base1_pack.gdb

и возможно что

gfix.exe -sweep

.....

понедельник, 2 июля 2018 г.

вторник, 19 июня 2018 г.

получение email из файла thuderbird

Это часть проекта, в котором нужно получить адреса почтовых ящиков компьютера,
с регулярными для этой задачи у меня не сложилось, поэтому тупой но работающий код
===
{   string path = @"E:\thunderbird\6yjr55bj.default\prefs.js";
            string[] readText = File.ReadAllLines(path);
            string outs = "";
            string  ss;
            foreach (string s in readText)
            { if (s.IndexOf("useremail") > -1)               
                {   ss = s;
                    ss = ss.Replace("user_pref(\"mail.identity.id", "");
                    ss=ss.Replace(".useremail\", ", "");
                    ss = ss.Replace("\");", "");
                    ss = ss.Substring(ss.IndexOf("\"")+1);
                    outs += ss + Environment.NewLine;
                }}
            MessageBox.Show(outs); }
===

воскресенье, 4 февраля 2018 г.

запуск единственного экземпляра программы C#


  static void Main()
        {
            if (System.Diagnostics.Process.GetProcessesByName(Application.ProductName).Length > 1)
            {
                MessageBox.Show("Applicat ion has already running");
                return;
            }
            else
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            }