5 #include "libaktualizr/aktualizr.h"
8 #include "sotauptaneclient.h"
9 #include "utilities/apiqueue.h"
10 #include "utilities/timer.h"
12 using std::make_shared;
13 using std::shared_ptr;
19 const std::shared_ptr<HttpInterface> &http_in)
20 : config_{std::move(config)}, sig_{
new event::Channel()}, api_queue_(
new api::CommandQueue()) {
21 if (sodium_init() == -1) {
22 throw std::runtime_error(
"Unable to initialize libsodium");
25 storage_ = std::move(storage_in);
26 storage_->importData(config_.import);
28 uptane_client_ = std::make_shared<SotaUptaneClient>(config_, storage_, http_in, sig_);
31 Aktualizr::~Aktualizr() { api_queue_.reset(
nullptr); }
34 uptane_client_->initialize();
40 if (update_result.updates.empty()) {
41 if (update_result.status == result::UpdateStatus::kError) {
49 if (download_result.status != result::DownloadStatus::kSuccess || download_result.updates.empty()) {
50 if (download_result.status != result::DownloadStatus::kNothingToDownload) {
57 Install(download_result.updates).get();
59 if (uptane_client_->isInstallCompletionRequired()) {
62 LOG_INFO <<
"Exiting aktualizr so that pending updates can be applied after reboot";
66 if (!uptane_client_->hasPendingUpdates()) {
76 std::future<void> future = std::async(std::launch::async, [
this, custom_hwinfo]() {
79 std::unique_lock<std::mutex> l(exit_cond_.m);
85 if (exit_cond_.cv.wait_for(l, std::chrono::seconds(config_.uptane.polling_sec),
86 [
this] { return exit_cond_.flag; })) {
90 uptane_client_->completeInstall();
97 std::lock_guard<std::mutex> g(exit_cond_.m);
98 exit_cond_.flag =
true;
100 exit_cond_.cv.notify_all();
104 uptane_client_->addSecondary(secondary);
108 storage_->saveSecondaryData(ecu,
data);
112 std::vector<SecondaryInfo> info;
113 storage_->loadSecondariesInfo(&info);
120 return api_queue_->enqueue(task);
124 std::function<void()> task([
this, campaign_id, cmd] {
126 case campaign::Cmd::Accept:
127 uptane_client_->campaignAccept(campaign_id);
129 case campaign::Cmd::Decline:
130 uptane_client_->campaignDecline(campaign_id);
132 case campaign::Cmd::Postpone:
133 uptane_client_->campaignPostpone(campaign_id);
139 return api_queue_->enqueue(task);
143 std::function<void()> task([
this, custom_hwinfo] { uptane_client_->sendDeviceData(custom_hwinfo); });
144 return api_queue_->enqueue(task);
149 return api_queue_->enqueue(task);
154 [
this, updates](
const api::FlowControlToken *token) {
return uptane_client_->downloadImages(updates, token); });
155 return api_queue_->enqueue(task);
159 std::function<
result::Install()> task([
this, updates] {
return uptane_client_->uptaneInstall(updates); });
160 return api_queue_->enqueue(task);
164 return storage_->storeDeviceInstallationRawReport(custom_raw_report);
168 std::function<bool()> task([
this, custom]() {
return uptane_client_->putManifest(custom); });
169 return api_queue_->enqueue(task);
173 if (api_queue_->pause(
true)) {
174 uptane_client_->reportPause();
175 return result::PauseStatus::kSuccess;
177 return result::PauseStatus::kAlreadyPaused;
182 if (api_queue_->pause(
false)) {
183 uptane_client_->reportResume();
184 return result::PauseStatus::kSuccess;
186 return result::PauseStatus::kAlreadyRunning;
193 const std::function<
void(shared_ptr<event::BaseEvent>)> &handler) {
194 return sig_->connect(handler);
198 std::vector<Aktualizr::InstallationLogEntry> ilog;
201 if (!storage_->loadEcuSerials(&serials)) {
202 throw std::runtime_error(
"Could not load ECU serials");
205 ilog.reserve(serials.size());
206 for (
const auto &s : serials) {
208 std::vector<Uptane::Target> installs;
210 std::vector<Uptane::Target> log;
211 storage_->loadInstallationLog(serial.ToString(), &log,
true);
224 return uptane_client_->openStoredTarget(target);