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) {
41 return loadPrimaryPublic(public_key) && loadPrimaryPrivate(private_key);
44 bool FSStorageRead::loadPrimaryPublic(std::string* public_key) {
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) {
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) {
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());
89 bool FSStorageRead::loadTlsCommon(std::string*
data,
const BasedPath& path_in) {
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) {
return loadTlsCommon(ca, config_.tls_cacert_path); }
104 bool FSStorageRead::loadTlsCert(std::string* cert) {
return loadTlsCommon(cert, config_.tls_clientcert_path); }
106 bool FSStorageRead::loadTlsPkey(std::string* pkey) {
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) {
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() {
181 return boost::filesystem::exists(Utils::absolutePath(config_.path,
"is_registered").string());
184 bool FSStorageRead::loadEcuSerials(EcuSerials* serials) {
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) {
233 if (!boost::filesystem::exists(Utils::absolutePath(config_.path,
"misconfigured_ecus"))) {
236 Json::Value content_json = Utils::parseJSONFile(Utils::absolutePath(config_.path,
"misconfigured_ecus").string());
238 for (
auto it = content_json.begin(); it != content_json.end(); ++it) {
241 static_cast<EcuState>((*it)[
"state"].asInt())));
246 bool FSStorageRead::loadInstalledVersions(std::vector<Uptane::Target>* installed_versions,
size_t* current_version) {
247 const boost::filesystem::path path = Utils::absolutePath(config_.path,
"installed_versions");
248 return INvStorage::fsReadInstalledVersions(path, installed_versions, current_version);
251 bool FSStorageRead::splitNameRoleVersion(
const std::string& full_name, std::string* role_name,
int* version) {
252 size_t dot_pos = full_name.find(
'.');
255 if (dot_pos == std::string::npos) {
258 std::string prefix = full_name.substr(0, dot_pos);
259 if (role_name !=
nullptr) {
260 *role_name = full_name.substr(dot_pos + 1);
264 auto v = boost::lexical_cast<int>(prefix);
265 if (version !=
nullptr) {
268 }
catch (
const boost::bad_lexical_cast&) {
276 if (!boost::filesystem::exists(meta_directory)) {
280 boost::filesystem::directory_iterator it{meta_directory};
281 for (; it != boost::filesystem::directory_iterator(); ++it) {
282 if (!boost::filesystem::is_regular_file(it->path())) {
285 std::string name = it->path().filename().native();
287 std::string file_role;
288 if (splitNameRoleVersion(name, &file_role, &file_version)) {
289 if (file_role ==
Uptane::Version().RoleFileName(role) && file_version > version) {
290 version = file_version;
300 void FSStorageRead::clearPrimaryKeys() {
301 boost::filesystem::remove(config_.uptane_public_key_path.get(config_.path));
302 boost::filesystem::remove(config_.uptane_private_key_path.get(config_.path));
305 void FSStorageRead::clearTlsCreds() {
306 boost::filesystem::remove(config_.tls_cacert_path.get(config_.path));
307 boost::filesystem::remove(config_.tls_clientcert_path.get(config_.path));
308 boost::filesystem::remove(config_.tls_pkey_path.get(config_.path));
312 boost::filesystem::path meta_path;
314 case Uptane::RepositoryType::Image():
315 meta_path = config_.uptane_metadata_path.get(config_.path) /
"repo";
317 case Uptane::RepositoryType::Director():
318 meta_path = config_.uptane_metadata_path.get(config_.path) /
"director";
324 boost::filesystem::directory_iterator it{meta_path};
325 for (; it != boost::filesystem::directory_iterator(); ++it) {
326 for (
const auto& role : Uptane::Role::Roles()) {
327 if (role == Uptane::Role::Root()) {
330 std::string role_name;
331 std::string fn = it->path().filename().native();
333 (splitNameRoleVersion(fn, &role_name,
nullptr) && (role_name ==
Uptane::Version().RoleFileName(role)))) {
334 boost::filesystem::remove(it->path());
340 void FSStorageRead::clearMetadata() {
341 for (
const auto& meta_path : {config_.uptane_metadata_path.get(config_.path) /
"repo",
342 config_.uptane_metadata_path.get(config_.path) /
"director"}) {
343 if (!boost::filesystem::exists(meta_path)) {
347 boost::filesystem::directory_iterator it{meta_path};
348 for (; it != boost::filesystem::directory_iterator(); ++it) {
349 boost::filesystem::remove(it->path());
354 void FSStorageRead::clearDeviceId() { boost::filesystem::remove(Utils::absolutePath(config_.path,
"device_id")); }
356 void FSStorageRead::clearEcuRegistered() {
357 boost::filesystem::remove(Utils::absolutePath(config_.path,
"is_registered"));
360 void FSStorageRead::clearEcuSerials() {
361 boost::filesystem::remove(Utils::absolutePath(config_.path,
"primary_ecu_serial"));
362 boost::filesystem::remove(Utils::absolutePath(config_.path,
"primary_ecu_hardware_id"));
363 boost::filesystem::remove(Utils::absolutePath(config_.path,
"secondaries_list"));
366 void FSStorageRead::clearMisconfiguredEcus() {
367 boost::filesystem::remove(Utils::absolutePath(config_.path,
"misconfigured_ecus"));
370 void FSStorageRead::clearInstalledVersions() {
371 if (boost::filesystem::exists(Utils::absolutePath(config_.path,
"installed_versions"))) {
372 boost::filesystem::remove(Utils::absolutePath(config_.path,
"installed_versions"));
376 void FSStorageRead::clearInstallationResult() {
377 boost::filesystem::remove(Utils::absolutePath(config_.path,
"installation_result"));
380 void FSStorageRead::cleanUpAll() {
385 clearEcuRegistered();
386 clearMisconfiguredEcus();
387 clearInstalledVersions();
388 clearInstallationResult();
391 boost::filesystem::remove_all(config_.uptane_metadata_path.get(config_.path));
392 boost::filesystem::remove_all(config_.path /
"targets");
395 bool FSStorageRead::FSStoragePresent(
const StorageConfig& config) {
396 return boost::filesystem::exists(Utils::absolutePath(config.path,
"is_registered").string());