#include #include #include #include #include #include #include "version.hpp" namespace phosphor { namespace software { namespace manager { using namespace phosphor::logging; std::string Version::getValue(const std::string& manifestFilePath, std::string key) { key = key + "="; auto keySize = key.length(); if (manifestFilePath.empty()) { log("Error MANIFESTFilePath is empty"); throw std::runtime_error("MANIFESTFilePath is empty"); } std::string value{}; std::ifstream efile; std::string line; efile.exceptions(std::ifstream::failbit | std::ifstream::badbit | std::ifstream::eofbit); // Too many GCC bugs (53984, 66145) to do this the right way... try { efile.open(manifestFilePath); while (getline(efile, line)) { if (line.compare(0, keySize, key) == 0) { value = line.substr(keySize); break; } } efile.close(); } catch (const std::exception& e) { log("Error in reading MANIFEST file"); } return value; } std::string Version::getId(const std::string& version) { std::stringstream hexId; if (version.empty()) { log("Error version is empty"); throw std::runtime_error("Version is empty"); } // Only want 8 hex digits. hexId << std::hex << ((std::hash {}( version)) & 0xFFFFFFFF); return hexId.str(); } std::string Version::getBMCVersion(const std::string& releaseFilePath) { std::string versionKey = "VERSION_ID="; std::string version{}; std::ifstream efile; std::string line; efile.open(releaseFilePath); while (getline(efile, line)) { if (line.substr(0, versionKey.size()).find(versionKey) != std::string::npos) { std::size_t pos = line.find_first_of('"') + 1; version = line.substr(pos, line.find_last_of('"') - pos); break; } } efile.close(); if (version.empty()) { log("Error BMC current version is empty"); throw std::runtime_error("BMC current version is empty"); } return version; } void Version::delete_() { if (eraseCallback) { eraseCallback(getId(version())); } } } // namespace manager } // namespace software } // namepsace phosphor