mirror of
https://git.selfprivacy.org/SelfPrivacy/selfprivacy-rest-api.git
synced 2024-11-10 13:03:11 +00:00
feature(services): add config service
This commit is contained in:
parent
f57eda5237
commit
8c44f78bbb
191
selfprivacy_api/services/config_service/__init__.py
Normal file
191
selfprivacy_api/services/config_service/__init__.py
Normal file
|
@ -0,0 +1,191 @@
|
||||||
|
"""Class representing the configs of our API
|
||||||
|
Mostly for backupping purposes
|
||||||
|
"""
|
||||||
|
import base64
|
||||||
|
import typing
|
||||||
|
|
||||||
|
from typing import List
|
||||||
|
from os import path,mkdir
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
# from enum import Enum
|
||||||
|
|
||||||
|
from selfprivacy_api.services.service import Service, ServiceStatus
|
||||||
|
|
||||||
|
from selfprivacy_api.services.test_service.icon import BITWARDEN_ICON
|
||||||
|
from selfprivacy_api.utils import USERDATA_FILE, DKIM_DIR, SECRETS_FILE
|
||||||
|
from selfprivacy_api.utils.block_devices import BlockDevices
|
||||||
|
from shutil import copyfile, copytree, rmtree
|
||||||
|
|
||||||
|
|
||||||
|
from selfprivacy_api.services.bitwarden import Bitwarden
|
||||||
|
from selfprivacy_api.services.gitea import Gitea
|
||||||
|
from selfprivacy_api.services.jitsimeet import JitsiMeet
|
||||||
|
from selfprivacy_api.services.mailserver import MailServer
|
||||||
|
from selfprivacy_api.services.nextcloud import Nextcloud
|
||||||
|
from selfprivacy_api.services.pleroma import Pleroma
|
||||||
|
from selfprivacy_api.services.ocserv import Ocserv
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
DEFAULT_DELAY = 0
|
||||||
|
CONFIG_STASH_DIR = "/tmp/selfprivacy_config_dump"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# it is too intimately tied to Services
|
||||||
|
# that's why it is so awkward.
|
||||||
|
# service list is below
|
||||||
|
|
||||||
|
class ConfigService(Service):
|
||||||
|
"""A fake service to store our configs"""
|
||||||
|
|
||||||
|
folders: List[str] = [CONFIG_STASH_DIR]
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_id() -> str:
|
||||||
|
"""Return service id."""
|
||||||
|
return "testservice"
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_display_name() -> str:
|
||||||
|
"""Return service display name."""
|
||||||
|
return "Test Service"
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_description() -> str:
|
||||||
|
"""Return service description."""
|
||||||
|
return "A small service used for test purposes. Does nothing."
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_svg_icon() -> str:
|
||||||
|
"""Read SVG icon from file and return it as base64 encoded string."""
|
||||||
|
# return ""
|
||||||
|
return base64.b64encode(BITWARDEN_ICON.encode("utf-8")).decode("utf-8")
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_url() -> typing.Optional[str]:
|
||||||
|
"""Return service url."""
|
||||||
|
domain = "test.com"
|
||||||
|
return f"https://password.{domain}"
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_subdomain() -> typing.Optional[str]:
|
||||||
|
return "password"
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def is_movable(cls) -> bool:
|
||||||
|
return False
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def is_required() -> bool:
|
||||||
|
return False
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_backup_description() -> str:
|
||||||
|
return "How did we get here?"
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def status_file(cls) -> str:
|
||||||
|
dir = cls.folders[0]
|
||||||
|
# We do not want to store our state in our declared folders
|
||||||
|
# Because they are moved and tossed in tests wildly
|
||||||
|
parent = Path(dir).parent
|
||||||
|
|
||||||
|
return path.join(parent, "service_status")
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def set_status(cls, status: ServiceStatus):
|
||||||
|
pass
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get_status(cls) -> ServiceStatus:
|
||||||
|
return ServiceStatus.ACTIVE
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def can_be_backed_up(cls) -> bool:
|
||||||
|
"""`True` if the service can be backed up."""
|
||||||
|
return True
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def merge_settings(restored_settings_folder: str):
|
||||||
|
# For now we will just copy settings EXCEPT the locations of services
|
||||||
|
# Stash locations as they are set by user right now
|
||||||
|
locations = {}
|
||||||
|
for service in services:
|
||||||
|
locations[service.get_id()] = service.get_drive()
|
||||||
|
|
||||||
|
# Copy files
|
||||||
|
userdata_name = path.basename(USERDATA_FILE)
|
||||||
|
secretfile_name = path.basename(SECRETS_FILE)
|
||||||
|
dkim_dirname = path.basename(DKIM_DIR)
|
||||||
|
|
||||||
|
copyfile(path.join(restored_settings_folder, userdata_name), USERDATA_FILE)
|
||||||
|
copyfile(path.join(restored_settings_folder, secretfile_name), SECRETS_FILE)
|
||||||
|
copytree(path.join(restored_settings_folder, dkim_dirname), DKIM_DIR)
|
||||||
|
|
||||||
|
# Pop locations
|
||||||
|
for service in services:
|
||||||
|
device = BlockDevices().get_block_device(locations[service.get_id()])
|
||||||
|
if device is not None:
|
||||||
|
service.set_location(device.name)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def stop(cls):
|
||||||
|
# simulate a failing service unable to stop
|
||||||
|
if not cls.get_status() == ServiceStatus.FAILED:
|
||||||
|
cls.set_status(ServiceStatus.DEACTIVATING)
|
||||||
|
cls.change_status_with_async_delay(
|
||||||
|
ServiceStatus.INACTIVE, cls.startstop_delay
|
||||||
|
)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def start(cls):
|
||||||
|
pass
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def restart(cls):
|
||||||
|
pass
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_logs():
|
||||||
|
return ""
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get_drive(cls) -> str:
|
||||||
|
return BlockDevices().get_root_block_device().name
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get_folders(cls) -> List[str]:
|
||||||
|
return cls.folders
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def pre_backup(cls):
|
||||||
|
tempdir = cls.folders[0]
|
||||||
|
rmtree(tempdir,ignore_errors=True)
|
||||||
|
mkdir(tempdir)
|
||||||
|
|
||||||
|
|
||||||
|
copyfile(USERDATA_FILE, tempdir)
|
||||||
|
copyfile(SECRETS_FILE, tempdir)
|
||||||
|
copytree(DKIM_DIR, tempdir)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def post_restore(cls):
|
||||||
|
tempdir = cls.folders[0]
|
||||||
|
cls.merge_settings(tempdir)
|
||||||
|
rmtree(tempdir,ignore_errors=True)
|
||||||
|
|
||||||
|
# It is here because our thing needs to include itself
|
||||||
|
services: list[Service] = [
|
||||||
|
Bitwarden(),
|
||||||
|
Gitea(),
|
||||||
|
MailServer(),
|
||||||
|
Nextcloud(),
|
||||||
|
Pleroma(),
|
||||||
|
Ocserv(),
|
||||||
|
JitsiMeet(),
|
||||||
|
ConfigService(),
|
||||||
|
]
|
3
selfprivacy_api/services/config_service/bitwarden.svg
Normal file
3
selfprivacy_api/services/config_service/bitwarden.svg
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M5.125 2C4.2962 2 3.50134 2.32924 2.91529 2.91529C2.32924 3.50134 2 4.2962 2 5.125L2 18.875C2 19.7038 2.32924 20.4987 2.91529 21.0847C3.50134 21.6708 4.2962 22 5.125 22H18.875C19.7038 22 20.4987 21.6708 21.0847 21.0847C21.6708 20.4987 22 19.7038 22 18.875V5.125C22 4.2962 21.6708 3.50134 21.0847 2.91529C20.4987 2.32924 19.7038 2 18.875 2H5.125ZM6.25833 4.43333H17.7583C17.9317 4.43333 18.0817 4.49667 18.2083 4.62333C18.2688 4.68133 18.3168 4.7511 18.3494 4.82835C18.3819 4.9056 18.3983 4.98869 18.3975 5.0725V12.7392C18.3975 13.3117 18.2858 13.8783 18.0633 14.4408C17.8558 14.9751 17.5769 15.4789 17.2342 15.9383C16.8824 16.3987 16.4882 16.825 16.0567 17.2117C15.6008 17.6242 15.18 17.9667 14.7942 18.24C14.4075 18.5125 14.005 18.77 13.5858 19.0133C13.1667 19.2558 12.8692 19.4208 12.6925 19.5075C12.5158 19.5942 12.375 19.6608 12.2675 19.7075C12.1872 19.7472 12.0987 19.7674 12.0092 19.7667C11.919 19.7674 11.8299 19.7468 11.7492 19.7067C11.6062 19.6429 11.4645 19.5762 11.3242 19.5067C11.0218 19.3511 10.7242 19.1866 10.4317 19.0133C10.0175 18.7738 9.6143 18.5158 9.22333 18.24C8.7825 17.9225 8.36093 17.5791 7.96083 17.2117C7.52907 16.825 7.13456 16.3987 6.7825 15.9383C6.44006 15.4788 6.16141 14.9751 5.95417 14.4408C5.73555 13.9 5.62213 13.3225 5.62 12.7392V5.0725C5.62 4.89917 5.68333 4.75 5.80917 4.6225C5.86726 4.56188 5.93717 4.51382 6.01457 4.48129C6.09196 4.44875 6.17521 4.43243 6.25917 4.43333H6.25833ZM12.0083 6.35V17.7C12.8 17.2817 13.5092 16.825 14.135 16.3333C15.6992 15.1083 16.4808 13.9108 16.4808 12.7392V6.35H12.0083Z" fill="black"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.6 KiB |
5
selfprivacy_api/services/config_service/icon.py
Normal file
5
selfprivacy_api/services/config_service/icon.py
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
BITWARDEN_ICON = """
|
||||||
|
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M5.125 2C4.2962 2 3.50134 2.32924 2.91529 2.91529C2.32924 3.50134 2 4.2962 2 5.125L2 18.875C2 19.7038 2.32924 20.4987 2.91529 21.0847C3.50134 21.6708 4.2962 22 5.125 22H18.875C19.7038 22 20.4987 21.6708 21.0847 21.0847C21.6708 20.4987 22 19.7038 22 18.875V5.125C22 4.2962 21.6708 3.50134 21.0847 2.91529C20.4987 2.32924 19.7038 2 18.875 2H5.125ZM6.25833 4.43333H17.7583C17.9317 4.43333 18.0817 4.49667 18.2083 4.62333C18.2688 4.68133 18.3168 4.7511 18.3494 4.82835C18.3819 4.9056 18.3983 4.98869 18.3975 5.0725V12.7392C18.3975 13.3117 18.2858 13.8783 18.0633 14.4408C17.8558 14.9751 17.5769 15.4789 17.2342 15.9383C16.8824 16.3987 16.4882 16.825 16.0567 17.2117C15.6008 17.6242 15.18 17.9667 14.7942 18.24C14.4075 18.5125 14.005 18.77 13.5858 19.0133C13.1667 19.2558 12.8692 19.4208 12.6925 19.5075C12.5158 19.5942 12.375 19.6608 12.2675 19.7075C12.1872 19.7472 12.0987 19.7674 12.0092 19.7667C11.919 19.7674 11.8299 19.7468 11.7492 19.7067C11.6062 19.6429 11.4645 19.5762 11.3242 19.5067C11.0218 19.3511 10.7242 19.1866 10.4317 19.0133C10.0175 18.7738 9.6143 18.5158 9.22333 18.24C8.7825 17.9225 8.36093 17.5791 7.96083 17.2117C7.52907 16.825 7.13456 16.3987 6.7825 15.9383C6.44006 15.4788 6.16141 14.9751 5.95417 14.4408C5.73555 13.9 5.62213 13.3225 5.62 12.7392V5.0725C5.62 4.89917 5.68333 4.75 5.80917 4.6225C5.86726 4.56188 5.93717 4.51382 6.01457 4.48129C6.09196 4.44875 6.17521 4.43243 6.25917 4.43333H6.25833ZM12.0083 6.35V17.7C12.8 17.2817 13.5092 16.825 14.135 16.3333C15.6992 15.1083 16.4808 13.9108 16.4808 12.7392V6.35H12.0083Z" fill="black"/>
|
||||||
|
</svg>
|
||||||
|
"""
|
Loading…
Reference in a new issue