def create(service_label, skip_poll): settings = project.read_settings() session = client.acquire_session(settings) service_id = services.get_by_label(session, settings["environmentId"], service_label) task_id = services.create_backup(session, settings["environmentId"], service_id) print("Backup started (task ID = %s)" % (task_id,)) if not skip_poll: output.write("Polling until backup finishes.") task = tasks.poll_status(session, settings["environmentId"], task_id, exit_on_error=False) output.write("\nEnded in status '%s'" % (task["status"],)) logs.dump(session, settings, service_label, service_id, task_id, "backup", None) if task["status"] != "finished": sys.exit(-1)
def cmd_export(database_label, filepath): """Exports all data from a chosen database service. The export command is accomplished by first creating a backup of the database. Then requesting a temporary access URL to the encrypted backup file. The file is downloaded, decrypted, and stored at the provided location. If there is an unexpected error, please contact Catalyze support ([email protected]). """ settings = project.read_settings() session = client.acquire_session(settings) service_id = services.get_by_label(session, settings["environmentId"], database_label) task_id = services.create_backup(session, settings["environmentId"], service_id) print("Export started (task ID = %s)" % (task_id,)) output.write("Polling until export finishes.") job = tasks.poll_status(session, settings["environmentId"], task_id, exit_on_error=False) if job["status"] != "finished": output.write("\nExport finished with illegal status \"%s\", aborting." % (job["status"],)) logs.dump(session, settings, database_label, service_id, task_id, "backup", None) sys.exit(-1) output.write("\nEnded in status '%s'" % (job["status"],)) backup_id = job["id"] output.write("Downloading...") url = services.get_temporary_url(session, settings["environmentId"], service_id, backup_id) r = requests.get(url, stream=True) basename = os.path.basename(filepath) dir = tempfile.mkdtemp() tmp_filepath = os.path.join(dir, basename) with open(tmp_filepath, 'wb+') as f: for chunk in r.iter_content(chunk_size=1024): if chunk: f.write(chunk) f.flush() output.write("Decrypting...") decryption = AESCrypto.Decryption(tmp_filepath, job["backup"]["key"], job["backup"]["iv"]) decryption.decrypt(filepath) os.remove(tmp_filepath) output.write("%s exported successfully to %s" % (database_label, filepath)) logs.dump(session, settings, database_label, service_id, task_id, "backup", None)