mirror of
https://git.selfprivacy.org/SelfPrivacy/selfprivacy-rest-api.git
synced 2025-01-30 20:56:39 +00:00
refactor(services): refactor template service code for readablity and deduplication
This commit is contained in:
parent
0ce0d2142c
commit
bb6d59e29f
|
@ -85,43 +85,63 @@ def config_item_from_json(json_data: dict) -> Optional[ServiceConfigItem]:
|
||||||
raise ValueError("Unknown config item type")
|
raise ValueError("Unknown config item type")
|
||||||
|
|
||||||
|
|
||||||
|
def validate_definition(definition: dict):
|
||||||
|
"""Check if required fields are present"""
|
||||||
|
if "meta" not in definition:
|
||||||
|
raise ValueError("meta not found in service definition")
|
||||||
|
if "options" not in definition:
|
||||||
|
raise ValueError("options not found in service definition")
|
||||||
|
|
||||||
|
|
||||||
|
def validate_meta(meta: ServiceMetaData, options: dict):
|
||||||
|
# If it is movable, check for the location option
|
||||||
|
if meta.is_movable and "location" not in options:
|
||||||
|
raise ValueError("Service is movable but does not have a location option")
|
||||||
|
|
||||||
|
|
||||||
|
def get_raw_definition(service_id: str, source_data: Optional[str] = None) -> dict:
|
||||||
|
if source_data:
|
||||||
|
return json.loads(source_data)
|
||||||
|
else:
|
||||||
|
# Check if the service exists
|
||||||
|
if not exists(join(SP_MODULES_DEFENITIONS_PATH, service_id)):
|
||||||
|
raise FileNotFoundError(f"Service {service_id} not found")
|
||||||
|
# Load the service
|
||||||
|
with open(join(SP_MODULES_DEFENITIONS_PATH, service_id)) as file:
|
||||||
|
return json.load(file)
|
||||||
|
|
||||||
|
|
||||||
|
def parse_config_items(options: dict):
|
||||||
|
config_items = {}
|
||||||
|
for option in options.values():
|
||||||
|
config_item = config_item_from_json(option)
|
||||||
|
if config_item:
|
||||||
|
config_items[config_item.id] = config_item
|
||||||
|
return config_items
|
||||||
|
|
||||||
|
|
||||||
class TemplatedService(Service):
|
class TemplatedService(Service):
|
||||||
"""Class representing a dynamically loaded service."""
|
"""Class representing a dynamically loaded service."""
|
||||||
|
|
||||||
def __init__(self, service_id: str, source_data: Optional[str] = None) -> None:
|
def __init__(self, service_id: str, source_data: Optional[str] = None) -> None:
|
||||||
if source_data:
|
self.definition_data = get_raw_definition(service_id, source_data)
|
||||||
self.definition_data = json.loads(source_data)
|
validate_definition(self.definition_data)
|
||||||
else:
|
|
||||||
# Check if the service exists
|
|
||||||
if not exists(join(SP_MODULES_DEFENITIONS_PATH, service_id)):
|
|
||||||
raise FileNotFoundError(f"Service {service_id} not found")
|
|
||||||
# Load the service
|
|
||||||
with open(join(SP_MODULES_DEFENITIONS_PATH, service_id)) as file:
|
|
||||||
self.definition_data = json.load(file)
|
|
||||||
# Check if required fields are present
|
|
||||||
if "meta" not in self.definition_data:
|
|
||||||
raise ValueError("meta not found in service definition")
|
|
||||||
if "options" not in self.definition_data:
|
|
||||||
raise ValueError("options not found in service definition")
|
|
||||||
# Load the meta data
|
|
||||||
self.meta = ServiceMetaData(**self.definition_data["meta"])
|
self.meta = ServiceMetaData(**self.definition_data["meta"])
|
||||||
# Load the options
|
|
||||||
self.options = self.definition_data["options"]
|
self.options = self.definition_data["options"]
|
||||||
# Load the config items
|
validate_meta(self.meta, self.options)
|
||||||
self.config_items = {}
|
|
||||||
for option in self.options.values():
|
self.config_items = parse_config_items(self.options)
|
||||||
config_item = config_item_from_json(option)
|
|
||||||
if config_item:
|
|
||||||
self.config_items[config_item.id] = config_item
|
|
||||||
# If it is movable, check for the location option
|
|
||||||
if self.meta.is_movable and "location" not in self.options:
|
|
||||||
raise ValueError("Service is movable but does not have a location option")
|
|
||||||
# Load all subdomains via options with "subdomain" widget
|
# Load all subdomains via options with "subdomain" widget
|
||||||
self.subdomain_options: List[str] = []
|
self.subdomain_options: List[str] = []
|
||||||
for option in self.options.values():
|
for option in self.options.values():
|
||||||
if option.get("meta", {}).get("widget") == "subdomain":
|
if option.get("meta", {}).get("widget") == "subdomain":
|
||||||
self.subdomain_options.append(option["name"])
|
self.subdomain_options.append(option["name"])
|
||||||
|
|
||||||
|
def get_units(self) -> List[str]:
|
||||||
|
return self.meta.systemd_services
|
||||||
|
|
||||||
def get_id(self) -> str:
|
def get_id(self) -> str:
|
||||||
# Check if ID contains elements that might be a part of the path
|
# Check if ID contains elements that might be a part of the path
|
||||||
if "/" in self.meta.id or "\\" in self.meta.id:
|
if "/" in self.meta.id or "\\" in self.meta.id:
|
||||||
|
@ -275,21 +295,6 @@ class TemplatedService(Service):
|
||||||
"""Disable the service. Usually this means disabling systemd unit."""
|
"""Disable the service. Usually this means disabling systemd unit."""
|
||||||
self._set_enable(False)
|
self._set_enable(False)
|
||||||
|
|
||||||
def start(self):
|
|
||||||
"""Start the systemd units"""
|
|
||||||
for unit in self.meta.systemd_services:
|
|
||||||
subprocess.run(["systemctl", "start", unit], check=False)
|
|
||||||
|
|
||||||
def stop(self):
|
|
||||||
"""Stop the systemd units"""
|
|
||||||
for unit in self.meta.systemd_services:
|
|
||||||
subprocess.run(["systemctl", "stop", unit], check=False)
|
|
||||||
|
|
||||||
def restart(self):
|
|
||||||
"""Restart the systemd units"""
|
|
||||||
for unit in self.meta.systemd_services:
|
|
||||||
subprocess.run(["systemctl", "restart", unit], check=False)
|
|
||||||
|
|
||||||
def get_configuration(self) -> dict:
|
def get_configuration(self) -> dict:
|
||||||
# If there are no options, return an empty dict
|
# If there are no options, return an empty dict
|
||||||
if not self.config_items:
|
if not self.config_items:
|
||||||
|
|
Loading…
Reference in a new issue