Отправляет email-рассылки с помощью сервиса Sendsay

KirovLUG: пользователи Linux в Вятке

Работа с ftplib в python

Работа с ftplib в python.

На Ваш суд предоставляются два скрипта на языке Python. В них
рассматариваются возможности работы с FTP-серверами прямо
из программы посредством модуля ftplib.

Получение файла

Первый скрипт соединяется с FTP-сервером и закачивает от туда
один файл. В случае, если во время работы произошел разрыв
связи, то скрипт <<уведомляет>> об этом, изменяя специальный
файл. А также происходит возврат нулевого значения в качестве
результата работы скрипта при удачном получении файла, иначе
ненулевого (это реализуется с помощью вызова sys.exit(0)
или sys.exit(1))

begin _retr.py #!/usr/bin/python
# -*- coding: KOI8-R -*-

from ftplib import FTP
from getopt import getopt
import sys, time, socket

ip_serv = "192.168.2.254"
path_in = "uploads/"
path_loc = ""
file_in = "out.zip"
file_err = "get_again.inf"

# Функция получения файла с ftp-сервера, обрабатывающая событие
таймаута.
# Возвращает нулевой результат только в случае корректно выполненной
# передачи, 1 - таймаут-исключение, 2 - остальные.
def FromFtpToFile(ftpobj, ftpfile, desclocfile, pos=-1):
tmp = 0
try:
# Если задано смещение в файле, то докачиваем
if pos == -1:
ftpobj.retrbinary("RETR "+ftpfile, desclocfile.write)
else:
ftpobj.retrbinary("RETR "+ftpfile, desclocfile.write,
8192, pos)
except socket.timeout, msg:
tmp = 1
except:
tmp = 2
return tmp

args = {}
# Получаем параметры передаваемые с запуском программы
(optlist, a) = getopt(sys.argv[1:], 'ch', ['help', 'cont'])
# Преобразуем в словарь
for (key, value) in optlist:
args[key[key.rfind('-',0,3)+1:]] = value

# Устанавливаем таймаут соединения (по умолчанию таймаута нет и процесс
# может повиснуть
socket.setdefaulttimeout(30)

# Подключаемся к ftp-серверу
ftp = FTP(ip_serv)
ftp.login()
# Узнаем размер получаемого файла
ftp_size = cur_size = ftp.size(path_in+file_in)

# Флаг ошибки при передаче данных
err = 0

if args.has_key("c") or args.has_key("cont"):
# Создаем файловый дескриптор для получаемого файла
# Запись с добавлением
fd = open(path_loc+file_in, 'ab')
# Узнаем размер недокаченного файла
cur_size = fd.tell()

# Докачивать только если полученный файл меньше получаемого
if ftp_size > cur_size:
# Докачиваем файл
err = FromFtpToFile(ftp, path_in+file_in, fd, cur_size)
# Узнаем размер полученного файла
cur_size = fd.tell()
elif ftp_size < cur_size:
# Если вызов "cont" устарел настолько, что получаемыйфайл стал
# меньше уже полученного, то получать целиком
fd.close()
fd = open(path_loc+file_in, 'wb')
err = FromFtpToFile(ftp, path_in+file_in, fd)
# Узнаем размер полученного файла
cur_size = fd.tell()

fd.close()
else:
# Создаем файловый дескриптор для получаемого файла
# Запись сначала
fd = open(path_loc+file_in, 'wb')

# Получаем файл
err = FromFtpToFile(ftp, path_in+file_in, fd)

# Узнаем размер полученного файла
cur_size = fd.tell()

# Закрываем файл
fd.close()

# Закрываем соединение с ftp
if not err:
ftp.quit()
else:
ftp.close()
if ftp_size != cur_size:
# Если файл был докачан не полностью (произошел разрыв соединения),
# то отметить это событие изменением содержимого спец. файла
fd = open(file_err, 'wb')
fd.write(str(time.time()))
fd.close()
sys.exit(1)
else:
sys.exit(0)
end _retr.py Отправка файла

Второй скрипт отправляет файл на FTP. В случае успешной
отправки - возвращает 0, иначе 1. Скрипт интересен тем,
что в нем показывается - в качестве параметров функции могут
быть не обычные переменные, а даже имена функций, которые
затем вызываются из тела описанной функции.

begin _stor.py #!/usr/bin/python
# -*- coding: KOI8-R -*-

from ftplib import FTP
import re, socket

ip_serv = "192.168.2.254"
path_out = "uploads/"
path_loc = ""
file_out = "in.zip"

file_exist = 0

# callback функция использующаяся для определения существует
# отправляемый файл на сервере или нет? Возвращает результат в
# глобальной переменной file_exist
def list_filter(str):
global file_exist
m = re.match(".*\s"+re.escape(file_out)+"$", str)
if m:
file_exist = 1

# Функция выполняющая заданную ей параметр-функцию и отлавливающая
# исключения. Возвращает нулевой результат если исключение не
# происходило, 1 - если произошло таймаут-исключение, 2 - в других
случаях
def FtpHook(func):
tmp = 0
try:
func
except socket.timeout, msg:
tmp = 1
except:
tmp = 2
return tmp

# Устанавливаем таймаут соединения (по умолчанию таймаута нети процесс
# может повиснуть
socket.setdefaulttimeout(30)

# Подключаемся к ftp-серверу
ftp = FTP(ip_serv)
ftp.login()

# Проверяем, существует ли на сервере уже файл с таким именем
err = FtpHook(ftp.dir(path_out, list_filter))
# Если существует, то во избежание лишних ошибок - удаляем его
if file_exist:
err = FtpHook(ftp.delete(path_out+file_out))

# Создаем файловый дескриптор для отправляемого файла
# Только на чтение
fd = open(path_loc+file_out, 'rb')

# Отправляем файл
err = FtpHook(ftp.storbinary("STOR "+path_out+file_out, fd))

# Закрываем файл
fd.close()
# Закрываем соединение с ftp
if not err:
ftp.quit()
sys.exit(0)
else:
ftp.close()
sys.exit(1)
end _stor.py --
С уважением, Kolotov Alexandr aka mr. Эбола
отвечать: akmypo***@m*****.ru
ICQ: 100349254

| Registered Linux user # 236664 |
-*Информационный канал Subscribe.Ru
Подписан адрес:
Код этой рассылки: comp.soft.linux.kirovlug
Написать в лист: mailto:comp.soft.linux.kirovlug-list@subscribe.ru
Отписаться: mailto:comp.soft.linux.kirovlug--unsub@subscribe.ru?subject=comp.soft.linux.kirovlug

http://subscribe.ru/ http://subscribe.ru/feedback

Ответить   Fri, 17 Jun 2005 15:20:13 +0400 (#386600)