162 lines
4.2 KiB
Python
162 lines
4.2 KiB
Python
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()
|