1
Fork 0
mirror of https://github.com/wlinator/luminara.git synced 2024-10-03 00:03:13 +00:00
Lumi/modules/backup.py

78 lines
2.1 KiB
Python
Raw Normal View History

2023-07-12 10:16:02 +00:00
import logging
import os
2023-10-23 16:12:23 +00:00
import subprocess
2023-07-12 10:16:02 +00:00
from datetime import datetime
2023-07-15 15:57:08 +00:00
import dropbox
2023-07-12 10:16:02 +00:00
from discord.ext import commands, tasks
from dotenv import load_dotenv
2024-02-28 13:01:20 +00:00
logs = logging.getLogger('Racu.Core')
2023-07-12 10:16:02 +00:00
load_dotenv('.env')
2023-07-15 15:57:08 +00:00
oauth2_refresh_token = os.getenv("DBX_OAUTH2_REFRESH_TOKEN")
app_key = os.getenv("DBX_APP_KEY")
app_secret = os.getenv("DBX_APP_SECRET")
2023-07-12 10:16:02 +00:00
instance = os.getenv("INSTANCE")
2023-10-23 16:12:23 +00:00
mariadb_user = os.getenv("MARIADB_USER")
mariadb_password = os.getenv("MARIADB_PASSWORD")
2023-07-12 10:16:02 +00:00
2024-02-27 17:23:59 +00:00
if instance.lower() == "main":
dbx = dropbox.Dropbox(
app_key=app_key,
app_secret=app_secret,
oauth2_refresh_token=oauth2_refresh_token
)
else:
# can be ignored
dbx = None
2023-07-15 15:57:08 +00:00
2023-07-12 10:16:02 +00:00
async def create_db_backup(dbx, path="db/rcu.db"):
backup_name = datetime.today().strftime('%Y-%m-%d_%H%M')
2023-10-23 16:12:23 +00:00
backup_name += f"_racu.sql"
2023-07-12 10:16:02 +00:00
2023-10-23 16:12:23 +00:00
command = f"mariadb-dump --user={mariadb_user} --password={mariadb_password} " \
f"--host=db --single-transaction --all-databases > ./db/init/2-data.sql"
2023-10-23 16:12:23 +00:00
subprocess.check_output(command, shell=True)
2023-10-23 16:12:23 +00:00
with open("./db/init/2-data.sql", "rb") as f:
dbx.files_upload(f.read(), f"/{backup_name}")
2023-07-12 10:16:02 +00:00
async def backup_cleanup(dbx):
all_backup_files = []
for entry in dbx.files_list_folder('').entries:
all_backup_files.append(entry.name)
for file in sorted(all_backup_files[:-48]):
dbx.files_delete_v2('/' + file)
class BackupCog(commands.Cog):
2024-02-28 13:01:20 +00:00
def __init__(self, client):
2024-02-28 13:11:22 +00:00
self.client = client
2023-07-12 10:16:02 +00:00
self.do_backup.start()
@tasks.loop(hours=1)
async def do_backup(self):
2023-10-23 16:39:15 +00:00
if instance.lower() == "main":
2023-07-12 10:16:02 +00:00
try:
await create_db_backup(dbx)
await backup_cleanup(dbx)
2024-02-28 13:01:20 +00:00
logs.info("[BACKUP] database backup success.")
2023-07-12 10:16:02 +00:00
except Exception as error:
2024-02-28 13:01:20 +00:00
logs.error(f"[BACKUP] database backup failed. {error}")
logs.info(f"[BACKUP] Dropbox failure: {error}")
2023-07-12 10:16:02 +00:00
else:
2024-02-28 13:01:20 +00:00
logs.info("[BACKUP] No backup was made, instance not \"MAIN\".")
2023-07-12 10:16:02 +00:00
2024-02-28 13:01:20 +00:00
def setup(client):
client.add_cog(BackupCog(client))