Aktualizr
C++ SOTA Client
All Classes Namespaces Files Functions Variables Enumerations Enumerator Pages
sotauptaneclient.h
1 #ifndef SOTA_UPTANE_CLIENT_H_
2 #define SOTA_UPTANE_CLIENT_H_
3 
4 #include <map>
5 #include <memory>
6 #include <string>
7 #include <utility>
8 #include <vector>
9 
10 #include <boost/signals2.hpp>
11 #include "gtest/gtest_prod.h"
12 #include "json/json.h"
13 
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"
20 #include "primary/events.h"
21 #include "primary/results.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"
30 
32  public:
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,
35  const Uptane::EcuSerial &primary_serial = Uptane::EcuSerial::Unknown(),
36  const Uptane::HardwareIdentifier &hwid = Uptane::HardwareIdentifier::Unknown())
37  : config(config_in),
38  storage(std::move(storage_in)),
39  http(std::move(http_in)),
40  package_manager_(PackageManagerFactory::makePackageManager(config.pacman, config.bootloader, storage, http)),
41  uptane_fetcher(new Uptane::Fetcher(config, http)),
42  report_queue(new ReportQueue(config, http)),
43  events_channel(std::move(events_channel_in)),
44  primary_ecu_serial_(primary_serial),
45  primary_ecu_hw_id_(hwid) {}
46 
47  SotaUptaneClient(Config &config_in, const std::shared_ptr<INvStorage> &storage_in,
48  std::shared_ptr<HttpInterface> http_in)
49  : SotaUptaneClient(config_in, storage_in, std::move(http_in), nullptr) {}
50 
51  SotaUptaneClient(Config &config_in, const std::shared_ptr<INvStorage> &storage_in)
52  : SotaUptaneClient(config_in, storage_in, std::make_shared<HttpClient>()) {}
53 
54  void initialize();
55  void addSecondary(const std::shared_ptr<Uptane::SecondaryInterface> &sec);
56  result::Download downloadImages(const std::vector<Uptane::Target> &targets,
57  const api::FlowControlToken *token = nullptr);
58  std::pair<bool, Uptane::Target> downloadImage(const Uptane::Target &target,
59  const api::FlowControlToken *token = nullptr);
60  void reportPause();
61  void reportResume();
62  void sendDeviceData();
63  result::UpdateCheck fetchMeta();
64  bool putManifest(const Json::Value &custom = Json::nullValue);
65  result::UpdateCheck checkUpdates();
66  result::Install uptaneInstall(const std::vector<Uptane::Target> &updates);
67  result::CampaignCheck campaignCheck();
68  void campaignAccept(const std::string &campaign_id);
69  void campaignDecline(const std::string &campaign_id);
70  void campaignPostpone(const std::string &campaign_id);
71 
72  bool hasPendingUpdates() const;
73  bool isInstallCompletionRequired() const;
74  void completeInstall() const;
75  Uptane::LazyTargetsList allTargets() const;
76  Uptane::Target getCurrent() const { return package_manager_->getCurrent(); }
77 
78  bool updateImagesMeta(); // TODO: make private once aktualizr has a proper TUF API
79  bool checkImagesMetaOffline();
80  data::InstallationResult PackageInstall(const Uptane::Target &target);
81  TargetStatus VerifyTarget(const Uptane::Target &target) const { return package_manager_->verifyTarget(target); }
82 
83  private:
84  FRIEND_TEST(Aktualizr, FullNoUpdates);
85  FRIEND_TEST(Aktualizr, DeviceInstallationResult);
86  FRIEND_TEST(Aktualizr, FullMultipleSecondaries);
87  FRIEND_TEST(Aktualizr, CheckNoUpdates);
88  FRIEND_TEST(Aktualizr, DownloadWithUpdates);
89  FRIEND_TEST(Aktualizr, FinalizationFailure);
90  FRIEND_TEST(Aktualizr, InstallationFailure);
91  FRIEND_TEST(Aktualizr, AutoRebootAfterUpdate);
92  FRIEND_TEST(Aktualizr, EmptyTargets);
93  FRIEND_TEST(Aktualizr, FullOstreeUpdate);
94  FRIEND_TEST(Aktualizr, DownloadNonOstreeBin);
96  FRIEND_TEST(DockerAppManager, DockerAppBundles);
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); // Note hacky name
108  FRIEND_TEST(UptaneNetwork, DownloadFailure);
109  FRIEND_TEST(UptaneNetwork, LogConnectivityRestored);
110  FRIEND_TEST(UptaneVector, Test);
111  FRIEND_TEST(aktualizr_secondary_uptane, credentialsPassing);
112  friend class CheckForUpdate; // for load tests
113  friend class ProvisionDeviceTask; // for load tests
114 
115  bool uptaneIteration(std::vector<Uptane::Target> *targets, unsigned int *ecus_count);
116  bool uptaneOfflineIteration(std::vector<Uptane::Target> *targets, unsigned int *ecus_count);
117  result::UpdateStatus checkUpdatesOffline(const std::vector<Uptane::Target> &targets);
118  Json::Value AssembleManifest();
119  std::string secondaryTreehubCredentials() const;
120  Uptane::Exception getLastException() const { return last_exception; }
121  bool isInstalledOnPrimary(const Uptane::Target &target);
122  static std::vector<Uptane::Target> findForEcu(const std::vector<Uptane::Target> &targets,
123  const Uptane::EcuSerial &ecu_id);
124  data::InstallationResult PackageInstallSetResult(const Uptane::Target &target);
125  void finalizeAfterReboot();
126  void reportHwInfo();
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);
133  std::future<data::ResultCode::Numeric> sendFirmwareAsync(Uptane::SecondaryInterface &secondary,
134  const Uptane::Target &target);
135  std::vector<result::Install::EcuReport> sendImagesToEcus(const std::vector<Uptane::Target> &targets);
136 
137  bool putManifestSimple(const Json::Value &custom = Json::nullValue);
138  void storeInstallationFailure(const data::InstallationResult &result);
139  bool getNewTargets(std::vector<Uptane::Target> *new_targets, unsigned int *ecus_count = nullptr);
140  void rotateSecondaryRoot(Uptane::RepositoryType repo, Uptane::SecondaryInterface &secondary);
141  bool updateDirectorMeta();
142  bool checkDirectorMetaOffline();
143  void computeDeviceInstallationResult(data::InstallationResult *result, std::string *raw_installation_report) const;
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,
147  bool offline);
148  void checkAndUpdatePendingSecondaries();
149  const Uptane::EcuSerial &primaryEcuSerial() const { return primary_ecu_serial_; }
150  boost::optional<Uptane::HardwareIdentifier> ecuHwId(const Uptane::EcuSerial &serial) const;
151 
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));
157  } else if (!event->isTypeOf<event::DownloadProgressReport>()) {
158  LOG_INFO << "got " << event->variant << " event";
159  }
160  }
161 
162  Config &config;
163  Uptane::DirectorRepository director_repo;
164  Uptane::ImagesRepository images_repo;
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;
175  Uptane::Exception last_exception{"", ""};
176  // ecu_serial => secondary*
177  std::map<Uptane::EcuSerial, Uptane::SecondaryInterface::Ptr> secondaries;
178  std::mutex download_mutex;
179  Uptane::EcuSerial primary_ecu_serial_;
180  Uptane::HardwareIdentifier primary_ecu_hw_id_;
181 };
182 
184  public:
185  explicit TargetCompare(const Uptane::Target &target_in) : target(target_in) {}
186  bool operator()(const Uptane::Target &in) const { return (in.MatchTarget(target)); }
187 
188  private:
189  const Uptane::Target &target;
190 };
191 
193  public:
194  explicit SerialCompare(Uptane::EcuSerial serial_in) : serial(std::move(serial_in)) {}
195  bool operator()(const std::pair<Uptane::EcuSerial, Uptane::HardwareIdentifier> &in) const {
196  return (in.first == serial);
197  }
198 
199  private:
200  const Uptane::EcuSerial serial;
201 };
202 
203 #endif // SOTA_UPTANE_CLIENT_H_
results.h
Uptane::Fetcher
Definition: fetcher.h:33
Uptane::DirectorRepository
Definition: directorrepository.h:13
data::InstallationResult
Definition: types.h:182
SotaUptaneClient
Definition: sotauptaneclient.h:31
UptaneVector
Definition: uptane_vector_tests.cc:75
result::UpdateCheck
Container for information about available updates.
Definition: results.h:38
Uptane::HardwareIdentifier
Definition: tuf.h:143
DockerAppBundles
Definition: dockerappmanager.h:44
Config
Configuration object for an aktualizr instance running on a primary ECU.
Definition: config.h:74
events.h
ProvisionDeviceTask
Definition: provision.cc:41
Uptane::RepositoryType
Definition: tuf.h:20
result::UpdateStatus
UpdateStatus
Status of an update.
Definition: results.h:26
Uptane::EcuSerial
Definition: tuf.h:174
Uptane::Targets
Definition: tuf.h:439
CheckForUpdate
Definition: check.cc:38
Aktualizr
This class provides the main APIs necessary for launching and controlling libaktualizr.
Definition: aktualizr.h:20
result::Download
Container for information about downloading an update.
Definition: results.h:117
Uptane::Exception
Definition: exceptions.h:10
Uptane::LazyTargetsList
Definition: iterator.h:12
api::FlowControlToken
Provides a thread-safe way to pause and terminate task execution.
Definition: apiqueue.h:19
SerialCompare
Definition: sotauptaneclient.h:192
DockerAppStandalone
Definition: dockerappmanager.h:21
result
Results of libaktualizr API calls.
Definition: results.h:13
result::Install
Container for information about installing an update.
Definition: results.h:130
event::DownloadProgressReport
A report for a download in progress.
Definition: events.h:71
Uptane::Target
Definition: tuf.h:238
result::CampaignCheck
Container for information about available campaigns.
Definition: results.h:17
Uptane
Base data types that are used in The Update Framework (TUF), part of UPTANE.
Definition: secondary_tcp_server.h:8
DockerAppManager
Definition: dockerappmanager.h:67
TargetCompare
Definition: sotauptaneclient.h:183
Uptane::SecondaryInterface
Definition: secondaryinterface.h:12
Uptane::ImagesRepository
Definition: imagesrepository.h:13
ReportQueue
Definition: reportqueue.h:85
event
Aktualizr status events.
Definition: events.h:18