From 8ee950940e027db2e4b0202f5815e3df724d3589 Mon Sep 17 00:00:00 2001 From: Piotr Dec Date: Sun, 2 Nov 2025 22:15:12 +0100 Subject: [PATCH] Mo basics --- app/core/woodpecker.py | 21 ++++++++++++--------- app/services/mo.py | 16 ++++++++++++++++ app/services/passwords.py | 33 ++++++++++++++++----------------- 3 files changed, 44 insertions(+), 26 deletions(-) create mode 100644 app/services/mo.py diff --git a/app/core/woodpecker.py b/app/core/woodpecker.py index caa29d5..1892c0b 100644 --- a/app/core/woodpecker.py +++ b/app/core/woodpecker.py @@ -8,21 +8,23 @@ from injectable import injectable, Autowired, autowired from app.config import get_settings from app.model.webhook import WoodpeckerEvent -from app.services import Passwords, GitService, DockerService +from app.services import GitService, DockerService +from app.services.mo import Mo logger = logging.getLogger(__name__) class WoodpeckerRunner(Process): - def __init__(self, git: GitService, docker: DockerService, passwords: Passwords, + def __init__(self, git: GitService, docker: DockerService, mo: Mo, success_callback=None, error_callback=None): super().__init__(daemon=True) self._git = git self._docker = docker - self._passwords = passwords + self._mo = mo self._success_callback = success_callback self._error_callback = error_callback self._event: WoodpeckerEvent | None = None + self._root = get_settings().git.path def process_event(self, event: WoodpeckerEvent): self._event = event @@ -34,12 +36,12 @@ class WoodpeckerRunner(Process): if service is None: logger.info("No service found.") return self._success_callback() - service_path = f"{get_settings().git.path}/compose/{service}/docker-compose.yml" + service_path = f"{self._root}/compose/{service}/docker-compose.yml" self._git.checkout(self._event.commit) for file in self._event.files: if file.__contains__('.mo.'): - pass - self._docker.reload(Path(service_path)) + self._mo.process(Path(f"{self._root}{file}").absolute()) + self._docker.reload(Path(service_path).absolute()) return self._success_callback() except Exception as e: @@ -63,8 +65,8 @@ class WoodpeckerRunner(Process): @injectable(singleton=True) class Woodpecker: @autowired - def __init__(self, passwords: Annotated[Passwords, Autowired]): - self._passwords = passwords + def __init__(self, mo: Annotated[Mo, Autowired]): + self._mo = mo self._git = GitService() self._docker = DockerService() self._runner: WoodpeckerRunner | None = None @@ -82,7 +84,8 @@ class Woodpecker: def _start_runner(self, event: WoodpeckerEvent): with self._lock: - self._runner = WoodpeckerRunner(self._git, self._docker, self._on_runner_completed) + self._runner = WoodpeckerRunner(self._git, self._docker, self._mo, + self._on_runner_completed, self._on_runner_error) self._runner.process_event(event) def _on_runner_completed(self): diff --git a/app/services/mo.py b/app/services/mo.py new file mode 100644 index 0000000..3b1520d --- /dev/null +++ b/app/services/mo.py @@ -0,0 +1,16 @@ +from pathlib import Path +from typing import Annotated + +from injectable import injectable, autowired, Autowired + +from app.services import Passwords + + +@injectable +class Mo: + @autowired + def __init__(self, passwords: Annotated[Passwords, Autowired]): + self._passwords = passwords + + def process(self, mo_file: Path): + pass diff --git a/app/services/passwords.py b/app/services/passwords.py index 6ff8406..e3a181c 100644 --- a/app/services/passwords.py +++ b/app/services/passwords.py @@ -1,7 +1,8 @@ import os.path +import shutil from injectable import injectable -from pykeepass import PyKeePass, create_database, Group +from pykeepass import PyKeePass, create_database @injectable(singleton=True) @@ -12,29 +13,27 @@ class Passwords: with open(settings.kp.secret, "r") as fh: secret = fh.read().splitlines()[0] - - self._kp_org = self.__get_or_create_store(settings.kp.file, secret) - self._kp = self.__get_lock(settings.kp.file, secret) + self._path = settings.kp.file + self._kp_org = self._open_or_create(self._path, secret) + self._kp = self._open_lock(self._path, secret) @staticmethod - def __get_or_create_store(path, passwd) -> PyKeePass: + def _open_or_create(path, password) -> PyKeePass: if os.path.exists(path): - return PyKeePass( - path, - password=passwd, - ) - return create_database(path, passwd) + return PyKeePass(path, password=password) + return create_database(path, password) @staticmethod - def __get_lock(path, passwd) -> PyKeePass: + def _open_lock(path, password) -> PyKeePass: lock_path = path + ".lock" - import shutil shutil.copyfile(path, lock_path) - return Passwords.__get_or_create_store(lock_path, passwd) + return Passwords._open_or_create(lock_path, password) @property - def store(self): - return self._kp.root_group + def kp(self) -> PyKeePass: + return self._kp - def save(self, group: Group): - pass + def save(self): + # nadpisz plik źródłowy zmianami z lock + self._kp.save() + shutil.copyfile(self._path + ".lock", self._path)