1 #include "fsstorage_read.h"
10 #include <boost/lexical_cast.hpp>
11 #include <boost/scoped_array.hpp>
12 #include "json/json.h"
14 #include "logging/logging.h"
15 #include "utilities/utils.h"
17 FSStorageRead::FSStorageRead(
const StorageConfig& config) : config_(config) {
18 boost::filesystem::path image_path = config_.uptane_metadata_path.get(config_.path) /
"repo";
19 boost::filesystem::path director_path = config_.uptane_metadata_path.get(config_.path) /
"director";
22 for (
auto repo : {Uptane::RepositoryType::Director(), Uptane::RepositoryType::Image()}) {
23 boost::filesystem::path& meta_dir = repo == (Uptane::RepositoryType::Director()) ? director_path : image_path;
24 boost::filesystem::path meta_path = meta_dir /
Uptane::Version().RoleFileName(Uptane::Role::Root());
25 if (boost::filesystem::exists(meta_path)) {
26 std::string
data = Utils::readFile(meta_path);
28 boost::filesystem::remove(meta_path);
29 if (version.version() >= 0) {
30 Utils::writeFile(meta_dir / version.RoleFileName(Uptane::Role::Root()),
data);
36 latest_director_root = findMaxVersion(director_path, Uptane::Role::Root());
37 latest_image_root = findMaxVersion(image_path, Uptane::Role::Root());
40 bool FSStorageRead::loadPrimaryKeys(std::string* public_key, std::string* private_key)
const {
41 return loadPrimaryPublic(public_key) && loadPrimaryPrivate(private_key);
44 bool FSStorageRead::loadPrimaryPublic(std::string* public_key)
const {
45 boost::filesystem::path public_key_path = config_.uptane_public_key_path.get(config_.path);
46 if (!boost::filesystem::exists(public_key_path)) {
50 if (public_key !=
nullptr) {
51 *public_key = Utils::readFile(public_key_path.string());
56 bool FSStorageRead::loadPrimaryPrivate(std::string* private_key)
const {
57 boost::filesystem::path private_key_path = config_.uptane_private_key_path.get(config_.path);
58 if (!boost::filesystem::exists(private_key_path)) {
62 if (private_key !=
nullptr) {
63 *private_key = Utils::readFile(private_key_path.string());
68 bool FSStorageRead::loadTlsCreds(std::string* ca, std::string* cert, std::string* pkey)
const {
69 boost::filesystem::path ca_path(config_.tls_cacert_path.get(config_.path));
70 boost::filesystem::path cert_path(config_.tls_clientcert_path.get(config_.path));
71 boost::filesystem::path pkey_path(config_.tls_pkey_path.get(config_.path));
72 if (!boost::filesystem::exists(ca_path) || boost::filesystem::is_directory(ca_path) ||
73 !boost::filesystem::exists(cert_path) || boost::filesystem::is_directory(cert_path) ||
74 !boost::filesystem::exists(pkey_path) || boost::filesystem::is_directory(pkey_path)) {
78 *ca = Utils::readFile(ca_path.string());
80 if (cert !=
nullptr) {
81 *cert = Utils::readFile(cert_path.string());
83 if (pkey !=
nullptr) {
84 *pkey = Utils::readFile(pkey_path.string());
90 boost::filesystem::path path(path_in.get(config_.path));
91 if (!boost::filesystem::exists(path)) {
95 if (
data !=
nullptr) {
96 *
data = Utils::readFile(path.string());
102 bool FSStorageRead::loadTlsCa(std::string* ca)
const {
return loadTlsCommon(ca, config_.tls_cacert_path); }
104 bool FSStorageRead::loadTlsCert(std::string* cert)
const {
return loadTlsCommon(cert, config_.tls_clientcert_path); }
106 bool FSStorageRead::loadTlsPkey(std::string* pkey)
const {
return loadTlsCommon(pkey, config_.tls_pkey_path); }
109 boost::filesystem::path metafile;
111 case (Uptane::RepositoryType::Director()):
112 if (version.version() < 0) {
113 version = latest_director_root;
116 config_.uptane_metadata_path.get(config_.path) /
"director" / version.RoleFileName(Uptane::Role::Root());
119 case (Uptane::RepositoryType::Image()):
120 if (version.version() < 0) {
121 version = latest_director_root;
123 metafile = config_.uptane_metadata_path.get(config_.path) /
"repo" / version.RoleFileName(Uptane::Role::Root());
130 if (version.version() < 0) {
134 if (!boost::filesystem::exists(metafile)) {
138 if (
data !=
nullptr) {
139 *
data = Utils::readFile(metafile);
145 boost::filesystem::path metafile;
147 case (Uptane::RepositoryType::Director()):
148 metafile = config_.uptane_metadata_path.get(config_.path) /
"director" /
Uptane::Version().RoleFileName(role);
151 case (Uptane::RepositoryType::Image()):
152 metafile = config_.uptane_metadata_path.get(config_.path) /
"repo" /
Uptane::Version().RoleFileName(role);
159 if (!boost::filesystem::exists(metafile)) {
163 if (
data !=
nullptr) {
164 *
data = Utils::readFile(metafile);
169 bool FSStorageRead::loadDeviceId(std::string* device_id)
const {
170 if (!boost::filesystem::exists(Utils::absolutePath(config_.path,
"device_id").string())) {
174 if (device_id !=
nullptr) {
175 *device_id = Utils::readFile(Utils::absolutePath(config_.path,
"device_id").string());
180 bool FSStorageRead::loadEcuRegistered()
const {
181 return boost::filesystem::exists(Utils::absolutePath(config_.path,
"is_registered").string());
184 bool FSStorageRead::loadEcuSerials(EcuSerials* serials)
const {
189 const boost::filesystem::path serial_path = Utils::absolutePath(config_.path,
"primary_ecu_serial");
190 if (!boost::filesystem::exists(serial_path)) {
193 serial = Utils::readFile(serial_path.string());
195 const boost::filesystem::path hw_id_path = Utils::absolutePath(config_.path,
"primary_ecu_hardware_id");
196 if (!boost::filesystem::exists(hw_id_path)) {
197 hw_id = Utils::getHostname();
199 hw_id = Utils::readFile(hw_id_path.string());
202 if (serials !=
nullptr) {
207 const boost::filesystem::path sec_list_path = Utils::absolutePath(config_.path,
"secondaries_list");
208 if (!boost::filesystem::exists(sec_list_path)) {
211 std::ifstream file(sec_list_path.c_str());
212 while (std::getline(file, buf)) {
213 size_t tab = buf.find(
'\t');
214 serial = buf.substr(0, tab);
216 hw_id = buf.substr(tab + 1);
217 }
catch (
const std::out_of_range& e) {
218 if (serials !=
nullptr) {
224 if (serials !=
nullptr) {
232 bool FSStorageRead::loadMisconfiguredEcus(std::vector<MisconfiguredEcu>* ecus)
const {
233 if (!boost::filesystem::exists(Utils::absolutePath(config_.path,
"misconfigured_ecus"))) {
238 Json::Value content_json = Utils::parseJSONFile(Utils::absolutePath(config_.path,
"misconfigured_ecus").string());
239 for (
auto it = content_json.begin(); it != content_json.end(); ++it) {
242 static_cast<EcuState
>((*it)[
"state"].asInt())));
244 }
catch (
const std::exception& ex) {
245 LOG_ERROR <<
"Unable to parse misconfigured_ecus: " << ex.what();
251 bool FSStorageRead::loadInstalledVersions(std::vector<Uptane::Target>* installed_versions,
252 size_t* current_version)
const {
253 const boost::filesystem::path path = Utils::absolutePath(config_.path,
"installed_versions");
254 return INvStorage::fsReadInstalledVersions(path, installed_versions, current_version);
257 bool FSStorageRead::splitNameRoleVersion(
const std::string& full_name, std::string* role_name,
int* version) {
258 size_t dot_pos = full_name.find(
'.');
261 if (dot_pos == std::string::npos) {
264 std::string prefix = full_name.substr(0, dot_pos);
265 if (role_name !=
nullptr) {
266 *role_name = full_name.substr(dot_pos + 1);
270 auto v = boost::lexical_cast<int>(prefix);
271 if (version !=
nullptr) {
274 }
catch (
const boost::bad_lexical_cast&) {
282 if (!boost::filesystem::exists(meta_directory)) {
286 boost::filesystem::directory_iterator it{meta_directory};
287 for (; it != boost::filesystem::directory_iterator(); ++it) {
288 if (!boost::filesystem::is_regular_file(it->path())) {
291 std::string name = it->path().filename().native();
293 std::string file_role;
294 if (splitNameRoleVersion(name, &file_role, &file_version)) {
295 if (file_role ==
Uptane::Version().RoleFileName(role) && file_version > version) {
296 version = file_version;
306 void FSStorageRead::clearPrimaryKeys() {
307 boost::filesystem::remove(config_.uptane_public_key_path.get(config_.path));
308 boost::filesystem::remove(config_.uptane_private_key_path.get(config_.path));
311 void FSStorageRead::clearTlsCreds() {
312 boost::filesystem::remove(config_.tls_cacert_path.get(config_.path));
313 boost::filesystem::remove(config_.tls_clientcert_path.get(config_.path));
314 boost::filesystem::remove(config_.tls_pkey_path.get(config_.path));
318 boost::filesystem::path meta_path;
320 case Uptane::RepositoryType::Image():
321 meta_path = config_.uptane_metadata_path.get(config_.path) /
"repo";
323 case Uptane::RepositoryType::Director():
324 meta_path = config_.uptane_metadata_path.get(config_.path) /
"director";
330 boost::filesystem::directory_iterator it{meta_path};
331 for (; it != boost::filesystem::directory_iterator(); ++it) {
332 for (
const auto& role : Uptane::Role::Roles()) {
333 if (role == Uptane::Role::Root()) {
336 std::string role_name;
337 std::string fn = it->path().filename().native();
339 (splitNameRoleVersion(fn, &role_name,
nullptr) && (role_name ==
Uptane::Version().RoleFileName(role)))) {
340 boost::filesystem::remove(it->path());
346 void FSStorageRead::clearMetadata() {
347 for (
const auto& meta_path : {config_.uptane_metadata_path.get(config_.path) /
"repo",
348 config_.uptane_metadata_path.get(config_.path) /
"director"}) {
349 if (!boost::filesystem::exists(meta_path)) {
353 boost::filesystem::directory_iterator it{meta_path};
354 for (; it != boost::filesystem::directory_iterator(); ++it) {
355 boost::filesystem::remove(it->path());
360 void FSStorageRead::clearDeviceId() { boost::filesystem::remove(Utils::absolutePath(config_.path,
"device_id")); }
362 void FSStorageRead::clearEcuRegistered() {
363 boost::filesystem::remove(Utils::absolutePath(config_.path,
"is_registered"));
366 void FSStorageRead::clearEcuSerials() {
367 boost::filesystem::remove(Utils::absolutePath(config_.path,
"primary_ecu_serial"));
368 boost::filesystem::remove(Utils::absolutePath(config_.path,
"primary_ecu_hardware_id"));
369 boost::filesystem::remove(Utils::absolutePath(config_.path,
"secondaries_list"));
372 void FSStorageRead::clearMisconfiguredEcus() {
373 boost::filesystem::remove(Utils::absolutePath(config_.path,
"misconfigured_ecus"));
376 void FSStorageRead::clearInstalledVersions() {
377 if (boost::filesystem::exists(Utils::absolutePath(config_.path,
"installed_versions"))) {
378 boost::filesystem::remove(Utils::absolutePath(config_.path,
"installed_versions"));
382 void FSStorageRead::clearInstallationResult() {
383 boost::filesystem::remove(Utils::absolutePath(config_.path,
"installation_result"));
386 void FSStorageRead::cleanUpAll() {
391 clearEcuRegistered();
392 clearMisconfiguredEcus();
393 clearInstalledVersions();
394 clearInstallationResult();
397 boost::filesystem::remove_all(config_.uptane_metadata_path.get(config_.path));
398 boost::filesystem::remove_all(config_.path /
"targets");
401 bool FSStorageRead::FSStoragePresent(
const StorageConfig& config) {
402 return boost::filesystem::exists(Utils::absolutePath(config.path,
"is_registered").string());