2021-08-06 10:20:03 +08:00
|
|
|
|
#ifndef UTILS_H
|
|
|
|
|
#define UTILS_H
|
|
|
|
|
|
|
|
|
|
#include <QString>
|
|
|
|
|
#include <QtDebug>
|
|
|
|
|
#include "mydefine.h"
|
|
|
|
|
|
2021-11-11 16:03:58 +08:00
|
|
|
|
class SystemInfo
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
// 操作系统
|
|
|
|
|
static QString m_os;
|
|
|
|
|
// 架构
|
|
|
|
|
static QString m_arch;
|
|
|
|
|
// 引导方式
|
|
|
|
|
static QString m_archDetect;
|
|
|
|
|
};
|
|
|
|
|
|
2021-08-06 10:20:03 +08:00
|
|
|
|
/**
|
|
|
|
|
* @brief 工具类
|
|
|
|
|
* @author zhaominyong
|
|
|
|
|
* @since 2021/07/22
|
|
|
|
|
*/
|
|
|
|
|
class Utils
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
/**
|
|
|
|
|
* @brief initSysRootPath, 根据应用程序路径推断系统根目录
|
|
|
|
|
* @param qsAppPath,应用程序所在路径
|
|
|
|
|
*/
|
|
|
|
|
static void initSysRootPath(const QString& qsAppPath);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief getSysRootPath,获取正式系统根目录
|
|
|
|
|
* @return const QString&,系统根目录
|
|
|
|
|
* @note
|
|
|
|
|
* 调用此函数前,需要调用初始化系统根目录函数initSysRootPath;否则,返回默认目录“/”
|
|
|
|
|
*/
|
|
|
|
|
static const QString& getSysRootPath() { return m_sysRootPath; }
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief customMessageHandler,日志重定向句柄
|
|
|
|
|
* @param type 日志类型,debug等
|
|
|
|
|
* @param context 上下文
|
|
|
|
|
* @param msg 日志信息
|
|
|
|
|
*/
|
|
|
|
|
static void customMessageHandler(QtMsgType type, const QMessageLogContext& context, const QString& msg);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief 文件锁,锁定应用程序
|
|
|
|
|
* @param frontUid,锁定程序的用户id
|
|
|
|
|
* @return 锁文件的句柄
|
|
|
|
|
*/
|
|
|
|
|
static int lockProgram(int frontUid);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief 解除应用程序文件锁
|
|
|
|
|
* @param lock_file_fd 锁文件的文件描述符
|
|
|
|
|
* @return 0,解除成功;1,解除失败
|
|
|
|
|
*/
|
|
|
|
|
static int unLockProgram(int lock_file_fd);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief 删除锁文件
|
|
|
|
|
* @return bool
|
|
|
|
|
*/
|
|
|
|
|
static bool rmLockFile();
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief 检查/etc/.bootinfo是否存在并可读,里面存放备份分区的UUID等信息
|
|
|
|
|
* @return bool
|
|
|
|
|
*/
|
|
|
|
|
static bool checkBootInfoExists();
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief 获取备份分区的UUID
|
|
|
|
|
* @return 备份分区的UUID
|
|
|
|
|
*/
|
|
|
|
|
static QString getBackupPartitionUuid();
|
|
|
|
|
|
2021-11-08 09:52:01 +08:00
|
|
|
|
/**
|
|
|
|
|
* @brief 获取分区对应的UUID映射关系
|
|
|
|
|
* @param fstab文件路径
|
|
|
|
|
* @return “分区挂载目录-分区UUID”键值对
|
|
|
|
|
*/
|
|
|
|
|
static QHash<QString, QString> getPartUuidMap(const QString &fstab);
|
|
|
|
|
|
2021-08-06 10:20:03 +08:00
|
|
|
|
/**
|
|
|
|
|
* @brief 路径不存在则创建,不支持递归创建
|
|
|
|
|
* @param path
|
|
|
|
|
*/
|
|
|
|
|
static void mkdir(const QString& path);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief 创建路径,支持递归创建
|
|
|
|
|
* @param path
|
|
|
|
|
* @return bool
|
|
|
|
|
*/
|
|
|
|
|
static bool mkpath(const QString& path);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief 备份还原时,需要排除绑定挂载的路径,因为数据不是存放在挂载路径内
|
|
|
|
|
* @param excludes,存放需要排除的绑定路径
|
|
|
|
|
*/
|
|
|
|
|
static void excludeFstabBindPath(QStringList &excludes);
|
|
|
|
|
|
2021-12-06 14:55:00 +08:00
|
|
|
|
/**
|
|
|
|
|
* @brief 备份还原时,需要一些用户家目录下的路径,因为这些路径备份还原程序无权操作
|
|
|
|
|
* @param excludes,存放需要排除的路径
|
|
|
|
|
*/
|
|
|
|
|
static void excludeSomeHomePath(QStringList &excludes);
|
|
|
|
|
|
2021-08-06 10:20:03 +08:00
|
|
|
|
/**
|
2021-08-17 10:07:35 +08:00
|
|
|
|
* @brief 生成rsync --exclude-from排除路径规则文件
|
2021-08-06 10:20:03 +08:00
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
static bool generateExcludePathsFile();
|
|
|
|
|
|
2021-08-17 10:07:35 +08:00
|
|
|
|
/**
|
|
|
|
|
* @brief 获取系统备份还原排除路径列表
|
|
|
|
|
* @return 系统备份还原排除路径列表
|
|
|
|
|
*/
|
|
|
|
|
static QStringList getFromExcludePathsFile();
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief 判断目录是否存在
|
|
|
|
|
* @param 目录路径
|
|
|
|
|
* @return true,存在;false,不存在
|
|
|
|
|
*/
|
|
|
|
|
static bool isDirExist(const QString& fullDirName);
|
|
|
|
|
|
2021-08-24 18:08:18 +08:00
|
|
|
|
/**
|
|
|
|
|
* @brief 生成Uuid
|
|
|
|
|
* @return UUID
|
|
|
|
|
*/
|
|
|
|
|
static QString createUuid();
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief 将列表中内容写入指定文件中
|
|
|
|
|
* @param fileName,文件全路径
|
|
|
|
|
* @param lines,内容列表
|
|
|
|
|
* @return true,成功写入;false,写入失败
|
|
|
|
|
*/
|
|
|
|
|
static bool writeFileByLines(const QString& fileName, const QStringList& lines);
|
|
|
|
|
|
2021-08-26 20:12:48 +08:00
|
|
|
|
/**
|
|
|
|
|
* @brief 判断文件是否存在
|
|
|
|
|
* @param fileName 文件明
|
|
|
|
|
* @return bool,true-存在;false-不存在
|
|
|
|
|
* @author zhaominyong
|
|
|
|
|
* @since 2021/05/29
|
|
|
|
|
*/
|
|
|
|
|
static bool filsExists(const QString &fileName);
|
|
|
|
|
|
2021-12-09 10:00:07 +08:00
|
|
|
|
/**
|
|
|
|
|
* @brief 判断目录是否为空
|
|
|
|
|
* @param fullDirName 目录路径
|
|
|
|
|
* @return true-目录不存在或为空目录; false-非空目录
|
|
|
|
|
*/
|
|
|
|
|
static bool isDirEmpty(const QString& fullDirName);
|
|
|
|
|
|
2021-08-26 20:12:48 +08:00
|
|
|
|
/**
|
|
|
|
|
* @brief 记录备份日志
|
|
|
|
|
* @param line,日志内容
|
|
|
|
|
* @return bool, true-成功;false-失败
|
|
|
|
|
* @author zhaominyong
|
|
|
|
|
* @since 2021/05/29
|
|
|
|
|
* @note
|
|
|
|
|
* 因为系统恢复成功后马上需要reboot,但是此时的文件缓存可能还未能落盘,故此增加此函数,其中调用了系统函数fdatasync确保缓存落盘
|
|
|
|
|
*/
|
|
|
|
|
static bool writeBackupLog(QString line);
|
|
|
|
|
|
2021-09-23 11:21:58 +08:00
|
|
|
|
/**
|
|
|
|
|
* @brief 立即写文件
|
|
|
|
|
* @param fileName 文件名,包含路径
|
|
|
|
|
* @param content 文件内容
|
|
|
|
|
* @return bool
|
|
|
|
|
*/
|
|
|
|
|
static bool syncWriteFile(const QString &fileName, const QString& content);
|
|
|
|
|
|
2021-08-26 20:12:48 +08:00
|
|
|
|
/**
|
|
|
|
|
* @brief 将字节大小转换为GB等表示的字符串
|
|
|
|
|
* @param size,qint64,空间大小,单位字节
|
|
|
|
|
* @return GB/MB/KB等表示的字符串型大小
|
|
|
|
|
*/
|
|
|
|
|
static QString StringBySize(qint64 size);
|
|
|
|
|
|
2021-10-13 16:31:58 +08:00
|
|
|
|
/**
|
|
|
|
|
* @brief 获取挂接的移动设备列表
|
|
|
|
|
* @return MOUNTPOINT,PATH键值对列表(path中如果含有空格时显示不对,建议不用此值)
|
|
|
|
|
* @author zhaominyong
|
|
|
|
|
* @since 2021/06/07
|
|
|
|
|
* @note
|
|
|
|
|
* for bug 59636 【cpm】【HUAWEI】【KOS】【L0】【V3试制】备份时选择移动设备,会出现一个dev/sdc的路径(一般+必现+不常用功能)
|
|
|
|
|
* QStorageInfo::mountedVolumes获取的磁盘列表区分不出来是否移动设备
|
|
|
|
|
*/
|
|
|
|
|
static QHash<QString, QString> getRemovableStorages();
|
|
|
|
|
|
2021-10-26 09:24:05 +08:00
|
|
|
|
/**
|
|
|
|
|
* @brief 设置安全状态
|
|
|
|
|
* @param enable——true,开启保护;false,关闭保护
|
|
|
|
|
*/
|
|
|
|
|
static void setKysecStatus(bool enable);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief 启动或关闭kysec-sync-daemon服务
|
|
|
|
|
* @param enable——true,开启;false,关闭
|
|
|
|
|
*/
|
|
|
|
|
static void setKysecDaemon(bool enable);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief 判断程序是否已开启
|
|
|
|
|
* @param processName
|
|
|
|
|
* @return true-正在运行;false-未运行
|
|
|
|
|
*/
|
|
|
|
|
static bool isRunning(const QString &processName);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief 判断是否990或9006C处理器
|
|
|
|
|
* @return bool
|
|
|
|
|
*/
|
|
|
|
|
static bool isHuawei990();
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief popen()函数通过创建一个管道,调用fork()产生一个子进程,执行一个shell以运行命令来开启一个进程。
|
|
|
|
|
* @param cmd,是一个指向以 NULL 结束的 shell 命令字符串的指针。这行命令将被传到 bin/sh 并使用 -c 标志,shell 将执行这个命令
|
|
|
|
|
* @param result 输出结果
|
|
|
|
|
* @note 不建议桌面应用调用,因为会依赖终端使得开机自启无法启动起来
|
|
|
|
|
*/
|
|
|
|
|
static void executeCMD(const char* cmd, QString &result);
|
2021-11-08 09:52:01 +08:00
|
|
|
|
static QString executeCmd(const QString &cmd, const QStringList &args = QStringList());
|
2021-10-26 09:24:05 +08:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief 获取备份日志列表
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
static QList<BackupWrapper> getBackupLogList();
|
|
|
|
|
|
2021-11-11 16:03:58 +08:00
|
|
|
|
/**
|
|
|
|
|
* @brief 初始化系统信息
|
|
|
|
|
*/
|
|
|
|
|
static void initSystemInfo();
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief getOs
|
|
|
|
|
* @return 操作系统名字, 如:
|
|
|
|
|
* Kylin-Desktop V10-SP1
|
|
|
|
|
* Build 20210407
|
|
|
|
|
*/
|
|
|
|
|
static QString getOs();
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief getArch
|
|
|
|
|
* @return 架构,arch命令的结果,如:x86_64
|
|
|
|
|
*/
|
|
|
|
|
static QString getArch();
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief getArchDetect
|
|
|
|
|
* @return archdetect命令的结果,如:amd64/efi
|
|
|
|
|
*/
|
|
|
|
|
static QString getArchDetect();
|
|
|
|
|
|
2021-11-20 12:09:26 +08:00
|
|
|
|
/**
|
|
|
|
|
* @brief 获取分区剩余大小
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
static QHash<QString, QString> getLeftSizeOfPartitions();
|
|
|
|
|
|
2022-01-13 14:06:40 +08:00
|
|
|
|
/**
|
|
|
|
|
* @brief 获取分区可用大小,主要是/和/data分区
|
|
|
|
|
* @return 路径和大小(单位:字节)键值对
|
|
|
|
|
*/
|
|
|
|
|
static QHash<QString, qint64> getAvailableSizeOfPartitions();
|
|
|
|
|
|
2021-11-20 17:50:17 +08:00
|
|
|
|
/**
|
|
|
|
|
* @brief 获取文件夹或文件的大小
|
|
|
|
|
* @param path 路径
|
|
|
|
|
* @return 大小
|
|
|
|
|
*/
|
|
|
|
|
static qint64 getDirOrFileSize(const QString &path);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief 记录下备份点uuid及其名称
|
|
|
|
|
* @param uuid
|
|
|
|
|
* @param backupName
|
|
|
|
|
*/
|
|
|
|
|
static void update_backup_unique_settings(const QString &uuid, const QString &backupName);
|
|
|
|
|
|
2021-12-06 14:55:00 +08:00
|
|
|
|
/**
|
|
|
|
|
* @brief 根据备份点名称,删除备份点uuid记录
|
|
|
|
|
* @param backupName 备份点名称
|
|
|
|
|
*/
|
|
|
|
|
static void deleteBackupUniqueRecord(const QString& backupName);
|
|
|
|
|
|
2022-03-09 10:27:29 +08:00
|
|
|
|
/**
|
|
|
|
|
* @brief 获取备份点Uuid-BackupName键值对
|
|
|
|
|
* @return Uuid-BackupName键值对
|
|
|
|
|
*/
|
|
|
|
|
static QMap<QString, QString> getBackupUuidNameMap();
|
|
|
|
|
|
2021-12-09 10:00:07 +08:00
|
|
|
|
/**
|
|
|
|
|
* @brief 前后两次调用,然后取文件修改时间用于判断缓存数据是否落盘
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
static bool updateSyncFile();
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief 用事件循环替换sleep,以便事件尽量得到处理
|
|
|
|
|
* @param sec,等待时间,单位秒
|
|
|
|
|
* @author zhaominyong
|
|
|
|
|
* @since 2021/05/29
|
|
|
|
|
*/
|
|
|
|
|
static void wait(uint sec);
|
|
|
|
|
|
2021-08-06 10:20:03 +08:00
|
|
|
|
private:
|
|
|
|
|
// 系统根目录,默认"/"
|
|
|
|
|
static QString m_sysRootPath;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
#endif // UTILS_H
|