取消操作功能编码

This commit is contained in:
zhaominyong 2022-01-18 17:35:26 +08:00
parent b6eaa43087
commit e8fa09f81f
24 changed files with 538 additions and 132 deletions

View File

@ -12,15 +12,23 @@ IMPLEMENT_DYNCREATE(DataBackupProxy)
DataBackupProxy::DataBackupProxy()
{
m_isOnlyCheck = true;
m_bSuccess = false;
m_isFinished = false;
m_p = nullptr;
m_size = 0;
m_calc = new CalcBackupSize(this);
connect(this, &DataBackupProxy::cancel, this, &DataBackupProxy::cancelEx);
}
DataBackupProxy::~DataBackupProxy()
{
delete m_p;
m_p = nullptr;
delete m_calc;
m_calc = nullptr;
}
/**
@ -42,10 +50,10 @@ bool DataBackupProxy::checkEnvEx()
isIncBackup();
// 3、检测空间是否满足备份
bool result = checkFreeCapacity();
calcSizeForBackup();
qDebug() << "DataBackupProxy::checkEnv invoke end";
return result;
return true;
}
/**
@ -54,17 +62,52 @@ bool DataBackupProxy::checkEnvEx()
void DataBackupProxy::doWorkEx()
{
qDebug() << "DataBackupProxy::doWorkEx invoke begin";
// 环境检测
if (!checkEnvEx())
return ;
// 开始备份
doBackup();
m_isOnlyCheck = false;
// 环境检测
checkEnvEx();
qDebug() << "DataBackupProxy::doWorkEx invoke end";
}
/**
* @brief
*/
void DataBackupProxy::cancelEx()
{}
{
m_bCancel = true;
if (!m_isFinished) {
emit this->checkResult(int(BackupResult::START_CANCEL));
if (m_calc)
m_calc->stop();
if (m_p)
m_p->stop();
QProcess::execute("sync");
Utils::wait(5);
deleteFailedData();
emit this->checkResult(int(BackupResult::CANCEL_SUCCESS));
}
}
/**
* @brief
*/
void DataBackupProxy::deleteFailedData()
{
// 1、删除备份目录
QStringList args;
args << "-rf";
args << m_destPath;
QProcess::execute("rm", args);
// 2、删除xml文件中的备份项
QString xmlPath = Utils::getSysRootPath() + BACKUP_XML_PATH;
xmlPath.replace("//", "/");
ParseBackupList parse(xmlPath);
parse.deleteItem(m_curUuid);
}
/**
* @brief
@ -92,14 +135,17 @@ bool DataBackupProxy::isIncBackup()
/**
* @brief
*/
bool DataBackupProxy::checkFreeCapacity()
bool DataBackupProxy::checkFreeCapacity(qint64 itotalSize)
{
qDebug() << "DataBackupProxy::checkFreeCapacity invoke begin";
// 如果是取消了操作,则不再发送其它信息
if (m_bCancel)
return false;
// 1、计算待备份数据的大小
qint64 itotalSize = calcSizeForBackup();
m_size = itotalSize;
// 备份过程中会有一些临时文件产生会占用一部分空间故我们预留500M的空间
// 备份过程中会有一些临时文件产生会占用一部分空间故我们预留5M的空间
itotalSize += 5 * MB;
// 2、计算备份分区剩余空间大小
@ -117,6 +163,12 @@ bool DataBackupProxy::checkFreeCapacity()
emit checkResult(int(BackupResult::CHECK_ENV_SUCCESS));
}
if (m_isOnlyCheck)
return result;
// 开始备份
doBackup();
qDebug() << "DataBackupProxy::checkFreeCapacity invoke end";
return result;
}
@ -125,7 +177,7 @@ bool DataBackupProxy::checkFreeCapacity()
* @brief
* @return ,
*/
qint64 DataBackupProxy::calcSizeForBackup()
void DataBackupProxy::calcSizeForBackup()
{
QString destPath = Utils::getSysRootPath();
@ -152,8 +204,8 @@ qint64 DataBackupProxy::calcSizeForBackup()
args << destPath;
Utils::mkpath(destPath);
CalcBackupSize calcator;
return calcator.start(args);
connect(m_calc, &CalcBackupSize::finished, this, &DataBackupProxy::checkFreeCapacity);
m_calc->start(args, false);
}
/**
@ -338,6 +390,11 @@ bool DataBackupProxy::backupData()
m_p = new RsyncPathToDirProcess(this);
connect(m_p, &RsyncPathToDirProcess::progress, this, &DataBackupProxy::progress);
connect(m_p, &RsyncPathToDirProcess::finished, this, [&](bool result) {
// 如果是取消了操作,则不再发送其它信息
if (m_bCancel)
return ;
m_isFinished = true;
if (result) {
m_backupPoint.m_state = BACKUP_PARSE_STATE_SUCCESS_STRTING;
m_backupPoint.m_size = Utils::StringBySize(Utils::getDirOrFileSize(m_destPath));
@ -355,6 +412,7 @@ bool DataBackupProxy::backupData()
Utils::update_backup_unique_settings(m_curUuid, m_backupPoint.m_backupName);
m_bSuccess = true;
}
emit this->workResult(result);
});
m_p->start(args, false);

View File

@ -2,6 +2,7 @@
#define DATABACKUPPROXY_H
#include "workerfactory.h"
#include "myprocess/calcbackupsize.h"
#include "myprocess/rsyncpathtodirprocess.h"
#include "parsebackuplist.h"
@ -28,15 +29,20 @@ public:
// 任务处理
virtual void doWorkEx();
public slots:
// 任务取消
virtual void cancelEx();
private:
private slots:
// 校验剩余空间是否满足备份
bool checkFreeCapacity();
bool checkFreeCapacity(qint64 itotalSize);
// 备份
void doBackup();
private:
// 计算备份所需空间大小
qint64 calcSizeForBackup();
void calcSizeForBackup();
/**
* @brief /backup/snapshots/backuplist.xml文件
@ -47,9 +53,6 @@ private:
// 备份准备
bool doPrepare();
// 备份
void doBackup();
// 备份系统
bool backupData();
@ -66,7 +69,16 @@ protected:
void do_kylin_security(const QString& dstDir);
// 失败则删除相应数据
virtual void deleteFailedData();
// 计算备份空间大小的进程
CalcBackupSize *m_calc;
// 是否只是检测
bool m_isOnlyCheck;
// 是否完成
bool m_isFinished;
// 是否成功
bool m_bSuccess;
// 当前备份uuid
QString m_curUuid;

View File

@ -16,6 +16,9 @@ GhostImageProxy::GhostImageProxy()
{
m_mksquashfs = nullptr;
m_bSuccess = false;
m_isFinished = false;
connect(this, &GhostImageProxy::cancel, this, &GhostImageProxy::cancelEx);
}
GhostImageProxy::~GhostImageProxy()
@ -91,7 +94,31 @@ void GhostImageProxy::doWorkEx()
* @brief
*/
void GhostImageProxy::cancelEx()
{}
{
m_bCancel = true;
if (!m_isFinished) {
emit this->checkResult(int(BackupResult::START_CANCEL));
if (m_mksquashfs)
m_mksquashfs->stop();
QProcess::execute("sync");
Utils::wait(5);
deleteFailedData();
emit this->checkResult(int(BackupResult::CANCEL_SUCCESS));
}
}
/**
* @brief
*/
void GhostImageProxy::deleteFailedData()
{
// 1、删除镜像文件
QFile kyimg(m_kyimg);
if (kyimg.exists())
kyimg.remove();
}
/**
* @brief ghost镜像
@ -108,15 +135,20 @@ void GhostImageProxy::doGhostImage()
m_mksquashfs = new MkSquashFSProcess(this);
connect(m_mksquashfs, &MkSquashFSProcess::progress, this, &GhostImageProxy::progress);
connect(m_mksquashfs, &MkSquashFSProcess::finished, this, [&](bool result) {
// 如果是取消了操作,则不再发送其它信息
if (m_bCancel)
return ;
m_isFinished = true;
if (result) {
chown(m_kyimg.toLocal8Bit().data(), m_backupWrapper.m_frontUid, m_backupWrapper.m_gid);
QFileInfo fileInfo(m_kyimg);
QString imgSize = Utils::StringBySize(fileInfo.size());
QString time = QDateTime::currentDateTime().toString("yy-MM-dd hh:mm:ss");
Utils::writeBackupLog(time + ","
+ m_backupWrapper.m_uuid + "," + QString::number(m_backupWrapper.m_type) + ","
+ m_backupWrapper.m_note + "," + imgSize
+ ",," + m_backupWrapper.m_backupName);
// QFileInfo fileInfo(m_kyimg);
// QString imgSize = Utils::StringBySize(fileInfo.size());
// QString time = QDateTime::currentDateTime().toString("yy-MM-dd hh:mm:ss");
// Utils::writeBackupLog(time + ","
// + m_backupWrapper.m_uuid + "," + QString::number(m_backupWrapper.m_type) + ","
// + m_backupWrapper.m_note + "," + imgSize
// + ",," + m_backupWrapper.m_backupName);
m_bSuccess = true;
}
emit this->workResult(result);

View File

@ -27,6 +27,8 @@ public:
private:
void doGhostImage();
void deleteFailedData();
// 存放.kyimg文件的目录
QString m_destPath;
// .kyimg文件
@ -37,6 +39,8 @@ private:
// 是否成功
bool m_bSuccess;
// 是否完成
bool m_isFinished;
};
#endif // GHOSTIMAGEPROXY_H

View File

@ -3,6 +3,7 @@
*/
#include <QTimer>
#include <QDateTime>
#include <mutex>
#include <sys/reboot.h>
#include <kysec/status.h>
@ -10,6 +11,7 @@
#include "../common/utils.h"
#include "mymountproxy.h"
#include "workerfactory.h"
#include "parsebackuplist.h"
/**
* @brief
@ -131,6 +133,7 @@ int MyBackupManager::goBackup(const BackupWrapper& backupWrapper)
case int(BackupResult::CHECK_ENV_SUCCESS) :
case int(BackupResult::MKSQUASHFS_START_SUCCESS) :
case int(BackupResult::BACKUP_START_SUCCESS) :
case int(BackupResult::START_CANCEL) :
break;
default:
this->finished();
@ -265,6 +268,7 @@ int MyBackupManager::ghostBackup(const BackupWrapper& backupWrapper)
case int(BackupResult::CHECK_ENV_SUCCESS) :
case int(BackupResult::MKSQUASHFS_START_SUCCESS) :
case int(BackupResult::GHOST_START_SUCCESS) :
case int(BackupResult::START_CANCEL) :
break;
default:
this->finished();
@ -299,13 +303,75 @@ int MyBackupManager::ghostBackup(const BackupWrapper& backupWrapper)
*/
void MyBackupManager::autoBackUpForSystemUpdate_noreturn(const QString& autobackup_name, const QString& create_note, const QString& inc_note, const QString& frontUserName, int frontUid)
{
Q_UNUSED(autobackup_name)
Q_UNUSED(create_note)
Q_UNUSED(inc_note)
Q_UNUSED(frontUserName)
Q_UNUSED(frontUid)
qDebug("MyBackupManager::autoBackUpForSystemUpdate_noreturn invoke begin");
return ;
if (m_isActive || !lock(frontUid)) {
emit sendStartBackupResult(int(BackupResult::LOCK_PROGRAM_FAIL));
return ;
}
BackupWrapper backupWrapper;
backupWrapper.m_uuid = AUTO_BACKUP_UUID;
QString xmlPath = Utils::getSysRootPath() + BACKUP_XML_PATH;
xmlPath.replace("//", "/");
ParseBackupList parseXml(xmlPath);
ParseBackupList::BackupPoint backupPoint = parseXml.findBackupPointByUuid(backupWrapper.m_uuid);
if (autobackup_name.isEmpty()) {
if (backupPoint.m_backupName.isEmpty())
backupWrapper.m_backupName = QDateTime::currentDateTime().toString("yy-MM-dd hh:mm:ss");
else
backupWrapper.m_backupName = backupPoint.m_backupName;
} else {
backupWrapper.m_backupName = autobackup_name;
}
backupWrapper.m_backupPaths << "/";
backupWrapper.m_backupExcludePaths = Utils::getFromExcludePathsFile();
backupWrapper.m_type = BackupType::BACKUP_SYSTEM;
backupWrapper.m_iPosition = BackupPosition::LOCAL;
backupWrapper.m_frontUserName = frontUserName;
backupWrapper.m_frontUid = frontUid;
backupWrapper.m_note = create_note.isEmpty() ? inc_note : create_note;
Worker* worker = WorkerFactory::createWorker(backupWrapper.m_type, backupWrapper.m_iPosition);
if (nullptr == worker) {
emit sendStartBackupResult(int(BackupResult::NO_FOUND_DEALCLASS));
return ;
}
worker->setParam(backupWrapper);
connect(worker, &Worker::checkResult, this, [&](int result) {
emit this->sendStartBackupResult(result);
switch (result) {
case int(BackupResult::CHECK_ENV_SUCCESS) :
case int(BackupResult::MKSQUASHFS_START_SUCCESS) :
case int(BackupResult::BACKUP_START_SUCCESS) :
break;
default:
this->finished();
if (!Utils::isRunning("kybackup")) {
this->umountBackupPartition();
}
break;
}
});
connect(worker, &Worker::progress, this, [&](int rate) {
emit this->sendRate(int(BackupState::WORKING), rate);
});
connect(worker, &Worker::workResult, this, [&] (bool result) {
emit this->sendBackupResult(result);
this->finished();
if (!Utils::isRunning("kybackup")) {
this->umountBackupPartition();
}
});
worker->moveToThread(&workerThread);
connect(&workerThread, &MyThread::started, worker, &Worker::doWork);
connect(&workerThread, &MyThread::finished, worker, &Worker::deleteLater);
workerThread.start();
qDebug("MyBackupManager::autoBackUpForSystemUpdate_noreturn invoke end");
}
/**
@ -315,8 +381,12 @@ void MyBackupManager::autoBackUpForSystemUpdate_noreturn(const QString& autoback
*/
QString MyBackupManager::getBackupCommentForSystemUpdate(QString& state)
{
Q_UNUSED(state)
return "";
QString xmlPath = Utils::getSysRootPath() + BACKUP_XML_PATH;
xmlPath.replace("//", "/");
ParseBackupList parseXml(xmlPath);
ParseBackupList::BackupPoint backupPoint = parseXml.findBackupPointByUuid(AUTO_BACKUP_UUID);
state = backupPoint.m_state;
return backupPoint.m_backupName;
}
/**

View File

@ -13,19 +13,27 @@ IMPLEMENT_DYNCREATE(SystemBackupProxy)
SystemBackupProxy::SystemBackupProxy()
{
m_bSuccess = false;
m_isFinished = false;
m_p = nullptr;
m_size = 0;
m_isOnlyCheck = true;
m_calc = new CalcBackupSize(this);
connect(this, &SystemBackupProxy::cancel, this, &SystemBackupProxy::cancelEx);
}
SystemBackupProxy::~SystemBackupProxy()
{
delete m_p;
m_p = nullptr;
delete m_calc;
m_calc = nullptr;
}
/**
* @brief
* @return false,;true,
* @return
*/
bool SystemBackupProxy::checkEnvEx()
{
@ -42,10 +50,10 @@ bool SystemBackupProxy::checkEnvEx()
isIncBackup();
// 3、检测空间是否满足备份
bool result = checkFreeCapacity();
calcSizeForBackup();
qDebug() << "SystemBackupProxy::checkEnv invoke end";
return result;
return true;
}
/**
@ -54,17 +62,51 @@ bool SystemBackupProxy::checkEnvEx()
void SystemBackupProxy::doWorkEx()
{
qDebug() << "SystemBackupProxy::doWorkEx invoke begin";
// 环境检测
if (!checkEnvEx())
return ;
// 开始备份
doBackup();
// 环境检测
checkEnvEx();
qDebug() << "SystemBackupProxy::doWorkEx invoke end";
}
/**
* @brief
*/
void SystemBackupProxy::cancelEx()
{}
{
m_bCancel = true;
if (!m_isFinished) {
emit this->checkResult(int(BackupResult::START_CANCEL));
if (m_calc)
m_calc->stop();
if (m_p)
m_p->stop();
QProcess::execute("sync");
Utils::wait(5);
deleteFailedData();
emit this->checkResult(int(BackupResult::CANCEL_SUCCESS));
}
}
/**
* @brief
*/
void SystemBackupProxy::deleteFailedData()
{
// 1、删除备份目录
QStringList args;
args << "-rf";
args << m_destPath;
QProcess::execute("rm", args);
// 2、删除xml文件中的备份项
QString xmlPath = Utils::getSysRootPath() + BACKUP_XML_PATH;
xmlPath.replace("//", "/");
ParseBackupList parse(xmlPath);
parse.deleteItem(m_curUuid);
}
/**
* @brief
@ -99,12 +141,15 @@ bool SystemBackupProxy::isIncBackup()
/**
* @brief
*/
bool SystemBackupProxy::checkFreeCapacity()
void SystemBackupProxy::checkFreeCapacity(qint64 itotalSize)
{
qDebug() << "SystemBackupProxy::checkFreeCapacity invoke begin";
// 如果是取消了操作,则不再发送其它信息
if (m_bCancel)
return ;
// 1、计算待备份数据的大小
qint64 itotalSize = calcSizeForBackup();
m_size = itotalSize;
// 备份过程中会有一些临时文件产生会占用一部分空间故我们预留500M的空间
itotalSize += 500 * MB;
@ -116,23 +161,27 @@ bool SystemBackupProxy::checkFreeCapacity()
qint64 freeSize = backupDisk.bytesAvailable();
// 3、校验空间是否足够
bool result = true;
if (itotalSize > freeSize) {
emit checkResult(int(BackupResult::BACKUP_CAPACITY_IS_NOT_ENOUGH));
result = false;
} else {
emit checkResult(int(BackupResult::CHECK_ENV_SUCCESS));
}
// 仅仅校验,不进行备份
if (m_isOnlyCheck)
return ;
// 4、开始备份
doBackup();
qDebug() << "SystemBackupProxy::checkFreeCapacity invoke end";
return result;
}
/**
* @brief
* @return ,
* @return
*/
qint64 SystemBackupProxy::calcSizeForBackup()
void SystemBackupProxy::calcSizeForBackup()
{
QString destPath = Utils::getSysRootPath();
@ -165,8 +214,8 @@ qint64 SystemBackupProxy::calcSizeForBackup()
args << destPath;
Utils::mkpath(destPath);
CalcBackupSize calcator;
return calcator.start(args);
connect(m_calc, &CalcBackupSize::finished, this, &SystemBackupProxy::checkFreeCapacity);
m_calc->start(args, false);
}
/**
@ -304,7 +353,7 @@ bool SystemBackupProxy::doPrepare()
userFile.replace("//", "/");
if (!Utils::writeFileByLines(userFile, m_backupWrapper.m_backupPaths)) {
emit checkResult(int(BackupResult::WRITE_BACKUP_PATHS_TO_USER_FAILED));
qCritical() << QString("create file %1 failed !").arg(userFile) ;
qCritical() << QString("create file %1 failed !").arg(userFile);
return false;
}
@ -312,7 +361,7 @@ bool SystemBackupProxy::doPrepare()
excludeUserFile.replace("//", "/");
if (!Utils::writeFileByLines(excludeUserFile, m_backupWrapper.m_backupExcludePaths)) {
emit checkResult(int(BackupResult::WRITE_BACKUP_PATHS_TO_USER_FAILED));
qCritical() << QString("create file %1 failed !").arg(excludeUserFile) ;
qCritical() << QString("create file %1 failed !").arg(excludeUserFile);
return false;
}
@ -423,9 +472,14 @@ bool SystemBackupProxy::backupSystem()
m_p = new RsyncPathToDirProcess(this);
connect(m_p, &RsyncPathToDirProcess::progress, this, &SystemBackupProxy::progress);
connect(m_p, &RsyncPathToDirProcess::finished, this, [&](bool result) {
// 如果是取消了操作,则不再发送其它信息
if (m_bCancel)
return ;
m_isFinished = true;
if (result) {
m_backupPoint.m_state = BACKUP_PARSE_STATE_SUCCESS_STRTING;
// m_backupPoint.m_size = Utils::StringBySize(Utils::getDirOrFileSize(m_destPath));
m_backupPoint.m_size = Utils::StringBySize(Utils::getDirOrFileSize(m_destPath));
QString xmlPath = Utils::getSysRootPath() + BACKUP_XML_PATH;
xmlPath.replace("//", "/");
ParseBackupList parse(xmlPath);

View File

@ -2,6 +2,7 @@
#define SYSTEMBACKUPPROXY_H
#include "workerfactory.h"
#include "myprocess/calcbackupsize.h"
#include "myprocess/rsyncpathtodirprocess.h"
#include "parsebackuplist.h"
@ -39,10 +40,10 @@ private:
bool isIncBackup();
// 校验剩余空间是否满足备份
bool checkFreeCapacity();
void checkFreeCapacity(qint64 itotalSize);
// 计算备份所需空间大小
qint64 calcSizeForBackup();
void calcSizeForBackup();
/**
* @brief rsync命令参数
@ -71,14 +72,23 @@ private:
void do_kylin_security(const QString& dstDir);
// 失败则删除相应数据
void deleteFailedData();
// 是否只是检测
bool m_isOnlyCheck;
// 是否备份成功
bool m_bSuccess;
// 是否完成
bool m_isFinished;
// 当前备份uuid
QString m_curUuid;
// 当前备份目标目录
QString m_destPath;
// 当前备份所需空间大小
qint64 m_size;
// 计算备份空间大小的进程
CalcBackupSize *m_calc;
// 备份进程
RsyncPathToDirProcess *m_p;
// 当前备份节点

View File

@ -13,20 +13,10 @@ IMPLEMENT_DYNCREATE(UDiskDataBackupProxy)
UDiskDataBackupProxy::UDiskDataBackupProxy()
{
m_isFinished = false;
m_bSuccess = false;
m_p = nullptr;
m_size = 0;
m_calc = new CalcBackupSize(this);
m_isOnlyCheck = true;
}
UDiskDataBackupProxy::~UDiskDataBackupProxy()
{
delete m_p;
m_p = nullptr;
delete m_calc;
m_calc = nullptr;
}
/**
@ -86,8 +76,44 @@ void UDiskDataBackupProxy::doWorkEx()
qDebug() << "UDiskDataBackupProxy::doWorkEx invoke end";
}
/**
* @brief
*/
void UDiskDataBackupProxy::cancelEx()
{}
{
m_bCancel = true;
if (!m_isFinished) {
emit this->checkResult(int(BackupResult::START_CANCEL));
if (m_calc)
m_calc->stop();
if (m_p)
m_p->stop();
QProcess::execute("sync");
Utils::wait(5);
deleteFailedData();
emit this->checkResult(int(BackupResult::CANCEL_SUCCESS));
}
}
/**
* @brief
*/
void UDiskDataBackupProxy::deleteFailedData()
{
// 1、删除备份目录
QStringList args;
args << "-rf";
args << m_destPath;
QProcess::execute("rm", args);
// 2、删除xml文件中的备份项
QString xmlPath = m_backupWrapper.m_prefixDestPath + BACKUP_XML_PATH;
xmlPath.replace("//", "/");
ParseBackupList parse(xmlPath);
parse.deleteItem(m_curUuid);
}
/**
* @brief
@ -96,6 +122,10 @@ bool UDiskDataBackupProxy::checkFreeCapacityToUdisk(qint64 itotalSize)
{
qDebug() << "UDiskDataBackupProxy::checkFreeCapacityToUdisk invoke begin";
// 如果是取消了操作,则不再发送其它信息
if (m_bCancel)
return false;
// 1、计算待备份数据的大小
m_size = itotalSize;
// 备份过程中会有一些临时文件产生会占用一部分空间故我们预留500M的空间
@ -296,6 +326,10 @@ bool UDiskDataBackupProxy::backupDataToUdisk()
m_p = new RsyncPathToDirProcess(this);
connect(m_p, &RsyncPathToDirProcess::progress, this, &UDiskDataBackupProxy::progress);
connect(m_p, &RsyncPathToDirProcess::finished, this, [&](bool result) {
// 如果是取消了操作,则不再发送其它信息
if (m_bCancel)
return ;
m_isFinished = true;
if (result) {
m_backupPoint.m_state = BACKUP_PARSE_STATE_SUCCESS_STRTING;

View File

@ -2,7 +2,6 @@
#define UDISKDATABACKUPPROXY_H
#include "databackupproxy.h"
#include "myprocess/calcbackupsize.h"
class UDiskDataBackupProxy : public DataBackupProxy
{
@ -19,6 +18,7 @@ public:
// 任务处理
virtual void doWorkEx();
public slots:
// 任务取消
virtual void cancelEx();
@ -39,6 +39,10 @@ private slots:
*/
bool checkDestDirExists();
protected:
// 失败则删除相应数据
virtual void deleteFailedData();
private:
// 计算备份所需空间大小
void calcSizeForBackupToUdisk();
@ -54,13 +58,6 @@ private:
// 备份系统
bool backupDataToUdisk();
// 计算备份空间大小的进程
CalcBackupSize *m_calc;
// 是否只是检测
bool m_isOnlyCheck;
// 是否完成
bool m_isFinished;
};
#endif // UDISKDATABACKUPPROXY_H

View File

@ -19,6 +19,8 @@ UDiskGhostImageProxy::UDiskGhostImageProxy()
m_p = nullptr;
m_bSuccess = false;
m_isFinished = false;
connect(this, &UDiskGhostImageProxy::cancel, this, &UDiskGhostImageProxy::cancelEx);
}
UDiskGhostImageProxy::~UDiskGhostImageProxy()
@ -135,7 +137,34 @@ void UDiskGhostImageProxy::doWorkEx()
* @brief
*/
void UDiskGhostImageProxy::cancelEx()
{}
{
m_bCancel = true;
if (!m_isFinished) {
emit this->checkResult(int(BackupResult::START_CANCEL));
if (m_mksquashfs)
m_mksquashfs->stop();
if (m_p)
m_p->stop();
QProcess::execute("sync");
Utils::wait(5);
deleteFailedData();
emit this->checkResult(int(BackupResult::CANCEL_SUCCESS));
}
}
/**
* @brief
*/
void UDiskGhostImageProxy::deleteFailedData()
{
// 1、删除镜像文件
QFile kyimg(m_kyimg);
if (kyimg.exists())
kyimg.remove();
}
/**
* @brief ghost镜像
@ -152,23 +181,34 @@ void UDiskGhostImageProxy::doGhostImage()
m_mksquashfs = new MkSquashFSProcess(this);
connect(m_mksquashfs, &MkSquashFSProcess::progress, this, &UDiskGhostImageProxy::progress);
connect(m_mksquashfs, &MkSquashFSProcess::finished, this, [&](bool result) {
// 如果是取消了操作,则不再发送其它信息
if (m_bCancel)
return ;
if (result) {
chown(m_kyimg.toLocal8Bit().data(), m_backupWrapper.m_frontUid, m_backupWrapper.m_gid);
// 同步到U盘
m_p = new RsyncPathToDirProcess(this);
connect(m_p, &RsyncPathToDirProcess::finished, this, [&](bool resultRsync) {
// 如果是取消了操作,则不再发送其它信息
if (m_bCancel)
return ;
m_isFinished = true;
if (resultRsync) {
QFileInfo fileInfo(m_kyimg);
QString imgSize = Utils::StringBySize(fileInfo.size());
QString time = QDateTime::currentDateTime().toString("yy-MM-dd hh:mm:ss");
Utils::writeBackupLog(time + ","
+ m_backupWrapper.m_uuid + "," + QString::number(m_backupWrapper.m_type) + ","
+ m_backupWrapper.m_note + "," + imgSize
+ ",," + m_backupWrapper.m_backupName);
// QFileInfo fileInfo(m_kyimg);
// QString imgSize = Utils::StringBySize(fileInfo.size());
// QString time = QDateTime::currentDateTime().toString("yy-MM-dd hh:mm:ss");
// Utils::writeBackupLog(time + ","
// + m_backupWrapper.m_uuid + "," + QString::number(m_backupWrapper.m_type) + ","
// + m_backupWrapper.m_note + "," + imgSize
// + ",," + m_backupWrapper.m_backupName);
m_bSuccess = true;
}
QFile kyimg(m_kyimg);
if (kyimg.exists())
kyimg.remove();
emit this->workResult(resultRsync);
});

View File

@ -27,6 +27,7 @@ public:
private:
void doGhostImage();
bool checkDestDirExists();
void deleteFailedData();
// 存放.kyimg文件的目录
QString m_destPath;

View File

@ -21,6 +21,8 @@ UDiskSystemBackupProxy::UDiskSystemBackupProxy()
m_calc = new CalcBackupSize(this);
m_isOnlyCheck = true;
m_mksquashfs = nullptr;
connect(this, &UDiskSystemBackupProxy::cancel, this, &UDiskSystemBackupProxy::cancelEx);
}
UDiskSystemBackupProxy::~UDiskSystemBackupProxy()
@ -41,7 +43,7 @@ UDiskSystemBackupProxy::~UDiskSystemBackupProxy()
/**
* @brief
* @return false,;true,
* @return
*/
bool UDiskSystemBackupProxy::checkEnvEx()
{
@ -93,7 +95,42 @@ void UDiskSystemBackupProxy::doWorkEx()
}
void UDiskSystemBackupProxy::cancelEx()
{}
{
m_bCancel = true;
if (!m_isFinished) {
emit this->checkResult(int(BackupResult::START_CANCEL));
if (m_calc)
m_calc->stop();
if (m_mksquashfs)
m_mksquashfs->stop();
if (m_p)
m_p->stop();
QProcess::execute("sync");
Utils::wait(5);
deleteFailedData();
emit this->checkResult(int(BackupResult::CANCEL_SUCCESS));
}
}
/**
* @brief
*/
void UDiskSystemBackupProxy::deleteFailedData()
{
// 1、删除备份目录
QStringList args;
args << "-rf";
args << m_destPath;
QProcess::execute("rm", args);
// 2、删除xml文件中的备份项
QString xmlPath = Utils::getSysRootPath() + BACKUP_XML_PATH;
xmlPath.replace("//", "/");
ParseBackupList parse(xmlPath);
parse.deleteItem(m_curUuid);
}
/**
* @brief
@ -132,6 +169,10 @@ void UDiskSystemBackupProxy::checkFreeCapacity(qint64 itotalSize)
{
qDebug() << "UDiskSystemBackupProxy::checkFreeCapacity invoke begin";
// 如果是取消了操作,则不再发送其它信息
if (m_bCancel)
return ;
// 1、计算待备份数据的大小
m_size = itotalSize;
// 备份过程中会有一些临时文件产生会占用一部分空间故我们预留500M的空间
@ -267,6 +308,10 @@ void UDiskSystemBackupProxy::doMksqushfs()
m_mksquashfs = new MkSquashFSProcess(this);
connect(m_mksquashfs, &MkSquashFSProcess::progress, this, &UDiskSystemBackupProxy::progress);
connect(m_mksquashfs, &MkSquashFSProcess::finished, this, [=](bool result) {
// 如果是取消了操作,则不再发送其它信息
if (m_bCancel)
return ;
if (result) {
// 开始备份
doBackup();
@ -456,6 +501,10 @@ bool UDiskSystemBackupProxy::backup(const QStringList &args)
m_p = new RsyncPathToDirProcess(this);
connect(m_p, &RsyncPathToDirProcess::progress, this, &UDiskSystemBackupProxy::progress);
connect(m_p, &RsyncPathToDirProcess::finished, this, [&](bool result) {
// 如果是取消了操作,则不再发送其它信息
if (m_bCancel)
return ;
m_isFinished = true;
if (result) {
m_backupPoint.m_state = BACKUP_PARSE_STATE_SUCCESS_STRTING;

View File

@ -31,9 +31,6 @@ public:
// 任务处理
virtual void doWorkEx();
// 任务取消
virtual void cancelEx();
signals:
private slots:
@ -46,6 +43,9 @@ private slots:
// 备份
void doBackup();
// 任务取消
virtual void cancelEx();
/**
* @brief
* @return: bool,truefalse
@ -89,6 +89,9 @@ private:
void do_kylin_security(const QString& dstDir);
// 失败则删除相应数据
void deleteFailedData();
// 计算备份空间大小的进程
CalcBackupSize *m_calc;
// 压缩进程

View File

@ -2,7 +2,8 @@
#include <QString>
Worker::Worker() :
QObject(nullptr)
QObject(nullptr),
m_bCancel(false)
{}
Worker::~Worker()
@ -25,14 +26,6 @@ void Worker::doWork()
doWorkEx();
}
/**
* @brief
*/
void Worker::cancel()
{
cancelEx();
}
// 环境检测,个性化部分派生类去实现
bool Worker::checkEnvEx()
{

View File

@ -22,6 +22,8 @@ signals:
void progress(int currentRate);
// 工作结果信号
void workResult(bool result);
// 任务取消
void cancel();
public slots:
// 环境检测
@ -30,9 +32,6 @@ public slots:
// 任务处理
void doWork();
// 任务取消
void cancel();
protected:
// 环境检测,个性化部分派生类去实现
virtual bool checkEnvEx();
@ -49,6 +48,8 @@ public:
public:
// 同一时间只能运行一个备份/还原等操作
BackupWrapper m_backupWrapper;
// 是否取消操作
bool m_bCancel;
};
/**

View File

@ -267,6 +267,10 @@ enum class BackupResult {
MKSQUASHFS_START_SUCCESS,
// mksquashfs压缩img文件失败
MKSQUASHFS_DO_FAIL,
// 开始取消操作
START_CANCEL,
// 取消操作成功
CANCEL_SUCCESS,
};
#endif // MYDEFINE_H

View File

@ -34,15 +34,18 @@ BackupPointListDialog::BackupPointListDialog(QWidget *parent, bool isOnlyShowLoc
QStringList headerLabels;
// 注意此处的列需要和枚举Column_Index一一对应
headerLabels << tr("Backup Name") << tr("UUID") << tr("Backup Time") << tr("Backup Size") << tr("Backup Device") << QObject::tr("Backup State") << QObject::tr("PrefixPath");
headerLabels << tr("Backup Name") << tr("UUID") << tr("Backup Time") << tr("Backup Size") << tr("Position") << QObject::tr("Backup State") << QObject::tr("PrefixPath");
m_tableWidget = new QTableWidget;
m_tableWidget->setColumnCount(headerLabels.size());
m_tableWidget->setHorizontalHeaderLabels(headerLabels);
m_tableWidget->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft | Qt::AlignVCenter);
m_tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
// m_tableWidget->horizontalHeader()->setSectionResizeMode(Column_Index::Backup_Name, QHeaderView::Stretch);
// m_tableWidget->horizontalHeader()->setSectionResizeMode(Column_Index::UUID, QHeaderView::Stretch);
// m_tableWidget->horizontalHeader()->setSectionResizeMode(Column_Index::Backup_Device, QHeaderView::Stretch);
// m_tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
m_tableWidget->horizontalHeader()->resizeSection(Column_Index::Backup_Name, 300);
m_tableWidget->horizontalHeader()->resizeSection(Column_Index::UUID, 320);
m_tableWidget->horizontalHeader()->resizeSection(Column_Index::Backup_Time, 150);
m_tableWidget->horizontalHeader()->resizeSection(Column_Index::Backup_Size, 120);
m_tableWidget->horizontalHeader()->setSectionResizeMode(Column_Index::Backup_Device, QHeaderView::Stretch);
m_tableWidget->horizontalHeader()->resizeSection(Column_Index::Backup_State, 150);
m_tableWidget->horizontalHeader()->setTextElideMode( Qt::ElideRight);
m_tableWidget->horizontalHeader()->setFixedHeight(30);
m_tableWidget->verticalHeader()->setHidden(true); // 好像隐藏不掉

View File

@ -22,7 +22,7 @@ public:
UUID,
Backup_Time,
Backup_Size,
Backup_Device,
Backup_Device, // 即备份位置Position
Backup_State,
Prefix_Path
};

View File

@ -1235,8 +1235,6 @@ void DataBackup::initFifthWidget()
labelTip->setIsOriginal(true);
labelTip->setFontWordWrap(true);
labelTip->setMinimumWidth(700);
// 不要使用电脑,以防数据丢失
labelTip->setDeplayText(tr("Do not use computers in case of data loss"));
hlayoutCenterFont2->addStretch();
hlayoutCenterFont2->addWidget(labelTip);
hlayoutCenterFont2->addStretch();
@ -1247,7 +1245,6 @@ void DataBackup::initFifthWidget()
MyPushButton *cancel = new MyPushButton(fifth);
cancel->setFixedSize(97, 36);
cancel->setText(tr("cancel"));
cancel->setEnabled(true);
cancel->setAutoRepeat(true);
hlayoutCenterFont3->addStretch();
hlayoutCenterFont3->addWidget(cancel);
@ -1277,6 +1274,9 @@ void DataBackup::initFifthWidget()
connect(this, &DataBackup::startBackup, this, [=] {
progressBar->setPersent(0);
movie->start();
// 不要使用电脑,以防数据丢失
labelTip->setDeplayText(tr("Do not use computers in case of data loss"));
cancel->setEnabled(true);
// 开始备份
this->on_backup_start();
@ -1291,7 +1291,13 @@ void DataBackup::initFifthWidget()
// 取消备份
connect(cancel, &MyPushButton::clicked, this, [=](bool checked) {
Q_UNUSED(checked)
// TODO
// 确定取消当前操作?
if (!MessageBoxUtils::QMESSAGE_BOX_WARNING_CANCEL(this, QObject::tr("Warning"), QObject::tr("Are you sure to cancel the operation"), QObject::tr("Ok"), QObject::tr("Cancel"))) {
return ;
}
cancel->setEnabled(false);
if (m_pInterface)
m_pInterface->cancel();
});
addWidget(fifth);
@ -1359,7 +1365,7 @@ void DataBackup::on_checkBackup_end(int result)
break;
case int(BackupResult::BACKUP_CAPACITY_IS_NOT_ENOUGH):
// 备份空间不足
errMsg = tr("The storage for backup is not enough.");
errMsg = tr("The storage for backup is not enough");
// 建议释放空间后重试
errTip = tr("Retry after release space");
break;
@ -1373,10 +1379,16 @@ void DataBackup::on_checkBackup_end(int result)
case int(BackupResult::WRITE_STORAGEINFO_ADD_ITEM_FAIL):
case int(BackupResult::WRITE_STORAGEINFO_UPDATE_ITEM_FAIL):
// 创建备份点目录失败
errMsg = tr("Failed to create the backup point directory.");
errMsg = tr("Failed to create the backup point directory");
// 请检查备份目录是否有写权限
errTip = tr("Please check backup partition permissions");
break;
case int(BackupResult::CANCEL_SUCCESS):
// 已经取消本次备份
errMsg = tr("The backup had been canceled");
// 如需要可重新发起备份
errTip = tr("Re-initiate the backup if necessary");
break;
default:
bRst = true;
break;
@ -1566,7 +1578,7 @@ void DataBackup::initLastWidget()
QIcon icon = QIcon::fromTheme("dialog-error.png", QIcon(":/symbos/dialog-error.png"));
resultLogo->setPixmap(icon.pixmap(QSize(20,20)));
resultLogo->setVisible(true);
// 环境校验失败
// 备份失败
bigTitle->setDeplayText(tr("The backup is failed"));
dot1->setVisible(true);
dot2->setVisible(true);

View File

@ -170,8 +170,8 @@ void DataRestore::on_button_beginRestore_clicked(bool checked)
selectRestoreDialog->deleteLater();
return ;
} else if (checkIsNeedReboot()){
// 包含用户家目录,还原完成后将自动重启
if (!MessageBoxUtils::QMESSAGE_BOX_WARNING_CANCEL(this, QObject::tr("Warning"), QObject::tr("Contains the user's home directory, which will automatically reboot after restoration"), QObject::tr("Continue"), QObject::tr("Cancel"))) {
// 包含用户家目录,还原完成后需要重启
if (!MessageBoxUtils::QMESSAGE_BOX_WARNING_CANCEL(this, QObject::tr("Warning"), QObject::tr("Contains the user's home directory, which need to reboot after restoration"), QObject::tr("Continue"), QObject::tr("Cancel"))) {
selectRestoreDialog->deleteLater();
return ;
}

View File

@ -690,8 +690,6 @@ void GhostImage::initForthWidget()
labelTip->setIsOriginal(true);
labelTip->setFontWordWrap(true);
labelTip->setMinimumWidth(700);
// 不要使用电脑,以防数据丢失
labelTip->setDeplayText(tr("Do not use computers in case of data loss"));
hlayoutCenterFont2->addStretch();
hlayoutCenterFont2->addWidget(labelTip);
hlayoutCenterFont2->addStretch();
@ -749,8 +747,11 @@ void GhostImage::initForthWidget()
connect(this, &GhostImage::startGhost, this, [=] {
progressBar->setPersent(0);
movie->start();
// 不要使用电脑,以防数据丢失
labelTip->setDeplayText(tr("Do not use computers in case of data loss"));
labelTip_1->setVisible(false);
labelTip_1->setDeplayText("");
cancel->setEnabled(true);
// 开始备份
this->on_ghost_start();
@ -765,7 +766,13 @@ void GhostImage::initForthWidget()
// 取消备份
connect(cancel, &MyPushButton::clicked, this, [=](bool checked) {
Q_UNUSED(checked)
// TODO
// 确定取消当前操作?
if (!MessageBoxUtils::QMESSAGE_BOX_WARNING_CANCEL(this, QObject::tr("Warning"), QObject::tr("Are you sure to cancel the operation"), QObject::tr("Ok"), QObject::tr("Cancel"))) {
return ;
}
cancel->setEnabled(false);
if (m_pInterface)
m_pInterface->cancel();
});
addWidget(forth);
@ -867,6 +874,12 @@ void GhostImage::on_checkGhost_end(int result)
// 请检查刚刚是否有删除备份点操作
errTip = tr("Check whether the backup point has been deleted");
break;
case int(BackupResult::CANCEL_SUCCESS):
// 已经取消本次镜像制作
errMsg = tr("The image creation had been canceled");
// 如需要可重新发起镜像制作
errTip = tr("Re-initiate the image creation if necessary");
break;
default:
bRst = true;
break;

View File

@ -20,7 +20,7 @@ ManageBackupPointList::ManageBackupPointList(QWidget *parent, BackupPointType ba
}
// 隐藏备份点大小Backup Size字段
m_tableWidget->hideColumn(Column_Index::Backup_Size);
// m_tableWidget->hideColumn(Column_Index::Backup_Size);
initTableWidget();
// 您可以删除不需要的备份,更多细节请参考“操作日志”

View File

@ -53,7 +53,10 @@ void OperationLog::initFirstWidget()
m_tableWidget->setColumnCount(headerLabels.size());
m_tableWidget->setHorizontalHeaderLabels(headerLabels);
m_tableWidget->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft | Qt::AlignVCenter);
m_tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
// m_tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Fixed);
m_tableWidget->horizontalHeader()->resizeSection(0, 340);
m_tableWidget->horizontalHeader()->resizeSection(2, 150);
m_tableWidget->horizontalHeader()->setStretchLastSection(true);
m_tableWidget->horizontalHeader()->setTextElideMode(Qt::ElideRight);
m_tableWidget->horizontalHeader()->setFixedHeight(30);
m_tableWidget->verticalHeader()->setHidden(true); // 好像隐藏不掉

View File

@ -18,6 +18,7 @@
#include "../../common/utils.h"
#include "../globalbackupinfo.h"
#include "managebackuppointlist.h"
#include "messageboxutils.h"
SystemBackup::SystemBackup(QWidget *parent /*= nullptr*/) :
QStackedWidget(parent),
@ -822,8 +823,6 @@ void SystemBackup::initFifthWidget()
labelTip->setIsOriginal(true);
labelTip->setFontWordWrap(true);
labelTip->setMinimumWidth(700);
// 不要使用电脑,以防数据丢失
labelTip->setDeplayText(tr("Do not use computers in case of data loss"));
hlayoutCenterFont2->addStretch();
hlayoutCenterFont2->addWidget(labelTip);
hlayoutCenterFont2->addStretch();
@ -846,7 +845,6 @@ void SystemBackup::initFifthWidget()
MyPushButton *cancel = new MyPushButton(fifth);
cancel->setFixedSize(97, 36);
cancel->setText(tr("cancel"));
cancel->setEnabled(true);
cancel->setAutoRepeat(true);
hlayoutCenterFont3->addStretch();
hlayoutCenterFont3->addWidget(cancel);
@ -878,8 +876,11 @@ void SystemBackup::initFifthWidget()
connect(this, &SystemBackup::startBackup, this, [=] {
progressBar->setPersent(0);
movie->start();
// 不要使用电脑,以防数据丢失
labelTip->setDeplayText(tr("Do not use computers in case of data loss"));
labelTip_1->setVisible(false);
labelTip_1->setDeplayText("");
cancel->setEnabled(true);
// 开始备份
this->on_backup_start();
@ -894,7 +895,13 @@ void SystemBackup::initFifthWidget()
// 取消备份
connect(cancel, &MyPushButton::clicked, this, [=](bool checked) {
Q_UNUSED(checked)
// TODO
// 确定取消当前操作?
if (!MessageBoxUtils::QMESSAGE_BOX_WARNING_CANCEL(this, QObject::tr("Warning"), QObject::tr("Are you sure to cancel the operation"), QObject::tr("Ok"), QObject::tr("Cancel"))) {
return ;
}
cancel->setEnabled(false);
if (m_pInterface)
m_pInterface->cancel();
});
addWidget(fifth);
@ -965,7 +972,7 @@ void SystemBackup::on_checkBackup_end(int result)
break;
case int(BackupResult::BACKUP_CAPACITY_IS_NOT_ENOUGH):
// 备份空间不足
errMsg = tr("The storage for backup is not enough.");
errMsg = tr("The storage for backup is not enough");
// 建议释放空间后重试
errTip = tr("Retry after release space");
break;
@ -979,20 +986,26 @@ void SystemBackup::on_checkBackup_end(int result)
case int(BackupResult::WRITE_STORAGEINFO_ADD_ITEM_FAIL):
case int(BackupResult::WRITE_STORAGEINFO_UPDATE_ITEM_FAIL):
// 创建备份点目录失败
errMsg = tr("Failed to create the backup point directory.");
errMsg = tr("Failed to create the backup point directory");
// 请检查备份目录是否有写权限
errTip = tr("Please check backup partition permissions");
break;
case int(BackupResult::MKSQUASHFS_START_SUCCESS):
// 正压缩系统到本地磁盘,请耐心等待。。。
// 正压缩系统到本地磁盘,请耐心等待...
errTip = tr("The system is being compressed to the local disk, please wait patiently...");
emit this->backupWarnning(errTip);
return;
case int(BackupResult::BACKUP_START_SUCCESS):
// 正在传输备份文件到移动设备,即将完成。。。
// 正在传输备份文件到移动设备,即将完成...
errTip = tr("Transferring backup files to mobile device, about to be completed...");
emit this->backupWarnning(errTip);
return;
case int(BackupResult::CANCEL_SUCCESS):
// 已经取消本次备份
errMsg = tr("The backup had been canceled");
// 如需要可重新发起备份
errTip = tr("Re-initiate the backup if necessary");
break;
default:
bRst = true;
break;
@ -1182,7 +1195,7 @@ void SystemBackup::initLastWidget()
QIcon icon = QIcon::fromTheme("dialog-error.png", QIcon(":/symbos/dialog-error.png"));
resultLogo->setPixmap(icon.pixmap(QSize(20,20)));
resultLogo->setVisible(true);
// 环境校验失败
// 备份失败
bigTitle->setDeplayText(tr("The backup is failed"));
dot1->setVisible(true);
dot2->setVisible(true);