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 _getattr_for_root(self): ''' Возвращает информацию для коревой директории. @return: Stat ''' info = fuse.Stat() info.st_mode = stat.S_IFDIR | self._get_access_mode(True) album_list = AlbumList.get() # Для директорий высчитывается как 2 + количество поддиректорий: info.st_nlink = 2 + len(album_list.albums) context = self.GetContext() info.st_uid = context['uid'] info.st_gid = context['gid'] album_list = AlbumList.get() info.st_size = len(album_list.albums) return info
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 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 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 _parse_path(self, path): ''' Разбирает путь и возвращает информацию относительно альбома и фотографии, которые могут находиться по этому пути. @param path: string @return: PathInfo ''' album_list = AlbumList.get() if os.path.splitext(path)[1].lower() == '.jpg': if path in self._buffers: return PathInfo(buffer=self._buffers[path]) album_title, photo_title = self._split_path(path) album = album_list.albums.get(album_title) if album is None: return PathInfo() photo = album.photos.get(photo_title) if photo: return PathInfo(photo=photo) return PathInfo() album = album_list.albums.get(path) if album: return PathInfo(album=album) return PathInfo()
#!/usr/bin/python # encoding=utf8 ''' Скрипт для проверки, есть ли доступ к аккаунту. @author: Mic, 2012 ''' from dm_yf.log import logger from dm_yf.models import AlbumList album_list = AlbumList.get() logger.info('now you have access to Fotki account') logger.info('you have %s albums', len(album_list.albums))