1 #include "aktualizr_secondary_ostree.h"
2 #include "package_manager/ostreemanager.h"
3 #include "update_agent_ostree.h"
9 const std::shared_ptr<INvStorage>& storage)
11 registerHandler(AKIpUptaneMes_PR_downloadOstreeRevReq, std::bind(&AktualizrSecondaryOstree::downloadOstreeRev,
this,
12 std::placeholders::_1, std::placeholders::_2));
14 std::shared_ptr<OstreeManager> pack_man =
15 std::make_shared<OstreeManager>(config.pacman, config.bootloader, AktualizrSecondary::storagePtr(),
nullptr);
17 std::make_shared<OstreeUpdateAgent>(config.pacman.sysroot, keyMngr(), pack_man, config.uptane.ecu_hardware_id);
20 void AktualizrSecondaryOstree::initialize() {
21 initPendingTargetIfAny();
23 if (hasPendingUpdate()) {
24 LOG_INFO <<
"Found a pending target to be applied.";
27 std::vector<Uptane::Target> installed_versions;
28 boost::optional<Uptane::Target> pending_target;
29 AktualizrSecondary::storage().loadInstalledVersions(serial().ToString(),
nullptr, &pending_target);
31 if (!!pending_target) {
34 LOG_INFO <<
"Pending update found; attempting to apply it. Target hash: " << pending_target->sha256Hash();
36 install_res = applyPendingInstall(*pending_target);
38 if (install_res.result_code != data::ResultCode::Numeric::kNeedCompletion) {
39 AktualizrSecondary::storage().saveEcuInstallationResult(serial(), install_res);
41 if (install_res.isSuccess()) {
42 LOG_INFO <<
"Pending update has been successfully applied: " << pending_target->sha256Hash();
43 AktualizrSecondary::storage().saveInstalledVersion(serial().ToString(), *pending_target,
44 InstalledVersionUpdateMode::kCurrent);
46 LOG_ERROR <<
"Application of the pending update has failed: (" << install_res.result_code.toString() <<
")"
47 << install_res.description;
48 AktualizrSecondary::storage().saveInstalledVersion(serial().ToString(), *pending_target,
49 InstalledVersionUpdateMode::kNone);
52 directorRepo().dropTargets(AktualizrSecondary::storage());
54 LOG_INFO <<
"Pending update hasn't been applied because a reboot hasn't been detected";
60 MsgHandler::ReturnCode AktualizrSecondaryOstree::downloadOstreeRev(
Asn1Message& in_msg,
Asn1Message& out_msg) {
61 LOG_INFO <<
"Received an OSTree download request; attempting download...";
62 auto result = downloadOstreeUpdate(ToString(in_msg.downloadOstreeRevReq()->tlsCred));
64 auto m = out_msg.present(AKIpUptaneMes_PR_downloadOstreeRevResp).downloadOstreeRevResp();
65 m->result =
static_cast<AKInstallationResultCode_t
>(
result.result_code.num_code);
66 SetString(&m->description,
result.description);
68 return ReturnCode::kOk;
72 if (!pendingTarget().IsValid()) {
73 LOG_ERROR <<
"Aborting image download; no valid target found.";
75 "Aborting image download; no valid target found.");
78 auto result = update_agent_->downloadTargetRev(pendingTarget(), packed_tls_creds);
80 pendingTarget() = Uptane::Target::Unknown();
85 bool AktualizrSecondaryOstree::isTargetSupported(
const Uptane::Target& target)
const {
86 return update_agent_->isTargetSupported(target);
90 return update_agent_->applyPendingInstall(target);
94 return update_agent_->getInstalledImageInfo(installed_image_info);
98 return update_agent_->install(target);
101 void AktualizrSecondaryOstree::completeInstall() {
return update_agent_->completeInstall(); }