예제 #1
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]
예제 #2
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)
예제 #3
0
 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)
예제 #4
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
예제 #5
0
 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
예제 #6
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)
예제 #7
0
 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()
예제 #8
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