| Зеркало FTP |
|
Следующий пример показывает, как соединяться с сервером FTP и рекурсивно получать все файлы с этого сервера, начиная с некоторого каталога, определяемого пользователем. Кроме того, этот сценарий позволяет удалять файлы после того, как они были получены. Вы можете задаться вопросом: «Зачем нужен такой сценарий? Разве все это нельзя сделать с помощью rsync?». Ответ на него: «Да, это так». Однако как быть, если утилита rsync отсутствует на сервере, где вы работаете, и у вас недостаточно прав, чтобы установить ее? (Это необычно для системного администратора, но такое тоже бывает.) Или как быть, если у вас нет доступа к серверу, откуда вы пытаетесь получить файлы, через SSH или rsync? В таких ситуациях данный сценарий будет служить альтернативой. Исходный текст сценария зеркалирования приводится ниже:
Этот сценарий выглядит проще с использованием класса. Конструктор класса принимает несколько параметров. Чтобы соединиться с сервером, конструктору необходимо передать имя удаленного хоста (host), имя пользователя (username) и пароль (password). Параметры ftp_ba-se_dir и local_base_dir передаются, чтобы переместиться в требуемые каталоги на стороне сервера и на стороне локального компьютера. Параметр delete - это обычный флаг, который указывает, требуется ли удалять файлы на удаленном сервере после их загрузки. В определении конструктора видно, что этому параметру по умолчанию присваивается значение False. После установки этих значений в виде атрибутов объекта выполняется соединение с указанным сервером FTP и производится регистрация. Затем осуществляется переход в начальный каталог на стороне сервера и в начальный каталог на локальном компьютере. Прежде чем выполнить переход в требуемый каталог на локальном компьютере, сценарий сначала пытается создать его. Если каталог уже существует, будет получено исключение OSError, которое игнорируется сценарием. В классе определяются три дополнительных метода: get_dirs_files(), walk() и run(). Метод get_dirs_files() определяет, какие файлы находятся в текущем каталоге и какие из них являются обычными файлами, а какие каталогами. (К слову сказать, такой способ будет работать только в случае сервера, работающего под управлением UNIX.) Определение, какие из файлов являются обычными файлами, а какие каталогами, производится по первому символу в строках полученного списка. Если первый символ d, значит, - это каталог. Если первый символ '-', значит, - это файл. Благодаря этому сценарий не будет следовать за символическими ссылками или заниматься обработкой блочных устройств. Следующий метод, который определен в классе, - это метод walk(). В этом методе выполняется вся основная работа. Метод walk() принимает единственный параметр: следующий каталог, который требуется посетить. Прежде чем двинуться дальше, напомним, что это рекурсивная функция. Она будет вызывать саму себя. Если какой-либо каталог содержит другие каталоги, метод walk() также обойдет их. Метод walk() сначала переходит в указанный каталог на стороне сервера. Затем выполняется переход в одноименный каталог на локальном компьютере, при этом, в случае необходимости, каталог создается. Потом текущая позиция на сервере FTP и на локальном компьютере сохраняется в переменных ftp_curr_dir и local_curr_dir для последующего использования. Далее с помощью метода get_dirs_f iles(), о котором уже говорилось выше, производится получение списков файлов и каталогов. Загрузка каждого файла в каталоге производится с помощью метода FTP retrbinary(). Кроме того, если был установлен флаг delete, выполняется удаление файла. Затем выполняется переход в текущие каталоги на стороне сервера FTP и на локальном компьютере и вызывается метод walk() для обхода нижележащих каталогов. Переход в текущие каталоги выполняется для того, чтобы при возвращении из рекурсивных вызовов метода walk() мы оказались в том же самом месте, где и были. Последний метод, который определен в классе, - это метод run(). Метод run() создан исключительно для удобства. Он просто вызывает метод walk() и передает ему текущий каталог FTP. В сценарии предусмотрена только самая необходимая обработка ошибок и исключительных ситуаций. Во-первых, сценарий не проверяет правильность аргументов командной строки и поэтому пользователь должен обеспечить передачу, по крайней мере, трех параметров - имени удаленного хоста, имени пользователя и пароля. Если какой-либо из этих параметров будет отсутствовать, сценарий очень быстро завершится с сообщением об ошибке. Кроме того, если произошло исключение, сценарий не повторяет попытку загрузить файл. То есть, если что-то будет препятствовать загрузке файла, мы получим исключение, и работа программы на этом завершится. Если сценарий завершит работу на полпути, во время загрузки файлов, то при следующем запуске сценарий повторно загрузит файлы, которые уже были загружены. В такой реализации есть свой плюс, который состоит в том, что если файл был загружен только частично, он не будет удален на стороне сервера.
Set as favorite
Bookmark
Email This
Hits: 160 Комментарии (0)RSS feed CommentsНаписать комментарий |