yhkylin-backup-tools/backup-daemon/udiskdatarestoreproxy.cpp

182 lines
5.1 KiB
C++
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "udiskdatarestoreproxy.h"
#include <QDateTime>
#include <QDir>
#include <QTimer>
#include <QDebug>
#include <unistd.h>
#include <sys/reboot.h>
#include "../common/utils.h"
#include "mymountproxy.h"
IMPLEMENT_DYNCREATE(UDiskDataRestoreProxy)
/**
* @brief 构造函数
*/
UDiskDataRestoreProxy::UDiskDataRestoreProxy()
{
m_bSuccess = false;
m_isFinished = false;
m_p = nullptr;
m_isForce = false;
}
/**
* @brief 析构函数
*/
UDiskDataRestoreProxy::~UDiskDataRestoreProxy()
{
delete m_p;
}
/**
* @brief 环境检测
* @return false,检测失败;true,检测成功
*/
bool UDiskDataRestoreProxy::checkEnvEx()
{
qDebug() << "UDiskDataRestoreProxy::checkEnvEx invoke begin";
// 1、检测.user.txt是否存在
m_userFile = m_backupWrapper.m_prefixDestPath + BACKUP_SNAPSHOTS_PATH + "/" + m_backupWrapper.m_uuid + "/" + PATHS_USER_FILE;
if (!Utils::filsExists(m_userFile)) {
qCritical(".user.txt文件不存在");
emit checkResult(int(BackupResult::WRITE_BACKUP_PATHS_TO_USER_FAILED));
return false;
}
// 2、检测.exclude.user.txt是否存在
m_excludeUserFile = m_backupWrapper.m_prefixDestPath + BACKUP_SNAPSHOTS_PATH + "/" + m_backupWrapper.m_uuid + "/" + EXCLUDE_PATHS_USER_FILE;
if (!Utils::filsExists(m_excludeUserFile)) {
qCritical(".exclude.user.txt文件不存在");
emit checkResult(int(BackupResult::WRITE_EXCLUDE_BACKUP_PATHS_TO_USER_FAILED));
return false;
}
// 3、检测还原点是否存在
m_backupPath = m_backupWrapper.m_prefixDestPath + BACKUP_SNAPSHOTS_PATH + "/" + m_backupWrapper.m_uuid + "/data";
if (Utils::isDirEmpty(m_backupPath)) {
qCritical("还原点{uuid}/data目录不存在");
emit checkResult(int(BackupResult::INC_NOT_FOUND_DIR));
return false;
}
// 4、检测xml中的还原点是否还存在
QString xmlPath = Utils::getSysRootPath() + BACKUP_XML_PATH;
xmlPath.replace("//", "/");
ParseBackupList parse(xmlPath);
m_backupPoint = parse.findBackupPointByUuid(m_backupWrapper.m_uuid);
if (m_backupPoint.m_uuid.isEmpty()) {
qCritical("xml中还原点不存在");
emit checkResult(int(BackupResult::INC_NOT_FOUND_DIR));
return false;
}
emit checkResult(int(BackupResult::CHECK_ENV_SUCCESS));
qDebug() << "UDiskDataRestoreProxy::checkEnvEx invoke end";
return true;
}
/**
* @brief 执行还原逻辑
*/
void UDiskDataRestoreProxy::doWorkEx()
{
qDebug() << "UDiskDataRestoreProxy::doWorkEx invoke begin";
// 1、校验
if (!checkEnvEx())
return ;
// 2、还原数据
restoreData();
qDebug() << "UDiskDataRestoreProxy::doWorkEx invoke end";
}
/**
* @brief 根据场景获取rsync命令参数
* @param scene场景
* @return 组装好的rsync的参数信息
*/
QStringList UDiskDataRestoreProxy::getRsyncArgs(DataRestoreScene scene)
{
QStringList args;
args << "-avAHXr";
args << "--info=progress2";
args << "--no-inc-recursive";
args << "--ignore-missing-args";
args << "--delete";
switch (scene) {
case DataRestoreScene::DATA_RESTORE :
args << "--files-from" << m_userFile;
break ;
default:
return args;
}
return args;
}
/**
* @brief 数据还原
*/
void UDiskDataRestoreProxy::restoreData()
{
QStringList args = getRsyncArgs(DataRestoreScene::DATA_RESTORE);
m_srcPath = m_backupPath;
QString destPath = Utils::getSysRootPath();
destPath.replace("//", "/");
args << m_srcPath + "/";
args << destPath + "/";
m_p = new RsyncPathToDirProcess(this);
connect(m_p, &RsyncPathToDirProcess::progress, this, &UDiskDataRestoreProxy::progress);
connect(m_p, &RsyncPathToDirProcess::finished, this, [&](bool result) {
m_isForce = false;
m_bSuccess = result;
m_isFinished = true;
if (result) {
QString time = QDateTime::currentDateTime().toString("yy-MM-dd hh:mm:ss");
Utils::writeBackupLog(time + "," + m_backupWrapper.m_uuid + "," + QString::number(m_backupWrapper.m_type) + ",,," + QString::number(m_backupWrapper.m_frontUid)+ "," + m_backupPoint.m_backupName);
}
emit this->workResult(result);
});
QTimer::singleShot(1*1000, this, &UDiskDataRestoreProxy::checkUdiskExists);
m_isFinished = false;
m_bSuccess = false;
m_p->start(args, false);
}
/**
* @brief 监控移动设备是否还在
* @return true-在false-不在
*/
bool UDiskDataRestoreProxy::checkUdiskExists()
{
if (!m_isFinished) {
// 拔掉U盘后没有响应的场景怀疑可能是某应用程序关闭引起希望不是dbus服务关掉了
if (m_isForce) {
emit this->workResult(false);
return false;
}
if (Utils::isDirEmpty(m_backupPath) && m_p != nullptr) {
m_p->stop();
// 10s钟后如果还没有退出则强制退出
QTimer::singleShot(10*1000, this, &UDiskDataRestoreProxy::checkUdiskExists);
m_isForce = true;
} else {
QTimer::singleShot(1*1000, this, &UDiskDataRestoreProxy::checkUdiskExists);
}
}
return true;
}