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"
17 #include "libaktualizr/packagemanagerfactory.h"
18 #include "libaktualizr/packagemanagerinterface.h"
20 #include "libaktualizr/secondaryinterface.h"
22 #include "bootloader/bootloader.h"
23 #include "http/httpclient.h"
24 #include "primary/secondary_provider_builder.h"
25 #include "reportqueue.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/manifest.h"
32 #include "uptane/tuf.h"
33 #include "utilities/apiqueue.h"
37 SotaUptaneClient(
Config &config_in, std::shared_ptr<INvStorage> storage_in, std::shared_ptr<HttpInterface> http_in,
38 std::shared_ptr<event::Channel> events_channel_in,
42 storage(std::move(storage_in)),
43 http(std::move(http_in)),
44 package_manager_(PackageManagerFactory::makePackageManager(config.pacman, config.bootloader, storage, http)),
46 events_channel(std::move(events_channel_in)),
47 primary_ecu_serial_(primary_serial),
48 primary_ecu_hw_id_(hwid) {
49 report_queue = std_::make_unique<ReportQueue>(config, http, storage);
50 secondary_provider_ = SecondaryProviderBuilder::Build(config, storage, package_manager_);
54 std::shared_ptr<HttpInterface> http_in)
61 void addSecondary(
const std::shared_ptr<SecondaryInterface> &sec);
64 std::pair<bool, Uptane::Target> downloadImage(
const Uptane::Target &target,
68 void sendDeviceData(
const Json::Value &custom_hwinfo = Json::nullValue);
70 bool putManifest(
const Json::Value &custom = Json::nullValue);
72 result::Install uptaneInstall(
const std::vector<Uptane::Target> &updates);
74 void campaignAccept(
const std::string &campaign_id);
75 void campaignDecline(
const std::string &campaign_id);
76 void campaignPostpone(
const std::string &campaign_id);
78 bool hasPendingUpdates()
const;
79 bool isInstallCompletionRequired()
const;
80 void completeInstall()
const;
82 Uptane::Target getCurrent()
const {
return package_manager_->getCurrent(); }
83 std::vector<Uptane::Target> getStoredTargets()
const {
return package_manager_->getTargetFiles(); }
84 void deleteStoredTarget(
const Uptane::Target &target) { package_manager_->removeTargetFile(target); }
86 auto status = package_manager_->verifyTarget(target);
87 if (status == TargetStatus::kGood) {
88 return package_manager_->openTargetFile(target);
90 throw std::runtime_error(
"Failed to open Target");
94 void updateImageMeta();
95 void checkImageMetaOffline();
97 TargetStatus VerifyTarget(
const Uptane::Target &target)
const {
return package_manager_->verifyTarget(target); }
98 std::string treehubCredentials()
const;
102 FRIEND_TEST(
Aktualizr, DeviceInstallationResult);
103 FRIEND_TEST(
Aktualizr, DeviceInstallationResultMetadata);
104 FRIEND_TEST(
Aktualizr, FullMultipleSecondaries);
106 FRIEND_TEST(
Aktualizr, DownloadWithUpdates);
107 FRIEND_TEST(
Aktualizr, FinalizationFailure);
108 FRIEND_TEST(
Aktualizr, InstallationFailure);
109 FRIEND_TEST(
Aktualizr, AutoRebootAfterUpdate);
111 FRIEND_TEST(
Aktualizr, FullOstreeUpdate);
112 FRIEND_TEST(
Aktualizr, DownloadNonOstreeBin);
115 FRIEND_TEST(
Uptane, AssembleManifestGood);
116 FRIEND_TEST(
Uptane, AssembleManifestBad);
117 FRIEND_TEST(
Uptane, InstallFakeGood);
118 FRIEND_TEST(
Uptane, restoreVerify);
119 FRIEND_TEST(
Uptane, PutManifest);
120 FRIEND_TEST(
Uptane, offlineIteration);
121 FRIEND_TEST(
Uptane, IgnoreUnknownUpdate);
122 FRIEND_TEST(
Uptane, kRejectAllTest);
123 FRIEND_TEST(UptaneCI, ProvisionAndPutManifest);
124 FRIEND_TEST(UptaneCI, CheckKeys);
125 FRIEND_TEST(UptaneKey, Check);
126 FRIEND_TEST(UptaneNetwork, DownloadFailure);
127 FRIEND_TEST(UptaneNetwork, LogConnectivityRestored);
129 FRIEND_TEST(aktualizr_secondary_uptane, credentialsPassing);
130 friend class CheckForUpdate;
131 friend class ProvisionDeviceTask;
133 void uptaneIteration(std::vector<Uptane::Target> *targets,
unsigned int *ecus_count);
134 void uptaneOfflineIteration(std::vector<Uptane::Target> *targets,
unsigned int *ecus_count);
136 Json::Value AssembleManifest();
137 std::exception_ptr getLastException()
const {
return last_exception; }
138 static std::vector<Uptane::Target> findForEcu(
const std::vector<Uptane::Target> &targets,
141 void finalizeAfterReboot();
142 void reportHwInfo(
const Json::Value &custom_hwinfo);
143 void reportInstalledPackages();
144 void reportNetworkInfo();
145 void reportAktualizrConfiguration();
146 bool waitSecondariesReachable(
const std::vector<Uptane::Target> &updates);
150 std::string *raw_installation_report);
152 std::vector<result::Install::EcuReport> sendImagesToEcus(
const std::vector<Uptane::Target> &targets);
154 bool putManifestSimple(
const Json::Value &custom = Json::nullValue);
155 void getNewTargets(std::vector<Uptane::Target> *new_targets,
unsigned int *ecus_count =
nullptr);
156 void updateDirectorMeta();
157 void checkDirectorMetaOffline();
159 std::unique_ptr<Uptane::Target> findTargetInDelegationTree(
const Uptane::Target &target,
bool offline);
160 std::unique_ptr<Uptane::Target> findTargetHelper(
const Uptane::Targets &cur_targets,
161 const Uptane::Target &queried_target,
int level,
bool terminating,
163 void checkAndUpdatePendingSecondaries();
164 const Uptane::EcuSerial &primaryEcuSerial()
const {
return primary_ecu_serial_; }
165 boost::optional<Uptane::HardwareIdentifier> getEcuHwId(
const Uptane::EcuSerial &serial)
const;
167 template <
class T,
class... Args>
168 void sendEvent(Args &&... args) {
169 std::shared_ptr<event::BaseEvent>
event = std::make_shared<T>(std::forward<Args>(args)...);
170 if (events_channel) {
171 (*events_channel)(std::move(
event));
173 LOG_INFO <<
"got " <<
event->variant <<
" event";
180 Uptane::ManifestIssuer::Ptr uptane_manifest;
181 std::shared_ptr<INvStorage> storage;
182 std::shared_ptr<HttpInterface> http;
183 std::shared_ptr<PackageManagerInterface> package_manager_;
184 std::shared_ptr<Uptane::Fetcher> uptane_fetcher;
185 std::unique_ptr<ReportQueue> report_queue;
186 std::shared_ptr<SecondaryProvider> secondary_provider_;
187 std::shared_ptr<event::Channel> events_channel;
188 boost::signals2::scoped_connection conn;
189 std::exception_ptr last_exception;
191 std::map<Uptane::EcuSerial, SecondaryInterface::Ptr> secondaries;
192 std::mutex download_mutex;
200 bool operator()(
const Uptane::Target &in)
const {
return (in.MatchTarget(target)); }
206 #endif // SOTA_UPTANE_CLIENT_H_