def cleanup(self): ''' Очищает кэшированное тело фотографии. Необходимо обязательно вызывать, если тело больше не нужно. ''' logger.debug('cleanuping image for photo "%s"', self) self._image = None
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 get_resource(self, resource_id): ''' Возвращает ресурс с указанным идентификатором. @param resource_id: string @return: Resource ''' logger.debug('loading resource %s for service %s', resource_id, self._url) url = self._get_resource_url(resource_id) return self._load_resource(url)
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 _request(self, url, data, headers, method): ''' Выполняет запрос и возвращает тело ответа. @param method: string @param url: string @param data: string @return: string ''' logger.debug('loading url %s', url) headers = self._get_headers(headers) request = HttpRequest.get(method, url, data, headers) response = urllib2.urlopen(request).read() logger.debug('%s bytes loaded from url %s', len(response), url) return response
def rmdir(self, path): ''' Удаляет директорию. ''' logger.debug('removing directory %s', path) if not self._is_removing_allowed(): logger.debug('removing not permitted, see --help') return -errno.EPERM path = self._prepare_path(path) path_info = self._parse_path(path) if path_info.album is None: return -errno.ENOTDIR album_list = AlbumList.get() album_list.remove(path_info.album.title)
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 readdir(self, path, offset): ''' Возвращает содержимое директории. ''' # TODO: давать ссылки на вложенные альбомы logger.debug('reading directory %s', path) yield fuse.Direntry('.') yield fuse.Direntry('..') album_list = AlbumList.get() path = self._prepare_path(path) if not path: for album in album_list.albums.values(): yield fuse.Direntry(album.title) else: album = album_list.albums[path] for photo in album.photos.values(): yield fuse.Direntry(photo.title)
def unlink(self, path): ''' Удаляет файл. ''' logger.debug('removing file %s', path) if not self._is_removing_allowed(): logger.debug('removing not permitted, see --help') return -errno.EPERM path = self._prepare_path(path) path_info = self._parse_path(path) if path_info.album: return -errno.EISDIR if path_info.photo is None: return -errno.ENOENT album_list = AlbumList.get() album_title, photo_title = self._split_path(path) album = album_list.albums[album_title] album.remove(photo_title)
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
def getattr(self, path): #@ReservedAssignment ''' Возвращает информацию о файле. ''' logger.debug('getting information about %s', path) path = self._prepare_path(path) if not path: return self._getattr_for_root() path_info = self._parse_path(path) if path_info.album: logger.debug('%s is album', path) return self._getattr_for_album(path_info.album) if path_info.photo: logger.debug('%s is photo', path) return self._getattr_for_photo(path_info.photo) if path_info.buffer: logger.debug('%s is buffer', path) return self._getattr_for_buffer(path_info.buffer) logger.debug('no resource on %s found', path) return -errno.ENOENT
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 release(self, path, fh): ''' Закрывает файл. ''' logger.debug('closing %s', path)