diff --git a/nixos/module.nix b/nixos/module.nix index cb09a88..d1cec98 100644 --- a/nixos/module.nix +++ b/nixos/module.nix @@ -49,12 +49,13 @@ in pkgs.kanidm ]; after = [ "network-online.target" ]; - wantedBy = [ "network-online.target" ]; + wants = [ "network-online.target" ]; serviceConfig = { User = "root"; ExecStart = "${selfprivacy-graphql-api}/bin/app.py"; Restart = "always"; RestartSec = "5"; + Slice = "selfprivacy_api.slice"; }; }; systemd.services.selfprivacy-api-worker = { @@ -82,14 +83,19 @@ in pkgs.iproute2 ]; after = [ "network-online.target" ]; - wantedBy = [ "network-online.target" ]; + wants = [ "network-online.target" ]; serviceConfig = { User = "root"; ExecStart = "${pkgs.python312Packages.huey}/bin/huey_consumer.py selfprivacy_api.task_registry.huey"; Restart = "always"; RestartSec = "5"; + Slice = "selfprivacy_api.slice"; }; }; + systemd.slices."selfprivacy_api" = { + name = "selfprivacy_api.slice"; + description = "Slice for SelfPrivacy API services"; + }; # One shot systemd service to rebuild NixOS using nixos-rebuild systemd.services.sp-nixos-rebuild = { description = "nixos-rebuild switch"; diff --git a/selfprivacy_api/dependencies.py b/selfprivacy_api/dependencies.py index b2e2b19..b26635a 100644 --- a/selfprivacy_api/dependencies.py +++ b/selfprivacy_api/dependencies.py @@ -27,4 +27,4 @@ async def get_token_header( def get_api_version() -> str: """Get API version""" - return "3.3.0" + return "3.4.0" diff --git a/selfprivacy_api/graphql/subscriptions/logs.py b/selfprivacy_api/graphql/subscriptions/logs.py index 1e47dba..dc7a65b 100644 --- a/selfprivacy_api/graphql/subscriptions/logs.py +++ b/selfprivacy_api/graphql/subscriptions/logs.py @@ -21,11 +21,17 @@ async def log_stream() -> AsyncGenerator[LogEntry, None]: asyncio.get_event_loop().add_reader(j, lambda: asyncio.ensure_future(callback())) - while True: - entry = await queue.get() - try: - yield LogEntry(entry) - except Exception: - asyncio.get_event_loop().remove_reader(j) - return - queue.task_done() + try: + while True: + entry = await queue.get() + try: + yield LogEntry(entry) + except Exception: + asyncio.get_event_loop().remove_reader(j) + j.close() + return + queue.task_done() + except asyncio.CancelledError: + asyncio.get_event_loop().remove_reader(j) + j.close() + return diff --git a/selfprivacy_api/services/__init__.py b/selfprivacy_api/services/__init__.py index 755e389..4625ee0 100644 --- a/selfprivacy_api/services/__init__.py +++ b/selfprivacy_api/services/__init__.py @@ -88,7 +88,7 @@ class ServiceManager(Service): @staticmethod def get_id() -> str: """Return service id.""" - return "api" + return "selfprivacy-api" @staticmethod def get_display_name() -> str: @@ -98,7 +98,7 @@ class ServiceManager(Service): @staticmethod def get_description() -> str: """Return service description.""" - return "A proto-service for API itself. Currently manages backups of settings." + return "Enables communication between the SelfPrivacy app and the server." @staticmethod def get_svg_icon() -> str: @@ -135,7 +135,7 @@ class ServiceManager(Service): @staticmethod def get_backup_description() -> str: - return "How did we get here?" + return "General server settings." @classmethod def get_status(cls) -> ServiceStatus: diff --git a/selfprivacy_api/services/nextcloud/__init__.py b/selfprivacy_api/services/nextcloud/__init__.py index cd66dfa..866ad03 100644 --- a/selfprivacy_api/services/nextcloud/__init__.py +++ b/selfprivacy_api/services/nextcloud/__init__.py @@ -10,6 +10,7 @@ from selfprivacy_api.services.service import Service, ServiceStatus from selfprivacy_api.services.nextcloud.icon import NEXTCLOUD_ICON from selfprivacy_api.services.config_item import ( StringServiceConfigItem, + BoolServiceConfigItem, ServiceConfigItem, ) from selfprivacy_api.utils.regex_strings import SUBDOMAIN_REGEX @@ -26,6 +27,11 @@ class Nextcloud(Service): regex=SUBDOMAIN_REGEX, widget="subdomain", ), + "enableImagemagick": BoolServiceConfigItem( + id="enableImagemagick", + default_value=True, + description="Enable ImageMagick", + ), } @staticmethod diff --git a/selfprivacy_api/utils/systemd_journal.py b/selfprivacy_api/utils/systemd_journal.py index cbb953f..e9992ac 100644 --- a/selfprivacy_api/utils/systemd_journal.py +++ b/selfprivacy_api/utils/systemd_journal.py @@ -42,6 +42,8 @@ def get_paginated_logs( events = get_events_from_journal(j, limit, lambda j: j.get_previous()) events.reverse() + j.close() + return events elif up_cursor is None and down_cursor is not None: j.seek_cursor(down_cursor) @@ -50,6 +52,8 @@ def get_paginated_logs( events = get_events_from_journal(j, limit, lambda j: j.get_previous()) events.reverse() + j.close() + return events elif up_cursor is not None and down_cursor is None: j.seek_cursor(up_cursor) @@ -57,8 +61,12 @@ def get_paginated_logs( events = get_events_from_journal(j, limit, lambda j: j.get_next()) + j.close() + return events else: + j.close() + raise NotImplementedError( "Pagination by both up_cursor and down_cursor is not implemented" ) diff --git a/setup.py b/setup.py index aaf333e..ecdb02c 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages setup( name="selfprivacy_api", - version="3.3.0", + version="3.4.0", packages=find_packages(), scripts=[ "selfprivacy_api/app.py",