Ejemplo n.º 1
0
 def cleanup(self):
     '''
     Очищает кэшированное тело фотографии.
     Необходимо обязательно вызывать, если тело больше не нужно.
     '''
     logger.debug('cleanuping image for photo "%s"', self)
     self._image = None
Ejemplo n.º 2
0
 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]
Ejemplo n.º 3
0
 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)
Ejemplo n.º 4
0
 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)
Ejemplo n.º 5
0
 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
Ejemplo n.º 6
0
 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)
Ejemplo n.º 7
0
 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)
Ejemplo n.º 8
0
 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)
Ejemplo n.º 9
0
 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)
Ejemplo n.º 10
0
 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
Ejemplo n.º 11
0
 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
Ejemplo n.º 12
0
 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
Ejemplo n.º 13
0
 def release(self, path, fh):
     '''
     Закрывает файл.
     '''
     logger.debug('closing %s', path)