Add push-backup
This commit is contained in:
87
build/worker/push_backup.py
Executable file
87
build/worker/push_backup.py
Executable file
@@ -0,0 +1,87 @@
|
||||
#!/home/frappe/frappe-bench/env/bin/python
|
||||
|
||||
import argparse
|
||||
import os
|
||||
import sys
|
||||
|
||||
import boto3
|
||||
import frappe
|
||||
from frappe.utils.backups import BackupGenerator
|
||||
|
||||
|
||||
class Arguments(argparse.Namespace):
|
||||
site: str
|
||||
bucket: str
|
||||
region_name: str
|
||||
endpoint_url: str
|
||||
aws_access_key_id: str
|
||||
aws_secret_access_key: str
|
||||
|
||||
|
||||
def get_bucket(arguments: Arguments):
|
||||
return boto3.resource(
|
||||
service_name="s3",
|
||||
endpoint_url=arguments.endpoint_url,
|
||||
region_name=arguments.region_name,
|
||||
aws_access_key_id=arguments.aws_access_key_id,
|
||||
aws_secret_access_key=arguments.aws_secret_access_key,
|
||||
).Bucket(arguments.bucket)
|
||||
|
||||
|
||||
def get_files(site_name: str):
|
||||
frappe.connect(site_name)
|
||||
backup_generator = BackupGenerator(
|
||||
db_name=frappe.conf.db_name,
|
||||
user=frappe.conf.db_name,
|
||||
password=frappe.conf.db_password,
|
||||
db_host=frappe.db.host,
|
||||
db_port=frappe.db.port,
|
||||
db_type=frappe.conf.db_type,
|
||||
)
|
||||
recent_backup_files = backup_generator.get_recent_backup(24)
|
||||
return [f for f in recent_backup_files if f]
|
||||
|
||||
|
||||
def upload(arguments: Arguments):
|
||||
"""Get latest backup files using Frappe utils, push them to S3 and remove local copy"""
|
||||
files = get_files(arguments.site)
|
||||
if not files:
|
||||
print("No backup found that was taken <24 hours ago.")
|
||||
return
|
||||
|
||||
bucket = get_bucket(arguments)
|
||||
print(f"Uploading files: {str(files)}")
|
||||
|
||||
for file_name in files:
|
||||
abs_file_path = os.path.abspath(file_name)
|
||||
bucket.upload_file(Filename=abs_file_path, Key=abs_file_path)
|
||||
os.remove(file_name)
|
||||
|
||||
|
||||
def _parse_args(args: list[str]):
|
||||
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())
|
||||
|
||||
|
||||
def main(args: list[str]) -> int:
|
||||
arguments = _parse_args(args)
|
||||
upload(arguments)
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
print(sys.argv[1:])
|
||||
raise SystemExit(main(sys.argv[1:]))
|
||||
Reference in New Issue
Block a user