2
0
mirror of https://github.com/frappe/frappe_docker.git synced 2025-01-28 17:48:32 +00:00
frappe_docker/build/worker/push_backup.py

106 lines
2.9 KiB
Python
Raw Normal View History

2021-12-15 08:30:00 +03:00
#!/home/frappe/frappe-bench/env/bin/python
import argparse
import os
import sys
from pathlib import Path
2022-02-25 12:48:12 +03:00
from typing import TYPE_CHECKING, Any, List, cast
2021-12-15 08:30:00 +03:00
import boto3
import frappe
from frappe.utils.backups import BackupGenerator
2022-02-25 12:48:12 +03:00
if TYPE_CHECKING:
from mypy_boto3_s3.service_resource import _Bucket
2021-12-15 08:30:00 +03:00
class Arguments(argparse.Namespace):
site: str
bucket: str
region_name: str
endpoint_url: str
aws_access_key_id: str
aws_secret_access_key: str
2022-02-25 12:48:12 +03:00
def _get_files_from_previous_backup(site_name: str) -> list[Path]:
2021-12-15 08:30:00 +03:00
frappe.connect(site_name)
2022-02-25 12:20:39 +03:00
conf = cast(Any, frappe.conf)
2021-12-15 08:30:00 +03:00
backup_generator = BackupGenerator(
2022-02-25 12:20:39 +03:00
db_name=conf.db_name,
user=conf.db_name,
password=conf.db_password,
2021-12-15 08:30:00 +03:00
db_host=frappe.db.host,
db_port=frappe.db.port,
2022-02-25 12:20:39 +03:00
db_type=conf.db_type,
2021-12-15 08:30:00 +03:00
)
recent_backup_files = backup_generator.get_recent_backup(24)
2022-02-25 12:48:12 +03:00
frappe.destroy()
return [Path(f) for f in recent_backup_files if f]
2021-12-15 08:30:00 +03:00
2022-02-25 12:48:12 +03:00
def get_files_from_previous_backup(site_name: str) -> list[Path]:
files = _get_files_from_previous_backup(site_name)
2021-12-15 08:30:00 +03:00
if not files:
print("No backup found that was taken <24 hours ago.")
2022-02-25 12:48:12 +03:00
return files
def get_bucket(args: Arguments) -> "_Bucket":
return boto3.resource(
service_name="s3",
endpoint_url=args.endpoint_url,
region_name=args.region_name,
aws_access_key_id=args.aws_access_key_id,
aws_secret_access_key=args.aws_secret_access_key,
).Bucket(args.bucket)
def upload_file(path: Path, site_name: str, bucket: "_Bucket") -> None:
filename = str(path.absolute())
key = str(Path(site_name) / path.name)
print(f"Uploading {key}")
bucket.upload_file(Filename=filename, Key=key)
os.remove(path)
def push_backup(args: Arguments) -> None:
"""Get latest backup files using Frappe utils, push them to S3 and remove local copy"""
2021-12-15 08:30:00 +03:00
2022-02-25 12:48:12 +03:00
files = get_files_from_previous_backup(args.site)
bucket = get_bucket(args)
2021-12-15 08:30:00 +03:00
for path in files:
2022-02-25 12:48:12 +03:00
upload_file(path=path, site_name=args.site, bucket=bucket)
print("Done!")
2021-12-15 08:30:00 +03:00
2022-02-25 12:48:12 +03:00
def parse_args(args: List[str]) -> Arguments:
2021-12-15 08:30:00 +03:00
parser = argparse.ArgumentParser()
parser.add_argument("--site", required=True)
parser.add_argument("--bucket", required=True)
parser.add_argument("--region-name", required=True)
parser.add_argument("--endpoint-url", required=True)
# Looking for default AWS credentials variables
parser.add_argument(
"--aws-access-key-id", required=True, default=os.getenv("AWS_ACCESS_KEY_ID")
)
parser.add_argument(
"--aws-secret-access-key",
required=True,
default=os.getenv("AWS_SECRET_ACCESS_KEY"),
)
return parser.parse_args(args, namespace=Arguments())
2021-12-15 09:15:34 +03:00
def main(args: List[str]) -> int:
2022-02-25 12:48:12 +03:00
push_backup(parse_args(args))
2021-12-15 08:30:00 +03:00
return 0
if __name__ == "__main__":
raise SystemExit(main(sys.argv[1:]))