def flush(self, path): ''' Заставляет файл сохранить изменения. Делаем тут опасное допущение, что метод будет вызван всего один раз. В моем Debian Wheezy утилита cp v8.13 делает именно один вызов. Почему нельзя сделать все то же самое в методе release? Можно, но тогда cp не будет дожидаться завершения выгрузки фотографии на сервер. Было бы неплохо придумать, как переместить все в release и заставить cp дождаться окончания выгрузки. ''' logger.debug('flushing %s', path) path = self._prepare_path(path) path_info = self._parse_path(path) if path_info.buffer is None: logger.warning('buffer for %s not opened yet', path) return -errno.EIO album_title, photo_title = self._split_path(path) album_list = AlbumList.get() album = album_list.albums[album_title] fileobj = path_info.buffer fileobj.flush() fileobj.seek(0) album.add(photo_title, fileobj.read()) fileobj.close() del self._buffers[path]
def mkdir(self, path, mode): ''' Создает директорию. ''' logger.debug('creating directory %s', path) path = self._prepare_path(path) path_info = self._parse_path(path) if path_info.album or path_info.photo: logger.warning('resource on %s already exists', path) return -errno.EEXIST album_list = AlbumList.get() album_list.add(path)
def write(self, path, buf, offset): ''' Записывает в файл порцию данных. ''' path = self._prepare_path(path) path_info = self._parse_path(path) if path_info.buffer is None: logger.warning('buffer for %s not opened yet', path) return -errno.EIO fileobj = path_info.buffer fileobj.seek(offset) fileobj.write(buf) return len(buf)
def _load_token(cls): """ Загружает новый токен. @return: string """ logger.debug("loading token") logger.warning("looks like you do not have token in your settings_local.py yet") logger.warning("please get an auth code from %s", cls._get_auth_url()) logger.warning("it is better to set TOKEN variable on settings_local.py but you can just put in it here") logger.warning("see README for more information") auth_code = raw_input() logger.debug("auth code is %s", auth_code) connection = HTTPSConnection("oauth.yandex.ru") body = urlencode( { "grant_type": "authorization_code", "client_id": CLIENT_ID, "client_secret": CLIENT_SECRET, "code": auth_code, } ) connection.request("POST", "/token", body) response = connection.getresponse().read() result = json.loads(response) token = result["access_token"] logger.debug("token loaded: %s", token) return token
def read(self, path, size, offset): ''' Возвращает порцию данных из файла. ''' path = self._prepare_path(path) path_info = self._parse_path(path) photo = path_info.photo if photo is None: logger.warning('no photo found on %s', path) return -errno.ENOENT image = photo.image chunk = image[offset:offset + size] if offset + size >= len(image): photo.cleanup() return chunk
def create(self, path, flags, mode): ''' Создает пустой файл. ''' logger.debug('creating %s with flags %s and mode %s', path, flags, mode) path = self._prepare_path(path) path_info = self._parse_path(path) if path_info.album and path_info.photo: logger.warning('resource on %s already exists', path) return -errno.EEXIST if path_info.buffer: logger.warning('there is buffer for %s already', path) return -errno.EEXIST fileobj = tempfile.NamedTemporaryFile() self._buffers[path] = fileobj logger.debug('buffer created on %s for %s', fileobj.name, path)
def request(self, url, data=None, headers=None, method=HttpRequest.METHOD_GET): ''' Выполняет запрос и возвращает тело ответа. Делает бесконечное число попыток, если запрос не проходит. @param method: string @param url: string @param data: string @return: string ''' i = 1 while i: try: return self._request(url, data, headers, method) except Exception as e: logger.warning('error occured during request try #%s: %s, retrying in %s seconds', i, e, self.RETRY_INTERVAL) sleep(self.RETRY_INTERVAL) i += 1 if i > self.RETRY_COUNT: raise HttpRequestFailed()
def open(self, path, flags): #@ReservedAssignment ''' Вызывается перед попыткой открыть файл. ''' logger.debug('opening %s with flags %s', path, flags) path = self._prepare_path(path) path_info = self._parse_path(path) access = os.O_RDONLY | os.O_WRONLY | os.O_RDWR if (flags & access) == os.O_RDONLY: if path_info.photo is None: logger.warning('no photo found on %s', path) return -errno.ENOENT return None if (flags & access) == os.O_WRONLY: if path_info.buffer is None: logger.warning('buffer for %s not opened yet', path) return -errno.EIO return None logger.warning('read or write only permitted on %s', path) return -errno.EACCES