Жанр: Учеба

Приемы профессиональной работы в Unix

сторінка №10

сткий диск может иметь максимум четыре раздела. Это огра-
ничение MS DOS, которое перенесено в мир XENIX. Ничего плохого в этом
нет, пока мы не начинаем работать с жестким диском большой емкости. Для
70-мегабайтного диска, например, вы можете создать четыре рав-
ных раздела, каждый из которых содержит приблизительно 17 Мбайт. Вы мо-
жете создать меньший раздел, но тогда другой раздел должен быть больше.
В зависимости от того, какая часть ваших программ и данных должна быть
использована в основном MS-DOS и какая - XENIX, может быть использована
различная конфигурация.
Большим преимуществом системы XENIX/DOS является то, что XENIX мо-
жет размещаться в одном разделе, а DOS в другом. Как это сделать? Нужно
запустить программу "fdisk" в каждой операционной системе. Это значит,
что XENIX может общаться с разделом DOS, получая полное имя устройства,
указывающее на другой раздел. Драйвер, который читает раздел DOS, дол-
жен знать, как выглядит DOS (т.е. знать файловую систему DOS). Если вы-
полнить такую операцию, можно получать списки файлов и копировать их
туда и обратно. К сожалению, DOS не имеет возможности чтения разделов
XENIX.
При работе с гибким диском вы имеете дело только с одним разделом.
Это снова ограничение DOS. Некоторые системы UNIX, в отличие от DOS,
позволяют иметь столько разделов на жестком или гибком диске, сколько
вы хотите, в отличие от DOS. По определению, гибкий диск DOS сформати-
рован в системе DOS, которая выполняет форматирование низкого уровня и
помещает файловую систему DOS на гибкий диск.
В системе XENIX гибкий диск может быть либо в формате файловой
системы, либо неструктурированным устройством последовательного доступа
подобно магнитной ленте. Для процедуры dosflp мы используем только гиб-
кие диски в формате DOS.
Теперь к делу. Предположим, вы имеете систему DOS и файлы, находя-
щиеся на диске DOS, вы можете читать и писать файлы на гибкий диск из
XENIX. Но существуют некоторые ограничения на выполнение операции копи-
рования, которые не слишком удобны пользователю. Например, вы можете
сказать "doscp *.c a:". В результате все файлы текущего каталога кото-
рые оканчиваются на .c, будут скопированы на гибкий диск формата DOS на
устройстве a:. Побочный эффект выполнения doscp заключается в том, что
все символы перевода строки (или прогона строки) превращаются в символ
возврат каретки/перевод строки, поскольку DOS обрабатывает конец строки
иначе, чем XENIX. Таким же образом, когда вы копируете с гибкого диска
формата DOS в XENIX, лишние символы возврата каретки убираются.
Что вы не можете сделать, так это сказать "doscp a:*.c". Команда
doscp не допускает указания вида *.c при копировании с гибкого диска.
Это происходит потому, что командный процессор распространяет метасим-
волы (*,?,[]) и не может непосредственно читать раздел DOS. Поэтому вы
не можете использовать символы при копировании с гибкого диска DOS.
Отметим, что может наблюдаться гораздо больше побочных эффектов,
когда вы имеете дело с гибкими дисками DOS. Во-первых, длина имени фай-
ла ограничена. DOS допускает до восьми символов имени файла плюс три
символа расширения. В результате после копирования всех ваших файлов
XENIX на гибкий диск многие из них могут иметь не те имена, которые они
имели в XENIX. Это сущее страдание, когда вы пытаетесь сделать копию на
гибкие диски DOS, потому что вы больше не имеете уверенности, как обра-
щаться к файлам, когда вы копируете их обратно с гибкого диска. Кроме
того, поскольку расширение имени файла в DOS имеет только три символа,
файл с именем "spreadsheet.finance" может оказаться на гибком диске DOS
с именем "spreadsh.fin" и распознавание его может представлять опреде-
ленные трудности.
Но это еще не все. Когда файл копируется из XENIX в DOS, ВСЕ имена
в DOS записываются заглавными буквами. Если у вас есть файлы с именами,
в которых смешаны верхний и нижний регистры, то вы несколько потеряете
понятность имен. Если вы используете в именах символы верхнего регистра
при копировании файлов обратно в XENIX, они не переводятся на нижний
регистр. В результате все имена ваших файлов оказываются записанными
символами верхнего регистра в XENIX, что не очень удобно.
В чем мы нуждаемся, так это в таком средстве, которому мы можем
указывать, какие файлы копировать с гибкого диска на жесткий диск, и
которое копирует их с сохранением регистра в имени файла. Все это дела-
ет процедура dosflp.

Что делает dosflp?

Dosflp пытается исключить все негативные аспекты копирования фай-
лов XENIX/DOS. Это высокое требование, но оно достижимо. Вкратце подход
dosflp следующий: получить список имен файлов с гибкого диска, пере-
вести имена в нижний регистр, выбрать из полного списка имена тех фай-
лов, которые соответствуют вашим требованиям, и затем копировать файлы
один за другим в текущий каталог XENIX. Для того, чтобы сделать это,
требуется гораздо больше команд XENIX вида dosxx, а также различных
других команд XENIX.

В дополнение к копированию, dosflp также выдает список файлов, ко-
торые имеются на гибком диске DOS, и удаляет файлы с гибкого диска. Эти
функции легко реализовать, потому что как только один раз процедура
доступа написана, добавить новые команды для выполнения операций над
файлами довольно просто.
Обычно мы хотим управлять файлами определенного типа как группой.
Сюда относятся ассемблерные исходные файлы, исходные файлы на языке C и
файлы-заголовки на языке C. Поэтому, чтобы снять с вас обязанности по
вводу универсальных символов для этих типов файлов, мы прямо указываем
их в качестве опций команды dosflp. Например, ключ -a копирует только
файлы, которые оканчиваются на .asm, поэтому нет необходимости помнить
вид выражения для копирования этих файлов. Аналогично, ключ -c копирует
все файлы, оканчивающиеся на .c, и ключ -h копирует файлы, оканчивающи-
еся на .h.
Как мы увидим позже, прямое указание, о котором мы говорим здесь,
являеется выражением для команды grep. Использование всех возможностей
команды grep достигается при указании образцов имен файлов.
Используйте ключ -d для указания, с какого гибкого диска произво-
дится копирование. По умолчанию это устройство a: или A:. Не имеет зна-
чения, на каком регистре вы укажете имя устройства. Для уверенности
проверьте файл /etc/default/msdos. Этот файл содержит соответствия меж-
ду символом устройства и маршрутным именем XENIX. Например, файл может
выглядеть так:
A=/dev/fd048ds9
B=/dev/fd148ds9
C=/dev/hd0d
D=/dev/hd1d
X=/dev/fd096ds15
Y=/dev/fd196ds15
Как вы видите, маршрутные имена - это обычные имена устройств и
ничего больше.
В качестве основного средства выполнения работы dosflp использует
команду doscp. Это утилита способна понимать формат файловой системы
DOS. Dosflp передает ей обозначение устройства и другие опции
посредством переменных командного процессора. Например, ключ "-dB:" ме-
няет устройство на B вместо принятого по умолчанию устройства A.
Если выражения прямого указания типа файлов не соответствуют тому,
что вам нужно, вы можете определить свои собственные выражения со-
поставления, используя ключ -e. Напомним, что выражение должно соот-
ветствовать синтаксису команды grep. Если вы хотите освежить свою па-
мять, посмотрите grep(1) в руководстве по AT&T UNIX или grep(C) в руко-
водстве по XENIX. Для получения полной информации о синтаксисе посмот-
рите ed(1). Этот синтаксис является основой большинства команд, работа-
ющих с регулярными выражениями, таких как sed и grep.
Например, если вы используете выражение "*test*", выражение для
grep должно иметь вид ".*test.*". Его можно слегка изменить в зависи-
мости от того, что вы желаете иметь с каждой стороны цепочки test. В
данном случае синтаксис указывает все символы (.*), за которыми следует
цепочка t-e-s-t, а затем любая цепочка символов (.*). В этом случае
ключ имел бы вид "-e.\*test.\*". Это кажется немного странным, но это
соответствует синтаксису. (Двойные кавычки не являются частью команды.)
Символ обратной косой черты (\) используется для экранирования звездоч-
ка. Если вы не экранируете ее, командный процессор соотнесет ее с име-
нами всех файлов вашего текущего каталога, чего вы не желаете. Экрани-
рование ее позволит, чтобы нужный символ был передан dosflp, для
использования ее в grep-последовательности.
Ключ -h - это еще один из ключей прямого указания. Давайте вкратце
рассмотрим его синтаксис внутри dosflp. Это ".*\.h$", и он указывает
любой символ, за которым стоит одно или несколько вхождений любого сим-
вола (.*), литеральная точка (.\), символа h и вслед за ним конец стро-
ки (h$). Вы могли бы указать то же самое, используя ключ -e, но -h де-
лает это гораздо легче.
Ключ -l изменяет основное действие команды dosflp. Вместо копиро-
вания файлов он выдает список файлов. Это делается путем выполнения
различных команд вида dosxx, в данном случае dosdir. Ключ выдачи списка
полезен в dosflp, потому что вы можете получить список как информацию к
решению о том, что делать дальше, и вам нет необходимости помнить ко-
манду dosdir.
Ключ -r также изменяет основную операцию команды dosflp. В этом
случае файлы удаляются, а не копируются. Если вы указали этот ключ, вы-
дается сообщение, которое просит вас подтвердить, что вы хотите удалить
указанные файлы. Вы можете просто ответить "n", и запретить удаление,
если вы ввели этот опцию случайно. Напомним, что удаленные файлы или
файлы, включенные в список (в случае ключа -l), выбраны выражением
grep, которое жестко запрограммировано или указано пользователем. По
умолчанию выбираются ВСЕ файлы. Для ключа -r это соответствует тому,
что сказать "rm *".

Последний ключ, -s, обеспечивает возможность доступа к файлам, ко-
торые размещены внутри подкаталога на гибком диске DOS. Если вы обраща-
етесь только к имени устройства, по умолчанию ключ -s относится к ката-
логу самого верхнего уровня на гибком диске. Если нужный вам файл нахо-
дится в подкаталоге, вы должны использовать определенную нотацию, чтобы
попасть в него. Одно из различий между XENIX и DOS заключается в симво-
ле, используемом для разделения элементов маршрутного имени. XENIX
использует обычную запись в стиле UNIX - /x/y/z. В DOS применяется сим-
вол "обратная косая черта", т.е. \x\y\z. Но если вы хотите использовать
команды XENIX на гибком диске DOS, вы должны применять обычную запись
XENIX, a:/x/y/z. Это не совсем понятно, но правильно.
По умолчанию, dosflp копирует файлы с гибкого диска в
ваш текущий каталог на жестком диске. Если вы измените операцию на
выдачу списка или удаление, эта операция будет произведена на гибком
диске.
Примеры
1. $ dosflp -dB: -c -l
Выдает список всех файлов вида *.c на гибком диске DOS, размещен-
ном в устройстве B. В этом случае не происходит переход вниз в подката-
логи, а включаются лишь файлы, размещенные на верхнем уровне каталогов.
2. $ cd /destdir
$ dosflp -ssrc -e.\*src.\*
Переход в каталог, куда будут помещены файлы. Копируются файлы с
гибкого диска DOS (устройство A, подкаталог src), в текущий каталог.
Файлы для копирования указаны как *src*. В записи UNIX это выглядело бы
так: "cp A:/src/*src* .".
3. $ dosflp -r -stmp
Удаляет все файлы, размещенные в подкаталоге tmp на гибком диске
DOS (устройство A). Обратите внимание, что сам каталог не удаляется. В
записи UNIX это выглядело бы так: "rm A:/tmp/*".
4. $ sh -x `path dosflp` -dB:
Запускает процедуру dosflp в отладочном режиме выполнения.
Единственное ограничение при таком вызове командного процессора заклю-
чается в том, что файл данных, который вы посылаете ему (в данном слу-
чае dosflp), должен иметь полное маршрутное имя. Поскольку командный
процессор НЕ выполняет поиск маршрутного имени файла, нам необходимо
сперва найти маршрутное имя dosflp, затем передать его командному про-
цессору, запущенному в отладочном режиме выполнения, а также передать
процедуре dosflp аргумент в командной строке. Заметьте, что вызов
dosflp таким путем не меняет значение переменной $#, которое только
распознает ключ -dB: как аргумент.

Пояснения

Строки 4-6 выполняют инициализацию по умолчанию путем сохранения
значений в соответствующих переменных командного процессора. По умолча-
нию символ-шаблон ставится в соответствие всем файлам, указанным выра-
жением для команды grep .\*. Обратная косая черта требуется для экрани-
рования звездочки, поэтому она не перехватывается командным процессо-
ром. Устройство по умолчанию - A:. Операция по умолчанию - копировать
файлы, что указано значением "c" для переменной опции.
В строках 8-25 устанавливаются значения ключей и производится про-
верка на наличие ошибок. Если командная строка имеет некоторые аргумен-
ты ($# -gt 0), мы перебираем каждый аргумент и проверяем его. Если най-
ден допустимый ключ, переменные устанавливаются согласно ключу. Если
обнаружен недопустимый ключ, выдается сообщение об ошибке и программа
завершается с плохим статусом возврата.
Имеется два важных типа ключей. Ключи, которые выполняют прямое
указание типа файла, просто устанавливают переменную EXP в соответствии
с ключом. Аналогично, ключи, которые определяют, какой вид работы будет
выполняться процедурой, просто устанавливают соответствующую переменную
OP. Другие ключи должны обрабатываться путем извлечения одного или
нескольких символов из командной строки, которые следуют за флагом клю-
ча, эхо-отображения и конвейерной пересылки текущего аргумента ARG ко-
манде cut для извлечения символа (символов), начинающихся с третьего
символа аргумента, затем присвоения результата этой операции соот-
ветствующей переменной.
Из всего сделанного следует вывод, что пробелы между ключами и
символами, которые стоят за ними, не допускаются. Например, ключ -d
должен получить имя устройства. По синтаксису должно быть -dB:, но не
-d B:, потому что B: интерпретировалось бы как другой аргумент ARG в
цикле for, а это все испортит.
В строках 27-39 операция, которая должна быть выполнена, определя-
ется при помощи следующего оператора case. Если должно быть выполнено
копирование, выдается сообщение "copying" и выполняется то, что следует
за оператором case. Если должен быть выдан список файлов, выдается
сообщение об устройстве, содержимое которого должно распечататься, за-
тем выдается список файлов путем выполнения команды dosdir и конвейер-
ной пересылки результата команде more, после чего dosflp завершается.

Если файлы должны быть удалены, пользователю выдается запрос на
подтверждение удаления. Если ответ "yes", выдается сообщение, с какого
устройства файлы будут удалены. Если ответ "no", dosflp завершается.
Остаток командного файла имеет дело с механизмом копирования.
Строка 41 - это первый шаг в наведении моста над пропастью между двумя
типами носителей. Команда dosls использована для получения полного
списка файлов с гибкого диска. Перед тем как мы передадим этот список
во временный файл, мы пропустим его через команду tr (translate), кото-
рая преобразует все символы на нижний регистр, чтобы при копировании
файлов их имена были в нижнем регистре. В результате копии будут поме-
щены на диск XENIX с именами файлов в нижнем регистре. Если у вас есть
файлы с именами в верхнем регистре или в смеси регистров, вы должны
вручную исправить их после копирования.
Строки 43-50 выполняют само копирование. Цикл for запускается для
доступа к каждому файлу индивидуально. Это требование команд вида
dosxx. Вы должны получать доступ к одному файлу один раз, поскольку
этот уровень не обладает возможностью указания символа-шаблона. Имена
файлов, которые использует цикл for, определены путем использования ко-
манды grep для выбора имен соответственно выражению, установленному ра-
нее.
Имя каждого выбранного файла сначала отображается, так что пользо-
ватель может видеть, выполняется ли команда так, как ожидалось. В этом
месте мы можем сделать одну из двух вещей: или копировать файлы, или
удалить их. Эта операция определяется оператором case в строках 46-49.
Если операция - копирование файлов, файлы копируются из комбинации уст-
ройство-файл в текущий каталог. Обратите внимание, что в переменную
DRIVE включается подкаталог, если он был указан в командной строке. Это
объясняет наличие символа "/" в конце присвоения значения переменной
DRIVE в строке 16. Полное выражение должно быть таким: B:/subdir/file.
Если операция - удаление файлов, комбинация устройство/файл удаляется
выполнением команды dosrm. Попутно заметим, что маршрутное имя есть
нечто гибкое (или небрежное, в зависимости от того, как вы смотрите на
него) в том смысле, что вы можете сказать A:/subdir или A:subdir. Оба
варианта правильны. После того как все файлы будут обработаны, времен-
ный файл удаляется.

ВОЗМОЖНЫЕ МОДИФИКАЦИИ КОМАНДНОГО ФАЙЛА

Одно из мест, где вы можете настраивать dosflp, это регулярные вы-
ражения. Уже включены выражения для .asm, .c и .h, но вы можете изме-
нить это или добавить больше ключей для любой последовательности, кото-
рую вы часто используете.

3.3. Средства получения резервных копий
3.3.1. autobkp - автоматичеески наращивамый файл резервной копии

---------------------------------------------------------------------------

Имя: autobkp
_____________________________________________________________________

autobkp Автоматически наращиваемый файл резервной копии

НАЗНАЧЕНИЕ

Производит поиск по дереву файлов, которые изменялись за последние
24 часа, и пересылает их в другую систему (посредством uucp) или пере-
мещает их в другую область жесткого диска.

ФОРМАТ ВЫЗОВА

autobkp [-c] ["logfile]
-c копирует файлы в другое место диска вместо
использования uucp

Пример вызова
autobkp " filelist "" bkplog
Копирует все файлы, указанные в filelist,
и записывает имена файлов в файл с именем bkplog

Командный файл autobkp
1 :
2 # @(#) autobkp v1.0 Automatic file backup Author: Russ Sage

4 if [ $# -gt 1 ]
5 then echo "autobkp: argument error" "&2
6 echo "usage: autobkp [-c] ["logfile]" "&2
7 exit
8 fi

10 if [ "$1" = "-c" ]
11 then COPY=on
12 else COPY=off
13 fi

15 echo "\nBACKUP DATE `date '+%a %m/%d/%y %H:%M:%S'`"
16 echo "-----------------------------------------"

18 SYSTEM='' # destination system uucp node name
19 : ${SYSTEM:=`uuname -l`}

21 echo "Sourse system:\t\t`uuname -l`\nDestination system:\t$SYSTEM"

23 while read SRCDIR DESTDIR FILES
24 do
25 if [ ! -d $SRCDIR ]
26 then echo "autobkp: $SRCDIR is not a directory"
27 continue
28 fi

30 cd $SRCDIR
31 echo "\nFinding files in: $SRCDIR"

33 for FILE in `find . -type f -ctime 0 -name "$FILES" -print`
34 do
35 case $COPY in
36 off) uucp $FILE $SYSTEM!$DESTDIR;;
37 on) cp $FILE $DESTDIR;;
38 esac
39 echo " Transferred $FILE to $DESTDIR"
40 done
41 done

Переменные среды выполнения

COPY Флаг, определяющий, используется команда uucp или cp
FILE Имя каждого файла, найденного в исходном списке маршрутов
FILES Символ-шаблон, указывающий, какие файлы определены
PATH1 Имя маршрута-источника
PATH2 Имя маршрута-приемника
SYSTEM Имя системы-приемника для uucp

Описание
Зачем нам нужен autobkp?

Как мы заметили, файлы в UNIX плодятся как кролики. Чем больше
файлов мы создаем, тем сильнее желание сохранять их упорядоченными. До-
вольно легко стать ленивым или получить ложное представление о безо-
пасности и пренебречь регулярным копированием.
Вы можете подходить к копированию файлов несколькими путями. Наи-
более популярной стратегией является выполнение наращиваемого копирова-
ния, когда вся система копируется с некоторой начальной даты (и иногда
повторно с регулярными интервалами, но не часто). При коротких интерва-
лах (обычно ежедневно) файловая система проверяется на наличие файлов,
которые были модифицированы или добавлены за последние 24 часа. Такие
файлы копируются, поэтому копия в целом поддерживается такой, какой яв-
ляется система в настоящее время.
Где размещать копируемые файлы - это еще один интересный вопрос,
зависящий от конфигурации вашей системы, количества доступного прост-
ранства и важности данных. Давайте рассмотрим некоторые возможности.
Автономная микро- или супермикросистема может иметь всего один
жесткий диск. Если диск содержит достаточно места для размещения друго-
го раздела, вы можете копировать в этот раздел. Раздел может также
использоваться как неструктурированное устройство в отличие от файловой
системы и рассматриваться как магнитная лента или гибкий диск. Среди
других возможностей хранения информации могут быть второй жесткий диск,
кассетная лента или устройство копирования на ленту. Если вам недоступ-
на ни одна из этих возможностей, вы всегда можете копировать на гибкие
диски. Это утомительная ручная работа, но она может быть выполнена при
помощи команд tar или cpio.
Если вы также имеете доступ к другой, большей системе, такой как
общий главный компьютер, вы можете копировать файлы, посылая их в эту
систему посредством команды uucp. Даже если вы имеете достаточно места
в вашей собственной системе для сохранения ваших копий, у вас может
быть очень сильное желание послать копии всех важных файлов в главную
машину, потому что это даст вам выносную копию за пределами вашего
места расположения. Пожары, наводнения и др
ются.

Нам необходим механизм, который обычно запускается автоматически
(по команде cron или с помощью процедуры at, описанной в главе 5). Сна-
чала он обнаруживает все файлы, которые были изменены в последние 24
часа (надеемся, что вы уже имеете первоначальную копию всего). Он начи-
нает искать файлы из указанных каталогов и копировать подходящие файлы
в указанные каталоги-приемники. Он копирует файлы, используя утилиты,
которые наилучшим образом соответствуют используемой вами конфигурации.
Все эти вещи выполняются нашим командным файлом autobkp.

Что делает autobkp?

Вы перечисляете маршруты и autobkp находит файлы по этим маршрутам
и копирует их в то место, которое вы указали. Вы можете указывать имена
файлов по образцам, таким как *.c, *.h или каким-либо еще. С помощью
autobkp вы можете копировать важные файлы без копирования всех файлов.
Иногда это удобно - пропускать файлы при копировании. Типичные файлы,
которые вы, возможно, не хотите копировать, - это очень большие файлы
(не являющиеся важными, как файл core и файлы данных), временные файлы
(как *.o, которые вновь создаются при каждой новой компиляции) и испол-
няемые файлы, если у вас есть исходные программы на языке Си и вы може-
те их скомпилировать для получения новых исполняемых файлов. Пропуская
эти файлы, вы можете уменьшить размер ваших копий на мегабайты.
По умолчанию копирование производится командой uucp, которая пред-
полагает, что у вас подчиненная система по отношению к главной машине и
копирует ваши файлы в большую систему. Если вы хотите копировать ваши
файлы в другое место жесткого диска или на другой жесткий диск, исполь-
зуйте ключ -c для копирования командой cp вместо использования команды
uucp.
Во время процесса копирования на стандартный вывод выводятся сооб-
щения о состоянии дел. Это позволяет легко собрать все сообщения путем
переадресации stdout на время копирования. Если вы выполняете autobkp
вручную, сообщения выводятся на экран. Первое сообщение - это заголо-
вок, который печатает день, дату и время. Это выглядит так:

--------------------------
| BACKUP DATE Fri 05/23/86 17:33:35
|

Второе сообщение определяет систему-источник и систему-приемник.
Оно появляется ниже. В нашем примере система-источник - russ, а систе-
ма-приемник - vax.

--------------------------
| Source system: russ
| Destination system: vax

При каждом входе в систему-источник выдается следующее сообщение:

-----------------------------
| Finding files in: src_dir
|

где выражение src_dir - это место, откуда файлы будут переданы в
цикл копирования. Обратите внимание, что первое имя должно быть именем
каталога, потому что autobkp начинает именно с этого места поиск фай-
лов. Если первое имя не является каталогом, программа печатает сообще-
ние об ошибке и продолжает работу со следующим набором источник/прием-
ник для копирования.

Для каждого найденного файла печатается следующее сообщение после
завершения копирования:

------------------------------
| Transferred file to dest_dir
|
которое указывает, что файл file был скопирован в каталог-приемник
с именем dest_dir.

Файл со списком маршрутов

Чтобы сделать интерфейс настолько гибким, насколько это возможно,
autobkp читает стандартный ввод. Переназначая stdin, вы можете поддер-
живать разные списки файлов, которые не

Список сторінок

Поділитися у соцмережах

☏ Замовлення реклами: +3805044-68-872

© Асоціація електронних бібліотек України

☝ Усі матеріали сайту (зокрема статті, зображення, рекламні оголошення тощо) призначені лише для попереднього ознайомлення. Усі права на публікації, представлені на сайті, належать їхнім законним власникам. Просимо Вас не зберігати копії інформації.