Aktualizr
C++ SOTA Client
All Classes Namespaces Files Functions Variables Enumerations Enumerator Pages
virtualsecondary.cc
1 #include <boost/algorithm/hex.hpp>
2 #include <boost/filesystem.hpp>
3 #include <fstream>
4 
5 #include "crypto/crypto.h"
6 #include "utilities/fault_injection.h"
7 #include "utilities/utils.h"
8 #include "virtualsecondary.h"
9 
10 namespace Primary {
11 
12 const char* const VirtualSecondaryConfig::Type = "virtual";
13 
14 VirtualSecondaryConfig::VirtualSecondaryConfig(const Json::Value& json_config) : ManagedSecondaryConfig(Type) {
15  partial_verifying = json_config["partial_verifying"].asBool();
16  ecu_serial = json_config["ecu_serial"].asString();
17  ecu_hardware_id = json_config["ecu_hardware_id"].asString();
18  full_client_dir = json_config["full_client_dir"].asString();
19  ecu_private_key = json_config["ecu_private_key"].asString();
20  ecu_public_key = json_config["ecu_public_key"].asString();
21  firmware_path = json_config["firmware_path"].asString();
22  target_name_path = json_config["target_name_path"].asString();
23  metadata_path = json_config["metadata_path"].asString();
24 }
25 
26 std::vector<VirtualSecondaryConfig> VirtualSecondaryConfig::create_from_file(
27  const boost::filesystem::path& file_full_path) {
28  Json::Value json_config;
29  std::ifstream json_file(file_full_path.string());
30  Json::parseFromStream(Json::CharReaderBuilder(), json_file, &json_config, nullptr);
31  json_file.close();
32 
33  std::vector<VirtualSecondaryConfig> sec_configs;
34  sec_configs.reserve(json_config[Type].size());
35 
36  for (const auto& item : json_config[Type]) {
37  sec_configs.emplace_back(VirtualSecondaryConfig(item));
38  }
39  return sec_configs;
40 }
41 
42 void VirtualSecondaryConfig::dump(const boost::filesystem::path& file_full_path) const {
43  Json::Value json_config;
44 
45  json_config["partial_verifying"] = partial_verifying;
46  json_config["ecu_serial"] = ecu_serial;
47  json_config["ecu_hardware_id"] = ecu_hardware_id;
48  json_config["full_client_dir"] = full_client_dir.string();
49  json_config["ecu_private_key"] = ecu_private_key;
50  json_config["ecu_public_key"] = ecu_public_key;
51  json_config["firmware_path"] = firmware_path.string();
52  json_config["target_name_path"] = target_name_path.string();
53  json_config["metadata_path"] = metadata_path.string();
54 
55  Json::Value root;
56  // Append to the config file if it already exists.
57  if (boost::filesystem::exists(file_full_path)) {
58  root = Utils::parseJSONFile(file_full_path);
59  }
60  root[Type].append(json_config);
61 
62  Json::StreamWriterBuilder json_bwriter;
63  json_bwriter["indentation"] = "\t";
64  std::unique_ptr<Json::StreamWriter> const json_writer(json_bwriter.newStreamWriter());
65 
66  boost::filesystem::create_directories(file_full_path.parent_path());
67  std::ofstream json_file(file_full_path.string());
68  json_writer->write(root, &json_file);
69  json_file.close();
70 }
71 
72 VirtualSecondary::VirtualSecondary(Primary::VirtualSecondaryConfig sconfig_in)
73  : ManagedSecondary(std::move(sconfig_in)) {}
74 
75 data::InstallationResult VirtualSecondary::putMetadata(const Uptane::Target& target) {
76  if (fiu_fail("secondary_putmetadata") != 0) {
78  }
79 
80  return ManagedSecondary::putMetadata(target);
81 }
82 
83 data::InstallationResult VirtualSecondary::putRoot(const std::string& root, bool director) {
84  // TODO(OTA-4552): Use this for testing.
85  if (fiu_fail("secondary_putroot") != 0) {
87  }
88 
89  return ManagedSecondary::putRoot(root, director);
90 }
91 
92 data::InstallationResult VirtualSecondary::sendFirmware(const Uptane::Target& target) {
93  if (fiu_fail((std::string("secondary_sendfirmware_") + getSerial().ToString()).c_str()) != 0) {
94  // Put the injected failure string into the ResultCode so that it shows up
95  // in the device's concatenated InstallationResult.
97  data::ResultCode(data::ResultCode::Numeric::kDownloadFailed, fault_injection_last_info()), "Forced failure");
98  }
99 
100  return ManagedSecondary::sendFirmware(target);
101 }
102 
103 data::InstallationResult VirtualSecondary::install(const Uptane::Target& target) {
104  if (fiu_fail((std::string("secondary_install_") + getSerial().ToString()).c_str()) != 0) {
105  // Put the injected failure string into the ResultCode so that it shows up
106  // in the device's concatenated InstallationResult.
108  data::ResultCode(data::ResultCode::Numeric::kInstallFailed, fault_injection_last_info()), "Forced failure");
109  }
110 
111  return ManagedSecondary::install(target);
112 }
113 
114 } // namespace Primary
data::ResultCode
Definition: types.h:219
data::ResultCode::Numeric::kVerificationFailed
@ kVerificationFailed
Metadata verification failed.
data::InstallationResult
Definition: types.h:277
Primary::VirtualSecondaryConfig
Definition: virtualsecondary.h:11
Uptane::Target
Definition: types.h:379
data::ResultCode::Numeric::kDownloadFailed
@ kDownloadFailed
Package download failed.
data::ResultCode::Numeric::kInstallFailed
@ kInstallFailed
Package installation failed.