Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 7, 2009 19:53:28

Martiner
От:
Зарегистрирован: 2009-09-07
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Модификация pyftpdlib

Помогите пожалуйсто в следующем вопросе: необходимо “модифицировать” либу следующим образом: нужно, чтобы в ф-ции “ftp_STOR” данные, которые пришли по FTP в виде файла и должны “упасть” в файловую систему не “падали” туда; поток с этими данными должен отпарсиваться нужным образом….
Собственно, вопрос:
__ где “место”, где он пишет на диск ново пришедший файл?
__ как “добраться” до потока с данными (“буфера”), в который пишется ново пришедший файл?

Заранее спасибо! =)


http://code.google.com/p/pyftpdlib/ – сайт проджекта
http://pyftpdlib.googlecode.com/files/pyftpdlib-0.5.1.tar.gz – либа собственной персоны

Ф-ция, где происходит прием нового файла и по логики должна быть запись на диск или в буфер:

    def ftp_STOR(self, file, mode='w'):
"""Store a file (transfer from the client to the server)."""
# A resume could occur in case of APPE or REST commands.
# In that case we have to open file object in different ways:
# STOR: mode = 'w'
# APPE: mode = 'a'
# REST: mode = 'r+' (to permit seeking on file object)
if 'a' in mode:
cmd = 'APPE'
else:
cmd = 'STOR'
line = self.fs.fs2ftp(file)
rest_pos = self.restart_position
self.restart_position = 0
if rest_pos:
mode = 'r+'
try:
fd = self.run_as_current_user(self.fs.open, file, mode + 'b')
except IOError, err:
why = _strerror(err)
self.log('FAIL %s "%s". %s.' %(cmd, line, why))
self.respond('550 %s.' %why)
return

if rest_pos:
# Make sure that the requested offset is valid (within the
# size of the file being resumed).
# According to RFC-1123 a 554 reply may result in case
# that the existing file cannot be repositioned as
# specified in the REST.
ok = 0
try:
assert not rest_pos > self.fs.getsize(file)
fd.seek(rest_pos)
ok = 1
except AssertionError:
why = "Invalid REST parameter"
except IOError, err:
why = _strerror(err)
if not ok:
self.respond('554 %s' %why)
self.log('FAIL %s "%s". %s.' %(cmd, line, why))
return

self.log('OK %s "%s". Upload starting.' %(cmd, line))
if self.data_channel is not None:
self.respond("125 Data connection already open. Transfer starting.")
self.data_channel.file_obj = fd
self.data_channel.enable_receiving(self.current_type)
else:
self.respond("150 File status okay. About to open data connection.")
self._in_dtp_queue = fd



Офлайн

#2 Сен. 8, 2009 05:56:26

sypper-pit
От: Ulan-Ude(msk)
Зарегистрирован: 2009-01-30
Сообщения: 1102
Репутация: +  6  -
Профиль   Отправить e-mail  

Модификация pyftpdlib

лично я для таких извращений не пользовался этой библиотекой , обычно меня устраивало что он пишет на жесткий иначе при довольно большом объёме клиентов сервак просто упадёт и не поднимится

Офлайн

#3 Сен. 8, 2009 06:15:21

Martiner
От:
Зарегистрирован: 2009-09-07
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Модификация pyftpdlib

sypper-pit, чем пользовался для решения подобной задачи? На диск не вариант т.к. данные будут приходить от устройства в файл с одним и тем же именем – соответственно, если два клиента одновременно попытаются перезаписать один и тот же файл, один из них обломится. Данных не много, поэтому реально загонять из в память и парсить , а не писать в ФС, а потом парсить



Офлайн

#4 Сен. 8, 2009 09:47:37

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

Модификация pyftpdlib

Martiner, полное тз в студию… Возможно ftp не самый лучший протокол для ваших целей.
А по сабжу, глянь строку line = self.fs.fs2ftp(file), и посмотри функцию fs2ftp, судя по этому обрывку кода, пишется там.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version