def settings_backup(): with backup_lock(): # Expand settings in case it contains non-trivial code command = diffsettings.Command() kwargs = {"default": None, "all": False, "output": "hash"} with open(data_dir("backups", "settings-expanded.py"), "w") as handle: handle.write(command.handle(**kwargs)) # Backup original settings if settings.SETTINGS_MODULE: settings_mod = import_module(settings.SETTINGS_MODULE) copyfile(settings_mod.__file__, data_dir("backups", "settings.py"))
def settings_backup(): with backup_lock(): # Expand settings in case it contains non-trivial code command = diffsettings.Command() kwargs = {"default": None, "all": False, "output": "hash"} with open(data_dir("backups", "settings-expanded.py"), "w") as handle: handle.write(command.handle(**kwargs)) # Backup original settings if settings.SETTINGS_MODULE: settings_mod = import_module(settings.SETTINGS_MODULE) copyfile(settings_mod.__file__, data_dir("backups", "settings.py")) # Backup environment (to make restoring Docker easier) with open(data_dir("backups", "environment.yml"), "w") as handle: yaml = YAML() yaml.dump(dict(os.environ), handle)
def database_backup(): if settings.DATABASE_BACKUP == "none": return with backup_lock(): database = settings.DATABASES["default"] env = get_clean_env() compress = settings.DATABASE_BACKUP == "compressed" out_compressed = data_dir("backups", "database.sql.gz") out_plain = data_dir("backups", "database.sql") if using_postgresql(): cmd = ["pg_dump", "--dbname", database["NAME"]] if database["HOST"]: cmd.extend(["--host", database["HOST"]]) if database["PORT"]: cmd.extend(["--port", database["PORT"]]) if database["USER"]: cmd.extend(["--username", database["USER"]]) if settings.DATABASE_BACKUP == "compressed": cmd.extend(["--file", out_compressed]) cmd.extend(["--compress", "6"]) compress = False else: cmd.extend(["--file", out_plain]) env["PGPASSWORD"] = database["PASSWORD"] else: cmd = [ "mysqldump", "--result-file", out_plain, "--single-transaction", "--skip-lock-tables", ] if database["HOST"]: cmd.extend(["--host", database["HOST"]]) if database["PORT"]: cmd.extend(["--port", database["PORT"]]) if database["USER"]: cmd.extend(["--user", database["USER"]]) cmd.extend(["--databases", database["NAME"]]) env["MYSQL_PWD"] = database["PASSWORD"] try: subprocess.run( cmd, env=env, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.DEVNULL, check=True, universal_newlines=True, ) except subprocess.CalledProcessError as error: report_error(extra_data={"stdout": error.stdout, "stderr": error.stderr}) raise if compress: with open(out_plain, "rb") as f_in: with gzip.open(out_compressed, "wb") as f_out: shutil.copyfileobj(f_in, f_out) os.unlink(out_plain)