blob: 23f90f40cc710961067d9d180ec58fe4ed4d0714 [file] [log] [blame]
Saqib Khan167601b2017-06-18 23:33:46 -05001#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"
Leonel Gonzalez9c8adfa2017-07-12 11:08:40 -050010#include "item_updater.hpp"
Saqib Khan2308b8b2017-09-19 15:33:06 -050011#include <openssl/sha.h>
Saqib Khan167601b2017-06-18 23:33:46 -050012
13namespace openpower
14{
15namespace software
16{
17namespace updater
18{
19
20using namespace sdbusplus::xyz::openbmc_project::Common::Error;
21using namespace phosphor::logging;
Gunnar Millsa93a07b2017-09-21 15:40:09 -050022using Argument = xyz::openbmc_project::Common::InvalidArgument;
Saqib Khan167601b2017-06-18 23:33:46 -050023
24std::string Version::getId(const std::string& version)
25{
Saqib Khan167601b2017-06-18 23:33:46 -050026
27 if (version.empty())
28 {
29 log<level::ERR>("Error version is empty");
Gunnar Millsa93a07b2017-09-21 15:40:09 -050030 elog<InvalidArgument>(Argument::ARGUMENT_NAME("Version"),
31 Argument::ARGUMENT_VALUE(version.c_str()));
Saqib Khan167601b2017-06-18 23:33:46 -050032 }
33
Saqib Khan2308b8b2017-09-19 15:33:06 -050034 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);
Adriana Kobylak70dcb632018-02-27 15:46:52 -060039 char mdString[SHA512_DIGEST_LENGTH * 2 + 1];
Saqib Khan2308b8b2017-09-19 15:33:06 -050040 for (int i = 0; i < SHA512_DIGEST_LENGTH; i++)
41 {
Adriana Kobylak70dcb632018-02-27 15:46:52 -060042 snprintf(&mdString[i * 2], 3, "%02x", (unsigned int)digest[i]);
Saqib Khan2308b8b2017-09-19 15:33:06 -050043 }
44
45 // Only need 8 hex digits.
46 std::string hexId = std::string(mdString);
47 return (hexId.substr(0, 8));
Saqib Khan167601b2017-06-18 23:33:46 -050048}
49
Adriana Kobylak70dcb632018-02-27 15:46:52 -060050std::map<std::string, std::string>
51 Version::getValue(const std::string& filePath,
52 std::map<std::string, std::string> keys)
Saqib Khan167601b2017-06-18 23:33:46 -050053{
Saqib Khan167601b2017-06-18 23:33:46 -050054 if (filePath.empty())
55 {
56 log<level::ERR>("Error filePath is empty");
Gunnar Millsa93a07b2017-09-21 15:40:09 -050057 elog<InvalidArgument>(Argument::ARGUMENT_NAME("FilePath"),
58 Argument::ARGUMENT_VALUE(filePath.c_str()));
Saqib Khan167601b2017-06-18 23:33:46 -050059 }
60
61 std::ifstream efile;
62 std::string line;
Adriana Kobylak70dcb632018-02-27 15:46:52 -060063 efile.exceptions(std::ifstream::failbit | std::ifstream::badbit |
Gunnar Millsa93a07b2017-09-21 15:40:09 -050064 std::ifstream::eofbit);
Saqib Khan167601b2017-06-18 23:33:46 -050065
66 try
67 {
68 efile.open(filePath);
69 while (getline(efile, line))
70 {
Adriana Kobylak70dcb632018-02-27 15:46:52 -060071 for (auto& key : keys)
Saqib Khan167601b2017-06-18 23:33:46 -050072 {
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 {
Saqib Khane53222d2017-08-19 16:57:24 -050086 if (!efile.eof())
87 {
88 log<level::ERR>("Error in reading file");
89 }
90 efile.close();
Saqib Khan167601b2017-06-18 23:33:46 -050091 }
92
93 return keys;
94}
95
Saqib Khan7f80e0b2017-10-22 11:29:07 -050096void Delete::delete_()
97{
98 if (parent.eraseCallback)
99 {
100 parent.eraseCallback(parent.getId(parent.version()));
101 }
102}
103
104void Version::updateDeleteInterface(sdbusplus::message::message& msg)
105{
106 std::string interface, chassisState;
107 std::map<std::string, sdbusplus::message::variant<std::string>> properties;
108
109 msg.read(interface, properties);
110
111 for (const auto& p : properties)
112 {
113 if (p.first == "CurrentPowerState")
114 {
115 chassisState = p.second.get<std::string>();
116 }
117 }
118
119 if ((parent.isVersionFunctional(this->versionId)) &&
120 (chassisState != CHASSIS_STATE_OFF))
121 {
122 if (deleteObject)
123 {
124 deleteObject.reset(nullptr);
125 }
126 }
127 else
128 {
129 if (!deleteObject)
130 {
131 deleteObject = std::make_unique<Delete>(bus, objPath, *this);
132 }
133 }
134}
135
Saqib Khan167601b2017-06-18 23:33:46 -0500136} // namespace updater
137} // namespace software
138} // namespace openpower