Anshlag - калужское объединение друзей - туристов. Отдых, путешествия, туризм.

Anshlag - калужское объединение друзей - туристов. Отдых и путешествия по Карелии, туризм, водные походы. Отчеты о походах, рассказы туристов, новости туризма. Форум, гостевая, походные фотографии.



  
 Пятница, 19 июля 2019, 06:57:34 

Bog BOS: FTP-сервер ProFTPD: установка, настройка и использование
5 Bog BOS: Дублирование ftp-сайта (mirror.pl)

Быстрый переход ...

» 1 Стандарты, относя...
» 2 Bog BOS: FTP серв...
» 3 Заплатка
» 4 Bog BOS: Apache: ...
» 5 Bog BOS: Дублиров...
» 6 Bog BOS: FTP-серв...
» no modules loaded f...

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), а также нечувствительность к регистру символов (привет от 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
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)
правим ~mirror/mmin (конфигурация для mirror-master) под свои имена файлов и программ
помещаем в crontab для mirror запуск mirror.nightly ежедневно в самый незагруженный момент времени
регулярно просматривая почту для mirror, озаглавленную "nightly mirror log", корректируем описания пакетов
время от времени надо чистить почтовый ящик и журналы
Использование mirror


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 имя-пользователя (пароль запрашивается с отключенным эхом)

Формат описания пакетов (и mirror.defaults)


Каждый пакетный файл может содержать описания нескольких пакетов (заданий на копирование и синхронизацию). Пакет с именем 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


Подсистема mirror-master (mm, mm.pl) позволяет организовать ежедневное зеркалирование множества серверов в параллельном режиме с установкой интервалов между успешными и неуспешными копированиями.

Головной программой является скрипт mirror.nightly, который надо поместить в ~mirror (и его подпрограмму prune_logs.pl), отредактировать (имя почтовой программы и кому посылать отчеты, куда класть ежедневные журналы) и запускать каждую ночь из cron. Он вызывает mirror-master, извлекает из журнала обработки интересные сведения и посылает их в указанный почтовый ящик.

mirror-master использует подпрограмму pkgs_to_mmin (ключ "-y" задает минимальный интервал (в часах) обращения к сайту после его успешного копирования; ключ "-n" задает минимальный интервал обращения к сайту после неудачного обращения к нему) и управляющий файл mmin (в ~mirror). Управляющий файл позволяет установить количество процессов mirror, запускаемых параллельно, и интервалы обращения к сайту.



Прокомментировать
Хотите оставить свои комментарии? Зарегистрируйтесь на нашем сайте!

 
(c) Anshlag 2002 - 2008