From 5aa1a378effa3646cbc0bca840393748bed291f7 Mon Sep 17 00:00:00 2001 From: nhnn Date: Wed, 27 Nov 2024 12:32:01 +0200 Subject: [PATCH 1/6] fix: free unused journal.Reader instances (#158) I'm a bit dumb and forgot to add code that frees journal.Reader instances from memory. Co-authored-by: nhnn Co-authored-by: Inex Code Reviewed-on: https://git.selfprivacy.org/SelfPrivacy/selfprivacy-rest-api/pulls/158 Reviewed-by: Inex Code Co-authored-by: nhnn Co-committed-by: nhnn --- selfprivacy_api/graphql/subscriptions/logs.py | 22 ++++++++++++------- selfprivacy_api/utils/systemd_journal.py | 8 +++++++ 2 files changed, 22 insertions(+), 8 deletions(-) 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/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" ) From d91d8d2fd9fbc931f8f01b2cf7cc1d9dcc32f0d7 Mon Sep 17 00:00:00 2001 From: Inex Code Date: Wed, 27 Nov 2024 13:35:33 +0300 Subject: [PATCH 2/6] chore: Bump version to 3.4.0 --- selfprivacy_api/dependencies.py | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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/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", From e2a0e4fc3d98c79600ff6226dea9c52001d07565 Mon Sep 17 00:00:00 2001 From: Inex Code Date: Wed, 27 Nov 2024 14:08:26 +0300 Subject: [PATCH 3/6] fix: Fix user-facing SP API metadata --- nixos/module.nix | 6 ++++++ selfprivacy_api/services/__init__.py | 6 +++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/nixos/module.nix b/nixos/module.nix index 557f703..31a5678 100644 --- a/nixos/module.nix +++ b/nixos/module.nix @@ -54,6 +54,7 @@ in ExecStart = "${selfprivacy-graphql-api}/bin/app.py"; Restart = "always"; RestartSec = "5"; + Slice = "selfprivacy_api.slice"; }; }; systemd.services.selfprivacy-api-worker = { @@ -87,8 +88,13 @@ in 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.slice" = { + 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/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: From 6866226eaef8bb4202f54bc6fdcf18cbc62e5a1c Mon Sep 17 00:00:00 2001 From: Inex Code Date: Wed, 27 Nov 2024 14:12:36 +0300 Subject: [PATCH 4/6] fix: Systemd slice name --- nixos/module.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nixos/module.nix b/nixos/module.nix index 31a5678..82d1f55 100644 --- a/nixos/module.nix +++ b/nixos/module.nix @@ -91,7 +91,7 @@ in Slice = "selfprivacy_api.slice"; }; }; - systemd.slices."selfprivacy_api.slice" = { + systemd.slices."selfprivacy_api" = { name = "selfprivacy_api.slice"; description = "Slice for SelfPrivacy API services"; }; From c10e57b19c0314d7a9d8823e18bdd59846d5bfa0 Mon Sep 17 00:00:00 2001 From: Inex Code Date: Wed, 27 Nov 2024 14:21:33 +0300 Subject: [PATCH 5/6] fix: Wrong systemd dependency Fixes #159 --- nixos/module.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nixos/module.nix b/nixos/module.nix index 82d1f55..2f7a164 100644 --- a/nixos/module.nix +++ b/nixos/module.nix @@ -48,7 +48,7 @@ in pkgs.iproute2 ]; after = [ "network-online.target" ]; - wantedBy = [ "network-online.target" ]; + wants = [ "network-online.target" ]; serviceConfig = { User = "root"; ExecStart = "${selfprivacy-graphql-api}/bin/app.py"; @@ -82,7 +82,7 @@ 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"; From 5a92ad0621450cb6fcc12a6787ad904a463f5051 Mon Sep 17 00:00:00 2001 From: Alan Urmancheev Date: Fri, 29 Nov 2024 16:21:38 +0400 Subject: [PATCH 6/6] feat: NextCloud: add the enableImagemagick option --- selfprivacy_api/services/nextcloud/__init__.py | 6 ++++++ 1 file changed, 6 insertions(+) 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