7 changed files with 270 additions and 42 deletions
-
2iflytoplinuxsdk
-
22src/db/db_service.cpp
-
76src/main_control_service.cpp
-
4src/main_control_service.hpp
-
128src/service/data_export_service.cpp
-
60src/service/data_export_service.hpp
-
18src/service/disinfection_ctl_service.cpp
@ -1 +1 @@ |
|||
Subproject commit 19616ea48cf115890ccd01d47c1b1fc277ffbb9b |
|||
Subproject commit 6b330dc02a70689893c404afaf5f567fcee93c42 |
@ -0,0 +1,128 @@ |
|||
#include "data_export_service.hpp"
|
|||
using namespace iflytop; |
|||
|
|||
void DataExportService::loop() { |
|||
ThisThread thisThread; |
|||
while (!thisThread.getExitFlag()) { |
|||
} |
|||
} |
|||
|
|||
void DataExportService::initialize() { GET_TO_SERVICE(m_dbService); } |
|||
|
|||
bool DataExportService::isDetectedUDisk(string& diskpath) { |
|||
/**
|
|||
* @brief 检查/dev/sda是否存在 |
|||
*/ |
|||
// 检查 /dev/sda /dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdf /dev/sdg /dev/sdh 是否存在
|
|||
for (int i = 0; i < 8; i++) { |
|||
string dev = fmt::format("/dev/sd{}", (char)('a' + i)); |
|||
logger->info("check dev: {}", dev); |
|||
if (access(dev.c_str(), F_OK) == 0) { |
|||
m_ismounted = true; |
|||
diskpath = dev; |
|||
return true; |
|||
} |
|||
} |
|||
return false; |
|||
} |
|||
|
|||
bool DataExportService::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; |
|||
} |
|||
} |
|||
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); |
|||
} |
|||
|
|||
#define IF_ERROR_RETURN(x) \
|
|||
if (!x) { \ |
|||
return err::ksys_copy_file_error; \ |
|||
} |
|||
err::error_t DataExportService::exportDisinfectionData() { |
|||
lock_guard<mutex> lock(lock_); |
|||
|
|||
string diskpath; |
|||
if (!isDetectedUDisk(diskpath)) { |
|||
logger->error("no disk detected"); |
|||
return err::kharde_unfound; |
|||
} |
|||
|
|||
logger->info("diskpath: {}", diskpath); |
|||
|
|||
// 创建目录
|
|||
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("cp -rf /app/disinfection_logs /mnt/exportdata/{}disinfection_logs", getTime()))); |
|||
// 卸载目录
|
|||
IF_ERROR_RETURN(dosystem(fmt::format("umount /mnt/exportdata"))); |
|||
// 删除目录
|
|||
IF_ERROR_RETURN(dosystem(fmt::format("rm -rf /mnt/exportdata"))); |
|||
|
|||
return err::ksucc; |
|||
} |
|||
err::error_t DataExportService::exportAuditData() { |
|||
lock_guard<mutex> lock(lock_); |
|||
|
|||
string diskpath; |
|||
if (!isDetectedUDisk(diskpath)) { |
|||
logger->error("no disk detected"); |
|||
return err::kharde_unfound; |
|||
} |
|||
|
|||
logger->info("diskpath: {}", diskpath); |
|||
|
|||
/**
|
|||
* @brief 创建导出文件csv |
|||
*/ |
|||
|
|||
auto records = m_dbService->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; |
|||
} |
|||
|
|||
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("cp -rf {} /mnt/exportdata", filename))); |
|||
// 卸载目录
|
|||
IF_ERROR_RETURN(dosystem(fmt::format("umount /mnt/exportdata"))); |
|||
// 删除目录
|
|||
IF_ERROR_RETURN(dosystem(fmt::format("rm -rf /mnt/exportdata"))); |
|||
return err::ksucc; |
|||
} |
@ -0,0 +1,60 @@ |
|||
//
|
|||
// Created by zwsd
|
|||
//
|
|||
|
|||
#pragma once
|
|||
#include <fstream>
|
|||
#include <iostream>
|
|||
#include <list>
|
|||
#include <map>
|
|||
#include <memory>
|
|||
#include <mutex>
|
|||
#include <set>
|
|||
#include <sstream>
|
|||
#include <string>
|
|||
#include <vector>
|
|||
#include <mutex>
|
|||
|
|||
#include "iflytop/components/zcanreceiver/zcanhost.hpp"
|
|||
#include "iflytop/core/core.hpp"
|
|||
#include "zservice_container/zservice_container.hpp"
|
|||
// lock_guard<mutex> lock(lock_);
|
|||
|
|||
#include <mutex>
|
|||
// std::lock_guard<std::recursive_mutex> lock(lock_);
|
|||
#include "iflytop/core/error/error_code.hpp"
|
|||
//
|
|||
#include "db/db_service.hpp"
|
|||
|
|||
namespace iflytop { |
|||
|
|||
class DataExportService { |
|||
ENABLE_LOGGER(DataExportService); |
|||
|
|||
private: |
|||
bool m_ismounted = false; |
|||
|
|||
unique_ptr<Thread> m_thread; |
|||
shared_ptr<DBService> m_dbService; |
|||
|
|||
mutex lock_; |
|||
|
|||
public: |
|||
DataExportService(/* args */){}; |
|||
~DataExportService(){}; |
|||
|
|||
void initialize(); |
|||
|
|||
bool isDetectedUDisk(string& diskpath); |
|||
void mountDisk(); |
|||
void unmountDisk(); |
|||
|
|||
err::error_t exportDisinfectionData(); |
|||
err::error_t exportAuditData(); |
|||
|
|||
private: |
|||
void loop(); |
|||
bool dosystem(string cmd); |
|||
}; |
|||
|
|||
}; // namespace iflytop
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue