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 "bootloader/bootloader.h"
15 #include "campaign/campaign.h"
16 #include "config/config.h"
17 #include "http/httpclient.h"
18 #include "package_manager/packagemanagerfactory.h"
19 #include "package_manager/packagemanagerinterface.h"
22 #include "reportqueue.h"
23 #include "storage/invstorage.h"
24 #include "uptane/directorrepository.h"
25 #include "uptane/exceptions.h"
26 #include "uptane/fetcher.h"
27 #include "uptane/imagesrepository.h"
28 #include "uptane/iterator.h"
29 #include "uptane/secondaryinterface.h"
33 SotaUptaneClient(
Config &config_in, std::shared_ptr<INvStorage> storage_in, std::shared_ptr<HttpInterface> http_in,
34 std::shared_ptr<event::Channel> events_channel_in,
38 storage(std::move(storage_in)),
39 http(std::move(http_in)),
40 package_manager_(PackageManagerFactory::makePackageManager(config.pacman, config.bootloader, storage, http)),
43 events_channel(std::move(events_channel_in)),
44 primary_ecu_serial_(primary_serial),
45 primary_ecu_hw_id_(hwid) {}
48 std::shared_ptr<HttpInterface> http_in)
55 void addSecondary(
const std::shared_ptr<Uptane::SecondaryInterface> &sec);
58 std::pair<bool, Uptane::Target> downloadImage(
const Uptane::Target &target,
62 void sendDeviceData();
64 bool putManifest(
const Json::Value &custom = Json::nullValue);
66 result::Install uptaneInstall(
const std::vector<Uptane::Target> &updates);
68 void campaignAccept(
const std::string &campaign_id);
69 void campaignDecline(
const std::string &campaign_id);
70 void campaignPostpone(
const std::string &campaign_id);
72 bool hasPendingUpdates()
const;
73 bool isInstallCompletionRequired()
const;
74 void completeInstall()
const;
76 Uptane::Target getCurrent()
const {
return package_manager_->getCurrent(); }
78 bool updateImagesMeta();
79 bool checkImagesMetaOffline();
81 TargetStatus VerifyTarget(
const Uptane::Target &target)
const {
return package_manager_->verifyTarget(target); }
85 FRIEND_TEST(
Aktualizr, DeviceInstallationResult);
86 FRIEND_TEST(
Aktualizr, FullMultipleSecondaries);
88 FRIEND_TEST(
Aktualizr, DownloadWithUpdates);
89 FRIEND_TEST(
Aktualizr, FinalizationFailure);
90 FRIEND_TEST(
Aktualizr, InstallationFailure);
91 FRIEND_TEST(
Aktualizr, AutoRebootAfterUpdate);
94 FRIEND_TEST(
Aktualizr, DownloadNonOstreeBin);
97 FRIEND_TEST(
Uptane, AssembleManifestGood);
98 FRIEND_TEST(
Uptane, AssembleManifestBad);
99 FRIEND_TEST(
Uptane, InstallFakeGood);
100 FRIEND_TEST(
Uptane, restoreVerify);
101 FRIEND_TEST(
Uptane, PutManifest);
102 FRIEND_TEST(
Uptane, offlineIteration);
103 FRIEND_TEST(
Uptane, IgnoreUnknownUpdate);
104 FRIEND_TEST(
Uptane, kRejectAllTest);
105 FRIEND_TEST(UptaneCI, ProvisionAndPutManifest);
106 FRIEND_TEST(UptaneCI, CheckKeys);
107 FRIEND_TEST(UptaneKey, Check);
108 FRIEND_TEST(UptaneNetwork, DownloadFailure);
109 FRIEND_TEST(UptaneNetwork, LogConnectivityRestored);
111 FRIEND_TEST(aktualizr_secondary_uptane, credentialsPassing);
115 bool uptaneIteration(std::vector<Uptane::Target> *targets,
unsigned int *ecus_count);
116 bool uptaneOfflineIteration(std::vector<Uptane::Target> *targets,
unsigned int *ecus_count);
118 Json::Value AssembleManifest();
119 std::string secondaryTreehubCredentials()
const;
122 static std::vector<Uptane::Target> findForEcu(
const std::vector<Uptane::Target> &targets,
125 void finalizeAfterReboot();
127 void reportInstalledPackages();
128 void reportNetworkInfo();
129 void reportAktualizrConfiguration();
130 void verifySecondaries();
131 bool waitSecondariesReachable(
const std::vector<Uptane::Target> &updates);
132 void sendMetadataToEcus(
const std::vector<Uptane::Target> &targets);
135 std::vector<result::Install::EcuReport> sendImagesToEcus(
const std::vector<Uptane::Target> &targets);
137 bool putManifestSimple(
const Json::Value &custom = Json::nullValue);
139 bool getNewTargets(std::vector<Uptane::Target> *new_targets,
unsigned int *ecus_count =
nullptr);
141 bool updateDirectorMeta();
142 bool checkDirectorMetaOffline();
144 std::unique_ptr<Uptane::Target> findTargetInDelegationTree(
const Uptane::Target &target,
bool offline);
145 std::unique_ptr<Uptane::Target> findTargetHelper(
const Uptane::Targets &cur_targets,
146 const Uptane::Target &queried_target,
int level,
bool terminating,
148 void checkAndUpdatePendingSecondaries();
149 const Uptane::EcuSerial &primaryEcuSerial()
const {
return primary_ecu_serial_; }
150 boost::optional<Uptane::HardwareIdentifier> ecuHwId(
const Uptane::EcuSerial &serial)
const;
152 template <
class T,
class... Args>
153 void sendEvent(Args &&... args) {
154 std::shared_ptr<event::BaseEvent>
event = std::make_shared<T>(std::forward<Args>(args)...);
155 if (events_channel) {
156 (*events_channel)(std::move(
event));
158 LOG_INFO <<
"got " <<
event->variant <<
" event";
165 Uptane::ManifestIssuer::Ptr uptane_manifest;
166 std::shared_ptr<INvStorage> storage;
167 std::shared_ptr<HttpInterface> http;
168 std::shared_ptr<PackageManagerInterface> package_manager_;
169 std::shared_ptr<Uptane::Fetcher> uptane_fetcher;
170 std::unique_ptr<ReportQueue> report_queue;
171 Json::Value last_network_info_reported;
172 Json::Value last_hw_info_reported;
173 std::shared_ptr<event::Channel> events_channel;
174 boost::signals2::scoped_connection conn;
177 std::map<Uptane::EcuSerial, Uptane::SecondaryInterface::Ptr> secondaries;
178 std::mutex download_mutex;
186 bool operator()(
const Uptane::Target &in)
const {
return (in.MatchTarget(target)); }
195 bool operator()(
const std::pair<Uptane::EcuSerial, Uptane::HardwareIdentifier> &in)
const {
196 return (in.first == serial);
203 #endif // SOTA_UPTANE_CLIENT_H_