Files
medicus/Backup/24 zip_fbk_and_notify.py
2026-01-25 08:30:09 +01:00

162 lines
4.2 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import subprocess
from pathlib import Path
from datetime import datetime
import zipfile
import time
import traceback
from EmailMessagingGraph import send_mail
# ============================================================
# CONFIG
# ============================================================
GBAK = r"C:\Program Files\Firebird\Firebird_2_5_CGM\bin\gbak.exe"
DB = r"localhost/3050:Z:\Medicus 3\data\MEDICUS.FDB"
BACKUP_DIR = Path(r"D:\medicusbackup")
FB_USER = "SYSDBA"
FB_PASS = "masterkey"
MAIL_TO = "vladimir.buzalka@buzalka.cz"
CHUNK = 8 * 1024 * 1024 # 8 MB
# ============================================================
# MAIN
# ============================================================
def main():
BACKUP_DIR.mkdir(parents=True, exist_ok=True)
now = datetime.now()
ts = now.strftime("%Y-%m-%d_%H-%M-%S")
fbk = BACKUP_DIR / f"MEDICUS_{ts}.fbk"
zipf = fbk.with_suffix(".zip")
log = BACKUP_DIR / f"MEDICUS_{ts}.log"
report = []
report.append(f"Čas spuštění: {now}")
report.append(f"Databáze: {DB}")
report.append("")
try:
# ====================================================
# 1) GBAK
# ====================================================
t0 = time.time()
cmd = [
GBAK,
"-b",
"-user", FB_USER,
"-pas", FB_PASS,
DB,
str(fbk),
"-v",
]
with open(log, "w", encoding="utf-8") as f:
subprocess.run(
cmd,
stdout=f,
stderr=subprocess.STDOUT,
check=True,
)
t_gbak = time.time() - t0
fbk_size = fbk.stat().st_size
report.append("GBAK záloha: OK")
report.append(f"FBK soubor: {fbk}")
report.append(f"Velikost FBK: {fbk_size/1024/1024:.1f} MB")
report.append(f"Čas GBAK: {t_gbak:.1f} s")
report.append("")
# ====================================================
# 2) ZIP
# ====================================================
t1 = time.time()
processed = 0
with zipfile.ZipFile(
zipf,
"w",
compression=zipfile.ZIP_DEFLATED,
compresslevel=9,
) as zf:
zi = zipfile.ZipInfo(fbk.name)
zi.compress_type = zipfile.ZIP_DEFLATED
with zf.open(zi, "w", force_zip64=True) as z:
with open(fbk, "rb") as src:
while buf := src.read(CHUNK):
z.write(buf)
processed += len(buf)
pct = processed * 100 / fbk_size
print(
f"\rZIP: {pct:6.2f}% "
f"({processed//1024//1024} MB)",
end="",
flush=True,
)
print("\nZIP hotov.")
t_zip = time.time() - t1
zip_size = zipf.stat().st_size
report.append("ZIP komprese: OK")
report.append(f"ZIP soubor: {zipf}")
report.append(f"Velikost ZIP: {zip_size/1024/1024:.1f} MB")
report.append(
f"Kompresní poměr: "
f"{100 * (1 - zip_size / fbk_size):.1f} %"
)
report.append(f"Čas ZIP: {t_zip:.1f} s")
report.append("")
# ====================================================
# 3) DELETE FBK
# ====================================================
fbk.unlink()
report.append("FBK soubor byl po úspěšné kompresi smazán.")
report.append("")
report.append(f"LOG: {log}")
# ====================================================
# MAIL OK
# ====================================================
send_mail(
MAIL_TO,
"✅ MEDICUS záloha + ZIP OK",
"\n".join(report),
)
except Exception:
err = traceback.format_exc()
send_mail(
MAIL_TO,
"❌ MEDICUS chyba při záloze / ZIP",
f"""Při záloze MEDICUS došlo k chybě.
Čas: {now}
Chyba:
{err}
FBK (pokud existuje): {fbk}
LOG: {log}
""",
)
raise
if __name__ == "__main__":
main()