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/imagerepository.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)),
42 events_channel(std::move(events_channel_in)),
43 primary_ecu_serial_(primary_serial),
44 primary_ecu_hw_id_(hwid) {
45 report_queue = std_::make_unique<ReportQueue>(config, http, storage);
49 std::shared_ptr<HttpInterface> http_in)
56 void addSecondary(
const std::shared_ptr<Uptane::SecondaryInterface> &sec);
59 std::pair<bool, Uptane::Target> downloadImage(
const Uptane::Target &target,
63 void sendDeviceData();
65 bool putManifest(
const Json::Value &custom = Json::nullValue);
67 result::Install uptaneInstall(
const std::vector<Uptane::Target> &updates);
69 void campaignAccept(
const std::string &campaign_id);
70 void campaignDecline(
const std::string &campaign_id);
71 void campaignPostpone(
const std::string &campaign_id);
73 bool hasPendingUpdates()
const;
74 bool isInstallCompletionRequired()
const;
75 void completeInstall()
const;
77 Uptane::Target getCurrent()
const {
return package_manager_->getCurrent(); }
79 bool updateImageMeta();
80 bool checkImageMetaOffline();
82 TargetStatus VerifyTarget(
const Uptane::Target &target)
const {
return package_manager_->verifyTarget(target); }
86 FRIEND_TEST(
Aktualizr, DeviceInstallationResult);
87 FRIEND_TEST(
Aktualizr, FullMultipleSecondaries);
89 FRIEND_TEST(
Aktualizr, DownloadWithUpdates);
90 FRIEND_TEST(
Aktualizr, FinalizationFailure);
91 FRIEND_TEST(
Aktualizr, InstallationFailure);
92 FRIEND_TEST(
Aktualizr, AutoRebootAfterUpdate);
95 FRIEND_TEST(
Aktualizr, DownloadNonOstreeBin);
98 FRIEND_TEST(
Uptane, AssembleManifestGood);
99 FRIEND_TEST(
Uptane, AssembleManifestBad);
100 FRIEND_TEST(
Uptane, InstallFakeGood);
101 FRIEND_TEST(
Uptane, restoreVerify);
102 FRIEND_TEST(
Uptane, PutManifest);
103 FRIEND_TEST(
Uptane, offlineIteration);
104 FRIEND_TEST(
Uptane, IgnoreUnknownUpdate);
105 FRIEND_TEST(
Uptane, kRejectAllTest);
106 FRIEND_TEST(UptaneCI, ProvisionAndPutManifest);
107 FRIEND_TEST(UptaneCI, CheckKeys);
108 FRIEND_TEST(UptaneKey, Check);
109 FRIEND_TEST(UptaneNetwork, DownloadFailure);
110 FRIEND_TEST(UptaneNetwork, LogConnectivityRestored);
112 FRIEND_TEST(aktualizr_secondary_uptane, credentialsPassing);
116 bool uptaneIteration(std::vector<Uptane::Target> *targets,
unsigned int *ecus_count);
117 bool uptaneOfflineIteration(std::vector<Uptane::Target> *targets,
unsigned int *ecus_count);
119 Json::Value AssembleManifest();
120 std::string secondaryTreehubCredentials()
const;
123 static std::vector<Uptane::Target> findForEcu(
const std::vector<Uptane::Target> &targets,
126 void finalizeAfterReboot();
128 void reportInstalledPackages();
129 void reportNetworkInfo();
130 void reportAktualizrConfiguration();
131 void verifySecondaries();
132 bool waitSecondariesReachable(
const std::vector<Uptane::Target> &updates);
133 bool sendMetadataToEcus(
const std::vector<Uptane::Target> &targets);
136 std::vector<result::Install::EcuReport> sendImagesToEcus(
const std::vector<Uptane::Target> &targets);
138 bool putManifestSimple(
const Json::Value &custom = Json::nullValue);
140 bool getNewTargets(std::vector<Uptane::Target> *new_targets,
unsigned int *ecus_count =
nullptr);
142 bool updateDirectorMeta();
143 bool checkDirectorMetaOffline();
145 std::unique_ptr<Uptane::Target> findTargetInDelegationTree(
const Uptane::Target &target,
bool offline);
146 std::unique_ptr<Uptane::Target> findTargetHelper(
const Uptane::Targets &cur_targets,
147 const Uptane::Target &queried_target,
int level,
bool terminating,
149 void checkAndUpdatePendingSecondaries();
150 const Uptane::EcuSerial &primaryEcuSerial()
const {
return primary_ecu_serial_; }
151 boost::optional<Uptane::HardwareIdentifier> ecuHwId(
const Uptane::EcuSerial &serial)
const;
153 template <
class T,
class... Args>
154 void sendEvent(Args &&... args) {
155 std::shared_ptr<event::BaseEvent>
event = std::make_shared<T>(std::forward<Args>(args)...);
156 if (events_channel) {
157 (*events_channel)(std::move(
event));
159 LOG_INFO <<
"got " <<
event->variant <<
" event";
166 Uptane::ManifestIssuer::Ptr uptane_manifest;
167 std::shared_ptr<INvStorage> storage;
168 std::shared_ptr<HttpInterface> http;
169 std::shared_ptr<PackageManagerInterface> package_manager_;
170 std::shared_ptr<Uptane::Fetcher> uptane_fetcher;
171 std::unique_ptr<ReportQueue> report_queue;
172 Json::Value last_network_info_reported;
173 Json::Value last_hw_info_reported;
174 std::shared_ptr<event::Channel> events_channel;
175 boost::signals2::scoped_connection conn;
178 std::map<Uptane::EcuSerial, Uptane::SecondaryInterface::Ptr> secondaries;
179 std::mutex download_mutex;
187 bool operator()(
const Uptane::Target &in)
const {
return (in.MatchTarget(target)); }
196 bool operator()(
const std::pair<Uptane::EcuSerial, Uptane::HardwareIdentifier> &in)
const {
197 return (in.first == serial);
204 #endif // SOTA_UPTANE_CLIENT_H_