mirror of
https://git.anonymousland.org/anonymousland/synapse.git
synced 2025-05-02 08:46:04 -04:00
Merge pull request #2812 from matrix-org/erikj/media_storage_provider_config
Make storage providers configurable
This commit is contained in:
commit
8ff6726c0d
3 changed files with 101 additions and 33 deletions
|
@ -27,9 +27,7 @@ from .identicon_resource import IdenticonResource
|
|||
from .preview_url_resource import PreviewUrlResource
|
||||
from .filepath import MediaFilePaths
|
||||
from .thumbnailer import Thumbnailer
|
||||
from .storage_provider import (
|
||||
StorageProviderWrapper, FileStorageProviderBackend,
|
||||
)
|
||||
from .storage_provider import StorageProviderWrapper
|
||||
from .media_storage import MediaStorage
|
||||
|
||||
from synapse.http.matrixfederationclient import MatrixFederationHttpClient
|
||||
|
@ -81,17 +79,13 @@ class MediaRepository(object):
|
|||
# potentially upload to.
|
||||
storage_providers = []
|
||||
|
||||
# TODO: Move this into config and allow other storage providers to be
|
||||
# defined.
|
||||
if hs.config.backup_media_store_path:
|
||||
backend = FileStorageProviderBackend(
|
||||
self.primary_base_path, hs.config.backup_media_store_path,
|
||||
)
|
||||
for clz, provider_config, wrapper_config in hs.config.media_storage_providers:
|
||||
backend = clz(hs, provider_config)
|
||||
provider = StorageProviderWrapper(
|
||||
backend,
|
||||
store=True,
|
||||
store_synchronous=hs.config.synchronous_backup_media_store,
|
||||
store_remote=True,
|
||||
store_local=wrapper_config.store_local,
|
||||
store_remote=wrapper_config.store_remote,
|
||||
store_synchronous=wrapper_config.store_synchronous,
|
||||
)
|
||||
storage_providers.append(provider)
|
||||
|
||||
|
|
|
@ -17,6 +17,7 @@ from twisted.internet import defer, threads
|
|||
|
||||
from .media_storage import FileResponder
|
||||
|
||||
from synapse.config._base import Config
|
||||
from synapse.util.logcontext import preserve_fn
|
||||
|
||||
import logging
|
||||
|
@ -64,14 +65,14 @@ class StorageProviderWrapper(StorageProvider):
|
|||
|
||||
Args:
|
||||
backend (StorageProvider)
|
||||
store (bool): Whether to store new files or not.
|
||||
store_local (bool): Whether to store new local files or not.
|
||||
store_synchronous (bool): Whether to wait for file to be successfully
|
||||
uploaded, or todo the upload in the backgroud.
|
||||
store_remote (bool): Whether remote media should be uploaded
|
||||
"""
|
||||
def __init__(self, backend, store, store_synchronous, store_remote):
|
||||
def __init__(self, backend, store_local, store_synchronous, store_remote):
|
||||
self.backend = backend
|
||||
self.store = store
|
||||
self.store_local = store_local
|
||||
self.store_synchronous = store_synchronous
|
||||
self.store_remote = store_remote
|
||||
|
||||
|
@ -97,13 +98,13 @@ class FileStorageProviderBackend(StorageProvider):
|
|||
"""A storage provider that stores files in a directory on a filesystem.
|
||||
|
||||
Args:
|
||||
cache_directory (str): Base path of the local media repository
|
||||
base_directory (str): Base path to store new files
|
||||
hs (HomeServer)
|
||||
config: The config returned by `parse_config`.
|
||||
"""
|
||||
|
||||
def __init__(self, cache_directory, base_directory):
|
||||
self.cache_directory = cache_directory
|
||||
self.base_directory = base_directory
|
||||
def __init__(self, hs, config):
|
||||
self.cache_directory = hs.config.media_store_path
|
||||
self.base_directory = config
|
||||
|
||||
def store_file(self, path, file_info):
|
||||
"""See StorageProvider.store_file"""
|
||||
|
@ -125,3 +126,15 @@ class FileStorageProviderBackend(StorageProvider):
|
|||
backup_fname = os.path.join(self.base_directory, path)
|
||||
if os.path.isfile(backup_fname):
|
||||
return FileResponder(open(backup_fname, "rb"))
|
||||
|
||||
@staticmethod
|
||||
def parse_config(config):
|
||||
"""Called on startup to parse config supplied. This should parse
|
||||
the config and raise if there is a problem.
|
||||
|
||||
The returned value is passed into the constructor.
|
||||
|
||||
In this case we only care about a single param, the directory, so let's
|
||||
just pull that out.
|
||||
"""
|
||||
return Config.ensure_directory(config["directory"])
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue