Aktualizr
C++ SOTA Client
All Classes Namespaces Files Functions Variables Enumerations Enumerator Pages
aktualizr_secondary_file.cc
1 #include "aktualizr_secondary_file.h"
2 #include "update_agent_file.h"
3 
4 const std::string AktualizrSecondaryFile::FileUpdateDefaultFile{"firmware.txt"};
5 
6 AktualizrSecondaryFile::AktualizrSecondaryFile(const AktualizrSecondaryConfig& config)
7  : AktualizrSecondaryFile(config, INvStorage::newStorage(config.storage)) {}
8 
9 AktualizrSecondaryFile::AktualizrSecondaryFile(const AktualizrSecondaryConfig& config,
10  std::shared_ptr<INvStorage> storage,
11  std::shared_ptr<FileUpdateAgent> update_agent)
12  : AktualizrSecondary(config, std::move(storage)), update_agent_{std::move(update_agent)} {
13  registerHandler(AKIpUptaneMes_PR_uploadDataReq, std::bind(&AktualizrSecondaryFile::uploadDataHdlr, this,
14  std::placeholders::_1, std::placeholders::_2));
15  if (!update_agent_) {
16  std::string current_target_name;
17 
18  boost::optional<Uptane::Target> current_version;
19  boost::optional<Uptane::Target> pending_version;
20  auto installed_version_res =
21  AktualizrSecondary::storage().loadInstalledVersions("", &current_version, &pending_version);
22 
23  if (installed_version_res && !!current_version) {
24  current_target_name = current_version->filename();
25  } else {
26  current_target_name = "unknown";
27  }
28 
29  update_agent_ = std::make_shared<FileUpdateAgent>(config.storage.path / FileUpdateDefaultFile, current_target_name);
30  }
31 }
32 
33 void AktualizrSecondaryFile::initialize() { initPendingTargetIfAny(); }
34 
35 data::InstallationResult AktualizrSecondaryFile::receiveData(const uint8_t* data, size_t size) {
36  if (!pendingTarget().IsValid()) {
37  LOG_ERROR << "Aborting image download; no valid target found.";
39  "Aborting image download; no valid target found.");
40  }
41 
42  return update_agent_->receiveData(pendingTarget(), data, size);
43 }
44 
45 bool AktualizrSecondaryFile::isTargetSupported(const Uptane::Target& target) const {
46  return update_agent_->isTargetSupported(target);
47 }
48 
49 data::InstallationResult AktualizrSecondaryFile::applyPendingInstall(const Uptane::Target& target) {
50  return update_agent_->applyPendingInstall(target);
51 }
52 
53 bool AktualizrSecondaryFile::getInstalledImageInfo(Uptane::InstalledImageInfo& installed_image_info) const {
54  return update_agent_->getInstalledImageInfo(installed_image_info);
55 }
56 
57 data::InstallationResult AktualizrSecondaryFile::installPendingTarget(const Uptane::Target& target) {
58  return update_agent_->install(target);
59 }
60 
61 void AktualizrSecondaryFile::completeInstall() { return update_agent_->completeInstall(); }
62 
63 MsgHandler::ReturnCode AktualizrSecondaryFile::uploadDataHdlr(Asn1Message& in_msg, Asn1Message& out_msg) {
64  if (last_msg_ != AKIpUptaneMes_PR_uploadDataReq) {
65  LOG_INFO << "Received an initial data upload request message; attempting to receive data...";
66  } else {
67  LOG_DEBUG << "Received another data upload request message; attempting to receive data...";
68  }
69 
70  auto rec_buf_size = in_msg.uploadDataReq()->data.size;
71  if (rec_buf_size < 0) {
72  LOG_ERROR << "The received data buffer size is negative: " << rec_buf_size;
73  return ReturnCode::kOk;
74  }
75 
76  auto result = receiveData(in_msg.uploadDataReq()->data.buf, static_cast<size_t>(rec_buf_size));
77 
78  auto m = out_msg.present(AKIpUptaneMes_PR_uploadDataResp).uploadDataResp();
79  m->result = static_cast<AKInstallationResultCode_t>(result.result_code.num_code);
80  SetString(&m->description, result.description);
81 
82  return ReturnCode::kOk;
83 }
data::ResultCode::Numeric::kGeneralError
@ kGeneralError
Other error.
data::InstallationResult
Definition: types.h:277
AktualizrSecondaryConfig
Definition: aktualizr_secondary_config.h:35
data
General data structures.
Definition: types.h:217
Uptane::InstalledImageInfo
Definition: types.h:306
AktualizrSecondary
Definition: aktualizr_secondary.h:16
result
Results of libaktualizr API calls.
Definition: results.h:12
Asn1Message
Reference counted holder for the top-level ASN1 message structure.
Definition: asn1_message.h:34
Uptane::Target
Definition: types.h:379
AktualizrSecondaryFile
Definition: aktualizr_secondary_file.h:10
INvStorage
Definition: invstorage.h:43