#ifndef UDISKSYSTEMRESTOREPROXY_H #define UDISKSYSTEMRESTOREPROXY_H #include "workerfactory.h" #include "myprocess/rsyncpathtodirprocess.h" #include "parsebackuplist.h" class UDiskSystemRestoreProxy : public Worker { Q_OBJECT DECLARE_DYNCREATE(UDiskSystemRestoreProxy) public: // 系统还原的几种场景 enum SystemRestoreScene { RESTORE_SYSTEM_WITH_DATA, // 保留用户数据还原 SYSTEM_RESTORE, // 系统还原 EFI_RESTORE, // efi还原 }; explicit UDiskSystemRestoreProxy(); virtual ~UDiskSystemRestoreProxy(); public: // 环境检测 virtual bool checkEnvEx(); // 任务处理 virtual void doWorkEx(); private slots: bool checkUdiskExists(); private: // 还原efi bool restoreEfi(); // 修复efi目录 void repairEfi(); // 同步efi bool rsyncEfi(); // 系统还原 void restoreSystem(); // 还原前准备 bool doPrepare(); // 异机还原时更新grub.cfg中的分区UUID void updateGrubUUid(); // 待还原数据 void undoRestoreData(); // 还原备份还原工具自身 void rsyncBackupSelf(); /** * @brief 再一次同步 * @note 意图通过多次同步查缺补漏,如: * 1、因为系统还原过程中~/.config等目录中的部分文件可能会更新,会引起部分bug: * a. 配网,打开奇安信浏览器,触发自动更新(或者软件商店手动更新),且奇安信默认固定在任务栏; * b. 下载安装微信,固定任务栏(新装任意第三方软件均可),会删除desktop文件 * c. 上面两种操作,都会触发任务栏配置更新;通过监控任务栏配置文件,在系统还原过程中,可以明显的看到,在还原1%的时候,配置文件还原到历史文件,桌面图标还原,然后下一秒配置文件就又更新成当前最新的了 */ void rsyncAgain(); /** * @brief 根据场景获取rsync命令参数 * @param scene,场景 * @return 组装好的rsync的参数信息 */ QStringList getRsyncArgs(SystemRestoreScene scene); // .user.txt文件路径 QString m_userFile; // .exclude.user.txt文件路径 QString m_excludeUserFile; // 备份数据所在的data目录 QString m_backupPath; // 是否还原结束 bool m_isFinished; // 当前备份uuid QString m_curUuid; // 当前还原源目录 QString m_srcPath; // 备份进程 RsyncPathToDirProcess *m_p; // 当前备份节点 ParseBackupList::BackupPoint m_backupPoint; // 强制结束标志(stop后没反应的情况,系统处于睡眠状态) bool m_isForce; // 是否保留用户数据 bool m_bRetainUserData = false; }; #endif // UDISKSYSTEMRESTOREPROXY_H