1 #include <iostream> 2 #include <string> 3 #include <sstream> 4 #include <fstream> 5 #include <stdexcept> 6 #include <phosphor-logging/log.hpp> 7 #include "version.hpp" 8 #include <phosphor-logging/elog-errors.hpp> 9 #include "xyz/openbmc_project/Common/error.hpp" 10 #include "item_updater.hpp" 11 #include <openssl/sha.h> 12 13 namespace openpower 14 { 15 namespace software 16 { 17 namespace updater 18 { 19 20 using namespace sdbusplus::xyz::openbmc_project::Common::Error; 21 using namespace phosphor::logging; 22 using Argument = xyz::openbmc_project::Common::InvalidArgument; 23 24 std::string Version::getId(const std::string& version) 25 { 26 27 if (version.empty()) 28 { 29 log<level::ERR>("Error version is empty"); 30 elog<InvalidArgument>(Argument::ARGUMENT_NAME("Version"), 31 Argument::ARGUMENT_VALUE(version.c_str())); 32 } 33 34 unsigned char digest[SHA512_DIGEST_LENGTH]; 35 SHA512_CTX ctx; 36 SHA512_Init(&ctx); 37 SHA512_Update(&ctx, version.c_str(), strlen(version.c_str())); 38 SHA512_Final(digest, &ctx); 39 char mdString[SHA512_DIGEST_LENGTH*2+1]; 40 for (int i = 0; i < SHA512_DIGEST_LENGTH; i++) 41 { 42 snprintf(&mdString[i*2], 3, "%02x", (unsigned int)digest[i]); 43 } 44 45 // Only need 8 hex digits. 46 std::string hexId = std::string(mdString); 47 return (hexId.substr(0, 8)); 48 } 49 50 std::map<std::string, std::string> Version::getValue( 51 const std::string& filePath, std::map<std::string, std::string> keys) 52 { 53 if (filePath.empty()) 54 { 55 log<level::ERR>("Error filePath is empty"); 56 elog<InvalidArgument>(Argument::ARGUMENT_NAME("FilePath"), 57 Argument::ARGUMENT_VALUE(filePath.c_str())); 58 } 59 60 std::ifstream efile; 61 std::string line; 62 efile.exceptions(std::ifstream::failbit | 63 std::ifstream::badbit | 64 std::ifstream::eofbit); 65 66 try 67 { 68 efile.open(filePath); 69 while (getline(efile, line)) 70 { 71 for(auto& key : keys) 72 { 73 auto value = key.first + "="; 74 auto keySize = value.length(); 75 if (line.compare(0, keySize, value) == 0) 76 { 77 key.second = line.substr(keySize); 78 break; 79 } 80 } 81 } 82 efile.close(); 83 } 84 catch (const std::exception& e) 85 { 86 if (!efile.eof()) 87 { 88 log<level::ERR>("Error in reading file"); 89 } 90 efile.close(); 91 } 92 93 return keys; 94 } 95 96 void Version::delete_() 97 { 98 parent.erase(getId(version())); 99 } 100 101 } // namespace updater 102 } // namespace software 103 } // namespace openpower 104