mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 17:24:24 +02:00
Add backup download API to DS
This commit is contained in:
parent
9e99c5c744
commit
dd0b8a0c2f
3 changed files with 76 additions and 26 deletions
|
@ -383,32 +383,60 @@ void DomainContentBackupManager::backup() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DomainContentBackupManager::consolidate(QString fileName) {
|
void DomainContentBackupManager::consolidateBackup(MiniPromise::Promise promise, QString fileName) {
|
||||||
QDir backupDir { _backupDirectory };
|
if (QThread::currentThread() != thread()) {
|
||||||
if (backupDir.exists()) {
|
QMetaObject::invokeMethod(this, "consolidateBackup", Q_ARG(MiniPromise::Promise, promise),
|
||||||
auto filePath = backupDir.absoluteFilePath(fileName);
|
Q_ARG(const QString&, fileName));
|
||||||
|
return;
|
||||||
auto copyFilePath = QDir::tempPath() + "/" + fileName;
|
|
||||||
|
|
||||||
auto copySuccess = QFile::copy(filePath, copyFilePath);
|
|
||||||
if (!copySuccess) {
|
|
||||||
qCritical() << "Failed to create full backup.";
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
QuaZip zip(copyFilePath);
|
|
||||||
if (!zip.open(QuaZip::mdAdd)) {
|
|
||||||
qCritical() << "Could not open backup archive:" << filePath;
|
|
||||||
qCritical() << " ERROR:" << zip.getZipError();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (auto& handler : _backupHandlers) {
|
|
||||||
handler->consolidateBackup(zip);
|
|
||||||
}
|
|
||||||
|
|
||||||
zip.close();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QDir backupDir { _backupDirectory };
|
||||||
|
if (!backupDir.exists()) {
|
||||||
|
qCritical() << "Backup directory does not exist, bailing consolidation of backup";
|
||||||
|
promise->resolve({ { "success", false } });
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto filePath = backupDir.absoluteFilePath(fileName);
|
||||||
|
|
||||||
|
auto copyFilePath = QDir::tempPath() + "/" + fileName;
|
||||||
|
|
||||||
|
{
|
||||||
|
QFile copyFile(copyFilePath);
|
||||||
|
copyFile.remove();
|
||||||
|
copyFile.close();
|
||||||
|
}
|
||||||
|
auto copySuccess = QFile::copy(filePath, copyFilePath);
|
||||||
|
if (!copySuccess) {
|
||||||
|
qCritical() << "Failed to create copy of backup.";
|
||||||
|
promise->resolve({ { "success", false } });
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
QuaZip zip(copyFilePath);
|
||||||
|
if (!zip.open(QuaZip::mdAdd)) {
|
||||||
|
qCritical() << "Could not open backup archive:" << filePath;
|
||||||
|
qCritical() << " ERROR:" << zip.getZipError();
|
||||||
|
promise->resolve({ { "success", false } });
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto& handler : _backupHandlers) {
|
||||||
|
handler->consolidateBackup(zip);
|
||||||
|
}
|
||||||
|
|
||||||
|
zip.close();
|
||||||
|
|
||||||
|
if (zip.getZipError() != UNZ_OK) {
|
||||||
|
qCritical() << "Failed to consolidate backup: " << zip.getZipError();
|
||||||
|
promise->resolve({ { "success", false } });
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
promise->resolve({
|
||||||
|
{ "success", true },
|
||||||
|
{ "backupFilePath", copyFilePath }
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void DomainContentBackupManager::createManualBackup(MiniPromise::Promise promise, const QString& name) {
|
void DomainContentBackupManager::createManualBackup(MiniPromise::Promise promise, const QString& name) {
|
||||||
|
|
|
@ -62,6 +62,7 @@ public slots:
|
||||||
void createManualBackup(MiniPromise::Promise promise, const QString& name);
|
void createManualBackup(MiniPromise::Promise promise, const QString& name);
|
||||||
void recoverFromBackup(MiniPromise::Promise promise, const QString& backupName);
|
void recoverFromBackup(MiniPromise::Promise promise, const QString& backupName);
|
||||||
void deleteBackup(MiniPromise::Promise promise, const QString& backupName);
|
void deleteBackup(MiniPromise::Promise promise, const QString& backupName);
|
||||||
|
void consolidateBackup(MiniPromise::Promise promise, QString fileName);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void loadCompleted();
|
void loadCompleted();
|
||||||
|
@ -73,7 +74,6 @@ protected:
|
||||||
|
|
||||||
void load();
|
void load();
|
||||||
void backup();
|
void backup();
|
||||||
void consolidate(QString fileName);
|
|
||||||
void removeOldBackupVersions(const BackupRule& rule);
|
void removeOldBackupVersions(const BackupRule& rule);
|
||||||
bool getMostRecentBackup(const QString& format, QString& mostRecentBackupFileName, QDateTime& mostRecentBackupTime);
|
bool getMostRecentBackup(const QString& format, QString& mostRecentBackupFileName, QDateTime& mostRecentBackupTime);
|
||||||
int64_t getMostRecentBackupTimeInSecs(const QString& format);
|
int64_t getMostRecentBackupTimeInSecs(const QString& format);
|
||||||
|
|
|
@ -2149,6 +2149,28 @@ bool DomainServer::handleHTTPRequest(HTTPConnection* connection, const QUrl& url
|
||||||
QJsonDocument docJSON(rootJSON);
|
QJsonDocument docJSON(rootJSON);
|
||||||
|
|
||||||
connection->respond(HTTPConnection::StatusCode200, docJSON.toJson(), JSON_MIME_TYPE.toUtf8());
|
connection->respond(HTTPConnection::StatusCode200, docJSON.toJson(), JSON_MIME_TYPE.toUtf8());
|
||||||
|
return true;
|
||||||
|
} else if (url.path().startsWith(URI_API_BACKUPS_ID)) {
|
||||||
|
auto id = url.path().mid(QString(URI_API_BACKUPS_ID).length());
|
||||||
|
auto deferred = makePromise("consolidateBackup");
|
||||||
|
deferred->then([connection, JSON_MIME_TYPE](QString error, QVariantMap result) {
|
||||||
|
QJsonObject rootJSON;
|
||||||
|
auto success = result["success"].toBool();
|
||||||
|
if (success) {
|
||||||
|
auto path = result["backupFilePath"].toString();
|
||||||
|
auto file { std::unique_ptr<QFile>(new QFile(path)) };
|
||||||
|
if (file->open(QIODevice::ReadOnly)) {
|
||||||
|
connection->respond(HTTPConnection::StatusCode200, std::move(file));
|
||||||
|
} else {
|
||||||
|
qCritical(domain_server) << "Unable to load consolidated backup at:" << path << result;
|
||||||
|
connection->respond(HTTPConnection::StatusCode500, "Error opening backup");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
connection->respond(HTTPConnection::StatusCode400);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
_contentManager->consolidateBackup(deferred, id);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
} else if (url.path() == URI_RESTART) {
|
} else if (url.path() == URI_RESTART) {
|
||||||
connection->respond(HTTPConnection::StatusCode200);
|
connection->respond(HTTPConnection::StatusCode200);
|
||||||
|
|
Loading…
Reference in a new issue