diff --git a/app_protocols/apperrorcode/apperrorcode.hpp b/app_protocols/apperrorcode/apperrorcode.hpp index 4eba810..1c5dc7a 100644 --- a/app_protocols/apperrorcode/apperrorcode.hpp +++ b/app_protocols/apperrorcode/apperrorcode.hpp @@ -56,6 +56,8 @@ typedef enum { kappe_not_detect_udisk = 10013, // U盘读写错误 kappe_udisk_wr_fail = 10014, + // + kappe_file_operate_error = 10015, } apperror_t; } diff --git a/appsrc/baseservice/baseservice.hpp b/appsrc/baseservice/baseservice.hpp index ef90c7d..5355883 100644 --- a/appsrc/baseservice/baseservice.hpp +++ b/appsrc/baseservice/baseservice.hpp @@ -1,9 +1,10 @@ #pragma once #include "appbase/dep.hpp" // +#include "appcomponents/app_errorcode_mgr/app_errorcode_mgr.hpp" +#include "appcomponents/canchannel/transmit_disinfection_can_master.hpp" #include "db/db_service.hpp" #include "devicestate/device_state_service.hpp" #include "front_msg_processer/front_msg_processer.hpp" #include "iflytop_front_end_service/iflytop_front_end_service.hpp" -#include "appcomponents/app_errorcode_mgr/app_errorcode_mgr.hpp" -#include "appcomponents/canchannel/transmit_disinfection_can_master.hpp" +#include "udisk_mgr_service.hpp" diff --git a/appsrc/service/udisk_mgr_service.cpp b/appsrc/baseservice/udisk_mgr_service.cpp similarity index 100% rename from appsrc/service/udisk_mgr_service.cpp rename to appsrc/baseservice/udisk_mgr_service.cpp diff --git a/appsrc/service/udisk_mgr_service.hpp b/appsrc/baseservice/udisk_mgr_service.hpp similarity index 100% rename from appsrc/service/udisk_mgr_service.hpp rename to appsrc/baseservice/udisk_mgr_service.hpp diff --git a/appsrc/service/audit_mgr_service.cpp b/appsrc/service/audit_mgr_service.cpp new file mode 100644 index 0000000..4257687 --- /dev/null +++ b/appsrc/service/audit_mgr_service.cpp @@ -0,0 +1,94 @@ +#include "audit_mgr_service.hpp" +using namespace iflytop; + +#define EXPORT_PATH "/mnt/exportdata/Transmit/" +#define IF_ERROR_RETURN(x) \ + if (!x) { \ + return err::kappe_udisk_wr_fail; \ + } + +static string getTime() { + struct tm tm = {0}; + + time_t t = ::time(nullptr); + struct tm* tmp = localtime_r(&t, &tm); + return fmt::format("{:0>4}{:0>2}{:0>2}{:0>2}{:0>2}{:0>2}", tm.tm_year + 1900, // + tm.tm_mon + 1, // + tm.tm_mday, // + tm.tm_hour, // + tm.tm_min, tm.tm_sec); +} + +void AuditMgrService::initialize() { + GET_TO_SERVICE(m_db); + GET_TO_SERVICE(m_udiskMgr); + + REGFN(AuditMgrService, exportData); +} +int AuditMgrService::callExportData() { + string diskpath; + if (!m_udiskMgr->isDetectedUDisk(diskpath)) { + logger->error("no disk detected"); + return err::kappe_not_detect_udisk; + } + + logger->info("diskpath: {}", diskpath); + + /** + * @brief 创建导出文件csv + */ + + auto records = m_db->getAllUserBehaviorRecord(); + string filename = fmt::format("/tmp/AUDIT{}.csv", getTime()); + + ofstream ofs(filename); + if (!ofs.is_open()) { + logger->error("open file {} failed", filename); + // return err::ksys_open_file_error; + return err::kappe_file_operate_error; + } + + ofs << "date,uid,operation" << endl; + for (auto& record : records) { + ofs << fmt::format("{},{},\"{}{}\"", record->date, record->uid, db::user_behavior_to_str((user_behavior_t)record->behavior), record->behaviorinfo) << endl; + } + ofs.close(); + // 文件编码转换 + IF_ERROR_RETURN(dosystem(fmt::format("iconv -f UTF-8 -tgb18030 {} -o {}", filename, filename + ".1"))); + dosystem(fmt::format("mv {} {}", filename + ".1", filename)); + + /** + * @brief 拷贝文件到U盘 + */ + // 创建目录 + IF_ERROR_RETURN(dosystem(fmt::format("rm -rf /mnt/exportdata"))); + IF_ERROR_RETURN(dosystem(fmt::format("mkdir -p /mnt/exportdata"))); + // 挂载目录 + IF_ERROR_RETURN(dosystem(fmt::format("mount {} /mnt/exportdata", diskpath))); + // 拷贝文件 + IF_ERROR_RETURN(dosystem(fmt::format("mkdir -p /mnt/exportdata/Transmit/"))); + IF_ERROR_RETURN(dosystem(fmt::format("cp -rf {} /mnt/exportdata/Transmit/", filename))); + // 卸载目录 + IF_ERROR_RETURN(dosystem(fmt::format("umount /mnt/exportdata"))); + // 删除目录 + IF_ERROR_RETURN(dosystem(fmt::format("rm -rf /mnt/exportdata"))); + return err::ksucc; +} + +void AuditMgrService::exportData(shared_ptr cxt) { + int ret = callExportData(); + if (ret != err::ksucc) { + cxt->ackcode = ret; + } +} + +bool AuditMgrService::dosystem(string cmd) { + logger->info("do cmd: {}", cmd); + int ret = system(cmd.c_str()); + if (ret == 0) { + return true; + } else { + logger->error("do cmd: {} failed,{}", cmd, ret); + return false; + } +} diff --git a/appsrc/service/audit_mgr_service.hpp b/appsrc/service/audit_mgr_service.hpp new file mode 100644 index 0000000..0deedfe --- /dev/null +++ b/appsrc/service/audit_mgr_service.hpp @@ -0,0 +1,30 @@ +#pragma once +#include +#include +#include +#include +#include +#include +#include +#include +#include +// +#include "baseservice/baseservice.hpp" +namespace iflytop { +class AuditMgrService : public enable_shared_from_this { + ENABLE_LOGGER(AuditMgrService); + + shared_ptr m_db; + shared_ptr m_udiskMgr; + + public: + void initialize(); + + private: + void exportData(shared_ptr cxt); + int callExportData(); + + bool dosystem(string cmd); +}; + +} // namespace iflytop diff --git a/appsrc/service/disinfection_logs_service.hpp b/appsrc/service/disinfection_logs_service.hpp index cf7bbc3..e53e6a9 100644 --- a/appsrc/service/disinfection_logs_service.hpp +++ b/appsrc/service/disinfection_logs_service.hpp @@ -12,7 +12,6 @@ #include "appbase/dep.hpp" #include "baseservice/baseservice.hpp" #include "iflytop/core/components/zcsv/zcsv.hpp" -#include "udisk_mgr_service.hpp" namespace iflytop { diff --git a/appsrc/service/main_control_service.cpp b/appsrc/service/main_control_service.cpp index 8af0787..9bf2ae0 100644 --- a/appsrc/service/main_control_service.cpp +++ b/appsrc/service/main_control_service.cpp @@ -2,13 +2,13 @@ #include "appbase/project_setting_mgr.hpp" #include "baseservice/baseservice.hpp" +#include "service/audit_mgr_service.hpp" #include "service/device_info_mgr_service.hpp" #include "service/disinfection_logs_service.hpp" #include "service/os_mgr_service.hpp" #include "service/setting_mgr_service.hpp" #include "service/test_page_mgr_service.hpp" #include "service/user_mgr_service.hpp" -#include "udisk_mgr_service.hpp" using namespace iflytop; using namespace core; @@ -28,9 +28,11 @@ void MainControlService::initialize() { BUILD_AND_REG_SERRVICE(FrontMsgProcesser); BUILD_AND_REG_SERRVICE(DBService); BUILD_AND_REG_SERRVICE(DeviceStateService); + // BUILD_AND_REG_SERRVICE(UDiskMgrService); // + BUILD_AND_REG_SERRVICE(AuditMgrService); BUILD_AND_REG_SERRVICE(DisinfectionLogsService); // Device BUILD_AND_REG_SERRVICE(UartPrinter);