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  LOG_INFO << "Receiving target image data from Primary: " << size;
43  return update_agent_->receiveData(pendingTarget(), data, size);
44 }
45 
46 bool AktualizrSecondaryFile::isTargetSupported(const Uptane::Target& target) const {
47  return update_agent_->isTargetSupported(target);
48 }
49 
50 data::InstallationResult AktualizrSecondaryFile::applyPendingInstall(const Uptane::Target& target) {
51  return update_agent_->applyPendingInstall(target);
52 }
53 
54 bool AktualizrSecondaryFile::getInstalledImageInfo(Uptane::InstalledImageInfo& installed_image_info) const {
55  return update_agent_->getInstalledImageInfo(installed_image_info);
56 }
57 
58 data::InstallationResult AktualizrSecondaryFile::installPendingTarget(const Uptane::Target& target) {
59  return update_agent_->install(target);
60 }
61 
62 void AktualizrSecondaryFile::completeInstall() { return update_agent_->completeInstall(); }
63 
64 MsgHandler::ReturnCode AktualizrSecondaryFile::uploadDataHdlr(Asn1Message& in_msg, Asn1Message& out_msg) {
65  LOG_INFO << "Handling upload data request from Primary";
66 
67  auto rec_buf_size = in_msg.uploadDataReq()->data.size;
68  if (rec_buf_size < 0) {
69  LOG_ERROR << "The received data buffer size is negative: " << rec_buf_size;
70  return ReturnCode::kOk;
71  }
72 
73  auto result = receiveData(in_msg.uploadDataReq()->data.buf, static_cast<size_t>(rec_buf_size));
74 
75  auto m = out_msg.present(AKIpUptaneMes_PR_uploadDataResp).uploadDataResp();
76  m->result = static_cast<AKInstallationResultCode_t>(result.result_code.num_code);
77  SetString(&m->description, result.description);
78 
79  return ReturnCode::kOk;
80 }
General data structures.
Definition: types.h:215
STL namespace.
Reference counted holder for the top-level ASN1 message structure.
Definition: asn1_message.h:34
Results of libaktualizr API calls.
Definition: results.h:12