yhkylin-backup-tools/common/utils.h

340 lines
9.5 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.

#ifndef UTILS_H
#define UTILS_H
#include <QString>
#include <QtDebug>
#include "mydefine.h"
class SystemInfo
{
public:
// 操作系统
static QString m_os;
// 架构
static QString m_arch;
// 引导方式
static QString m_archDetect;
};
/**
* @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 是否有平板模式
* @return bool
*/
static bool isTablet();
/**
* @brief 获取备份分区的UUID
* @return 备份分区的UUID
*/
static QString getBackupPartitionUuid();
/**
* @brief 获取分区对应的UUID映射关系
* @param fstab文件路径
* @return “分区挂载目录-分区UUID”键值对
*/
static QHash<QString, QString> getPartUuidMap(const QString &fstab);
/**
* @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);
/**
* @brief 备份还原时,需要一些用户家目录下的路径,因为这些路径备份还原程序无权操作
* @param excludes存放需要排除的路径
*/
static void excludeSomeHomePath(QStringList &excludes);
/**
* @brief 排除自定义备份路径
* @param excludes存放需要排除的路径
*/
static void excludeCustomizePath(QStringList &excludes);
/**
* @brief 生成rsync --exclude-from排除路径规则文件
* @return
*/
static bool generateExcludePathsFile();
/**
* @brief 获取系统备份还原排除路径列表
* @return 系统备份还原排除路径列表
*/
static QStringList getFromExcludePathsFile();
/**
* @brief 判断目录是否存在
* @param 目录路径
* @return true,存在false,不存在
*/
static bool isDirExist(const QString& fullDirName);
/**
* @brief 生成Uuid
* @return UUID
*/
static QString createUuid();
/**
* @brief 将列表中内容写入指定文件中
* @param fileName文件全路径
* @param lines内容列表
* @return true成功写入false写入失败
*/
static bool writeFileByLines(const QString& fileName, const QStringList& lines);
/**
* @brief 判断文件是否存在
* @param fileName 文件明
* @return booltrue-存在false-不存在
* @author zhaominyong
* @since 2021/05/29
*/
static bool filsExists(const QString &fileName);
/**
* @brief 判断目录是否为空
* @param fullDirName 目录路径
* @return true-目录不存在或为空目录; false-非空目录
*/
static bool isDirEmpty(const QString& fullDirName);
/**
* @brief 记录备份日志
* @param line日志内容
* @return bool, true-成功false-失败
* @author zhaominyong
* @since 2021/05/29
* @note
* 因为系统恢复成功后马上需要reboot但是此时的文件缓存可能还未能落盘故此增加此函数其中调用了系统函数fdatasync确保缓存落盘
*/
static bool writeBackupLog(QString line);
/**
* @brief 立即写文件
* @param fileName 文件名,包含路径
* @param content 文件内容
* @return bool
*/
static bool syncWriteFile(const QString &fileName, const QString& content);
/**
* @brief 将字节大小转换为GB等表示的字符串
* @param sizeqint64空间大小单位字节
* @return GB/MB/KB等表示的字符串型大小
*/
static QString StringBySize(qint64 size);
/**
* @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();
/**
* @brief 获取挂接的计算机内部磁盘
* @return 内部磁盘挂接路径列表
*/
static QList<QString> getLocalDisks();
/**
* @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);
static QString executeCmd(const QString &cmd, const QStringList &args = QStringList());
/**
* @brief 获取备份日志列表
* @return
*/
static QList<BackupWrapper> getBackupLogList();
/**
* @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();
/**
* @brief 获取分区剩余大小
* @return
*/
static QHash<QString, QString> getLeftSizeOfPartitions();
/**
* @brief 获取分区可用大小,主要是/和/data分区
* @return 路径和大小(单位:字节)键值对
*/
static QHash<QString, qint64> getAvailableSizeOfPartitions();
/**
* @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);
/**
* @brief 根据备份点名称删除备份点uuid记录
* @param backupName 备份点名称
*/
static void deleteBackupUniqueRecord(const QString& backupName);
/**
* @brief 获取备份点Uuid-BackupName键值对
* @return Uuid-BackupName键值对
*/
static QMap<QString, QString> getBackupUuidNameMap();
/**
* @brief 前后两次调用,然后取文件修改时间用于判断缓存数据是否落盘
* @return
*/
static bool updateSyncFile();
/**
* @brief 用事件循环替换sleep以便事件尽量得到处理
* @param sec等待时间单位秒
* @author zhaominyong
* @since 2021/05/29
*/
static void wait(uint sec);
private:
// 系统根目录,默认"/"
static QString m_sysRootPath;
};
#endif // UTILS_H