Exemplo n.º 1
0
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"))
Exemplo n.º 2
0
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)
Exemplo n.º 3
0
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)