xref: /openbmc/openpower-pnor-code-mgmt/version.cpp (revision f6ed5897b78235f09643978045b6bbfaf891d1a6)
1 #include "version.hpp"
2 
3 #include "item_updater.hpp"
4 #include "xyz/openbmc_project/Common/error.hpp"
5 
6 #include <openssl/sha.h>
7 
8 #include <fstream>
9 #include <iostream>
10 #include <phosphor-logging/elog-errors.hpp>
11 #include <phosphor-logging/log.hpp>
12 #include <sstream>
13 #include <stdexcept>
14 #include <string>
15 
16 namespace openpower
17 {
18 namespace software
19 {
20 namespace updater
21 {
22 
23 using namespace sdbusplus::xyz::openbmc_project::Common::Error;
24 using namespace phosphor::logging;
25 using Argument = xyz::openbmc_project::Common::InvalidArgument;
26 
27 std::string Version::getId(const std::string& version)
28 {
29 
30     if (version.empty())
31     {
32         log<level::ERR>("Error version is empty");
33         elog<InvalidArgument>(Argument::ARGUMENT_NAME("Version"),
34                               Argument::ARGUMENT_VALUE(version.c_str()));
35     }
36 
37     unsigned char digest[SHA512_DIGEST_LENGTH];
38     SHA512_CTX ctx;
39     SHA512_Init(&ctx);
40     SHA512_Update(&ctx, version.c_str(), strlen(version.c_str()));
41     SHA512_Final(digest, &ctx);
42     char mdString[SHA512_DIGEST_LENGTH * 2 + 1];
43     for (int i = 0; i < SHA512_DIGEST_LENGTH; i++)
44     {
45         snprintf(&mdString[i * 2], 3, "%02x", (unsigned int)digest[i]);
46     }
47 
48     // Only need 8 hex digits.
49     std::string hexId = std::string(mdString);
50     return (hexId.substr(0, 8));
51 }
52 
53 std::map<std::string, std::string>
54     Version::getValue(const std::string& filePath,
55                       std::map<std::string, std::string> keys)
56 {
57     if (filePath.empty())
58     {
59         log<level::ERR>("Error filePath is empty");
60         elog<InvalidArgument>(Argument::ARGUMENT_NAME("FilePath"),
61                               Argument::ARGUMENT_VALUE(filePath.c_str()));
62     }
63 
64     std::ifstream efile;
65     std::string line;
66     efile.exceptions(std::ifstream::failbit | std::ifstream::badbit |
67                      std::ifstream::eofbit);
68 
69     try
70     {
71         efile.open(filePath);
72         while (getline(efile, line))
73         {
74             for (auto& key : keys)
75             {
76                 auto value = key.first + "=";
77                 auto keySize = value.length();
78                 if (line.compare(0, keySize, value) == 0)
79                 {
80                     key.second = line.substr(keySize);
81                     break;
82                 }
83             }
84         }
85         efile.close();
86     }
87     catch (const std::exception& e)
88     {
89         if (!efile.eof())
90         {
91             log<level::ERR>("Error in reading file");
92         }
93         efile.close();
94     }
95 
96     return keys;
97 }
98 
99 void Delete::delete_()
100 {
101     if (parent.eraseCallback)
102     {
103         parent.eraseCallback(parent.getId(parent.version()));
104     }
105 }
106 
107 void Version::updateDeleteInterface(sdbusplus::message::message& msg)
108 {
109     std::string interface, chassisState;
110     std::map<std::string, sdbusplus::message::variant<std::string>> properties;
111 
112     msg.read(interface, properties);
113 
114     for (const auto& p : properties)
115     {
116         if (p.first == "CurrentPowerState")
117         {
118             chassisState = p.second.get<std::string>();
119         }
120     }
121     if (chassisState.empty())
122     {
123         // The chassis power state property did not change, return.
124         return;
125     }
126 
127     if ((parent.isVersionFunctional(this->versionId)) &&
128         (chassisState != CHASSIS_STATE_OFF))
129     {
130         if (deleteObject)
131         {
132             deleteObject.reset(nullptr);
133         }
134     }
135     else
136     {
137         if (!deleteObject)
138         {
139             deleteObject = std::make_unique<Delete>(bus, objPath, *this);
140         }
141     }
142 }
143 
144 } // namespace updater
145 } // namespace software
146 } // namespace openpower
147