42 lines
1.4 KiB
Python
42 lines
1.4 KiB
Python
|
|
"""make backup: снять резервную копию базы.
|
|||
|
|
|
|||
|
|
Та же операция, что кнопка на АРМ администратора, — но вызываемая из cron:
|
|||
|
|
ТЗ требует копирования не реже раза в сутки, а полагаться на то, что кто-то
|
|||
|
|
нажмёт кнопку, нельзя.
|
|||
|
|
|
|||
|
|
make backup снять копию
|
|||
|
|
0 3 * * * cd … && make backup в crontab демо-машины
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
import sys
|
|||
|
|
from pathlib import Path
|
|||
|
|
|
|||
|
|
ROOT = Path(__file__).resolve().parents[1]
|
|||
|
|
sys.path.insert(0, str(ROOT))
|
|||
|
|
|
|||
|
|
from app.admin.backup import BackupError, create, listing # noqa: E402
|
|||
|
|
|
|||
|
|
#: Сколько копий держать. Место на демо-машине не бесконечно, а копия за
|
|||
|
|
#: позапрошлую неделю не нужна никому.
|
|||
|
|
KEEP = 14
|
|||
|
|
|
|||
|
|
|
|||
|
|
def main() -> int:
|
|||
|
|
try:
|
|||
|
|
created = create()
|
|||
|
|
except BackupError as exc:
|
|||
|
|
print(f"копия не снята: {exc}")
|
|||
|
|
return 1
|
|||
|
|
|
|||
|
|
print(f"{created['name']}: {created['size_bytes'] // 1024} КБ")
|
|||
|
|
|
|||
|
|
old = listing()[KEEP:]
|
|||
|
|
for item in old:
|
|||
|
|
(ROOT / "backups" / item["name"]).unlink(missing_ok=True)
|
|||
|
|
if old:
|
|||
|
|
print(f"удалено старых копий: {len(old)}")
|
|||
|
|
return 0
|
|||
|
|
|
|||
|
|
|
|||
|
|
if __name__ == "__main__":
|
|||
|
|
raise SystemExit(main())
|