информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Портрет посетителяГде водятся OGRыВсе любят мед
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Doom на газонокосилках 
 Умер Никлаус Вирт 
 С наступающим 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / sysadmin
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Значит я тоже до сих пор живу в 9-x. ;) Приходиться поддерживать порядка 150 рабочих станций на Win9x. 06.07.05 12:40  Число просмотров: 11824
Автор: Den <Denis> Статус: The Elderman
<"чистая" ссылка>
<sysadmin>
О, великие гуру бат-файлов, а может быть даже vbs-скриптов! I need your help… 05.07.05 07:10   [Den]
Автор: HandleX <Александр М.> Статус: The Elderman
<"чистая" ссылка>
Постановка задачи простая... Как у теоремы Ферма ;-)

Нужно делать периодически резервные копии... При помощи популярного архиватора, к примеру RAR. И при помощи Планировщика Windows, конечно же... Конечная цель работы скрипта -- файл архива в формате ДД-ММ-ГГГГ.rar

Внимание, вопрос: как вставить дату в имя создаваемого файла при помощи бат-файла или скрипта?
Можно, конечно же, наваять консольную софтинку... Но всё-таки хотелось бы встроенными средствами Windows.
Заранее всем огромное спасибо за примеры.
ну если ты хочешь чисто шелловскими возможностями то тогда... 31.03.06 20:27  
Автор: AL_M Статус: Незарегистрированный пользователь
<"чистая" ссылка>
ну если ты хочешь чисто шелловскими возможностями то тогда идея такая:

time > time_stamp < "ENTER"
edlin time_stamp < "2,10dENTERe"
for /f "delims=: tokens=2,3,4" %i in (time_stamp) do set time_stamp =%i_%j_%k
ну а затем вызываешь rar напр. передавая ему в качестве имени архива %time_stamp% (я просто опций рар-а не помню)

дерзай! проверено для вин2000

** в первых двух командах в "" взято содержимое предопределенных файлов которые нужно создать ручками причем маленькие буквы -- то что нужно вводить как есть БОЛЬШИЕ -- назв. спец символа (сам догадаешься какого)


> Постановка задачи простая... Как у теоремы Ферма ;-)
>
> Нужно делать периодически резервные копии... При помощи
> популярного архиватора, к примеру RAR. И при помощи
> Планировщика Windows, конечно же... Конечная цель работы
> скрипта -- файл архива в формате ДД-ММ-ГГГГ.rar
>
> Внимание, вопрос: как вставить дату в имя создаваемого
> файла при помощи бат-файла или скрипта?
> Можно, конечно же, наваять консольную софтинку... Но
> всё-таки хотелось бы встроенными средствами Windows.
> Заранее всем огромное спасибо за примеры.
[NT+ (cmd.exe)] Делай раз, делай два... [upd3] 02.10.05 13:30  
Автор: Den <Denis> Статус: The Elderman
Отредактировано 05.10.05 17:59  Количество правок: 13
<"чистая" ссылка>
> Постановка задачи простая... Как у теоремы Ферма ;-)
>
> Нужно делать периодически резервные копии... При помощи
> популярного архиватора, к примеру RAR. И при помощи
> Планировщика Windows, конечно же... Конечная цель работы
> скрипта -- файл архива в формате ДД-ММ-ГГГГ.rar

Можно так:
rar a -agDD-MM-YYYY -- \_.rar ...

> Внимание, вопрос: как вставить дату в имя создаваемого
> файла при помощи бат-файла или скрипта?
> Можно, конечно же, наваять консольную софтинку... Но
> всё-таки хотелось бы встроенными средствами Windows.
> Заранее всем огромное спасибо за примеры.

Здесь так:
for /F "tokens=2,3,4 delims=- " %%i in ("%date%") do rar a %%k%%j%%i.rar ...
или
for /F "tokens=2,3,4 delims=- " %%i in ('date /t') do rar a %%k%%j%%i.rar ...

---
(Создается архив с датой в имени формата YYYYMMDD.rar
Такое именование позволяет легко сортировать архивы по именам в правильной последовательности дат.)
Обратите внимание, что данный пример приведен для представления даты в ОС формата "dd DD-MM-YYYY", где "dd" - день недели. Поэтому в delims, кроме "-" есть еще и " " (пробел).

Еще вариант:
rar a %date:~9,4%%date:~6,2%%date:~3,2%.rar ...
или
rar a %date:~-4%%date:~-7,2%%date:~-10,2%.rar ...
или
rar a %date:~-4,4%%date:~-7,-5%%date:~-10,-8%.rar ...

---
Что равносильно.
Также в формате YYYYMMDD - универсален для любых разделителей в представлении даты ОС.

А это маленький оффтоп:
(ответ Fly4life'у на http://bugtraq.ru/cgi-bin/forum.mcgi?type=sb&b=21&m=126845 (sorry, та ветка уже закрыта))
for /F "eol=; tokens=1,2 delims= " %%i in (rules.txt) do move /Y %%i %%j

---
Ко всему прочему, в файле rules.txt можно указывать несколько файлов, разделенных запятыми, для перемещения их в один каталог. Эта возможность поддерживается командой move.

На десерт: Frequently Asked Questions Regarding The Windows 2000 Command Processor
О, великий гуру, усложним задачу, сведя ее а очень... 03.10.05 11:33  
Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
Отредактировано 03.10.05 11:35  Количество правок: 1
<"чистая" ссылка>
> А это маленький оффтоп:
> (ответ Fly4life'у на
> http://bugtraq.ru/cgi-bin/forum.mcgi?type=sb&b=21&m
> =126845 (sorry, та ветка уже закрыта))
> for /F "eol=; tokens=1,2 delims= " %%i in
> (rules.txt) do move /Y %%i %%j


О, великий гуру, усложним задачу, сведя ее к очень актуальной в нашей жизни. Для разгребания помойки полезно передвигать целые каталоги, если внутри нет свежих (менее полугода) файлов с рабочего на другой носитель/том/накопитель с сохранением структуры каталогов и прав доступа.
Вот примеры VBScriptов для вашей задачи 06.10.05 09:34  
Автор: svtvl Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> Для разгребания помойки полезно
> передвигать целые каталоги, если внутри нет свежих (менее
> полугода) файлов с рабочего на другой
> носитель/том/накопитель с сохранением структуры каталогов и
> прав доступа.

Получение разницы дат (количество дней)
Wscript.Echo "Days Differ between today and 1 september 2005 " & DateDiff("d","1/9/2005", Date )

Получение даты файла
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.GetFile("c:\windows\system32\scrrun.dll")
Wscript.Echo "Date last accessed: " & objFile.DateLastAccessed
Wscript.Echo "Date last modified: " & objFile.DateLastModified

Копирование каталога полностью, но права доступа меняются на права каталога приёмника
список всех папок в папке
strComputer = "." ' имя компютера
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colFolders = objWMIService.ExecQuery( _
"Select * from Win32_Directory where Name = 'd:\\test'")
For Each objFolder in colFolders
errResults = objFolder.copy("c:\Archive")
' Wscript.Echo errResults, err.description
' Wscript.echo err.number
Next

получение списка файлов в папке
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder("d:\22")
Set colFiles = objFolder.Files
For Each objFile in colFiles
Wscript.Echo objFile.Name, objFile.Size
Next

:) Только, пожалуйста, без приколов. Ok? Если хочешь, чтоб я помог, так и скажи. ;) 03.10.05 12:32  
Автор: Den <Denis> Статус: The Elderman
<"чистая" ссылка>
А если у тебя уже есть решение, то лучше не тратить время в пустую.
Задачка интересная. Можно попробовать.
Ни каких приколов. Просто мне понравилась простота решения и... 03.10.05 16:26  
Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
<"чистая" ссылка>
> А если у тебя уже есть решение, то лучше не тратить время в
> пустую.
> Задачка интересная. Можно попробовать.

Ни каких приколов. Просто мне понравилась простота решения и обрадовало что встречаются еще правильно мыслящие люди.
Насчет помощи - глобально задача так пока не стоит, но очень полезно будет иметь ее решение. И я бы попользовался, и многим пригодилось бы.
Тады вот такой батничик для начала: [upd4] 04.10.05 20:33  
Автор: Den <Denis> Статус: The Elderman
Отредактировано 05.10.05 13:29  Количество правок: 9
<"чистая" ссылка>
Скриптец позволяет расчитать дату по дельте дней от указанной даты и возвращает результат формата YYYYMMDD в стандартный вывод.
Например, при стандарте РФ в представлении даты системы, для получения даты на 183 дня (примерно полгода) раньше текущей надо делать так (в bat файле):

for /F "tokens=* " %%i in ('calcdate.bat "dd DD.MM.YYYY" "%date%" -183') do set $date=%%i
set year=%$date:~0,4%
set month=%$date:~4,2%
set day=%$date:~-2%
rem Результат
echo YYYY=%year%; MM=%month%; DD=%day%

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


@echo off
rem ---------- calcdate.bat ----------
rem --- Written by Den[bugtraq.ru] ---
rem ----------------------------------
rem Enter: %1 - Формат передающейся даты в двойных кавычках: DD, MM, YYYY в любой последовательности с любыми разделителями. Пример: "dd DD-MM-YYYY", dd используются для пропускания дней недели.
rem %2 - Дата в двойных кавычках указанного в %1 формата
rem %3 - Дельта со знаком. Примеры: -180, +3
rem Exit: В стандартном выходе расчетная дата формата YYYYMMDD
setlocal
set $date=%~2
call :getpos YYYY "%~1"
if defined $pos (call set year=%%$date:~%$pos%,4%%) else goto :EOF
call :getpos MM "%~1"
if defined $pos (call set month=%%$date:~%$pos%,2%%) else goto :EOF
call :getpos DD "%~1"
if defined $pos (call set day=%%$date:~%$pos%,2%%) else goto :EOF
rem Отбрасываем признак восьмеричного числа.
for /F "tokens=* delims=0" %%i in ("%day%") do set /a daycount=%%i
for /F "tokens=* delims=0" %%i in ("%year%") do set /a year=%%i
for /F "tokens=* delims=0" %%i in ("%month%") do set /a month=%%i
rem Кол-во високосных
set /a i=(%year%-1)/4
rem Текущий после високосного, если j==4, то идет високосный
set /a j=%year%-%i%*4
rem Кол-во дней в полных годах до текущего
set /a daycount+=%i%*1461+(%j%-1)*365
set /a i=%month%

:loop
set /a i-=1
if %i%==0 goto :next
if %i%==1 set /a daycount+=31
if %i%==2 (if %j%==4 (set /a daycount+=29) else set /a daycount+=28)
if %i%==3 set /a daycount+=31
if %i%==4 set /a daycount+=30
if %i%==5 set /a daycount+=31
if %i%==6 set /a daycount+=30
if %i%==7 set /a daycount+=31
if %i%==8 set /a daycount+=31
if %i%==9 set /a daycount+=30
if %i%==10 set /a daycount+=31
if %i%==11 set /a daycount+=30
if %i%==12 set /a daycount+=31
goto :loop

:next
rem Days after christmas: %daycount%
set /a daycount+=%3
rem Result=%daycount%
set /a i=%daycount%/1461
set /a j=%daycount%-%i%*1461
if %j%==0 set /a i-=1
set /a daycount-=%i%*1461
set /a year=%i%*4
set /a i=%daycount%/365
if %j%==0 set /a i-=1
set /a j=%daycount%-%i%*365
if %j%==0 set /a i-=1
set /a daycount-=i*365
set /a i+=1
set /a year+=%i%
set /a j=%daycount%
set /a month=1

:loop_1
if %month%==1 set /a j-=31
if %month%==2 (if %i%==4 (set /a j-=29) else set /a j-=28)
if %month%==3 set /a j-=31
if %month%==4 set /a j-=30
if %month%==5 set /a j-=31
if %month%==6 set /a j-=30
if %month%==7 set /a j-=31
if %month%==8 set /a j-=31
if %month%==9 set /a j-=30
if %month%==10 set /a j-=31
if %month%==11 set /a j-=30
if %month%==12 set /a j-=31
if %j% LEQ 0 goto :next_1
set /a month+=1
set /a daycount=%j%
goto :loop_1

:next_1
set lz=0000
call :getlen "%year%"
set /a $len=4-%$len%
if not %$len%==0 call set year=%%lz:~-%$len%%%%year%
call :getlen "%month%"
set /a $len=2-%$len%
if not %$len%==0 call set month=%%lz:~-%$len%%%%month%
set /a days=%daycount%
call :getlen "%days%"
set /a $len=2-%$len%
if not %$len%==0 call call set days=%%lz:~-%$len%%%%days%
echo %year%%month%%days%
endlocal
goto :EOF


:getlen
rem Enter: %1 - Строка в двойных кавычках
rem Exit: $len - Длина строки без учета двойных кавычек
set par=%~1
set /a i=0
set $len=

:getlen_loop
call :getlen_1 "%%par:~%i%,1%%"
if defined $len goto :EOF
set /a i+=1
goto :getlen_loop

:getlen_1
if %1=="" set /a $len=%i%
goto :EOF

:getpos
rem Enter: %1 - Искомая строка в двойных кавычках
rem %2 - Строка-источник в двойных кавычках
rem Exit: $pos - Позиция искомой строки в строке-источнике без учета двойных кавычек.
call :getlen "%~1"
set /a $findlen=%$len%

call :getlen "%~2"
set /a $formatlen=%$len%-1
set par=%~2
set /a i=0
set $pos=

:getpos_loop
call :getpos_1 %i% "%~1" "%%par:~%i%,%$findlen%%%"
if defined $pos goto :EOF
if %i%==%$formatlen% goto :EOF
set /a i+=1
goto :getpos_loop

:getpos_1
if %2==%3 set /a $pos=%i%
goto :EOF
rem ---------- END calcdate.bat ----------

---
Зря я это затеял... 05.10.05 11:44  
Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
Отредактировано 05.10.05 11:45  Количество правок: 1
<"чистая" ссылка>
Можно то оно скорее всего можно, но не следует этого делать на командных интерпретаторах. Если уж работа с датами такая, то обходить каталоги, просматривая файлы на предмет даты их последнего изменения, вообще будет убийство.
Не надо так думать! ;) Есть решение! [upd3] 07.10.05 17:19  
Автор: Den <Denis> Статус: The Elderman
Отредактировано 16.07.07 16:43  Количество правок: 5
<"чистая" ссылка>
Это у меня дата расчитывается по кол-ву дней, а ведь можно и упростить, сделать расчет по месяцам почти без изменения дня месяца. Получится немного быстрее, но просядет гибкость.

> Можно то оно скорее всего можно, но не следует этого делать
> на командных интерпретаторах.

Почему же?
Все равно все это будет делаться ночью, запускаясь из шедулера. Не думаю, что у тебя уровень вложенности каталогов на столько велик, что скрипт не отработает за час.
Мы же не будем даты каталогов конвертить через calcdate.bat.

> Если уж работа с датами
> такая, то обходить каталоги, просматривая файлы на предмет
> даты их последнего изменения, вообще будет убийство.

Это, как раз менее серьезная и менее времязатратная проблема.

Решение задачи:
(выполняется очень быстро за счет оптимизации парсинга подкаталогов)
@echo off
rem ---------- deltabkp.cmd ----------
rem --- Written by Den[bugtraq.ru] ---
rem ----------------------------------
rem Enter: %1 - Source directory
rem   %2 - Date delta
setlocal
if "%~2"=="" (
  echo !Error! Date delta not defined.
  goto :eof
)
set /a datedelta=%~2
if "%~1"=="" (
  echo !Error! File directory not defined.
  goto :eof
)
set srcdir=%~f1
if "%srcdir:~-1,1%"=="\" set srcdir=%srcdir:~0,-1%
rem --- Получаем разделитель и формат даты
:loopreg
set regfile=%random%.reg
if exist %regfile% goto :loopreg
regedit /e %regfile% "HKEY_CURRENT_USER\Control Panel\International"
if not exist %regfile% (
  echo !Error! REG file not found.
  goto :eof
)
for /F "skip=2 tokens=1,* delims== eol=[" %%i in ('type %regfile%') do if "sDate"=="%%~i" (
  set datedelim=%%~j
) else if "sShortDate"=="%%~i" set dateform= %%~j
del /Q %regfile%
if not defined datedelim (
  echo !Error! Date delimiter not defined.
  goto :eof
) else if not defined dateform (
  echo !Error! Date format not defined.
  goto :eof
)
set dateform=%dateform:d=D%
set dateform=%dateform:m=M%
for /F "delims=yY tokens=1,*" %%k in ("%dateform%") do set dateform=%%kYYYY%%l
set dateform=%dateform:~1%

rem --- Получаем позиции DD,MM,YYYY
for /F "delims=%datedelim% tokens=1,2,3" %%i in ("%dateform%") do (
  if "%%i"=="DD" (
    if "%%j"=="MM" (set $dateorder=%%z%%y%%%x
    ) else (set $dateorder=%%y%%z%%%x
  )) else if "%%i"=="MM" (
    if "%%j"=="DD" (set $dateorder=%%z%%x%%%y
    ) else (set $dateorder=%%y%%x%%%z
  )) else (
    if "%%j"=="DD" (set $dateorder=%%x%%z%%%y
    ) else (set $dateorder=%%x%%y%%%z
  ))
)
rem --- Получаем дату по дельте от текущей
for /F %%i in ('calcdate.cmd "dd %dateform%" "%date%" %datedelta%') do set $date=%%i
:looptmpfile
set tmpfile=%temp%\dbp%random%.tmp
if exist %tmpfile% goto :looptmpfile
set lvl=0
set baklvl=0
set $dir=
rem "File Not Found" error message from "dir "%~1\*" /a-d/4" command to NUL
call :nextlvl "%srcdir%" 2>nul
if exist %tmpfile% del /Q %tmpfile%
endlocal
goto :eof

:do
rem ----- START BACKUP -----
rem Examples
rem call backup.cmd "%~1"
rem rar m -cfg- -ep2 -idp -m5 -os -ow -s -t -- old_%$date%.rar "%~1"
echo dir=%1
rem ------ END BACKUP ------
goto :eof

:nextlvl
set /a lvl+=1
set /a baklvl+=1
for /F %%d in ('dir /b /ad "%~1\*"') do (
  call :nextlvl "%~1\%%d"
)
if %baklvl% LSS %lvl% (
rem --- New files in subdirectories
  set /a updlvl=%lvl%-1
  set /a lvl-=1
  goto :eof
)

set updated=0
dir "%~1\*" /a-d/4 >nul
if errorlevel 0 (
  for /F "skip=5 tokens=1 eol=  " %%f in ('dir "%~1\*" /a-d/4') do (
    for /F "tokens=1,2,3 delims=%datedelim%" %%x in ("%%f") do (
      if not "%%y"=="" (
        if %$dateorder% GTR %$date% set updated=-1
      )))
)

if %updated%==-1 (
rem --- New files found in directory
  if %baklvl% GTR %lvl% (
  rem --- Old files in subdirectories, back it up!
    for /F "tokens=*" %%f in (%tmpfile%) do call :do %%f
    del /Q %tmpfile%
  )
  set /a lvl-=1
  goto :eof
) else (
rem --- New Files not found in directory
  set baklvl-=1
  echo "%~1" >>%tmpfile%
)

:ret
set /a lvl-=1
goto :eof

---
Дык че? Типа, я зря старался? 14.10.05 18:47  
Автор: Den <Denis> Статус: The Elderman
<"чистая" ссылка>
Как это зря... Очень нужно. Сейчас загружен, есть только полчаса в день чтоб к компу подойти. Дай еще пару дней. 18.10.05 15:11  
Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
<"чистая" ссылка>
Таки ты попробовал? 22.03.06 13:37  
Автор: Den <Denis> Статус: The Elderman
<"чистая" ссылка>
Ну да, забыл сразу отписать. Глючит. Пару каталогов с... 22.03.06 16:38  
Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
<"чистая" ссылка>
Ну да, забыл сразу отписать. Глючит. Пару каталогов с файлами порядка 2002-2004 года один выдает, другой нет. С чем связано, пока не разобрался. Склепаю dir и то что она выдает и кину.
А может и не должен? [upd] 28.03.06 17:03  
Автор: Den <Denis> Статус: The Elderman
Отредактировано 17.09.13 20:09  Количество правок: 2
<"чистая" ссылка>
Алгоритм работы следующий:

1. Если в каталоге со "старыми" файлами существует подкаталог с "новыми" файлами, то ничего не бэкапится.

2. Если в каталоге с "новыми" файлами существуют подкаталоги со "старыми" файлами, то бэкапятся подкаталоги.

3. Если в каталоге и подкаталогах только "старые" файлы, то бэкапится верхний каталог вместе с подкаталогами.

[upd]
Действительно глючило. Нашел одну серьезную ошибку. Поправил.
Добавил доп.функционал, теперь скрипт сам определяет формат даты системы.
Где новая версия? 19.09.13 00:33  
Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
<"чистая" ссылка>
думаю, не актуально 21.09.13 05:50  
Автор: Den <Denis> Статус: The Elderman
<"чистая" ссылка>
По-моему это твой случай 05.09.05 10:03  
Автор: apb Статус: Незарегистрированный пользователь
<"чистая" ссылка>
http://white55.narod.ru/cmd.html
Этим занимается One-click BackUp for WinRAR... 31.08.05 09:22  
Автор: Игорь Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> Постановка задачи простая... Как у теоремы Ферма ;-)
>
> Нужно делать периодически резервные копии... При помощи
> популярного архиватора, к примеру RAR. И при помощи
> Планировщика Windows, конечно же... Конечная цель работы
> скрипта -- файл архива в формате ДД-ММ-ГГГГ.rar

Этим занимается One-click BackUp for WinRAR (http://acritum.com). Есть встроенный планировщик и поддержка коммандной строки для внешнего планировщика. Программа шарварная, но в xUSSR продают за любую цену, начиная от 150 рублей :) Я купил себе через Webmoney за 200 рублей - совсем не жалею, программа реально очень удобная и стоит того, чтобы за нее заплатить. Есть русский интерфейс. Была еще совсем бесплатная версия 1.x без многих функций, добавленных в версии 2.x (очень примитивный планировщик, нет поддержки CDRW, FTP, SMTP, LAN, нет удаленного контроля через интернет и LAN, но на жесткий диск бэкапит без проблем).
Nncron и без рара бы справился 22.07.05 10:59  
Автор: Annihitor Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> Можно, конечно же, наваять консольную софтинку... Но
> всё-таки хотелось бы встроенными средствами Windows.
> Заранее всем огромное спасибо за примеры.

Ненадо ничего ваять. Если бы рар не умел делать такие файлы то есть NNCRON
http://www.nncron.ru/
позволяет назначать любые задания и алгоритмы для управления ПК, дефргагментацию, архивацию, синхронизацию времени, выключение, обновление, получение почты, отработка горячих клавих, окошек и т.п. практически полностью может заменить своими макросами простые действия пользователя.
Программа просто незаменима, в некоторых случаях.
1  |  2 >>  »  




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach