1 #include "reportqueue.h"
5 ReportQueue::ReportQueue(
const Config& config_in, std::shared_ptr<HttpInterface> http_client,
6 std::shared_ptr<INvStorage> storage_in)
7 : config(config_in), http(std::move(http_client)), storage(std::move(storage_in)) {
8 thread_ = std::thread(std::bind(&ReportQueue::run,
this));
11 ReportQueue::~ReportQueue() {
13 std::lock_guard<std::mutex> lock(m_);
19 LOG_TRACE <<
"Flushing report queue";
23 void ReportQueue::run() {
27 std::unique_lock<std::mutex> lock(m_);
30 cv_.wait_for(lock, std::chrono::seconds(10));
34 void ReportQueue::enqueue(std::unique_ptr<ReportEvent>
event) {
36 std::lock_guard<std::mutex> lock(m_);
37 storage->saveReportEvent(
event->toJson());
42 void ReportQueue::flushQueue() {
44 Json::Value report_array{Json::arrayValue};
45 storage->loadReportEvents(&report_array, &max_id);
47 if (config.tls.server.empty()) {
49 LOG_TRACE <<
"No server specified. Clearing report queue.";
53 if (!report_array.empty()) {
54 HttpResponse response = http->post(config.tls.server +
"/events", report_array);
58 if (response.http_status_code == 404) {
59 LOG_TRACE <<
"Server does not support event reports. Clearing report queue.";
62 if (response.isOk() || response.http_status_code == 404) {
64 storage->deleteReportEvents(max_id);
69 void ReportEvent::setEcu(
const Uptane::EcuSerial& ecu) { custom[
"ecu"] = ecu.ToString(); }
70 void ReportEvent::setCorrelationId(
const std::string& correlation_id) {
71 if (!correlation_id.empty()) {
72 custom[
"correlationId"] = correlation_id;
76 Json::Value ReportEvent::toJson()
const {
80 out[
"deviceTime"] = timestamp.ToString();
81 out[
"eventType"][
"id"] = type;
82 out[
"eventType"][
"version"] = version;
83 out[
"event"] = custom;
88 CampaignAcceptedReport::CampaignAcceptedReport(
const std::string& campaign_id) :
ReportEvent(
"campaign_accepted", 0) {
89 custom[
"campaignId"] = campaign_id;
92 CampaignDeclinedReport::CampaignDeclinedReport(
const std::string& campaign_id) :
ReportEvent(
"campaign_declined", 0) {
93 custom[
"campaignId"] = campaign_id;
96 CampaignPostponedReport::CampaignPostponedReport(
const std::string& campaign_id)
98 custom[
"campaignId"] = campaign_id;
101 DevicePausedReport::DevicePausedReport(
const std::string& correlation_id) :
ReportEvent(
"DevicePaused", 0) {
102 setCorrelationId(correlation_id);
105 DeviceResumedReport::DeviceResumedReport(
const std::string& correlation_id) :
ReportEvent(
"DeviceResumed", 0) {
106 setCorrelationId(correlation_id);
109 EcuDownloadStartedReport::EcuDownloadStartedReport(
const Uptane::EcuSerial& ecu,
const std::string& correlation_id)
112 setCorrelationId(correlation_id);
115 EcuDownloadCompletedReport::EcuDownloadCompletedReport(
const Uptane::EcuSerial& ecu,
const std::string& correlation_id,
119 setCorrelationId(correlation_id);
120 custom[
"success"] = success;
123 EcuInstallationStartedReport::EcuInstallationStartedReport(
const Uptane::EcuSerial& ecu,
124 const std::string& correlation_id)
127 setCorrelationId(correlation_id);
130 EcuInstallationAppliedReport::EcuInstallationAppliedReport(
const Uptane::EcuSerial& ecu,
131 const std::string& correlation_id)
134 setCorrelationId(correlation_id);
137 EcuInstallationCompletedReport::EcuInstallationCompletedReport(
const Uptane::EcuSerial& ecu,
138 const std::string& correlation_id,
bool success)
141 setCorrelationId(correlation_id);
142 custom[
"success"] = success;