From 04d5a514b4111af86a457e2f73b72087c5d4c49b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Gruszczy=C5=84ski?= Date: Fri, 5 Sep 2025 09:48:41 +0200 Subject: [PATCH] fixy --- app.py | 17 ++++++++++------- config.example.ini | 7 +------ 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/app.py b/app.py index 715bd2d..9493e56 100644 --- a/app.py +++ b/app.py @@ -200,27 +200,29 @@ def validateHostsSyntax(hosts_content): seen[key] = True return None -def writeHostsAtomic(new_content: str, path: str = "/etc/hosts", backup_dir: str | None = None) -> dict: +def writeHostsAtomic(new_content: str, path: str = "/etc/hosts") -> dict: """ Zapisuje plik atomowo: - - tworzy kopię zapasową (z timestampem) jeśli backup_dir podane, + - tworzy kopię zapasową w katalogu z config.ini (klucz backup_path), - zapis do pliku tymczasowego + fsync + rename(), - ustawia chmod 644 na docelowym pliku. - Zwraca info o backupie i ścieżkach. """ from tempfile import NamedTemporaryFile + info = {"path": path, "backup": None} + backup_dir = getCfg("backup_path", None) # kopia zapasowa if backup_dir: os.makedirs(backup_dir, exist_ok=True) + ts = datetime.now(timezone.utc).strftime("%Y%m%dT%H%M%SZ") + dest_path = os.path.join(backup_dir, f"hosts.{ts}.bak") try: - shutil.copy2(path, backup_path) - info["backup"] = backup_path + shutil.copy2(path, dest_path) + info["backup"] = dest_path except Exception as e: logger.warning(f"Backup nieudany: {e}") - # zapis atomowy dir_name = os.path.dirname(path) or "." with NamedTemporaryFile("w", dir=dir_name, delete=False, encoding="utf-8") as tmp: @@ -230,7 +232,7 @@ def writeHostsAtomic(new_content: str, path: str = "/etc/hosts", backup_dir: str tmp_name = tmp.name os.replace(tmp_name, path) - # ustaw poprawne prawa + # ustaw chmod 644 try: os.chmod(path, 0o644) except Exception as e: @@ -238,6 +240,7 @@ def writeHostsAtomic(new_content: str, path: str = "/etc/hosts", backup_dir: str return info + def computeUnifiedDiff(old_text: str, new_text: str, fromfile="/etc/hosts(old)", tofile="/etc/hosts(new)") -> str: import difflib return "".join(difflib.unified_diff( diff --git a/config.example.ini b/config.example.ini index 51ca475..6b66c45 100644 --- a/config.example.ini +++ b/config.example.ini @@ -1,16 +1,11 @@ [daemon] API_TOKEN = apitoken - -backup_path= /backup - +backup_path = /backup services = dnsmasq - # opcjonalnie: globalny timeout (sekundy) reload_timeout = 5 # jeżeli nie podasz command, kod spróbuje kolejno: systemctl/service/rc-service, pkill, kill -HUP z pidfile, pgrep -pid_file = /run/dnsmasq/dnsmasq.pid - [service:dnsmasq] # jeśli systemctl nie działa: # command = rc-service dnsmasq reload