|
Bog BOS: Дублирование ftp-сайта (mirror.pl)
|
Последнее изменение файла: 2007.12.25
Скопировано с www.bog.pp.ru: 2024.11.11
Bog BOS: Дублирование ftp-сайта (mirror.pl)
mirror (mirror.pl) позволяет копировать каталог с удаленного
ftp-сервера на локальный диск вместе с его содержимым и поддерживать
локальную копию в синхронном состоянии (удаляет файлы в локальной копии,
если они удалены на сервере).
Обладает гибкой настройкой, не копирует уже
имеющиеся и не изменившиеся файлы (проверка по дате и размеру).
Собирает журнал, сжимает, разжимает, переименовывает, бьет на куски
на ходу, докачивает оборванные файлы и т.д. и т.п.
Для разового копирования лучше использовать wget, а если есть доступ к
удаленному серверу, то - rsync (он отслеживает
изменения внутри файлов и работает быстрее).
В дополнение к базовому уровню (mirror, mirror.pl) реализовано управление
параллельным копированием нескольких каталогов с одного или нескольких
серверов с отслеживанием интервала синхронизации (mm.pl, mirror-master)
и процедура для ежедневного выполнения для вызова из cron (mirror.nightly).
Позволяет копировать символьные ссылки (но не жесткие!). Сохраняет
время модификации, но не сохраняет идентификаторы владельца и группы.
Требует perl 5.004. Последняя версия - 2.9 (1998). Следует учитывать,
что оглавление копируемого каталога (и его подкаталогов) держится в
оперативной памяти во время работы, так что копирование некоторых сайтов
требует много места в ОП (CPAN - 70 MB и 7 минут CPU на Celeron 450!).
Это особенно важно, если вы
задаете параллельное копирование нескольких сайтов.
- взять mirror-2.9.tar.gz или mirror-2.9.noarch.rpm (в RPM забыли включить
mirror.nightly и prune_logs.pl)
- поставить заплатку под новую версию wu-ftpd (и другие соответствующие
стандарту сервера): ftp.pl_wupatch (иначе mirror будет зависать
при получении оглавления каталога)
- можно добавить в mirror.defaults (защита от хакеров):
name_mappings=s:\.\./:__/:g
но при этом некоторые архивы (CPAN) скопировать будет нельзя
- я заменил в mirror.pl "gzip -9" на "gzip -5" (работает вдвое быстрее,
сжимая на 6% хуже), хотя это дело вкуса
- в ftp.pl добавить в шаблон обработки ответа на команду PASV возможность
нескольких пробелов перед адресом и номером порта (привет от Adobe),
возможность точки в конце текста (привет от Symantec),
а также нечувствительность к регистру символов (привет от pftpd)
- заменить в makefile значение GRP на bin, PLDIR на /usr/local/mirror,
BINDIR на /usr/local/bin
- пробежаться по всем .pl (ftp.pl, lsparse.pl, mirror.pl) и добавить в
require /usr/local/mirror/...,
чтобы не пересекаться с системным ftp.pl и т.п.
- при соединении с сервером mirror привязывает сокет к первому
попавшемуся интерфейсу, а у меня некоторые интерфейсы "равнее, чем
другие", поэтому:
- mirror.pl: добавить в блок присвоения $default новый параметр
bindname и передачу его в пакет chat (lchat.pl)
- lchat.pl: в процедурах open_port и open_newport привязывать
сокет перед соединением к серверу не к ANY, а к IP-адресу,
получаемому из chat'bindname (в open_newport добавить саму
привязку)
- в mirror.defaults и описаниях пакетов теперь можно
использовать параметр bindname
- готовый результат
- mkdir -p /usr/local/mirror
- mkdir -p /usr/local/man/man1
- make install
- /usr/local/mirror: dateconv.pl, ftp.pl, lchat.pl, lsparse.pl
- /usr/local/bin: mirror (mirror.pl), do_unlinks (do_unlinks.pl),
mirror-master (mm.pl), pkgs_to_mmin (pkgs_to_mmin.pl)
- /usr/local/man/man1: mirror.1, mirror-master.1
- создать пользователя mirror (без пароля, но с домашним каталогом)
- все ранее скопированные общедоступные файлы (если были) перевести на него
- скопировать mirror.defaults, mirror.nightly, prune_logs.pl,
и mmin в ~mirror
- отредактировать mirror.defaults под свои нужды (remote_password,
timeout, passive_ftp, exclude_patt (добавить .hqx), max_days, hostname,
local_dir, user, group, local_ignore,
do_deletes, delete_excl, max_delete_files, max_delete_dirs,
compress_patt, compress_prog, compress_excl (добавить .cpz и удалить
read.*me|index|info|faq|gzip|compress),
update_log, mail_to, verbose, use_files)
- заполнить каталог ~mirror/packages описаниями пакетов (для каждого
сайта отдельный файл с пакетами, относящимися к данному сайту)
- тестирование базовых функция на примере одного пакета:
mirror packages/updates.redhat.com
- правим mirror.nightly под свои имена файлов и программ (home=, mailto=,
mail=/bin/mail,
/usr/bin/mm.pl, prune_logs.pl); добавляю в вызов mm.pl ключ генерации
upload.log с приличными именами и генерацию из этого upload.log суммарного
трафика по каждому ftp-серверу (используется sum.awk);
значение переменной biggest поменять с "+3n" на "--key=4n"
- правим ~mirror/mmin (конфигурация для mirror-master) под свои имена
файлов и программ
- помещаем в crontab для mirror запуск mirror.nightly ежедневно в самый
незагруженный момент времени
- регулярно просматривая почту для mirror,
озаглавленную "nightly mirror log", корректируем описания пакетов
- время от времени надо чистить почтовый ящик и журналы
mirror можно использовать в 2 режимах: с использованием
описаний пакетов и без них. Если вам используете mirror без описаний пакетов,
то, скорее всего, вам нужен не mirror, а wget, поэтому я описываю только первый
метод использования:
mirror флаги имя-файла-содержащего-описание-пакета ...
Перед чтением описаний пакетов загружается файл с именем
mirror.defaults из $PATH (или .), содержащий значения по умолчанию различных
параметров. Затем mirror по очереди читает описания пакетов (единиц работы),
отсоединяется от предыдущего сайта, подсоединяется к новому сайту,
получает оглавления удаленной и локальным каталогом, сравнивает их для
получения списка изменившихся файлов, фильтрует список с помощью шаблона
исключений и других критериев, загружает файлы из списка с сайта (используется
временное имя файла .in.имя-файла. на случай аварийного
завершения), сжимает и разбивает полученный файл, переименовывает его,
удаляет локальные файлы при удалении оригинала на сервере.
Флаги:
- -d (отладка, использование несколько раз увеличивает уровень отладки)
- -n (пробный прогон)
- -p имя-пакета (извлечь из файлов описание только указанного пакета,
можно использовать несколько раз, указывается регулярное выражение)
- -R имя-пакета (пропустить пакеты до указанного)
- -F (использовать временные DBM файлы в /var/tmp для хранения оглавлений;
файлы создаются, но это слабо помогает: объем требуемой памяти
уменьшается с 70 до 54 MB;
при аварийном завершении файлы не удаляются)
- -T (только установить времена модификации файлов, не копировать их)
- -Uимя-файла (записывать все пересылки файлов в указанный журнал)
- -k ключ=значение (установить значение параметра)
- -u имя-пользователя (пароль запрашивается с отключенным эхом)
Каждый пакетный файл может содержать описания нескольких
пакетов (заданий на копирование и синхронизацию). Пакет с именем defaults
(обычно из файла mirror.defaults) содержит значения параметров по умолчанию.
Пустые строки и строки, начинающиеся с #, рассматриваются как комментарии.
Знак "&" в конце строки означает продолжение текста оператора на
следующей строке (знак "&" и пробелы в начале строки удаляются).
Описание пакета состоит из операторов, устанавливающих значения параметров вида
(пробелы за знаками "=" и "+" являются значимыми!):
имя=значение (присвоение значения)
или
имя+значение (добавление значения в конец строки значения по умолчанию)
Пакеты разделяются оператором, определяющим имя пакета:
package=имя-пакета
Параметры
- описание удаленного сайта и файлов на нем
- site (имя или IP адрес удаленного сервера)
- remote_dir
- remote_user (anonymous)
- remote_password (имя-пользователя@имя-локального-хоста)
- remote_account (выполняется команда "account")
- remote_group (выполняется команда "site group")
- remote_gpass (выполняется команда "site gpass")
- timeout секунд
- failed_gets_excl регулярное-выражение (тексты сообщений об ошибках
команды GET, которые не надо включать в отчет)
- ftp_port (21)
- proxy (false)
- proxy_ftp_port (4514)
- proxy_gateway
- using_socks (false)
- passive_ftp (false)
- retry_call (true, однократный повтор после минутной паузы)
- disconnect (false, отсоединиться от сайта сразу по концу пакета)
какие файлы копировать и как
- get_patt (регулярное выражение, задающее шаблон имен файлов подлежащих
копированию)
- exclude_patt (регулярное выражение, задающее шаблон имен файлов,
которые не надо копировать)
- get_newer (true, копировать удаленный файл, если он новее локального)
- get_size_change (true, копировать удаленный файл, если его размер
отличается от локального)
- force (false, копировать файлы, не глядя на размер и время)
- make_bad_symlinks (false, создавать символьные ссылки, указывающие в
никуда)
- get_missing (true, иначе только удалять и делать символьные ссылки)
- get_file (true, иначе mirror копирует в обратную сторону)
- text_mode (false)
- strip_cr (false)
- vms_keep_versions (true)
- vms_xfer_text (readme|info|listing|\.c, шаблон имен файлов VMS, которые
будут передаваться в текстовом режиме)
- name_mappings (none, команда substitute языка perl для переименования
файлов при копировании)
- update_local (false, в момент запуск get_patt устанавливается равным
списку файлов в локальном каталоге)
- max_days (0, если больше 0, то игнорировать файлы более старые, чем
указанное число дней; действует как на удаленные, так и на локальные
файлы, т.е. они не удаляются)
- max_size (0, если больше 0, то не копировать файлы, имеющие размер
больше указанного)
- hostname (none, пропускать пакеты, у которых site совпадает с hostname)
- skip (none, пропустить пакет, текст сообщения помещается в отчет)
описание локального сервера и файлов
- local_dir (обычно задается относительно значения по умолчанию)
- user (none, имя пользователя для chown)
- group (none, имя группы для chgrp)
- local_ignore (регулярное выражение, задающее имена локальных файлов,
которые не надо синхронизировать)
- follow_local_symlinks (none, регулярное выражение задает шаблон
локальных символьных ссылок, которые будут "прозрачными" для mirror)
- chmod (true, устанавливать атрибуты файла после копирования, в т.ч.
время модификации)
- mode_copy (false, копировать атрибуты файлов и каталогов с удаленного
сайта)
- file_mode (0444, атрибуты создаваемых файлов, если mode_copy не
установлен)
- dir_mode (0755, атрибуты создаваемых каталогов, если mode_copy не
установлен)
- umask (07000)
- use_timelocal (true, устанавливать время модификации скопированных
файлов в соответствии с локальной временной зоной, а не GMT)
- bindname (none, моя самоделка, к какому интерфейсу привязывать сокет
перед соединением с сервером)
управление удалением устаревших файлов
- do_deletes (false, удалять локальные файлы, если соответствующие им
удаленные файлы были удалены)
- delete_patt (., регулярное выражение для проверки имен локальных
файлов как кандидатов для удаления)
- delete_get_patt (false, установить delete_patt равным get_patt)
- delete_excl (none, регулярное выражение для задания имен локальных
файлов, не подлежащих удалению)
- max_delete_files (10%, предупреждать вместо удаления, если число
кандидатов на удаление преваышает указанное число файлов или процентов)
- max_delete_dirs (10%, аналогичная проверка для каталогов)
- save_deletes (false, вместо удаления файлов сохранять их в архивном
каталоге)
- save_dir (Old, имя архивном каталоге относительно local_dir)
- store_remote_listing (none, имя локального файла для хранения
листинга удаленных каталогов)
управление сжатием файлов (не любит файлы с пробелами и спецсимволами)
- compress_patt (none, регулярное выражение для задания имен локальных
файлов, подлежащих сжатию)
- compress_excl (\.(z|gz)$, шаблон исключений, регистр не учитывается)
- compress_prog (compress, программа для сжатия)
- compress_suffix (.Z для compress, .gz для gzip)
- compress_conv_patt ((\.Z|\.taz)$, подпадающие под шаблон файлы
декомпрессируются перед сжатием gzip)
- compress_conv_expr (s/\.Z$/\.gz/;s/\.taz$/\.tgz/, выражение perl
для преобразования суффикса файла при его рекомпрессии из формата
compress в gzip)
- compress_size_floor (0, не сжимать файлы, размер которых меньше
указанного)
управление разбиением файлов (создается каталог с именем, совпадающим
с именем исходного файла, в которой создаются файлы part1, part2, ...)
- split_max (0, если больше 0, то разбивать файлы, размер которых
больше указанного и имя соответствует шаблону split_patt)
- split_patt (регулярное выражение имен файлов - кандидатов на разбиение)
- split_chunk (102400, размер кусков)
формат листинга удаленных каталогов
- remote_fs (unix, поддерживаются следующие форматы листинга:
unix, dls, netware, vms, dosftp,
macos, lsparse, infomac)
- ls_lR_file (none, имя удаленного файла, содержащего результат "ls -lR",
иначе выполняется команда LIST)
- local_ls_lR_file (none)
- force_times (yes, при сравнении времен считать, что в листинге удаленных
каталогов использованы локальные времена)
- recursive (true)
- recurse_hard (false, если удаленный сервер не поддерживает рекурсивный
листинг каталогов, то делать его "по шагам": CWD, LIST)
- flags_recursive (-lRat, передаваемые серверу флаги для выполнения
рекурсивного листинга)
- flags_nonrecursive (-lat, передаваемые серверу флаги для выполнения
нерекурсивного листинга)
- ls_fix_mappings (none, команда замены perl для преобразования
удаленного листинга)
управление журнализацией
- update_log (none, имя файла журнализации относительно local_dir)
- mail_to (none)
- mail_prog (none)
- mail_subject (-s "mirror update", можно написать:
-s "mirror update: $package")
- comment (none, вставляется в отчет)
- verbose (false)
оптимизация
- use_files (false, использовать временные DBM файлы в /var/tmp для
хранения оглавлений; файлы создаются, но не удаляются;
помогает плохо: например,
объем требуемой для копирования CPAN памяти уменьшается с 70 до 54 MB)
- algorithm (0:
- 0 - весь сайт за раз (дружелюбно по отношению к удаленному сайту.
но может потребовать много оперативной памяти)
- 1 - по каталогу за раз (недружелюбно по отношению к удаленному
сайту. требует меньше оперативной памяти)
Подсистема mirror-master (mm, mm.pl) позволяет организовать
ежедневное зеркалирование множества серверов в параллельном режиме с установкой
интервалов между успешными и неуспешными копированиями.
Головной программой является скрипт mirror.nightly,
который надо поместить в ~mirror (и его подпрограмму prune_logs.pl),
отредактировать (имя почтовой программы
и кому посылать отчеты, куда класть ежедневные журналы) и запускать
каждую ночь из cron. Он вызывает mirror-master, извлекает из журнала
обработки интересные сведения и посылает их в указанный почтовый ящик.
mirror-master использует подпрограмму pkgs_to_mmin
(ключ "-y" задает минимальный интервал (в часах) обращения к сайту после его
успешного
копирования; ключ "-n" задает минимальный интервал обращения к сайту после
неудачного обращения к нему) и управляющий файл mmin (в ~mirror).
Управляющий файл позволяет установить количество процессов mirror,
запускаемых параллельно, и интервалы обращения к сайту.
|
Bog BOS: Дублирование ftp-сайта (mirror.pl)
|
Copyright © 1996-2024 Sergey E. Bogomolov; www.bog.pp.ru