def ftp_RETR(self, path): if self.dtpInstance is None: raise BadCmdSequenceError('PORT or PASV required before RETR') try: newsegs = toSegments(self.workingDirectory, path) except InvalidPath: return defer.fail(FileNotFoundError(path)) # XXX For now, just disable the timeout. Later we'll want to # leave it active and have the DTP connection reset it # periodically. self.setTimeout(None) # Put it back later # And away she goes if not self.binary: consumer = ASCIIConsumerWrapper(self.dtpInstance) else: consumer = self.dtpInstance pth = '/'.join(newsegs) restore_dir = tmpfile.make_dir('restore', prefix=('_'.join(newsegs) + '_')) ret = api.file_download_start(pth, restore_dir, wait_result=True) d = Deferred() d.addCallback(self._cbReadOpened, consumer) d.addErrback(self._ebReadOpened, newsegs) d.addBoth(self._enableTimeoutLater) if isinstance(ret, dict): # if ret['status'] != 'OK': # return defer.fail(FileNotFoundError(path)) self._cbRestoreDone(ret, newsegs, d) return d ret.addCallback(self._cbRestoreDone, newsegs, d) ret.addErrback(lambda err: lg.exc(err)) return d
def _do_extract_archive(self, backup_id, tarfilename, backup_index): snapshot_dir = tmpfile.make_dir('restore', extension='.msg') d = backup_tar.extracttar_thread(tarfilename, snapshot_dir) d.addCallback(self._on_extract_done, backup_id, tarfilename, snapshot_dir, backup_index) d.addErrback(self._on_extract_failed, backup_id, tarfilename, snapshot_dir) return d
def ftp_STOR(self, path): if self.dtpInstance is None: raise BadCmdSequenceError('PORT or PASV required before STOR') try: newsegs = toSegments(self.workingDirectory, path) except InvalidPath: return defer.fail(FileNotFoundError(path)) # parent_path = '/' + ('/'.join(newsegs[:-1])) # parent_item = backup_fs.GetByPath(parent_path) # if not parent_item: # return defer.fail(FileNotFoundError(parent_path)) # XXX For now, just disable the timeout. Later we'll want to # leave it active and have the DTP connection reset it # periodically. self.setTimeout(None) # Put it back later # , prefix=(newsegs[-1] + '_') upload_dir = tmpfile.make_dir('backup', extension='.ftp') if not upload_dir: return defer.fail(FileNotFoundError(path)) upload_filename = os.path.join(upload_dir, newsegs[-1]) fp = filepath.FilePath(upload_filename) try: fObj = fp.open('w') except (IOError, OSError) as e: return errnoToFailure(e.errno, path) except: return defer.fail(FileNotFoundError(path)) # TODO: remove file after all # d.addCallback(lambda ignored: file.close(); and remove file) # d = Deferred() d = Deferred() d.addCallback(self._cbWriteOpened, upload_filename, newsegs) d.addErrback(self._ebWriteOpened, newsegs) d.addBoth(self._enableTimeoutLater) d.callback(_FileWriter(fObj)) # d.addCallbacks(self._cbFileRecevied, self._ebFileReceived) # fw = _FileWriter(fObj) # receive_defer = fw.receive() # receive_defer.addBoth(self._enableTimeoutLater) # receive_defer.addCallback(self._prepareConsumer) # receive_defer.addCallback(self._startFileBackup, upload_filename, newsegs, d) # receive_defer.addErrback(lambda err: d.errback(FileNotFoundError(path))) return d