[V3 Core] Add [p]backup (#1471)

* [V3 Core] add [p]backup

* move imports
This commit is contained in:
palmtree5 2018-03-28 15:53:27 -08:00 committed by Will
parent 9ecea9e1d5
commit 2f23244937

View File

@ -3,7 +3,9 @@ import datetime
import importlib import importlib
import itertools import itertools
import logging import logging
import os
import sys import sys
import tarfile
import traceback import traceback
from collections import namedtuple from collections import namedtuple
from pathlib import Path from pathlib import Path
@ -814,6 +816,45 @@ class Core:
pages, box_lang="Available Locales:" pages, box_lang="Available Locales:"
) )
@commands.command()
@checks.is_owner()
async def backup(self, ctx):
"""Creates a backup of all data for the instance."""
from redbot.core.data_manager import basic_config, instance_name
from redbot.core.drivers.red_json import JSON
data_dir = Path(basic_config["DATA_PATH"])
if basic_config["STORAGE_TYPE"] == "MongoDB":
from redbot.core.drivers.red_mongo import Mongo
m = Mongo("Core", **basic_config["STORAGE_DETAILS"])
db = m.db
collection_names = await db.collection_names(include_system_collections=False)
for c_name in collection_names:
if c_name == "Core":
c_data_path = data_dir / basic_config["CORE_PATH_APPEND"]
else:
c_data_path = data_dir / basic_config["COG_PATH_APPEND"]
output = {}
docs = await db[c_name].find().to_list(None)
for item in docs:
item_id = str(item.pop("_id"))
output[item_id] = item
target = JSON(c_name, data_path_override=c_data_path)
await target.jsonIO._threadsafe_save_json(output)
backup_filename = "redv3-{}-{}.tar.gz".format(
instance_name, ctx.message.created_at.strftime("%Y-%m-%d %H-%M-%S")
)
if data_dir.exists():
home = data_dir.home()
backup_file = home / backup_filename
os.chdir(data_dir.parent)
with tarfile.open(str(backup_file), "w:gz") as tar:
tar.add(data_dir.stem)
await ctx.send(_("A backup has been made of this instance. It is at {}.").format(
backup_file
))
else:
await ctx.send(_("That directory doesn't seem to exist..."))
@commands.command() @commands.command()
@commands.cooldown(1, 60, commands.BucketType.user) @commands.cooldown(1, 60, commands.BucketType.user)
async def contact(self, ctx, *, message: str): async def contact(self, ctx, *, message: str):