1 #ifndef SOTA_UPTANE_CLIENT_H_ 2 #define SOTA_UPTANE_CLIENT_H_ 10 #include <boost/signals2.hpp> 11 #include "gtest/gtest_prod.h" 12 #include "json/json.h" 14 #include "libaktualizr/campaign.h" 15 #include "libaktualizr/config.h" 19 #include "bootloader/bootloader.h" 20 #include "http/httpclient.h" 21 #include "package_manager/packagemanagerfactory.h" 22 #include "package_manager/packagemanagerinterface.h" 23 #include "primary/secondaryinterface.h" 24 #include "reportqueue.h" 25 #include "storage/invstorage.h" 26 #include "uptane/directorrepository.h" 27 #include "uptane/exceptions.h" 28 #include "uptane/fetcher.h" 29 #include "uptane/imagerepository.h" 30 #include "uptane/iterator.h" 31 #include "uptane/tuf.h" 35 SotaUptaneClient(
Config &config_in, std::shared_ptr<INvStorage> storage_in, std::shared_ptr<HttpInterface> http_in,
36 std::shared_ptr<event::Channel> events_channel_in,
40 storage(std::move(storage_in)),
41 http(std::move(http_in)),
42 package_manager_(PackageManagerFactory::makePackageManager(config.pacman, config.bootloader, storage, http)),
44 events_channel(std::move(events_channel_in)),
45 primary_ecu_serial_(primary_serial),
46 primary_ecu_hw_id_(hwid) {
47 report_queue = std_::make_unique<ReportQueue>(config, http, storage);
48 secondary_provider_ = std::make_shared<SecondaryProvider>(config, storage, package_manager_);
52 std::shared_ptr<HttpInterface> http_in)
53 : SotaUptaneClient(config_in, storage_in, std::move(http_in),
nullptr) {}
55 SotaUptaneClient(
Config &config_in,
const std::shared_ptr<INvStorage> &storage_in)
56 : SotaUptaneClient(config_in, storage_in, std::make_shared<HttpClient>()) {}
59 void addSecondary(
const std::shared_ptr<SecondaryInterface> &sec);
62 std::pair<bool, Uptane::Target> downloadImage(
const Uptane::Target &target,
66 void sendDeviceData(
const Json::Value &custom_hwinfo = Json::nullValue);
68 bool putManifest(
const Json::Value &custom = Json::nullValue);
70 result::Install uptaneInstall(
const std::vector<Uptane::Target> &updates);
72 void campaignAccept(
const std::string &campaign_id);
73 void campaignDecline(
const std::string &campaign_id);
74 void campaignPostpone(
const std::string &campaign_id);
76 bool hasPendingUpdates()
const;
77 bool isInstallCompletionRequired()
const;
78 void completeInstall()
const;
80 Uptane::Target getCurrent()
const {
return package_manager_->getCurrent(); }
81 std::vector<Uptane::Target> getStoredTargets()
const {
return package_manager_->getTargetFiles(); }
82 void deleteStoredTarget(
const Uptane::Target &target) { package_manager_->removeTargetFile(target); }
84 auto status = package_manager_->verifyTarget(target);
85 if (status == TargetStatus::kGood) {
86 return package_manager_->openTargetFile(target);
88 throw std::runtime_error(
"Failed to open Target");
92 void updateImageMeta();
93 void checkImageMetaOffline();
95 TargetStatus VerifyTarget(
const Uptane::Target &target)
const {
return package_manager_->verifyTarget(target); }
96 std::string treehubCredentials()
const;
100 FRIEND_TEST(
Aktualizr, DeviceInstallationResult);
101 FRIEND_TEST(
Aktualizr, DeviceInstallationResultMetadata);
102 FRIEND_TEST(
Aktualizr, FullMultipleSecondaries);
104 FRIEND_TEST(
Aktualizr, DownloadWithUpdates);
105 FRIEND_TEST(
Aktualizr, FinalizationFailure);
106 FRIEND_TEST(
Aktualizr, InstallationFailure);
107 FRIEND_TEST(
Aktualizr, AutoRebootAfterUpdate);
109 FRIEND_TEST(
Aktualizr, FullOstreeUpdate);
110 FRIEND_TEST(
Aktualizr, DownloadNonOstreeBin);
113 FRIEND_TEST(
Uptane, AssembleManifestGood);
114 FRIEND_TEST(
Uptane, AssembleManifestBad);
115 FRIEND_TEST(
Uptane, InstallFakeGood);
116 FRIEND_TEST(
Uptane, restoreVerify);
117 FRIEND_TEST(
Uptane, PutManifest);
118 FRIEND_TEST(
Uptane, offlineIteration);
119 FRIEND_TEST(
Uptane, IgnoreUnknownUpdate);
120 FRIEND_TEST(
Uptane, kRejectAllTest);
121 FRIEND_TEST(UptaneCI, ProvisionAndPutManifest);
122 FRIEND_TEST(UptaneCI, CheckKeys);
123 FRIEND_TEST(UptaneKey, Check);
124 FRIEND_TEST(UptaneNetwork, DownloadFailure);
125 FRIEND_TEST(UptaneNetwork, LogConnectivityRestored);
127 FRIEND_TEST(aktualizr_secondary_uptane, credentialsPassing);
128 friend class CheckForUpdate;
129 friend class ProvisionDeviceTask;
131 void uptaneIteration(std::vector<Uptane::Target> *targets,
unsigned int *ecus_count);
132 void uptaneOfflineIteration(std::vector<Uptane::Target> *targets,
unsigned int *ecus_count);
134 Json::Value AssembleManifest();
135 std::exception_ptr getLastException()
const {
return last_exception; }
136 static std::vector<Uptane::Target> findForEcu(
const std::vector<Uptane::Target> &targets,
139 void finalizeAfterReboot();
140 void reportHwInfo(
const Json::Value &custom_hwinfo);
141 void reportInstalledPackages();
142 void reportNetworkInfo();
143 void reportAktualizrConfiguration();
144 bool waitSecondariesReachable(
const std::vector<Uptane::Target> &updates);
148 std::string *raw_installation_report);
150 std::vector<result::Install::EcuReport> sendImagesToEcus(
const std::vector<Uptane::Target> &targets);
152 bool putManifestSimple(
const Json::Value &custom = Json::nullValue);
153 void getNewTargets(std::vector<Uptane::Target> *new_targets,
unsigned int *ecus_count =
nullptr);
154 void updateDirectorMeta();
155 void checkDirectorMetaOffline();
157 std::unique_ptr<Uptane::Target> findTargetInDelegationTree(
const Uptane::Target &target,
bool offline);
158 std::unique_ptr<Uptane::Target> findTargetHelper(
const Uptane::Targets &cur_targets,
159 const Uptane::Target &queried_target,
int level,
bool terminating,
161 void checkAndUpdatePendingSecondaries();
162 const Uptane::EcuSerial &primaryEcuSerial()
const {
return primary_ecu_serial_; }
163 boost::optional<Uptane::HardwareIdentifier> getEcuHwId(
const Uptane::EcuSerial &serial)
const;
165 template <
class T,
class... Args>
166 void sendEvent(Args &&... args) {
167 std::shared_ptr<event::BaseEvent>
event = std::make_shared<T>(std::forward<Args>(args)...);
168 if (events_channel) {
169 (*events_channel)(std::move(
event));
171 LOG_INFO <<
"got " <<
event->variant <<
" event";
178 Uptane::ManifestIssuer::Ptr uptane_manifest;
179 std::shared_ptr<INvStorage> storage;
180 std::shared_ptr<HttpInterface> http;
181 std::shared_ptr<PackageManagerInterface> package_manager_;
182 std::shared_ptr<Uptane::Fetcher> uptane_fetcher;
183 std::unique_ptr<ReportQueue> report_queue;
184 std::shared_ptr<SecondaryProvider> secondary_provider_;
185 std::shared_ptr<event::Channel> events_channel;
186 boost::signals2::scoped_connection conn;
187 std::exception_ptr last_exception;
189 std::map<Uptane::EcuSerial, SecondaryInterface::Ptr> secondaries;
190 std::mutex download_mutex;
198 bool operator()(
const Uptane::Target &in)
const {
return (in.MatchTarget(target)); }
204 #endif // SOTA_UPTANE_CLIENT_H_
Provides a thread-safe way to pause and terminate task execution.
Container for information about downloading an update.
A report for a download in progress.
Container for information about available campaigns.
UpdateStatus
Status of an update.
Configuration object for an aktualizr instance running on a Primary ECU.
Container for information about installing an update.
Container for information about available updates.
Results of libaktualizr API calls.
Base data types that are used in The Update Framework (TUF), part of Uptane.
This class provides the main APIs necessary for launching and controlling libaktualizr.