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)
36 storage(std::move(storage_in)),
37 http(std::move(http_in)),
38 package_manager_(PackageManagerFactory::makePackageManager(config.pacman, config.bootloader, storage, http)),
41 events_channel(std::move(events_channel_in)),
42 primary_ecu_serial_{Uptane::EcuSerial::Unknown()} {}
45 std::shared_ptr<HttpInterface> http_in)
52 void addNewSecondary(
const std::shared_ptr<Uptane::SecondaryInterface> &sec);
55 std::pair<bool, Uptane::Target> downloadImage(
const Uptane::Target &target,
59 void sendDeviceData();
61 bool putManifest(
const Json::Value &custom = Json::nullValue);
63 result::Install uptaneInstall(
const std::vector<Uptane::Target> &updates);
65 void campaignAccept(
const std::string &campaign_id);
66 void campaignDecline(
const std::string &campaign_id);
67 void campaignPostpone(
const std::string &campaign_id);
69 bool hasPendingUpdates()
const;
70 bool isInstallCompletionRequired()
const;
71 void completeInstall()
const;
73 Uptane::Target getCurrent()
const {
return package_manager_->getCurrent(); }
75 bool updateImagesMeta();
76 bool checkImagesMetaOffline();
78 TargetStatus VerifyTarget(
const Uptane::Target &target)
const {
return package_manager_->verifyTarget(target); }
81 void addSecondary(
const std::shared_ptr<Uptane::SecondaryInterface> &sec);
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);
96 FRIEND_TEST(
Uptane, AssembleManifestGood);
97 FRIEND_TEST(
Uptane, AssembleManifestBad);
98 FRIEND_TEST(
Uptane, InstallFakeGood);
99 FRIEND_TEST(
Uptane, restoreVerify);
100 FRIEND_TEST(
Uptane, PutManifest);
101 FRIEND_TEST(
Uptane, offlineIteration);
102 FRIEND_TEST(
Uptane, IgnoreUnknownUpdate);
103 FRIEND_TEST(
Uptane, kRejectAllTest);
104 FRIEND_TEST(UptaneCI, ProvisionAndPutManifest);
105 FRIEND_TEST(UptaneCI, CheckKeys);
106 FRIEND_TEST(UptaneKey, Check);
107 FRIEND_TEST(UptaneNetwork, DownloadFailure);
108 FRIEND_TEST(UptaneNetwork, LogConnectivityRestored);
110 FRIEND_TEST(aktualizr_secondary_uptane, credentialsPassing);
114 bool uptaneIteration(std::vector<Uptane::Target> *targets,
unsigned int *ecus_count);
115 bool uptaneOfflineIteration(std::vector<Uptane::Target> *targets,
unsigned int *ecus_count);
117 Json::Value AssembleManifest();
118 std::string secondaryTreehubCredentials()
const;
121 static std::vector<Uptane::Target> findForEcu(
const std::vector<Uptane::Target> &targets,
124 void finalizeAfterReboot();
126 void reportInstalledPackages();
127 void reportNetworkInfo();
128 void reportAktualizrConfiguration();
129 void verifySecondaries();
130 void sendMetadataToEcus(
const std::vector<Uptane::Target> &targets);
133 std::vector<result::Install::EcuReport> sendImagesToEcus(
const std::vector<Uptane::Target> &targets);
135 bool putManifestSimple(
const Json::Value &custom = Json::nullValue);
137 bool getNewTargets(std::vector<Uptane::Target> *new_targets,
unsigned int *ecus_count =
nullptr);
139 bool updateDirectorMeta();
140 bool checkDirectorMetaOffline();
142 std::unique_ptr<Uptane::Target> findTargetInDelegationTree(
const Uptane::Target &target,
bool offline);
143 std::unique_ptr<Uptane::Target> findTargetHelper(
const Uptane::Targets &cur_targets,
144 const Uptane::Target &queried_target,
int level,
bool terminating,
146 void checkAndUpdatePendingSecondaries();
147 const Uptane::EcuSerial &primaryEcuSerial()
const {
return primary_ecu_serial_; }
148 template <
class T,
class... Args>
149 void sendEvent(Args &&... args) {
150 std::shared_ptr<event::BaseEvent>
event = std::make_shared<T>(std::forward<Args>(args)...);
151 if (events_channel) {
152 (*events_channel)(std::move(
event));
154 LOG_INFO <<
"got " <<
event->variant <<
" event";
161 Uptane::ManifestIssuer::Ptr uptane_manifest;
162 std::shared_ptr<INvStorage> storage;
163 std::shared_ptr<HttpInterface> http;
164 std::shared_ptr<PackageManagerInterface> package_manager_;
165 std::shared_ptr<Uptane::Fetcher> uptane_fetcher;
166 std::unique_ptr<ReportQueue> report_queue;
167 Json::Value last_network_info_reported;
168 Json::Value last_hw_info_reported;
169 Uptane::EcuMap hw_ids;
170 std::shared_ptr<event::Channel> events_channel;
171 boost::signals2::scoped_connection conn;
174 std::map<Uptane::EcuSerial, std::shared_ptr<Uptane::SecondaryInterface>> secondaries;
175 std::mutex download_mutex;
182 bool operator()(
const Uptane::Target &in)
const {
return (in.MatchTarget(target)); }
191 bool operator()(
const std::pair<Uptane::EcuSerial, Uptane::HardwareIdentifier> &in)
const {
192 return (in.first == serial);
199 #endif // SOTA_UPTANE_CLIENT_H_