Загрузка данных


@echo off
chcp 65001 >nul
setlocal enabledelayedexpansion

set "SITE_TO_CHECK=y000a.ru"
set "LOG_FILE=C:\ping_monitor\log.txt"

:: Создаём папку, если её нет
if not exist "C:\ping_monitor" mkdir "C:\ping_monitor"

:: Проверяем, есть ли уже файл лога, если нет — создаём его
if not exist "%LOG_FILE%" echo [INFO] Log file created. > "%LOG_FILE%"

:: Переменные для отслеживания состояния
set /a DOWN_TIME=0
set /a UP_TIME=0
set /a bad_counter=0

echo Скрипт запущен. Проверка доступности %SITE_TO_CHECK%...
echo Для выхода нажмите Ctrl+C
echo.

:loop
:: Выполняем пинг и сохраняем результат во временную переменную
ping -n 1 %SITE_TO_CHECK% > C:\ping_monitor\temp_ping.txt
find "TTL=" C:\ping_monitor\temp_ping.txt >nul

if errorlevel 1 (
    :: Сайт НЕ доступен
    if !bad_counter! LSS 5 (
    	set /a bad_counter+=1
	echo [!time!] Попытка %bad_counter%: сайт %SITE_TO_CHECK% недоступен
    )
    if !bad_counter! EQU 5 (
        if !DOWN_TIME! EQU 0 (
            call :GetUnixTime DOWN_TIME
            if !DOWN_TIME! GTR 0 (
                echo [!time!] САЙТ НЕДОСТУПЕН!
                echo [%date% !time!] Сайт %SITE_TO_CHECK% недоступен >> "%LOG_FILE%"
            ) else (
                echo [ОШИБКА] Не удалось получить Unix-время!
            )
        )
    )
) else (
    :: Сайт доступен
    if !DOWN_TIME! GTR 0 (
        call :GetUnixTime UP_TIME
        if !UP_TIME! GTR 0 (
            call :get_duration
            echo [!time!] Сайт снова доступен.
            echo [!time!] Интервал недоступности: !DURATION!
            echo [%date% !time%] Сайт снова доступен. Интервал недоступности: !DURATION! >> "%LOG_FILE%"
            set /a DOWN_TIME=0
            set /a UP_TIME=0
        ) else (
            echo [ОШИБКА] Не удалось получить текущее Unix-время!
        )
    )
    set /a bad_counter=0
)

:: Удаляем временный файл
del temp_ping.txt 2>nul
timeout /t 1 /nobreak >nul
goto :loop

:get_duration
set /a DIFF_SEC = !UP_TIME! - !DOWN_TIME!
if !DIFF_SEC! LSS 0 set /a DIFF_SEC=0
call :seconds_to_hhmmss !DIFF_SEC!
set "DURATION=!RETURN_VALUE!"
goto :eof

:GetUnixTime
setlocal
:: Получаем Unix-время через PowerShell
for /f %%t in ('powershell -Command "(Get-Date).ToUniversalTime().ToFileTimeUtc() / 10000000 - 11644473600" 2^>nul') do (
    set "unix_time=%%t"
)
:: Проверяем, что получили число
if defined unix_time (
    endlocal & set "%1=%unix_time%"
) else (
    endlocal & set "%1=0"
)
goto :eof

:seconds_to_hhmmss
set /a "hours=%~1 / 3600", "minutes=( %~1 %% 3600 ) / 60", "secs=( %~1 %% 60 )"
if %hours% LSS 10 set "hours=0%hours%"
if %minutes% LSS 10 set "minutes=0%minutes%"
if %secs% LSS 10 set "secs=0%secs%"
set "RETURN_VALUE=!hours!:!minutes!:!secs!"
goto :eof