w22
This commit is contained in:
+31
-1
@@ -11,6 +11,21 @@ Tabulky:
|
||||
|
||||
Bezpečné pro opakované spuštění (pokračuje tam, kde skončilo).
|
||||
Bezpečné pro souběžný běh na více strojích (ON CONFLICT v SQL).
|
||||
|
||||
Předpoklad pro hostname a ukládání cest do DB:
|
||||
Skript běží na dvou Unraid serverech s různým přístupem k zálohovacímu share:
|
||||
|
||||
hostname = Tower1 (druhý Unraid server — vlastník zálohy):
|
||||
Zálohovací share je nativní: /mnt/user/ZalohaVsechObrazku/
|
||||
Cesta se ukládá do DB beze změny — je již v kanonickém tvaru.
|
||||
|
||||
hostname = tower (první Unraid server — zálohu zapisuje přes remote mount):
|
||||
Zálohovací share je mountován jako: /mnt/remotes/TOWER1.LAN_ZalohaVsechObrazku/
|
||||
Fyzické kopírování probíhá přes tento remote mount, ale do DB se ukládá
|
||||
vždy nativní Tower1 cesta: /mnt/user/ZalohaVsechObrazku/...
|
||||
(PATH_NORMALIZE_MAP zajistí přepis prefixu před INSERTem).
|
||||
|
||||
Tím jsou cesty v DB jednotné bez ohledu na to, který server zálohu pořídil.
|
||||
"""
|
||||
|
||||
import os
|
||||
@@ -45,6 +60,12 @@ ZALOHA_DIR_MAP = {
|
||||
}
|
||||
ZALOHA_DIR_DEFAULT = Path("/mnt/remotes/TOWER1.LAN_ZalohaVsechObrazku")
|
||||
|
||||
# Normalizace cesty pro DB — vždy ukládáme nativní Tower1 cestu,
|
||||
# bez ohledu na to, přes jaký mount skript soubor fyzicky zapsal.
|
||||
PATH_NORMALIZE_MAP = {
|
||||
"/mnt/remotes/TOWER1.LAN_ZalohaVsechObrazku": "/mnt/user/ZalohaVsechObrazku",
|
||||
}
|
||||
|
||||
EXCLUDED_DIR_NAMES_LOWER = {"zalohavsechobrazku", "zálohavsechobrázku", "zálohavsechobrazku"}
|
||||
|
||||
BATCH_SIZE = 500
|
||||
@@ -119,6 +140,15 @@ def compute_blake3(path: Path, chunk: int = 1 << 20) -> str:
|
||||
return h.hexdigest()
|
||||
|
||||
|
||||
def normalize_path_for_db(path: Path) -> str:
|
||||
"""Převede fyzickou cestu zálohy na nativní Tower1 cestu pro uložení do DB."""
|
||||
s = str(path)
|
||||
for remote, native in PATH_NORMALIZE_MAP.items():
|
||||
if s.startswith(remote):
|
||||
return native + s[len(remote):]
|
||||
return s
|
||||
|
||||
|
||||
def dest_path_for(source: Path, hostname: str) -> Path:
|
||||
try:
|
||||
relative = source.relative_to(SOURCE_BASE)
|
||||
@@ -237,7 +267,7 @@ def process(conn, hostname):
|
||||
t_copy = time.perf_counter()
|
||||
|
||||
cur = conn.cursor()
|
||||
cur.execute(SQL_INSERT_ZALOHA, (hash_val, str(dest), source.name, velikost))
|
||||
cur.execute(SQL_INSERT_ZALOHA, (hash_val, normalize_path_for_db(dest), source.name, velikost))
|
||||
row = cur.fetchone()
|
||||
if row:
|
||||
zaloha_id = row[0]
|
||||
@@ -10,6 +10,14 @@ Příklad: \\Tower1\ZalohaVsechObrazku\JMENO-PC\D\Foto\2023\img.jpg
|
||||
|
||||
Bezpečné pro opakované spuštění (pokračuje tam kde skončilo).
|
||||
Bezpečné pro souběžný běh na více strojích (ON CONFLICT v SQL).
|
||||
|
||||
Předpoklad pro ukládání cest do DB:
|
||||
Ať už je hostname Windows stroje jakýkoliv, Tower1 (druhý Unraid server)
|
||||
je vždy dostupný jako \\Tower1\ZalohaVsechObrazku\...
|
||||
Fyzické kopírování probíhá přes tuto UNC cestu, ale do DB se ukládá
|
||||
vždy nativní Linux cesta Tower1, tj. /mnt/user/ZalohaVsechObrazku/...
|
||||
(\\Tower1 → /mnt/user, zpětná lomítka → dopředná lomítka).
|
||||
Tím jsou cesty v DB jednotné bez ohledu na to, který stroj zálohu pořídil.
|
||||
"""
|
||||
|
||||
import os
|
||||
@@ -39,6 +47,19 @@ DB_CONFIG = {
|
||||
|
||||
ZALOHA_DIR = Path(r"\\Tower1\ZalohaVsechObrazku")
|
||||
|
||||
# Normalizace cesty pro DB — Windows UNC cestu převedeme na nativní Tower1 Linux cestu.
|
||||
# \\Tower1\ZalohaVsechObrazku\... → /mnt/user/ZalohaVsechObrazku/...
|
||||
WINDOWS_UNC_PREFIX = r"\\Tower1"
|
||||
LINUX_NATIVE_PREFIX = "/mnt/user"
|
||||
|
||||
|
||||
def normalize_path_for_db(path: Path) -> str:
|
||||
"""Převede \\Tower1\ZalohaVsechObrazku\... na /mnt/user/ZalohaVsechObrazku/..."""
|
||||
s = str(path)
|
||||
if s.startswith(WINDOWS_UNC_PREFIX):
|
||||
return LINUX_NATIVE_PREFIX + s[len(WINDOWS_UNC_PREFIX):].replace("\\", "/")
|
||||
return s
|
||||
|
||||
JPEG_EXTENSIONS = {".jpg", ".jpeg"}
|
||||
|
||||
EXCLUDED_DIR_NAMES_LOWER = {
|
||||
@@ -244,7 +265,7 @@ def process(conn, hostname, drives):
|
||||
t_copy = time.perf_counter()
|
||||
|
||||
cur = conn.cursor()
|
||||
cur.execute(SQL_INSERT_ZALOHA, (hash_val, str(dest), source.name, velikost))
|
||||
cur.execute(SQL_INSERT_ZALOHA, (hash_val, normalize_path_for_db(dest), source.name, velikost))
|
||||
row = cur.fetchone()
|
||||
if row:
|
||||
zaloha_id = row[0]
|
||||
|
||||
Reference in New Issue
Block a user